drm/dsi: Try to match non-DT DSI devices
authorArchit Taneja <architt@codeaurora.org>
Fri, 12 Feb 2016 09:18:32 +0000 (14:48 +0530)
committerThierry Reding <treding@nvidia.com>
Wed, 2 Mar 2016 16:01:09 +0000 (17:01 +0100)
Add a device name field in struct mipi_dsi_device. This name is not the
same as the device name (which is of the format "hostname.reg"). When
the device is created via DT, this name is set to the modalias string.
In the non-DT case, the driver creating the DSI device provides the
name by populating a field in struct mipi_dsi_device_info.

Matching for DT case would be as it was before. For the non-DT case, we
compare the device and driver names. Other buses (like I2C/SPI) perform
a non-DT match by comparing the device name and entries in the driver's
id_table. Such a mechanism isn't used for the DSI bus.

Reviewed-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Archit Taneja <architt@codeaurora.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/drm/drm_mipi_dsi.c
include/drm/drm_mipi_dsi.h

index 5d7243da23238183c6394330acf5efebeb5f38a7..42a7aacf7a2fb5d4d824643967e2e9c9c2ce8a1c 100644 (file)
 
 static int mipi_dsi_device_match(struct device *dev, struct device_driver *drv)
 {
-       return of_driver_match_device(dev, drv);
+       struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
+
+       /* attempt OF style match */
+       if (of_driver_match_device(dev, drv))
+               return 1;
+
+       /* compare DSI device and driver names */
+       if (!strcmp(dsi->name, drv->name))
+               return 1;
+
+       return 0;
 }
 
 static const struct dev_pm_ops mipi_dsi_device_pm_ops = {
@@ -138,6 +148,11 @@ of_mipi_dsi_device_add(struct mipi_dsi_host *host, struct device_node *node)
        int ret;
        u32 reg;
 
+       if (of_modalias_node(node, info.type, sizeof(info.type)) < 0) {
+               dev_err(dev, "modalias failure on %s\n", node->full_name);
+               return ERR_PTR(-EINVAL);
+       }
+
        ret = of_property_read_u32(node, "reg", &reg);
        if (ret) {
                dev_err(dev, "device node %s has no valid reg property: %d\n",
@@ -197,6 +212,7 @@ mipi_dsi_device_register_full(struct mipi_dsi_host *host,
 
        dsi->dev.of_node = info->node;
        dsi->channel = info->channel;
+       strlcpy(dsi->name, info->type, sizeof(dsi->name));
 
        ret = mipi_dsi_device_add(dsi);
        if (ret) {
index ce5eae438fd123fa6aad9a1e8d1a34fb70486549..a91411682e839b350ce8e57b02f922c3a46fbda4 100644 (file)
@@ -139,15 +139,19 @@ enum mipi_dsi_pixel_format {
        MIPI_DSI_FMT_RGB565,
 };
 
- /**
+#define DSI_DEV_NAME_SIZE              20
+
+/**
  * struct mipi_dsi_device_info - template for creating a mipi_dsi_device
+ * @type: DSI peripheral chip type
  * @channel: DSI virtual channel assigned to peripheral
- * @node: pointer to OF device node
+ * @node: pointer to OF device node or NULL
  *
  * This is populated and passed to mipi_dsi_device_new to create a new
  * DSI device
  */
 struct mipi_dsi_device_info {
+       char type[DSI_DEV_NAME_SIZE];
        u32 channel;
        struct device_node *node;
 };
@@ -156,6 +160,7 @@ struct mipi_dsi_device_info {
  * struct mipi_dsi_device - DSI peripheral device
  * @host: DSI host for this peripheral
  * @dev: driver model device node for this peripheral
+ * @name: DSI peripheral chip type
  * @channel: virtual channel assigned to the peripheral
  * @format: pixel format for video mode
  * @lanes: number of active data lanes
@@ -165,6 +170,7 @@ struct mipi_dsi_device {
        struct mipi_dsi_host *host;
        struct device dev;
 
+       char name[DSI_DEV_NAME_SIZE];
        unsigned int channel;
        unsigned int lanes;
        enum mipi_dsi_pixel_format format;