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
This commit is contained in:
commit
5004de1809
@ -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 {
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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 @@ err_free_irq:
|
|||||||
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);
|
|||||||
* 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 = {
|
|||||||
.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 = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user