Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm: of: Add drm_of_lvds_get_data_mapping

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 <marex@denx.de>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Cc: Sam Ravnborg <sam@ravnborg.org>
To: dri-devel@lists.freedesktop.org
Signed-off-by: Sam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/20211012224252.29185-1-marex@denx.de

authored by

Marek Vasut and committed by
Sam Ravnborg
7c4dd0a2 189723fb

+51 -28
+7 -14
drivers/gpu/drm/bridge/lvds-codec.c
··· 14 14 15 15 #include <drm/drm_atomic_helper.h> 16 16 #include <drm/drm_bridge.h> 17 + #include <drm/drm_of.h> 17 18 #include <drm/drm_panel.h> 18 19 19 20 struct lvds_codec { ··· 119 118 struct device_node *bus_node; 120 119 struct drm_panel *panel; 121 120 struct lvds_codec *lvds_codec; 122 - const char *mapping; 123 121 int ret; 124 122 125 123 lvds_codec = devm_kzalloc(dev, sizeof(*lvds_codec), GFP_KERNEL); ··· 174 174 return -ENXIO; 175 175 } 176 176 177 - ret = of_property_read_string(bus_node, "data-mapping", 178 - &mapping); 177 + ret = drm_of_lvds_get_data_mapping(bus_node); 179 178 of_node_put(bus_node); 180 - if (ret < 0) { 179 + if (ret == -ENODEV) { 181 180 dev_warn(dev, "missing 'data-mapping' DT property\n"); 181 + } else if (ret) { 182 + dev_err(dev, "invalid 'data-mapping' DT property\n"); 183 + return ret; 182 184 } else { 183 - if (!strcmp(mapping, "jeida-18")) { 184 - lvds_codec->bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG; 185 - } else if (!strcmp(mapping, "jeida-24")) { 186 - lvds_codec->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA; 187 - } else if (!strcmp(mapping, "vesa-24")) { 188 - lvds_codec->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; 189 - } else { 190 - dev_err(dev, "invalid 'data-mapping' DT property\n"); 191 - return -EINVAL; 192 - } 185 + lvds_codec->bus_format = ret; 193 186 lvds_codec->bridge.funcs = &funcs_decoder; 194 187 } 195 188 }
+33
drivers/gpu/drm/drm_of.c
··· 402 402 DRM_LVDS_DUAL_LINK_ODD_EVEN_PIXELS; 403 403 } 404 404 EXPORT_SYMBOL_GPL(drm_of_lvds_get_dual_link_pixel_order); 405 + 406 + /** 407 + * drm_of_lvds_get_data_mapping - Get LVDS data mapping 408 + * @port: DT port node of the LVDS source or sink 409 + * 410 + * Convert DT "data-mapping" property string value into media bus format value. 411 + * 412 + * Return: 413 + * * MEDIA_BUS_FMT_RGB666_1X7X3_SPWG - data-mapping is "jeida-18" 414 + * * MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA - data-mapping is "jeida-24" 415 + * * MEDIA_BUS_FMT_RGB888_1X7X4_SPWG - data-mapping is "vesa-24" 416 + * * -EINVAL - the "data-mapping" property is unsupported 417 + * * -ENODEV - the "data-mapping" property is missing 418 + */ 419 + int drm_of_lvds_get_data_mapping(const struct device_node *port) 420 + { 421 + const char *mapping; 422 + int ret; 423 + 424 + ret = of_property_read_string(port, "data-mapping", &mapping); 425 + if (ret < 0) 426 + return -ENODEV; 427 + 428 + if (!strcmp(mapping, "jeida-18")) 429 + return MEDIA_BUS_FMT_RGB666_1X7X3_SPWG; 430 + if (!strcmp(mapping, "jeida-24")) 431 + return MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA; 432 + if (!strcmp(mapping, "vesa-24")) 433 + return MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; 434 + 435 + return -EINVAL; 436 + } 437 + EXPORT_SYMBOL_GPL(drm_of_lvds_get_data_mapping);
+4 -14
drivers/gpu/drm/panel/panel-lvds.c
··· 20 20 #include <video/videomode.h> 21 21 22 22 #include <drm/drm_crtc.h> 23 + #include <drm/drm_of.h> 23 24 #include <drm/drm_panel.h> 24 25 25 26 struct panel_lvds { ··· 117 116 { 118 117 struct device_node *np = lvds->dev->of_node; 119 118 struct display_timing timing; 120 - const char *mapping; 121 119 int ret; 122 120 123 121 ret = of_drm_get_panel_orientation(np, &lvds->orientation); ··· 149 149 150 150 of_property_read_string(np, "label", &lvds->label); 151 151 152 - ret = of_property_read_string(np, "data-mapping", &mapping); 152 + ret = drm_of_lvds_get_data_mapping(np); 153 153 if (ret < 0) { 154 154 dev_err(lvds->dev, "%pOF: invalid or missing %s DT property\n", 155 155 np, "data-mapping"); 156 - return -ENODEV; 156 + return ret; 157 157 } 158 158 159 - if (!strcmp(mapping, "jeida-18")) { 160 - lvds->bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG; 161 - } else if (!strcmp(mapping, "jeida-24")) { 162 - lvds->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_JEIDA; 163 - } else if (!strcmp(mapping, "vesa-24")) { 164 - lvds->bus_format = MEDIA_BUS_FMT_RGB888_1X7X4_SPWG; 165 - } else { 166 - dev_err(lvds->dev, "%pOF: invalid or missing %s DT property\n", 167 - np, "data-mapping"); 168 - return -EINVAL; 169 - } 159 + lvds->bus_format = ret; 170 160 171 161 lvds->data_mirror = of_property_read_bool(np, "data-mirror"); 172 162
+7
include/drm/drm_of.h
··· 49 49 struct drm_bridge **bridge); 50 50 int drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, 51 51 const struct device_node *port2); 52 + int drm_of_lvds_get_data_mapping(const struct device_node *port); 52 53 #else 53 54 static inline uint32_t drm_of_crtc_port_mask(struct drm_device *dev, 54 55 struct device_node *port) ··· 96 95 static inline int 97 96 drm_of_lvds_get_dual_link_pixel_order(const struct device_node *port1, 98 97 const struct device_node *port2) 98 + { 99 + return -EINVAL; 100 + } 101 + 102 + static inline int 103 + drm_of_lvds_get_data_mapping(const struct device_node *port) 99 104 { 100 105 return -EINVAL; 101 106 }