Skip to content

Commit

Permalink
OMAP: DSS2: HDMI: implement detect()
Browse files Browse the repository at this point in the history
Implement detect() by checking the hot plug detect status.

The implementation is not very good, as it always turns on the HDMI
output to get the detection working. HDMI driver needs improvements so
that we could enable only core parts of it.

Cc: Mythri P K <mythripk@ti.com>
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Tomi Valkeinen committed Sep 30, 2011
1 parent 468c1b9 commit 759593f
Show file tree
Hide file tree
Showing 6 changed files with 59 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/video/omap2/dss/dss.h
Original file line number Diff line number Diff line change
Expand Up @@ -495,6 +495,7 @@ void omapdss_hdmi_display_set_timing(struct omap_dss_device *dssdev);
int omapdss_hdmi_display_check_timing(struct omap_dss_device *dssdev,
struct omap_video_timings *timings);
int omapdss_hdmi_read_edid(u8 *buf, int len);
bool omapdss_hdmi_detect(void);
int hdmi_panel_init(void);
void hdmi_panel_exit(void);

Expand Down
1 change: 1 addition & 0 deletions drivers/video/omap2/dss/dss_features.c
Original file line number Diff line number Diff line change
Expand Up @@ -440,6 +440,7 @@ static const struct ti_hdmi_ip_ops omap4_hdmi_functions = {
.phy_enable = ti_hdmi_4xxx_phy_enable,
.phy_disable = ti_hdmi_4xxx_phy_disable,
.read_edid = ti_hdmi_4xxx_read_edid,
.detect = ti_hdmi_4xxx_detect,
.pll_enable = ti_hdmi_4xxx_pll_enable,
.pll_disable = ti_hdmi_4xxx_pll_disable,
.video_enable = ti_hdmi_4xxx_wp_video_start,
Expand Down
17 changes: 17 additions & 0 deletions drivers/video/omap2/dss/hdmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -449,6 +449,23 @@ int omapdss_hdmi_read_edid(u8 *buf, int len)
return r;
}

bool omapdss_hdmi_detect(void)
{
int r;

mutex_lock(&hdmi.lock);

r = hdmi_runtime_get();
BUG_ON(r);

r = hdmi.ip_data.ops->detect(&hdmi.ip_data);

hdmi_runtime_put();
mutex_unlock(&hdmi.lock);

return r == 1;
}

int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev)
{
int r = 0;
Expand Down
25 changes: 25 additions & 0 deletions drivers/video/omap2/dss/hdmi_panel.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
#include <linux/mutex.h>
#include <linux/module.h>
#include <video/omapdss.h>
#include <linux/slab.h>

#include "dss.h"

Expand Down Expand Up @@ -198,6 +199,29 @@ static int hdmi_read_edid(struct omap_dss_device *dssdev, u8 *buf, int len)
return r;
}

static bool hdmi_detect(struct omap_dss_device *dssdev)
{
int r;

mutex_lock(&hdmi.hdmi_lock);

if (dssdev->state != OMAP_DSS_DISPLAY_ACTIVE) {
r = omapdss_hdmi_display_enable(dssdev);
if (r)
goto err;
}

r = omapdss_hdmi_detect();

if (dssdev->state == OMAP_DSS_DISPLAY_DISABLED ||
dssdev->state == OMAP_DSS_DISPLAY_SUSPENDED)
omapdss_hdmi_display_disable(dssdev);
err:
mutex_unlock(&hdmi.hdmi_lock);

return r;
}

static struct omap_dss_driver hdmi_driver = {
.probe = hdmi_panel_probe,
.remove = hdmi_panel_remove,
Expand All @@ -209,6 +233,7 @@ static struct omap_dss_driver hdmi_driver = {
.set_timings = hdmi_set_timings,
.check_timings = hdmi_check_timings,
.read_edid = hdmi_read_edid,
.detect = hdmi_detect,
.driver = {
.name = "hdmi_panel",
.owner = THIS_MODULE,
Expand Down
3 changes: 3 additions & 0 deletions drivers/video/omap2/dss/ti_hdmi.h
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ struct ti_hdmi_ip_ops {

int (*read_edid)(struct hdmi_ip_data *ip_data, u8 *edid, int len);

bool (*detect)(struct hdmi_ip_data *ip_data);

int (*pll_enable)(struct hdmi_ip_data *ip_data);

void (*pll_disable)(struct hdmi_ip_data *ip_data);
Expand All @@ -114,6 +116,7 @@ struct hdmi_ip_data {
int ti_hdmi_4xxx_phy_enable(struct hdmi_ip_data *ip_data);
void ti_hdmi_4xxx_phy_disable(struct hdmi_ip_data *ip_data);
int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data, u8 *edid, int len);
bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data);
void ti_hdmi_4xxx_wp_video_start(struct hdmi_ip_data *ip_data, bool start);
int ti_hdmi_4xxx_pll_enable(struct hdmi_ip_data *ip_data);
void ti_hdmi_4xxx_pll_disable(struct hdmi_ip_data *ip_data);
Expand Down
12 changes: 12 additions & 0 deletions drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,18 @@ int ti_hdmi_4xxx_read_edid(struct hdmi_ip_data *ip_data,
return l;
}

bool ti_hdmi_4xxx_detect(struct hdmi_ip_data *ip_data)
{
int r;

void __iomem *base = hdmi_core_sys_base(ip_data);

/* HPD */
r = REG_GET(base, HDMI_CORE_SYS_SYS_STAT, 1, 1);

return r == 1;
}

static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
struct hdmi_core_infoframe_avi *avi_cfg,
struct hdmi_core_packet_enable_repeat *repeat_cfg)
Expand Down

0 comments on commit 759593f

Please sign in to comment.