linux-media.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/5] cec: convert remaining drivers to the new notifier API
@ 2019-07-01  8:35 Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 1/5] drm: tda998x: use cec_notifier_conn_(un)register Dariusz Marcinkiewicz
                   ` (4 more replies)
  0 siblings, 5 replies; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

This series updates remaining drivers in DRM to use new CEC notifier API.

Those complement the "cec: improve notifier support, add
connector info" patch series and also replace 2 following patches from
there:
- [PATCHv8 09/13] dw-hdmi: use cec_notifier_conn_(un)register
- [PATCHv9 12/13] tda998x: use cec_notifier_conn_(un)register

None of those changes were not tested on a real hardware.

Dariusz Marcinkiewicz (5):
  drm: tda998x: use cec_notifier_conn_(un)register
  drm: sti: use cec_notifier_conn_(un)register
  drm: tegra: use cec_notifier_conn_(un)register
  drm: dw-hdmi: use cec_notifier_conn_(un)register
  drm: exynos: exynos_hdmi: use cec_notifier_conn_(un)register

 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 32 +++++++++++++---------
 drivers/gpu/drm/exynos/exynos_hdmi.c      | 33 ++++++++++++++---------
 drivers/gpu/drm/i2c/tda998x_drv.c         | 27 ++++++++++++-------
 drivers/gpu/drm/sti/sti_hdmi.c            | 20 +++++++++-----
 drivers/gpu/drm/tegra/output.c            | 18 ++++++++-----
 5 files changed, 81 insertions(+), 49 deletions(-)

-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/5] drm: tda998x: use cec_notifier_conn_(un)register
  2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
@ 2019-07-01  8:35 ` Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 2/5] drm: sti: " Dariusz Marcinkiewicz
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

Use the new cec_notifier_conn_(un)register() functions to
(un)register the notifier for the HDMI connector, and fill
in the cec_connector_info.

Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
---
 drivers/gpu/drm/i2c/tda998x_drv.c | 27 ++++++++++++++++++---------
 1 file changed, 18 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/i2c/tda998x_drv.c b/drivers/gpu/drm/i2c/tda998x_drv.c
index 7f34601bb5155..d8d51c6a2d390 100644
--- a/drivers/gpu/drm/i2c/tda998x_drv.c
+++ b/drivers/gpu/drm/i2c/tda998x_drv.c
@@ -794,9 +794,14 @@ static irqreturn_t tda998x_irq_thread(int irq, void *data)
 			if (lvl & CEC_RXSHPDLEV_HPD) {
 				tda998x_edid_delay_start(priv);
 			} else {
+				struct cec_notifier *notify;
+
 				schedule_work(&priv->detect_work);
-				cec_notifier_set_phys_addr(priv->cec_notify,
-						   CEC_PHYS_ADDR_INVALID);
+
+				notify = READ_ONCE(priv->cec_notify);
+				if (notify)
+					cec_notifier_set_phys_addr(notify,
+							CEC_PHYS_ADDR_INVALID);
 			}
 
 			handled = true;
@@ -1253,6 +1258,8 @@ static int tda998x_connector_init(struct tda998x_priv *priv,
 				  struct drm_device *drm)
 {
 	struct drm_connector *connector = &priv->connector;
+	struct cec_connector_info conn_info;
+	struct cec_notifier *notifier;
 	int ret;
 
 	connector->interlace_allowed = 1;
@@ -1269,6 +1276,14 @@ static int tda998x_connector_init(struct tda998x_priv *priv,
 	if (ret)
 		return ret;
 
+	cec_fill_conn_info_from_drm(&conn_info, connector);
+
+	notifier = cec_notifier_conn_register(priv->cec_glue.parent,
+					      NULL, &conn_info);
+	if (!notifier)
+		return -ENOMEM;
+	WRITE_ONCE(priv->cec_notify, notifier);
+
 	drm_connector_attach_encoder(&priv->connector,
 				     priv->bridge.encoder);
 
@@ -1651,7 +1666,7 @@ static void tda998x_destroy(struct device *dev)
 	i2c_unregister_device(priv->cec);
 
 	if (priv->cec_notify)
-		cec_notifier_put(priv->cec_notify);
+		cec_notifier_conn_unregister(priv->cec_notify);
 }
 
 static int tda998x_create(struct device *dev)
@@ -1776,12 +1791,6 @@ static int tda998x_create(struct device *dev)
 		cec_write(priv, REG_CEC_RXSHPDINTENA, CEC_RXSHPDLEV_HPD);
 	}
 
-	priv->cec_notify = cec_notifier_get(dev);
-	if (!priv->cec_notify) {
-		ret = -ENOMEM;
-		goto fail;
-	}
-
 	priv->cec_glue.parent = dev;
 	priv->cec_glue.data = priv;
 	priv->cec_glue.init = tda998x_cec_hook_init;
-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/5] drm: sti: use cec_notifier_conn_(un)register
  2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 1/5] drm: tda998x: use cec_notifier_conn_(un)register Dariusz Marcinkiewicz
@ 2019-07-01  8:35 ` Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 3/5] drm: tegra: " Dariusz Marcinkiewicz
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

Use the new cec_notifier_conn_(un)register() functions to
(un)register the notifier for the HDMI connector, and fill
in the cec_connector_info.

Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
---
 drivers/gpu/drm/sti/sti_hdmi.c | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/sti/sti_hdmi.c b/drivers/gpu/drm/sti/sti_hdmi.c
index 6000df6249807..5519b0c397c72 100644
--- a/drivers/gpu/drm/sti/sti_hdmi.c
+++ b/drivers/gpu/drm/sti/sti_hdmi.c
@@ -1250,6 +1250,7 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
 	struct drm_device *drm_dev = data;
 	struct drm_encoder *encoder;
 	struct sti_hdmi_connector *connector;
+	struct cec_connector_info conn_info;
 	struct drm_connector *drm_connector;
 	struct drm_bridge *bridge;
 	int err;
@@ -1310,6 +1311,14 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
 		goto err_sysfs;
 	}
 
+	cec_fill_conn_info_from_drm(&conn_info, drm_connector);
+	hdmi->notifier = cec_notifier_conn_register(&hdmi->dev, NULL,
+						    &conn_info);
+	if (!hdmi->notifier) {
+		hdmi->drm_connector = NULL;
+		return -ENOMEM;
+	}
+
 	/* Enable default interrupts */
 	hdmi_write(hdmi, HDMI_DEFAULT_INT, HDMI_INT_EN);
 
@@ -1323,6 +1332,10 @@ static int sti_hdmi_bind(struct device *dev, struct device *master, void *data)
 static void sti_hdmi_unbind(struct device *dev,
 		struct device *master, void *data)
 {
+	struct sti_hdmi *hdmi = dev_get_drvdata(dev);
+
+	cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
+	cec_notifier_conn_unregister(hdmi->notifier);
 }
 
 static const struct component_ops sti_hdmi_ops = {
@@ -1428,10 +1441,6 @@ static int sti_hdmi_probe(struct platform_device *pdev)
 		goto release_adapter;
 	}
 
-	hdmi->notifier = cec_notifier_get(&pdev->dev);
-	if (!hdmi->notifier)
-		goto release_adapter;
-
 	hdmi->reset = devm_reset_control_get(dev, "hdmi");
 	/* Take hdmi out of reset */
 	if (!IS_ERR(hdmi->reset))
@@ -1451,14 +1460,11 @@ static int sti_hdmi_remove(struct platform_device *pdev)
 {
 	struct sti_hdmi *hdmi = dev_get_drvdata(&pdev->dev);
 
-	cec_notifier_set_phys_addr(hdmi->notifier, CEC_PHYS_ADDR_INVALID);
-
 	i2c_put_adapter(hdmi->ddc_adapt);
 	if (hdmi->audio_pdev)
 		platform_device_unregister(hdmi->audio_pdev);
 	component_del(&pdev->dev, &sti_hdmi_ops);
 
-	cec_notifier_put(hdmi->notifier);
 	return 0;
 }
 
-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 3/5] drm: tegra: use cec_notifier_conn_(un)register
  2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 1/5] drm: tda998x: use cec_notifier_conn_(un)register Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 2/5] drm: sti: " Dariusz Marcinkiewicz
@ 2019-07-01  8:35 ` Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 4/5] drm: dw-hdmi: " Dariusz Marcinkiewicz
  2019-07-01  8:35 ` [PATCH 5/5] drm: exynos: exynos_hdmi: " Dariusz Marcinkiewicz
  4 siblings, 0 replies; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

Use the new cec_notifier_conn_(un)register() functions to
(un)register the notifier for the HDMI connector, and fill in
the cec_connector_info.

Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
---
 drivers/gpu/drm/tegra/output.c | 18 +++++++++++-------
 1 file changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index 9c2b9dad55c30..ea92e72280868 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -80,6 +80,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
 
 void tegra_output_connector_destroy(struct drm_connector *connector)
 {
+	struct tegra_output *output = connector_to_output(connector);
+
+	cec_notifier_conn_unregister(output->cec);
 	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
@@ -174,18 +177,11 @@ int tegra_output_probe(struct tegra_output *output)
 		disable_irq(output->hpd_irq);
 	}
 
-	output->cec = cec_notifier_get(output->dev);
-	if (!output->cec)
-		return -ENOMEM;
-
 	return 0;
 }
 
 void tegra_output_remove(struct tegra_output *output)
 {
-	if (output->cec)
-		cec_notifier_put(output->cec);
-
 	if (gpio_is_valid(output->hpd_gpio)) {
 		free_irq(output->hpd_irq, output);
 		gpio_free(output->hpd_gpio);
@@ -197,6 +193,7 @@ void tegra_output_remove(struct tegra_output *output)
 
 int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
 {
+	struct cec_connector_info conn_info;
 	int err;
 
 	if (output->panel) {
@@ -212,6 +209,13 @@ int tegra_output_init(struct drm_device *drm, struct tegra_output *output)
 	if (gpio_is_valid(output->hpd_gpio))
 		enable_irq(output->hpd_irq);
 
+	cec_fill_conn_info_from_drm(&conn_info, &output->connector);
+
+	output->cec = cec_notifier_conn_register(output->dev, NULL, &conn_info);
+	if (!output->cec)
+		return -ENOMEM;
+
+
 	return 0;
 }
 
-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 4/5] drm: dw-hdmi: use cec_notifier_conn_(un)register
  2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
                   ` (2 preceding siblings ...)
  2019-07-01  8:35 ` [PATCH 3/5] drm: tegra: " Dariusz Marcinkiewicz
@ 2019-07-01  8:35 ` Dariusz Marcinkiewicz
  2019-07-02 21:08   ` kbuild test robot
  2019-07-01  8:35 ` [PATCH 5/5] drm: exynos: exynos_hdmi: " Dariusz Marcinkiewicz
  4 siblings, 1 reply; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

Use the new cec_notifier_conn_(un)register() functions to
(un)register the notifier for the HDMI connector, and fill in
the cec_connector_info.

Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
---
 drivers/gpu/drm/bridge/synopsys/dw-hdmi.c | 32 ++++++++++++++---------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
index ab7968c8f6a29..b0308ee08f2a1 100644
--- a/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
+++ b/drivers/gpu/drm/bridge/synopsys/dw-hdmi.c
@@ -2118,6 +2118,8 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
 	struct dw_hdmi *hdmi = bridge->driver_private;
 	struct drm_encoder *encoder = bridge->encoder;
 	struct drm_connector *connector = &hdmi->connector;
+	struct cec_connector_info conn_info;
+	struct cec_notifier *notifier;
 
 	connector->interlace_allowed = 1;
 	connector->polled = DRM_CONNECTOR_POLL_HPD;
@@ -2129,6 +2131,13 @@ static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
 
 	drm_connector_attach_encoder(connector, encoder);
 
+	cec_fill_conn_info_from_drm(&conn_info, connector);
+
+	notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info);
+	if (!notifier)
+		return -ENOMEM;
+	WRITE_ONCE(hdmi->cec_notifier, notifier);
+
 	return 0;
 }
 
@@ -2295,9 +2304,15 @@ static irqreturn_t dw_hdmi_irq(int irq, void *dev_id)
 				       phy_stat & HDMI_PHY_HPD,
 				       phy_stat & HDMI_PHY_RX_SENSE);
 
-		if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0)
-			cec_notifier_set_phys_addr(hdmi->cec_notifier,
-						   CEC_PHYS_ADDR_INVALID);
+		if ((phy_stat & (HDMI_PHY_RX_SENSE | HDMI_PHY_HPD)) == 0) {
+			struct cec_notifier *notifer;
+
+			notifer = READ_ONCE(hdmi->cec_notifier);
+			if (notifer)
+				cec_notifier_set_phys_addr(
+						notifer,
+						CEC_PHYS_ADDR_INVALID);
+		}
 	}
 
 	if (intr_stat & HDMI_IH_PHY_STAT0_HPD) {
@@ -2600,12 +2615,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
 	if (ret)
 		goto err_iahb;
 
-	hdmi->cec_notifier = cec_notifier_get(dev);
-	if (!hdmi->cec_notifier) {
-		ret = -ENOMEM;
-		goto err_iahb;
-	}
-
 	/*
 	 * To prevent overflows in HDMI_IH_FC_STAT2, set the clk regenerator
 	 * N and cts values before enabling phy
@@ -2693,9 +2702,6 @@ __dw_hdmi_probe(struct platform_device *pdev,
 		hdmi->ddc = NULL;
 	}
 
-	if (hdmi->cec_notifier)
-		cec_notifier_put(hdmi->cec_notifier);
-
 	clk_disable_unprepare(hdmi->iahb_clk);
 	if (hdmi->cec_clk)
 		clk_disable_unprepare(hdmi->cec_clk);
@@ -2718,7 +2724,7 @@ static void __dw_hdmi_remove(struct dw_hdmi *hdmi)
 	hdmi_writeb(hdmi, ~0, HDMI_IH_MUTE_PHY_STAT0);
 
 	if (hdmi->cec_notifier)
-		cec_notifier_put(hdmi->cec_notifier);
+		cec_notifier_conn_unregister(hdmi->cec_notifier);
 
 	clk_disable_unprepare(hdmi->iahb_clk);
 	clk_disable_unprepare(hdmi->isfr_clk);
-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 5/5] drm: exynos: exynos_hdmi: use cec_notifier_conn_(un)register
  2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
                   ` (3 preceding siblings ...)
  2019-07-01  8:35 ` [PATCH 4/5] drm: dw-hdmi: " Dariusz Marcinkiewicz
@ 2019-07-01  8:35 ` Dariusz Marcinkiewicz
  2019-07-04 19:20   ` kbuild test robot
  4 siblings, 1 reply; 8+ messages in thread
From: Dariusz Marcinkiewicz @ 2019-07-01  8:35 UTC (permalink / raw)
  To: linux-media, hverkuil-cisco, hverkuil; +Cc: Dariusz Marcinkiewicz

Use the new cec_notifier_conn_(un)register() functions to
(un)register the notifier for the HDMI connector, and fill in
the cec_connector_info.

Signed-off-by: Dariusz Marcinkiewicz <darekm@google.com>
---
 drivers/gpu/drm/exynos/exynos_hdmi.c | 33 +++++++++++++++++-----------
 1 file changed, 20 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_hdmi.c b/drivers/gpu/drm/exynos/exynos_hdmi.c
index 19c252f659dd0..dec4149435de1 100644
--- a/drivers/gpu/drm/exynos/exynos_hdmi.c
+++ b/drivers/gpu/drm/exynos/exynos_hdmi.c
@@ -858,6 +858,11 @@ static enum drm_connector_status hdmi_detect(struct drm_connector *connector,
 
 static void hdmi_connector_destroy(struct drm_connector *connector)
 {
+	struct hdmi_context *hdata = connector_to_hdmi(connector);
+
+	cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
+	cec_notifier_conn_unregister(hdata->notifier);
+
 	drm_connector_unregister(connector);
 	drm_connector_cleanup(connector);
 }
@@ -941,6 +946,7 @@ static int hdmi_create_connector(struct drm_encoder *encoder)
 {
 	struct hdmi_context *hdata = encoder_to_hdmi(encoder);
 	struct drm_connector *connector = &hdata->connector;
+	struct cec_connector_info conn_info;
 	int ret;
 
 	connector->interlace_allowed = true;
@@ -963,6 +969,15 @@ static int hdmi_create_connector(struct drm_encoder *encoder)
 			DRM_DEV_ERROR(hdata->dev, "Failed to attach bridge\n");
 	}
 
+	cec_fill_conn_info_from_drm(&conn_info, connector);
+
+	hdata->notifier = cec_notifier_conn_register(hdata->dev, NULL,
+						     &conn_info);
+	if (hdata->notifier == NULL) {
+		ret = -ENOMEM;
+		DRM_DEV_ERROR(hdata->dev, "Failed to allocate CEC notifier\n");
+	}
+
 	return ret;
 }
 
@@ -1534,8 +1549,9 @@ static void hdmi_disable(struct drm_encoder *encoder)
 		 */
 		mutex_unlock(&hdata->mutex);
 		cancel_delayed_work(&hdata->hotplug_work);
-		cec_notifier_set_phys_addr(hdata->notifier,
-					   CEC_PHYS_ADDR_INVALID);
+		if (hdata->notifier)
+			cec_notifier_set_phys_addr(hdata->notifier,
+						   CEC_PHYS_ADDR_INVALID);
 		return;
 	}
 
@@ -2012,12 +2028,6 @@ static int hdmi_probe(struct platform_device *pdev)
 		}
 	}
 
-	hdata->notifier = cec_notifier_get(&pdev->dev);
-	if (hdata->notifier == NULL) {
-		ret = -ENOMEM;
-		goto err_hdmiphy;
-	}
-
 	pm_runtime_enable(dev);
 
 	audio_infoframe = &hdata->audio.infoframe;
@@ -2029,7 +2039,7 @@ static int hdmi_probe(struct platform_device *pdev)
 
 	ret = hdmi_register_audio_device(hdata);
 	if (ret)
-		goto err_notifier_put;
+		goto err_runtime_disable;
 
 	ret = component_add(&pdev->dev, &hdmi_component_ops);
 	if (ret)
@@ -2040,8 +2050,7 @@ static int hdmi_probe(struct platform_device *pdev)
 err_unregister_audio:
 	platform_device_unregister(hdata->audio.pdev);
 
-err_notifier_put:
-	cec_notifier_put(hdata->notifier);
+err_runtime_disable:
 	pm_runtime_disable(dev);
 
 err_hdmiphy:
@@ -2060,12 +2069,10 @@ static int hdmi_remove(struct platform_device *pdev)
 	struct hdmi_context *hdata = platform_get_drvdata(pdev);
 
 	cancel_delayed_work_sync(&hdata->hotplug_work);
-	cec_notifier_set_phys_addr(hdata->notifier, CEC_PHYS_ADDR_INVALID);
 
 	component_del(&pdev->dev, &hdmi_component_ops);
 	platform_device_unregister(hdata->audio.pdev);
 
-	cec_notifier_put(hdata->notifier);
 	pm_runtime_disable(&pdev->dev);
 
 	if (!IS_ERR(hdata->reg_hdmi_en))
-- 
2.22.0.410.gd8fdbe21b5-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 4/5] drm: dw-hdmi: use cec_notifier_conn_(un)register
  2019-07-01  8:35 ` [PATCH 4/5] drm: dw-hdmi: " Dariusz Marcinkiewicz
@ 2019-07-02 21:08   ` kbuild test robot
  0 siblings, 0 replies; 8+ messages in thread
From: kbuild test robot @ 2019-07-02 21:08 UTC (permalink / raw)
  To: Dariusz Marcinkiewicz
  Cc: kbuild-all, linux-media, hverkuil-cisco, hverkuil, Dariusz Marcinkiewicz

[-- Attachment #1: Type: text/plain, Size: 3640 bytes --]

Hi Dariusz,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.2-rc7]
[cannot apply to next-20190702]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Dariusz-Marcinkiewicz/cec-convert-remaining-drivers-to-the-new-notifier-API/20190702-213026
config: ia64-allmodconfig (attached as .config)
compiler: ia64-linux-gcc (GCC) 7.4.0
reproduce:
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # save the attached .config to linux build tree
        GCC_VERSION=7.4.0 make.cross ARCH=ia64 

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/gpu//drm/bridge/synopsys/dw-hdmi.c: In function 'dw_hdmi_bridge_attach':
>> drivers/gpu//drm/bridge/synopsys/dw-hdmi.c:2116:28: error: storage size of 'conn_info' isn't known
     struct cec_connector_info conn_info;
                               ^~~~~~~~~
>> drivers/gpu//drm/bridge/synopsys/dw-hdmi.c:2129:2: error: implicit declaration of function 'cec_fill_conn_info_from_drm' [-Werror=implicit-function-declaration]
     cec_fill_conn_info_from_drm(&conn_info, connector);
     ^~~~~~~~~~~~~~~~~~~~~~~~~~~
>> drivers/gpu//drm/bridge/synopsys/dw-hdmi.c:2131:13: error: implicit declaration of function 'cec_notifier_conn_register'; did you mean 'cec_notifier_unregister'? [-Werror=implicit-function-declaration]
     notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info);
                ^~~~~~~~~~~~~~~~~~~~~~~~~~
                cec_notifier_unregister
   drivers/gpu//drm/bridge/synopsys/dw-hdmi.c:2116:28: warning: unused variable 'conn_info' [-Wunused-variable]
     struct cec_connector_info conn_info;
                               ^~~~~~~~~
   drivers/gpu//drm/bridge/synopsys/dw-hdmi.c: In function '__dw_hdmi_remove':
>> drivers/gpu//drm/bridge/synopsys/dw-hdmi.c:2722:3: error: implicit declaration of function 'cec_notifier_conn_unregister'; did you mean 'cec_notifier_unregister'? [-Werror=implicit-function-declaration]
      cec_notifier_conn_unregister(hdmi->cec_notifier);
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
      cec_notifier_unregister
   cc1: some warnings being treated as errors

vim +2116 drivers/gpu//drm/bridge/synopsys/dw-hdmi.c

  2110	
  2111	static int dw_hdmi_bridge_attach(struct drm_bridge *bridge)
  2112	{
  2113		struct dw_hdmi *hdmi = bridge->driver_private;
  2114		struct drm_encoder *encoder = bridge->encoder;
  2115		struct drm_connector *connector = &hdmi->connector;
> 2116		struct cec_connector_info conn_info;
  2117		struct cec_notifier *notifier;
  2118	
  2119		connector->interlace_allowed = 1;
  2120		connector->polled = DRM_CONNECTOR_POLL_HPD;
  2121	
  2122		drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs);
  2123	
  2124		drm_connector_init(bridge->dev, connector, &dw_hdmi_connector_funcs,
  2125				   DRM_MODE_CONNECTOR_HDMIA);
  2126	
  2127		drm_connector_attach_encoder(connector, encoder);
  2128	
> 2129		cec_fill_conn_info_from_drm(&conn_info, connector);
  2130	
> 2131		notifier = cec_notifier_conn_register(hdmi->dev, NULL, &conn_info);
  2132		if (!notifier)
  2133			return -ENOMEM;
  2134		WRITE_ONCE(hdmi->cec_notifier, notifier);
  2135	
  2136		return 0;
  2137	}
  2138	

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 54101 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 5/5] drm: exynos: exynos_hdmi: use cec_notifier_conn_(un)register
  2019-07-01  8:35 ` [PATCH 5/5] drm: exynos: exynos_hdmi: " Dariusz Marcinkiewicz
@ 2019-07-04 19:20   ` kbuild test robot
  0 siblings, 0 replies; 8+ messages in thread
From: kbuild test robot @ 2019-07-04 19:20 UTC (permalink / raw)
  To: Dariusz Marcinkiewicz
  Cc: kbuild-all, linux-media, hverkuil-cisco, hverkuil, Dariusz Marcinkiewicz

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset=unknown-8bit, Size: 63191 bytes --]

Hi Dariusz,

I love your patch! Yet something to improve:

[auto build test ERROR on linus/master]
[cannot apply to v5.2-rc7 next-20190704]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url:    https://github.com/0day-ci/linux/commits/Dariusz-Marcinkiewicz/cec-convert-remaining-drivers-to-the-new-notifier-API/20190702-213026
reproduce:
        # apt-get install sparse
        # sparse version: 
        make ARCH=x86_64 allmodconfig
        make C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__'

If you fix the issue, kindly add following tag
Reported-by: kbuild test robot <lkp@intel.com>

All errors (new ones prefixed by >>):

   drivers/gpu/drm/i2c/tda998x_drv.c:1045:5: sparse: warning: symbol 'tda998x_audio_digital_mute' was not declared. Should it be static?
>> drivers/gpu/drm/i2c/tda998x_drv.c:1268:9: sparse: error: undefined identifier 'cec_fill_conn_info_from_drm'
>> drivers/gpu/drm/i2c/tda998x_drv.c:1270:20: sparse: error: undefined identifier 'cec_notifier_conn_register'
   drivers/gpu/drm/i2c/tda998x_drv.c:1596:50: sparse: warning: incorrect type in argument 1 (different base types)
   drivers/gpu/drm/i2c/tda998x_drv.c:1596:50: sparse:    expected restricted __be32 const [usertype] *p
   drivers/gpu/drm/i2c/tda998x_drv.c:1596:50: sparse:    got unsigned int const [usertype] *
   drivers/gpu/drm/i2c/tda998x_drv.c:1597:52: sparse: warning: incorrect type in argument 1 (different base types)
   drivers/gpu/drm/i2c/tda998x_drv.c:1597:52: sparse:    expected restricted __be32 const [usertype] *p
   drivers/gpu/drm/i2c/tda998x_drv.c:1597:52: sparse:    got unsigned int const [usertype] *
>> drivers/gpu/drm/i2c/tda998x_drv.c:1658:17: sparse: error: undefined identifier 'cec_notifier_conn_unregister'
--
>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2129:9: sparse: error: undefined identifier 'cec_fill_conn_info_from_drm'
>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2131:20: sparse: error: undefined identifier 'cec_notifier_conn_register'
>> drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2722:17: sparse: error: undefined identifier 'cec_notifier_conn_unregister'
   drivers/gpu/drm/bridge/synopsys/dw-hdmi.c:2476:30: sparse: warning: cast truncates bits from constant value (ffffff0d becomes d)

vim +/cec_fill_conn_info_from_drm +1268 drivers/gpu/drm/i2c/tda998x_drv.c

25576733ec6e05 Russell King          2016-10-23  1245  
a2f75662b7c3db Russell King          2016-10-23  1246  static int tda998x_connector_init(struct tda998x_priv *priv,
a2f75662b7c3db Russell King          2016-10-23  1247  				  struct drm_device *drm)
a2f75662b7c3db Russell King          2016-10-23  1248  {
a2f75662b7c3db Russell King          2016-10-23  1249  	struct drm_connector *connector = &priv->connector;
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1250  	struct cec_connector_info conn_info;
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1251  	struct cec_notifier *notifier;
a2f75662b7c3db Russell King          2016-10-23  1252  	int ret;
a2f75662b7c3db Russell King          2016-10-23  1253  
a2f75662b7c3db Russell King          2016-10-23  1254  	connector->interlace_allowed = 1;
a2f75662b7c3db Russell King          2016-10-23  1255  
a2f75662b7c3db Russell King          2016-10-23  1256  	if (priv->hdmi->irq)
a2f75662b7c3db Russell King          2016-10-23  1257  		connector->polled = DRM_CONNECTOR_POLL_HPD;
a2f75662b7c3db Russell King          2016-10-23  1258  	else
a2f75662b7c3db Russell King          2016-10-23  1259  		connector->polled = DRM_CONNECTOR_POLL_CONNECT |
a2f75662b7c3db Russell King          2016-10-23  1260  			DRM_CONNECTOR_POLL_DISCONNECT;
a2f75662b7c3db Russell King          2016-10-23  1261  
a2f75662b7c3db Russell King          2016-10-23  1262  	drm_connector_helper_add(connector, &tda998x_connector_helper_funcs);
a2f75662b7c3db Russell King          2016-10-23  1263  	ret = drm_connector_init(drm, connector, &tda998x_connector_funcs,
a2f75662b7c3db Russell King          2016-10-23  1264  				 DRM_MODE_CONNECTOR_HDMIA);
a2f75662b7c3db Russell King          2016-10-23  1265  	if (ret)
a2f75662b7c3db Russell King          2016-10-23  1266  		return ret;
a2f75662b7c3db Russell King          2016-10-23  1267  
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01 @1268  	cec_fill_conn_info_from_drm(&conn_info, connector);
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1269  
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01 @1270  	notifier = cec_notifier_conn_register(priv->cec_glue.parent,
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1271  					      NULL, &conn_info);
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1272  	if (!notifier)
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1273  		return -ENOMEM;
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1274  	WRITE_ONCE(priv->cec_notify, notifier);
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1275  
a7ccc5a43b829a Dave Airlie           2018-08-08  1276  	drm_connector_attach_encoder(&priv->connector,
30bd8b862f5466 Russell King          2018-08-02  1277  				     priv->bridge.encoder);
a2f75662b7c3db Russell King          2016-10-23  1278  
a2f75662b7c3db Russell King          2016-10-23  1279  	return 0;
a2f75662b7c3db Russell King          2016-10-23  1280  }
a2f75662b7c3db Russell King          2016-10-23  1281  
30bd8b862f5466 Russell King          2018-08-02  1282  /* DRM bridge functions */
e7792ce2da5ded Rob Clark             2013-01-08  1283  
30bd8b862f5466 Russell King          2018-08-02  1284  static int tda998x_bridge_attach(struct drm_bridge *bridge)
e7792ce2da5ded Rob Clark             2013-01-08  1285  {
30bd8b862f5466 Russell King          2018-08-02  1286  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
9525c4dd923f8f Russell King          2015-08-14  1287  
30bd8b862f5466 Russell King          2018-08-02  1288  	return tda998x_connector_init(priv, bridge->dev);
30bd8b862f5466 Russell King          2018-08-02  1289  }
e7792ce2da5ded Rob Clark             2013-01-08  1290  
30bd8b862f5466 Russell King          2018-08-02  1291  static void tda998x_bridge_detach(struct drm_bridge *bridge)
30bd8b862f5466 Russell King          2018-08-02  1292  {
30bd8b862f5466 Russell King          2018-08-02  1293  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
e7792ce2da5ded Rob Clark             2013-01-08  1294  
30bd8b862f5466 Russell King          2018-08-02  1295  	drm_connector_cleanup(&priv->connector);
30bd8b862f5466 Russell King          2018-08-02  1296  }
e7792ce2da5ded Rob Clark             2013-01-08  1297  
b073a70ecd37bc Russell King          2018-08-02  1298  static enum drm_mode_status tda998x_bridge_mode_valid(struct drm_bridge *bridge,
b073a70ecd37bc Russell King          2018-08-02  1299  				     const struct drm_display_mode *mode)
b073a70ecd37bc Russell King          2018-08-02  1300  {
b073a70ecd37bc Russell King          2018-08-02  1301  	/* TDA19988 dotclock can go up to 165MHz */
b073a70ecd37bc Russell King          2018-08-02  1302  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
b073a70ecd37bc Russell King          2018-08-02  1303  
b073a70ecd37bc Russell King          2018-08-02  1304  	if (mode->clock > ((priv->rev == TDA19988) ? 165000 : 150000))
b073a70ecd37bc Russell King          2018-08-02  1305  		return MODE_CLOCK_HIGH;
b073a70ecd37bc Russell King          2018-08-02  1306  	if (mode->htotal >= BIT(13))
b073a70ecd37bc Russell King          2018-08-02  1307  		return MODE_BAD_HVALUE;
b073a70ecd37bc Russell King          2018-08-02  1308  	if (mode->vtotal >= BIT(11))
b073a70ecd37bc Russell King          2018-08-02  1309  		return MODE_BAD_VVALUE;
b073a70ecd37bc Russell King          2018-08-02  1310  	return MODE_OK;
b073a70ecd37bc Russell King          2018-08-02  1311  }
b073a70ecd37bc Russell King          2018-08-02  1312  
30bd8b862f5466 Russell King          2018-08-02  1313  static void tda998x_bridge_enable(struct drm_bridge *bridge)
e7792ce2da5ded Rob Clark             2013-01-08  1314  {
30bd8b862f5466 Russell King          2018-08-02  1315  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
30bd8b862f5466 Russell King          2018-08-02  1316  
2c6e758332a4fd Peter Rosin           2018-08-02  1317  	if (!priv->is_on) {
c4c11dd160a8cc Russell King          2013-08-14  1318  		/* enable video ports, audio will be enabled later */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1319  		reg_write(priv, REG_ENA_VP_0, 0xff);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1320  		reg_write(priv, REG_ENA_VP_1, 0xff);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1321  		reg_write(priv, REG_ENA_VP_2, 0xff);
e7792ce2da5ded Rob Clark             2013-01-08  1322  		/* set muxing after enabling ports: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1323  		reg_write(priv, REG_VIP_CNTRL_0, priv->vip_cntrl_0);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1324  		reg_write(priv, REG_VIP_CNTRL_1, priv->vip_cntrl_1);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1325  		reg_write(priv, REG_VIP_CNTRL_2, priv->vip_cntrl_2);
3cb43378d83e37 Russell King          2016-10-23  1326  
3cb43378d83e37 Russell King          2016-10-23  1327  		priv->is_on = true;
2c6e758332a4fd Peter Rosin           2018-08-02  1328  	}
2c6e758332a4fd Peter Rosin           2018-08-02  1329  }
2c6e758332a4fd Peter Rosin           2018-08-02  1330  
30bd8b862f5466 Russell King          2018-08-02  1331  static void tda998x_bridge_disable(struct drm_bridge *bridge)
2c6e758332a4fd Peter Rosin           2018-08-02  1332  {
30bd8b862f5466 Russell King          2018-08-02  1333  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
30bd8b862f5466 Russell King          2018-08-02  1334  
2c6e758332a4fd Peter Rosin           2018-08-02  1335  	if (priv->is_on) {
db6aaf4d55f95d Russell King          2013-09-24  1336  		/* disable video ports */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1337  		reg_write(priv, REG_ENA_VP_0, 0x00);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1338  		reg_write(priv, REG_ENA_VP_1, 0x00);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1339  		reg_write(priv, REG_ENA_VP_2, 0x00);
e7792ce2da5ded Rob Clark             2013-01-08  1340  
3cb43378d83e37 Russell King          2016-10-23  1341  		priv->is_on = false;
3cb43378d83e37 Russell King          2016-10-23  1342  	}
e7792ce2da5ded Rob Clark             2013-01-08  1343  }
e7792ce2da5ded Rob Clark             2013-01-08  1344  
30bd8b862f5466 Russell King          2018-08-02  1345  static void tda998x_bridge_mode_set(struct drm_bridge *bridge,
63f8f3badf799c Laurent Pinchart      2018-04-06  1346  				    const struct drm_display_mode *mode,
63f8f3badf799c Laurent Pinchart      2018-04-06  1347  				    const struct drm_display_mode *adjusted_mode)
e7792ce2da5ded Rob Clark             2013-01-08  1348  {
30bd8b862f5466 Russell King          2018-08-02  1349  	struct tda998x_priv *priv = bridge_to_tda998x_priv(bridge);
926a299c42e38b Russell King          2018-08-02  1350  	unsigned long tmds_clock;
e66e03abf80f70 Russell King          2015-06-06  1351  	u16 ref_pix, ref_line, n_pix, n_line;
e66e03abf80f70 Russell King          2015-06-06  1352  	u16 hs_pix_s, hs_pix_e;
e66e03abf80f70 Russell King          2015-06-06  1353  	u16 vs1_pix_s, vs1_pix_e, vs1_line_s, vs1_line_e;
e66e03abf80f70 Russell King          2015-06-06  1354  	u16 vs2_pix_s, vs2_pix_e, vs2_line_s, vs2_line_e;
e66e03abf80f70 Russell King          2015-06-06  1355  	u16 vwin1_line_s, vwin1_line_e;
e66e03abf80f70 Russell King          2015-06-06  1356  	u16 vwin2_line_s, vwin2_line_e;
e66e03abf80f70 Russell King          2015-06-06  1357  	u16 de_pix_s, de_pix_e;
e66e03abf80f70 Russell King          2015-06-06  1358  	u8 reg, div, rep;
e7792ce2da5ded Rob Clark             2013-01-08  1359  
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1360  	/*
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1361  	 * Internally TDA998x is using ITU-R BT.656 style sync but
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1362  	 * we get VESA style sync. TDA998x is using a reference pixel
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1363  	 * relative to ITU to sync to the input frame and for output
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1364  	 * sync generation. Currently, we are using reference detection
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1365  	 * from HS/VS, i.e. REFPIX/REFLINE denote frame start sync point
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1366  	 * which is position of rising VS with coincident rising HS.
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1367  	 *
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1368  	 * Now there is some issues to take care of:
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1369  	 * - HDMI data islands require sync-before-active
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1370  	 * - TDA998x register values must be > 0 to be enabled
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1371  	 * - REFLINE needs an additional offset of +1
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1372  	 * - REFPIX needs an addtional offset of +1 for UYUV and +3 for RGB
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1373  	 *
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1374  	 * So we add +1 to all horizontal and vertical register values,
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1375  	 * plus an additional +3 for REFPIX as we are using RGB input only.
e7792ce2da5ded Rob Clark             2013-01-08  1376  	 */
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1377  	n_pix        = mode->htotal;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1378  	n_line       = mode->vtotal;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1379  
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1380  	hs_pix_e     = mode->hsync_end - mode->hdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1381  	hs_pix_s     = mode->hsync_start - mode->hdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1382  	de_pix_e     = mode->htotal;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1383  	de_pix_s     = mode->htotal - mode->hdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1384  	ref_pix      = 3 + hs_pix_s;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1385  
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1386  	/*
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1387  	 * Attached LCD controllers may generate broken sync. Allow
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1388  	 * those to adjust the position of the rising VS edge by adding
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1389  	 * HSKEW to ref_pix.
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1390  	 */
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1391  	if (adjusted_mode->flags & DRM_MODE_FLAG_HSKEW)
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1392  		ref_pix += adjusted_mode->hskew;
179f1aa407b466 Sebastian Hesselbarth 2013-08-14  1393  
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1394  	if ((mode->flags & DRM_MODE_FLAG_INTERLACE) == 0) {
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1395  		ref_line     = 1 + mode->vsync_start - mode->vdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1396  		vwin1_line_s = mode->vtotal - mode->vdisplay - 1;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1397  		vwin1_line_e = vwin1_line_s + mode->vdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1398  		vs1_pix_s    = vs1_pix_e = hs_pix_s;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1399  		vs1_line_s   = mode->vsync_start - mode->vdisplay;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1400  		vs1_line_e   = vs1_line_s +
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1401  			       mode->vsync_end - mode->vsync_start;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1402  		vwin2_line_s = vwin2_line_e = 0;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1403  		vs2_pix_s    = vs2_pix_e  = 0;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1404  		vs2_line_s   = vs2_line_e = 0;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1405  	} else {
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1406  		ref_line     = 1 + (mode->vsync_start - mode->vdisplay)/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1407  		vwin1_line_s = (mode->vtotal - mode->vdisplay)/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1408  		vwin1_line_e = vwin1_line_s + mode->vdisplay/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1409  		vs1_pix_s    = vs1_pix_e = hs_pix_s;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1410  		vs1_line_s   = (mode->vsync_start - mode->vdisplay)/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1411  		vs1_line_e   = vs1_line_s +
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1412  			       (mode->vsync_end - mode->vsync_start)/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1413  		vwin2_line_s = vwin1_line_s + mode->vtotal/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1414  		vwin2_line_e = vwin2_line_s + mode->vdisplay/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1415  		vs2_pix_s    = vs2_pix_e = hs_pix_s + mode->htotal/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1416  		vs2_line_s   = vs1_line_s + mode->vtotal/2 ;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1417  		vs2_line_e   = vs2_line_s +
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1418  			       (mode->vsync_end - mode->vsync_start)/2;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1419  	}
e7792ce2da5ded Rob Clark             2013-01-08  1420  
926a299c42e38b Russell King          2018-08-02  1421  	tmds_clock = mode->clock;
926a299c42e38b Russell King          2018-08-02  1422  
926a299c42e38b Russell King          2018-08-02  1423  	/*
926a299c42e38b Russell King          2018-08-02  1424  	 * The divisor is power-of-2. The TDA9983B datasheet gives
926a299c42e38b Russell King          2018-08-02  1425  	 * this as ranges of Msample/s, which is 10x the TMDS clock:
926a299c42e38b Russell King          2018-08-02  1426  	 *   0 - 800 to 1500 Msample/s
926a299c42e38b Russell King          2018-08-02  1427  	 *   1 - 400 to 800 Msample/s
926a299c42e38b Russell King          2018-08-02  1428  	 *   2 - 200 to 400 Msample/s
926a299c42e38b Russell King          2018-08-02  1429  	 *   3 - as 2 above
926a299c42e38b Russell King          2018-08-02  1430  	 */
926a299c42e38b Russell King          2018-08-02  1431  	for (div = 0; div < 3; div++)
926a299c42e38b Russell King          2018-08-02  1432  		if (80000 >> div <= tmds_clock)
926a299c42e38b Russell King          2018-08-02  1433  			break;
e7792ce2da5ded Rob Clark             2013-01-08  1434  
2cae8e028ecb44 Russell King          2016-11-02  1435  	mutex_lock(&priv->audio_mutex);
2cae8e028ecb44 Russell King          2016-11-02  1436  
e7792ce2da5ded Rob Clark             2013-01-08  1437  	/* mute the audio FIFO: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1438  	reg_set(priv, REG_AIP_CNTRL_0, AIP_CNTRL_0_RST_FIFO);
e7792ce2da5ded Rob Clark             2013-01-08  1439  
e7792ce2da5ded Rob Clark             2013-01-08  1440  	/* set HDMI HDCP mode off: */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1441  	reg_write(priv, REG_TBG_CNTRL_1, TBG_CNTRL_1_DWIN_DIS);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1442  	reg_clear(priv, REG_TX33, TX33_HDMI);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1443  	reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(0));
e7792ce2da5ded Rob Clark             2013-01-08  1444  
e7792ce2da5ded Rob Clark             2013-01-08  1445  	/* no pre-filter or interpolator: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1446  	reg_write(priv, REG_HVF_CNTRL_0, HVF_CNTRL_0_PREFIL(0) |
e7792ce2da5ded Rob Clark             2013-01-08  1447  			HVF_CNTRL_0_INTPOL(0));
9476ed2e3883b1 Russell King          2016-11-03  1448  	reg_set(priv, REG_FEAT_POWERDOWN, FEAT_POWERDOWN_PREFILT);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1449  	reg_write(priv, REG_VIP_CNTRL_5, VIP_CNTRL_5_SP_CNT(0));
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1450  	reg_write(priv, REG_VIP_CNTRL_4, VIP_CNTRL_4_BLANKIT(0) |
e7792ce2da5ded Rob Clark             2013-01-08  1451  			VIP_CNTRL_4_BLC(0));
e7792ce2da5ded Rob Clark             2013-01-08  1452  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1453  	reg_clear(priv, REG_PLL_SERIAL_1, PLL_SERIAL_1_SRL_MAN_IZ);
a8b517e5312124 Jean-Francois Moine   2014-01-25  1454  	reg_clear(priv, REG_PLL_SERIAL_3, PLL_SERIAL_3_SRL_CCIR |
a8b517e5312124 Jean-Francois Moine   2014-01-25  1455  					  PLL_SERIAL_3_SRL_DE);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1456  	reg_write(priv, REG_SERIALIZER, 0);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1457  	reg_write(priv, REG_HVF_CNTRL_1, HVF_CNTRL_1_VQR(0));
e7792ce2da5ded Rob Clark             2013-01-08  1458  
e7792ce2da5ded Rob Clark             2013-01-08  1459  	/* TODO enable pixel repeat for pixel rates less than 25Msamp/s */
e7792ce2da5ded Rob Clark             2013-01-08  1460  	rep = 0;
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1461  	reg_write(priv, REG_RPT_CNTRL, 0);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1462  	reg_write(priv, REG_SEL_CLK, SEL_CLK_SEL_VRF_CLK(0) |
e7792ce2da5ded Rob Clark             2013-01-08  1463  			SEL_CLK_SEL_CLK1 | SEL_CLK_ENA_SC_CLK);
e7792ce2da5ded Rob Clark             2013-01-08  1464  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1465  	reg_write(priv, REG_PLL_SERIAL_2, PLL_SERIAL_2_SRL_NOSC(div) |
e7792ce2da5ded Rob Clark             2013-01-08  1466  			PLL_SERIAL_2_SRL_PR(rep));
e7792ce2da5ded Rob Clark             2013-01-08  1467  
e7792ce2da5ded Rob Clark             2013-01-08  1468  	/* set color matrix bypass flag: */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1469  	reg_write(priv, REG_MAT_CONTRL, MAT_CONTRL_MAT_BP |
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1470  				MAT_CONTRL_MAT_SC(1));
9476ed2e3883b1 Russell King          2016-11-03  1471  	reg_set(priv, REG_FEAT_POWERDOWN, FEAT_POWERDOWN_CSC);
e7792ce2da5ded Rob Clark             2013-01-08  1472  
e7792ce2da5ded Rob Clark             2013-01-08  1473  	/* set BIAS tmds value: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1474  	reg_write(priv, REG_ANA_GENERAL, 0x09);
e7792ce2da5ded Rob Clark             2013-01-08  1475  
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1476  	/*
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1477  	 * Sync on rising HSYNC/VSYNC
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1478  	 */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1479  	reg = VIP_CNTRL_3_SYNC_HS;
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1480  
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1481  	/*
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1482  	 * TDA19988 requires high-active sync at input stage,
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1483  	 * so invert low-active sync provided by master encoder here
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1484  	 */
088d61d1fdfde5 Sebastian Hesselbarth 2013-08-14  1485  	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1486  		reg |= VIP_CNTRL_3_H_TGL;
e7792ce2da5ded Rob Clark             2013-01-08  1487  	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1488  		reg |= VIP_CNTRL_3_V_TGL;
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1489  	reg_write(priv, REG_VIP_CNTRL_3, reg);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1490  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1491  	reg_write(priv, REG_VIDFORMAT, 0x00);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1492  	reg_write16(priv, REG_REFPIX_MSB, ref_pix);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1493  	reg_write16(priv, REG_REFLINE_MSB, ref_line);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1494  	reg_write16(priv, REG_NPIX_MSB, n_pix);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1495  	reg_write16(priv, REG_NLINE_MSB, n_line);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1496  	reg_write16(priv, REG_VS_LINE_STRT_1_MSB, vs1_line_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1497  	reg_write16(priv, REG_VS_PIX_STRT_1_MSB, vs1_pix_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1498  	reg_write16(priv, REG_VS_LINE_END_1_MSB, vs1_line_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1499  	reg_write16(priv, REG_VS_PIX_END_1_MSB, vs1_pix_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1500  	reg_write16(priv, REG_VS_LINE_STRT_2_MSB, vs2_line_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1501  	reg_write16(priv, REG_VS_PIX_STRT_2_MSB, vs2_pix_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1502  	reg_write16(priv, REG_VS_LINE_END_2_MSB, vs2_line_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1503  	reg_write16(priv, REG_VS_PIX_END_2_MSB, vs2_pix_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1504  	reg_write16(priv, REG_HS_PIX_START_MSB, hs_pix_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1505  	reg_write16(priv, REG_HS_PIX_STOP_MSB, hs_pix_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1506  	reg_write16(priv, REG_VWIN_START_1_MSB, vwin1_line_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1507  	reg_write16(priv, REG_VWIN_END_1_MSB, vwin1_line_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1508  	reg_write16(priv, REG_VWIN_START_2_MSB, vwin2_line_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1509  	reg_write16(priv, REG_VWIN_END_2_MSB, vwin2_line_e);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1510  	reg_write16(priv, REG_DE_START_MSB, de_pix_s);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1511  	reg_write16(priv, REG_DE_STOP_MSB, de_pix_e);
e7792ce2da5ded Rob Clark             2013-01-08  1512  
e7792ce2da5ded Rob Clark             2013-01-08  1513  	if (priv->rev == TDA19988) {
e7792ce2da5ded Rob Clark             2013-01-08  1514  		/* let incoming pixels fill the active space (if any) */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1515  		reg_write(priv, REG_ENABLE_SPACE, 0x00);
e7792ce2da5ded Rob Clark             2013-01-08  1516  	}
e7792ce2da5ded Rob Clark             2013-01-08  1517  
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1518  	/*
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1519  	 * Always generate sync polarity relative to input sync and
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1520  	 * revert input stage toggled sync at output stage
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1521  	 */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1522  	reg = TBG_CNTRL_1_DWIN_DIS | TBG_CNTRL_1_TGL_EN;
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1523  	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1524  		reg |= TBG_CNTRL_1_H_TGL;
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1525  	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1526  		reg |= TBG_CNTRL_1_V_TGL;
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1527  	reg_write(priv, REG_TBG_CNTRL_1, reg);
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1528  
e7792ce2da5ded Rob Clark             2013-01-08  1529  	/* must be last register set: */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1530  	reg_write(priv, REG_TBG_CNTRL_0, 0);
c4c11dd160a8cc Russell King          2013-08-14  1531  
319e658c78befa Russell King          2016-10-23  1532  	priv->tmds_clock = adjusted_mode->clock;
319e658c78befa Russell King          2016-10-23  1533  
896a4130b8e60c Russell King          2016-10-23  1534  	/* CEA-861B section 6 says that:
896a4130b8e60c Russell King          2016-10-23  1535  	 * CEA version 1 (CEA-861) has no support for infoframes.
896a4130b8e60c Russell King          2016-10-23  1536  	 * CEA version 2 (CEA-861A) supports version 1 AVI infoframes,
896a4130b8e60c Russell King          2016-10-23  1537  	 * and optional basic audio.
896a4130b8e60c Russell King          2016-10-23  1538  	 * CEA version 3 (CEA-861B) supports version 1 and 2 AVI infoframes,
896a4130b8e60c Russell King          2016-10-23  1539  	 * and optional digital audio, with audio infoframes.
896a4130b8e60c Russell King          2016-10-23  1540  	 *
896a4130b8e60c Russell King          2016-10-23  1541  	 * Since we only support generation of version 2 AVI infoframes,
896a4130b8e60c Russell King          2016-10-23  1542  	 * ignore CEA version 2 and below (iow, behave as if we're a
896a4130b8e60c Russell King          2016-10-23  1543  	 * CEA-861 source.)
896a4130b8e60c Russell King          2016-10-23  1544  	 */
896a4130b8e60c Russell King          2016-10-23  1545  	priv->supports_infoframes = priv->connector.display_info.cea_rev >= 3;
896a4130b8e60c Russell King          2016-10-23  1546  
896a4130b8e60c Russell King          2016-10-23  1547  	if (priv->supports_infoframes) {
c4c11dd160a8cc Russell King          2013-08-14  1548  		/* We need to turn HDMI HDCP stuff on to get audio through */
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1549  		reg &= ~TBG_CNTRL_1_DWIN_DIS;
81b53a166f5cdf Jean-Francois Moine   2014-01-25  1550  		reg_write(priv, REG_TBG_CNTRL_1, reg);
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1551  		reg_write(priv, REG_ENC_CNTRL, ENC_CNTRL_CTL_CODE(1));
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1552  		reg_set(priv, REG_TX33, TX33_HDMI);
c4c11dd160a8cc Russell King          2013-08-14  1553  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1554  		tda998x_write_avi(priv, adjusted_mode);
c4c11dd160a8cc Russell King          2013-08-14  1555  
8f3f21f63c3625 Russell King          2016-11-02  1556  		if (priv->audio_params.format != AFMT_UNUSED &&
8f3f21f63c3625 Russell King          2016-11-02  1557  		    priv->sink_has_audio)
319e658c78befa Russell King          2016-10-23  1558  			tda998x_configure_audio(priv, &priv->audio_params);
95db3b255fde4e Jyri Sarha            2016-08-09  1559  	}
319e658c78befa Russell King          2016-10-23  1560  
319e658c78befa Russell King          2016-10-23  1561  	mutex_unlock(&priv->audio_mutex);
c4c11dd160a8cc Russell King          2013-08-14  1562  }
e7792ce2da5ded Rob Clark             2013-01-08  1563  
30bd8b862f5466 Russell King          2018-08-02  1564  static const struct drm_bridge_funcs tda998x_bridge_funcs = {
30bd8b862f5466 Russell King          2018-08-02  1565  	.attach = tda998x_bridge_attach,
30bd8b862f5466 Russell King          2018-08-02  1566  	.detach = tda998x_bridge_detach,
b073a70ecd37bc Russell King          2018-08-02  1567  	.mode_valid = tda998x_bridge_mode_valid,
30bd8b862f5466 Russell King          2018-08-02  1568  	.disable = tda998x_bridge_disable,
30bd8b862f5466 Russell King          2018-08-02  1569  	.mode_set = tda998x_bridge_mode_set,
30bd8b862f5466 Russell King          2018-08-02  1570  	.enable = tda998x_bridge_enable,
30bd8b862f5466 Russell King          2018-08-02  1571  };
a8f4d4d63739e4 Russell King          2014-02-07  1572  
e7792ce2da5ded Rob Clark             2013-01-08  1573  /* I2C driver functions */
e7792ce2da5ded Rob Clark             2013-01-08  1574  
7e567624dc5a44 Jyri Sarha            2016-08-09  1575  static int tda998x_get_audio_ports(struct tda998x_priv *priv,
7e567624dc5a44 Jyri Sarha            2016-08-09  1576  				   struct device_node *np)
7e567624dc5a44 Jyri Sarha            2016-08-09  1577  {
7e567624dc5a44 Jyri Sarha            2016-08-09  1578  	const u32 *port_data;
7e567624dc5a44 Jyri Sarha            2016-08-09  1579  	u32 size;
7e567624dc5a44 Jyri Sarha            2016-08-09  1580  	int i;
7e567624dc5a44 Jyri Sarha            2016-08-09  1581  
7e567624dc5a44 Jyri Sarha            2016-08-09  1582  	port_data = of_get_property(np, "audio-ports", &size);
7e567624dc5a44 Jyri Sarha            2016-08-09  1583  	if (!port_data)
7e567624dc5a44 Jyri Sarha            2016-08-09  1584  		return 0;
7e567624dc5a44 Jyri Sarha            2016-08-09  1585  
7e567624dc5a44 Jyri Sarha            2016-08-09  1586  	size /= sizeof(u32);
7e567624dc5a44 Jyri Sarha            2016-08-09  1587  	if (size > 2 * ARRAY_SIZE(priv->audio_port) || size % 2 != 0) {
7e567624dc5a44 Jyri Sarha            2016-08-09  1588  		dev_err(&priv->hdmi->dev,
7e567624dc5a44 Jyri Sarha            2016-08-09  1589  			"Bad number of elements in audio-ports dt-property\n");
7e567624dc5a44 Jyri Sarha            2016-08-09  1590  		return -EINVAL;
7e567624dc5a44 Jyri Sarha            2016-08-09  1591  	}
7e567624dc5a44 Jyri Sarha            2016-08-09  1592  
7e567624dc5a44 Jyri Sarha            2016-08-09  1593  	size /= 2;
7e567624dc5a44 Jyri Sarha            2016-08-09  1594  
7e567624dc5a44 Jyri Sarha            2016-08-09  1595  	for (i = 0; i < size; i++) {
7e567624dc5a44 Jyri Sarha            2016-08-09  1596  		u8 afmt = be32_to_cpup(&port_data[2*i]);
7e567624dc5a44 Jyri Sarha            2016-08-09  1597  		u8 ena_ap = be32_to_cpup(&port_data[2*i+1]);
7e567624dc5a44 Jyri Sarha            2016-08-09  1598  
7e567624dc5a44 Jyri Sarha            2016-08-09  1599  		if (afmt != AFMT_SPDIF && afmt != AFMT_I2S) {
7e567624dc5a44 Jyri Sarha            2016-08-09  1600  			dev_err(&priv->hdmi->dev,
7e567624dc5a44 Jyri Sarha            2016-08-09  1601  				"Bad audio format %u\n", afmt);
7e567624dc5a44 Jyri Sarha            2016-08-09  1602  			return -EINVAL;
7e567624dc5a44 Jyri Sarha            2016-08-09  1603  		}
7e567624dc5a44 Jyri Sarha            2016-08-09  1604  
7e567624dc5a44 Jyri Sarha            2016-08-09  1605  		priv->audio_port[i].format = afmt;
7e567624dc5a44 Jyri Sarha            2016-08-09  1606  		priv->audio_port[i].config = ena_ap;
7e567624dc5a44 Jyri Sarha            2016-08-09  1607  	}
7e567624dc5a44 Jyri Sarha            2016-08-09  1608  
7e567624dc5a44 Jyri Sarha            2016-08-09  1609  	if (priv->audio_port[0].format == priv->audio_port[1].format) {
7e567624dc5a44 Jyri Sarha            2016-08-09  1610  		dev_err(&priv->hdmi->dev,
7e567624dc5a44 Jyri Sarha            2016-08-09  1611  			"There can only be on I2S port and one SPDIF port\n");
7e567624dc5a44 Jyri Sarha            2016-08-09  1612  		return -EINVAL;
7e567624dc5a44 Jyri Sarha            2016-08-09  1613  	}
7e567624dc5a44 Jyri Sarha            2016-08-09  1614  	return 0;
7e567624dc5a44 Jyri Sarha            2016-08-09  1615  }
7e567624dc5a44 Jyri Sarha            2016-08-09  1616  
6c1187aaa2912f Russell King          2018-08-02  1617  static void tda998x_set_config(struct tda998x_priv *priv,
6c1187aaa2912f Russell King          2018-08-02  1618  			       const struct tda998x_encoder_params *p)
e7792ce2da5ded Rob Clark             2013-01-08  1619  {
6c1187aaa2912f Russell King          2018-08-02  1620  	priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(p->swap_a) |
6c1187aaa2912f Russell King          2018-08-02  1621  			    (p->mirr_a ? VIP_CNTRL_0_MIRR_A : 0) |
6c1187aaa2912f Russell King          2018-08-02  1622  			    VIP_CNTRL_0_SWAP_B(p->swap_b) |
6c1187aaa2912f Russell King          2018-08-02  1623  			    (p->mirr_b ? VIP_CNTRL_0_MIRR_B : 0);
6c1187aaa2912f Russell King          2018-08-02  1624  	priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(p->swap_c) |
6c1187aaa2912f Russell King          2018-08-02  1625  			    (p->mirr_c ? VIP_CNTRL_1_MIRR_C : 0) |
6c1187aaa2912f Russell King          2018-08-02  1626  			    VIP_CNTRL_1_SWAP_D(p->swap_d) |
6c1187aaa2912f Russell King          2018-08-02  1627  			    (p->mirr_d ? VIP_CNTRL_1_MIRR_D : 0);
6c1187aaa2912f Russell King          2018-08-02  1628  	priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(p->swap_e) |
6c1187aaa2912f Russell King          2018-08-02  1629  			    (p->mirr_e ? VIP_CNTRL_2_MIRR_E : 0) |
6c1187aaa2912f Russell King          2018-08-02  1630  			    VIP_CNTRL_2_SWAP_F(p->swap_f) |
6c1187aaa2912f Russell King          2018-08-02  1631  			    (p->mirr_f ? VIP_CNTRL_2_MIRR_F : 0);
6c1187aaa2912f Russell King          2018-08-02  1632  
6c1187aaa2912f Russell King          2018-08-02  1633  	priv->audio_params = p->audio_params;
6c1187aaa2912f Russell King          2018-08-02  1634  }
6c1187aaa2912f Russell King          2018-08-02  1635  
76767fdabadbea Russell King          2018-08-02  1636  static void tda998x_destroy(struct device *dev)
76767fdabadbea Russell King          2018-08-02  1637  {
76767fdabadbea Russell King          2018-08-02  1638  	struct tda998x_priv *priv = dev_get_drvdata(dev);
76767fdabadbea Russell King          2018-08-02  1639  
76767fdabadbea Russell King          2018-08-02  1640  	drm_bridge_remove(&priv->bridge);
76767fdabadbea Russell King          2018-08-02  1641  
76767fdabadbea Russell King          2018-08-02  1642  	/* disable all IRQs and free the IRQ handler */
76767fdabadbea Russell King          2018-08-02  1643  	cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
76767fdabadbea Russell King          2018-08-02  1644  	reg_clear(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD);
76767fdabadbea Russell King          2018-08-02  1645  
76767fdabadbea Russell King          2018-08-02  1646  	if (priv->audio_pdev)
76767fdabadbea Russell King          2018-08-02  1647  		platform_device_unregister(priv->audio_pdev);
76767fdabadbea Russell King          2018-08-02  1648  
76767fdabadbea Russell King          2018-08-02  1649  	if (priv->hdmi->irq)
76767fdabadbea Russell King          2018-08-02  1650  		free_irq(priv->hdmi->irq, priv);
76767fdabadbea Russell King          2018-08-02  1651  
76767fdabadbea Russell King          2018-08-02  1652  	del_timer_sync(&priv->edid_delay_timer);
76767fdabadbea Russell King          2018-08-02  1653  	cancel_work_sync(&priv->detect_work);
76767fdabadbea Russell King          2018-08-02  1654  
76767fdabadbea Russell King          2018-08-02  1655  	i2c_unregister_device(priv->cec);
76767fdabadbea Russell King          2018-08-02  1656  
76767fdabadbea Russell King          2018-08-02  1657  	if (priv->cec_notify)
f070b4ca123f0c Dariusz Marcinkiewicz 2019-07-01  1658  		cec_notifier_conn_unregister(priv->cec_notify);
76767fdabadbea Russell King          2018-08-02  1659  }
76767fdabadbea Russell King          2018-08-02  1660  
2143adb04b357e Russell King          2018-08-02  1661  static int tda998x_create(struct device *dev)
e7792ce2da5ded Rob Clark             2013-01-08  1662  {
2143adb04b357e Russell King          2018-08-02  1663  	struct i2c_client *client = to_i2c_client(dev);
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1664  	struct device_node *np = client->dev.of_node;
7e8675f000bc7e Russell King          2016-10-05  1665  	struct i2c_board_info cec_info;
2143adb04b357e Russell King          2018-08-02  1666  	struct tda998x_priv *priv;
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1667  	u32 video;
fb7544d7732f78 Russell King          2014-02-02  1668  	int rev_lo, rev_hi, ret;
e7792ce2da5ded Rob Clark             2013-01-08  1669  
2143adb04b357e Russell King          2018-08-02  1670  	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
2143adb04b357e Russell King          2018-08-02  1671  	if (!priv)
2143adb04b357e Russell King          2018-08-02  1672  		return -ENOMEM;
2143adb04b357e Russell King          2018-08-02  1673  
2143adb04b357e Russell King          2018-08-02  1674  	dev_set_drvdata(dev, priv);
2143adb04b357e Russell King          2018-08-02  1675  
d93ae190e2c952 Russell King          2016-11-17  1676  	mutex_init(&priv->mutex);	/* protect the page access */
d93ae190e2c952 Russell King          2016-11-17  1677  	mutex_init(&priv->audio_mutex); /* protect access from audio thread */
7e8675f000bc7e Russell King          2016-10-05  1678  	mutex_init(&priv->edid_mutex);
30bd8b862f5466 Russell King          2018-08-02  1679  	INIT_LIST_HEAD(&priv->bridge.list);
d93ae190e2c952 Russell King          2016-11-17  1680  	init_waitqueue_head(&priv->edid_delay_waitq);
d93ae190e2c952 Russell King          2016-11-17  1681  	timer_setup(&priv->edid_delay_timer, tda998x_edid_delay_done, 0);
d93ae190e2c952 Russell King          2016-11-17  1682  	INIT_WORK(&priv->detect_work, tda998x_detect_work);
ba300c1787f793 Russell King          2016-11-17  1683  
5e74c22cd1e0f9 Russell King          2013-08-14  1684  	priv->vip_cntrl_0 = VIP_CNTRL_0_SWAP_A(2) | VIP_CNTRL_0_SWAP_B(3);
5e74c22cd1e0f9 Russell King          2013-08-14  1685  	priv->vip_cntrl_1 = VIP_CNTRL_1_SWAP_C(0) | VIP_CNTRL_1_SWAP_D(1);
5e74c22cd1e0f9 Russell King          2013-08-14  1686  	priv->vip_cntrl_2 = VIP_CNTRL_2_SWAP_E(4) | VIP_CNTRL_2_SWAP_F(5);
5e74c22cd1e0f9 Russell King          2013-08-14  1687  
14e5b5889d7589 Russell King          2016-11-03  1688  	/* CEC I2C address bound to TDA998x I2C addr by configuration pins */
14e5b5889d7589 Russell King          2016-11-03  1689  	priv->cec_addr = 0x34 + (client->addr & 0x03);
2eb4c7b1e7f275 Jean-Francois Moine   2014-01-25  1690  	priv->current_page = 0xff;
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1691  	priv->hdmi = client;
ed9a84262a83ab Jean-Francois Moine   2014-11-29  1692  
e7792ce2da5ded Rob Clark             2013-01-08  1693  	/* wake up the device: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1694  	cec_write(priv, REG_CEC_ENAMODS,
e7792ce2da5ded Rob Clark             2013-01-08  1695  			CEC_ENAMODS_EN_RXSENS | CEC_ENAMODS_EN_HDMI);
e7792ce2da5ded Rob Clark             2013-01-08  1696  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1697  	tda998x_reset(priv);
e7792ce2da5ded Rob Clark             2013-01-08  1698  
e7792ce2da5ded Rob Clark             2013-01-08  1699  	/* read version: */
fb7544d7732f78 Russell King          2014-02-02  1700  	rev_lo = reg_read(priv, REG_VERSION_LSB);
6a765c3fe54973 Russell King          2016-11-17  1701  	if (rev_lo < 0) {
76767fdabadbea Russell King          2018-08-02  1702  		dev_err(dev, "failed to read version: %d\n", rev_lo);
6a765c3fe54973 Russell King          2016-11-17  1703  		return rev_lo;
6a765c3fe54973 Russell King          2016-11-17  1704  	}
6a765c3fe54973 Russell King          2016-11-17  1705  
fb7544d7732f78 Russell King          2014-02-02  1706  	rev_hi = reg_read(priv, REG_VERSION_MSB);
6a765c3fe54973 Russell King          2016-11-17  1707  	if (rev_hi < 0) {
76767fdabadbea Russell King          2018-08-02  1708  		dev_err(dev, "failed to read version: %d\n", rev_hi);
6a765c3fe54973 Russell King          2016-11-17  1709  		return rev_hi;
fb7544d7732f78 Russell King          2014-02-02  1710  	}
fb7544d7732f78 Russell King          2014-02-02  1711  
fb7544d7732f78 Russell King          2014-02-02  1712  	priv->rev = rev_lo | rev_hi << 8;
e7792ce2da5ded Rob Clark             2013-01-08  1713  
e7792ce2da5ded Rob Clark             2013-01-08  1714  	/* mask off feature bits: */
e7792ce2da5ded Rob Clark             2013-01-08  1715  	priv->rev &= ~0x30; /* not-hdcp and not-scalar bit */
e7792ce2da5ded Rob Clark             2013-01-08  1716  
e7792ce2da5ded Rob Clark             2013-01-08  1717  	switch (priv->rev) {
b728fab7026b9d Jean-Francois Moine   2014-01-25  1718  	case TDA9989N2:
76767fdabadbea Russell King          2018-08-02  1719  		dev_info(dev, "found TDA9989 n2");
b728fab7026b9d Jean-Francois Moine   2014-01-25  1720  		break;
b728fab7026b9d Jean-Francois Moine   2014-01-25  1721  	case TDA19989:
76767fdabadbea Russell King          2018-08-02  1722  		dev_info(dev, "found TDA19989");
b728fab7026b9d Jean-Francois Moine   2014-01-25  1723  		break;
b728fab7026b9d Jean-Francois Moine   2014-01-25  1724  	case TDA19989N2:
76767fdabadbea Russell King          2018-08-02  1725  		dev_info(dev, "found TDA19989 n2");
b728fab7026b9d Jean-Francois Moine   2014-01-25  1726  		break;
b728fab7026b9d Jean-Francois Moine   2014-01-25  1727  	case TDA19988:
76767fdabadbea Russell King          2018-08-02  1728  		dev_info(dev, "found TDA19988");
b728fab7026b9d Jean-Francois Moine   2014-01-25  1729  		break;
e7792ce2da5ded Rob Clark             2013-01-08  1730  	default:
76767fdabadbea Russell King          2018-08-02  1731  		dev_err(dev, "found unsupported device: %04x\n", priv->rev);
6a765c3fe54973 Russell King          2016-11-17  1732  		return -ENXIO;
e7792ce2da5ded Rob Clark             2013-01-08  1733  	}
e7792ce2da5ded Rob Clark             2013-01-08  1734  
e7792ce2da5ded Rob Clark             2013-01-08  1735  	/* after reset, enable DDC: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1736  	reg_write(priv, REG_DDC_DISABLE, 0x00);
e7792ce2da5ded Rob Clark             2013-01-08  1737  
e7792ce2da5ded Rob Clark             2013-01-08  1738  	/* set clock on DDC channel: */
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1739  	reg_write(priv, REG_TX3, 39);
e7792ce2da5ded Rob Clark             2013-01-08  1740  
e7792ce2da5ded Rob Clark             2013-01-08  1741  	/* if necessary, disable multi-master: */
e7792ce2da5ded Rob Clark             2013-01-08  1742  	if (priv->rev == TDA19989)
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1743  		reg_set(priv, REG_I2C_MASTER, I2C_MASTER_DIS_MM);
e7792ce2da5ded Rob Clark             2013-01-08  1744  
2f7f730a4f0fd3 Jean-Francois Moine   2014-01-25  1745  	cec_write(priv, REG_CEC_FRO_IM_CLK_CTRL,
e7792ce2da5ded Rob Clark             2013-01-08  1746  			CEC_FRO_IM_CLK_CTRL_GHOST_DIS | CEC_FRO_IM_CLK_CTRL_IMCLK_SEL);
e7792ce2da5ded Rob Clark             2013-01-08  1747  
ba8975f15bb93d Russell King          2017-03-11  1748  	/* ensure interrupts are disabled */
ba8975f15bb93d Russell King          2017-03-11  1749  	cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
ba8975f15bb93d Russell King          2017-03-11  1750  
ba8975f15bb93d Russell King          2017-03-11  1751  	/* clear pending interrupts */
ba8975f15bb93d Russell King          2017-03-11  1752  	cec_read(priv, REG_CEC_RXSHPDINT);
ba8975f15bb93d Russell King          2017-03-11  1753  	reg_read(priv, REG_INT_FLAGS_0);
ba8975f15bb93d Russell King          2017-03-11  1754  	reg_read(priv, REG_INT_FLAGS_1);
ba8975f15bb93d Russell King          2017-03-11  1755  	reg_read(priv, REG_INT_FLAGS_2);
ba8975f15bb93d Russell King          2017-03-11  1756  
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1757  	/* initialize the optional IRQ */
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1758  	if (client->irq) {
ae81553c30ef86 Russell King          2016-11-03  1759  		unsigned long irq_flags;
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1760  
6833d26ef823b2 Jean-Francois Moine   2014-11-29  1761  		/* init read EDID waitqueue and HDP work */
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1762  		init_waitqueue_head(&priv->wq_edid);
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1763  
ae81553c30ef86 Russell King          2016-11-03  1764  		irq_flags =
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1765  			irqd_get_trigger_type(irq_get_irq_data(client->irq));
7e8675f000bc7e Russell King          2016-10-05  1766  
7e8675f000bc7e Russell King          2016-10-05  1767  		priv->cec_glue.irq_flags = irq_flags;
7e8675f000bc7e Russell King          2016-10-05  1768  
ae81553c30ef86 Russell King          2016-11-03  1769  		irq_flags |= IRQF_SHARED | IRQF_ONESHOT;
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1770  		ret = request_threaded_irq(client->irq, NULL,
ae81553c30ef86 Russell King          2016-11-03  1771  					   tda998x_irq_thread, irq_flags,
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1772  					   "tda998x", priv);
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1773  		if (ret) {
76767fdabadbea Russell King          2018-08-02  1774  			dev_err(dev, "failed to request IRQ#%u: %d\n",
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1775  				client->irq, ret);
6a765c3fe54973 Russell King          2016-11-17  1776  			goto err_irq;
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1777  		}
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1778  
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1779  		/* enable HPD irq */
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1780  		cec_write(priv, REG_CEC_RXSHPDINTENA, CEC_RXSHPDLEV_HPD);
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1781  	}
12473b7d8e6074 Jean-Francois Moine   2014-01-25  1782  
76767fdabadbea Russell King          2018-08-02  1783  	priv->cec_glue.parent = dev;
7e8675f000bc7e Russell King          2016-10-05  1784  	priv->cec_glue.data = priv;
7e8675f000bc7e Russell King          2016-10-05  1785  	priv->cec_glue.init = tda998x_cec_hook_init;
7e8675f000bc7e Russell King          2016-10-05  1786  	priv->cec_glue.exit = tda998x_cec_hook_exit;
7e8675f000bc7e Russell King          2016-10-05  1787  	priv->cec_glue.open = tda998x_cec_hook_open;
7e8675f000bc7e Russell King          2016-10-05  1788  	priv->cec_glue.release = tda998x_cec_hook_release;
7e8675f000bc7e Russell King          2016-10-05  1789  
7e8675f000bc7e Russell King          2016-10-05  1790  	/*
7e8675f000bc7e Russell King          2016-10-05  1791  	 * Some TDA998x are actually two I2C devices merged onto one piece
7e8675f000bc7e Russell King          2016-10-05  1792  	 * of silicon: TDA9989 and TDA19989 combine the HDMI transmitter
7e8675f000bc7e Russell King          2016-10-05  1793  	 * with a slightly modified TDA9950 CEC device.  The CEC device
7e8675f000bc7e Russell King          2016-10-05  1794  	 * is at the TDA9950 address, with the address pins strapped across
7e8675f000bc7e Russell King          2016-10-05  1795  	 * to the TDA998x address pins.  Hence, it always has the same
7e8675f000bc7e Russell King          2016-10-05  1796  	 * offset.
7e8675f000bc7e Russell King          2016-10-05  1797  	 */
7e8675f000bc7e Russell King          2016-10-05  1798  	memset(&cec_info, 0, sizeof(cec_info));
7e8675f000bc7e Russell King          2016-10-05  1799  	strlcpy(cec_info.type, "tda9950", sizeof(cec_info.type));
7e8675f000bc7e Russell King          2016-10-05  1800  	cec_info.addr = priv->cec_addr;
7e8675f000bc7e Russell King          2016-10-05  1801  	cec_info.platform_data = &priv->cec_glue;
7e8675f000bc7e Russell King          2016-10-05  1802  	cec_info.irq = client->irq;
7e8675f000bc7e Russell King          2016-10-05  1803  
7e8675f000bc7e Russell King          2016-10-05  1804  	priv->cec = i2c_new_device(client->adapter, &cec_info);
101e996b8d3215 Russell King          2016-11-17  1805  	if (!priv->cec) {
101e996b8d3215 Russell King          2016-11-17  1806  		ret = -ENODEV;
101e996b8d3215 Russell King          2016-11-17  1807  		goto fail;
101e996b8d3215 Russell King          2016-11-17  1808  	}
101e996b8d3215 Russell King          2016-11-17  1809  
e47826274e8871 Jean-Francois Moine   2014-01-25  1810  	/* enable EDID read irq: */
e47826274e8871 Jean-Francois Moine   2014-01-25  1811  	reg_set(priv, REG_INT_FLAGS_2, INT_FLAGS_2_EDID_BLK_RD);
e47826274e8871 Jean-Francois Moine   2014-01-25  1812  
6c1187aaa2912f Russell King          2018-08-02  1813  	if (np) {
7e567624dc5a44 Jyri Sarha            2016-08-09  1814  		/* get the device tree parameters */
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1815  		ret = of_property_read_u32(np, "video-ports", &video);
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1816  		if (ret == 0) {
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1817  			priv->vip_cntrl_0 = video >> 16;
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1818  			priv->vip_cntrl_1 = video >> 8;
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1819  			priv->vip_cntrl_2 = video;
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1820  		}
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1821  
7e567624dc5a44 Jyri Sarha            2016-08-09  1822  		ret = tda998x_get_audio_ports(priv, np);
7e567624dc5a44 Jyri Sarha            2016-08-09  1823  		if (ret)
7e567624dc5a44 Jyri Sarha            2016-08-09  1824  			goto fail;
e7792ce2da5ded Rob Clark             2013-01-08  1825  
7e567624dc5a44 Jyri Sarha            2016-08-09  1826  		if (priv->audio_port[0].format != AFMT_UNUSED)
7e567624dc5a44 Jyri Sarha            2016-08-09  1827  			tda998x_audio_codec_init(priv, &client->dev);
76767fdabadbea Russell King          2018-08-02  1828  	} else if (dev->platform_data) {
76767fdabadbea Russell King          2018-08-02  1829  		tda998x_set_config(priv, dev->platform_data);
6c1187aaa2912f Russell King          2018-08-02  1830  	}
7e567624dc5a44 Jyri Sarha            2016-08-09  1831  
30bd8b862f5466 Russell King          2018-08-02  1832  	priv->bridge.funcs = &tda998x_bridge_funcs;
30bd8b862f5466 Russell King          2018-08-02  1833  #ifdef CONFIG_OF
30bd8b862f5466 Russell King          2018-08-02  1834  	priv->bridge.of_node = dev->of_node;
30bd8b862f5466 Russell King          2018-08-02  1835  #endif
30bd8b862f5466 Russell King          2018-08-02  1836  
30bd8b862f5466 Russell King          2018-08-02  1837  	drm_bridge_add(&priv->bridge);
7e567624dc5a44 Jyri Sarha            2016-08-09  1838  
7e567624dc5a44 Jyri Sarha            2016-08-09  1839  	return 0;
6a765c3fe54973 Russell King          2016-11-17  1840  
e7792ce2da5ded Rob Clark             2013-01-08  1841  fail:
2143adb04b357e Russell King          2018-08-02  1842  	tda998x_destroy(dev);
6a765c3fe54973 Russell King          2016-11-17  1843  err_irq:
6a765c3fe54973 Russell King          2016-11-17  1844  	return ret;
e7792ce2da5ded Rob Clark             2013-01-08  1845  }
e7792ce2da5ded Rob Clark             2013-01-08  1846  
30bd8b862f5466 Russell King          2018-08-02  1847  /* DRM encoder functions */
c707c3619ca81f Russell King          2014-02-07  1848  
c707c3619ca81f Russell King          2014-02-07  1849  static void tda998x_encoder_destroy(struct drm_encoder *encoder)
c707c3619ca81f Russell King          2014-02-07  1850  {
c707c3619ca81f Russell King          2014-02-07  1851  	drm_encoder_cleanup(encoder);
c707c3619ca81f Russell King          2014-02-07  1852  }
c707c3619ca81f Russell King          2014-02-07  1853  
c707c3619ca81f Russell King          2014-02-07  1854  static const struct drm_encoder_funcs tda998x_encoder_funcs = {
c707c3619ca81f Russell King          2014-02-07  1855  	.destroy = tda998x_encoder_destroy,
c707c3619ca81f Russell King          2014-02-07  1856  };
c707c3619ca81f Russell King          2014-02-07  1857  
30bd8b862f5466 Russell King          2018-08-02  1858  static int tda998x_encoder_init(struct device *dev, struct drm_device *drm)
c707c3619ca81f Russell King          2014-02-07  1859  {
30bd8b862f5466 Russell King          2018-08-02  1860  	struct tda998x_priv *priv = dev_get_drvdata(dev);
e66e03abf80f70 Russell King          2015-06-06  1861  	u32 crtcs = 0;
c707c3619ca81f Russell King          2014-02-07  1862  	int ret;
c707c3619ca81f Russell King          2014-02-07  1863  
5dbcf319b28327 Russell King          2014-06-15  1864  	if (dev->of_node)
5dbcf319b28327 Russell King          2014-06-15  1865  		crtcs = drm_of_find_possible_crtcs(drm, dev->of_node);
5dbcf319b28327 Russell King          2014-06-15  1866  
5dbcf319b28327 Russell King          2014-06-15  1867  	/* If no CRTCs were found, fall back to our old behaviour */
5dbcf319b28327 Russell King          2014-06-15  1868  	if (crtcs == 0) {
5dbcf319b28327 Russell King          2014-06-15  1869  		dev_warn(dev, "Falling back to first CRTC\n");
5dbcf319b28327 Russell King          2014-06-15  1870  		crtcs = 1 << 0;
5dbcf319b28327 Russell King          2014-06-15  1871  	}
5dbcf319b28327 Russell King          2014-06-15  1872  
a3584f60f4898c Russell King          2015-08-14  1873  	priv->encoder.possible_crtcs = crtcs;
c707c3619ca81f Russell King          2014-02-07  1874  
a3584f60f4898c Russell King          2015-08-14  1875  	ret = drm_encoder_init(drm, &priv->encoder, &tda998x_encoder_funcs,
13a3d91f17a5f7 Ville Syrjälä         2015-12-09  1876  			       DRM_MODE_ENCODER_TMDS, NULL);
c707c3619ca81f Russell King          2014-02-07  1877  	if (ret)
c707c3619ca81f Russell King          2014-02-07  1878  		goto err_encoder;
c707c3619ca81f Russell King          2014-02-07  1879  
30bd8b862f5466 Russell King          2018-08-02  1880  	ret = drm_bridge_attach(&priv->encoder, &priv->bridge, NULL);
c707c3619ca81f Russell King          2014-02-07  1881  	if (ret)
30bd8b862f5466 Russell King          2018-08-02  1882  		goto err_bridge;
c707c3619ca81f Russell King          2014-02-07  1883  
c707c3619ca81f Russell King          2014-02-07  1884  	return 0;
c707c3619ca81f Russell King          2014-02-07  1885  
30bd8b862f5466 Russell King          2018-08-02  1886  err_bridge:
a3584f60f4898c Russell King          2015-08-14  1887  	drm_encoder_cleanup(&priv->encoder);
c707c3619ca81f Russell King          2014-02-07  1888  err_encoder:
c707c3619ca81f Russell King          2014-02-07  1889  	return ret;
c707c3619ca81f Russell King          2014-02-07  1890  }
c707c3619ca81f Russell King          2014-02-07  1891  
30bd8b862f5466 Russell King          2018-08-02  1892  static int tda998x_bind(struct device *dev, struct device *master, void *data)
30bd8b862f5466 Russell King          2018-08-02  1893  {
30bd8b862f5466 Russell King          2018-08-02  1894  	struct drm_device *drm = data;
30bd8b862f5466 Russell King          2018-08-02  1895  
5a03f5346fedc8 Russell King          2018-08-02  1896  	return tda998x_encoder_init(dev, drm);
30bd8b862f5466 Russell King          2018-08-02  1897  }
c707c3619ca81f Russell King          2014-02-07  1898  
c707c3619ca81f Russell King          2014-02-07  1899  static void tda998x_unbind(struct device *dev, struct device *master,
c707c3619ca81f Russell King          2014-02-07  1900  			   void *data)
c707c3619ca81f Russell King          2014-02-07  1901  {
a3584f60f4898c Russell King          2015-08-14  1902  	struct tda998x_priv *priv = dev_get_drvdata(dev);
c707c3619ca81f Russell King          2014-02-07  1903  
a3584f60f4898c Russell King          2015-08-14  1904  	drm_encoder_cleanup(&priv->encoder);
c707c3619ca81f Russell King          2014-02-07  1905  }
c707c3619ca81f Russell King          2014-02-07  1906  
c707c3619ca81f Russell King          2014-02-07  1907  static const struct component_ops tda998x_ops = {
c707c3619ca81f Russell King          2014-02-07  1908  	.bind = tda998x_bind,
c707c3619ca81f Russell King          2014-02-07  1909  	.unbind = tda998x_unbind,
c707c3619ca81f Russell King          2014-02-07  1910  };
c707c3619ca81f Russell King          2014-02-07  1911  
c707c3619ca81f Russell King          2014-02-07  1912  static int
c707c3619ca81f Russell King          2014-02-07  1913  tda998x_probe(struct i2c_client *client, const struct i2c_device_id *id)
c707c3619ca81f Russell King          2014-02-07  1914  {
5a03f5346fedc8 Russell King          2018-08-02  1915  	int ret;
5a03f5346fedc8 Russell King          2018-08-02  1916  
14e5b5889d7589 Russell King          2016-11-03  1917  	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
14e5b5889d7589 Russell King          2016-11-03  1918  		dev_warn(&client->dev, "adapter does not support I2C\n");
14e5b5889d7589 Russell King          2016-11-03  1919  		return -EIO;
14e5b5889d7589 Russell King          2016-11-03  1920  	}
5a03f5346fedc8 Russell King          2018-08-02  1921  
5a03f5346fedc8 Russell King          2018-08-02  1922  	ret = tda998x_create(&client->dev);
5a03f5346fedc8 Russell King          2018-08-02  1923  	if (ret)
5a03f5346fedc8 Russell King          2018-08-02  1924  		return ret;
5a03f5346fedc8 Russell King          2018-08-02  1925  
5a03f5346fedc8 Russell King          2018-08-02  1926  	ret = component_add(&client->dev, &tda998x_ops);
5a03f5346fedc8 Russell King          2018-08-02  1927  	if (ret)
5a03f5346fedc8 Russell King          2018-08-02  1928  		tda998x_destroy(&client->dev);
5a03f5346fedc8 Russell King          2018-08-02  1929  	return ret;
c707c3619ca81f Russell King          2014-02-07  1930  }
c707c3619ca81f Russell King          2014-02-07  1931  
c707c3619ca81f Russell King          2014-02-07  1932  static int tda998x_remove(struct i2c_client *client)
c707c3619ca81f Russell King          2014-02-07  1933  {
c707c3619ca81f Russell King          2014-02-07  1934  	component_del(&client->dev, &tda998x_ops);
5a03f5346fedc8 Russell King          2018-08-02  1935  	tda998x_destroy(&client->dev);
c707c3619ca81f Russell King          2014-02-07  1936  	return 0;
c707c3619ca81f Russell King          2014-02-07  1937  }
c707c3619ca81f Russell King          2014-02-07  1938  
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1939  #ifdef CONFIG_OF
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1940  static const struct of_device_id tda998x_dt_ids[] = {
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1941  	{ .compatible = "nxp,tda998x", },
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1942  	{ }
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1943  };
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1944  MODULE_DEVICE_TABLE(of, tda998x_dt_ids);
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1945  #endif
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1946  
b7f08c89a00ab9 Arvind Yadav          2017-08-19  1947  static const struct i2c_device_id tda998x_ids[] = {
e7792ce2da5ded Rob Clark             2013-01-08  1948  	{ "tda998x", 0 },
e7792ce2da5ded Rob Clark             2013-01-08  1949  	{ }
e7792ce2da5ded Rob Clark             2013-01-08  1950  };
e7792ce2da5ded Rob Clark             2013-01-08  1951  MODULE_DEVICE_TABLE(i2c, tda998x_ids);
e7792ce2da5ded Rob Clark             2013-01-08  1952  
3d58e31888318e Russell King          2015-08-14  1953  static struct i2c_driver tda998x_driver = {
e7792ce2da5ded Rob Clark             2013-01-08  1954  	.probe = tda998x_probe,
e7792ce2da5ded Rob Clark             2013-01-08  1955  	.remove = tda998x_remove,
e7792ce2da5ded Rob Clark             2013-01-08  1956  	.driver = {
e7792ce2da5ded Rob Clark             2013-01-08  1957  		.name = "tda998x",
0d44ea190387e2 Jean-Francois Moine   2014-01-25  1958  		.of_match_table = of_match_ptr(tda998x_dt_ids),
e7792ce2da5ded Rob Clark             2013-01-08  1959  	},
e7792ce2da5ded Rob Clark             2013-01-08  1960  	.id_table = tda998x_ids,
e7792ce2da5ded Rob Clark             2013-01-08  1961  };
e7792ce2da5ded Rob Clark             2013-01-08  1962  
3d58e31888318e Russell King          2015-08-14  1963  module_i2c_driver(tda998x_driver);
e7792ce2da5ded Rob Clark             2013-01-08  1964  
e7792ce2da5ded Rob Clark             2013-01-08  1965  MODULE_AUTHOR("Rob Clark <robdclark@gmail.com");
e7792ce2da5ded Rob Clark             2013-01-08  1966  MODULE_DESCRIPTION("NXP Semiconductors TDA998X HDMI Encoder");
e7792ce2da5ded Rob Clark             2013-01-08  1967  MODULE_LICENSE("GPL");

:::::: The code at line 1268 was first introduced by commit
:::::: f070b4ca123f0c4cedefc309ce2739131ca89750 drm: tda998x: use cec_notifier_conn_(un)register

:::::: TO: Dariusz Marcinkiewicz <darekm@google.com>
:::::: CC: 0day robot <lkp@intel.com>

---
0-DAY kernel test infrastructure                Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all                   Intel Corporation

[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 69501 bytes --]

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-07-04 19:21 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-07-01  8:35 [PATCH 0/5] cec: convert remaining drivers to the new notifier API Dariusz Marcinkiewicz
2019-07-01  8:35 ` [PATCH 1/5] drm: tda998x: use cec_notifier_conn_(un)register Dariusz Marcinkiewicz
2019-07-01  8:35 ` [PATCH 2/5] drm: sti: " Dariusz Marcinkiewicz
2019-07-01  8:35 ` [PATCH 3/5] drm: tegra: " Dariusz Marcinkiewicz
2019-07-01  8:35 ` [PATCH 4/5] drm: dw-hdmi: " Dariusz Marcinkiewicz
2019-07-02 21:08   ` kbuild test robot
2019-07-01  8:35 ` [PATCH 5/5] drm: exynos: exynos_hdmi: " Dariusz Marcinkiewicz
2019-07-04 19:20   ` kbuild test robot

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).