twl4030-gpio debounce cleanup
PATCH 2/2 twl4030-gpio debounce cleanup
From: David Brownell <[email protected]>
Provide a static debounce configuration mechanism for twl4030 GPIOs, replacing the previous dynamic one. The single user of that mechanism was for MMC card detect debouncing.
Boards can provide a bitmask saying which GPIOs to debounce (30 msec). It's always enabled for pins with the MMC card-detect/VMMCx link active, so most boards won't need to set the debounce mask.
This is a net code shrink, including runtime footprint.
---
I'll submit this to mainline as soon as I get appropriate acks/signoffs here.
drivers/gpio/twl4030-gpio.c | 54 +++++++++++++++++------------------------- include/linux/i2c/twl4030.h | 9 ++----- 2 files changed, 26 insertions(+), 37 deletions(-)
drivers/gpio/twl4030-gpio.c +23 -31
@@ -202,37 +202,6 @@ static int twl4030_get_gpio_datain(int greturn ret; } -/* -* Configure debounce timing value for a GPIO pin on TWL4030 -*/ -int twl4030_set_gpio_debounce (int gpio,int enable) -{ -u8 d_bnk = gpio >>3 ; -u8 d_msk =BIT (gpio &0x7 ); -u8 reg =0 ; -u8 base =0 ; -int ret =0 ; - -if (unlikely ((gpio >=TWL4030_GPIO_MAX ) - || !(gpio_usage_count &BIT (gpio)))) -return -EPERM ; - - base =REG_GPIO_DEBEN1 + d_bnk; -mutex_lock (&gpio_lock); - ret =gpio_twl4030_read (base); -if (ret >=0 ) { -if (enable) - reg = ret | d_msk; -else - reg = ret & ~d_msk; - - ret =gpio_twl4030_write (base, reg); - } -mutex_unlock (&gpio_lock); -return ret; -} -EXPORT_SYMBOL (twl4030_set_gpio_debounce); -/*----------------------------------------------------------------------*/ static int twl_request (struct gpio_chip *chip,unsigned offset)
@@ -405,6 +374,23 @@ static int __devinit gpio_twl4030_pulls( REG_GPIOPUPDCTR1, 5); } +static int __devinit gpio_twl4030_debounce (u32 debounce,u8 mmc_cd) +{ +u8 message[4 ]; + +/* 30 msec of debouncing is always used for MMC card detect, +* and is optional for everything else. +*/ + message[1 ] = (debounce &0xff ) | (mmc_cd &0x03 ); + debounce >>=8 ; + message[2 ] = (debounce &0xff ); + debounce >>=8 ; + message[3 ] = (debounce &0x03 ); + +return twl4030_i2c_write (TWL4030_MODULE_GPIO , message, +REG_GPIO_DEBEN1 ,3 ); +} +static int gpio_twl4030_remove (struct platform_device *pdev);static int __devinit gpio_twl4030_probe (struct platform_device *pdev)
@@ -439,6 +425,12 @@ no_irqs: pdata->pullups, pdata->pulldowns, ret); + ret =gpio_twl4030_debounce (pdata->debounce, pdata->mmc_cd); +if (ret) +dev_dbg (&pdev->dev,"debounce %.03x %.01x --> %d\n" , + pdata->debounce, pdata->mmc_cd, + ret); + twl_gpiochip.base = pdata->gpio_base; twl_gpiochip.ngpio =TWL4030_GPIO_MAX ; twl_gpiochip.dev = &pdev->dev;
include/linux/i2c/twl4030.h +3 -6
@@ -234,6 +234,9 @@ struct twl4030_gpio_platform_data {/* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */ u8 mmc_cd; +/* if BIT(N) is set, or VMMC(n+1) is linked, debounce GPIO-N */ +u32 debounce; +/* 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
@@ -390,12 +393,6 @@ int twl4030_sih_setup(int module);#define TWL4030_GPIO_IRQ_NO (n) (TWL4030_GPIO_IRQ_BASE + (n)) -/* -* Exported TWL4030 GPIO APIs -* -* WARNING -- use standard GPIO and IRQ calls instead; these will vanish. -*/ -int twl4030_set_gpio_debounce (int gpio,int enable);#if defined(CONFIG_TWL4030_BCI_BATTERY ) || \ defined(CONFIG_TWL4030_BCI_BATTERY_MODULE )
Quoted 10 lines · David Brownell
From: David Brownell <[email protected]>
Provide a static debounce configuration mechanism for twl4030 GPIOs, replacing the previous dynamic one. The single user of that mechanism was for MMC card detect debouncing.
Boards can provide a bitmask saying which GPIOs to debounce (30 msec). It's always enabled for pins with the MMC card-detect/VMMCx link active, so most boards won't need to set the debounce mask.
Quoted 6 lines
This is a net code shrink, including runtime footprint.
Signed-off-by David Brownell <[email protected]>---
I'll submit this to mainline as soon as I get appropriate acks/signoffs here.
Shouldn't you update hsmmc.c as well ??
Quoted 111 lines
drivers/gpio/twl4030-gpio.c | 54 +++++++++++++++++------------------------- include/linux/i2c/twl4030.h | 9 ++----- 2 files changed, 26 insertions(+), 37 deletions(-)drivers/gpio/twl4030-gpio.c +23
-31@@ -202,37 +202,6 @@ static int twl4030_get_gpio_datain(int greturn ret; } -/* -* Configure debounce timing value for a GPIO pin on TWL4030 -*/ -int twl4030_set_gpio_debounce (int gpio,int enable) -{ -u8 d_bnk = gpio >>3 ; -u8 d_msk =BIT (gpio &0x7 ); -u8 reg =0 ; -u8 base =0 ; -int ret =0 ; - -if (unlikely ((gpio >=TWL4030_GPIO_MAX ) - || !(gpio_usage_count &BIT (gpio)))) -return -EPERM ; - - base =REG_GPIO_DEBEN1 + d_bnk; -mutex_lock (&gpio_lock); - ret =gpio_twl4030_read (base); -if (ret >=0 ) { -if (enable) - reg = ret | d_msk; -else - reg = ret & ~d_msk; - - ret =gpio_twl4030_write (base, reg); - } -mutex_unlock (&gpio_lock); -return ret; -} -EXPORT_SYMBOL (twl4030_set_gpio_debounce); -/*----------------------------------------------------------------------*/ static int twl_request (struct gpio_chip *chip,unsigned offset)@@ -405,6 +374,23 @@ static int __devinit gpio_twl4030_pulls( REG_GPIOPUPDCTR1, 5); } +static int __devinit gpio_twl4030_debounce (u32 debounce,u8 mmc_cd) +{ +u8 message[4 ]; + +/* 30 msec of debouncing is always used for MMC card detect, +* and is optional for everything else. +*/ + message[1 ] = (debounce &0xff ) | (mmc_cd &0x03 ); + debounce >>=8 ; + message[2 ] = (debounce &0xff ); + debounce >>=8 ; + message[3 ] = (debounce &0x03 ); + +return twl4030_i2c_write (TWL4030_MODULE_GPIO , message, +REG_GPIO_DEBEN1 ,3 ); +} +static int gpio_twl4030_remove (struct platform_device *pdev);static int __devinit gpio_twl4030_probe (struct platform_device *pdev)@@ -439,6 +425,12 @@ no_irqs: pdata->pullups, pdata->pulldowns, ret); + ret =gpio_twl4030_debounce (pdata->debounce, pdata->mmc_cd); +if (ret) +dev_dbg (&pdev->dev,"debounce %.03x %.01x --> %d\n" , + pdata->debounce, pdata->mmc_cd, + ret); + twl_gpiochip.base = pdata->gpio_base; twl_gpiochip.ngpio =TWL4030_GPIO_MAX ; twl_gpiochip.dev = &pdev->dev;include/linux/i2c/twl4030.h +3
-7@@ -234,6 +234,9 @@ struct twl4030_gpio_platform_data {/* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */ u8 mmc_cd; +/* if BIT(N) is set, or VMMC(n+1) is linked, debounce GPIO-N */ +u32 debounce; +/* 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 @@ -390,12 +393,6 @@ int twl4030_sih_setup(int module);#define TWL4030_GPIO_IRQ_NO (n) (TWL4030_GPIO_IRQ_BASE + (n)) -/* -* Exported TWL4030 GPIO APIs -* -* WARNING -- use standard GPIO and IRQ calls instead; these will vanish. -*/ -int twl4030_set_gpio_debounce (int gpio,int enable);#if defined(CONFIG_TWL4030_BCI_BATTERY ) || \ defined(CONFIG_TWL4030_BCI_BATTERY_MODULE ) --To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Signature · 1 line
balbi
Quoted 10 lines · Felipe Balbi
Quoted 8 lines
Provide a static debounce configuration mechanism for twl4030 GPIOs, replacing the previous dynamic one. The single user of that mechanism was for MMC card detect debouncing.
Boards can provide a bitmask saying which GPIOs to debounce (30 msec). It's always enabled for pins with the MMC card-detect/VMMCx link active, so most boards won't need to set the debounce mask.
Shouldn't you update
hsmmc.cas well ??
In some way one of the other patches didn't??
... I don't understand what you're implying.
(Though the GPIO code might need to support the
other mode -- active high vs low -- for the card detect-to-VMMCx linkage.)
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 10 lines · David Brownell
Quoted 9 lines · Felipe Balbi
Quoted 8 lines
Provide a static debounce configuration mechanism for twl4030 GPIOs, replacing the previous dynamic one. The single user of that mechanism was for MMC card detect debouncing.
Boards can provide a bitmask saying which GPIOs to debounce (30 msec). It's always enabled for pins with the MMC card-detect/VMMCx link active, so most boards won't need to set the debounce mask.
Quoted 8 lines
Quoted 1 line
Shouldn't you update
hsmmc.cas well ??In some way one of the other patches didn't??
... I don't understand what you're implying.(Though the GPIO code might need to support the
other mode -- active high vs low -- for the card
detect-to-VMMCx linkage.)
I got your patches and build tested them, hsmmc.c still had twl4030_gpio_debounce call. Maybe I missed one of the patches then.
Signature · 5 lines
balbi -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html
Quoted 2 lines · Felipe Balbi
I got your patches and build tested them,
hsmmc.cstill hadtwl4030_gpio_debouncecall. Maybe I missed one of the patches then.
Grab current GIT.
Quoted 5 lines · David Brownell
Quoted 2 lines · Felipe Balbi
I got your patches and build tested them,
hsmmc.cstill hadtwl4030_gpio_debouncecall. Maybe I missed one of the patches then.Grab current GIT.
Ugh, missed that :-p
haha. Thanks
Signature · 1 line
balbi