lkml.org 
[lkml]   [2011]   [Oct]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/13] i2c-designware: Move retriveving the clock speed out of core code.
    Date
    From: Dirk Brandewie <dirk.brandewie@gmail.com>

    The clock frequecy supplied to the IP core is specific to a single
    instance of the driver. This patch makes it possible to have multiple
    Designware I2C cores in the system possibly running at different core
    frequencies.

    Signed-off-by: Dirk Brandewie <dirk.brandewie@gmail.com>
    Signed-off-by: Ben Dooks <ben-linux@fluff.org>
    ---
    drivers/i2c/busses/i2c-designware-core.c | 4 +++-
    drivers/i2c/busses/i2c-designware-core.h | 1 +
    drivers/i2c/busses/i2c-designware-platdrv.c | 6 ++++++
    3 files changed, 10 insertions(+), 1 deletions(-)

    diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c
    index 38d5a6b..cd52f17 100644
    --- a/drivers/i2c/busses/i2c-designware-core.c
    +++ b/drivers/i2c/busses/i2c-designware-core.c
    @@ -142,10 +142,12 @@ static u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset)
    */
    int i2c_dw_init(struct dw_i2c_dev *dev)
    {
    - u32 input_clock_khz = clk_get_rate(dev->clk) / 1000;
    + u32 input_clock_khz;
    u32 ic_con, hcnt, lcnt;
    u32 reg;

    + input_clock_khz = dev->get_clk_rate_khz(dev);
    +
    /* Configure register endianess access */
    reg = dw_readl(dev, DW_IC_COMP_TYPE);
    if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) {
    diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h
    index 4e37031..43de340 100644
    --- a/drivers/i2c/busses/i2c-designware-core.h
    +++ b/drivers/i2c/busses/i2c-designware-core.h
    @@ -166,6 +166,7 @@ struct dw_i2c_dev {
    struct completion cmd_complete;
    struct mutex lock;
    struct clk *clk;
    + u32 (*get_clk_rate_khz) (struct dw_i2c_dev *dev);
    int cmd_err;
    struct i2c_msg *msgs;
    int msgs_num;
    diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c
    index 9d10ae8..08783a6 100644
    --- a/drivers/i2c/busses/i2c-designware-platdrv.c
    +++ b/drivers/i2c/busses/i2c-designware-platdrv.c
    @@ -43,6 +43,10 @@ static struct i2c_algorithm i2c_dw_algo = {
    .master_xfer = i2c_dw_xfer,
    .functionality = i2c_dw_func,
    };
    +static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev)
    +{
    + return clk_get_rate(dev->clk)/1000;
    +}

    static int __devinit dw_i2c_probe(struct platform_device *pdev)
    {
    @@ -84,6 +88,8 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev)
    platform_set_drvdata(pdev, dev);

    dev->clk = clk_get(&pdev->dev, NULL);
    + dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz;
    +
    if (IS_ERR(dev->clk)) {
    r = -ENODEV;
    goto err_free_mem;
    --
    1.7.3.4


    \
     
     \ /
      Last update: 2011-10-06 20:31    [W:0.021 / U:31.600 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site