From: David Brownell Date: Tue, 14 Oct 2008 19:01:43 +0000 (-0700) Subject: twl4030 MMC card detction X-Git-Tag: v2.6.27-omap1~29 X-Git-Url: http://pilppa.com/gitweb/?a=commitdiff_plain;h=21f8e7217a67016dee8385aa0964fd7f9eb4f2e3;p=linux-2.6-omap-h63xx.git twl4030 MMC card detction Replace stubbed-out card-detect support for twl4030 GPIOs with a simpler platform_data mechanism. As before, no current users. Sanity tested by enabling this on Beagle; it booted OK with root on MMC. Signed-off-by: David Brownell Signed-off-by: Tony Lindgren --- diff --git a/drivers/gpio/twl4030-gpio.c b/drivers/gpio/twl4030-gpio.c index e4974364cd9..37d3eec8730 100644 --- a/drivers/gpio/twl4030-gpio.c +++ b/drivers/gpio/twl4030-gpio.c @@ -46,8 +46,6 @@ * intended to support multiple hosts. * * There are also two LED pins used sometimes as output-only GPIOs. - * - * FIXME code currently only handles the first IRQ line. */ @@ -235,41 +233,6 @@ int twl4030_set_gpio_debounce(int gpio, int enable) } EXPORT_SYMBOL(twl4030_set_gpio_debounce); -#if 0 -/* - * Configure Card detect for GPIO pin on TWL4030 - * - * This means: VMMC1 or VMMC2 is enabled or disabled based - * on the status of GPIO-0 or GPIO-1 pins (respectively). - */ -int twl4030_set_gpio_card_detect(int gpio, int enable) -{ - u8 reg = 0; - u8 msk = (1 << gpio); - int ret = 0; - - /* Only GPIO 0 or 1 can be used for CD feature.. */ - if (unlikely((gpio >= TWL4030_GPIO_MAX) - || !(gpio_usage_count & BIT(gpio)) - || (gpio >= TWL4030_GPIO_MAX_CD))) { - return -EPERM; - } - - mutex_lock(&gpio_lock); - ret = gpio_twl4030_read(REG_GPIO_CTRL); - if (ret >= 0) { - if (enable) - reg = (u8) (ret | msk); - else - reg = (u8) (ret & ~msk); - - ret = gpio_twl4030_write(REG_GPIO_CTRL, reg); - } - mutex_unlock(&gpio_lock); - return ret; -} -#endif - /*----------------------------------------------------------------------*/ static int twl_request(struct gpio_chip *chip, unsigned offset) @@ -317,9 +280,18 @@ static int twl_request(struct gpio_chip *chip, unsigned offset) } /* on first use, turn GPIO module "on" */ - if (!gpio_usage_count) - status = gpio_twl4030_write(REG_GPIO_CTRL, - MASK_GPIO_CTRL_GPIO_ON); + if (!gpio_usage_count) { + struct twl4030_gpio_platform_data *pdata; + u8 value = MASK_GPIO_CTRL_GPIO_ON; + + /* optionally have the first two GPIOs switch vMMC1 + * and vMMC2 power supplies based on card presence. + */ + pdata = chip->dev->platform_data; + value |= pdata->mmc_cd & 0x03; + + status = gpio_twl4030_write(REG_GPIO_CTRL, value); + } if (!status) gpio_usage_count |= (0x1 << offset); diff --git a/include/linux/i2c/twl4030.h b/include/linux/i2c/twl4030.h index 03b948287c9..fb604dcd38f 100644 --- a/include/linux/i2c/twl4030.h +++ b/include/linux/i2c/twl4030.h @@ -231,6 +231,9 @@ struct twl4030_gpio_platform_data { /* package the two LED signals as output-only GPIOs? */ bool use_leds; + /* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */ + u8 mmc_cd; + /* For gpio-N, bit (1 << N) in "pullups" is set if that pullup * should be enabled. Else, if that bit is set in "pulldowns", * that pulldown is enabled. Don't waste power by letting any