Skip to content

Commit

Permalink
i2c-designware: Move retriveving the clock speed out of core code.
Browse files Browse the repository at this point in the history
The clock frequecy supplied to the IP core is specific to a single
instance of the driver.  This patch makes it possible to have multiple
Designware I2C cores in the system possibly running at different core
frequencies.

Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
Signed-off-by: Ben Dooks <ben-linux@fluff.org>
  • Loading branch information
Dirk Brandewie authored and Ben Dooks committed Oct 29, 2011
1 parent 2373f6b commit 1d31b58
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 1 deletion.
4 changes: 3 additions & 1 deletion drivers/i2c/busses/i2c-designware-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -142,10 +142,12 @@ static u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset)
*/
int i2c_dw_init(struct dw_i2c_dev *dev)
{
u32 input_clock_khz = clk_get_rate(dev->clk) / 1000;
u32 input_clock_khz;
u32 ic_con, hcnt, lcnt;
u32 reg;

input_clock_khz = dev->get_clk_rate_khz(dev);

/* Configure register endianess access */
reg = dw_readl(dev, DW_IC_COMP_TYPE);
if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
Expand Down
1 change: 1 addition & 0 deletions drivers/i2c/busses/i2c-designware-core.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,7 @@ struct dw_i2c_dev {
struct completion cmd_complete;
struct mutex lock;
struct clk *clk;
u32 (*get_clk_rate_khz) (struct dw_i2c_dev *dev);
int cmd_err;
struct i2c_msg *msgs;
int msgs_num;
Expand Down
6 changes: 6 additions & 0 deletions drivers/i2c/busses/i2c-designware-platdrv.c
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ static struct i2c_algorithm i2c_dw_algo = {
.master_xfer = i2c_dw_xfer,
.functionality = i2c_dw_func,
};
static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
{
return clk_get_rate(dev->clk)/1000;
}

static int __devinit dw_i2c_probe(struct platform_device *pdev)
{
Expand Down Expand Up @@ -84,6 +88,8 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
platform_set_drvdata(pdev, dev);

dev->clk = clk_get(&pdev->dev, NULL);
dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;

if (IS_ERR(dev->clk)) {
r = -ENODEV;
goto err_free_mem;
Expand Down

0 comments on commit 1d31b58

Please sign in to comment.