On Mon, Apr 02 2018, Christian Lütke-Stetzkamp wrote:

> The request of the irq line is not correctly handled by the current
> code, platform_get_irq may fail and if the irq is requested via
> devm_request_irq, its release is automatically done.
>
> Signed-off-by: Christian Lütke-Stetzkamp <christ...@lkamp.de>
> ---
>  drivers/staging/mt7621-mmc/sd.c | 29 +++++++++++++----------------
>  1 file changed, 13 insertions(+), 16 deletions(-)
>
> diff --git a/drivers/staging/mt7621-mmc/sd.c b/drivers/staging/mt7621-mmc/sd.c
> index e709e4d47965..95c439069c2b 100644
> --- a/drivers/staging/mt7621-mmc/sd.c
> +++ b/drivers/staging/mt7621-mmc/sd.c
> @@ -2696,7 +2696,7 @@ static int msdc_drv_probe(struct platform_device *pdev)
>       struct mmc_host *mmc;
>       struct msdc_host *host;
>       struct msdc_hw *hw;
> -     int ret, irq;
> +     int ret;
>  
>       hw = &msdc0_hw;
>  
> @@ -2708,10 +2708,6 @@ static int msdc_drv_probe(struct platform_device *pdev)
>       if (!mmc)
>               return -ENOMEM;
>  
> -     irq  = platform_get_irq(pdev, 0);
> -
> -     //BUG_ON((!hw) || (!mem) || (irq < 0)); /* --- by chhung */
> -
>       res = platform_get_resource(pdev, IORESOURCE_MEM, 0)
>       base = devm_ioremap_resource(&pdev->dev, res);
>       if (IS_ERR(base)) {
> @@ -2756,7 +2752,13 @@ static int msdc_drv_probe(struct platform_device *pdev)
>       if (host->id < 0 || host->id >= 4)
>               host->id = 0;
>       host->error     = 0;
> -     host->irq       = irq;
> +
> +     host->irq       = platform_get_irq(pdev, 0);
> +     if (host->irq < 0) {
> +             ret = -EINVAL;
> +             goto host_free;
> +     }
> +
>       host->base      = (unsigned long)base;
>       host->mclk      = 0;                   /* mclk: the request clock of 
> mmc sub-system */
>       host->hclk      = hclks[hw->clk_src];  /* hclk: clock of clock source 
> to msdc controller */
> @@ -2801,20 +2803,18 @@ static int msdc_drv_probe(struct platform_device 
> *pdev)
>       spin_lock_init(&host->lock);
>       msdc_init_hw(host);
>  
> -     if (ralink_soc == MT762X_SOC_MT7621AT)
> -             ret = request_irq((unsigned int)irq, msdc_irq, 0, 
> dev_name(&pdev->dev), host);
> -     else
> -             ret = request_irq((unsigned int)irq, msdc_irq, 
> IRQF_TRIGGER_LOW, dev_name(&pdev->dev), host);
> -
> +     //TODO check weather flags 0 is correct, the mtk-sd driver uses
> +     //IRQF_TRIGGER_LOW | IRQF_ONESHOT for flags
> +     ret = devm_request_irq(&pdev->dev, host->irq, msdc_irq, 0, pdev->name,
> +                            host);

I think the modern approach is to leave the flags as zero, and set flags
via devicetree.
sdhci has
                interrupt-parent = <&gic>;
                interrupts = <GIC_SHARED 20 IRQ_TYPE_LEVEL_HIGH>;

in device tree, so maybe the 7621 is inverted with respect to other mt
chips?

Thanks,
NeilBrown

Attachment: signature.asc
Description: PGP signature

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to