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

Commit 019114ef authored by Hans Verkuil's avatar Hans Verkuil Committed by Tomi Valkeinen
Browse files

omapdrm: omapdss_hdmi_ops: add lost_hotplug op



The CEC framework needs to know when the hotplug detect signal
disappears, since that means the CEC physical address has to be
invalidated (i.e. set to f.f.f.f).

Add a lost_hotplug op that is called when the HPD signal goes away.

Signed-off-by: default avatarHans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 1897e1a3
Loading
Loading
Loading
Loading
+6 −2
Original line number Diff line number Diff line
@@ -165,11 +165,15 @@ static bool hdmic_detect(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	struct omap_dss_device *in = ddata->in;
	bool connected;

	if (gpio_is_valid(ddata->hpd_gpio))
		return gpio_get_value_cansleep(ddata->hpd_gpio);
		connected = gpio_get_value_cansleep(ddata->hpd_gpio);
	else
		return in->ops.hdmi->detect(in);
		connected = in->ops.hdmi->detect(in);
	if (!connected && in->ops.hdmi->lost_hotplug)
		in->ops.hdmi->lost_hotplug(in);
	return connected;
}

static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
+5 −1
Original line number Diff line number Diff line
@@ -159,8 +159,12 @@ static int tpd_read_edid(struct omap_dss_device *dssdev,
static bool tpd_detect(struct omap_dss_device *dssdev)
{
	struct panel_drv_data *ddata = to_panel_data(dssdev);
	struct omap_dss_device *in = ddata->in;
	bool connected = gpiod_get_value_cansleep(ddata->hpd_gpio);

	return gpiod_get_value_cansleep(ddata->hpd_gpio);
	if (!connected && in->ops.hdmi->lost_hotplug)
		in->ops.hdmi->lost_hotplug(in);
	return connected;
}

static int tpd_register_hpd_cb(struct omap_dss_device *dssdev,
+6 −2
Original line number Diff line number Diff line
@@ -401,8 +401,6 @@ static void hdmi_display_disable(struct omap_dss_device *dssdev)

	DSSDBG("Enter hdmi_display_disable\n");

	hdmi4_cec_set_phys_addr(&hdmi.core, CEC_PHYS_ADDR_INVALID);

	mutex_lock(&hdmi.lock);

	spin_lock_irqsave(&hdmi.audio_playing_lock, flags);
@@ -514,6 +512,11 @@ static int hdmi_read_edid(struct omap_dss_device *dssdev,
	return r;
}

static void hdmi_lost_hotplug(struct omap_dss_device *dssdev)
{
	hdmi4_cec_set_phys_addr(&hdmi.core, CEC_PHYS_ADDR_INVALID);
}

static int hdmi_set_infoframe(struct omap_dss_device *dssdev,
		const struct hdmi_avi_infoframe *avi)
{
@@ -540,6 +543,7 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
	.get_timings		= hdmi_display_get_timings,

	.read_edid		= hdmi_read_edid,
	.lost_hotplug		= hdmi_lost_hotplug,
	.set_infoframe		= hdmi_set_infoframe,
	.set_hdmi_mode		= hdmi_set_hdmi_mode,
};
+1 −0
Original line number Diff line number Diff line
@@ -395,6 +395,7 @@ struct omapdss_hdmi_ops {
			    struct videomode *vm);

	int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
	void (*lost_hotplug)(struct omap_dss_device *dssdev);
	bool (*detect)(struct omap_dss_device *dssdev);

	int (*register_hpd_cb)(struct omap_dss_device *dssdev,