Merge branch 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm
* 'for-linus' of master.kernel.org:/home/rmk/linux-2.6-arm: (76 commits) [ARM] 4002/1: S3C24XX: leave parent IRQs unmasked [ARM] 4001/1: S3C24XX: shorten reboot time [ARM] 3983/2: remove unused argument to __bug() [ARM] 4000/1: Osiris: add third serial port in [ARM] 3999/1: RX3715: suspend to RAM support [ARM] 3998/1: VR1000: LED platform devices [ARM] 3995/1: iop13xx: add iop13xx support [ARM] 3968/1: iop13xx: add iop13xx_defconfig [ARM] Update mach-types [ARM] Allow gcc to optimise arm_add_memory a little more [ARM] 3991/1: i.MX/MX1 high resolution time source [ARM] 3990/1: i.MX/MX1 more precise PLL decode [ARM] 3986/1: H1940: suspend to RAM support [ARM] 3985/1: ixp4xx clocksource cleanup [ARM] 3984/1: ixp4xx/nslu2: Fix disk LED numbering (take 2) [ARM] 3994/1: ixp23xx: fix handling of pci master aborts [ARM] 3981/1: sched_clock for PXA2xx [ARM] 3980/1: extend the ARM Versatile sched_clock implementation from 32 to 63 bit [ARM] 3979/1: extend the SA11x0 sched_clock implementation from 32 to 63 bit period [ARM] 3978/1: macro to provide a 63-bit value from a 32-bit hardware counter ...
This commit is contained in:
@ -196,11 +196,11 @@ config I2C_IBM_IIC
|
||||
will be called i2c-ibm_iic.
|
||||
|
||||
config I2C_IOP3XX
|
||||
tristate "Intel IOP3xx and IXP4xx on-chip I2C interface"
|
||||
depends on (ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX) && I2C
|
||||
tristate "Intel IOPx3xx and IXP4xx on-chip I2C interface"
|
||||
depends on (ARCH_IOP32X || ARCH_IOP33X || ARCH_IXP4XX || ARCH_IOP13XX) && I2C
|
||||
help
|
||||
Say Y here if you want to use the IIC bus controller on
|
||||
the Intel IOP3xx I/O Processors or IXP4xx Network Processors.
|
||||
the Intel IOPx3xx I/O Processors or IXP4xx Network Processors.
|
||||
|
||||
This driver can also be built as a module. If so, the module
|
||||
will be called i2c-iop3xx.
|
||||
|
@ -357,133 +357,6 @@ static void i2c_pxa_reset(struct pxa_i2c *i2c)
|
||||
|
||||
|
||||
#ifdef CONFIG_I2C_PXA_SLAVE
|
||||
/*
|
||||
* I2C EEPROM emulation.
|
||||
*/
|
||||
static struct i2c_eeprom_emu eeprom = {
|
||||
.size = I2C_EEPROM_EMU_SIZE,
|
||||
.watch = LIST_HEAD_INIT(eeprom.watch),
|
||||
};
|
||||
|
||||
struct i2c_eeprom_emu *i2c_pxa_get_eeprom(void)
|
||||
{
|
||||
return &eeprom;
|
||||
}
|
||||
|
||||
int i2c_eeprom_emu_addwatcher(struct i2c_eeprom_emu *emu, void *data,
|
||||
unsigned int addr, unsigned int size,
|
||||
struct i2c_eeprom_emu_watcher *watcher)
|
||||
{
|
||||
struct i2c_eeprom_emu_watch *watch;
|
||||
unsigned long flags;
|
||||
|
||||
if (addr + size > emu->size)
|
||||
return -EINVAL;
|
||||
|
||||
watch = kmalloc(sizeof(struct i2c_eeprom_emu_watch), GFP_KERNEL);
|
||||
if (watch) {
|
||||
watch->start = addr;
|
||||
watch->end = addr + size - 1;
|
||||
watch->ops = watcher;
|
||||
watch->data = data;
|
||||
|
||||
local_irq_save(flags);
|
||||
list_add(&watch->node, &emu->watch);
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
return watch ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
void i2c_eeprom_emu_delwatcher(struct i2c_eeprom_emu *emu, void *data,
|
||||
struct i2c_eeprom_emu_watcher *watcher)
|
||||
{
|
||||
struct i2c_eeprom_emu_watch *watch, *n;
|
||||
unsigned long flags;
|
||||
|
||||
list_for_each_entry_safe(watch, n, &emu->watch, node) {
|
||||
if (watch->ops == watcher && watch->data == data) {
|
||||
local_irq_save(flags);
|
||||
list_del(&watch->node);
|
||||
local_irq_restore(flags);
|
||||
kfree(watch);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void i2c_eeprom_emu_event(void *ptr, i2c_slave_event_t event)
|
||||
{
|
||||
struct i2c_eeprom_emu *emu = ptr;
|
||||
|
||||
eedbg(3, "i2c_eeprom_emu_event: %d\n", event);
|
||||
|
||||
switch (event) {
|
||||
case I2C_SLAVE_EVENT_START_WRITE:
|
||||
emu->seen_start = 1;
|
||||
eedbg(2, "i2c_eeprom: write initiated\n");
|
||||
break;
|
||||
|
||||
case I2C_SLAVE_EVENT_START_READ:
|
||||
emu->seen_start = 0;
|
||||
eedbg(2, "i2c_eeprom: read initiated\n");
|
||||
break;
|
||||
|
||||
case I2C_SLAVE_EVENT_STOP:
|
||||
emu->seen_start = 0;
|
||||
eedbg(2, "i2c_eeprom: received stop\n");
|
||||
break;
|
||||
|
||||
default:
|
||||
eedbg(0, "i2c_eeprom: unhandled event\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static int i2c_eeprom_emu_read(void *ptr)
|
||||
{
|
||||
struct i2c_eeprom_emu *emu = ptr;
|
||||
int ret;
|
||||
|
||||
ret = emu->bytes[emu->ptr];
|
||||
emu->ptr = (emu->ptr + 1) % emu->size;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void i2c_eeprom_emu_write(void *ptr, unsigned int val)
|
||||
{
|
||||
struct i2c_eeprom_emu *emu = ptr;
|
||||
struct i2c_eeprom_emu_watch *watch;
|
||||
|
||||
if (emu->seen_start != 0) {
|
||||
eedbg(2, "i2c_eeprom_emu_write: setting ptr %02x\n", val);
|
||||
emu->ptr = val;
|
||||
emu->seen_start = 0;
|
||||
return;
|
||||
}
|
||||
|
||||
emu->bytes[emu->ptr] = val;
|
||||
|
||||
eedbg(1, "i2c_eeprom_emu_write: ptr=0x%02x, val=0x%02x\n",
|
||||
emu->ptr, val);
|
||||
|
||||
list_for_each_entry(watch, &emu->watch, node) {
|
||||
if (!watch->ops || !watch->ops->write)
|
||||
continue;
|
||||
if (watch->start <= emu->ptr && watch->end >= emu->ptr)
|
||||
watch->ops->write(watch->data, emu->ptr, val);
|
||||
}
|
||||
|
||||
emu->ptr = (emu->ptr + 1) % emu->size;
|
||||
}
|
||||
|
||||
struct i2c_slave_client eeprom_client = {
|
||||
.data = &eeprom,
|
||||
.event = i2c_eeprom_emu_event,
|
||||
.read = i2c_eeprom_emu_read,
|
||||
.write = i2c_eeprom_emu_write
|
||||
};
|
||||
|
||||
/*
|
||||
* PXA I2C Slave mode
|
||||
*/
|
||||
@ -963,11 +836,9 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
||||
i2c->slave_addr = I2C_PXA_SLAVE_ADDR;
|
||||
|
||||
#ifdef CONFIG_I2C_PXA_SLAVE
|
||||
i2c->slave = &eeprom_client;
|
||||
if (plat) {
|
||||
i2c->slave_addr = plat->slave_addr;
|
||||
if (plat->slave)
|
||||
i2c->slave = plat->slave;
|
||||
i2c->slave = plat->slave;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
Reference in New Issue
Block a user