[PATCH 02/12] ARM: ep93xx: vision_ep9307: Use MMC CD and RO GPIO

H Hartley Sweeten hartleys at visionengravers.com
Thu Jul 25 20:19:52 EDT 2013


On Thursday, July 25, 2013 4:27 PM, Laurent Pinchart wrote:
>
> Pass the CD and RO GPIO numbers to the MMC SPI driver and remove the
> custom .get_cd() and .get_ro() callback functions.
>
> Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas at ideasonboard.com>
> ---
>  arch/arm/mach-ep93xx/vision_ep9307.c | 56 +++---------------------------------
>  1 file changed, 4 insertions(+), 52 deletions(-)
>
> diff --git a/arch/arm/mach-ep93xx/vision_ep9307.c b/arch/arm/mach-ep93xx/vision_ep9307.c
> index 605956f..ab94dc5 100644
> --- a/arch/arm/mach-ep93xx/vision_ep9307.c
> +++ b/arch/arm/mach-ep93xx/vision_ep9307.c
> @@ -224,62 +224,14 @@ static struct ep93xx_spi_chip_ops vision_spi_flash_hw = {
>  #define VISION_SPI_MMC_WP	EP93XX_GPIO_LINE_F(0)
>  #define VISION_SPI_MMC_CD	EP93XX_GPIO_LINE_EGPIO15
>  
> -static struct gpio vision_spi_mmc_gpios[] = {
> -	{ VISION_SPI_MMC_WP, GPIOF_DIR_IN, "mmc_spi:wp" },
> -	{ VISION_SPI_MMC_CD, GPIOF_DIR_IN, "mmc_spi:cd" },
> -};
> -
> -static int vision_spi_mmc_init(struct device *pdev,
> -			irqreturn_t (*func)(int, void *), void *pdata)
> -{
> -	int err;
> -
> -	err = gpio_request_array(vision_spi_mmc_gpios,
> -				 ARRAY_SIZE(vision_spi_mmc_gpios));
> -	if (err)
> -		return err;
> -
> -	err = gpio_set_debounce(VISION_SPI_MMC_CD, 1);
> -	if (err)
> -		goto exit_err;

I tested this and it _kind_ of works.

The card detect is a bit flaky due to the gpio interrupt debounce not being enabled.

The only way I can see to fix this is add the following to this patch:

@@ -233,8 +233,31 @@ static struct mmc_spi_platform_data vision_spi_mmc_data = {
        .caps2          = MMC_CAP2_RO_ACTIVE_HIGH,
 };
 
+static int vision_spi_mmc_enable_cd_debounce(struct spi_device *spi)
+{
+       int ret;
+
+       ret = gpio_request_one(VISION_SPI_MMC_CD, GPIOF_DIR_IN, spi->modalias);
+       if (ret)
+               return ret;
+
+       ret = gpio_set_debounce(VISION_SPI_MMC_CD, 1);
+       if (ret)
+               return ret;
+
+       gpio_free(VISION_SPI_MMC_CD);
+
+       return 0;
+}
+
 static int vision_spi_mmc_hw_setup(struct spi_device *spi)
 {
+       int ret;
+
+       ret = vision_spi_mmc_enable_cd_debounce(spi);
+       if (ret)
+               return ret;
+
        return gpio_request_one(VISION_SPI_MMC_CS, GPIOF_INIT_HIGH,
                                spi->modalias);
 }

Regards,
Hartley




More information about the linux-arm-kernel mailing list