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 <algea.cao@rock-chips.com>
This commit is contained in:
Algea Cao 2020-06-22 17:55:25 +08:00 committed by Tao Huang
commit ef52649124
3 changed files with 20 additions and 14 deletions

View file

@ -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

View file

@ -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

View file

@ -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");