Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb83be88 authored by Hans Verkuil's avatar Hans Verkuil Committed by Thierry Reding
Browse files

drm/tegra: hdmi: Add cec-notifier support



In order to support CEC the HDMI driver has to inform the CEC driver
whenever the physical address changes. So when the EDID is read the
CEC driver has to be informed and whenever the hotplug detect goes
away.

This is done through the cec-notifier framework.

The link between the HDMI driver and the CEC driver is done through
the hdmi-phandle property in the tegra-cec node in the device tree.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarThierry Reding <treding@nvidia.com>
parent a2f2f740
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@ config DRM_TEGRA
	select DRM_PANEL
	select TEGRA_HOST1X
	select IOMMU_IOVA if IOMMU_SUPPORT
	select CEC_CORE if CEC_NOTIFIER
	help
	  Choose this option if you have an NVIDIA Tegra SoC.

+3 −0
Original line number Diff line number Diff line
@@ -119,6 +119,8 @@ void *tegra_drm_alloc(struct tegra_drm *tegra, size_t size, dma_addr_t *iova);
void tegra_drm_free(struct tegra_drm *tegra, size_t size, void *virt,
		    dma_addr_t iova);

struct cec_notifier;

struct tegra_output {
	struct device_node *of_node;
	struct device *dev;
@@ -126,6 +128,7 @@ struct tegra_output {
	struct drm_panel *panel;
	struct i2c_adapter *ddc;
	const struct edid *edid;
	struct cec_notifier *notifier;
	unsigned int hpd_irq;
	int hpd_gpio;
	enum of_gpio_flags hpd_gpio_flags;
+9 −0
Original line number Diff line number Diff line
@@ -22,6 +22,8 @@

#include <sound/hda_verbs.h>

#include <media/cec-notifier.h>

#include "hdmi.h"
#include "drm.h"
#include "dc.h"
@@ -1721,6 +1723,10 @@ static int tegra_hdmi_probe(struct platform_device *pdev)
		return PTR_ERR(hdmi->vdd);
	}

	hdmi->output.notifier = cec_notifier_get(&pdev->dev);
	if (hdmi->output.notifier == NULL)
		return -ENOMEM;

	hdmi->output.dev = &pdev->dev;

	err = tegra_output_probe(&hdmi->output);
@@ -1779,6 +1785,9 @@ static int tegra_hdmi_remove(struct platform_device *pdev)

	tegra_output_remove(&hdmi->output);

	if (hdmi->output.notifier)
		cec_notifier_put(hdmi->output.notifier);

	return 0;
}

+6 −0
Original line number Diff line number Diff line
@@ -11,6 +11,8 @@
#include <drm/drm_panel.h>
#include "drm.h"

#include <media/cec-notifier.h>

int tegra_output_connector_get_modes(struct drm_connector *connector)
{
	struct tegra_output *output = connector_to_output(connector);
@@ -32,6 +34,7 @@ int tegra_output_connector_get_modes(struct drm_connector *connector)
	else if (output->ddc)
		edid = drm_get_edid(connector, output->ddc);

	cec_notifier_set_phys_addr_from_edid(output->notifier, edid);
	drm_mode_connector_update_edid_property(connector, edid);

	if (edid) {
@@ -68,6 +71,9 @@ tegra_output_connector_detect(struct drm_connector *connector, bool force)
			status = connector_status_connected;
	}

	if (status != connector_status_connected)
		cec_notifier_phys_addr_invalidate(output->notifier);

	return status;
}