|
@@ -32,6 +32,7 @@
|
|
|
#include <linux/clk.h>
|
|
|
#include <linux/io.h>
|
|
|
#include <linux/slab.h>
|
|
|
+#include <linux/i2c/i2c-sh_mobile.h>
|
|
|
|
|
|
/* Transmit operation: */
|
|
|
/* */
|
|
@@ -117,7 +118,7 @@ struct sh_mobile_i2c_data {
|
|
|
struct device *dev;
|
|
|
void __iomem *reg;
|
|
|
struct i2c_adapter adap;
|
|
|
-
|
|
|
+ unsigned long bus_speed;
|
|
|
struct clk *clk;
|
|
|
u_int8_t icic;
|
|
|
u_int8_t iccl;
|
|
@@ -205,7 +206,7 @@ static void activate_ch(struct sh_mobile_i2c_data *pd)
|
|
|
* We also round off the result.
|
|
|
*/
|
|
|
num = i2c_clk * 5;
|
|
|
- denom = NORMAL_SPEED * 9;
|
|
|
+ denom = pd->bus_speed * 9;
|
|
|
tmp = num * 10 / denom;
|
|
|
if (tmp % 10 >= 5)
|
|
|
pd->iccl = (u_int8_t)((num/denom) + 1);
|
|
@@ -574,6 +575,7 @@ static int sh_mobile_i2c_hook_irqs(struct platform_device *dev, int hook)
|
|
|
|
|
|
static int sh_mobile_i2c_probe(struct platform_device *dev)
|
|
|
{
|
|
|
+ struct i2c_sh_mobile_platform_data *pdata = dev->dev.platform_data;
|
|
|
struct sh_mobile_i2c_data *pd;
|
|
|
struct i2c_adapter *adap;
|
|
|
struct resource *res;
|
|
@@ -618,6 +620,11 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
|
|
|
goto err_irq;
|
|
|
}
|
|
|
|
|
|
+ /* Use platformd data bus speed or NORMAL_SPEED */
|
|
|
+ pd->bus_speed = NORMAL_SPEED;
|
|
|
+ if (pdata && pdata->bus_speed)
|
|
|
+ pd->bus_speed = pdata->bus_speed;
|
|
|
+
|
|
|
/* The IIC blocks on SH-Mobile ARM processors
|
|
|
* come with two new bits in ICIC.
|
|
|
*/
|
|
@@ -658,6 +665,8 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
|
|
|
goto err_all;
|
|
|
}
|
|
|
|
|
|
+ dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n",
|
|
|
+ adap->nr, pd->bus_speed);
|
|
|
return 0;
|
|
|
|
|
|
err_all:
|