i2c: i2c-sh_mobile bus speed platform data V2
Add support to the i2c-sh_mobile driver for setting the I2C bus speed using platform data. Signed-off-by: Magnus Damm <damm@opensource.se> Signed-off-by: Ben Dooks <ben-linux@fluff.org>
This commit is contained in:
@@ -32,6 +32,7 @@
|
|||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/i2c/i2c-sh_mobile.h>
|
||||||
|
|
||||||
/* Transmit operation: */
|
/* Transmit operation: */
|
||||||
/* */
|
/* */
|
||||||
@@ -117,7 +118,7 @@ struct sh_mobile_i2c_data {
|
|||||||
struct device *dev;
|
struct device *dev;
|
||||||
void __iomem *reg;
|
void __iomem *reg;
|
||||||
struct i2c_adapter adap;
|
struct i2c_adapter adap;
|
||||||
|
unsigned long bus_speed;
|
||||||
struct clk *clk;
|
struct clk *clk;
|
||||||
u_int8_t icic;
|
u_int8_t icic;
|
||||||
u_int8_t iccl;
|
u_int8_t iccl;
|
||||||
@@ -205,7 +206,7 @@ static void activate_ch(struct sh_mobile_i2c_data *pd)
|
|||||||
* We also round off the result.
|
* We also round off the result.
|
||||||
*/
|
*/
|
||||||
num = i2c_clk * 5;
|
num = i2c_clk * 5;
|
||||||
denom = NORMAL_SPEED * 9;
|
denom = pd->bus_speed * 9;
|
||||||
tmp = num * 10 / denom;
|
tmp = num * 10 / denom;
|
||||||
if (tmp % 10 >= 5)
|
if (tmp % 10 >= 5)
|
||||||
pd->iccl = (u_int8_t)((num/denom) + 1);
|
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)
|
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 sh_mobile_i2c_data *pd;
|
||||||
struct i2c_adapter *adap;
|
struct i2c_adapter *adap;
|
||||||
struct resource *res;
|
struct resource *res;
|
||||||
@@ -618,6 +620,11 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
|
|||||||
goto err_irq;
|
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
|
/* The IIC blocks on SH-Mobile ARM processors
|
||||||
* come with two new bits in ICIC.
|
* come with two new bits in ICIC.
|
||||||
*/
|
*/
|
||||||
@@ -658,6 +665,8 @@ static int sh_mobile_i2c_probe(struct platform_device *dev)
|
|||||||
goto err_all;
|
goto err_all;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n",
|
||||||
|
adap->nr, pd->bus_speed);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_all:
|
err_all:
|
||||||
|
10
include/linux/i2c/i2c-sh_mobile.h
Normal file
10
include/linux/i2c/i2c-sh_mobile.h
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
#ifndef __I2C_SH_MOBILE_H__
|
||||||
|
#define __I2C_SH_MOBILE_H__
|
||||||
|
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
|
||||||
|
struct i2c_sh_mobile_platform_data {
|
||||||
|
unsigned long bus_speed;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /* __I2C_SH_MOBILE_H__ */
|
Reference in New Issue
Block a user