Add helper function to convert DT "data-mapping" property string value
into media bus format value, and deduplicate the code in panel-lvds.c
and lvds-codec.c .

Signed-off-by: Marek Vasut <ma...@denx.de>
Cc: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
Cc: Sam Ravnborg <s...@ravnborg.org>
To: dri-devel@lists.freedesktop.org
---
V2: Drop bogus semicolon
---
 drivers/gpu/drm/bridge/lvds-codec.c | 21 ++++++------------
 drivers/gpu/drm/drm_of.c            | 33 +++++++++++++++++++++++++++++
 drivers/gpu/drm/panel/panel-lvds.c  | 18 ++++------------
 include/drm/drm_of.h                |  7 ++++++
 4 files changed, 51 insertions(+), 28 deletions(-)

diff --git a/drivers/gpu/drm/bridge/lvds-codec.c 
b/drivers/gpu/drm/bridge/lvds-codec.c
index ad460b96c0a3..f991842a161f 100644
--- a/drivers/gpu/drm/bridge/lvds-codec.c
+++ b/drivers/gpu/drm/bridge/lvds-codec.c
@@ -14,6 +14,7 @@
 
 #include <drm/drm_atomic_helper.h>
 #include <drm/drm_bridge.h>
+#include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 
 struct lvds_codec {
@@ -118,7 +119,6 @@ static int lvds_codec_probe(struct platform_device *pdev)
        struct device_node *bus_node;
        struct drm_panel *panel;
        struct lvds_codec *lvds_codec;
-       const char *mapping;
        int ret;
 
        lvds_codec = devm_kzalloc(dev, sizeof(*lvds_codec), GFP_KERNEL);
@@ -174,22 +174,15 @@ static int lvds_codec_probe(struct platform_device *pdev)
                        return -ENXIO;
                }
 
-               ret = of_property_read_string(bus_node, "data-mapping",
-                                             &mapping);
+               ret = drm_of_lvds_get_data_mapping(bus_node);
                of_node_put(bus_node);
-               if (ret < 0) {
+               if (ret == -ENODEV) {
                        dev_warn(dev, "missing 'data-mapping' DT property\n");
+               } else if (ret) {
+                       dev_err(dev, "invalid 'data-mapping' DT property\n");
+                       return ret;
                } else {
-                       if (!strcmp(mapping, "jeida-18")) {
-                               lvds_codec->bus_format = 
MEDIA_BUS_FMT_RGB666_1X7X3_SPWG;
-                       } else if (!strcmp(mapping, "jeida-24")) {
-                               lvds_codec->bus_format = 
MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA;
-                       } else if (!strcmp(mapping, "vesa-24")) {
-                               lvds_codec->bus_format = 
MEDIA_BUS_FMT_RGB888_1X7X4_SPWG;
-                       } else {
-                               dev_err(dev, "invalid 'data-mapping' DT 
property\n");
-                               return -EINVAL;
-                       }
+                       lvds_codec->bus_format = ret;
                        lvds_codec->bridge.funcs = &funcs_decoder;
                }
        }
diff --git a/drivers/gpu/drm/drm_of.c b/drivers/gpu/drm/drm_of.c
index 37c34146eea8..a9217bc18e8f 100644
--- a/drivers/gpu/drm/drm_of.c
+++ b/drivers/gpu/drm/drm_of.c
@@ -402,3 +402,36 @@ int drm_of_lvds_get_dual_link_pixel_order(const struct 
device_node *port1,
                DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS;
 }
 EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order);
+
+/**
+ * drm_of_lvds_get_data_mapping - Get LVDS data mapping
+ * @port: DT port node of the LVDS source or sink
+ *
+ * Convert DT "data-mapping" property string value into media bus format value.
+ *
+ * Return:
+ * MEDIA_BUS_FMT_RGB666_1X7X3_SPWG - data-mapping is "jeida-18"
+ * MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA - data-mapping is "jeida-24"
+ * MEDIA_BUS_FMT_RGB888_1X7X4_SPWG - data-mapping is "vesa-24"
+ * -EINVAL - the "data-mapping" property is unsupported
+ * -ENODEV - the "data-mapping" property is missing
+ */
+int drm_of_lvds_get_data_mapping(const struct device_node *port)
+{
+       const char *mapping;
+       int ret;
+
+       ret = of_property_read_string(port, "data-mapping", &mapping);
+       if (ret < 0)
+               return -ENODEV;
+
+       if (!strcmp(mapping, "jeida-18"))
+               return MEDIA_BUS_FMT_RGB666_1X7X3_SPWG;
+       if (!strcmp(mapping, "jeida-24"))
+               return MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA;
+       if (!strcmp(mapping, "vesa-24"))
+               return MEDIA_BUS_FMT_RGB888_1X7X4_SPWG;
+
+       return -EINVAL;
+}
+EXPORT_SYMBOL_GPL(drm_of_lvds_get_data_mapping);
diff --git a/drivers/gpu/drm/panel/panel-lvds.c 
b/drivers/gpu/drm/panel/panel-lvds.c
index 59a8d99e777d..27a1c9923b09 100644
--- a/drivers/gpu/drm/panel/panel-lvds.c
+++ b/drivers/gpu/drm/panel/panel-lvds.c
@@ -20,6 +20,7 @@
 #include <video/videomode.h>
 
 #include <drm/drm_crtc.h>
+#include <drm/drm_of.h>
 #include <drm/drm_panel.h>
 
 struct panel_lvds {
@@ -116,7 +117,6 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds)
 {
        struct device_node *np = lvds->dev->of_node;
        struct display_timing timing;
-       const char *mapping;
        int ret;
 
        ret = of_drm_get_panel_orientation(np, &lvds->orientation);
@@ -149,24 +149,14 @@ static int panel_lvds_parse_dt(struct panel_lvds *lvds)
 
        of_property_read_string(np, "label", &lvds->label);
 
-       ret = of_property_read_string(np, "data-mapping", &mapping);
+       ret = drm_of_lvds_get_data_mapping(np);
        if (ret < 0) {
                dev_err(lvds->dev, "%pOF: invalid or missing %s DT property\n",
                        np, "data-mapping");
-               return -ENODEV;
+               return ret;
        }
 
-       if (!strcmp(mapping, "jeida-18")) {
-               lvds->bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG;
-       } else if (!strcmp(mapping, "jeida-24")) {
-               lvds->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA;
-       } else if (!strcmp(mapping, "vesa-24")) {
-               lvds->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG;
-       } else {
-               dev_err(lvds->dev, "%pOF: invalid or missing %s DT property\n",
-                       np, "data-mapping");
-               return -EINVAL;
-       }
+       lvds->bus_format = ret;
 
        lvds->data_mirror = of_property_read_bool(np, "data-mirror");
 
diff --git a/include/drm/drm_of.h b/include/drm/drm_of.h
index b9b093add92e..99f79ac8b4cd 100644
--- a/include/drm/drm_of.h
+++ b/include/drm/drm_of.h
@@ -49,6 +49,7 @@ int drm_of_find_panel_or_bridge(const struct device_node *np,
                                struct drm_bridge **bridge);
 int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1,
                                          const struct device_node *port2);
+int drm_of_lvds_get_data_mapping(const struct device_node *port);
 #else
 static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev,
                                          struct device_node *port)
@@ -98,6 +99,12 @@ drm_of_lvds_get_dual_link_pixel_order(const struct 
device_node *port1,
 {
        return -EINVAL;
 }
+
+static inline int
+drm_of_lvds_get_data_mapping(const struct device_node *port)
+{
+       return -EINVAL;
+}
 #endif
 
 /*
-- 
2.33.0

Reply via email to