* [PATCH 0/3] OMAPDSS: HDMI: HDMI Hot-plug detect support.
@ 2011-12-13 13:24 mythripk
2011-12-13 13:24 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile mythripk
0 siblings, 1 reply; 6+ messages in thread
From: mythripk @ 2011-12-13 13:24 UTC (permalink / raw)
To: tomi.valkeinen, linux-omap; +Cc: Mythri P K
From: Mythri P K <mythripk@ti.com>
HDMI even if enabled by default should be powered on only when the cable is
connected. This is supported by the Hot-plug feature.
Now when HDMI is enabled the following steps are followed:
-Display enable for HDMI is based on Hot-plug-detect(HPD).
-It registers to the GPIO irq handler and checks if cable is connected,
-If yes then it turns on HDMI
-If an HPD interrupt is received the corresponding IRQ handler is called where
it checks if it is a connect / disconnect based on which appropriate action
is taken.
Mythri P K (3):
OMAPDSS: HDMI: HPD support in boardfile
OMAPDSS: HDMI: HPD support added to HDMI driver
OMAPDSS: HDMI: Add option to enable HDMI in HPD mode
arch/arm/mach-omap2/board-4430sdp.c | 35 ++++--------
arch/arm/mach-omap2/board-omap4panda.c | 35 ++++---------
arch/arm/mach-omap2/display.c | 20 ++++++--
drivers/video/omap2/dss/dss.h | 2 +
drivers/video/omap2/dss/hdmi.c | 92 ++++++++++++++++++++++++++-----
drivers/video/omap2/dss/hdmi_panel.c | 54 ++++++++++++++++++-
include/video/omapdss.h | 10 +++-
7 files changed, 176 insertions(+), 72 deletions(-)
--
1.7.5.4
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile
2011-12-13 13:24 [PATCH 0/3] OMAPDSS: HDMI: HDMI Hot-plug detect support mythripk
@ 2011-12-13 13:24 ` mythripk
2011-12-13 13:24 ` [PATCH 2/3] OMAPDSS: HDMI: HPD support added to HDMI driver mythripk
2011-12-17 1:34 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile Tony Lindgren
0 siblings, 2 replies; 6+ messages in thread
From: mythripk @ 2011-12-13 13:24 UTC (permalink / raw)
To: tomi.valkeinen, linux-omap; +Cc: Mythri P K
From: Mythri P K <mythripk@ti.com>
Add support for HPD GPIO configuration in board file.
Also remove the enabling of GPIO's required for HDMI from
hdmi driver file to display.c based on the GPIO #'s sent from
board file.
Signed-off-by: Mythri P K <mythripk@ti.com>
---
arch/arm/mach-omap2/board-4430sdp.c | 35 ++++++++++---------------------
arch/arm/mach-omap2/board-omap4panda.c | 35 +++++++++----------------------
arch/arm/mach-omap2/display.c | 20 ++++++++++++++---
drivers/video/omap2/dss/hdmi.c | 16 +-------------
include/video/omapdss.h | 6 ++++-
5 files changed, 43 insertions(+), 69 deletions(-)
diff --git a/arch/arm/mach-omap2/board-4430sdp.c b/arch/arm/mach-omap2/board-4430sdp.c
index 1b7c5e5..ba32b81 100644
--- a/arch/arm/mach-omap2/board-4430sdp.c
+++ b/arch/arm/mach-omap2/board-4430sdp.c
@@ -52,8 +52,9 @@
#define ETH_KS8851_QUART 138
#define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184
#define OMAP4_SFH7741_ENABLE_GPIO 188
-#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
+#define HDMI_GPIO_CT_CP_HPD 60 /* Hot plug pin for HDMI */
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
+#define HDMI_GPIO_HPD 63
#define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */
#define DLP_POWER_ON_GPIO 40
@@ -596,27 +597,11 @@ static void __init omap_sfh7741prox_init(void)
}
static struct gpio sdp4430_hdmi_gpios[] = {
- { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
- { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
+ {HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
+ {HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
+ {HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
};
-static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)
-{
- int status;
-
- status = gpio_request_array(sdp4430_hdmi_gpios,
- ARRAY_SIZE(sdp4430_hdmi_gpios));
- if (status)
- pr_err("%s: Cannot request HDMI GPIOs\n", __func__);
-
- return status;
-}
-
-static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev)
-{
- gpio_free(HDMI_GPIO_LS_OE);
- gpio_free(HDMI_GPIO_HPD);
-}
static struct nokia_dsi_panel_data dsi1_panel = {
.name = "taal",
@@ -735,9 +720,8 @@ static struct omap_dss_device sdp4430_hdmi_device = {
.name = "hdmi",
.driver_name = "hdmi_panel",
.type = OMAP_DISPLAY_TYPE_HDMI,
- .platform_enable = sdp4430_panel_enable_hdmi,
- .platform_disable = sdp4430_panel_disable_hdmi,
.channel = OMAP_DSS_CHANNEL_DIGIT,
+ .hpd_gpio = 63,
};
static struct picodlp_panel_data sdp4430_picodlp_pdata = {
@@ -835,9 +819,12 @@ static void omap_4430sdp_display_init(void)
* EDID read failure.
*/
if (cpu_is_omap446x() || (omap_rev() > OMAP4430_REV_ES2_2))
- omap_hdmi_init(OMAP_HDMI_EXTERNAL_PULLUP);
+ omap_hdmi_init(OMAP_HDMI_EXTERNAL_PULLUP, HDMI_GPIO_HPD,
+ sdp4430_hdmi_gpios,
+ ARRAY_SIZE(sdp4430_hdmi_gpios));
else
- omap_hdmi_init(0);
+ omap_hdmi_init(0, HDMI_GPIO_HPD, sdp4430_hdmi_gpios,
+ ARRAY_SIZE(sdp4430_hdmi_gpios));
}
#ifdef CONFIG_OMAP_MUX
diff --git a/arch/arm/mach-omap2/board-omap4panda.c b/arch/arm/mach-omap2/board-omap4panda.c
index 212e06c..e13d116 100644
--- a/arch/arm/mach-omap2/board-omap4panda.c
+++ b/arch/arm/mach-omap2/board-omap4panda.c
@@ -51,8 +51,9 @@
#define GPIO_HUB_NRESET 62
#define GPIO_WIFI_PMENA 43
#define GPIO_WIFI_IRQ 53
-#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
+#define HDMI_GPIO_CT_CP_HPD 60 /* Hot plug pin for HDMI */
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
+#define HDMI_GPIO_HPD 63
/* wl127x BT, FM, GPS connectivity chip */
static int wl1271_gpios[] = {46, -1, -1};
@@ -479,35 +480,17 @@ int __init omap4_panda_dvi_init(void)
}
static struct gpio panda_hdmi_gpios[] = {
- { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
- { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
+ {HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
+ {HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
+ {HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
};
-static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
-{
- int status;
-
- status = gpio_request_array(panda_hdmi_gpios,
- ARRAY_SIZE(panda_hdmi_gpios));
- if (status)
- pr_err("Cannot request HDMI GPIOs\n");
-
- return status;
-}
-
-static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)
-{
- gpio_free(HDMI_GPIO_LS_OE);
- gpio_free(HDMI_GPIO_HPD);
-}
-
static struct omap_dss_device omap4_panda_hdmi_device = {
.name = "hdmi",
.driver_name = "hdmi_panel",
.type = OMAP_DISPLAY_TYPE_HDMI,
- .platform_enable = omap4_panda_panel_enable_hdmi,
- .platform_disable = omap4_panda_panel_disable_hdmi,
.channel = OMAP_DSS_CHANNEL_DIGIT,
+ .hpd_gpio = 63,
};
static struct omap_dss_device *omap4_panda_dss_devices[] = {
@@ -551,9 +534,11 @@ void omap4_panda_display_init(void)
* EDID read failure.
*/
if (cpu_is_omap446x() || (omap_rev() > OMAP4430_REV_ES2_2))
- omap_hdmi_init(OMAP_HDMI_EXTERNAL_PULLUP);
+ omap_hdmi_init(OMAP_HDMI_EXTERNAL_PULLUP, HDMI_GPIO_HPD,
+ panda_hdmi_gpios, ARRAY_SIZE(panda_hdmi_gpios));
else
- omap_hdmi_init(0);
+ omap_hdmi_init(0, HDMI_GPIO_HPD, panda_hdmi_gpios,
+ ARRAY_SIZE(panda_hdmi_gpios));
}
static void __init omap4_panda_init(void)
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c
index a75e179..10b47b1 100644
--- a/arch/arm/mach-omap2/display.c
+++ b/arch/arm/mach-omap2/display.c
@@ -29,6 +29,7 @@
#include <plat/omap-pm.h>
#include <plat/common.h>
+#include <linux/gpio.h>
#include "mux.h"
#include "control.h"
#include "display.h"
@@ -97,14 +98,14 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = {
{ "dss_hdmi", "omapdss_hdmi", -1 },
};
-static void omap4_hdmi_mux_pads(int flags)
+static void omap4_hdmi_mux_pads(int flags, int hpd_gpio)
{
u32 reg;
u16 control_i2c_1;
/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */
omap_mux_init_signal("hdmi_hpd",
- OMAP_PIN_INPUT_PULLUP);
+ OMAP_PIN_INPUT_PULLDOWN);
omap_mux_init_signal("hdmi_cec",
OMAP_PIN_INPUT_PULLUP);
/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */
@@ -112,6 +113,10 @@ static void omap4_hdmi_mux_pads(int flags)
OMAP_PIN_INPUT_PULLUP);
omap_mux_init_signal("hdmi_ddc_sda",
OMAP_PIN_INPUT_PULLUP);
+ omap_mux_init_signal("gpmc_wait2.gpio_100",
+ OMAP_PIN_INPUT_PULLDOWN);
+ /* HPD GPIO needs to be muxed*/
+ omap_mux_init_gpio(hpd_gpio, OMAP_PIN_INPUT | OMAP_PULL_ENA);
if (flags & OMAP_HDMI_EXTERNAL_PULLUP) {
control_i2c_1 = OMAP4_CTRL_MODULE_PAD_CORE_CONTROL_I2C_1;
@@ -155,10 +160,17 @@ static int omap4_dsi_mux_pads(int dsi_id, unsigned lanes)
return 0;
}
-int omap_hdmi_init(int flags)
+int omap_hdmi_init(int flags, int hpd_gpio, struct gpio hdmi_gpios[], int size)
{
+ int status;
+
+ status = gpio_request_array(hdmi_gpios, size);
+ if (status) {
+ pr_err("%s: Cannot request HDMI GPIOs\n", __func__);
+ return status;
+ }
if (cpu_is_omap44xx())
- omap4_hdmi_mux_pads(flags);
+ omap4_hdmi_mux_pads(flags, hpd_gpio);
return 0;
}
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
index c56378c..36a7541 100644
--- a/drivers/video/omap2/dss/hdmi.c
+++ b/drivers/video/omap2/dss/hdmi.c
@@ -508,26 +508,15 @@ int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev)
goto err0;
}
- if (dssdev->platform_enable) {
- r = dssdev->platform_enable(dssdev);
- if (r) {
- DSSERR("failed to enable GPIO's\n");
- goto err1;
- }
- }
-
r = hdmi_power_on(dssdev);
if (r) {
DSSERR("failed to power on device\n");
- goto err2;
+ goto err1;
}
mutex_unlock(&hdmi.lock);
return 0;
-err2:
- if (dssdev->platform_disable)
- dssdev->platform_disable(dssdev);
err1:
omap_dss_stop_device(dssdev);
err0:
@@ -543,9 +532,6 @@ void omapdss_hdmi_display_disable(struct omap_dss_device *dssdev)
hdmi_power_off(dssdev);
- if (dssdev->platform_disable)
- dssdev->platform_disable(dssdev);
-
omap_dss_stop_device(dssdev);
mutex_unlock(&hdmi.lock);
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index df585b5..ffd5d42 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -21,6 +21,7 @@
#include <linux/list.h>
#include <linux/kobject.h>
#include <linux/device.h>
+#include <linux/gpio.h>
#define DISPC_IRQ_FRAMEDONE (1 << 0)
#define DISPC_IRQ_VSYNC (1 << 1)
@@ -312,7 +313,8 @@ struct omap_dss_board_info {
/* Init with the board info */
extern int omap_display_init(struct omap_dss_board_info *board_data);
/* HDMI mux init*/
-extern int omap_hdmi_init(int flags);
+extern int omap_hdmi_init(int flags, int hpd_gpio,
+ struct gpio hdmi_gpios[], int size);
struct omap_display_platform_data {
struct omap_dss_board_info *board_data;
@@ -552,6 +554,8 @@ struct omap_dss_device {
int reset_gpio;
+ int hpd_gpio;
+
int max_backlight_level;
const char *name;
--
1.7.5.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] OMAPDSS: HDMI: HPD support added to HDMI driver
2011-12-13 13:24 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile mythripk
@ 2011-12-13 13:24 ` mythripk
2011-12-13 13:24 ` [PATCH 3/3] OMAPDSS: HDMI: Add option to enable HDMI in HPD mode mythripk
2011-12-17 1:34 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile Tony Lindgren
1 sibling, 1 reply; 6+ messages in thread
From: mythripk @ 2011-12-13 13:24 UTC (permalink / raw)
To: tomi.valkeinen, linux-omap; +Cc: Mythri P K
From: Mythri P K <mythripk@ti.com>
GPIO based handling of connect/disconnect of the HDMI cable
(Hot-plug detect)is added to the HDMI driver.
Signed-off-by: Mythri P K <mythripk@ti.com>
---
drivers/video/omap2/dss/dss.h | 2 +
drivers/video/omap2/dss/hdmi.c | 76 ++++++++++++++++++++++++++++++++++++++++
include/video/omapdss.h | 3 ++
3 files changed, 81 insertions(+), 0 deletions(-)
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
index 6308fc5..c1279a3 100644
--- a/drivers/video/omap2/dss/dss.h
+++ b/drivers/video/omap2/dss/dss.h
@@ -498,6 +498,8 @@ 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 omapdss_hdmi_hpd_enable(struct omap_dss_device *dssdev);
+void omapdss_hdmi_hpd_disable(struct omap_dss_device *dssdev);
int hdmi_panel_init(void);
void hdmi_panel_exit(void);
diff --git a/drivers/video/omap2/dss/hdmi.c b/drivers/video/omap2/dss/hdmi.c
index 36a7541..1fe8e84 100644
--- a/drivers/video/omap2/dss/hdmi.c
+++ b/drivers/video/omap2/dss/hdmi.c
@@ -67,9 +67,12 @@ static struct {
struct mutex lock;
struct omap_display_platform_data *pdata;
struct platform_device *pdev;
+ struct omap_dss_device *dssdev;
+
struct hdmi_ip_data ip_data;
int code;
int mode;
+ int hpd;
struct clk *sys_clk;
} hdmi;
@@ -454,6 +457,32 @@ void hdmi_dump_regs(struct seq_file *s)
mutex_unlock(&hdmi.lock);
}
+static int hdmi_get_current_hpd(void)
+{
+ return gpio_get_value(hdmi.dssdev->hpd_gpio);
+}
+
+static irqreturn_t hpd_enable_handler(int irq, void *ptr)
+{
+ DSSDBG("hpd enable %d\n", hdmi.hpd);
+
+ if (hdmi.hpd)
+ hdmi.dssdev->driver->default_enable(hdmi.dssdev);
+ else
+ hdmi.dssdev->driver->default_disable(hdmi.dssdev);
+
+ return IRQ_HANDLED;
+}
+
+static irqreturn_t hpd_irq_handler(int irq, void *ptr)
+{
+ hdmi.hpd = hdmi_get_current_hpd();
+
+ DSSDBG("hpd %d\n", hdmi.hpd);
+
+ return IRQ_WAKE_THREAD;
+}
+
int omapdss_hdmi_read_edid(u8 *buf, int len)
{
int r;
@@ -488,6 +517,41 @@ bool omapdss_hdmi_detect(void)
return r == 1;
}
+void omapdss_hdmi_hpd_disable(struct omap_dss_device *dssdev)
+{
+ DSSDBG("Enter hdmi_hpd_disable\n");
+
+ if (hdmi.dssdev)
+ free_irq(gpio_to_irq(hdmi.dssdev->hpd_gpio), hpd_irq_handler);
+
+ mutex_unlock(&hdmi.lock);
+}
+
+int omapdss_hdmi_hpd_enable(struct omap_dss_device *dssdev)
+{
+ int r = 0;
+
+ DSSDBG("ENTER hdmi_hpd_enable\n");
+
+ mutex_lock(&hdmi.lock);
+
+ r = request_threaded_irq(gpio_to_irq(hdmi.dssdev->hpd_gpio),
+ hpd_irq_handler, hpd_enable_handler,
+ IRQF_DISABLED | IRQF_TRIGGER_RISING |
+ IRQF_TRIGGER_FALLING, "hpd", NULL);
+ if (r < 0) {
+ pr_err("hdmi: request_irq %d failed\n",
+ gpio_to_irq(hdmi.dssdev->hpd_gpio));
+ return -EINVAL;
+ }
+
+ r = hdmi_get_current_hpd();
+
+ mutex_unlock(&hdmi.lock);
+
+ return r;
+}
+
int omapdss_hdmi_display_enable(struct omap_dss_device *dssdev)
{
int r = 0;
@@ -733,12 +797,24 @@ static int omapdss_hdmihw_probe(struct platform_device *pdev)
{
struct resource *hdmi_mem;
int r;
+ struct omap_dss_board_info *board_data;
hdmi.pdata = pdev->dev.platform_data;
hdmi.pdev = pdev;
mutex_init(&hdmi.lock);
+ /* save reference to HDMI device */
+ board_data = hdmi.pdata->board_data;
+ for (r = 0; r < board_data->num_devices; r++) {
+ if (board_data->devices[r]->type == OMAP_DISPLAY_TYPE_HDMI)
+ hdmi.dssdev = board_data->devices[r];
+ }
+ if (!hdmi.dssdev) {
+ DSSERR("can't get HDMI device\n");
+ return -EINVAL;
+ }
+
hdmi_mem = platform_get_resource(hdmi.pdev, IORESOURCE_MEM, 0);
if (!hdmi_mem) {
DSSERR("can't get IORESOURCE_MEM HDMI\n");
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index ffd5d42..82e2c3e 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -630,6 +630,9 @@ struct omap_dss_driver {
int (*read_edid)(struct omap_dss_device *dssdev, u8 *buf, int len);
bool (*detect)(struct omap_dss_device *dssdev);
+
+ int (*default_enable)(struct omap_dss_device *dssdev);
+ void (*default_disable)(struct omap_dss_device *dssdev);
};
int omap_dss_register_driver(struct omap_dss_driver *);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] OMAPDSS: HDMI: Add option to enable HDMI in HPD mode
2011-12-13 13:24 ` [PATCH 2/3] OMAPDSS: HDMI: HPD support added to HDMI driver mythripk
@ 2011-12-13 13:24 ` mythripk
0 siblings, 0 replies; 6+ messages in thread
From: mythripk @ 2011-12-13 13:24 UTC (permalink / raw)
To: tomi.valkeinen, linux-omap; +Cc: Mythri P K
From: Mythri P K <mythripk@ti.com>
Add option in the panel to enable HDMI in HPD mode to enable the interrupt to
detect cable connect/disconnect, HDMI will be powered on only when the cable is
connected and powered down when cable is disconnected.
Signed-off-by: Mythri P K <mythripk@ti.com>
---
drivers/video/omap2/dss/hdmi_panel.c | 54 ++++++++++++++++++++++++++++++++--
include/video/omapdss.h | 1 +
2 files changed, 52 insertions(+), 3 deletions(-)
diff --git a/drivers/video/omap2/dss/hdmi_panel.c b/drivers/video/omap2/dss/hdmi_panel.c
index 533d5dc..0b8a8ac 100644
--- a/drivers/video/omap2/dss/hdmi_panel.c
+++ b/drivers/video/omap2/dss/hdmi_panel.c
@@ -61,7 +61,7 @@ static int hdmi_panel_enable(struct omap_dss_device *dssdev)
mutex_lock(&hdmi.hdmi_lock);
- if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
+ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
r = -EINVAL;
goto err;
}
@@ -222,11 +222,57 @@ err:
return r;
}
+static void hdmi_hpd_disable(struct omap_dss_device *dssdev)
+{
+ mutex_lock(&hdmi.hdmi_lock);
+
+ if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE ||
+ dssdev->state == OMAP_DSS_DISPLAY_HOTPLUG)
+ omapdss_hdmi_hpd_disable(dssdev);
+
+ dssdev->state = OMAP_DSS_DISPLAY_DISABLED;
+
+ mutex_unlock(&hdmi.hdmi_lock);
+}
+
+static int hdmi_hpd_enable(struct omap_dss_device *dssdev)
+{
+ int r = 0;
+ DSSDBG("ENTER hdmi_hpd_enable\n");
+
+ mutex_lock(&hdmi.hdmi_lock);
+
+ if (dssdev->state != OMAP_DSS_DISPLAY_DISABLED) {
+ r = -EINVAL;
+ goto err;
+ }
+
+ r = omapdss_hdmi_hpd_enable(dssdev);
+
+ if (r < 0) {
+ DSSERR("failed to power on\n");
+ goto err;
+ } else if (r == 1) {
+ r = omapdss_hdmi_display_enable(dssdev);
+ if (r) {
+ DSSERR("failed to power on\n");
+ goto err;
+ }
+ dssdev->state = OMAP_DSS_DISPLAY_ACTIVE;
+ } else {
+ dssdev->state = OMAP_DSS_DISPLAY_HOTPLUG;
+ }
+
+err: mutex_unlock(&hdmi.hdmi_lock);
+
+ return r;
+}
+
static struct omap_dss_driver hdmi_driver = {
.probe = hdmi_panel_probe,
.remove = hdmi_panel_remove,
- .enable = hdmi_panel_enable,
- .disable = hdmi_panel_disable,
+ .enable = hdmi_hpd_enable,
+ .disable = hdmi_hpd_disable,
.suspend = hdmi_panel_suspend,
.resume = hdmi_panel_resume,
.get_timings = hdmi_get_timings,
@@ -234,6 +280,8 @@ static struct omap_dss_driver hdmi_driver = {
.check_timings = hdmi_check_timings,
.read_edid = hdmi_read_edid,
.detect = hdmi_detect,
+ .default_enable = hdmi_panel_enable,
+ .default_disable = hdmi_panel_disable,
.driver = {
.name = "hdmi_panel",
.owner = THIS_MODULE,
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index 82e2c3e..5623a34 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -159,6 +159,7 @@ enum omap_dss_display_state {
OMAP_DSS_DISPLAY_DISABLED = 0,
OMAP_DSS_DISPLAY_ACTIVE,
OMAP_DSS_DISPLAY_SUSPENDED,
+ OMAP_DSS_DISPLAY_HOTPLUG,
};
/* XXX perhaps this should be removed */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile
2011-12-13 13:24 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile mythripk
2011-12-13 13:24 ` [PATCH 2/3] OMAPDSS: HDMI: HPD support added to HDMI driver mythripk
@ 2011-12-17 1:34 ` Tony Lindgren
1 sibling, 0 replies; 6+ messages in thread
From: Tony Lindgren @ 2011-12-17 1:34 UTC (permalink / raw)
To: mythripk; +Cc: tomi.valkeinen, linux-omap
* mythripk@ti.com <mythripk@ti.com> [111213 05:01]:
> From: Mythri P K <mythripk@ti.com>
>
> Add support for HPD GPIO configuration in board file.
> Also remove the enabling of GPIO's required for HDMI from
> hdmi driver file to display.c based on the GPIO #'s sent from
> board file.
>
> Signed-off-by: Mythri P K <mythripk@ti.com>
Few cosmetic comments below, otherwise this one looks OK
for Tomi to queue when he's happy with it:
Acked-by: Tony Lindgren <tony@atomide.com>
> --- a/arch/arm/mach-omap2/board-4430sdp.c
> +++ b/arch/arm/mach-omap2/board-4430sdp.c
> @@ -52,8 +52,9 @@
> #define ETH_KS8851_QUART 138
> #define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184
> #define OMAP4_SFH7741_ENABLE_GPIO 188
> -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
> +#define HDMI_GPIO_CT_CP_HPD 60 /* Hot plug pin for HDMI */
> #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
> +#define HDMI_GPIO_HPD 63
> #define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */
> #define DLP_POWER_ON_GPIO 40
>
> @@ -596,27 +597,11 @@ static void __init omap_sfh7741prox_init(void)
> }
>
> static struct gpio sdp4430_hdmi_gpios[] = {
> - { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
> - { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
> + {HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
> + {HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
> + {HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
> };
Please add the trailing comma to the array entries. Also check the
spacing, now there's no space in the beginning but one at the end?
> --- a/arch/arm/mach-omap2/board-omap4panda.c
> +++ b/arch/arm/mach-omap2/board-omap4panda.c
> @@ -51,8 +51,9 @@
> #define GPIO_HUB_NRESET 62
> #define GPIO_WIFI_PMENA 43
> #define GPIO_WIFI_IRQ 53
> -#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
> +#define HDMI_GPIO_CT_CP_HPD 60 /* Hot plug pin for HDMI */
> #define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
> +#define HDMI_GPIO_HPD 63
>
> /* wl127x BT, FM, GPS connectivity chip */
> static int wl1271_gpios[] = {46, -1, -1};
> @@ -479,35 +480,17 @@ int __init omap4_panda_dvi_init(void)
> }
>
> static struct gpio panda_hdmi_gpios[] = {
> - { HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
> - { HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
> + {HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
> + {HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
> + {HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
> };
Here too.
> --- a/arch/arm/mach-omap2/display.c
> +++ b/arch/arm/mach-omap2/display.c
> @@ -29,6 +29,7 @@
> #include <plat/omap-pm.h>
> #include <plat/common.h>
>
> +#include <linux/gpio.h>
> #include "mux.h"
> #include "control.h"
> #include "display.h"
This one will cause a merge conflict with common.h, but Tomi
already knows how to deal with that ;)
Regards,
Tony
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 0/3] OMAPDSS: HDMI: HDMI Hot-plug detect support.
@ 2012-01-06 12:44 mythripk
0 siblings, 0 replies; 6+ messages in thread
From: mythripk @ 2012-01-06 12:44 UTC (permalink / raw)
To: tomi.valkeinen, linux-omap; +Cc: Mythri P K
From: Mythri P K <mythripk@ti.com>
HDMI phy should be in the LDO_ON state when cable is not connected.
Only when cable is connected and transmission is possible HDMI Phy should move
to TX_ON state.
This is supported by the Hot-plug feature.
Now when HDMI is enabled the following steps are followed:
-It registers to the GPIO irq handler
-If an HPD interrupt is received the corresponding IRQ handler is called where
it checks if it is a connect / disconnect based on which PHY is moved to
appropriate state.
Mythri P K (3):
OMAPDSS: HDMI: HPD support in boardfile
OMAPDSS: HDMI: Handle HPD event in ip
OMAPDSS: HDMI: HPD support added to HDMI driver
arch/arm/mach-omap2/board-4430sdp.c | 37 +++++-----------
arch/arm/mach-omap2/board-omap4panda.c | 37 +++++-----------
arch/arm/mach-omap2/display.c | 21 ++++++++--
drivers/video/omap2/dss/dss_features.c | 1 +
drivers/video/omap2/dss/hdmi.c | 65 ++++++++++++++++++++++-------
drivers/video/omap2/dss/ti_hdmi.h | 4 ++
drivers/video/omap2/dss/ti_hdmi_4xxx_ip.c | 31 +++++++++++--
include/video/omapdss.h | 6 ++-
8 files changed, 126 insertions(+), 76 deletions(-)
--
1.7.5.4
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-01-06 12:52 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-12-13 13:24 [PATCH 0/3] OMAPDSS: HDMI: HDMI Hot-plug detect support mythripk
2011-12-13 13:24 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile mythripk
2011-12-13 13:24 ` [PATCH 2/3] OMAPDSS: HDMI: HPD support added to HDMI driver mythripk
2011-12-13 13:24 ` [PATCH 3/3] OMAPDSS: HDMI: Add option to enable HDMI in HPD mode mythripk
2011-12-17 1:34 ` [PATCH 1/3] OMAPDSS: HDMI: HPD support in boardfile Tony Lindgren
-- strict thread matches above, loose matches on Subject: below --
2012-01-06 12:44 [PATCH 0/3] OMAPDSS: HDMI: HDMI Hot-plug detect support mythripk
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).