diff options
Diffstat (limited to 'drivers/staging/most/dim2/dim2.c')
-rw-r--r-- | drivers/staging/most/dim2/dim2.c | 57 |
1 files changed, 23 insertions, 34 deletions
diff --git a/drivers/staging/most/dim2/dim2.c b/drivers/staging/most/dim2/dim2.c index bd102329d8c8..97dff82b7a5f 100644 --- a/drivers/staging/most/dim2/dim2.c +++ b/drivers/staging/most/dim2/dim2.c @@ -45,9 +45,6 @@ MODULE_PARM_DESC(fcnt, "Num of frames per sub-buffer for sync channels as a powe static DEFINE_SPINLOCK(dim_lock); -static void dim2_tasklet_fn(unsigned long data); -static DECLARE_TASKLET_OLD(dim2_tasklet, dim2_tasklet_fn); - /** * struct hdm_channel - private structure to keep channel specific data * @name: channel name @@ -361,15 +358,9 @@ static irqreturn_t dim2_mlb_isr(int irq, void *_dev) return IRQ_HANDLED; } -/** - * dim2_tasklet_fn - tasklet function - * @data: private data - * - * Service each initialized channel, if needed - */ -static void dim2_tasklet_fn(unsigned long data) +static irqreturn_t dim2_task_irq(int irq, void *_dev) { - struct dim2_hdm *dev = (struct dim2_hdm *)data; + struct dim2_hdm *dev = _dev; unsigned long flags; int ch_idx; @@ -385,6 +376,8 @@ static void dim2_tasklet_fn(unsigned long data) while (!try_start_dim_transfer(dev->hch + ch_idx)) continue; } + + return IRQ_HANDLED; } /** @@ -392,8 +385,8 @@ static void dim2_tasklet_fn(unsigned long data) * @irq: irq number * @_dev: private data * - * Acknowledge the interrupt and schedule a tasklet to service channels. - * Return IRQ_HANDLED. + * Acknowledge the interrupt and service each initialized channel, + * if needed, in task context. */ static irqreturn_t dim2_ahb_isr(int irq, void *_dev) { @@ -405,9 +398,7 @@ static irqreturn_t dim2_ahb_isr(int irq, void *_dev) dim_service_ahb_int_irq(get_active_channels(dev, buffer)); spin_unlock_irqrestore(&dim_lock, flags); - dim2_tasklet.data = (unsigned long)dev; - tasklet_schedule(&dim2_tasklet); - return IRQ_HANDLED; + return IRQ_WAKE_THREAD; } /** @@ -654,14 +645,12 @@ static int poison_channel(struct most_interface *most_iface, int ch_idx) if (!hdm_ch->is_initialized) return -EPERM; - tasklet_disable(&dim2_tasklet); spin_lock_irqsave(&dim_lock, flags); hal_ret = dim_destroy_channel(&hdm_ch->ch); hdm_ch->is_initialized = false; if (ch_idx == dev->atx_idx) dev->atx_idx = -1; spin_unlock_irqrestore(&dim_lock, flags); - tasklet_enable(&dim2_tasklet); if (hal_ret != DIM_NO_ERROR) { pr_err("HAL Failed to close channel %s\n", hdm_ch->name); ret = -EFAULT; @@ -821,8 +810,8 @@ static int dim2_probe(struct platform_device *pdev) goto err_shutdown_dim; } - ret = devm_request_irq(&pdev->dev, irq, dim2_ahb_isr, 0, - "dim2_ahb0_int", dev); + ret = devm_request_threaded_irq(&pdev->dev, irq, dim2_ahb_isr, + dim2_task_irq, 0, "dim2_ahb0_int", dev); if (ret) { dev_err(&pdev->dev, "failed to request ahb0_int irq %d\n", irq); goto err_shutdown_dim; @@ -971,7 +960,7 @@ static void fsl_mx6_disable(struct platform_device *pdev) clk_disable_unprepare(dev->clk); } -static int rcar_h2_enable(struct platform_device *pdev) +static int rcar_gen2_enable(struct platform_device *pdev) { struct dim2_hdm *dev = platform_get_drvdata(pdev); int ret; @@ -1006,7 +995,7 @@ static int rcar_h2_enable(struct platform_device *pdev) return 0; } -static void rcar_h2_disable(struct platform_device *pdev) +static void rcar_gen2_disable(struct platform_device *pdev) { struct dim2_hdm *dev = platform_get_drvdata(pdev); @@ -1016,7 +1005,7 @@ static void rcar_h2_disable(struct platform_device *pdev) writel(0x0, dev->io_base + 0x600); } -static int rcar_m3_enable(struct platform_device *pdev) +static int rcar_gen3_enable(struct platform_device *pdev) { struct dim2_hdm *dev = platform_get_drvdata(pdev); u32 enable_512fs = dev->clk_speed == CLK_512FS; @@ -1046,7 +1035,7 @@ static int rcar_m3_enable(struct platform_device *pdev) return 0; } -static void rcar_m3_disable(struct platform_device *pdev) +static void rcar_gen3_disable(struct platform_device *pdev) { struct dim2_hdm *dev = platform_get_drvdata(pdev); @@ -1058,20 +1047,20 @@ static void rcar_m3_disable(struct platform_device *pdev) /* ]] platform specific functions */ -enum dim2_platforms { FSL_MX6, RCAR_H2, RCAR_M3 }; +enum dim2_platforms { FSL_MX6, RCAR_GEN2, RCAR_GEN3 }; static struct dim2_platform_data plat_data[] = { [FSL_MX6] = { .enable = fsl_mx6_enable, .disable = fsl_mx6_disable, }, - [RCAR_H2] = { - .enable = rcar_h2_enable, - .disable = rcar_h2_disable, + [RCAR_GEN2] = { + .enable = rcar_gen2_enable, + .disable = rcar_gen2_disable, }, - [RCAR_M3] = { - .enable = rcar_m3_enable, - .disable = rcar_m3_disable, + [RCAR_GEN3] = { + .enable = rcar_gen3_enable, + .disable = rcar_gen3_disable, .fcnt = 3, }, }; @@ -1083,11 +1072,11 @@ static const struct of_device_id dim2_of_match[] = { }, { .compatible = "renesas,mlp", - .data = plat_data + RCAR_H2 + .data = plat_data + RCAR_GEN2 }, { - .compatible = "rcar,medialb-dim2", - .data = plat_data + RCAR_M3 + .compatible = "renesas,rcar-gen3-mlp", + .data = plat_data + RCAR_GEN3 }, { .compatible = "xlnx,axi4-os62420_3pin-1.00.a", |