diff mbox series

[v2,06/34] drm/of: Add a drm_of_aggregate_probe() API

Message ID 20211006193819.2654854-7-swboyd@chromium.org (mailing list archive)
State Superseded
Headers show
Series component: Make into an aggregate bus | expand

Commit Message

Stephen Boyd Oct. 6, 2021, 7:37 p.m. UTC
Similar to drm_of_component_probe() but using the new API that registers
a driver instead of an ops struct. This allows us to migrate the users
of drm_of_component_probe() to the new way of doing things.

Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: "Rafael J. Wysocki" <rafael@kernel.org>
Cc: Rob Clark <robdclark@gmail.com>
Cc: Russell King <rmk+kernel@arm.linux.org.uk>
Cc: Saravana Kannan <saravanak@google.com>
Signed-off-by: Stephen Boyd <swboyd@chromium.org>
---
 drivers/gpu/drm/drm_of.c | 85 +++++++++++++++++++++++++++++++---------
 include/drm/drm_of.h     | 11 ++++++
 2 files changed, 77 insertions(+), 19 deletions(-)

Comments

kernel test robot Oct. 6, 2021, 10:28 p.m. UTC | #1
Hi Stephen,

I love your patch! Perhaps something to improve:

[auto build test WARNING on e4e737bb5c170df6135a127739a9e6148ee3da82]

url:    https://github.com/0day-ci/linux/commits/Stephen-Boyd/component-Make-into-an-aggregate-bus/20211007-034200
base:   e4e737bb5c170df6135a127739a9e6148ee3da82
config: hexagon-randconfig-r041-20211006 (attached as .config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project c0039de2953d15815448b4b3c3bafb45607781e0)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/8de4fafdac42c316be0fc23e4176e13043031a38
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Stephen-Boyd/component-Make-into-an-aggregate-bus/20211007-034200
        git checkout 8de4fafdac42c316be0fc23e4176e13043031a38
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 ARCH=hexagon 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:32:
>> include/drm/drm_of.h:45:14: warning: declaration of 'struct aggregate_driver' will not be visible outside of this function [-Wvisibility]
                              struct aggregate_driver *adrv);
                                     ^
   1 warning generated.


vim +45 include/drm/drm_of.h

    30	
    31	#ifdef CONFIG_OF
    32	uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
    33				    struct device_node *port);
    34	uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
    35					    struct device_node *port);
    36	void drm_of_component_match_add(struct device *master,
    37					struct component_match **matchptr,
    38					int (*compare)(struct device *, void *),
    39					struct device_node *node);
    40	int drm_of_component_probe(struct device *dev,
    41				   int (*compare_of)(struct device *, void *),
    42				   const struct component_master_ops *m_ops);
    43	int drm_of_aggregate_probe(struct device *dev,
    44				   int (*compare_of)(struct device *, void *),
  > 45				   struct aggregate_driver *adrv);
    46	int drm_of_encoder_active_endpoint(struct device_node *node,
    47					   struct drm_encoder *encoder,
    48					   struct of_endpoint *endpoint);
    49	int drm_of_find_panel_or_bridge(const struct device_node *np,
    50					int port, int endpoint,
    51					struct drm_panel **panel,
    52					struct drm_bridge **bridge);
    53	int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
    54						  const struct device_node *port2);
    55	#else
    56	static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
    57						  struct device_node *port)
    58	{
    59		return 0;
    60	}
    61	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
kernel test robot Oct. 6, 2021, 10:36 p.m. UTC | #2
Hi Stephen,

I love your patch! Perhaps something to improve:

[auto build test WARNING on e4e737bb5c170df6135a127739a9e6148ee3da82]

url:    https://github.com/0day-ci/linux/commits/Stephen-Boyd/component-Make-into-an-aggregate-bus/20211007-034200
base:   e4e737bb5c170df6135a127739a9e6148ee3da82
config: s390-randconfig-r044-20211006 (attached as .config)
compiler: s390-linux-gcc (GCC) 11.2.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/0day-ci/linux/commit/8de4fafdac42c316be0fc23e4176e13043031a38
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Stephen-Boyd/component-Make-into-an-aggregate-bus/20211007-034200
        git checkout 8de4fafdac42c316be0fc23e4176e13043031a38
        # save the attached .config to linux build tree
        mkdir build_dir
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-11.2.0 make.cross O=build_dir ARCH=s390 SHELL=/bin/bash drivers/gpu/drm/bridge/

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from drivers/gpu/drm/bridge/chipone-icn6211.c:7:
>> include/drm/drm_of.h:45:35: warning: 'struct aggregate_driver' declared inside parameter list will not be visible outside of this definition or declaration
      45 |                            struct aggregate_driver *adrv);
         |                                   ^~~~~~~~~~~~~~~~


vim +45 include/drm/drm_of.h

    30	
    31	#ifdef CONFIG_OF
    32	uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
    33				    struct device_node *port);
    34	uint32_t drm_of_find_possible_crtcs(struct drm_device *dev,
    35					    struct device_node *port);
    36	void drm_of_component_match_add(struct device *master,
    37					struct component_match **matchptr,
    38					int (*compare)(struct device *, void *),
    39					struct device_node *node);
    40	int drm_of_component_probe(struct device *dev,
    41				   int (*compare_of)(struct device *, void *),
    42				   const struct component_master_ops *m_ops);
    43	int drm_of_aggregate_probe(struct device *dev,
    44				   int (*compare_of)(struct device *, void *),
  > 45				   struct aggregate_driver *adrv);
    46	int drm_of_encoder_active_endpoint(struct device_node *node,
    47					   struct drm_encoder *encoder,
    48					   struct of_endpoint *endpoint);
    49	int drm_of_find_panel_or_bridge(const struct device_node *np,
    50					int port, int endpoint,
    51					struct drm_panel **panel,
    52					struct drm_bridge **bridge);
    53	int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
    54						  const struct device_node *port2);
    55	#else
    56	static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
    57						  struct device_node *port)
    58	{
    59		return 0;
    60	}
    61	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 997b8827fed2..58db65ad2770 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -99,30 +99,18 @@  void drm_of_component_match_add(struct device *master,
 }
 EXPORT_SYMBOL_GPL(drm_of_component_match_add);
 
-/**
- * drm_of_component_probe - Generic probe function for a component based master
- * @dev: master device containing the OF node
- * @compare_of: compare function used for matching components
- * @m_ops: component master ops to be used
- *
- * Parse the platform device OF node and bind all the components associated
- * with the master. Interface ports are added before the encoders in order to
- * satisfy their .bind requirements
- * See Documentation/devicetree/bindings/graph.txt for the bindings.
- *
- * Returns zero if successful, or one of the standard error codes if it fails.
- */
-int drm_of_component_probe(struct device *dev,
+static int _drm_of_component_probe(struct device *dev,
 			   int (*compare_of)(struct device *, void *),
-			   const struct component_master_ops *m_ops)
+			   struct component_match **matchptr)
 {
 	struct device_node *ep, *port, *remote;
-	struct component_match *match = NULL;
 	int i;
 
 	if (!dev->of_node)
 		return -EINVAL;
 
+	*matchptr = NULL;
+
 	/*
 	 * Bind the crtc's ports first, so that drm_of_find_possible_crtcs()
 	 * called from encoder's .bind callbacks works as expected
@@ -133,7 +121,7 @@  int drm_of_component_probe(struct device *dev,
 			break;
 
 		if (of_device_is_available(port->parent))
-			drm_of_component_match_add(dev, &match, compare_of,
+			drm_of_component_match_add(dev, matchptr, compare_of,
 						   port);
 
 		of_node_put(port);
@@ -144,7 +132,7 @@  int drm_of_component_probe(struct device *dev,
 		return -ENODEV;
 	}
 
-	if (!match) {
+	if (!*matchptr) {
 		dev_err(dev, "no available port\n");
 		return -ENODEV;
 	}
@@ -174,17 +162,76 @@  int drm_of_component_probe(struct device *dev,
 				continue;
 			}
 
-			drm_of_component_match_add(dev, &match, compare_of,
+			drm_of_component_match_add(dev, matchptr, compare_of,
 						   remote);
 			of_node_put(remote);
 		}
 		of_node_put(port);
 	}
 
+	return 0;
+}
+
+/**
+ * drm_of_component_probe - Generic probe function for a component based master
+ * @dev: master device containing the OF node
+ * @compare_of: compare function used for matching components
+ * @m_ops: component master ops to be used
+ *
+ * Parse the platform device OF node and bind all the components associated
+ * with the master. Interface ports are added before the encoders in order to
+ * satisfy their .bind requirements
+ * See Documentation/devicetree/bindings/graph.txt for the bindings.
+ *
+ * Deprecated: Use drm_of_aggregate_probe() instead.
+ *
+ * Returns zero if successful, or one of the standard error codes if it fails.
+ */
+static int drm_of_component_probe(struct device *dev,
+			   int (*compare_of)(struct device *, void *),
+			   const struct component_master_ops *m_ops)
+{
+
+	struct component_match *match;
+	int ret;
+
+	ret = _drm_of_component_probe(dev, compare_of, &match);
+	if (ret)
+		return ret;
+
 	return component_master_add_with_match(dev, m_ops, match);
 }
 EXPORT_SYMBOL(drm_of_component_probe);
 
+
+/**
+ * drm_of_aggregate_probe - Generic probe function for a component based aggregate host
+ * @dev: device containing the OF node
+ * @compare_of: compare function used for matching components
+ * @adrv: aggregate driver to be used
+ *
+ * Parse the platform device OF node and bind all the components associated
+ * with the aggregate device. Interface ports are added before the encoders in
+ * order to satisfy their .bind_component requirements
+ * See Documentation/devicetree/bindings/graph.txt for the bindings.
+ *
+ * Returns zero if successful, or one of the standard error codes if it fails.
+ */
+static int drm_of_aggregate_probe(struct device *dev,
+			   int (*compare_of)(struct device *, void *),
+			   struct aggregate_driver *adrv)
+{
+	struct component_match *match;
+	int ret;
+
+	ret = _drm_of_component_probe(dev, compare_of, &match);
+	if (ret)
+		return ret;
+
+	return component_aggregate_register(dev, adrv, match);
+}
+EXPORT_SYMBOL(drm_of_aggregate_probe);
+
 /*
  * drm_of_encoder_active_endpoint - return the active encoder endpoint
  * @node: device tree node containing encoder input ports
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index b9b093add92e..c3ec9b14df48 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -40,6 +40,9 @@  void drm_of_component_match_add(struct device *master,
 int drm_of_component_probe(struct device *dev,
 			   int (*compare_of)(struct device *, void *),
 			   const struct component_master_ops *m_ops);
+int drm_of_aggregate_probe(struct device *dev,
+			   int (*compare_of)(struct device *, void *),
+			   struct aggregate_driver *adrv);
 int drm_of_encoder_active_endpoint(struct device_node *node,
 				   struct drm_encoder *encoder,
 				   struct of_endpoint *endpoint);
@@ -78,6 +81,14 @@  drm_of_component_probe(struct device *dev,
 	return -EINVAL;
 }
 
+static inline int
+drm_of_aggregate_probe(struct device *dev,
+		       int (*compare_of)(struct device *, void *),
+		       struct aggregate_driver *adrv)
+{
+	return -EINVAL;
+}
+
 static inline int drm_of_encoder_active_endpoint(struct device_node *node,
 						 struct drm_encoder *encoder,
 						 struct of_endpoint *endpoint)