OMAP2 has an irq line dedicated for DISPC interrupts, there is no DSI on omap2. OMAP3 has a common irq line for DISPC and DSI interrupts. OMAP4 has seperate irq lines for DISPC and DSI Interrupts. Use dss_features to have a common DSS irq handler for all OMAP revisions. Also, use a member of the global dss structure to store the irq number as it is used in 2 functions. Signed-off-by: Archit Taneja <archit@xxxxxx> --- Note: Applies over a) v10 of OMAP2,3 DSS2 HWMOD b)v3 of DSS2: Generalize clock names and c) v3 of DSS2: OMAP4 DSS HWMOD : https://patchwork.kernel.org/patch/500191/ https://patchwork.kernel.org/patch/520191/ https://patchwork.kernel.org/patch/511211/ drivers/video/omap2/dss/dss.c | 46 +++++++++++++------------------ drivers/video/omap2/dss/dss_features.c | 5 ++- drivers/video/omap2/dss/dss_features.h | 17 ++++++----- 3 files changed, 31 insertions(+), 37 deletions(-) diff --git a/drivers/video/omap2/dss/dss.c b/drivers/video/omap2/dss/dss.c index c7cdbea..24d6f98 100644 --- a/drivers/video/omap2/dss/dss.c +++ b/drivers/video/omap2/dss/dss.c @@ -33,6 +33,7 @@ #include <plat/display.h> #include <plat/clock.h> #include "dss.h" +#include "dss_features.h" #define DSS_SZ_REGS SZ_512 @@ -61,6 +62,7 @@ static struct { struct platform_device *pdev; void __iomem *base; int ctx_id; + int irq; struct clk *dpll4_m4_ck; struct clk *dss_ick; @@ -494,28 +496,22 @@ found: return 0; } - - -static irqreturn_t dss_irq_handler_omap2(int irq, void *arg) -{ - dispc_irq_handler(); - - return IRQ_HANDLED; -} - -static irqreturn_t dss_irq_handler_omap3(int irq, void *arg) +static irqreturn_t dss_irq_handler(int irq, void *arg) { - u32 irqstatus; + if (dss_has_feature(FEAT_COMMON_IRQ_DISPC_DSI)) { + u32 irqstatus; - irqstatus = dss_read_reg(DSS_IRQSTATUS); + irqstatus = dss_read_reg(DSS_IRQSTATUS); - if (irqstatus & (1<<0)) /* DISPC_IRQ */ - dispc_irq_handler(); + if (irqstatus & (1<<0)) /* DISPC_IRQ */ + dispc_irq_handler(); #ifdef CONFIG_OMAP2_DSS_DSI - if (irqstatus & (1<<1)) /* DSI_IRQ */ - dsi_irq_handler(); + if (irqstatus & (1<<1)) /* DSI_IRQ */ + dsi_irq_handler(); #endif - + } else { + dispc_irq_handler(); + } return IRQ_HANDLED; } @@ -563,7 +559,7 @@ void dss_set_dac_pwrdn_bgz(bool enable) static int dss_init(bool skip_init) { - int r, dss_irq; + int r; u32 rev; struct resource *dss_mem; @@ -609,18 +605,14 @@ static int dss_init(bool skip_init) REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ #endif - dss_irq = platform_get_irq(dss.pdev, 0); - if (dss_irq < 0) { + dss.irq = platform_get_irq(dss.pdev, 0); + if (dss.irq < 0) { DSSERR("omap2 dss: platform_get_irq failed\n"); r = -ENODEV; goto fail1; } - r = request_irq(dss_irq, - cpu_is_omap24xx() - ? dss_irq_handler_omap2 - : dss_irq_handler_omap3, - 0, "OMAP DSS", NULL); + r = request_irq(dss.irq, dss_irq_handler, 0, "OMAP DSS", NULL); if (r < 0) { DSSERR("omap2 dss: request_irq failed\n"); @@ -648,7 +640,7 @@ static int dss_init(bool skip_init) return 0; fail2: - free_irq(dss_irq, NULL); + free_irq(dss.irq, NULL); fail1: iounmap(dss.base); fail0: @@ -660,7 +652,7 @@ static void dss_exit(void) if (cpu_is_omap34xx()) clk_put(dss.dpll4_m4_ck); - free_irq(INT_24XX_DSS_IRQ, NULL); + free_irq(dss.irq, NULL); iounmap(dss.base); } diff --git a/drivers/video/omap2/dss/dss_features.c b/drivers/video/omap2/dss/dss_features.c index cf3ef69..f3ef929 100644 --- a/drivers/video/omap2/dss/dss_features.c +++ b/drivers/video/omap2/dss/dss_features.c @@ -157,7 +157,7 @@ static struct omap_dss_features omap3430_dss_features = { .has_feature = FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | - FEAT_FUNCGATED, + FEAT_FUNCGATED | FEAT_COMMON_IRQ_DISPC_DSI, .num_mgrs = 2, .num_ovls = 3, @@ -172,7 +172,8 @@ static struct omap_dss_features omap3630_dss_features = { .has_feature = FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL | FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE | - FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED, + FEAT_PRE_MULT_ALPHA | FEAT_FUNCGATED | + FEAT_COMMON_IRQ_DISPC_DSI, .num_mgrs = 2, .num_ovls = 3, diff --git a/drivers/video/omap2/dss/dss_features.h b/drivers/video/omap2/dss/dss_features.h index b9c70be..1c93a49 100644 --- a/drivers/video/omap2/dss/dss_features.h +++ b/drivers/video/omap2/dss/dss_features.h @@ -25,14 +25,15 @@ /* DSS has feature id */ enum dss_feat_id { - FEAT_GLOBAL_ALPHA = 1 << 0, - FEAT_GLOBAL_ALPHA_VID1 = 1 << 1, - FEAT_PRE_MULT_ALPHA = 1 << 2, - FEAT_LCDENABLEPOL = 1 << 3, - FEAT_LCDENABLESIGNAL = 1 << 4, - FEAT_PCKFREEENABLE = 1 << 5, - FEAT_FUNCGATED = 1 << 6, - FEAT_MGR_LCD2 = 1 << 7, + FEAT_GLOBAL_ALPHA = 1 << 0, + FEAT_GLOBAL_ALPHA_VID1 = 1 << 1, + FEAT_PRE_MULT_ALPHA = 1 << 2, + FEAT_LCDENABLEPOL = 1 << 3, + FEAT_LCDENABLESIGNAL = 1 << 4, + FEAT_PCKFREEENABLE = 1 << 5, + FEAT_FUNCGATED = 1 << 6, + FEAT_MGR_LCD2 = 1 << 7, + FEAT_COMMON_IRQ_DISPC_DSI = 1 << 8, }; /* DSS register field id */ -- 1.7.1 -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html