-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/…
…git/sameo/mfd-2.6 * '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 ...
- Loading branch information
Showing
44 changed files
with
4,118 additions
and
452 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,156 @@ | ||
/* | ||
* 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"); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.