@@ -161,7 +161,6 @@ struct dw_hdmi {
struct drm_display_mode previous_mode;
- struct i2c_adapter *ddc;
void __iomem *regs;
bool sink_is_hdmi;
bool sink_has_audio;
@@ -1133,7 +1132,7 @@ static bool dw_hdmi_support_scdc(struct dw_hdmi *hdmi)
return false;
/* Disable if no DDC bus */
- if (!hdmi->ddc)
+ if (!hdmi->connector.ddc)
return false;
/* Disable if SCDC is not supported, or if an HF-VSDB block is absent */
@@ -1171,10 +1170,11 @@ void dw_hdmi_set_high_tmds_clock_ratio(struct dw_hdmi *hdmi)
/* Control for TMDS Bit Period/TMDS Clock-Period Ratio */
if (dw_hdmi_support_scdc(hdmi)) {
+ struct i2c_adapter *ddc = hdmi->connector.ddc;
if (mtmdsclock > HDMI14_MAX_TMDSCLK)
- drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 1);
+ drm_scdc_set_high_tmds_clock_ratio(ddc, 1);
else
- drm_scdc_set_high_tmds_clock_ratio(hdmi->ddc, 0);
+ drm_scdc_set_high_tmds_clock_ratio(ddc, 0);
}
}
EXPORT_SYMBOL_GPL(dw_hdmi_set_high_tmds_clock_ratio);
@@ -1765,6 +1765,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
if (dw_hdmi_support_scdc(hdmi)) {
if (vmode->mtmdsclock > HDMI14_MAX_TMDSCLK ||
hdmi_info->scdc.scrambling.low_rates) {
+ struct i2c_adapter *ddc = hdmi->connector.ddc;
/*
* HDMI2.0 Specifies the following procedure:
* After the Source Device has determined that
@@ -1774,13 +1775,12 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
* Source Devices compliant shall set the
* Source Version = 1.
*/
- drm_scdc_readb(hdmi->ddc, SCDC_SINK_VERSION,
- &bytes);
- drm_scdc_writeb(hdmi->ddc, SCDC_SOURCE_VERSION,
+ drm_scdc_readb(ddc, SCDC_SINK_VERSION, &bytes);
+ drm_scdc_writeb(ddc, SCDC_SOURCE_VERSION,
min_t(u8, bytes, SCDC_MIN_SOURCE_VERSION));
/* Enabled Scrambling in the Sink */
- drm_scdc_set_scrambling(hdmi->ddc, 1);
+ drm_scdc_set_scrambling(hdmi->connector.ddc, 1);
/*
* To activate the scrambler feature, you must ensure
@@ -1796,7 +1796,7 @@ static void hdmi_av_composer(struct dw_hdmi *hdmi,
hdmi_writeb(hdmi, 0, HDMI_FC_SCRAMBLER_CTRL);
hdmi_writeb(hdmi, (u8)~HDMI_MC_SWRSTZ_TMDSSWRST_REQ,
HDMI_MC_SWRSTZ);
- drm_scdc_set_scrambling(hdmi->ddc, 0);
+ drm_scdc_set_scrambling(hdmi->connector.ddc, 0);
}
}
@@ -2142,10 +2142,10 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
struct edid *edid;
int ret = 0;
- if (!hdmi->ddc)
+ if (!hdmi->connector.ddc)
return 0;
- edid = drm_get_edid(connector, hdmi->ddc);
+ edid = drm_get_edid(connector, hdmi->connector.ddc);
if (edid) {
dev_dbg(hdmi->dev, "got edid: width[%d] x height[%d]\n",
edid->width_cm, edid->height_cm);
@@ -2200,8 +2200,10 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs);
- drm_connector_init(bridge->dev, connector, &dw_hdmi_connector_funcs,
- DRM_MODE_CONNECTOR_HDMIA);
+ drm_connector_init_with_ddc(bridge->dev, connector,
+ &dw_hdmi_connector_funcs,
+ DRM_MODE_CONNECTOR_HDMIA,
+ connector->ddc);
drm_connector_attach_encoder(connector, encoder);
@@ -2563,9 +2565,9 @@ __dw_hdmi_probe(struct platform_device *pdev,
ddc_node = of_parse_phandle(np, "ddc-i2c-bus", 0);
if (ddc_node) {
- hdmi->ddc = of_get_i2c_adapter_by_node(ddc_node);
+ hdmi->connector.ddc = of_get_i2c_adapter_by_node(ddc_node);
of_node_put(ddc_node);
- if (!hdmi->ddc) {
+ if (!hdmi->connector.ddc) {
dev_dbg(hdmi->dev, "failed to read ddc node\n");
return ERR_PTR(-EPROBE_DEFER);
}
@@ -2704,7 +2706,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
hdmi_init_clk_regenerator(hdmi);
/* If DDC bus is not specified, try to register HDMI I2C bus */
- if (!hdmi->ddc) {
+ if (!hdmi->connector.ddc) {
/* Look for (optional) stuff related to unwedging */
hdmi->pinctrl = devm_pinctrl_get(dev);
if (!IS_ERR(hdmi->pinctrl)) {
@@ -2723,9 +2725,9 @@ __dw_hdmi_probe(struct platform_device *pdev,
}
}
- hdmi->ddc = dw_hdmi_i2c_adapter(hdmi);
- if (IS_ERR(hdmi->ddc))
- hdmi->ddc = NULL;
+ hdmi->connector.ddc = dw_hdmi_i2c_adapter(hdmi);
+ if (IS_ERR(hdmi->connector.ddc))
+ hdmi->connector.ddc = NULL;
}
hdmi->bridge.driver_private = hdmi;
@@ -2791,7 +2793,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
err_iahb:
if (hdmi->i2c) {
i2c_del_adapter(&hdmi->i2c->adap);
- hdmi->ddc = NULL;
+ hdmi->connector.ddc = NULL;
}
if (hdmi->cec_notifier)
@@ -2803,7 +2805,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
err_isfr:
clk_disable_unprepare(hdmi->isfr_clk);
err_res:
- i2c_put_adapter(hdmi->ddc);
+ i2c_put_adapter(hdmi->connector.ddc);
return ERR_PTR(ret);
}
@@ -2829,7 +2831,7 @@ static void __dw_hdmi_remove(struct dw_hdmi *hdmi)
if (hdmi->i2c)
i2c_del_adapter(&hdmi->i2c->adap);
else
- i2c_put_adapter(hdmi->ddc);
+ i2c_put_adapter(hdmi->connector.ddc);
}
/* -----------------------------------------------------------------------------
Use the ddc pointer provided by the generic connector. Signed-off-by: Andrzej Pietrasiewicz <andrzej.p@collabora.com> --- drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 46 ++++++++++++----------- 1 file changed, 24 insertions(+), 22 deletions(-)