mirror of
https://github.com/torvalds/linux.git
synced 2024-12-30 14:52:05 +00:00
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: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
This commit is contained in:
parent
1897e1a394
commit
019114efd9
@ -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,
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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 = {
|
|||||||
.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 {
|
|||||||
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,
|
||||||
|
Loading…
Reference in New Issue
Block a user