Commit 5004de18 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6

* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6:
  i2c: Fix docbook problem
  ASoC/TLV320AIC3X: Stop I2C driver ID abuse
  i2c-omap: Fix unhandled fault
  i2c-bfin-twi: Disable BF54x support for now
parents e5841525 8c07e46f
...@@ -100,7 +100,7 @@ config I2C_AU1550 ...@@ -100,7 +100,7 @@ config I2C_AU1550
config I2C_BLACKFIN_TWI config I2C_BLACKFIN_TWI
tristate "Blackfin TWI I2C support" tristate "Blackfin TWI I2C support"
depends on BF534 || BF536 || BF537 || BF54x depends on BF534 || BF536 || BF537
help help
This is the TWI I2C device driver for Blackfin 534/536/537/54x. This is the TWI I2C device driver for Blackfin 534/536/537/54x.
This driver can also be built as a module. If so, the module This driver can also be built as a module. If so, the module
......
...@@ -128,6 +128,8 @@ struct omap_i2c_dev { ...@@ -128,6 +128,8 @@ struct omap_i2c_dev {
size_t buf_len; size_t buf_len;
struct i2c_adapter adapter; struct i2c_adapter adapter;
unsigned rev1:1; unsigned rev1:1;
unsigned idle:1;
u16 iestate; /* Saved interrupt register */
}; };
static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev,
...@@ -174,18 +176,30 @@ static void omap_i2c_put_clocks(struct omap_i2c_dev *dev) ...@@ -174,18 +176,30 @@ static void omap_i2c_put_clocks(struct omap_i2c_dev *dev)
} }
} }
static void omap_i2c_enable_clocks(struct omap_i2c_dev *dev) static void omap_i2c_unidle(struct omap_i2c_dev *dev)
{ {
if (dev->iclk != NULL) if (dev->iclk != NULL)
clk_enable(dev->iclk); clk_enable(dev->iclk);
clk_enable(dev->fclk); clk_enable(dev->fclk);
if (dev->iestate)
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate);
dev->idle = 0;
} }
static void omap_i2c_disable_clocks(struct omap_i2c_dev *dev) static void omap_i2c_idle(struct omap_i2c_dev *dev)
{ {
u16 iv;
dev->idle = 1;
dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
if (dev->rev1)
iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
else
omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, dev->iestate);
clk_disable(dev->fclk);
if (dev->iclk != NULL) if (dev->iclk != NULL)
clk_disable(dev->iclk); clk_disable(dev->iclk);
clk_disable(dev->fclk);
} }
static int omap_i2c_init(struct omap_i2c_dev *dev) static int omap_i2c_init(struct omap_i2c_dev *dev)
...@@ -360,7 +374,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) ...@@ -360,7 +374,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
int i; int i;
int r; int r;
omap_i2c_enable_clocks(dev); omap_i2c_unidle(dev);
if ((r = omap_i2c_wait_for_bb(dev)) < 0) if ((r = omap_i2c_wait_for_bb(dev)) < 0)
goto out; goto out;
...@@ -374,7 +388,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) ...@@ -374,7 +388,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
if (r == 0) if (r == 0)
r = num; r = num;
out: out:
omap_i2c_disable_clocks(dev); omap_i2c_idle(dev);
return r; return r;
} }
...@@ -403,6 +417,9 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id) ...@@ -403,6 +417,9 @@ omap_i2c_rev1_isr(int this_irq, void *dev_id)
struct omap_i2c_dev *dev = dev_id; struct omap_i2c_dev *dev = dev_id;
u16 iv, w; u16 iv, w;
if (dev->idle)
return IRQ_NONE;
iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG);
switch (iv) { switch (iv) {
case 0x00: /* None */ case 0x00: /* None */
...@@ -457,6 +474,9 @@ omap_i2c_isr(int this_irq, void *dev_id) ...@@ -457,6 +474,9 @@ omap_i2c_isr(int this_irq, void *dev_id)
u16 stat, w; u16 stat, w;
int count = 0; int count = 0;
if (dev->idle)
return IRQ_NONE;
bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) { while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) {
dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat);
...@@ -575,7 +595,7 @@ omap_i2c_probe(struct platform_device *pdev) ...@@ -575,7 +595,7 @@ omap_i2c_probe(struct platform_device *pdev)
if ((r = omap_i2c_get_clocks(dev)) != 0) if ((r = omap_i2c_get_clocks(dev)) != 0)
goto err_free_mem; goto err_free_mem;
omap_i2c_enable_clocks(dev); omap_i2c_unidle(dev);
if (cpu_is_omap15xx()) if (cpu_is_omap15xx())
dev->rev1 = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) < 0x20; dev->rev1 = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) < 0x20;
...@@ -610,7 +630,7 @@ omap_i2c_probe(struct platform_device *pdev) ...@@ -610,7 +630,7 @@ omap_i2c_probe(struct platform_device *pdev)
goto err_free_irq; goto err_free_irq;
} }
omap_i2c_disable_clocks(dev); omap_i2c_idle(dev);
return 0; return 0;
...@@ -618,7 +638,7 @@ omap_i2c_probe(struct platform_device *pdev) ...@@ -618,7 +638,7 @@ omap_i2c_probe(struct platform_device *pdev)
free_irq(dev->irq, dev); free_irq(dev->irq, dev);
err_unuse_clocks: err_unuse_clocks:
omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
omap_i2c_disable_clocks(dev); omap_i2c_idle(dev);
omap_i2c_put_clocks(dev); omap_i2c_put_clocks(dev);
err_free_mem: err_free_mem:
platform_set_drvdata(pdev, NULL); platform_set_drvdata(pdev, NULL);
......
...@@ -489,8 +489,8 @@ EXPORT_SYMBOL(i2c_add_adapter); ...@@ -489,8 +489,8 @@ EXPORT_SYMBOL(i2c_add_adapter);
* Context: can sleep * Context: can sleep
* *
* This routine is used to declare an I2C adapter when its bus number * This routine is used to declare an I2C adapter when its bus number
* matters. Example: for I2C adapters from system-on-chip CPUs, or * matters. For example, use it for I2C adapters from system-on-chip CPUs,
* otherwise built in to the system's mainboard, and where i2c_board_info * or otherwise built in to the system's mainboard, and where i2c_board_info
* is used to properly configure I2C devices. * is used to properly configure I2C devices.
* *
* If no devices have pre-been declared for this bus, then be sure to * If no devices have pre-been declared for this bus, then be sure to
......
...@@ -1187,10 +1187,8 @@ static struct i2c_driver aic3x_i2c_driver = { ...@@ -1187,10 +1187,8 @@ static struct i2c_driver aic3x_i2c_driver = {
.name = "aic3x I2C Codec", .name = "aic3x I2C Codec",
.owner = THIS_MODULE, .owner = THIS_MODULE,
}, },
.id = I2C_DRIVERID_I2CDEV,
.attach_adapter = aic3x_i2c_attach, .attach_adapter = aic3x_i2c_attach,
.detach_client = aic3x_i2c_detach, .detach_client = aic3x_i2c_detach,
.command = NULL,
}; };
static struct i2c_client client_template = { static struct i2c_client client_template = {
......
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