diff options
author | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2013-10-28 13:47:34 +0400 |
---|---|---|
committer | Tomi Valkeinen <tomi.valkeinen@ti.com> | 2014-05-09 16:11:28 +0400 |
commit | dcf5f7299e94d113aa49b4e099c4b9f289d17ed2 (patch) | |
tree | d1e223c90de42595a98f138ef8a2819449d1a463 /drivers/video/fbdev/omap2/dss/hdmi_phy.c | |
parent | 543e761fb9c128d9065f45697cd96d04a566d2ce (diff) | |
download | linux-dcf5f7299e94d113aa49b4e099c4b9f289d17ed2.tar.xz |
OMAPDSS: HDMI: move irq & phy pwr handling
HDMI IRQ handling was moved into hdmi_phy.c when restructuring the HDMI
driver. While this worked fine, it's not correct.
The HDMI IRQ handling should be either in the hdmi_wp, or in the main
hdmi driver. This patch moves the handling to the main hdmi driver, as I
feel it's a more appropriate choice.
This move also requires changing the handling of the PHY power, as that
was partly handled in the IRQ handler. The PHY power is handled via the
WP module. An option would be to give HDMI PHY driver function pointers
that it could use to manage the PHY power, but as the PHY power is not
needed to access the PHY registers, the handling was also moved to the
main HDMI driver. This could be changed later if need be.
Note that there's slightly similar power issue with the PLL: the HDMI
PLLs power is also handled via the WP module. For now, the PLL power
handling is still done inside the PLL driver.
Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Diffstat (limited to 'drivers/video/fbdev/omap2/dss/hdmi_phy.c')
-rw-r--r-- | drivers/video/fbdev/omap2/dss/hdmi_phy.c | 70 |
1 files changed, 1 insertions, 69 deletions
diff --git a/drivers/video/fbdev/omap2/dss/hdmi_phy.c b/drivers/video/fbdev/omap2/dss/hdmi_phy.c index c1c65624fd5d..8d13e422de5e 100644 --- a/drivers/video/fbdev/omap2/dss/hdmi_phy.c +++ b/drivers/video/fbdev/omap2/dss/hdmi_phy.c @@ -28,37 +28,6 @@ void hdmi_phy_dump(struct hdmi_phy_data *phy, struct seq_file *s) DUMPPHY(HDMI_TXPHY_PAD_CFG_CTRL); } -static irqreturn_t hdmi_irq_handler(int irq, void *data) -{ - struct hdmi_wp_data *wp = data; - u32 irqstatus; - - irqstatus = hdmi_wp_get_irqstatus(wp); - hdmi_wp_set_irqstatus(wp, irqstatus); - - if ((irqstatus & HDMI_IRQ_LINK_CONNECT) && - irqstatus & HDMI_IRQ_LINK_DISCONNECT) { - /* - * If we get both connect and disconnect interrupts at the same - * time, turn off the PHY, clear interrupts, and restart, which - * raises connect interrupt if a cable is connected, or nothing - * if cable is not connected. - */ - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_OFF); - - hdmi_wp_set_irqstatus(wp, HDMI_IRQ_LINK_CONNECT | - HDMI_IRQ_LINK_DISCONNECT); - - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON); - } else if (irqstatus & HDMI_IRQ_LINK_CONNECT) { - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_TXON); - } else if (irqstatus & HDMI_IRQ_LINK_DISCONNECT) { - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON); - } - - return IRQ_HANDLED; -} - int hdmi_phy_parse_lanes(struct hdmi_phy_data *phy, const u32 *lanes) { int i; @@ -150,21 +119,8 @@ static void hdmi_phy_configure_lanes(struct hdmi_phy_data *phy) REG_FLD_MOD(phy->base, HDMI_TXPHY_PAD_CFG_CTRL, pol_val, 30, 27); } -int hdmi_phy_enable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp, - struct hdmi_config *cfg) +int hdmi_phy_configure(struct hdmi_phy_data *phy, struct hdmi_config *cfg) { - u16 r = 0; - u32 irqstatus; - - hdmi_wp_clear_irqenable(wp, 0xffffffff); - - irqstatus = hdmi_wp_get_irqstatus(wp); - hdmi_wp_set_irqstatus(wp, irqstatus); - - r = hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_LDOON); - if (r) - return r; - /* * Read address 0 in order to get the SCP reset done completed * Dummy access performed to make sure reset is done @@ -185,27 +141,9 @@ int hdmi_phy_enable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp, hdmi_phy_configure_lanes(phy); - r = request_threaded_irq(phy->irq, NULL, hdmi_irq_handler, - IRQF_ONESHOT, "OMAP HDMI", wp); - if (r) { - DSSERR("HDMI IRQ request failed\n"); - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_OFF); - return r; - } - - hdmi_wp_set_irqenable(wp, - HDMI_IRQ_LINK_CONNECT | HDMI_IRQ_LINK_DISCONNECT); - return 0; } -void hdmi_phy_disable(struct hdmi_phy_data *phy, struct hdmi_wp_data *wp) -{ - free_irq(phy->irq, wp); - - hdmi_wp_set_phy_pwr(wp, HDMI_PHYPWRCMD_OFF); -} - #define PHY_OFFSET 0x300 #define PHY_SIZE 0x100 @@ -240,11 +178,5 @@ int hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy) return -ENOMEM; } - phy->irq = platform_get_irq(pdev, 0); - if (phy->irq < 0) { - DSSERR("platform_get_irq failed\n"); - return -ENODEV; - } - return 0; } |