Skip to content

Commit

Permalink
i2c: nomadik: Add Device Tree support to the Nomadik I2C driver
Browse files Browse the repository at this point in the history
Here we apply the bindings required for successful Device Tree
probing of the i2c-nomadik driver.

Signed-off-by: Lee Jones <lee.jones@linaro.org>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
  • Loading branch information
Lee Jones authored and Wolfram Sang committed Oct 6, 2012
1 parent a76e7c6 commit 43fea58
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
23 changes: 23 additions & 0 deletions Documentation/devicetree/bindings/i2c/nomadik.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
I2C for Nomadik based systems

Required (non-standard) properties:
- Nil

Recommended (non-standard) properties:
- clock-frequency : Maximum bus clock frequency for the device

Optional (non-standard) properties:
- Nil

Example :

i2c@80004000 {
compatible = "stericsson,db8500-i2c", "st,nomadik-i2c";
reg = <0x80004000 0x1000>;
interrupts = <0 21 0x4>;
#address-cells = <1>;
#size-cells = <0>;
v-i2c-supply = <&db8500_vape_reg>;

clock-frequency = <400000>;
};
35 changes: 32 additions & 3 deletions drivers/i2c/busses/i2c-nomadik.c
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
#include <linux/io.h>
#include <linux/pm_runtime.h>
#include <linux/platform_data/i2c-nomadik.h>
#include <linux/of.h>
#include <linux/of_i2c.h>

#define DRIVER_NAME "nmk-i2c"

Expand Down Expand Up @@ -913,18 +915,42 @@ static struct nmk_i2c_controller u8500_i2c = {
.sm = I2C_FREQ_MODE_FAST,
};

static void nmk_i2c_of_probe(struct device_node *np,
struct nmk_i2c_controller *pdata)
{
of_property_read_u32(np, "clock-frequency", &pdata->clk_freq);

/* This driver only supports 'standard' and 'fast' modes of operation. */
if (pdata->clk_freq <= 100000)
pdata->sm = I2C_FREQ_MODE_STANDARD;
else
pdata->sm = I2C_FREQ_MODE_FAST;
}

static atomic_t adapter_id = ATOMIC_INIT(0);

static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)
{
int ret = 0;
struct nmk_i2c_controller *pdata = adev->dev.platform_data;
struct device_node *np = adev->dev.of_node;
struct nmk_i2c_dev *dev;
struct i2c_adapter *adap;

if (!pdata)
/* No i2c configuration found, using the default. */
pdata = &u8500_i2c;
if (!pdata) {
if (np) {
pdata = devm_kzalloc(&adev->dev, sizeof(*pdata), GFP_KERNEL);
if (!pdata) {
ret = -ENOMEM;
goto err_no_mem;
}
/* Provide the default configuration as a base. */
memcpy(pdata, &u8500_i2c, sizeof(struct nmk_i2c_controller));
nmk_i2c_of_probe(np, pdata);
} else
/* No i2c configuration found, using the default. */
pdata = &u8500_i2c;
}

dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL);
if (!dev) {
Expand Down Expand Up @@ -960,6 +986,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)
}

adap = &dev->adap;
adap->dev.of_node = np;
adap->dev.parent = &adev->dev;
adap->owner = THIS_MODULE;
adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
Expand Down Expand Up @@ -989,6 +1016,8 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id)
goto err_add_adap;
}

of_i2c_register_devices(adap);

pm_runtime_put(&adev->dev);

return 0;
Expand Down
2 changes: 1 addition & 1 deletion include/linux/platform_data/i2c-nomadik.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ enum i2c_freq_mode {
* @sm: speed mode
*/
struct nmk_i2c_controller {
unsigned long clk_freq;
u32 clk_freq;
unsigned short slsu;
unsigned char tft;
unsigned char rft;
Expand Down

0 comments on commit 43fea58

Please sign in to comment.