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

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
...@@ -165,11 +165,15 @@ static bool hdmic_detect(struct omap_dss_device *dssdev) ...@@ -165,11 +165,15 @@ static bool hdmic_detect(struct omap_dss_device *dssdev)
{ {
struct panel_drv_data *ddata = to_panel_data(dssdev); struct panel_drv_data *ddata = to_panel_data(dssdev);
struct omap_dss_device *in = ddata->in; struct omap_dss_device *in = ddata->in;
bool connected;
if (gpio_is_valid(ddata->hpd_gpio)) if (gpio_is_valid(ddata->hpd_gpio))
return gpio_get_value_cansleep(ddata->hpd_gpio); connected = gpio_get_value_cansleep(ddata->hpd_gpio);
else 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, static int hdmic_register_hpd_cb(struct omap_dss_device *dssdev,
......
...@@ -159,8 +159,12 @@ static int tpd_read_edid(struct omap_dss_device *dssdev, ...@@ -159,8 +159,12 @@ static int tpd_read_edid(struct omap_dss_device *dssdev,
static bool tpd_detect(struct omap_dss_device *dssdev) static bool tpd_detect(struct omap_dss_device *dssdev)
{ {
struct panel_drv_data *ddata = to_panel_data(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, static int tpd_register_hpd_cb(struct omap_dss_device *dssdev,
......
...@@ -401,8 +401,6 @@ static void hdmi_display_disable(struct omap_dss_device *dssdev) ...@@ -401,8 +401,6 @@ static void hdmi_display_disable(struct omap_dss_device *dssdev)
DSSDBG("Enter hdmi_display_disable\n"); DSSDBG("Enter hdmi_display_disable\n");
hdmi4_cec_set_phys_addr(&hdmi.core, CEC_PHYS_ADDR_INVALID);
mutex_lock(&hdmi.lock); mutex_lock(&hdmi.lock);
spin_lock_irqsave(&hdmi.audio_playing_lock, flags); spin_lock_irqsave(&hdmi.audio_playing_lock, flags);
...@@ -514,6 +512,11 @@ static int hdmi_read_edid(struct omap_dss_device *dssdev, ...@@ -514,6 +512,11 @@ static int hdmi_read_edid(struct omap_dss_device *dssdev,
return r; 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, static int hdmi_set_infoframe(struct omap_dss_device *dssdev,
const struct hdmi_avi_infoframe *avi) const struct hdmi_avi_infoframe *avi)
{ {
...@@ -540,6 +543,7 @@ static const struct omapdss_hdmi_ops hdmi_ops = { ...@@ -540,6 +543,7 @@ static const struct omapdss_hdmi_ops hdmi_ops = {
.get_timings = hdmi_display_get_timings, .get_timings = hdmi_display_get_timings,
.read_edid = hdmi_read_edid, .read_edid = hdmi_read_edid,
.lost_hotplug = hdmi_lost_hotplug,
.set_infoframe = hdmi_set_infoframe, .set_infoframe = hdmi_set_infoframe,
.set_hdmi_mode = hdmi_set_hdmi_mode, .set_hdmi_mode = hdmi_set_hdmi_mode,
}; };
......
...@@ -395,6 +395,7 @@ struct omapdss_hdmi_ops { ...@@ -395,6 +395,7 @@ struct omapdss_hdmi_ops {
struct videomode *vm); struct videomode *vm);
int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len); 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); bool (*detect)(struct omap_dss_device *dssdev);
int (*register_hpd_cb)(struct omap_dss_device *dssdev, int (*register_hpd_cb)(struct omap_dss_device *dssdev,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment