twl4030-gpio: cleanup debounce
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. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
					parent
					
						
							
								ba6c4033b9
							
						
					
				
			
			
				commit
				
					
						cabb3fc4bd
					
				
			
		
					 2 changed files with 26 additions and 37 deletions
				
			
		| 
						 | 
					@ -202,37 +202,6 @@ static int twl4030_get_gpio_datain(int gpio)
 | 
				
			||||||
	return ret;
 | 
						return 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)
 | 
					static int twl_request(struct gpio_chip *chip, unsigned offset)
 | 
				
			||||||
| 
						 | 
					@ -405,6 +374,23 @@ static int __devinit gpio_twl4030_pulls(u32 ups, u32 downs)
 | 
				
			||||||
				REG_GPIOPUPDCTR1, 5);
 | 
									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 gpio_twl4030_remove(struct platform_device *pdev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int __devinit gpio_twl4030_probe(struct platform_device *pdev)
 | 
					static int __devinit gpio_twl4030_probe(struct platform_device *pdev)
 | 
				
			||||||
| 
						 | 
					@ -439,6 +425,12 @@ no_irqs:
 | 
				
			||||||
				pdata->pullups, pdata->pulldowns,
 | 
									pdata->pullups, pdata->pulldowns,
 | 
				
			||||||
				ret);
 | 
									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.base = pdata->gpio_base;
 | 
				
			||||||
	twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
 | 
						twl_gpiochip.ngpio = TWL4030_GPIO_MAX;
 | 
				
			||||||
	twl_gpiochip.dev = &pdev->dev;
 | 
						twl_gpiochip.dev = &pdev->dev;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -234,6 +234,9 @@ struct twl4030_gpio_platform_data {
 | 
				
			||||||
	/* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */
 | 
						/* gpio-n should control VMMC(n+1) if BIT(n) in mmc_cd is set */
 | 
				
			||||||
	u8		mmc_cd;
 | 
						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
 | 
						/* For gpio-N, bit (1 << N) in "pullups" is set if that pullup
 | 
				
			||||||
	 * should be enabled.  Else, if that bit is set in "pulldowns",
 | 
						 * should be enabled.  Else, if that bit is set in "pulldowns",
 | 
				
			||||||
	 * that pulldown is enabled.  Don't waste power by letting any
 | 
						 * that pulldown is enabled.  Don't waste power by letting any
 | 
				
			||||||
| 
						 | 
					@ -307,12 +310,6 @@ int twl4030_sih_setup(int module);
 | 
				
			||||||
#define TWL4030_VAUX3_DEV_GRP		0x1F
 | 
					#define TWL4030_VAUX3_DEV_GRP		0x1F
 | 
				
			||||||
#define TWL4030_VAUX3_DEDICATED		0x22
 | 
					#define TWL4030_VAUX3_DEDICATED		0x22
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					 | 
				
			||||||
 * 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) || \
 | 
					#if defined(CONFIG_TWL4030_BCI_BATTERY) || \
 | 
				
			||||||
	defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
 | 
						defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue