lkml.org 
[lkml]   [2012]   [Sep]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH 3/3] i2c: nomadik: Add Device Tree support to the Nomadik I2C driver
    Author: Lee Jones <lee.jones@linaro.org>
    Date: Mon Aug 6 11:09:57 2012 +0100

    i2c: nomadik: Add Device Tree support to the Nomadik I2C driver

    Here we apply the bindings required for successful Device Tree
    probing of the i2c-nomadik driver.

    Cc: linux-i2c@vger.kernel.org
    Signed-off-by: Lee Jones <lee.jones@linaro.org>

    diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c
    index 61b00ed..5d1a970 100644
    --- a/drivers/i2c/busses/i2c-nomadik.c
    +++ b/drivers/i2c/busses/i2c-nomadik.c
    @@ -25,6 +25,7 @@
    #include <linux/regulator/consumer.h>
    #include <linux/pm_runtime.h>
    #include <linux/platform_data/i2c-nomadik.h>
    +#include <linux/of.h>

    #define DRIVER_NAME "nmk-i2c"

    @@ -920,18 +921,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) {
    diff --git a/include/linux/platform_data/i2c-nomadik.h b/include/linux/platform_data/i2c-nomadik.h
    index c2303c3..3a8be9c 100644
    --- a/include/linux/platform_data/i2c-nomadik.h
    +++ b/include/linux/platform_data/i2c-nomadik.h
    @@ -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;

    \
     
     \ /
      Last update: 2012-09-05 10:23    [W:2.187 / U:0.216 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site