mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-21 08:19:28 +00:00
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:
parent
1082d5d29d
commit
81f8115305
2 changed files with 21 additions and 2 deletions
|
@ -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:
|
||||
|
|
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__ */
|
Loading…
Reference in a new issue