diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-sh_mobile.c')
-rw-r--r-- | drivers/i2c/busses/i2c-sh_mobile.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 81ccd787562..f633a53b6db 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include <linux/clk.h> | 32 | #include <linux/clk.h> |
33 | #include <linux/io.h> | 33 | #include <linux/io.h> |
34 | #include <linux/slab.h> | 34 | #include <linux/slab.h> |
35 | #include <linux/i2c/i2c-sh_mobile.h> | ||
35 | 36 | ||
36 | /* Transmit operation: */ | 37 | /* Transmit operation: */ |
37 | /* */ | 38 | /* */ |
@@ -117,7 +118,7 @@ struct sh_mobile_i2c_data { | |||
117 | struct device *dev; | 118 | struct device *dev; |
118 | void __iomem *reg; | 119 | void __iomem *reg; |
119 | struct i2c_adapter adap; | 120 | struct i2c_adapter adap; |
120 | 121 | unsigned long bus_speed; | |
121 | struct clk *clk; | 122 | struct clk *clk; |
122 | u_int8_t icic; | 123 | u_int8_t icic; |
123 | u_int8_t iccl; | 124 | u_int8_t iccl; |
@@ -205,7 +206,7 @@ static void activate_ch(struct sh_mobile_i2c_data *pd) | |||
205 | * We also round off the result. | 206 | * We also round off the result. |
206 | */ | 207 | */ |
207 | num = i2c_clk * 5; | 208 | num = i2c_clk * 5; |
208 | denom = NORMAL_SPEED * 9; | 209 | denom = pd->bus_speed * 9; |
209 | tmp = num * 10 / denom; | 210 | tmp = num * 10 / denom; |
210 | if (tmp % 10 >= 5) | 211 | if (tmp % 10 >= 5) |
211 | pd->iccl = (u_int8_t)((num/denom) + 1); | 212 | pd->iccl = (u_int8_t)((num/denom) + 1); |
@@ -574,10 +575,10 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook) | |||
574 | 575 | ||
575 | static int sh_mobile_i2c_probe(struct platform_device *dev) | 576 | static int sh_mobile_i2c_probe(struct platform_device *dev) |
576 | { | 577 | { |
578 | struct i2c_sh_mobile_platform_data *pdata = dev->dev.platform_data; | ||
577 | struct sh_mobile_i2c_data *pd; | 579 | struct sh_mobile_i2c_data *pd; |
578 | struct i2c_adapter *adap; | 580 | struct i2c_adapter *adap; |
579 | struct resource *res; | 581 | struct resource *res; |
580 | char clk_name[8]; | ||
581 | int size; | 582 | int size; |
582 | int ret; | 583 | int ret; |
583 | 584 | ||
@@ -587,10 +588,9 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
587 | return -ENOMEM; | 588 | return -ENOMEM; |
588 | } | 589 | } |
589 | 590 | ||
590 | snprintf(clk_name, sizeof(clk_name), "i2c%d", dev->id); | 591 | pd->clk = clk_get(&dev->dev, NULL); |
591 | pd->clk = clk_get(&dev->dev, clk_name); | ||
592 | if (IS_ERR(pd->clk)) { | 592 | if (IS_ERR(pd->clk)) { |
593 | dev_err(&dev->dev, "cannot get clock \"%s\"\n", clk_name); | 593 | dev_err(&dev->dev, "cannot get clock\n"); |
594 | ret = PTR_ERR(pd->clk); | 594 | ret = PTR_ERR(pd->clk); |
595 | goto err; | 595 | goto err; |
596 | } | 596 | } |
@@ -620,6 +620,11 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
620 | goto err_irq; | 620 | goto err_irq; |
621 | } | 621 | } |
622 | 622 | ||
623 | /* Use platformd data bus speed or NORMAL_SPEED */ | ||
624 | pd->bus_speed = NORMAL_SPEED; | ||
625 | if (pdata && pdata->bus_speed) | ||
626 | pd->bus_speed = pdata->bus_speed; | ||
627 | |||
623 | /* The IIC blocks on SH-Mobile ARM processors | 628 | /* The IIC blocks on SH-Mobile ARM processors |
624 | * come with two new bits in ICIC. | 629 | * come with two new bits in ICIC. |
625 | */ | 630 | */ |
@@ -660,6 +665,8 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
660 | goto err_all; | 665 | goto err_all; |
661 | } | 666 | } |
662 | 667 | ||
668 | dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n", | ||
669 | adap->nr, pd->bus_speed); | ||
663 | return 0; | 670 | return 0; |
664 | 671 | ||
665 | err_all: | 672 | err_all: |