i2c: adapter: register it's own device
so we can show the this of i2c busses set the bus device as parent of all devices. Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com> Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
parent
9b8fa53626
commit
0e9a078d20
|
@ -154,7 +154,7 @@ static int i2c_fsl_bus_busy(struct i2c_adapter *adapter, int for_busy)
|
|||
if (!for_busy && !(temp & I2SR_IBB))
|
||||
break;
|
||||
if (is_timeout(start, 500 * MSECOND)) {
|
||||
dev_err(adapter->dev,
|
||||
dev_err(&adapter->dev,
|
||||
"<%s> timeout waiting for I2C bus %s\n",
|
||||
__func__,for_busy ? "busy" : "not busy");
|
||||
return -EIO;
|
||||
|
@ -177,7 +177,7 @@ static int i2c_fsl_trx_complete(struct i2c_adapter *adapter)
|
|||
break;
|
||||
|
||||
if (is_timeout(start, 100 * MSECOND)) {
|
||||
dev_err(adapter->dev, "<%s> TXR timeout\n", __func__);
|
||||
dev_err(&adapter->dev, "<%s> TXR timeout\n", __func__);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
@ -199,7 +199,7 @@ static int i2c_fsl_acked(struct i2c_adapter *adapter)
|
|||
break;
|
||||
|
||||
if (is_timeout(start, MSECOND)) {
|
||||
dev_dbg(adapter->dev, "<%s> No ACK\n", __func__);
|
||||
dev_dbg(&adapter->dev, "<%s> No ACK\n", __func__);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
@ -296,7 +296,7 @@ static void i2c_fsl_set_clk(struct fsl_i2c_struct *i2c_fsl,
|
|||
* Translate to dfsr = 5 * Frequency / 100,000,000
|
||||
*/
|
||||
dfsr = (5 * (i2c_clk / 1000)) / 100000;
|
||||
dev_dbg(i2c_fsl->adapter.dev,
|
||||
dev_dbg(&i2c_fsl->adapter.dev,
|
||||
"<%s> requested speed:%d, i2c_clk:%d\n", __func__,
|
||||
rate, i2c_clk);
|
||||
if (!dfsr)
|
||||
|
@ -315,12 +315,12 @@ static void i2c_fsl_set_clk(struct fsl_i2c_struct *i2c_fsl,
|
|||
bin_ga = (ga & 0x3) | ((ga & 0x4) << 3);
|
||||
fdr = bin_gb | bin_ga;
|
||||
rate = i2c_clk / est_div;
|
||||
dev_dbg(i2c_fsl->adapter.dev,
|
||||
dev_dbg(&i2c_fsl->adapter.dev,
|
||||
"FDR:0x%.2x, div:%ld, ga:0x%x, gb:0x%x,"
|
||||
" a:%d, b:%d, speed:%d\n", fdr, est_div,
|
||||
ga, gb, a, b, rate);
|
||||
/* Condition 2 not accounted for */
|
||||
dev_dbg(i2c_fsl->adapter.dev,
|
||||
dev_dbg(&i2c_fsl->adapter.dev,
|
||||
"Tr <= %d ns\n", (b - 3 * dfsr) *
|
||||
1000000 / (i2c_clk / 1000));
|
||||
}
|
||||
|
@ -330,9 +330,9 @@ static void i2c_fsl_set_clk(struct fsl_i2c_struct *i2c_fsl,
|
|||
if (a == 24)
|
||||
a += 4;
|
||||
}
|
||||
dev_dbg(i2c_fsl->adapter.dev,
|
||||
dev_dbg(&i2c_fsl->adapter.dev,
|
||||
"divider:%d, est_div:%ld, DFSR:%d\n", divider, est_div, dfsr);
|
||||
dev_dbg(i2c_fsl->adapter.dev, "FDR:0x%.2x, speed:%d\n", fdr, rate);
|
||||
dev_dbg(&i2c_fsl->adapter.dev, "FDR:0x%.2x, speed:%d\n", fdr, rate);
|
||||
i2c_fsl->ifdr = fdr;
|
||||
i2c_fsl->dfsrr = dfsr;
|
||||
}
|
||||
|
@ -368,9 +368,9 @@ static void i2c_fsl_set_clk(struct fsl_i2c_struct *i2c_fsl,
|
|||
(500000U * i2c_clk_div[i][0] + (i2c_clk_rate / 2) - 1) /
|
||||
(i2c_clk_rate / 2);
|
||||
|
||||
dev_dbg(i2c_fsl->adapter.dev, "<%s> I2C_CLK=%d, REQ DIV=%d\n",
|
||||
dev_dbg(&i2c_fsl->adapter.dev, "<%s> I2C_CLK=%d, REQ DIV=%d\n",
|
||||
__func__, i2c_clk_rate, div);
|
||||
dev_dbg(i2c_fsl->adapter.dev, "<%s> IFDR[IC]=0x%x, REAL DIV=%d\n",
|
||||
dev_dbg(&i2c_fsl->adapter.dev, "<%s> IFDR[IC]=0x%x, REAL DIV=%d\n",
|
||||
__func__, i2c_clk_div[i][1], i2c_clk_div[i][0]);
|
||||
}
|
||||
#endif
|
||||
|
@ -382,7 +382,7 @@ static int i2c_fsl_write(struct i2c_adapter *adapter, struct i2c_msg *msgs)
|
|||
int i, result;
|
||||
|
||||
if ( !(msgs->flags & I2C_M_DATA_ONLY) ) {
|
||||
dev_dbg(adapter->dev,
|
||||
dev_dbg(&adapter->dev,
|
||||
"<%s> write slave address: addr=0x%02x\n",
|
||||
__func__, msgs->addr << 1);
|
||||
|
||||
|
@ -399,7 +399,7 @@ static int i2c_fsl_write(struct i2c_adapter *adapter, struct i2c_msg *msgs)
|
|||
|
||||
/* write data */
|
||||
for (i = 0; i < msgs->len; i++) {
|
||||
dev_dbg(adapter->dev,
|
||||
dev_dbg(&adapter->dev,
|
||||
"<%s> write byte: B%d=0x%02X\n",
|
||||
__func__, i, msgs->buf[i]);
|
||||
writeb(msgs->buf[i], base + FSL_I2C_I2DR);
|
||||
|
@ -425,7 +425,7 @@ static int i2c_fsl_read(struct i2c_adapter *adapter, struct i2c_msg *msgs)
|
|||
writeb(0x0, base + FSL_I2C_I2SR);
|
||||
|
||||
if ( !(msgs->flags & I2C_M_DATA_ONLY) ) {
|
||||
dev_dbg(adapter->dev,
|
||||
dev_dbg(&adapter->dev,
|
||||
"<%s> write slave address: addr=0x%02x\n",
|
||||
__func__, (msgs->addr << 1) | 0x01);
|
||||
|
||||
|
@ -478,7 +478,7 @@ static int i2c_fsl_read(struct i2c_adapter *adapter, struct i2c_msg *msgs)
|
|||
}
|
||||
msgs->buf[i] = readb(base + FSL_I2C_I2DR);
|
||||
|
||||
dev_dbg(adapter->dev, "<%s> read byte: B%d=0x%02X\n",
|
||||
dev_dbg(&adapter->dev, "<%s> read byte: B%d=0x%02X\n",
|
||||
__func__, i, msgs->buf[i]);
|
||||
}
|
||||
return 0;
|
||||
|
@ -544,7 +544,7 @@ static int __init i2c_fsl_probe(struct device_d *pdev)
|
|||
/* Setup i2c_fsl driver structure */
|
||||
i2c_fsl->adapter.master_xfer = i2c_fsl_xfer;
|
||||
i2c_fsl->adapter.nr = pdev->id;
|
||||
i2c_fsl->adapter.dev = pdev;
|
||||
i2c_fsl->adapter.dev.parent = pdev;
|
||||
i2c_fsl->base = dev_request_mem_region(pdev, 0);
|
||||
i2c_fsl->dfsrr = -1;
|
||||
|
||||
|
|
|
@ -318,7 +318,7 @@ static int omap_i2c_init(struct omap_i2c_struct *i2c_omap)
|
|||
while (!(omap_i2c_read_reg(i2c_omap, OMAP_I2C_SYSS_REG) &
|
||||
SYSS_RESETDONE_MASK)) {
|
||||
if (is_timeout(start, MSECOND)) {
|
||||
dev_warn(i2c_omap->adapter.dev, "timeout waiting "
|
||||
dev_warn(&i2c_omap->adapter.dev, "timeout waiting "
|
||||
"for controller reset\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
@ -453,7 +453,7 @@ static int omap_i2c_wait_for_bb(struct i2c_adapter *adapter)
|
|||
start = get_time_ns();
|
||||
while (omap_i2c_read_reg(i2c_omap, OMAP_I2C_STAT_REG) & OMAP_I2C_STAT_BB) {
|
||||
if (is_timeout(start, MSECOND)) {
|
||||
dev_warn(adapter->dev, "timeout waiting for bus ready\n");
|
||||
dev_warn(&adapter->dev, "timeout waiting for bus ready\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
}
|
||||
|
@ -476,9 +476,9 @@ omap_i2c_isr(struct omap_i2c_struct *dev)
|
|||
|
||||
bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
|
||||
while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) {
|
||||
dev_dbg(dev->adapter.dev, "IRQ (ISR = 0x%04x)\n", stat);
|
||||
dev_dbg(&dev->adapter.dev, "IRQ (ISR = 0x%04x)\n", stat);
|
||||
if (count++ == 100) {
|
||||
dev_warn(dev->adapter.dev, "Too much work in one IRQ\n");
|
||||
dev_warn(&dev->adapter.dev, "Too much work in one IRQ\n");
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -499,7 +499,7 @@ complete:
|
|||
OMAP_I2C_CON_STP);
|
||||
}
|
||||
if (stat & OMAP_I2C_STAT_AL) {
|
||||
dev_err(dev->adapter.dev, "Arbitration lost\n");
|
||||
dev_err(&dev->adapter.dev, "Arbitration lost\n");
|
||||
err |= OMAP_I2C_STAT_AL;
|
||||
}
|
||||
if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK |
|
||||
|
@ -536,11 +536,11 @@ complete:
|
|||
}
|
||||
} else {
|
||||
if (stat & OMAP_I2C_STAT_RRDY)
|
||||
dev_err(dev->adapter.dev,
|
||||
dev_err(&dev->adapter.dev,
|
||||
"RRDY IRQ while no data"
|
||||
" requested\n");
|
||||
if (stat & OMAP_I2C_STAT_RDR)
|
||||
dev_err(dev->adapter.dev,
|
||||
dev_err(&dev->adapter.dev,
|
||||
"RDR IRQ while no data"
|
||||
" requested\n");
|
||||
break;
|
||||
|
@ -577,11 +577,11 @@ complete:
|
|||
}
|
||||
} else {
|
||||
if (stat & OMAP_I2C_STAT_XRDY)
|
||||
dev_err(dev->adapter.dev,
|
||||
dev_err(&dev->adapter.dev,
|
||||
"XRDY IRQ while no "
|
||||
"data to send\n");
|
||||
if (stat & OMAP_I2C_STAT_XDR)
|
||||
dev_err(dev->adapter.dev,
|
||||
dev_err(&dev->adapter.dev,
|
||||
"XDR IRQ while no "
|
||||
"data to send\n");
|
||||
break;
|
||||
|
@ -613,11 +613,11 @@ complete:
|
|||
continue;
|
||||
}
|
||||
if (stat & OMAP_I2C_STAT_ROVR) {
|
||||
dev_err(dev->adapter.dev, "Receive overrun\n");
|
||||
dev_err(&dev->adapter.dev, "Receive overrun\n");
|
||||
dev->cmd_err |= OMAP_I2C_STAT_ROVR;
|
||||
}
|
||||
if (stat & OMAP_I2C_STAT_XUDF) {
|
||||
dev_err(dev->adapter.dev, "Transmit underflow\n");
|
||||
dev_err(&dev->adapter.dev, "Transmit underflow\n");
|
||||
dev->cmd_err |= OMAP_I2C_STAT_XUDF;
|
||||
}
|
||||
}
|
||||
|
@ -639,7 +639,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adapter,
|
|||
int ret = 0;
|
||||
|
||||
|
||||
dev_dbg(adapter->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n",
|
||||
dev_dbg(&adapter->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n",
|
||||
msg->addr, msg->len, msg->flags, stop);
|
||||
|
||||
if (msg->len == 0)
|
||||
|
@ -687,7 +687,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adapter,
|
|||
|
||||
/* Let the user know if i2c is in a bad state */
|
||||
if (is_timeout(start, MSECOND)) {
|
||||
dev_err(adapter->dev, "controller timed out "
|
||||
dev_err(&adapter->dev, "controller timed out "
|
||||
"waiting for start condition to finish\n");
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
@ -707,7 +707,7 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adapter,
|
|||
while (ret){
|
||||
ret = omap_i2c_isr(i2c_omap);
|
||||
if (is_timeout(start, MSECOND)) {
|
||||
dev_err(adapter->dev,
|
||||
dev_err(&adapter->dev,
|
||||
"timed out on polling for "
|
||||
"open i2c message handling\n");
|
||||
return -ETIMEDOUT;
|
||||
|
@ -835,7 +835,7 @@ i2c_omap_probe(struct device_d *pdev)
|
|||
|
||||
i2c_omap->adapter.master_xfer = omap_i2c_xfer,
|
||||
i2c_omap->adapter.nr = pdev->id;
|
||||
i2c_omap->adapter.dev = pdev;
|
||||
i2c_omap->adapter.dev.parent = pdev;
|
||||
|
||||
/* i2c device drivers may be active on return from add_adapter() */
|
||||
r = i2c_add_numbered_adapter(&i2c_omap->adapter);
|
||||
|
|
|
@ -80,7 +80,7 @@ int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
|
|||
*/
|
||||
|
||||
for (ret = 0; ret < num; ret++) {
|
||||
dev_dbg(adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
|
||||
dev_dbg(&adap->dev, "master_xfer[%d] %c, addr=0x%02x, "
|
||||
"len=%d\n", ret, (msgs[ret].flags & I2C_M_RD)
|
||||
? 'R' : 'W', msgs[ret].addr, msgs[ret].len);
|
||||
}
|
||||
|
@ -256,6 +256,9 @@ struct i2c_client *i2c_new_device(struct i2c_adapter *adapter,
|
|||
client->adapter = adapter;
|
||||
client->addr = chip->addr;
|
||||
|
||||
client->dev.parent = &adapter->dev;
|
||||
dev_add_child(client->dev.parent, &client->dev);
|
||||
|
||||
status = register_device(&client->dev);
|
||||
|
||||
#if 0
|
||||
|
@ -363,9 +366,21 @@ struct i2c_adapter *i2c_get_adapter(int busnum)
|
|||
*/
|
||||
int i2c_add_numbered_adapter(struct i2c_adapter *adapter)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (i2c_get_adapter(adapter->nr))
|
||||
return -EBUSY;
|
||||
|
||||
adapter->dev.id = adapter->nr;
|
||||
strcpy(adapter->dev.name, "i2c");
|
||||
|
||||
if (adapter->dev.parent)
|
||||
dev_add_child(adapter->dev.parent, &adapter->dev);
|
||||
|
||||
ret = register_device(&adapter->dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
list_add_tail(&adapter->list, &adapter_list);
|
||||
|
||||
/* populate children from any i2c device tables */
|
||||
|
|
|
@ -66,7 +66,7 @@ struct i2c_msg {
|
|||
*
|
||||
*/
|
||||
struct i2c_adapter {
|
||||
struct device_d *dev; /* ptr to device */
|
||||
struct device_d dev; /* ptr to device */
|
||||
int nr; /* bus number */
|
||||
int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num);
|
||||
struct list_head list;
|
||||
|
|
Loading…
Reference in New Issue