mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 03:01:39 -04:00
Merge branch 'omap2-upstream' into devel
This commit is contained in:
commit
adf6d34e46
737 changed files with 24475 additions and 14528 deletions
|
|
@ -382,9 +382,8 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
|||
break;
|
||||
|
||||
case DAVINCI_I2C_IVR_ARDY:
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_STR_ARDY, 1);
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG, DAVINCI_I2C_STR_ARDY);
|
||||
complete(&dev->cmd_complete);
|
||||
break;
|
||||
|
||||
|
|
@ -397,12 +396,9 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
|||
if (dev->buf_len)
|
||||
continue;
|
||||
|
||||
w = davinci_i2c_read_reg(dev,
|
||||
DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_IMR_RRDY, 0);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG,
|
||||
w);
|
||||
DAVINCI_I2C_STR_REG,
|
||||
DAVINCI_I2C_IMR_RRDY);
|
||||
} else
|
||||
dev_err(dev->dev, "RDR IRQ while no "
|
||||
"data requested\n");
|
||||
|
|
@ -428,9 +424,8 @@ static irqreturn_t i2c_davinci_isr(int this_irq, void *dev_id)
|
|||
break;
|
||||
|
||||
case DAVINCI_I2C_IVR_SCD:
|
||||
w = davinci_i2c_read_reg(dev, DAVINCI_I2C_STR_REG);
|
||||
MOD_REG_BIT(w, DAVINCI_I2C_STR_SCD, 1);
|
||||
davinci_i2c_write_reg(dev, DAVINCI_I2C_STR_REG, w);
|
||||
davinci_i2c_write_reg(dev,
|
||||
DAVINCI_I2C_STR_REG, DAVINCI_I2C_STR_SCD);
|
||||
complete(&dev->cmd_complete);
|
||||
break;
|
||||
|
||||
|
|
|
|||
|
|
@ -55,7 +55,7 @@ MODULE_PARM_DESC(iic_force_poll, "Force polling mode");
|
|||
|
||||
static int iic_force_fast;
|
||||
module_param(iic_force_fast, bool, 0);
|
||||
MODULE_PARM_DESC(iic_fast_poll, "Force fast mode (400 kHz)");
|
||||
MODULE_PARM_DESC(iic_force_fast, "Force fast mode (400 kHz)");
|
||||
|
||||
#define DBG_LEVEL 0
|
||||
|
||||
|
|
|
|||
|
|
@ -131,11 +131,15 @@ static const struct i2c_algorithm usb_algorithm = {
|
|||
|
||||
/* ----- begin of usb layer ---------------------------------------------- */
|
||||
|
||||
/* The usb i2c interface uses a vid/pid pair donated by */
|
||||
/* Future Technology Devices International Ltd. */
|
||||
/*
|
||||
* Initially the usb i2c interface uses a vid/pid pair donated by
|
||||
* Future Technology Devices International Ltd., later a pair was
|
||||
* bought from EZPrototypes
|
||||
*/
|
||||
static struct usb_device_id i2c_tiny_usb_table [] = {
|
||||
{ USB_DEVICE(0x0403, 0xc631) },
|
||||
{ } /* Terminating entry */
|
||||
{ USB_DEVICE(0x0403, 0xc631) }, /* FTDI */
|
||||
{ USB_DEVICE(0x1c40, 0x0534) }, /* EZPrototypes */
|
||||
{ } /* Terminating entry */
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, i2c_tiny_usb_table);
|
||||
|
|
|
|||
|
|
@ -93,6 +93,7 @@ config ISP1301_OMAP
|
|||
|
||||
config TPS65010
|
||||
tristate "TPS6501x Power Management chips"
|
||||
depends on HAVE_GPIO_LIB
|
||||
default y if MACH_OMAP_H2 || MACH_OMAP_H3 || MACH_OMAP_OSK
|
||||
help
|
||||
If you say yes here you get support for the TPS6501x series of
|
||||
|
|
|
|||
|
|
@ -30,9 +30,13 @@
|
|||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <linux/i2c/tps65010.h>
|
||||
|
||||
#include <asm/gpio.h>
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
#define DRIVER_VERSION "2 May 2005"
|
||||
|
|
@ -84,7 +88,9 @@ struct tps65010 {
|
|||
u8 chgstatus, regstatus, chgconf;
|
||||
u8 nmask1, nmask2;
|
||||
|
||||
/* not currently tracking GPIO state */
|
||||
u8 outmask;
|
||||
struct gpio_chip chip;
|
||||
struct platform_device *leds;
|
||||
};
|
||||
|
||||
#define POWER_POLL_DELAY msecs_to_jiffies(5000)
|
||||
|
|
@ -447,6 +453,59 @@ static irqreturn_t tps65010_irq(int irq, void *_tps)
|
|||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* offsets 0..3 == GPIO1..GPIO4
|
||||
* offsets 4..5 == LED1/nPG, LED2 (we set one of the non-BLINK modes)
|
||||
*/
|
||||
static void
|
||||
tps65010_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
if (offset < 4)
|
||||
tps65010_set_gpio_out_value(offset + 1, value);
|
||||
else
|
||||
tps65010_set_led(offset - 3, value ? ON : OFF);
|
||||
}
|
||||
|
||||
static int
|
||||
tps65010_output(struct gpio_chip *chip, unsigned offset, int value)
|
||||
{
|
||||
/* GPIOs may be input-only */
|
||||
if (offset < 4) {
|
||||
struct tps65010 *tps;
|
||||
|
||||
tps = container_of(chip, struct tps65010, chip);
|
||||
if (!(tps->outmask & (1 << offset)))
|
||||
return -EINVAL;
|
||||
tps65010_set_gpio_out_value(offset + 1, value);
|
||||
} else
|
||||
tps65010_set_led(offset - 3, value ? ON : OFF);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tps65010_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
int value;
|
||||
struct tps65010 *tps;
|
||||
|
||||
tps = container_of(chip, struct tps65010, chip);
|
||||
|
||||
if (offset < 4) {
|
||||
value = i2c_smbus_read_byte_data(tps->client, TPS_DEFGPIO);
|
||||
if (value < 0)
|
||||
return 0;
|
||||
if (value & (1 << (offset + 4))) /* output */
|
||||
return !(value & (1 << offset));
|
||||
else /* input */
|
||||
return (value & (1 << offset));
|
||||
}
|
||||
|
||||
/* REVISIT we *could* report LED1/nPG and LED2 state ... */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
static struct tps65010 *the_tps;
|
||||
|
|
@ -454,7 +513,14 @@ static struct tps65010 *the_tps;
|
|||
static int __exit tps65010_remove(struct i2c_client *client)
|
||||
{
|
||||
struct tps65010 *tps = i2c_get_clientdata(client);
|
||||
struct tps65010_board *board = client->dev.platform_data;
|
||||
|
||||
if (board && board->teardown) {
|
||||
int status = board->teardown(client, board->context);
|
||||
if (status < 0)
|
||||
dev_dbg(&client->dev, "board %s %s err %d\n",
|
||||
"teardown", client->name, status);
|
||||
}
|
||||
if (client->irq > 0)
|
||||
free_irq(client->irq, tps);
|
||||
cancel_delayed_work(&tps->work);
|
||||
|
|
@ -469,6 +535,7 @@ static int tps65010_probe(struct i2c_client *client)
|
|||
{
|
||||
struct tps65010 *tps;
|
||||
int status;
|
||||
struct tps65010_board *board = client->dev.platform_data;
|
||||
|
||||
if (the_tps) {
|
||||
dev_dbg(&client->dev, "only one tps6501x chip allowed\n");
|
||||
|
|
@ -577,6 +644,38 @@ static int tps65010_probe(struct i2c_client *client)
|
|||
|
||||
tps->file = debugfs_create_file(DRIVER_NAME, S_IRUGO, NULL,
|
||||
tps, DEBUG_FOPS);
|
||||
|
||||
/* optionally register GPIOs */
|
||||
if (board && board->base > 0) {
|
||||
tps->outmask = board->outmask;
|
||||
|
||||
tps->chip.label = client->name;
|
||||
|
||||
tps->chip.set = tps65010_gpio_set;
|
||||
tps->chip.direction_output = tps65010_output;
|
||||
|
||||
/* NOTE: only partial support for inputs; nyet IRQs */
|
||||
tps->chip.get = tps65010_gpio_get;
|
||||
|
||||
tps->chip.base = board->base;
|
||||
tps->chip.ngpio = 6;
|
||||
tps->chip.can_sleep = 1;
|
||||
|
||||
status = gpiochip_add(&tps->chip);
|
||||
if (status < 0)
|
||||
dev_err(&client->dev, "can't add gpiochip, err %d\n",
|
||||
status);
|
||||
else if (board->setup) {
|
||||
status = board->setup(client, board->context);
|
||||
if (status < 0) {
|
||||
dev_dbg(&client->dev,
|
||||
"board %s %s err %d\n",
|
||||
"setup", client->name, status);
|
||||
status = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
fail1:
|
||||
kfree(tps);
|
||||
|
|
|
|||
Loading…
Reference in a new issue