Commit 34c3db6c authored by Andrzej Hajda's avatar Andrzej Hajda Committed by Inki Dae

drm/exynos/decon5433: refactor irq requesting code

To allow runtime validation of mode of work irq request
code should be split into two separate phases:
- irq reqesting,
- irq checking.
Following patches will move 2nd phase to mode validation phase.
Signed-off-by: default avatarAndrzej Hajda <a.hajda@samsung.com>
Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
parent 29c5079d
...@@ -58,6 +58,8 @@ struct decon_context { ...@@ -58,6 +58,8 @@ struct decon_context {
struct regmap *sysreg; struct regmap *sysreg;
struct clk *clks[ARRAY_SIZE(decon_clks_name)]; struct clk *clks[ARRAY_SIZE(decon_clks_name)];
unsigned int irq; unsigned int irq;
unsigned int irq_vsync;
unsigned int irq_lcd_sys;
unsigned int te_irq; unsigned int te_irq;
unsigned long out_type; unsigned long out_type;
int first_win; int first_win;
...@@ -670,20 +672,23 @@ static const struct of_device_id exynos5433_decon_driver_dt_match[] = { ...@@ -670,20 +672,23 @@ static const struct of_device_id exynos5433_decon_driver_dt_match[] = {
MODULE_DEVICE_TABLE(of, exynos5433_decon_driver_dt_match); MODULE_DEVICE_TABLE(of, exynos5433_decon_driver_dt_match);
static int decon_conf_irq(struct decon_context *ctx, const char *name, static int decon_conf_irq(struct decon_context *ctx, const char *name,
irq_handler_t handler, unsigned long int flags, bool required) irq_handler_t handler, unsigned long int flags)
{ {
struct platform_device *pdev = to_platform_device(ctx->dev); struct platform_device *pdev = to_platform_device(ctx->dev);
int ret, irq = platform_get_irq_byname(pdev, name); int ret, irq = platform_get_irq_byname(pdev, name);
if (irq < 0) { if (irq < 0) {
if (irq == -EPROBE_DEFER) switch (irq) {
case -EPROBE_DEFER:
return irq; return irq;
if (required) case -ENODATA:
dev_err(ctx->dev, "cannot get %s IRQ\n", name); case -ENXIO:
else return 0;
irq = 0; default:
dev_err(ctx->dev, "IRQ %s get failed, %d\n", name, irq);
return irq; return irq;
} }
}
irq_set_status_flags(irq, IRQ_NOAUTOEN); irq_set_status_flags(irq, IRQ_NOAUTOEN);
ret = devm_request_irq(ctx->dev, irq, handler, flags, "drm_decon", ctx); ret = devm_request_irq(ctx->dev, irq, handler, flags, "drm_decon", ctx);
if (ret < 0) { if (ret < 0) {
...@@ -738,26 +743,27 @@ static int exynos5433_decon_probe(struct platform_device *pdev) ...@@ -738,26 +743,27 @@ static int exynos5433_decon_probe(struct platform_device *pdev)
return PTR_ERR(ctx->addr); return PTR_ERR(ctx->addr);
} }
if (ctx->out_type & IFTYPE_I80) { ret = decon_conf_irq(ctx, "vsync", decon_irq_handler, 0);
ret = decon_conf_irq(ctx, "lcd_sys", decon_irq_handler, 0, true);
if (ret < 0) if (ret < 0)
return ret; return ret;
ctx->irq = ret; ctx->irq_vsync = ret;
ret = decon_conf_irq(ctx, "lcd_sys", decon_irq_handler, 0);
if (ret < 0)
return ret;
ctx->irq_lcd_sys = ret;
ctx->irq = (ctx->out_type & IFTYPE_I80) ? ctx->irq_lcd_sys
: ctx->irq_vsync;
ret = decon_conf_irq(ctx, "te", decon_te_irq_handler, ret = decon_conf_irq(ctx, "te", decon_te_irq_handler,
IRQF_TRIGGER_RISING, false); IRQF_TRIGGER_RISING);
if (ret < 0) if (ret < 0)
return ret; return ret;
if (ret) { if (ret) {
ctx->te_irq = ret; ctx->te_irq = ret;
ctx->out_type &= ~I80_HW_TRG; ctx->out_type &= ~I80_HW_TRG;
} }
} else {
ret = decon_conf_irq(ctx, "vsync", decon_irq_handler, 0, true);
if (ret < 0)
return ret;
ctx->irq = ret;
}
if (ctx->out_type & I80_HW_TRG) { if (ctx->out_type & I80_HW_TRG) {
ctx->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node, ctx->sysreg = syscon_regmap_lookup_by_phandle(dev->of_node,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment