dt-bindings: display: bridge: lvds-codec: Document LVDS data mapping select
Subsystems (4)
PATCH v2 1/2 dt-bindings: display: bridge: lvds-codec: Document LVDS data mapping select
Decoder input LVDS format is a property of the decoder chip or even its strapping. Add DT property data-mapping the same way lvds-panel does, to define the LVDS data mapping.
Signed-off-by Marek Vasut <[email protected]>
Cc Laurent Pinchart <[email protected]>
Cc Rob Herring <[email protected]>
Cc Sam Ravnborg <[email protected]>
To: [email protected]
---
V2: Rebase on latest next
--- .../bindings/display/bridge/lvds-codec.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
Documentation/devicetree/bindings/display/bridge/lvds-codec.yaml +19 -0
@@ -64,6 +64,15 @@ properties: - port@0 - port@1 + data-mapping: + enum: + - jeida-18 + - jeida-24 + - vesa-24 + description: | + The color signals mapping order. See details in + Documentation/devicetree/bindings/display/panel/lvds.yaml + powerdown-gpios: description: The GPIO used to control the power down line of this device.
@@ -71,6 +80,16 @@ properties: power-supply: true +if: + not: + properties: + compatible: + contains: + const: lvds-decoder +then: + properties: + data-mapping: false + required: - compatible - ports
Signature · 1 line
2.30.2
PATCH v2 2/2 drm/bridge: lvds-codec: Add support for LVDS data mapping select
Decoder input LVDS format is a property of the decoder chip or even its strapping. Handle data-mapping the same way lvds-panel does. In case data-mapping is not present, do nothing, since there are still legacy bindings which do not specify this property.
Signed-off-by Marek Vasut <[email protected]>
Cc Laurent Pinchart <[email protected]>
Cc Sam Ravnborg <[email protected]>
To: [email protected]
---
V2: Use .atomic_get_input_bus_fmts for the decoder, separate funcs for encoder
--- drivers/gpu/drm/bridge/lvds-codec.c | 71 ++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 2 deletions(-)
drivers/gpu/drm/bridge/lvds-codec.c +69 -2
@@ -12,6 +12,7 @@#include <linux/platform_device.h> #include <linux/regulator/consumer.h> +#include <drm/drm_atomic_helper.h> #include <drm/drm_bridge.h> #include <drm/drm_panel.h>
@@ -22,6 +23,7 @@ struct lvds_codec {struct regulator *vcc;struct gpio_desc *powerdown_gpio;u32 connector_type; +unsigned int bus_format; };static inline struct lvds_codec *to_lvds_codec (struct drm_bridge *bridge)
@@ -68,18 +70,56 @@ static void lvds_codec_disable(struct drm_bridge *bridge) "Failed to disable regulator \"vcc\": %d\n", ret); } -static const struct drm_bridge_funcs funcs = { +static const struct drm_bridge_funcs funcs_encoder = { .attach = lvds_codec_attach, .enable = lvds_codec_enable, .disable = lvds_codec_disable, }; +#define MAX_INPUT_SEL_FORMATS 1 +static u32 * +lvds_codec_atomic_get_input_bus_fmts (struct drm_bridge *bridge, +struct drm_bridge_state *bridge_state, +struct drm_crtc_state *crtc_state, +struct drm_connector_state *conn_state, +u32 output_fmt, +unsigned int *num_input_fmts) +{ +struct lvds_codec *lvds_codec =to_lvds_codec (bridge); +u32 *input_fmts; + + *num_input_fmts =0 ; + + input_fmts =kcalloc (MAX_INPUT_SEL_FORMATS ,sizeof (*input_fmts), +GFP_KERNEL ); +if (!input_fmts) +return NULL ; + + input_fmts[0 ] = lvds_codec->bus_format; + *num_input_fmts =MAX_INPUT_SEL_FORMATS ; + +return input_fmts; +} + +static const struct drm_bridge_funcs funcs_decoder = { + .attach = lvds_codec_attach, + .enable = lvds_codec_enable, + .disable = lvds_codec_disable, + .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state, + .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state, + .atomic_reset = drm_atomic_helper_bridge_reset, + .atomic_get_input_bus_fmts = lvds_codec_atomic_get_input_bus_fmts, +}; +static int lvds_codec_probe (struct platform_device *pdev) {struct device *dev = &pdev->dev;struct device_node *panel_node;struct drm_panel *panel;struct lvds_codec *lvds_codec; +const char *mapping; +int ret; +u32 val; lvds_codec =devm_kzalloc (dev,sizeof (*lvds_codec),GFP_KERNEL );if (!lvds_codec)
@@ -119,13 +159,40 @@ static int lvds_codec_probe(struct platform_device *pdev)if (IS_ERR (lvds_codec->panel_bridge))return PTR_ERR (lvds_codec->panel_bridge); +/* +* Decoder input LVDS format is a property of the decoder chip or even +* its strapping. Handle data-mapping the same way lvds-panel does. In +* case data-mapping is not present, do nothing, since there are still +* legacy bindings which do not specify this property. +*/ +if (lvds_codec->connector_type !=DRM_MODE_CONNECTOR_LVDS ) { + ret =of_property_read_string (dev->of_node,"data-mapping" , + &mapping); +if (ret <0 ) { +dev_err (dev,"missing 'data-mapping' DT property\n" ); + }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->bridge.funcs = &funcs_decoder; + }else { + lvds_codec->bridge.funcs = &funcs_encoder; + } +/* * The panel_bridge bridge is attached to the panel's of_node, * but we need a bridge attached to our of_node for our user * to look up. */ lvds_codec->bridge.of_node = dev->of_node; - lvds_codec->bridge.funcs = &funcs;drm_bridge_add (&lvds_codec->bridge);platform_set_drvdata (pdev, lvds_codec);
Signature · 1 line
2.30.2