drm/panel: Add Magnachip D53E6EA8966 Panel Controller
Subsystems (5)
v5 cover drm/panel: Add Magnachip D53E6EA8966 Panel Controller
From: Chris Morgan <[email protected]>
Add the Magnachip D53E6EA8966 panel IC controller for display panels such as the Samsung AMS495QA01 panel as found on the Anbernic RG503. This panel uses DSI to receive video signals, but 3-wire SPI to receive command signals.
Changes since V4:
- Renamed driver from the panel model to the panel IC controller per DRM team.
- Added a drm_of helper function of drm_of_get_dsi_bus() to handle finding and populating the DSI node when the DSI node is not the parent of the DSI controlled display.
- Converted the documented commands to constants to make it more readable.
- Reset GPIO is now required and documented as GPIO_ACTIVE_LOW.
- Removed "prepared" logic from panel.
Changes since V3:
- Updated documentation to add spi-peripheral-props.yaml per updates
made for similar devices. Note that I removed a "Reviewed-by" tag
from Rob Herring since this change probably needs to be confirmed.
- Added binding for RG503, since this device is now accepted with this
request: https://lore.kernel.org/linux-rockchip/[email protected]/
Changes since V2:
- Added 50hz mode at request of userspace devs.
- Renamed "dupa" to panel name. Good catch Maya.
- Added Maya's Signed-off-by.
- Removed check for max backlight, since it is already done by backlight_device_set_brightness.
- Fixed minor formatting issues on devicetree binding documentation and added port to provided example.
Changes since V1:
- Removed errant reference to backlight in documentation. This is an OLED panel.
- Made elvss regulator optional. In my case its hard wired and not controllable.
- Added "prepared" enum to track panel status to prevent unbalanced regulator enable/disable.
Chris Morgan (4):
drm: of: Add drm_of_get_dsi_bus helper function
dt-bindings: display: panel: Add Magnachip D53E6EA8966 drm/panel: Add Magnachip D53E6EA8966 Panel Driver
arm64: dts: rockchip: add display to RG503
.../display/panel/magnachip,d53e6ea8966.yaml | 62 +++ .../dts/rockchip/rk3566-anbernic-rg503.dts | 55 ++ drivers/gpu/drm/drm_of.c | 62 +++ drivers/gpu/drm/panel/Kconfig | 10 + drivers/gpu/drm/panel/Makefile | 1 + .../drm/panel/panel-magnachip-d53e6ea8966.c | 515 ++++++++++++++++++ include/drm/drm_of.h | 11 + 7 files changed, 716 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/magnachip,d53e6ea8966.yaml create mode 100644 drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c
Signature · 1 line
2.34.1
PATCH v5 1/4 drm: of: Add drm_of_get_dsi_bus helper function
From: Chris Morgan <[email protected]>
Add helper function to find DSI host for devices where DSI panel is not a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the official Raspberry Pi touchscreen display).
--- drivers/gpu/drm/drm_of.c | 62 ++++++++++++++++++++++++++++++++++++++++ include/drm/drm_of.h | 11 +++++++ 2 files changed, 73 insertions(+)
drivers/gpu/drm/drm_of.c +62 -0
@@ -10,6 +10,7 @@#include <drm/drm_crtc.h> #include <drm/drm_device.h> #include <drm/drm_encoder.h> +#include <drm/drm_mipi_dsi.h> #include <drm/drm_of.h> #include <drm/drm_panel.h>
@@ -493,3 +494,64 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port,return ret; }EXPORT_SYMBOL_GPL (drm_of_get_data_lanes_count_ep); + +/** +* drm_of_get_dsi_bus - find the DSI bus for a given device +* @dev: parent device of display (SPI, I2C) +* @dsi_host: DSI host to be populated +* @info: DSI device info to be updated with correct DSI node +* +* Given a panel device parented to a non-DSI device, follow the +* devicetree to find the correct DSI host node and populate the +* dsi_host with the correct host and info with the correct node. +* Returns zero if successful, -EPROBE_DEFER if the DSI host is +* found but not available, or -ENODEV otherwise. +*/ +int drm_of_get_dsi_bus (struct device *dev, +struct mipi_dsi_host **dsi_host, +struct mipi_dsi_device_info *info) +{ +struct device_node *endpoint, *dsi_host_node; + +/* +* Get first endpoint child from device. +*/ + endpoint =of_graph_get_next_endpoint (dev->of_node,NULL ); +if (!endpoint) +return -ENODEV ; + +/* +* Follow the first endpoint to get the DSI host node. +*/ + dsi_host_node =of_graph_get_remote_port_parent (endpoint); +if (!dsi_host_node) + goto error; + +/* +* Get the DSI host from the DSI host node. If we get an error +* or the return is null assume we're not ready to probe just +* yet. Release the DSI host node since we're done with it. +*/ + *dsi_host =of_find_mipi_dsi_host_by_node (dsi_host_node); +of_node_put (dsi_host_node); +if (IS_ERR_OR_NULL (*dsi_host)) { +of_node_put (endpoint); +return -EPROBE_DEFER ; + } + +/* +* Set the node of the mipi_dsi_device_info to the correct node +* and then release the endpoint node since we're done with it. +*/ + info->node =of_graph_get_remote_port (endpoint); +if (IS_ERR_OR_NULL (info->node)) + goto error; + +of_node_put (endpoint); +return 0 ; + +error: +of_node_put (endpoint); +return -ENODEV ; +} +EXPORT_SYMBOL_GPL (drm_of_get_dsi_bus);
include/drm/drm_of.h +11 -0
@@ -15,6 +15,8 @@ struct drm_encoder;struct drm_panel ;struct drm_bridge ;struct device_node ; +struct mipi_dsi_device_info ; +struct mipi_dsi_host ;/** * enum drm_lvds_dual_link_pixels - Pixel order of an LVDS dual-link connection
@@ -56,6 +58,9 @@ int drm_of_get_data_lanes_count_ep(const struct device_node *port, int port_reg, int reg, const unsigned int min, const unsigned int max); +int drm_of_get_dsi_bus (struct device *dev, +struct mipi_dsi_host **dsi_host, +struct mipi_dsi_device_info *info);#else static inline uint32_t drm_of_crtc_port_mask (struct drm_device *dev,struct device_node *port)
@@ -127,6 +132,12 @@ drm_of_get_data_lanes_count_ep(const struct device_node *port, {return -EINVAL ; } +static int drm_of_get_dsi_bus (struct device *dev, +struct mipi_dsi_host **dsi_host, +struct mipi_dsi_device_info *info); +{ +return -EINVAL ; +}#endif /*
Signature · 1 line
2.34.1
Re: [PATCH V5 1/4] drm: of: Add drm_of_get_dsi_bus helper function
Quoted 8 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add helper function to find DSI host for devices where DSI panel is not a minor of a DSI bus (such as the Samsung AMS495QA01 panel or the official Raspberry Pi touchscreen display).
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>
Nice, exactly as it should be IMO.
Yours,
Linus Walleij
PATCH v5 2/4 dt-bindings: display: panel: Add Magnachip D53E6EA8966
In reply to Chris MorganFrom: Chris Morgan <[email protected]>
Add documentation for Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel.
--- .../display/panel/magnachip,d53e6ea8966.yaml | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/magnachip,d53e6ea8966.yaml
Documentation/devicetree/bindings/display/panel/magnachip,d53e6ea8966.yaml new file +62 -0
@@ -0,0 +1,62 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/panel/samsung,ams495qa01.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Magnachip D53E6EA8966 based display panel + +description: | + Magnachip D53E6EA8966 based display panels, such as the one found on + the Anbernic RG503 that is combined with a 940x544 OLED Samsung + AMS495QA01. + +maintainers: + - Chris Morgan <[email protected]> + +allOf: + - $ref: panel-common.yaml# + +properties: + compatible: + const: samsung,ams495qa01 + + reg: true + reset-gpios: + description: reset gpio, must be GPIO_ACTIVE_LOW + elvdd-supply: + description: regulator that supplies voltage to the panel display + enable-gpios: true + port: true + vdd-supply: + description: regulator that supplies voltage to panel logic + +required: + - compatible + - reg + - reset-gpios + - vdd-supply + +additionalProperties: false + +examples: + - | + #include <dt-bindings/gpio/gpio.h> + spi { + #address-cells = <1>; + #size-cells = <0>; + panel@0 { + compatible = "samsung,ams495qa01"; + reg = <0>; + reset-gpios = <&gpio4 0 GPIO_ACTIVE_LOW>; + vdd-supply = <&vcc_3v3>; + + port { + mipi_in_panel: endpoint { + remote-endpoint = <&mipi_out_panel>; + }; + }; + }; + }; + +...
Signature · 1 line
2.34.1
Rob Herring
maintainerRe: [PATCH V5 2/4] dt-bindings: display: panel: Add Magnachip D53E6EA8966
Quoted 5 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add documentation for Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel.
Quoted 7 lines
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>--- .../display/panel/magnachip,d53e6ea8966.yaml | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/panel/magnachip,d53e6ea8966.yaml
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:
dtschema/dtc warnings/errors:./Documentation/devicetree/bindings/display/panel/magnachip,d53e6ea8966.yaml: $id: relative path/filename doesn't match actual path or filename
expected: http://devicetree.org/schemas/display/panel/magnachip,d53e6ea8966.yaml#
doc reference errors (make refcheckdocs):
See https://patchwork.ozlabs.org/project/devicetree-bindings/patch/[email protected]
The base for the series is generally the latest rc1. A different dependency should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note that DT_SCHEMA_FILES can be set to your schema file to speed up checking your schema. However, it must be unset to test all examples with your schema.
Re: [PATCH V5 2/4] dt-bindings: display: panel: Add Magnachip D53E6EA8966
In reply to Chris MorganQuoted 7 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add documentation for Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel.
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>
(...)
Quoted 1 line
.../display/panel/magnachip,d53e6ea8966.yaml | 62 +++++++++++++++++++
It's fine to keep this as samsung,ams495qa01.
Just mention that it uses the magnachip controller in the description.
That Linux implements this with a generic driver that handles all (in theory possible) magnachip-based products is a linuxism and does not need to be in the bindings.
Yours,
Linus Walleij
Re: [PATCH V5 2/4] dt-bindings: display: panel: Add Magnachip D53E6EA8966
Quoted 7 lines · Linus Walleij
Quoted 5 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add documentation for Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel.
Quoted 7 lines
Quoted 2 lines
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>(...)
Quoted 1 line
.../display/panel/magnachip,d53e6ea8966.yaml | 62 +++++++++++++++++++It's fine to keep this as samsung,ams495qa01.
Would the device tree team be okay with that change? The driver name itself has changed and I fear possible confusion if someone is looking for docs by driver name.
Otherwise I noticed I had an outdated version of the dt-schema and missed an error, so I have to resubmit either way to fix it. The horrors of upgrading your build machine...
Thank you
Quoted 9 lines
Just mention that it uses the magnachip controller in the description.
That Linux implements this with a generic driver that handles all (in theory possible) magnachip-based products is a linuxism and does not need to be in the bindings.
Yours,
Linus Walleij
Rob Herring
maintainerRe: [PATCH V5 2/4] dt-bindings: display: panel: Add Magnachip D53E6EA8966
Quoted 11 lines · Chris Morgan
Quoted 10 lines · Linus Walleij
Quoted 7 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Add documentation for Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel.
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>(...)
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
.../display/panel/magnachip,d53e6ea8966.yaml | 62 +++++++++++++++++++It's fine to keep this as samsung,ams495qa01.
Would the device tree team be okay with that change? The driver name itself has changed and I fear possible confusion if someone is looking for docs by driver name.
Doesn't matter to me either way.
Rob
PATCH v5 3/4 drm/panel: Add Magnachip D53E6EA8966 Panel Driver
In reply to Chris MorganFrom: Chris Morgan <[email protected]>
Support Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel as found on the Anbernic RG503. Note this driver supports only the AMS495QA01 today which receives video signals via DSI, however it receives commands via 3-wire SPI.
--- drivers/gpu/drm/panel/Kconfig | 10 + drivers/gpu/drm/panel/Makefile | 1 + .../drm/panel/panel-magnachip-d53e6ea8966.c | 515 ++++++++++++++++++ 3 files changed, 526 insertions(+) create mode 100644 drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c
drivers/gpu/drm/panel/Kconfig +10 -0
@@ -288,6 +288,16 @@ config DRM_PANEL_LG_LG4573 Say Y here if you want to enable support for LG4573 RGB panel. To compile this driver as a module, choose M here. +config DRM_PANEL_MAGNACHIP_D53E6EA8966 + tristate "Magnachip D53E6EA8966 DSI panel" + depends on OF && SPI + depends on DRM_MIPI_DSI + select DRM_MIPI_DBI + help + DRM panel driver for the Samsung AMS495QA01 panel controlled + with the Magnachip D53E6EA8966 panel IC. This panel receives + video data via DSI but commands via 3-Wire 9-bit SPI. + config DRM_PANEL_NEC_NL8048HL11 tristate "NEC NL8048HL11 RGB panel" depends on GPIOLIB && OF && SPI
drivers/gpu/drm/panel/Makefile +1 -0
@@ -26,6 +26,7 @@ obj-$(CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W) += panel-leadtek-ltk050h3146w.o obj-$(CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829) += panel-leadtek-ltk500hd1829.o obj-$(CONFIG_DRM_PANEL_LG_LB035Q02) += panel-lg-lb035q02.o obj-$(CONFIG_DRM_PANEL_LG_LG4573) += panel-lg-lg4573.o +obj-$(CONFIG_DRM_PANEL_MAGNACHIP_D53E6EA8966) += panel-magnachip-d53e6ea8966.o obj-$(CONFIG_DRM_PANEL_NEC_NL8048HL11) += panel-nec-nl8048hl11.o obj-$(CONFIG_DRM_PANEL_NEWVISION_NV3051D) += panel-newvision-nv3051d.o obj-$(CONFIG_DRM_PANEL_NEWVISION_NV3052C) += panel-newvision-nv3052c.o
drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c new file +515 -0
515 lines not on this page · raw message
Signature · 1 line
2.34.1
Re: [PATCH V5 3/4] drm/panel: Add Magnachip D53E6EA8966 Panel Driver
Hi Chris,
looks good to me, just very minor nitpicks:
Quoted 7 lines · Chris Morgan
From: Chris Morgan <[email protected]>
Support Magnachip D53E6EA8966 based panels such as the Samsung AMS495QA01 panel as found on the Anbernic RG503. Note this driver supports only the AMS495QA01 today which receives video signals via DSI, however it receives commands via 3-wire SPI.
using DBI.
Quoted 3 lines
Signed-off-by Chris Morgan <[email protected]>Signed-off-by Maya Matuszczyk <[email protected]>
Is your Kconfig snippet missing:
depends on BACKLIGHT_CLASS_DEVICE
?
drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c line 22
Quoted 2 lines
drivers/gpu/drm/panel/panel-magnachip-d53e6ea8966.c new file +2
-0+#include <linux/of_device.h> +#include <linux/of_graph.h>
Not needed anymore, right?
With these fixed:
Yours,
Linus Walleij
PATCH v4 4/4 arm64: dts: rockchip: add display to RG503
In reply to Chris MorganFrom: Chris Morgan <[email protected]>
Add Samsung AMS495QA01 panel to RG503.
--- .../dts/rockchip/rk3566-anbernic-rg503.dts | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+)
arch/arm64/boot/dts/rockchip/rk3566-anbernic-rg503.dts +55 -0
@@ -47,6 +47,21 @@ gpio_spi: spi { mosi-gpios = <&gpio4 RK_PB0 GPIO_ACTIVE_HIGH>; cs-gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_HIGH>; num-chipselects = <0>; + + panel@0 { + compatible = "samsung,ams495qa01"; + reg = <0>; + pinctrl-names = "default"; + pinctrl-0 = <&lcd_reset>; + reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>; + vdd-supply = <&vcc_3v3>; + + port { + mipi_in_panel: endpoint { + remote-endpoint = <&mipi_out_panel>; + }; + }; + }; }; /* Channels reversed for both headphones and speakers. */
@@ -94,6 +109,32 @@ &cru { assigned-clock-rates = <1200000000>, <200000000>, <500000000>; }; +&dsi_dphy0 { + status = "okay"; +}; + +&dsi0 { + status = "okay"; + + ports { + dsi0_in: port@0 { + reg = <0>; + + dsi0_in_vp1: endpoint { + remote-endpoint = <&vp1_out_dsi0>; + }; + }; + + dsi0_out: port@1 { + reg = <1>; + + mipi_out_panel: endpoint { + remote-endpoint = <&mipi_in_panel>; + }; + }; + }; +}; + &gpio_keys_control { button-a { gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;
@@ -146,6 +187,13 @@ spk_amp_enable_h: spk-amp-enable-h { }; }; + gpio-lcd { + lcd_reset: lcd-reset { + rockchip,pins = + <4 RK_PA0 RK_FUNC_GPIO &pcfg_pull_none>; + }; + }; + gpio-spi { spi_pins: spi-pins { rockchip,pins =
@@ -164,3 +212,10 @@ rk817_charger: charger { rockchip,sleep-filter-current-microamp = <100000>; }; }; + +&vp1 { + vp1_out_dsi0: endpoint@ROCKCHIP_VOP2_EP_MIPI0 { + reg = <ROCKCHIP_VOP2_EP_MIPI0>; + remote-endpoint = <&dsi0_in_vp1>; + }; +};
Signature · 1 line
2.34.1