From ef52649124cf84bae4e1f736a4db1f78d177e35d Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Mon, 22 Jun 2020 17:55:25 +0800 Subject: [PATCH] drm/bridge: support rk1000 tv encoder RK1000 is a digital-analog mixed chip which has tve output function. RK1000's registers can be written and read through I2C interaface. Because RK1000's I2C need dclk and mclk, RK1000 TVE should be registered after RK1000 CORE. Change-Id: I65b40826bd1dbf07d4fa94ecdf8c75005008731f Signed-off-by: Algea Cao --- drivers/gpu/drm/bridge/Kconfig | 8 ++++++++ drivers/gpu/drm/bridge/Makefile | 1 + drivers/gpu/drm/bridge/rk1000.c | 25 +++++++++++-------------- 3 files changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/bridge/Kconfig b/drivers/gpu/drm/bridge/Kconfig index 7a3e5a8f6439..d26b6d1d702d 100644 --- a/drivers/gpu/drm/bridge/Kconfig +++ b/drivers/gpu/drm/bridge/Kconfig @@ -81,6 +81,14 @@ config DRM_PARADE_PS8622 ---help--- Parade eDP-LVDS bridge chip driver. +config DRM_RK1000_TVE + tristate "Rockchip RK1000 TVE bridge" + depends on OF + select DRM_KMS_HELPER + select MFD_RK1000 + help + Rockchip TVE bridge chip driver. + config DRM_SIL_SII8620 tristate "Silicon Image SII8620 HDMI/MHL bridge" depends on OF diff --git a/drivers/gpu/drm/bridge/Makefile b/drivers/gpu/drm/bridge/Makefile index 35f88d48ec20..1dfa0320c744 100644 --- a/drivers/gpu/drm/bridge/Makefile +++ b/drivers/gpu/drm/bridge/Makefile @@ -6,6 +6,7 @@ obj-$(CONFIG_DRM_LVDS_ENCODER) += lvds-encoder.o obj-$(CONFIG_DRM_MEGACHIPS_STDPXXXX_GE_B850V3_FW) += megachips-stdpxxxx-ge-b850v3-fw.o obj-$(CONFIG_DRM_NXP_PTN3460) += nxp-ptn3460.o obj-$(CONFIG_DRM_PARADE_PS8622) += parade-ps8622.o +obj-$(CONFIG_DRM_RK1000_TVE) += rk1000.o obj-$(CONFIG_DRM_SIL_SII8620) += sil-sii8620.o obj-$(CONFIG_DRM_SII902X) += sii902x.o obj-$(CONFIG_DRM_SII9234) += sii9234.o diff --git a/drivers/gpu/drm/bridge/rk1000.c b/drivers/gpu/drm/bridge/rk1000.c index 809e1fa8cdfb..254a1e0b09ca 100644 --- a/drivers/gpu/drm/bridge/rk1000.c +++ b/drivers/gpu/drm/bridge/rk1000.c @@ -103,7 +103,7 @@ static struct rk1000_tve *connector_to_rk1000(struct drm_connector *connector) static int rk1000_tv_write_block(struct rk1000_tve *rk1000, u8 reg, const u8 *buf, u8 len) { - int i, ret; + int i, ret = 0; for (i = 0; i < len; i++) { ret = regmap_write(rk1000->tvemap, reg + i, buf[i]); @@ -117,7 +117,7 @@ static int rk1000_tv_write_block(struct rk1000_tve *rk1000, static int rk1000_control_write_block(struct rk1000_tve *rk1000, u8 reg, const u8 *buf, u8 len) { - int i, ret; + int i, ret = 0; for (i = 0; i < len; i++) { ret = regmap_write(rk1000->ctlmap, reg + i, buf[i]); @@ -245,7 +245,6 @@ const struct drm_connector_helper_funcs rk1000_connector_helper_funcs = { }; static const struct drm_connector_funcs rk1000_connector_funcs = { - .dpms = drm_atomic_helper_connector_dpms, .fill_modes = drm_helper_probe_single_connector_modes, .detect = rk1000_connector_detect, .destroy = drm_connector_cleanup, @@ -261,9 +260,9 @@ rk1000_bridge_mode_set(struct drm_bridge *bridge, { struct rk1000_tve *rk1000; + rk1000 = bridge_to_rk1000(bridge); dev_dbg(rk1000->dev, "encoder mode set:%s\n", adjusted_mode->name); - rk1000 = bridge_to_rk1000(bridge); if (adjusted_mode->vdisplay == 576) rk1000->mode = CVBS_PAL; else @@ -300,6 +299,11 @@ static int rk1000_bridge_attach(struct drm_bridge *bridge) } rk1000->encoder = bridge->encoder; + rk1000->connector.port = rk1000->dev->of_node; + + drm_connector_helper_add(&rk1000->connector, + &rk1000_connector_helper_funcs); + ret = drm_connector_init(bridge->dev, &rk1000->connector, &rk1000_connector_funcs, DRM_MODE_CONNECTOR_TV); @@ -307,13 +311,10 @@ static int rk1000_bridge_attach(struct drm_bridge *bridge) dev_err(rk1000->dev, "Failed to initialize connector\n"); return ret; } - drm_connector_helper_add(&rk1000->connector, - &rk1000_connector_helper_funcs); - ret = drm_mode_connector_attach_encoder(&rk1000->connector, - bridge->encoder); + ret = drm_connector_attach_encoder(&rk1000->connector, + bridge->encoder); if (ret) dev_err(rk1000->dev, "rk1000 attach failed ret:%d", ret); - rk1000->connector.port = rk1000->dev->of_node; return ret; } @@ -385,11 +386,7 @@ static int rk1000_probe(struct i2c_client *client, rk1000->bridge.funcs = &rk1000_bridge_funcs; rk1000->bridge.of_node = rk1000->dev->of_node; - ret = drm_bridge_add(&rk1000->bridge); - if (ret) { - dev_err(rk1000->dev, "failed to add rk1000 bridge\n"); - return ret; - } + drm_bridge_add(&rk1000->bridge); i2c_set_clientdata(client, rk1000); dev_dbg(rk1000->dev, "rk1000 probe ok\n");