MIPS: JZ4780 and CI20 HDMI
Subsystems (6)
v3 cover MIPS: JZ4780 and CI20 HDMI
This series adds HDMI support for JZ4780 and CI20 board (and fixes one IPU related issue in registration error path)
- [patch 1/8] switched from mode_fixup to atomic_check (suggested by [email protected])
- the call to the dw-hdmi specialization is still called mode_fixup
- [patch 3/8] diverse fixes for ingenic-drm-drv (suggested by [email protected])
- factor out some non-HDMI features of the jz4780 into a separate patch
- multiple fixes around max height
- do not change regmap config but a copy on stack
- define some constants
- factor out fixing of drm_init error path for IPU into separate patch
- use FIELD_PREP()
- [patch 8/8] conversion to component framework dropped (suggested by [email protected] and [email protected])
PATCH V2 2021-08-05 16:08:05:
This series adds HDMI support for JZ4780 and CI20 board
V2:
- code and commit messages revisited for checkpatch warnings
- rebased on v5.14-rc4
- include (failed, hence RFC 8/8) attempt to convert to component framework (was suggested by Paul Cercueil <[email protected]> a while ago)
H. Nikolaus Schaller (1):
MIPS: CI20: defconfig: configure for DRM_DW_HDMI_JZ4780
Paul Boddie (7):
drm/ingenic: fix drm_init error path if IPU was registered drm/bridge: synopsis: Add mode_fixup and bridge timings support drm/ingenic: Add jz4780 Synopsys HDMI driver drm/ingenic: Add support for JZ4780 and HDMI output
MIPS: DTS: jz4780: account for Synopsys HDMI driver and LCD
controllers
MIPS: DTS: CI20: add HDMI setup
drm/ingenic: add some jz4780 specific features
Sam Ravnborg (1):
dt-bindings: display: Add ingenic-jz4780-hdmi DT Schema
.../bindings/display/ingenic-jz4780-hdmi.yaml | 82 +++++++++ arch/mips/boot/dts/ingenic/ci20.dts | 64 +++++++ arch/mips/boot/dts/ingenic/jz4780.dtsi | 45 +++++ arch/mips/configs/ci20_defconfig | 7 + drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 7 + drivers/gpu/drm/ingenic/Kconfig | 9 + drivers/gpu/drm/ingenic/Makefile | 1 + drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 169 ++++++++++++++++-- drivers/gpu/drm/ingenic/ingenic-drm.h | 42 +++++ drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c | 121 +++++++++++++ include/drm/bridge/dw_hdmi.h | 5 + 11 files changed, 538 insertions(+), 14 deletions(-) create mode 100644 Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml create mode 100644 drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c
Signature · 1 line
2.31.1
PATCH v3 1/9 drm/ingenic: fix drm_init error path if IPU was registered
From: Paul Boddie <[email protected]>
Code structure is in preparation to add hdmi unregistration in error case following the same pattern.
--- drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/gpu/drm/ingenic/ingenic-drm-drv.c +10 -1
@@ -1355,7 +1355,16 @@ static int ingenic_drm_init(void)return err; } -return platform_driver_register (&ingenic_drm_driver); + err =platform_driver_register (&ingenic_drm_driver); +if (err) + goto err_ipu_unreg; + +return 0 ; + +err_ipu_unreg: +if (IS_ENABLED (CONFIG_DRM_INGENIC_IPU )) +platform_driver_unregister (ingenic_ipu_driver_ptr); +return err; }module_init (ingenic_drm_init);
Signature · 1 line
2.31.1
PATCH v3 2/9 drm/bridge: synopsis: Add mode_fixup and bridge timings support
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
The platform-specific configuration structure is augmented with mode_fixup and timings members so that specialisations of the Synopsys driver can introduce mode flags and bus flags.
--- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 7 +++++++ include/drm/bridge/dw_hdmi.h | 5 +++++ 2 files changed, 12 insertions(+)
drivers/gpu/drm/bridge/synopsys/dw-hdmi.c +7 -0
@@ -2766,6 +2766,11 @@ static int dw_hdmi_bridge_atomic_check(struct drm_bridge *bridge, bridge_state->input_bus_cfg.format, bridge_state->output_bus_cfg.format); +if (hdmi->plat_data->mode_fixup) +if (!hdmi->plat_data->mode_fixup (bridge, &crtc_state->mode, + &crtc_state->adjusted_mode)) +return -EINVAL ; +return 0 ; }
@@ -3364,6 +3369,8 @@ struct dw_hdmi *dw_hdmi_probe(struct platform_device *pdev,#ifdef CONFIG_OF hdmi->bridge.of_node = pdev->dev.of_node;#endif +if (plat_data->timings) + hdmi->bridge.timings = plat_data->timings;memset (&pdevinfo,0 ,sizeof (pdevinfo)); pdevinfo.parent = dev;
include/drm/bridge/dw_hdmi.h +5 -0
@@ -8,6 +8,7 @@#include <sound/hdmi-codec.h> +struct drm_bridge ;struct drm_display_info ;struct drm_display_mode ;struct drm_encoder ;
@@ -140,6 +141,10 @@ struct dw_hdmi_plat_data {enum drm_mode_status (*mode_valid)(struct dw_hdmi *hdmi,void *data,const struct drm_display_info *info,const struct drm_display_mode *mode); +bool (*mode_fixup)(struct drm_bridge *bridge, +const struct drm_display_mode *mode, +struct drm_display_mode *adjusted_mode); +const struct drm_bridge_timings *timings;/* Vendor PHY support */ const struct dw_hdmi_phy_ops *phy_ops;
Signature · 1 line
2.31.1
PATCH v3 3/9 drm/ingenic: Add jz4780 Synopsys HDMI driver
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
A specialisation of the generic Synopsys HDMI driver is employed for JZ4780 HDMI support. This requires a new driver, plus device tree and configuration modifications.
--- drivers/gpu/drm/ingenic/Kconfig | 9 ++ drivers/gpu/drm/ingenic/Makefile | 1 + drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c | 121 ++++++++++++++++++++++ 3 files changed, 131 insertions(+) create mode 100644 drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c
drivers/gpu/drm/ingenic/Kconfig +9 -0
@@ -25,4 +25,13 @@ config DRM_INGENIC_IPU The Image Processing Unit (IPU) will appear as a second primary plane. +config DRM_INGENIC_DW_HDMI + bool "Ingenic specific support for Synopsys DW HDMI" + depends on MACH_JZ4780 + select DRM_DW_HDMI + help + Choose this option to enable Synopsys DesignWare HDMI based driver. + If you want to enable HDMI on Ingenic JZ4780 based SoC, you should + select this option.. + endif
drivers/gpu/drm/ingenic/Makefile +1 -0
@@ -1,3 +1,4 @@ obj-$(CONFIG_DRM_INGENIC) += ingenic-drm.o ingenic-drm-y = ingenic-drm-drv.o ingenic-drm-$(CONFIG_DRM_INGENIC_IPU) += ingenic-ipu.o +ingenic-drm-$(CONFIG_DRM_INGENIC_DW_HDMI) += ingenic-dw-hdmi.o
drivers/gpu/drm/ingenic/ingenic-dw-hdmi.c new file +121 -0
121 lines not on this page · raw message
Signature · 1 line
2.31.1
PATCH v3 4/9 drm/ingenic: Add support for JZ4780 and HDMI output
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
Add support for the LCD controller present on JZ4780 SoCs. This SoC uses 8-byte descriptors which extend the current 4-byte descriptors used for other Ingenic SoCs.
Also, add special handling for HDMI-A connectors.
For some reason, only the primary planes are working properly. As soon as the overlay plane is enabled things go south :P
Tested on MIPS Creator CI20 board.
--- drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 119 +++++++++++++++++++--- drivers/gpu/drm/ingenic/ingenic-drm.h | 42 ++++++++ 2 files changed, 148 insertions(+), 13 deletions(-)
drivers/gpu/drm/ingenic/ingenic-drm-drv.c +106 -13
@@ -6,6 +6,7 @@#include "ingenic-drm.h" +#include <linux/bitfield.h> #include <linux/component.h> #include <linux/clk.h> #include <linux/dma-mapping.h>
@@ -56,13 +57,24 @@ struct ingenic_dma_hwdescs {u16 palette[256 ]__aligned(16) ; }; +struct ingenic_dma_hwdesc_ext { +struct ingenic_dma_hwdesc base; +u32 offsize; +u32 pagewidth; +u32 cpos; +u32 dessize; +} __packed; +struct jz_soc_info {bool needs_dev_clk;bool has_osd;bool map_noncoherent; +bool use_extended_hwdesc; +unsigned int hwdesc_size;unsigned int max_width, max_height;const u32 *formats_f0, *formats_f1;unsigned int num_formats_f0, num_formats_f1; +unsigned int max_reg; };struct ingenic_drm {
@@ -118,12 +130,11 @@ static bool ingenic_drm_writeable_reg(struct device *dev, unsigned int reg) } } -static const struct regmap_config ingenic_drm_regmap_config = { +static struct regmap_config ingenic_drm_regmap_config = { .reg_bits =32 , .val_bits =32 , .reg_stride =4 , - .max_register =JZ_REG_LCD_SIZE1 , .writeable_reg = ingenic_drm_writeable_reg, };
@@ -582,7 +593,40 @@ static void ingenic_drm_plane_atomic_update(struct drm_plane *plane, hwdesc = &priv->dma_hwdescs->hwdesc_f1; hwdesc->addr = addr; - hwdesc->cmd =JZ_LCD_CMD_EOF_IRQ | (width * height * cpp /4 ); + hwdesc->cmd =JZ_LCD_CMD_FRM_ENABLE |JZ_LCD_CMD_EOF_IRQ | + (width * height * cpp /4 ); + +if (priv->soc_info->use_extended_hwdesc) { +struct ingenic_dma_hwdesc_ext *hwdesc_ext; + +/* Extended 8-byte descriptor */ + hwdesc_ext = (struct ingenic_dma_hwdesc_ext *) hwdesc; + hwdesc_ext->cpos =0 ; + hwdesc_ext->offsize =0 ; + hwdesc_ext->pagewidth =0 ; + +switch (newstate->fb->format->format) { +case DRM_FORMAT_XRGB1555 : + hwdesc_ext->cpos |=JZ_LCD_CPOS_RGB555 ; + fallthrough; +case DRM_FORMAT_RGB565 : + hwdesc_ext->cpos |=JZ_LCD_CPOS_BPP_15_16 ; +break ; +case DRM_FORMAT_XRGB8888 : + hwdesc_ext->cpos |=JZ_LCD_CPOS_BPP_18_24 ; +break ; + } + hwdesc_ext->cpos |=JZ_LCD_CPOS_PREMULTIPLY_LCD | + (JZ_LCD_CPOS_COEFFICIENT_1_ALPHA1 << +JZ_LCD_CPOS_COEFFICIENT_OFFSET ); + + hwdesc_ext->dessize = + (0xff <<JZ_LCD_DESSIZE_ALPHA_OFFSET ) | +FIELD_PREP (JZ_LCD_DESSIZE_HEIGHT_MASK << +JZ_LCD_DESSIZE_HEIGHT_OFFSET , height -1 ) | +FIELD_PREP (JZ_LCD_DESSIZE_WIDTH_MASK << +JZ_LCD_DESSIZE_WIDTH_OFFSET , width -1 ); + }if (drm_atomic_crtc_needs_modeset (crtc_state)) { fourcc = newstate->fb->format->format;
@@ -612,8 +656,12 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,struct drm_display_mode *mode = &crtc_state->adjusted_mode;struct drm_connector *conn = conn_state->connector;struct drm_display_info *info = &conn->display_info; +u32 bus_format =MEDIA_BUS_FMT_RGB888_1X24 ;unsigned int cfg, rgbcfg =0 ; +if (info->num_bus_formats) + bus_format = info->bus_formats[0 ]; + priv->panel_is_sharp = info->bus_flags &DRM_BUS_FLAG_SHARP_SIGNALS ;if (priv->panel_is_sharp) {
@@ -623,6 +671,10 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder, | JZ_LCD_CFG_SPL_DISABLE | JZ_LCD_CFG_REV_DISABLE; } +/* set use of the 8-word descriptor and OSD foreground usage. */ +if (priv->soc_info->use_extended_hwdesc) + cfg |=JZ_LCD_CFG_DESCRIPTOR_8 ; +if (mode->flags &DRM_MODE_FLAG_NHSYNC ) cfg |=JZ_LCD_CFG_HSYNC_ACTIVE_LOW ;if (mode->flags &DRM_MODE_FLAG_NVSYNC )
@@ -639,7 +691,7 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,else cfg |=JZ_LCD_CFG_MODE_TV_OUT_P ; }else { -switch (*info->bus_formats) { +switch (bus_format) {case MEDIA_BUS_FMT_RGB565_1X16 : cfg |=JZ_LCD_CFG_MODE_GENERIC_16BIT ;break ;
@@ -665,19 +717,23 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder,regmap_write (priv->map,JZ_REG_LCD_RGBC , rgbcfg); } -static int ingenic_drm_encoder_atomic_check (struct drm_encoder *encoder, -struct drm_crtc_state *crtc_state, -struct drm_connector_state *conn_state) +static int +ingenic_drm_encoder_atomic_check (struct drm_encoder *encoder, +struct drm_crtc_state *crtc_state, +struct drm_connector_state *conn_state) {struct drm_display_info *info = &conn_state->connector->display_info;struct drm_display_mode *mode = &crtc_state->adjusted_mode; +switch (conn_state->connector->connector_type) { +case DRM_MODE_CONNECTOR_TV : +case DRM_MODE_CONNECTOR_HDMIA : +return 0 ; + } +if (info->num_bus_formats !=1 )return -EINVAL ; -if (conn_state->connector->connector_type ==DRM_MODE_CONNECTOR_TV ) -return 0 ; -switch (*info->bus_formats) {case MEDIA_BUS_FMT_RGB888_3X8 :case MEDIA_BUS_FMT_RGB888_3X8_DELTA :
@@ -881,6 +937,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)struct drm_panel *panel;struct drm_encoder *encoder;struct drm_device *drm; +struct regmap_config regmap_config;void __iomem *base;long parent_rate;unsigned int i, clone_mask =0 ;
@@ -934,8 +991,10 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)return PTR_ERR (base); } + regmap_config = ingenic_drm_regmap_config; + regmap_config.max_register = soc_info->max_reg; priv->map =devm_regmap_init_mmio (dev, base, - &ingenic_drm_regmap_config); + ®map_config);if (IS_ERR (priv->map)) {dev_err (dev,"Failed to create regmap\n" );return PTR_ERR (priv->map);
@@ -1147,7 +1206,7 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)/* Enable OSD if available */ if (soc_info->has_osd) -regmap_write (priv->map,JZ_REG_LCD_OSDC ,JZ_LCD_OSDC_OSDEN ); +regmap_set_bits (priv->map,JZ_REG_LCD_OSDC ,JZ_LCD_OSDC_OSDEN );mutex_init (&priv->clk_mutex); priv->clock_nb.notifier_call = ingenic_drm_update_pixclk;
@@ -1296,41 +1355,63 @@ static const struct jz_soc_info jz4740_soc_info = { .needs_dev_clk = true, .has_osd = false, .map_noncoherent = false, + .hwdesc_size = sizeof(struct ingenic_dma_hwdesc), .max_width = 800, .max_height = 600, .formats_f1 = jz4740_formats, .num_formats_f1 = ARRAY_SIZE(jz4740_formats),/* JZ4740 has only one plane */ + .max_reg = JZ_REG_LCD_SIZE1, };static const struct jz_soc_info jz4725b_soc_info = { .needs_dev_clk = false, .has_osd = true, .map_noncoherent = false, + .hwdesc_size =sizeof (struct ingenic_dma_hwdesc ), .max_width =800 , .max_height =600 , .formats_f1 = jz4725b_formats_f1, .num_formats_f1 =ARRAY_SIZE (jz4725b_formats_f1), .formats_f0 = jz4725b_formats_f0, .num_formats_f0 =ARRAY_SIZE (jz4725b_formats_f0), + .max_reg =JZ_REG_LCD_SIZE1 , };static const struct jz_soc_info jz4770_soc_info = { .needs_dev_clk = false, .has_osd = true, .map_noncoherent = true, + .hwdesc_size =sizeof (struct ingenic_dma_hwdesc ), .max_width =1280 , .max_height =720 , .formats_f1 = jz4770_formats_f1, .num_formats_f1 =ARRAY_SIZE (jz4770_formats_f1), .formats_f0 = jz4770_formats_f0, .num_formats_f0 =ARRAY_SIZE (jz4770_formats_f0), + .max_reg =JZ_REG_LCD_SIZE1 , +}; + +static const struct jz_soc_info jz4780_soc_info = { + .needs_dev_clk = true, + .has_osd = true, + .use_extended_hwdesc = true, + .hwdesc_size =sizeof (struct ingenic_dma_hwdesc_ext ), + .max_width =4096 , + .max_height =2048 , +/* REVISIT: do we support formats different from jz4770? */ + .formats_f1 = jz4770_formats_f1, + .num_formats_f1 =ARRAY_SIZE (jz4770_formats_f1), + .formats_f0 = jz4770_formats_f0, + .num_formats_f0 =ARRAY_SIZE (jz4770_formats_f0), + .max_reg =JZ_REG_LCD_PCFG , };static const struct of_device_id ingenic_drm_of_match[] = { { .compatible ="ingenic,jz4740-lcd" , .data = &jz4740_soc_info }, { .compatible ="ingenic,jz4725b-lcd" , .data = &jz4725b_soc_info }, { .compatible ="ingenic,jz4770-lcd" , .data = &jz4770_soc_info }, + { .compatible ="ingenic,jz4780-lcd" , .data = &jz4780_soc_info }, {/* sentinel */ }, };MODULE_DEVICE_TABLE (of, ingenic_drm_of_match);
@@ -1349,10 +1430,16 @@ static int ingenic_drm_init(void) {int err; +if (IS_ENABLED (CONFIG_DRM_INGENIC_DW_HDMI )) { + err =platform_driver_register (ingenic_dw_hdmi_driver_ptr); +if (err) +return err; + } +if (IS_ENABLED (CONFIG_DRM_INGENIC_IPU )) { err =platform_driver_register (ingenic_ipu_driver_ptr);if (err) -return err; + goto err_hdmi_unreg; } err =platform_driver_register (&ingenic_drm_driver);
@@ -1364,6 +1451,10 @@ static int ingenic_drm_init(void) err_ipu_unreg:if (IS_ENABLED (CONFIG_DRM_INGENIC_IPU ))platform_driver_unregister (ingenic_ipu_driver_ptr); +err_hdmi_unreg: +if (IS_ENABLED (CONFIG_DRM_INGENIC_DW_HDMI )) +platform_driver_unregister (ingenic_dw_hdmi_driver_ptr); +return err; }module_init (ingenic_drm_init);
@@ -1372,6 +1463,8 @@ static void ingenic_drm_exit(void) {platform_driver_unregister (&ingenic_drm_driver); +if (IS_ENABLED (CONFIG_DRM_INGENIC_DW_HDMI )) +platform_driver_unregister (ingenic_dw_hdmi_driver_ptr);if (IS_ENABLED (CONFIG_DRM_INGENIC_IPU ))platform_driver_unregister (ingenic_ipu_driver_ptr); }
drivers/gpu/drm/ingenic/ingenic-drm.h +42 -0
79 lines not on this page · raw message
Signature · 1 line
2.31.1
PATCH v3 5/9 dt-bindings: display: Add ingenic-jz4780-hdmi DT Schema
In reply to H. Nikolaus SchallerFrom: Sam Ravnborg <[email protected]>
Add DT bindings for the hdmi driver for the Ingenic JZ4780 SoC. Based on .txt binding from Zubair Lutfullah Kakakhel
--- .../bindings/display/ingenic-jz4780-hdmi.yaml | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +82 -0
@@ -0,0 +1,82 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/ingenic-jz4780-hdmi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Bindings for Ingenic JZ4780 HDMI Transmitter + +maintainers: + - H. Nikolaus Schaller <[email protected]> + +description: | + The HDMI Transmitter in the Ingenic JZ4780 is a Synopsys DesignWare HDMI 1.4 + TX controller IP with accompanying PHY IP. + +allOf: + - $ref: panel/panel-common.yaml# + +properties: + compatible: + items: + - const: ingenic,jz4780-hdmi + + reg: + maxItems: 1 + description: the address & size of the LCD controller registers + + reg-io-width: + const: 4 + + interrupts: + maxItems: 1 + description: Specifies the interrupt provided by parent + + clocks: + maxItems: 2 + description: Clock specifiers for isrf and iahb clocks + + clock-names: + items: + - const: isfr + - const: iahb + + ddc-i2c-bus: true + ports: true + +required: + - compatible + - clocks + - clock-names + - ports + - reg-io-width + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/jz4780-cgu.h> + + hdmi: hdmi@10180000 { + compatible = "ingenic,jz4780-hdmi"; + reg = <0x10180000 0x8000>; + reg-io-width = <4>; + ddc-i2c-bus = <&i2c4>; + interrupt-parent = <&intc>; + interrupts = <3>; + clocks = <&cgu JZ4780_CLK_HDMI>, <&cgu JZ4780_CLK_AHB0>; + clock-names = "isfr", "iahb"; + + ports { + hdmi_in: port { + #address-cells = <1>; + #size-cells = <0>; + hdmi_in_lcd: endpoint@0 { + reg = <0>; + remote-endpoint = <&jz4780_out_hdmi>; + }; + }; + }; + }; + +...
Signature · 1 line
2.31.1
Rob Herring
maintainerRe: [PATCH v3 5/9] dt-bindings: display: Add ingenic-jz4780-hdmi DT Schema
Quoted 27 lines · H. Nikolaus Schaller
From: Sam Ravnborg <[email protected]>
Add DT bindings for the hdmi driver for the Ingenic JZ4780 SoC. Based on .txt binding from Zubair Lutfullah Kakakhel
Signed-off-by Sam Ravnborg <[email protected]>Signed-off-by H. Nikolaus Schaller <[email protected]>Cc Rob Herring <[email protected]>--- .../bindings/display/ingenic-jz4780-hdmi.yaml | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yamlDocumentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +7
-0@@ -0,0 +1,82 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/display/ingenic-jz4780-hdmi.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Bindings for Ingenic JZ4780 HDMI Transmitter
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml line 17
Quoted 10 lines
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +10
-0+ +maintainers: + - H. Nikolaus Schaller <[email protected]> + +description: | + The HDMI Transmitter in the Ingenic JZ4780 is a Synopsys DesignWare HDMI 1.4 + TX controller IP with accompanying PHY IP. + +allOf: + - $ref: panel/panel-common.yaml#
This isn't a panel...
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml line 26
Quoted 9 lines
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +9
-0+ +properties: + compatible: + items: + - const: ingenic,jz4780-hdmi + + reg: + maxItems: 1 + description: the address & size of the LCD controller registers
Drop. Don't need generic descriptions. Plus, this isn't an LCD controller.
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml line 33
Quoted 7 lines
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +7
-0+ + reg-io-width: + const: 4 + + interrupts: + maxItems: 1 + description: Specifies the interrupt provided by parent
Drop. Don't need generic descriptions.
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml line 44
Quoted 11 lines
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +11
-0+ + clocks: + maxItems: 2 + description: Clock specifiers for isrf and iahb clocks + + clock-names: + items: + - const: isfr + - const: iahb + + ddc-i2c-bus: true
This belongs in a connector or panel node.
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml line 45
Quoted 1 line
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +1
-0+ ports: true
You have to define what each 'port' node is and reference the graph schema. Given you are using 'ports', I assume there is more than 1. The example says not, but you need to add an output port for a connector node.
Quoted 41 lines
Documentation/devicetree/bindings/display/ingenic-jz4780-hdmi.yaml new file +37
-0+ +required: + - compatible + - clocks + - clock-names + - ports + - reg-io-width + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/jz4780-cgu.h> + + hdmi: hdmi@10180000 { + compatible = "ingenic,jz4780-hdmi"; + reg = <0x10180000 0x8000>; + reg-io-width = <4>; + ddc-i2c-bus = <&i2c4>; + interrupt-parent = <&intc>; + interrupts = <3>; + clocks = <&cgu JZ4780_CLK_HDMI>, <&cgu JZ4780_CLK_AHB0>; + clock-names = "isfr", "iahb"; + + ports { + hdmi_in: port { + #address-cells = <1>; + #size-cells = <0>; + hdmi_in_lcd: endpoint@0 { + reg = <0>; + remote-endpoint = <&jz4780_out_hdmi>; + }; + }; + }; + }; + +...Signature · 1 line
2.31.1
PATCH v3 6/9 MIPS: DTS: jz4780: account for Synopsys HDMI driver and LCD controllers
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
A specialisation of the generic Synopsys HDMI driver is employed for JZ4780 HDMI support. This requires a new driver, plus device tree and configuration modifications.
--- arch/mips/boot/dts/ingenic/jz4780.dtsi | 45 ++++++++++++++++++++++++++ 1 file changed, 45 insertions(+)
arch/mips/boot/dts/ingenic/jz4780.dtsi +45 -0
@@ -424,6 +424,51 @@ i2c4: i2c@10054000 { status = "disabled"; }; + hdmi: hdmi@10180000 { + compatible = "ingenic,jz4780-dw-hdmi"; + reg = <0x10180000 0x8000>; + reg-io-width = <4>; + + clocks = <&cgu JZ4780_CLK_HDMI>, <&cgu JZ4780_CLK_AHB0>; + clock-names = "isfr" , "iahb"; + + assigned-clocks = <&cgu JZ4780_CLK_HDMI>; + assigned-clock-rates = <27000000>; + + interrupt-parent = <&intc>; + interrupts = <3>; + + /* ddc-i2c-bus = <&i2c4>; */ + + status = "disabled"; + }; + + lcdc0: lcdc0@13050000 { + compatible = "ingenic,jz4780-lcd"; + reg = <0x13050000 0x1800>; + + clocks = <&cgu JZ4780_CLK_TVE>, <&cgu JZ4780_CLK_LCD0PIXCLK>; + clock-names = "lcd", "lcd_pclk"; + + interrupt-parent = <&intc>; + interrupts = <31>; + + status = "disabled"; + }; + + lcdc1: lcdc1@130a0000 { + compatible = "ingenic,jz4780-lcd"; + reg = <0x130a0000 0x1800>; + + clocks = <&cgu JZ4780_CLK_TVE>, <&cgu JZ4780_CLK_LCD1PIXCLK>; + clock-names = "lcd", "lcd_pclk"; + + interrupt-parent = <&intc>; + interrupts = <31>; + + status = "disabled"; + }; + nemc: nemc@13410000 { compatible = "ingenic,jz4780-nemc", "simple-mfd"; reg = <0x13410000 0x10000>;
Signature · 1 line
2.31.1
PATCH v3 7/9 MIPS: DTS: CI20: add HDMI setup
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
We need to hook up
* HDMI power regulator
* HDMI connector
* DDC pinmux
* HDMI and LCD endpoint connections
--- arch/mips/boot/dts/ingenic/ci20.dts | 64 +++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+)
arch/mips/boot/dts/ingenic/ci20.dts +64 -0
@@ -78,6 +78,28 @@ eth0_power: fixedregulator@0 { enable-active-high; }; + hdmi_power: fixedregulator@2 { + compatible = "regulator-fixed"; + regulator-name = "hdmi_power"; + regulator-min-microvolt = <5000000>; + regulator-max-microvolt = <5000000>; + gpio = <&gpa 25 GPIO_ACTIVE_LOW>; + enable-active-high; + regulator-always-on; + }; + + hdmi_out: connector { + compatible = "hdmi-connector"; + label = "HDMI OUT"; + type = "a"; + + port { + hdmi_con: endpoint { + remote-endpoint = <&dw_hdmi_out>; + }; + }; + }; + ir: ir { compatible = "gpio-ir-receiver"; gpios = <&gpe 3 GPIO_ACTIVE_LOW>;
@@ -506,6 +528,12 @@ pins_i2c4: i2c4 { bias-disable; }; + pins_hdmi_ddc: hdmi_ddc { + function = "hdmi-ddc"; + groups = "hdmi-ddc"; + bias-disable; + }; + pins_nemc: nemc { function = "nemc"; groups = "nemc-data", "nemc-cle-ale", "nemc-rd-we", "nemc-frd-fwe";
@@ -536,3 +564,39 @@ pins_mmc1: mmc1 { bias-disable; }; }; + +&hdmi { + status = "okay"; + + pinctrl-names = "default"; + pinctrl-0 = <&pins_hdmi_ddc>; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dw_hdmi_in: endpoint { + remote-endpoint = <&lcd_out>; + }; + }; + + port@1 { + reg = <1>; + dw_hdmi_out: endpoint { + remote-endpoint = <&hdmi_con>; + }; + }; + }; +}; + +&lcdc0 { + status = "okay"; + + port { + lcd_out: endpoint { + remote-endpoint = <&dw_hdmi_in>; + }; + }; +};
Signature · 1 line
2.31.1
PATCH v3 8/9 MIPS: CI20: defconfig: configure for DRM_DW_HDMI_JZ4780
In reply to H. Nikolaus SchallerEnable CONFIG options as modules.
--- arch/mips/configs/ci20_defconfig | 7 +++++++ 1 file changed, 7 insertions(+)
arch/mips/configs/ci20_defconfig +7 -0
@@ -98,7 +98,14 @@ CONFIG_RC_DEVICES=y CONFIG_IR_GPIO_CIR=m CONFIG_IR_GPIO_TX=m CONFIG_MEDIA_SUPPORT=m +CONFIG_DRM=m +CONFIG_DRM_INGENIC=m +CONFIG_DRM_INGENIC_DW_HDMI=y # CONFIG_VGA_CONSOLE is not set +CONFIG_FRAMEBUFFER_CONSOLE=y +CONFIG_LOGO=y +# CONFIG_LOGO_LINUX_MONO is not set +# CONFIG_LOGO_LINUX_VGA16 is not set # CONFIG_HID is not set CONFIG_USB=y CONFIG_USB_STORAGE=y
Signature · 1 line
2.31.1
PATCH v3 9/9 drm/ingenic: add some jz4780 specific features
In reply to H. Nikolaus SchallerFrom: Paul Boddie <[email protected]>
The jz4780 has some features which need initialization according to the vendor kernel.
--- drivers/gpu/drm/ingenic/ingenic-drm-drv.c | 39 +++++++++++++++++++++++ 1 file changed, 39 insertions(+)
drivers/gpu/drm/ingenic/ingenic-drm-drv.c +39 -0
@@ -69,6 +69,10 @@ struct jz_soc_info {bool needs_dev_clk;bool has_osd;bool map_noncoherent; +bool has_alpha; +bool has_pcfg; +bool has_recover; +bool has_rgbc;bool use_extended_hwdesc;unsigned int hwdesc_size;unsigned int max_width, max_height;
@@ -671,6 +675,9 @@ static void ingenic_drm_encoder_atomic_mode_set(struct drm_encoder *encoder, | JZ_LCD_CFG_SPL_DISABLE | JZ_LCD_CFG_REV_DISABLE; } +if (priv->soc_info->has_recover) + cfg |=JZ_LCD_CFG_RECOVER_FIFO_UNDERRUN ; +/* set use of the 8-word descriptor and OSD foreground usage. */ if (priv->soc_info->use_extended_hwdesc) cfg |=JZ_LCD_CFG_DESCRIPTOR_8 ;
@@ -1208,6 +1215,25 @@ static int ingenic_drm_bind(struct device *dev, bool has_components)if (soc_info->has_osd)regmap_set_bits (priv->map,JZ_REG_LCD_OSDC ,JZ_LCD_OSDC_OSDEN ); +if (soc_info->has_alpha) +regmap_set_bits (priv->map,JZ_REG_LCD_OSDC ,JZ_LCD_OSDC_ALPHAEN ); + +/* Magic values from the vendor kernel for the priority thresholds. */ +if (soc_info->has_pcfg) +regmap_write (priv->map,JZ_REG_LCD_PCFG , +JZ_LCD_PCFG_PRI_MODE | +JZ_LCD_PCFG_HP_BST_16 | + (511 <<JZ_LCD_PCFG_THRESHOLD2_OFFSET ) | + (400 <<JZ_LCD_PCFG_THRESHOLD1_OFFSET ) | + (256 <<JZ_LCD_PCFG_THRESHOLD0_OFFSET )); + +/* RGB output control may be superfluous. */ +if (soc_info->has_rgbc) +regmap_write (priv->map,JZ_REG_LCD_RGBC , +JZ_LCD_RGBC_RGB_FORMAT_ENABLE | +JZ_LCD_RGBC_ODD_RGB | +JZ_LCD_RGBC_EVEN_RGB ); +mutex_init (&priv->clk_mutex); priv->clock_nb.notifier_call = ingenic_drm_update_pixclk;
@@ -1355,6 +1381,9 @@ static const struct jz_soc_info jz4740_soc_info = { .needs_dev_clk = true, .has_osd = false, .map_noncoherent = false, + .has_pcfg = false, + .has_recover = false, + .has_rgbc = false, .hwdesc_size = sizeof(struct ingenic_dma_hwdesc), .max_width = 800, .max_height = 600,
@@ -1368,6 +1397,9 @@ static const struct jz_soc_info jz4725b_soc_info = { .needs_dev_clk = false, .has_osd = true, .map_noncoherent = false, + .has_pcfg = false, + .has_recover = false, + .has_rgbc = false, .hwdesc_size = sizeof(struct ingenic_dma_hwdesc), .max_width = 800, .max_height = 600,
@@ -1382,6 +1414,9 @@ static const struct jz_soc_info jz4770_soc_info = { .needs_dev_clk = false, .has_osd = true, .map_noncoherent = true, + .has_pcfg = false, + .has_recover = false, + .has_rgbc = false, .hwdesc_size = sizeof(struct ingenic_dma_hwdesc), .max_width = 1280, .max_height = 720,
@@ -1395,6 +1430,10 @@ static const struct jz_soc_info jz4770_soc_info = {static const struct jz_soc_info jz4780_soc_info = { .needs_dev_clk = true, .has_osd = true, + .has_alpha = true, + .has_pcfg = true, + .has_recover = true, + .has_rgbc = true, .use_extended_hwdesc = true, .hwdesc_size =sizeof (struct ingenic_dma_hwdesc_ext ), .max_width =4096 ,
Signature · 1 line
2.31.1