summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThierry Reding <treding@nvidia.com>2018-12-10 11:34:54 -0500
committerThierry Reding <treding@nvidia.com>2019-01-16 07:09:32 -0500
commitf25d0a68beb868147571e395de52ced0c55f6cd4 (patch)
treed1f60e7ff96a89fc3f73fda27172a761ae76ac7b
parentbfeffd155283772bbe78c6a05dec7c0128ee500c (diff)
drm/tegra: Refactor CEC support
Most of the CEC support code already lives in the "output" library code. Move registration and unregistration to the library code as well to make use of the same code with HDMI on Tegra210 and later via the SOR. Signed-off-by: Thierry Reding <treding@nvidia.com> Reviewed-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/gpu/drm/tegra/drm.h2
-rw-r--r--drivers/gpu/drm/tegra/hdmi.c9
-rw-r--r--drivers/gpu/drm/tegra/output.c11
3 files changed, 10 insertions, 12 deletions
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 1012335bb489..f1763b4d5b5f 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -124,7 +124,7 @@ struct tegra_output {
124 struct drm_panel *panel; 124 struct drm_panel *panel;
125 struct i2c_adapter *ddc; 125 struct i2c_adapter *ddc;
126 const struct edid *edid; 126 const struct edid *edid;
127 struct cec_notifier *notifier; 127 struct cec_notifier *cec;
128 unsigned int hpd_irq; 128 unsigned int hpd_irq;
129 int hpd_gpio; 129 int hpd_gpio;
130 enum of_gpio_flags hpd_gpio_flags; 130 enum of_gpio_flags hpd_gpio_flags;
diff --git a/drivers/gpu/drm/tegra/hdmi.c b/drivers/gpu/drm/tegra/hdmi.c
index 0082468f703c..d19973945614 100644
--- a/drivers/gpu/drm/tegra/hdmi.c
+++ b/drivers/gpu/drm/tegra/hdmi.c
@@ -22,8 +22,6 @@
22 22
23#include <sound/hda_verbs.h> 23#include <sound/hda_verbs.h>
24 24
25#include <media/cec-notifier.h>
26
27#include "hdmi.h" 25#include "hdmi.h"
28#include "drm.h" 26#include "drm.h"
29#include "dc.h" 27#include "dc.h"
@@ -1709,10 +1707,6 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
1709 return PTR_ERR(hdmi->vdd); 1707 return PTR_ERR(hdmi->vdd);
1710 } 1708 }
1711 1709
1712 hdmi->output.notifier = cec_notifier_get(&pdev->dev);
1713 if (hdmi->output.notifier == NULL)
1714 return -ENOMEM;
1715
1716 hdmi->output.dev = &pdev->dev; 1710 hdmi->output.dev = &pdev->dev;
1717 1711
1718 err = tegra_output_probe(&hdmi->output); 1712 err = tegra_output_probe(&hdmi->output);
@@ -1771,9 +1765,6 @@ static int tegra_hdmi_remove(struct platform_device *pdev)
1771 1765
1772 tegra_output_remove(&hdmi->output); 1766 tegra_output_remove(&hdmi->output);
1773 1767
1774 if (hdmi->output.notifier)
1775 cec_notifier_put(hdmi->output.notifier);
1776
1777 return 0; 1768 return 0;
1778} 1769}
1779 1770
diff --git a/drivers/gpu/drm/tegra/output.c b/drivers/gpu/drm/tegra/output.c
index c662efc7e413..9c2b9dad55c3 100644
--- a/drivers/gpu/drm/tegra/output.c
+++ b/drivers/gpu/drm/tegra/output.c
@@ -36,7 +36,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
36 else if (output->ddc) 36 else if (output->ddc)
37 edid = drm_get_edid(connector, output->ddc); 37 edid = drm_get_edid(connector, output->ddc);
38 38
39 cec_notifier_set_phys_addr_from_edid(output->notifier, edid); 39 cec_notifier_set_phys_addr_from_edid(output->cec, edid);
40 drm_connector_update_edid_property(connector, edid); 40 drm_connector_update_edid_property(connector, edid);
41 41
42 if (edid) { 42 if (edid) {
@@ -73,7 +73,7 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
73 } 73 }
74 74
75 if (status != connector_status_connected) 75 if (status != connector_status_connected)
76 cec_notifier_phys_addr_invalidate(output->notifier); 76 cec_notifier_phys_addr_invalidate(output->cec);
77 77
78 return status; 78 return status;
79} 79}
@@ -174,11 +174,18 @@ int tegra_output_probe(struct tegra_output *output)
174 disable_irq(output->hpd_irq); 174 disable_irq(output->hpd_irq);
175 } 175 }
176 176
177 output->cec = cec_notifier_get(output->dev);
178 if (!output->cec)
179 return -ENOMEM;
180
177 return 0; 181 return 0;
178} 182}
179 183
180void tegra_output_remove(struct tegra_output *output) 184void tegra_output_remove(struct tegra_output *output)
181{ 185{
186 if (output->cec)
187 cec_notifier_put(output->cec);
188
182 if (gpio_is_valid(output->hpd_gpio)) { 189 if (gpio_is_valid(output->hpd_gpio)) {
183 free_irq(output->hpd_irq, output); 190 free_irq(output->hpd_irq, output);
184 gpio_free(output->hpd_gpio); 191 gpio_free(output->hpd_gpio);