[PATCH v6] I2C: add CSR SiRFprimaII on-chip I2C controllers driver

Shubhrajyoti Datta omaplinuxkernel at gmail.com
Thu Feb 16 11:54:00 EST 2012


Hello,

On Wed, Feb 8, 2012 at 8:58 PM, Barry Song <21cnbao at gmail.com> wrote:
> From: Zhiwu Song <Zhiwu.Song at csr.com>
>
> SiRFprimaII is the latest generation application processor from CSR’s
> multi-function SoC product family.
> The SoC support codes are in arch/arm/mach-prima2 from Linux mainline
> 3.0.
> There are two I2C controllers on primaII, features include:
> * Two I2C controller modules are on chip
> * RISC I/O bus read write register
> * Up to 16 bytes data buffer for issuing commands and writing data
>  at the same time
> * Up to 16 commands, and receiving read data 16 bytes at a time
> * Error INT report (ACK check)
> * No-ACK bus protocols (SCCB bus protocols)
>
> Signed-off-by: Zhiwu Song <Zhiwu.Song at csr.com>
> Signed-off-by: Xiangzhen Ye <Xiangzhen.Ye at csr.com>
> Signed-off-by: Yuping Luo <Yuping.Luo at csr.com>
> Signed-off-by: Barry Song <Baohua.Song at csr.com>
> ---
>  -v6:
>  fix/cleanup lots of minor issues pointed out by wolfram;
>  add OF property clock-frequency to support freq setting by DT;
>  add lost devicetree binding document;
>
>  Documentation/devicetree/bindings/i2c/sirf-i2c.txt |   19 +
>  drivers/i2c/busses/Kconfig                         |   10 +
>  drivers/i2c/busses/Makefile                        |    1 +
>  drivers/i2c/busses/i2c-sirf.c                      |  459 ++++++++++++++++++++
>  4 files changed, 489 insertions(+), 0 deletions(-)
>  create mode 100644 Documentation/devicetree/bindings/i2c/sirf-i2c.txt
>  create mode 100644 drivers/i2c/busses/i2c-sirf.c
>
> diff --git a/Documentation/devicetree/bindings/i2c/sirf-i2c.txt b/Documentation/devicetree/bindings/i2c/sirf-i2c.txt
> new file mode 100644
> index 0000000..7baf9e1
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/i2c/sirf-i2c.txt
<snip>

> +
> +               if (i2c_stat & SIRFSOC_I2C_STAT_NACK)
> +                       dev_err(&siic->adapter.dev, "ACK not received\n");
Could we send stop here?
> +               else
> +                       dev_err(&siic->adapter.dev, "I2C error\n");
> +
> +               complete(&siic->done);
<Snip>

> +static int i2c_sirfsoc_resume(struct device *dev)
> +{
> +       struct platform_device *pdev = to_platform_device(dev);
> +       struct i2c_adapter *adapter = platform_get_drvdata(pdev);
> +       struct sirfsoc_i2c *siic = adapter->algo_data;
> +
> +       clk_enable(siic->clk);
> +       writel(SIRFSOC_I2C_RESET, siic->base + SIRFSOC_I2C_CTRL);
Could you explain why is a reset needed.
Or am I missing something.

> +       writel(SIRFSOC_I2C_CORE_EN | SIRFSOC_I2C_MASTER_MODE,
> +               siic->base + SIRFSOC_I2C_CTRL);
> +       writel(siic->clk_div, siic->base + SIRFSOC_I2C_CLK_CTRL);
> +       writel(siic->sda_delay, siic->base + SIRFSOC_I2C_SDA_DELAY);
> +       clk_disable(siic->clk);
> +       return 0;
> +}
> +
> +static const struct dev_pm_ops i2c_sirfsoc_pm_ops = {
> +       .suspend = i2c_sirfsoc_suspend,
> +       .resume = i2c_sirfsoc_resume,
Could we use simple dev_pm ops here?

> +};
> +#endif
> +
> +static const struct of_device_id sirfsoc_i2c_of_match[] __devinitconst = {
> +       { .compatible = "sirf,prima2-i2c", },



More information about the linux-arm-kernel mailing list