On Thu, Aug 07, 2008 at 10:22:36AM +0200, Dominik Brodowski wrote:
> what's your take on this?

Rather too complex for starters.

> @@ -226,7 +226,23 @@ static int pxa2xx_drv_pcmcia_resume(struct 
> platform_device *dev)
>       struct pcmcia_low_level *ops = dev->dev.platform_data;
>       int nr = ops ? ops->nr : 0;
>  
> -     MECR = nr > 1 ? MECR_CIT | MECR_NOS : (nr > 0 ? MECR_CIT : 0);
> +     if (nr > 0) {
> +             u32 quirks = ops ? ops->quirks : 0;
> +             int v;
> +
> +             /*
> +              * We have at least one socket, so set MECR:CIT
> +              * (Card Is There)
> +              */
> +             v = MECR_CIT;
> +
> +             /* Set MECR:NOS (Number Of Sockets) */
> +             if (nr > 1 || (quirks & PXA2XX_QUIRK_NEEDS_MECR_NOS))
> +                     v |= MECR_NOS;
> +
> +             MECR = v;
> +     } else
> +             MECR = 0;

Surely if we have initialised PCMCIA, we know that we have more than one
socket, so why bother testing 'nr > 0' ?  ops also will never be null
here - in the probe function, we do:

        if (!dev || !dev->platform_data)
                return -ENODEV;

so its impossible for the driver to initialise with NULL platform data.

Also, the setting of MECR should be moved to a separate static function -
the setup should be indentical for both the successful probe and the
resume paths.

Finally, the question of setting MECR itself.  I think there's more to
the support than what we see here - MECR doesn't power on the PCMCIA
sockets...  Maybe that's a misunderstanding because of the loseness of
the patch description.

-- 
Russell King
 Linux kernel    2.6 ARM Linux   - http://www.arm.linux.org.uk/
 maintainer of:

_______________________________________________
Linux PCMCIA reimplementation list
http://lists.infradead.org/mailman/listinfo/linux-pcmcia

Reply via email to