Commit 309e1e42 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-next' of git://git.o-hand.com/linux-mfd

* 'for-next' of git://git.o-hand.com/linux-mfd:
  mfd: check for platform_get_irq() return value in sm501
  mfd: use pci_ioremap_bar() in sm501
  mfd: Don't store volatile bits in WM8350 register cache
  mfd: don't export wm3850 static functions
  mfd: twl4030-gpio driver
  mfd: rtc-twl4030 driver
  mfd: twl4030 IRQ handling update
parents 724bdd09 7cf5244c
...@@ -127,6 +127,13 @@ config GPIO_PCF857X ...@@ -127,6 +127,13 @@ config GPIO_PCF857X
This driver provides an in-kernel interface to those GPIOs using This driver provides an in-kernel interface to those GPIOs using
platform-neutral GPIO calls. platform-neutral GPIO calls.
config GPIO_TWL4030
tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
depends on TWL4030_CORE
help
Say yes here to access the GPIO signals of various multi-function
power management chips from Texas Instruments.
comment "PCI GPIO expanders:" comment "PCI GPIO expanders:"
config GPIO_BT8XX config GPIO_BT8XX
......
...@@ -9,4 +9,5 @@ obj-$(CONFIG_GPIO_MAX732X) += max732x.o ...@@ -9,4 +9,5 @@ obj-$(CONFIG_GPIO_MAX732X) += max732x.o
obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o obj-$(CONFIG_GPIO_MCP23S08) += mcp23s08.o
obj-$(CONFIG_GPIO_PCA953X) += pca953x.o obj-$(CONFIG_GPIO_PCA953X) += pca953x.o
obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o obj-$(CONFIG_GPIO_PCF857X) += pcf857x.o
obj-$(CONFIG_GPIO_TWL4030) += twl4030-gpio.o
obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o obj-$(CONFIG_GPIO_BT8XX) += bt8xxgpio.o
This diff is collapsed.
...@@ -17,7 +17,7 @@ wm8350-objs := wm8350-core.o wm8350-regmap.o wm8350-gpio.o ...@@ -17,7 +17,7 @@ wm8350-objs := wm8350-core.o wm8350-regmap.o wm8350-gpio.o
obj-$(CONFIG_MFD_WM8350) += wm8350.o obj-$(CONFIG_MFD_WM8350) += wm8350.o
obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o obj-$(CONFIG_MFD_WM8350_I2C) += wm8350-i2c.o
obj-$(CONFIG_TWL4030_CORE) += twl4030-core.o obj-$(CONFIG_TWL4030_CORE) += twl4030-core.o twl4030-irq.o
obj-$(CONFIG_MFD_CORE) += mfd-core.o obj-$(CONFIG_MFD_CORE) += mfd-core.o
......
...@@ -1374,31 +1374,31 @@ static int sm501_init_dev(struct sm501_devdata *sm) ...@@ -1374,31 +1374,31 @@ static int sm501_init_dev(struct sm501_devdata *sm)
static int sm501_plat_probe(struct platform_device *dev) static int sm501_plat_probe(struct platform_device *dev)
{ {
struct sm501_devdata *sm; struct sm501_devdata *sm;
int err; int ret;
sm = kzalloc(sizeof(struct sm501_devdata), GFP_KERNEL); sm = kzalloc(sizeof(struct sm501_devdata), GFP_KERNEL);
if (sm == NULL) { if (sm == NULL) {
dev_err(&dev->dev, "no memory for device data\n"); dev_err(&dev->dev, "no memory for device data\n");
err = -ENOMEM; ret = -ENOMEM;
goto err1; goto err1;
} }
sm->dev = &dev->dev; sm->dev = &dev->dev;
sm->pdev_id = dev->id; sm->pdev_id = dev->id;
sm->irq = platform_get_irq(dev, 0);
sm->io_res = platform_get_resource(dev, IORESOURCE_MEM, 1);
sm->mem_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
sm->platdata = dev->dev.platform_data; sm->platdata = dev->dev.platform_data;
if (sm->irq < 0) { ret = platform_get_irq(dev, 0);
if (ret < 0) {
dev_err(&dev->dev, "failed to get irq resource\n"); dev_err(&dev->dev, "failed to get irq resource\n");
err = sm->irq;
goto err_res; goto err_res;
} }
sm->irq = ret;
sm->io_res = platform_get_resource(dev, IORESOURCE_MEM, 1);
sm->mem_res = platform_get_resource(dev, IORESOURCE_MEM, 0);
if (sm->io_res == NULL || sm->mem_res == NULL) { if (sm->io_res == NULL || sm->mem_res == NULL) {
dev_err(&dev->dev, "failed to get IO resource\n"); dev_err(&dev->dev, "failed to get IO resource\n");
err = -ENOENT; ret = -ENOENT;
goto err_res; goto err_res;
} }
...@@ -1407,7 +1407,7 @@ static int sm501_plat_probe(struct platform_device *dev) ...@@ -1407,7 +1407,7 @@ static int sm501_plat_probe(struct platform_device *dev)
if (sm->regs_claim == NULL) { if (sm->regs_claim == NULL) {
dev_err(&dev->dev, "cannot claim registers\n"); dev_err(&dev->dev, "cannot claim registers\n");
err= -EBUSY; ret = -EBUSY;
goto err_res; goto err_res;
} }
...@@ -1418,7 +1418,7 @@ static int sm501_plat_probe(struct platform_device *dev) ...@@ -1418,7 +1418,7 @@ static int sm501_plat_probe(struct platform_device *dev)
if (sm->regs == NULL) { if (sm->regs == NULL) {
dev_err(&dev->dev, "cannot remap registers\n"); dev_err(&dev->dev, "cannot remap registers\n");
err = -EIO; ret = -EIO;
goto err_claim; goto err_claim;
} }
...@@ -1430,7 +1430,7 @@ static int sm501_plat_probe(struct platform_device *dev) ...@@ -1430,7 +1430,7 @@ static int sm501_plat_probe(struct platform_device *dev)
err_res: err_res:
kfree(sm); kfree(sm);
err1: err1:
return err; return ret;
} }
...@@ -1625,8 +1625,7 @@ static int sm501_pci_probe(struct pci_dev *dev, ...@@ -1625,8 +1625,7 @@ static int sm501_pci_probe(struct pci_dev *dev,
goto err3; goto err3;
} }
sm->regs = ioremap(pci_resource_start(dev, 1), sm->regs = pci_ioremap_bar(dev, 1);
pci_resource_len(dev, 1));
if (sm->regs == NULL) { if (sm->regs == NULL) {
dev_err(&dev->dev, "cannot remap registers\n"); dev_err(&dev->dev, "cannot remap registers\n");
......
This diff is collapsed.
This diff is collapsed.
...@@ -183,6 +183,9 @@ static int wm8350_write(struct wm8350 *wm8350, u8 reg, int num_regs, u16 *src) ...@@ -183,6 +183,9 @@ static int wm8350_write(struct wm8350 *wm8350, u8 reg, int num_regs, u16 *src)
(wm8350->reg_cache[i] & ~wm8350_reg_io_map[i].writable) (wm8350->reg_cache[i] & ~wm8350_reg_io_map[i].writable)
| src[i - reg]; | src[i - reg];
/* Don't store volatile bits */
wm8350->reg_cache[i] &= ~wm8350_reg_io_map[i].vol;
src[i - reg] = cpu_to_be16(src[i - reg]); src[i - reg] = cpu_to_be16(src[i - reg]);
} }
...@@ -1120,6 +1123,7 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int mode) ...@@ -1120,6 +1123,7 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int mode)
} }
value = be16_to_cpu(value); value = be16_to_cpu(value);
value &= wm8350_reg_io_map[i].readable; value &= wm8350_reg_io_map[i].readable;
value &= ~wm8350_reg_io_map[i].vol;
wm8350->reg_cache[i] = value; wm8350->reg_cache[i] = value;
} else } else
wm8350->reg_cache[i] = reg_map[i]; wm8350->reg_cache[i] = reg_map[i];
...@@ -1128,7 +1132,6 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int mode) ...@@ -1128,7 +1132,6 @@ static int wm8350_create_cache(struct wm8350 *wm8350, int mode)
out: out:
return ret; return ret;
} }
EXPORT_SYMBOL_GPL(wm8350_create_cache);
/* /*
* Register a client device. This is non-fatal since there is no need to * Register a client device. This is non-fatal since there is no need to
......
...@@ -246,6 +246,16 @@ config RTC_DRV_TWL92330 ...@@ -246,6 +246,16 @@ config RTC_DRV_TWL92330
platforms. The support is integrated with the rest of platforms. The support is integrated with the rest of
the Menelaus driver; it's not separate module. the Menelaus driver; it's not separate module.
config RTC_DRV_TWL4030
tristate "TI TWL4030/TWL5030/TPS659x0"
depends on RTC_CLASS && TWL4030_CORE
help
If you say yes here you get support for the RTC on the
TWL4030 family chips, used mostly with OMAP3 platforms.
This driver can also be built as a module. If so, the module
will be called rtc-twl4030.
config RTC_DRV_S35390A config RTC_DRV_S35390A
tristate "Seiko Instruments S-35390A" tristate "Seiko Instruments S-35390A"
select BITREVERSE select BITREVERSE
......
...@@ -63,6 +63,7 @@ obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o ...@@ -63,6 +63,7 @@ obj-$(CONFIG_RTC_DRV_SA1100) += rtc-sa1100.o
obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o obj-$(CONFIG_RTC_DRV_SH) += rtc-sh.o
obj-$(CONFIG_RTC_DRV_STK17TA8) += rtc-stk17ta8.o obj-$(CONFIG_RTC_DRV_STK17TA8) += rtc-stk17ta8.o
obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o obj-$(CONFIG_RTC_DRV_TEST) += rtc-test.o
obj-$(CONFIG_RTC_DRV_TWL4030) += rtc-twl4030.o
obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o obj-$(CONFIG_RTC_DRV_V3020) += rtc-v3020.o
obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o obj-$(CONFIG_RTC_DRV_VR41XX) += rtc-vr41xx.o
obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o obj-$(CONFIG_RTC_DRV_X1205) += rtc-x1205.o
This diff is collapsed.
...@@ -228,6 +228,12 @@ struct twl4030_gpio_platform_data { ...@@ -228,6 +228,12 @@ struct twl4030_gpio_platform_data {
int gpio_base; int gpio_base;
unsigned irq_base, irq_end; unsigned irq_base, irq_end;
/* 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 /* 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
...@@ -277,6 +283,8 @@ struct twl4030_platform_data { ...@@ -277,6 +283,8 @@ struct twl4030_platform_data {
/*----------------------------------------------------------------------*/ /*----------------------------------------------------------------------*/
int twl4030_sih_setup(int module);
/* /*
* FIXME completely stop using TWL4030_IRQ_BASE ... instead, pass the * FIXME completely stop using TWL4030_IRQ_BASE ... instead, pass the
* IRQ data to subsidiary devices using platform device resources. * IRQ data to subsidiary devices using platform device resources.
...@@ -291,16 +299,16 @@ struct twl4030_platform_data { ...@@ -291,16 +299,16 @@ struct twl4030_platform_data {
#define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2) #define TWL4030_MODIRQ_BCI (TWL4030_IRQ_BASE + 2)
#define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3) #define TWL4030_MODIRQ_MADC (TWL4030_IRQ_BASE + 3)
/* #define TWL4030_MODIRQ_USB (TWL4030_IRQ_BASE + 4) */ /* #define TWL4030_MODIRQ_USB (TWL4030_IRQ_BASE + 4) */
#define TWL4030_MODIRQ_PWR (TWL4030_IRQ_BASE + 5) /* #define TWL4030_MODIRQ_PWR (TWL4030_IRQ_BASE + 5) */
#define TWL4030_PWRIRQ_PWRBTN (TWL4030_PWR_IRQ_BASE + 0) #define TWL4030_PWRIRQ_PWRBTN (TWL4030_PWR_IRQ_BASE + 0)
#define TWL4030_PWRIRQ_CHG_PRES (TWL4030_PWR_IRQ_BASE + 1) /* #define TWL4030_PWRIRQ_CHG_PRES (TWL4030_PWR_IRQ_BASE + 1) */
#define TWL4030_PWRIRQ_USB_PRES (TWL4030_PWR_IRQ_BASE + 2) /* #define TWL4030_PWRIRQ_USB_PRES (TWL4030_PWR_IRQ_BASE + 2) */
#define TWL4030_PWRIRQ_RTC (TWL4030_PWR_IRQ_BASE + 3) /* #define TWL4030_PWRIRQ_RTC (TWL4030_PWR_IRQ_BASE + 3) */
#define TWL4030_PWRIRQ_HOT_DIE (TWL4030_PWR_IRQ_BASE + 4) /* #define TWL4030_PWRIRQ_HOT_DIE (TWL4030_PWR_IRQ_BASE + 4) */
#define TWL4030_PWRIRQ_PWROK_TIMEOUT (TWL4030_PWR_IRQ_BASE + 5) /* #define TWL4030_PWRIRQ_PWROK_TIMEOUT (TWL4030_PWR_IRQ_BASE + 5) */
#define TWL4030_PWRIRQ_MBCHG (TWL4030_PWR_IRQ_BASE + 6) /* #define TWL4030_PWRIRQ_MBCHG (TWL4030_PWR_IRQ_BASE + 6) */
#define TWL4030_PWRIRQ_SC_DETECT (TWL4030_PWR_IRQ_BASE + 7) /* #define TWL4030_PWRIRQ_SC_DETECT (TWL4030_PWR_IRQ_BASE + 7) */
/* Rest are unsued currently*/ /* Rest are unsued currently*/
...@@ -317,17 +325,13 @@ struct twl4030_platform_data { ...@@ -317,17 +325,13 @@ struct twl4030_platform_data {
/* TWL4030 GPIO interrupt definitions */ /* TWL4030 GPIO interrupt definitions */
#define TWL4030_GPIO_IRQ_NO(n) (TWL4030_GPIO_IRQ_BASE + (n)) #define TWL4030_GPIO_IRQ_NO(n) (TWL4030_GPIO_IRQ_BASE + (n))
#define TWL4030_GPIO_IS_ENABLE 1
/* /*
* Exported TWL4030 GPIO APIs * Exported TWL4030 GPIO APIs
* *
* WARNING -- use standard GPIO and IRQ calls instead; these will vanish. * WARNING -- use standard GPIO and IRQ calls instead; these will vanish.
*/ */
int twl4030_get_gpio_datain(int gpio);
int twl4030_request_gpio(int gpio);
int twl4030_set_gpio_debounce(int gpio, int enable); int twl4030_set_gpio_debounce(int gpio, int enable);
int twl4030_free_gpio(int gpio);
#if defined(CONFIG_TWL4030_BCI_BATTERY) || \ #if defined(CONFIG_TWL4030_BCI_BATTERY) || \
defined(CONFIG_TWL4030_BCI_BATTERY_MODULE) defined(CONFIG_TWL4030_BCI_BATTERY_MODULE)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment