Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3da3f872 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-2.6: (46 commits)
  mfd: Fix mismatch in twl4030 mutex lock-unlock
  mfd: twl6030-pwm.c needs MODULE_LICENSE
  mfd: Fix the omap-usb-host clock API usage on usbhs_disable()
  mfd: Acknowledge WM8994 IRQs before reporting
  mfd: Acknowlege all WM831x IRQs before we handle them
  mfd: Avoid two assignments if failures happen in tps65910_i2c_probe
  regulator: Storing tps65912 error codes in u8
  mfd: Don't leak init_data in tps65910_i2c_probe
  regulator: aat2870: Add AAT2870 regulator driver
  backlight: Add AAT2870 backlight driver
  mfd: Add AAT2870 mfd driver
  mfd: Remove dead code from max8997-irq
  mfd: Move TPS55910 Kconfig option
  mfd: Fix missing stmpe kerneldoc
  mfd: Fix off-by-one value range checking for tps65912_i2c_write
  mfd: Add devices for WM831x clocking module
  mfd: Remove comp{1,2}_threshold sysfs entries in tps65911_comparator_remove
  mfd: Don't ask about the TPS65912 core driver in Kconfig
  mfd: Fix off by one in WM831x IRQ code
  mfd: Add tps65921 support from twl-core
  ...
parents 968e75fc e178ccb3
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -280,6 +280,12 @@ config GPIO_TC3589X
	  This enables support for the GPIOs found on the TC3589X
	  I/O Expander.

config GPIO_TPS65912
	tristate "TI TPS65912 GPIO"
	depends on (MFD_TPS65912_I2C || MFD_TPS65912_SPI)
	help
	  This driver supports TPS65912 gpio chip

config GPIO_TWL4030
	tristate "TWL4030, TWL5030, and TPS659x0 GPIOs"
	depends on TWL4030_CORE
+1 −0
Original line number Diff line number Diff line
@@ -48,6 +48,7 @@ obj-$(CONFIG_GPIO_TC3589X) += gpio-tc3589x.o
obj-$(CONFIG_ARCH_TEGRA)	+= gpio-tegra.o
obj-$(CONFIG_GPIO_TIMBERDALE)	+= gpio-timberdale.o
obj-$(CONFIG_GPIO_TPS65910)	+= gpio-tps65910.o
obj-$(CONFIG_GPIO_TPS65912)	+= gpio-tps65912.o
obj-$(CONFIG_GPIO_TWL4030)	+= gpio-twl4030.o
obj-$(CONFIG_MACH_U300)		+= gpio-u300.o
obj-$(CONFIG_GPIO_UCB1400)	+= gpio-ucb1400.o
+156 −0
Original line number Diff line number Diff line
/*
 * Copyright 2011 Texas Instruments Inc.
 *
 * Author: Margarita Olaya <magi@slimlogic.co.uk>
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under  the terms of the GNU General  Public License as published by the
 *  Free Software Foundation;  either version 2 of the License, or (at your
 *  option) any later version.
 *
 * This driver is based on wm8350 implementation.
 */

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/errno.h>
#include <linux/gpio.h>
#include <linux/mfd/core.h>
#include <linux/platform_device.h>
#include <linux/seq_file.h>
#include <linux/slab.h>
#include <linux/mfd/tps65912.h>

struct tps65912_gpio_data {
	struct tps65912 *tps65912;
	struct gpio_chip gpio_chip;
};

static int tps65912_gpio_get(struct gpio_chip *gc, unsigned offset)
{
	struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);
	int val;

	val = tps65912_reg_read(tps65912, TPS65912_GPIO1 + offset);

	if (val & GPIO_STS_MASK)
		return 1;

	return 0;
}

static void tps65912_gpio_set(struct gpio_chip *gc, unsigned offset,
			      int value)
{
	struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);

	if (value)
		tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
							GPIO_SET_MASK);
	else
		tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
								GPIO_SET_MASK);
}

static int tps65912_gpio_output(struct gpio_chip *gc, unsigned offset,
				int value)
{
	struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);

	/* Set the initial value */
	tps65912_gpio_set(gc, offset, value);

	return tps65912_set_bits(tps65912, TPS65912_GPIO1 + offset,
								GPIO_CFG_MASK);
}

static int tps65912_gpio_input(struct gpio_chip *gc, unsigned offset)
{
	struct tps65912 *tps65912 = container_of(gc, struct tps65912, gpio);

	return tps65912_clear_bits(tps65912, TPS65912_GPIO1 + offset,
								GPIO_CFG_MASK);

}

static struct gpio_chip template_chip = {
	.label			= "tps65912",
	.owner			= THIS_MODULE,
	.direction_input	= tps65912_gpio_input,
	.direction_output	= tps65912_gpio_output,
	.get			= tps65912_gpio_get,
	.set			= tps65912_gpio_set,
	.can_sleep		= 1,
	.ngpio			= 5,
	.base			= -1,
};

static int __devinit tps65912_gpio_probe(struct platform_device *pdev)
{
	struct tps65912 *tps65912 = dev_get_drvdata(pdev->dev.parent);
	struct tps65912_board *pdata = tps65912->dev->platform_data;
	struct tps65912_gpio_data *tps65912_gpio;
	int ret;

	tps65912_gpio = kzalloc(sizeof(*tps65912_gpio), GFP_KERNEL);
	if (tps65912_gpio == NULL)
		return -ENOMEM;

	tps65912_gpio->tps65912 = tps65912;
	tps65912_gpio->gpio_chip = template_chip;
	tps65912_gpio->gpio_chip.dev = &pdev->dev;
	if (pdata && pdata->gpio_base)
		tps65912_gpio->gpio_chip.base = pdata->gpio_base;

	ret = gpiochip_add(&tps65912_gpio->gpio_chip);
	if (ret < 0) {
		dev_err(&pdev->dev, "Failed to register gpiochip, %d\n", ret);
		goto err;
	}

	platform_set_drvdata(pdev, tps65912_gpio);

	return ret;

err:
	kfree(tps65912_gpio);
	return ret;
}

static int __devexit tps65912_gpio_remove(struct platform_device *pdev)
{
	struct tps65912_gpio_data  *tps65912_gpio = platform_get_drvdata(pdev);
	int ret;

	ret = gpiochip_remove(&tps65912_gpio->gpio_chip);
	if (ret == 0)
		kfree(tps65912_gpio);

	return ret;
}

static struct platform_driver tps65912_gpio_driver = {
	.driver = {
		.name = "tps65912-gpio",
		.owner = THIS_MODULE,
	},
	.probe = tps65912_gpio_probe,
	.remove = __devexit_p(tps65912_gpio_remove),
};

static int __init tps65912_gpio_init(void)
{
	return platform_driver_register(&tps65912_gpio_driver);
}
subsys_initcall(tps65912_gpio_init);

static void __exit tps65912_gpio_exit(void)
{
	platform_driver_unregister(&tps65912_gpio_driver);
}
module_exit(tps65912_gpio_exit);

MODULE_AUTHOR("Margarita Olaya Cabrera <magi@slimlogic.co.uk>");
MODULE_DESCRIPTION("GPIO interface for TPS65912 PMICs");
MODULE_LICENSE("GPL v2");
MODULE_ALIAS("platform:tps65912-gpio");
+43 −10
Original line number Diff line number Diff line
@@ -171,6 +171,37 @@ config MFD_TPS6586X
	  This driver can also be built as a module.  If so, the module
	  will be called tps6586x.

config MFD_TPS65910
	bool "TPS65910 Power Management chip"
	depends on I2C=y && GPIOLIB
	select MFD_CORE
	select GPIO_TPS65910
	help
	  if you say yes here you get support for the TPS65910 series of
	  Power Management chips.

config MFD_TPS65912
	bool
	depends on GPIOLIB

config MFD_TPS65912_I2C
	bool "TPS95612 Power Management chip with I2C"
	select MFD_CORE
	select MFD_TPS65912
	depends on I2C=y && GPIOLIB
	help
	  If you say yes here you get support for the TPS65912 series of
	  PM chips with I2C interface.

config MFD_TPS65912_SPI
	bool "TPS65912 Power Management chip with SPI"
	select MFD_CORE
	select MFD_TPS65912
	depends on SPI_MASTER && GPIOLIB
	help
	  If you say yes here you get support for the TPS65912 series of
	  PM chips with SPI interface.

config MENELAUS
	bool "Texas Instruments TWL92330/Menelaus PM chip"
	depends on I2C=y && ARCH_OMAP2
@@ -662,8 +693,9 @@ config MFD_JANZ_CMODIO
	  CAN and GPIO controllers.

config MFD_JZ4740_ADC
	tristate "Support for the JZ4740 SoC ADC core"
	bool "Support for the JZ4740 SoC ADC core"
	select MFD_CORE
	select GENERIC_IRQ_CHIP
	depends on MACH_JZ4740
	help
	  Say yes here if you want support for the ADC unit in the JZ4740 SoC.
@@ -725,18 +757,19 @@ config MFD_PM8XXX_IRQ
	  This is required to use certain other PM 8xxx features, such as GPIO
	  and MPP.

config MFD_TPS65910
	bool "TPS65910 Power Management chip"
	depends on I2C=y && GPIOLIB
	select MFD_CORE
	select GPIO_TPS65910
	help
	  if you say yes here you get support for the TPS65910 series of
	  Power Management chips.

config TPS65911_COMPARATOR
	tristate

config MFD_AAT2870_CORE
	bool "Support for the AnalogicTech AAT2870"
	select MFD_CORE
	depends on I2C=y && GPIOLIB
	help
	  If you say yes here you get support for the AAT2870.
	  This driver provides common support for accessing the device,
	  additional drivers must be enabled in order to use the
	  functionality of the device.

endif # MFD_SUPPORT

menu "Multimedia Capabilities Port drivers"
+7 −1
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ obj-$(CONFIG_MFD_TC6393XB) += tc6393xb.o tmio_core.o

obj-$(CONFIG_MFD_WM8400)	+= wm8400-core.o
wm831x-objs			:= wm831x-core.o wm831x-irq.o wm831x-otp.o
wm831x-objs			+= wm831x-auxadc.o
obj-$(CONFIG_MFD_WM831X)	+= wm831x.o
obj-$(CONFIG_MFD_WM831X_I2C)	+= wm831x-i2c.o
obj-$(CONFIG_MFD_WM831X_SPI)	+= wm831x-spi.o
@@ -35,6 +36,11 @@ obj-$(CONFIG_MFD_WM8994) += wm8994-core.o wm8994-irq.o
obj-$(CONFIG_TPS6105X)		+= tps6105x.o
obj-$(CONFIG_TPS65010)		+= tps65010.o
obj-$(CONFIG_TPS6507X)		+= tps6507x.o
obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o tps65910-irq.o
tps65912-objs                   := tps65912-core.o tps65912-irq.o
obj-$(CONFIG_MFD_TPS65912)	+= tps65912.o
obj-$(CONFIG_MFD_TPS65912_I2C)	+= tps65912-i2c.o
obj-$(CONFIG_MFD_TPS65912_SPI)  += tps65912-spi.o
obj-$(CONFIG_MENELAUS)		+= menelaus.o

obj-$(CONFIG_TWL4030_CORE)	+= twl-core.o twl4030-irq.o twl6030-irq.o
@@ -94,5 +100,5 @@ obj-$(CONFIG_MFD_CS5535) += cs5535-mfd.o
obj-$(CONFIG_MFD_OMAP_USB_HOST)	+= omap-usb-host.o
obj-$(CONFIG_MFD_PM8921_CORE) 	+= pm8921-core.o
obj-$(CONFIG_MFD_PM8XXX_IRQ) 	+= pm8xxx-irq.o
obj-$(CONFIG_MFD_TPS65910)	+= tps65910.o tps65910-irq.o
obj-$(CONFIG_TPS65911_COMPARATOR)	+= tps65911-comparator.o
obj-$(CONFIG_MFD_AAT2870_CORE)	+= aat2870-core.o
Loading