From: Ben Dooks <ben-linux@fluff.org>
To: Santosh Shilimkar <santosh.shilimkar@ti.com>
Cc: ben-linux@fluff.org, linux-omap@vger.kernel.org,
linux-i2c@vger.kernel.org, Syed Rafiuddin <rafiuddin.syed@ti.com>,
Cory Maccarrone <darkstar6262@gmail.com>
Subject: Re: [PATCH] omap: i2c: Add i2c support on omap4 platform
Date: Sun, 7 Mar 2010 22:18:19 +0000 [thread overview]
Message-ID: <20100307221819.GA15071@fluff.org.uk> (raw)
In-Reply-To: <1266597180-25139-1-git-send-email-santosh.shilimkar@ti.com>
On Fri, Feb 19, 2010 at 10:03:00PM +0530, Santosh Shilimkar wrote:
> This patch is rebased version of earlier post to add I2C
> driver support to OMAP4 platform. On OMAP4, all
> I2C register address offsets are changed from OMAP1/2/3 I2C.
> In order to not have #ifdef's at various places in code,
> as well as to support multi-OMAP build, an array is created
> to hold the register addresses with it's offset.
>
> This patch was submitted, reviewed and acked on mailing list
> already. For more details refer below link
> http://www.mail-archive.com/linux-i2c@vger.kernel.org/msg02281.html
>
> This updated verion has a depedancy on "Add support for 16-bit registers"
> posted on linux-omap. Below is the patch-works link for the same
>
> http://patchwork.kernel.org/patch/72295/
currently even with this patch applied it doesn't apply cleanly.
> Signed-off-by: Syed Rafiuddin <rafiuddin.syed@ti.com>
> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
> Acked-by: Kevin Hilman <khilman@deeprootsystems.com>
> Reviewed-by: Paul Walmsley <paul@pwsan.com>
> Reviewed-by: Tony Lindgren <tony@atomide.com>
> Cc: Ben Dooks <ben-linux@fluff.org>
> Cc: Cory Maccarrone <darkstar6262@gmail.com>
> ---
> drivers/i2c/busses/i2c-omap.c | 146 ++++++++++++++++++++++++++++++++---------
> 1 files changed, 114 insertions(+), 32 deletions(-)
>
> diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
> index 9c3ce4d..7c15496 100644
> --- a/drivers/i2c/busses/i2c-omap.c
> +++ b/drivers/i2c/busses/i2c-omap.c
> @@ -44,29 +44,37 @@
> /* I2C controller revisions present on specific hardware */
> #define OMAP_I2C_REV_ON_2430 0x36
> #define OMAP_I2C_REV_ON_3430 0x3C
> +#define OMAP_I2C_REV_ON_4430 0x40
>
> /* timeout waiting for the controller to respond */
> #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000))
>
> -#define OMAP_I2C_REV_REG 0x00
> -#define OMAP_I2C_IE_REG 0x01
> -#define OMAP_I2C_STAT_REG 0x02
> -#define OMAP_I2C_IV_REG 0x03
> /* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */
> -#define OMAP_I2C_WE_REG 0x03
> -#define OMAP_I2C_SYSS_REG 0x04
> -#define OMAP_I2C_BUF_REG 0x05
> -#define OMAP_I2C_CNT_REG 0x06
> -#define OMAP_I2C_DATA_REG 0x07
> -#define OMAP_I2C_SYSC_REG 0x08
> -#define OMAP_I2C_CON_REG 0x09
> -#define OMAP_I2C_OA_REG 0x0a
> -#define OMAP_I2C_SA_REG 0x0b
> -#define OMAP_I2C_PSC_REG 0x0c
> -#define OMAP_I2C_SCLL_REG 0x0d
> -#define OMAP_I2C_SCLH_REG 0x0e
> -#define OMAP_I2C_SYSTEST_REG 0x0f
> -#define OMAP_I2C_BUFSTAT_REG 0x10
> +enum {
> + OMAP_I2C_REV_REG = 0,
> + OMAP_I2C_IE_REG,
> + OMAP_I2C_STAT_REG,
> + OMAP_I2C_IV_REG,
> + OMAP_I2C_WE_REG,
> + OMAP_I2C_SYSS_REG,
> + OMAP_I2C_BUF_REG,
> + OMAP_I2C_CNT_REG,
> + OMAP_I2C_DATA_REG,
> + OMAP_I2C_SYSC_REG,
> + OMAP_I2C_CON_REG,
> + OMAP_I2C_OA_REG,
> + OMAP_I2C_SA_REG,
> + OMAP_I2C_PSC_REG,
> + OMAP_I2C_SCLL_REG,
> + OMAP_I2C_SCLH_REG,
> + OMAP_I2C_SYSTEST_REG,
> + OMAP_I2C_BUFSTAT_REG,
> + OMAP_I2C_REVNB_LO,
> + OMAP_I2C_REVNB_HI,
> + OMAP_I2C_IRQSTATUS_RAW,
> + OMAP_I2C_IRQENABLE_SET,
> + OMAP_I2C_IRQENABLE_CLR,
> +};
>
> /* I2C Interrupt Enable Register (OMAP_I2C_IE): */
> #define OMAP_I2C_IE_XDR (1 << 14) /* TX Buffer drain int enable */
> @@ -169,6 +177,7 @@ struct omap_i2c_dev {
> u32 speed; /* Speed of bus in Khz */
> u16 cmd_err;
> u8 *buf;
> + u8 *regs;
> size_t buf_len;
> struct i2c_adapter adapter;
> u8 fifo_size; /* use as flag and value
> @@ -187,15 +196,64 @@ struct omap_i2c_dev {
> u16 westate;
> };
>
> +const static u8 reg_map[] = {
> + [OMAP_I2C_REV_REG] = 0x00,
> + [OMAP_I2C_IE_REG] = 0x01,
> + [OMAP_I2C_STAT_REG] = 0x02,
> + [OMAP_I2C_IV_REG] = 0x03,
> + [OMAP_I2C_WE_REG] = 0x03,
> + [OMAP_I2C_SYSS_REG] = 0x04,
> + [OMAP_I2C_BUF_REG] = 0x05,
> + [OMAP_I2C_CNT_REG] = 0x06,
> + [OMAP_I2C_DATA_REG] = 0x07,
> + [OMAP_I2C_SYSC_REG] = 0x08,
> + [OMAP_I2C_CON_REG] = 0x09,
> + [OMAP_I2C_OA_REG] = 0x0a,
> + [OMAP_I2C_SA_REG] = 0x0b,
> + [OMAP_I2C_PSC_REG] = 0x0c,
> + [OMAP_I2C_SCLL_REG] = 0x0d,
> + [OMAP_I2C_SCLH_REG] = 0x0e,
> + [OMAP_I2C_SYSTEST_REG] = 0x0f,
> + [OMAP_I2C_BUFSTAT_REG] = 0x10,
> +};
> +
> +const static u8 omap4_reg_map[] = {
> + [OMAP_I2C_REV_REG] = 0x04,
> + [OMAP_I2C_IE_REG] = 0x2c,
> + [OMAP_I2C_STAT_REG] = 0x28,
> + [OMAP_I2C_IV_REG] = 0x34,
> + [OMAP_I2C_WE_REG] = 0x34,
> + [OMAP_I2C_SYSS_REG] = 0x90,
> + [OMAP_I2C_BUF_REG] = 0x94,
> + [OMAP_I2C_CNT_REG] = 0x98,
> + [OMAP_I2C_DATA_REG] = 0x9c,
> + [OMAP_I2C_SYSC_REG] = 0x20,
> + [OMAP_I2C_CON_REG] = 0xa4,
> + [OMAP_I2C_OA_REG] = 0xa8,
> + [OMAP_I2C_SA_REG] = 0xac,
> + [OMAP_I2C_PSC_REG] = 0xb0,
> + [OMAP_I2C_SCLL_REG] = 0xb4,
> + [OMAP_I2C_SCLH_REG] = 0xb8,
> + [OMAP_I2C_SYSTEST_REG] = 0xbC,
> + [OMAP_I2C_BUFSTAT_REG] = 0xc0,
> + [OMAP_I2C_REVNB_LO] = 0x00,
> + [OMAP_I2C_REVNB_HI] = 0x04,
> + [OMAP_I2C_IRQSTATUS_RAW] = 0x24,
> + [OMAP_I2C_IRQENABLE_SET] = 0x2c,
> + [OMAP_I2C_IRQENABLE_CLR] = 0x30,
> +};
> +
> static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev,
> int reg, u16 val)
> {
> - __raw_writew(val, i2c_dev->base + (reg << i2c_dev->reg_shift));
> + __raw_writew(val, i2c_dev->base +
> + (i2c_dev->regs[reg] << i2c_dev->reg_shift));
> }
>
> static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg)
> {
> - return __raw_readw(i2c_dev->base + (reg << i2c_dev->reg_shift));
> + return __raw_readw(i2c_dev->base +
> + (i2c_dev->regs[reg] << i2c_dev->reg_shift));
> }
>
> static int __init omap_i2c_get_clocks(struct omap_i2c_dev *dev)
> @@ -264,7 +322,11 @@ static void omap_i2c_idle(struct omap_i2c_dev *dev)
> WARN_ON(dev->idle);
>
> dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG);
> - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
> + if (dev->rev >= OMAP_I2C_REV_ON_4430)
> + omap_i2c_write_reg(dev, OMAP_I2C_IRQENABLE_CLR, 1);
> + else
> + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0);
> +
> if (dev->rev < OMAP_I2C_REV_2) {
> iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); /* Read clears */
> } else {
> @@ -329,7 +391,9 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
> * REVISIT: Some wkup sources might not be needed.
> */
> dev->westate = OMAP_I2C_WE_ALL;
> - omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate);
> + if (dev->rev < OMAP_I2C_REV_ON_4430)
> + omap_i2c_write_reg(dev, OMAP_I2C_WE_REG,
> + dev->westate);
> }
> }
> omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0);
> @@ -356,7 +420,7 @@ static int omap_i2c_init(struct omap_i2c_dev *dev)
> psc = fclk_rate / 12000000;
> }
>
> - if (cpu_is_omap2430() || cpu_is_omap34xx()) {
> + if (!(cpu_class_is_omap1() || cpu_is_omap2420())) {
>
> /*
> * HSI2C controller internal clk rate should be 19.2 Mhz for
> @@ -746,9 +810,12 @@ complete:
> if (dev->buf_len) {
> *dev->buf++ = w;
> dev->buf_len--;
> - /* Data reg from 2430 is 8 bit wide */
> - if (!cpu_is_omap2430() &&
> - !cpu_is_omap34xx()) {
> + /*
> + * Data reg in 2430, omap3 and
> + * omap4 is 8 bit wide
> + */
> + if (cpu_class_is_omap1() ||
> + cpu_is_omap2420()) {
> if (dev->buf_len) {
> *dev->buf++ = w >> 8;
> dev->buf_len--;
> @@ -786,9 +853,12 @@ complete:
> if (dev->buf_len) {
> w = *dev->buf++;
> dev->buf_len--;
> - /* Data reg from 2430 is 8 bit wide */
> - if (!cpu_is_omap2430() &&
> - !cpu_is_omap34xx()) {
> + /*
> + * Data reg in 2430, omap3 and
> + * omap4 is 8 bit wide
> + */
> + if (cpu_class_is_omap1() ||
> + cpu_is_omap2420()) {
> if (dev->buf_len) {
> w |= *dev->buf++ << 8;
> dev->buf_len--;
> @@ -897,6 +967,8 @@ omap_i2c_probe(struct platform_device *pdev)
>
> if (cpu_is_omap7xx())
> dev->reg_shift = 1;
> + else if (cpu_is_omap44xx())
> + dev->reg_shift = 0;
> else
> dev->reg_shift = 2;
>
> @@ -911,11 +983,16 @@ omap_i2c_probe(struct platform_device *pdev)
> if ((r = omap_i2c_get_clocks(dev)) != 0)
> goto err_iounmap;
>
> + if (cpu_is_omap44xx())
> + dev->regs = (u8 *) omap4_reg_map;
> + else
> + dev->regs = (u8 *) reg_map;
> +
> omap_i2c_unidle(dev);
>
> dev->rev = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff;
>
> - if (cpu_is_omap2430() || cpu_is_omap34xx()) {
> + if (!(cpu_class_is_omap1() || cpu_is_omap2420())) {
> u16 s;
>
> /* Set up the fifo size - Get total size */
> @@ -927,8 +1004,13 @@ omap_i2c_probe(struct platform_device *pdev)
> * size. This is to ensure that we can handle the status on int
> * call back latencies.
> */
> - dev->fifo_size = (dev->fifo_size / 2);
> - dev->b_hw = 1; /* Enable hardware fixes */
> + if (dev->rev >= OMAP_I2C_REV_ON_4430) {
> + dev->fifo_size = 0;
> + dev->b_hw = 0; /* Disable hardware fixes */
> + } else {
> + dev->fifo_size = (dev->fifo_size / 2);
> + dev->b_hw = 1; /* Enable hardware fixes */
> + }
> }
>
> /* reset ASAP, clearing any IRQs */
> --
> 1.6.0.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-i2c" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Ben (ben@fluff.org, http://www.fluff.org/)
'a smiley only costs 4 bytes'
next prev parent reply other threads:[~2010-03-07 22:18 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-02-19 16:33 [PATCH] omap: i2c: Add i2c support on omap4 platform Santosh Shilimkar
[not found] ` <1266597180-25139-1-git-send-email-santosh.shilimkar-l0cyMroinI0@public.gmane.org>
2010-02-23 6:01 ` Shilimkar, Santosh
[not found] ` <EAF47CD23C76F840A9E7FCE10091EFAB02C42E10AD-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2010-02-25 21:47 ` Tony Lindgren
2010-02-26 4:57 ` Shilimkar, Santosh
[not found] ` <EAF47CD23C76F840A9E7FCE10091EFAB02C43BF6C3-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2010-02-27 4:08 ` Shilimkar, Santosh
[not found] ` <EAF47CD23C76F840A9E7FCE10091EFAB02C43BFC61-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2010-02-27 20:40 ` Tony Lindgren
[not found] ` <20100227204049.GK17041-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2010-02-28 5:31 ` Shilimkar, Santosh
2010-03-02 22:54 ` Tony Lindgren
[not found] ` <20100302225445.GA14164-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2010-03-07 0:47 ` Angelo Arrifano
2010-03-07 4:38 ` Cory Maccarrone
2010-03-07 22:18 ` Ben Dooks [this message]
[not found] ` <20100307221819.GA15071-elnMNo+KYs3pIgCt6eIbzw@public.gmane.org>
2010-03-08 5:01 ` Shilimkar, Santosh
[not found] ` <EAF47CD23C76F840A9E7FCE10091EFAB02C4619F89-/tLxBxkBPtCIQmiDNMet8wC/G2K4zDHf@public.gmane.org>
2010-03-08 7:40 ` Shilimkar, Santosh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20100307221819.GA15071@fluff.org.uk \
--to=ben-linux@fluff.org \
--cc=darkstar6262@gmail.com \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=rafiuddin.syed@ti.com \
--cc=santosh.shilimkar@ti.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).