From: Shubhrajyoti <shubhrajyoti@ti.com>
To: balbi@ti.com
Cc: b-cousson@ti.com, tony@atomide.com, w.sang@pengutronix.de,
linux-i2c@vger.kernel.org, ben-linux@fluff.org,
linux-omap@vger.kernel.org, linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCHv2 1/7] i2c: omap: Fix the revision register read
Date: Mon, 5 Nov 2012 14:04:56 +0530 [thread overview]
Message-ID: <50977A30.6040907@ti.com> (raw)
In-Reply-To: <20121105075026.GB32468@arwen.pp.htv.fi>
On Monday 05 November 2012 01:20 PM, Felipe Balbi wrote:
> Hi,
>
> On Sun, Nov 04, 2012 at 04:14:27PM +0530, Shubhrajyoti D wrote:
>> The revision register on OMAP4 is a 16-bit lo and a 16-bit
>> hi. Currently the driver reads only the lower 8-bits.
>> Fix the same by preventing the truncating of the rev register
>> for OMAP4.
>>
>> Also use the scheme bit ie bit-14 of the hi register to know if it
>> is OMAP_I2C_IP_VERSION_2.
>>
>> On platforms previous to OMAP4 the offset 0x04 is IE register whose
>> bit-14 reset value is 0, the code uses the same to its advantage.
>>
>> Also since the omap_i2c_read_reg uses reg_map_ip_* a raw_readw is done
>> to fetch the revision register.
>>
>> The dev->regs is populated after reading the rev_hi. A NULL check
>> has been added in the resume handler to prevent the access before
>> the setting of the regs.
>>
>> Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com>
>> ---
>> drivers/i2c/busses/i2c-omap.c | 61 ++++++++++++++++++++++++++++++++---------
>> 1 files changed, 48 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
>> index db31eae..72fce6d 100644
>> --- a/drivers/i2c/busses/i2c-omap.c
>> +++ b/drivers/i2c/busses/i2c-omap.c
>> @@ -49,9 +49,10 @@
>> #define OMAP_I2C_OMAP1_REV_2 0x20
>>
>> /* I2C controller revisions present on specific hardware */
>> -#define OMAP_I2C_REV_ON_2430 0x36
>> -#define OMAP_I2C_REV_ON_3430_3530 0x3C
>> -#define OMAP_I2C_REV_ON_3630_4430 0x40
>> +#define OMAP_I2C_REV_ON_2430 0x00000036
>> +#define OMAP_I2C_REV_ON_3430_3530 0x0000003C
>> +#define OMAP_I2C_REV_ON_3630 0x00000040
>> +#define OMAP_I2C_REV_ON_4430_PLUS 0x50400002
>>
>> /* timeout waiting for the controller to respond */
>> #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000))
>> @@ -202,7 +203,7 @@ struct omap_i2c_dev {
>> * fifo_size==0 implies no fifo
>> * if set, should be trsh+1
>> */
>> - u8 rev;
>> + u32 rev;
>> unsigned b_hw:1; /* bad h/w fixes */
>> unsigned receiver:1; /* true when we're in receiver mode */
>> u16 iestate; /* Saved interrupt register */
>> @@ -490,7 +491,7 @@ static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx)
>>
>> omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, buf);
>>
>> - if (dev->rev < OMAP_I2C_REV_ON_3630_4430)
>> + if (dev->rev < OMAP_I2C_REV_ON_3630)
>> dev->b_hw = 1; /* Enable hardware fixes */
>>
>> /* calculate wakeup latency constraint for MPU */
>> @@ -1052,6 +1053,16 @@ static const struct of_device_id omap_i2c_of_match[] = {
>> MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
>> #endif
>>
>> +#define OMAP_I2C_SCHEME(rev) ((rev & 0xc000) >> 14)
>> +
>> +#define OMAP_I2C_REV_SCHEME_0_MAJOR(rev) (rev >> 4)
>> +#define OMAP_I2C_REV_SCHEME_0_MINOR(rev) (rev & 0xf)
>> +
>> +#define OMAP_I2C_REV_SCHEME_1_MAJOR(rev) ((rev & 0x0700) >> 7)
>> +#define OMAP_I2C_REV_SCHEME_1_MINOR(rev) (rev & 0x1f)
>> +#define OMAP_I2C_SCHEME_0 0
>> +#define OMAP_I2C_SCHEME_1 1
>> +
>> static int __devinit
>> omap_i2c_probe(struct platform_device *pdev)
>> {
>> @@ -1064,6 +1075,8 @@ omap_i2c_probe(struct platform_device *pdev)
>> const struct of_device_id *match;
>> int irq;
>> int r;
>> + u32 rev;
>> + u16 minor, major;
>>
>> /* NOTE: driver uses the static register mapping */
>> mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> @@ -1117,11 +1130,6 @@ omap_i2c_probe(struct platform_device *pdev)
>>
>> dev->reg_shift = (dev->flags >> OMAP_I2C_FLAG_BUS_SHIFT__SHIFT) & 3;
>>
>> - if (dev->dtrev == OMAP_I2C_IP_VERSION_2)
>> - dev->regs = (u8 *)reg_map_ip_v2;
>> - else
>> - dev->regs = (u8 *)reg_map_ip_v1;
>> -
>> pm_runtime_enable(dev->dev);
>> pm_runtime_set_autosuspend_delay(dev->dev, OMAP_I2C_PM_TIMEOUT);
>> pm_runtime_use_autosuspend(dev->dev);
>> @@ -1130,7 +1138,31 @@ omap_i2c_probe(struct platform_device *pdev)
>> if (IS_ERR_VALUE(r))
>> goto err_free_mem;
>>
>> - dev->rev = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff;
>> + /*
>> + * Read the Rev hi bit-[15:14] ie scheme this is 1 indicates ver2.
>> + * On omap3 Offset 4 is IE Reg the bit [15:14] is XDR_IE which is 0
> comment is wrong. You talk about 2 bits and document only one of them.
> Also, this is valid for all OMAPs until OMAP3, comment should probably
> read: On OMAP1/2/3 offset 0x04 is.....
will fix the comment.
>
>> + * at reset. Also since the omap_i2c_read_reg uses reg_map_ip_* a
>> + * raw_readw is done.
>> + */
>> + rev = __raw_readw(dev->base + 0x04);
>> +
>> + switch (OMAP_I2C_SCHEME(rev)) {
>> + case OMAP_I2C_SCHEME_0:
>> + dev->regs = (u8 *)reg_map_ip_v1;
>> + dev->rev = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff;
> drop the 0xff. Top byte is supposed to be zero
yes.
> and if it's not, we want
> to know what they hold.
OK. Just thought that the reserved values can wiped off:-)
>
>> + minor = OMAP_I2C_REV_SCHEME_0_MAJOR(dev->rev);
>> + major = OMAP_I2C_REV_SCHEME_0_MAJOR(dev->rev);
>> + break;
>> + case OMAP_I2C_SCHEME_1:
>> + /* FALLTHROUGH */
>> + default:
>> + dev->regs = (u8 *)reg_map_ip_v2;
>> + rev = (rev << 16) |
>> + omap_i2c_read_reg(dev, OMAP_I2C_IP_V2_REVNB_LO);
>> + minor = OMAP_I2C_REV_SCHEME_1_MINOR(rev);
>> + major = OMAP_I2C_REV_SCHEME_1_MAJOR(rev);
>> + dev->rev = rev;
>> + }
>>
>> dev->errata = 0;
>>
>> @@ -1155,7 +1187,7 @@ omap_i2c_probe(struct platform_device *pdev)
>>
>> dev->fifo_size = (dev->fifo_size / 2);
>>
>> - if (dev->rev < OMAP_I2C_REV_ON_3630_4430)
>> + if (dev->rev < OMAP_I2C_REV_ON_3630)
>> dev->b_hw = 1; /* Enable hardware fixes */
> looks like this was applicable to 4430 too, what happened ?
No actually this can be deleted completely once the
start -> transaction -> stop sequence recommendation is followed.
>
WARNING: multiple messages have this Message-ID (diff)
From: shubhrajyoti@ti.com (Shubhrajyoti)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCHv2 1/7] i2c: omap: Fix the revision register read
Date: Mon, 5 Nov 2012 14:04:56 +0530 [thread overview]
Message-ID: <50977A30.6040907@ti.com> (raw)
In-Reply-To: <20121105075026.GB32468@arwen.pp.htv.fi>
On Monday 05 November 2012 01:20 PM, Felipe Balbi wrote:
> Hi,
>
> On Sun, Nov 04, 2012 at 04:14:27PM +0530, Shubhrajyoti D wrote:
>> The revision register on OMAP4 is a 16-bit lo and a 16-bit
>> hi. Currently the driver reads only the lower 8-bits.
>> Fix the same by preventing the truncating of the rev register
>> for OMAP4.
>>
>> Also use the scheme bit ie bit-14 of the hi register to know if it
>> is OMAP_I2C_IP_VERSION_2.
>>
>> On platforms previous to OMAP4 the offset 0x04 is IE register whose
>> bit-14 reset value is 0, the code uses the same to its advantage.
>>
>> Also since the omap_i2c_read_reg uses reg_map_ip_* a raw_readw is done
>> to fetch the revision register.
>>
>> The dev->regs is populated after reading the rev_hi. A NULL check
>> has been added in the resume handler to prevent the access before
>> the setting of the regs.
>>
>> Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com>
>> ---
>> drivers/i2c/busses/i2c-omap.c | 61 ++++++++++++++++++++++++++++++++---------
>> 1 files changed, 48 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c
>> index db31eae..72fce6d 100644
>> --- a/drivers/i2c/busses/i2c-omap.c
>> +++ b/drivers/i2c/busses/i2c-omap.c
>> @@ -49,9 +49,10 @@
>> #define OMAP_I2C_OMAP1_REV_2 0x20
>>
>> /* I2C controller revisions present on specific hardware */
>> -#define OMAP_I2C_REV_ON_2430 0x36
>> -#define OMAP_I2C_REV_ON_3430_3530 0x3C
>> -#define OMAP_I2C_REV_ON_3630_4430 0x40
>> +#define OMAP_I2C_REV_ON_2430 0x00000036
>> +#define OMAP_I2C_REV_ON_3430_3530 0x0000003C
>> +#define OMAP_I2C_REV_ON_3630 0x00000040
>> +#define OMAP_I2C_REV_ON_4430_PLUS 0x50400002
>>
>> /* timeout waiting for the controller to respond */
>> #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000))
>> @@ -202,7 +203,7 @@ struct omap_i2c_dev {
>> * fifo_size==0 implies no fifo
>> * if set, should be trsh+1
>> */
>> - u8 rev;
>> + u32 rev;
>> unsigned b_hw:1; /* bad h/w fixes */
>> unsigned receiver:1; /* true when we're in receiver mode */
>> u16 iestate; /* Saved interrupt register */
>> @@ -490,7 +491,7 @@ static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx)
>>
>> omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, buf);
>>
>> - if (dev->rev < OMAP_I2C_REV_ON_3630_4430)
>> + if (dev->rev < OMAP_I2C_REV_ON_3630)
>> dev->b_hw = 1; /* Enable hardware fixes */
>>
>> /* calculate wakeup latency constraint for MPU */
>> @@ -1052,6 +1053,16 @@ static const struct of_device_id omap_i2c_of_match[] = {
>> MODULE_DEVICE_TABLE(of, omap_i2c_of_match);
>> #endif
>>
>> +#define OMAP_I2C_SCHEME(rev) ((rev & 0xc000) >> 14)
>> +
>> +#define OMAP_I2C_REV_SCHEME_0_MAJOR(rev) (rev >> 4)
>> +#define OMAP_I2C_REV_SCHEME_0_MINOR(rev) (rev & 0xf)
>> +
>> +#define OMAP_I2C_REV_SCHEME_1_MAJOR(rev) ((rev & 0x0700) >> 7)
>> +#define OMAP_I2C_REV_SCHEME_1_MINOR(rev) (rev & 0x1f)
>> +#define OMAP_I2C_SCHEME_0 0
>> +#define OMAP_I2C_SCHEME_1 1
>> +
>> static int __devinit
>> omap_i2c_probe(struct platform_device *pdev)
>> {
>> @@ -1064,6 +1075,8 @@ omap_i2c_probe(struct platform_device *pdev)
>> const struct of_device_id *match;
>> int irq;
>> int r;
>> + u32 rev;
>> + u16 minor, major;
>>
>> /* NOTE: driver uses the static register mapping */
>> mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
>> @@ -1117,11 +1130,6 @@ omap_i2c_probe(struct platform_device *pdev)
>>
>> dev->reg_shift = (dev->flags >> OMAP_I2C_FLAG_BUS_SHIFT__SHIFT) & 3;
>>
>> - if (dev->dtrev == OMAP_I2C_IP_VERSION_2)
>> - dev->regs = (u8 *)reg_map_ip_v2;
>> - else
>> - dev->regs = (u8 *)reg_map_ip_v1;
>> -
>> pm_runtime_enable(dev->dev);
>> pm_runtime_set_autosuspend_delay(dev->dev, OMAP_I2C_PM_TIMEOUT);
>> pm_runtime_use_autosuspend(dev->dev);
>> @@ -1130,7 +1138,31 @@ omap_i2c_probe(struct platform_device *pdev)
>> if (IS_ERR_VALUE(r))
>> goto err_free_mem;
>>
>> - dev->rev = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff;
>> + /*
>> + * Read the Rev hi bit-[15:14] ie scheme this is 1 indicates ver2.
>> + * On omap3 Offset 4 is IE Reg the bit [15:14] is XDR_IE which is 0
> comment is wrong. You talk about 2 bits and document only one of them.
> Also, this is valid for all OMAPs until OMAP3, comment should probably
> read: On OMAP1/2/3 offset 0x04 is.....
will fix the comment.
>
>> + * at reset. Also since the omap_i2c_read_reg uses reg_map_ip_* a
>> + * raw_readw is done.
>> + */
>> + rev = __raw_readw(dev->base + 0x04);
>> +
>> + switch (OMAP_I2C_SCHEME(rev)) {
>> + case OMAP_I2C_SCHEME_0:
>> + dev->regs = (u8 *)reg_map_ip_v1;
>> + dev->rev = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff;
> drop the 0xff. Top byte is supposed to be zero
yes.
> and if it's not, we want
> to know what they hold.
OK. Just thought that the reserved values can wiped off:-)
>
>> + minor = OMAP_I2C_REV_SCHEME_0_MAJOR(dev->rev);
>> + major = OMAP_I2C_REV_SCHEME_0_MAJOR(dev->rev);
>> + break;
>> + case OMAP_I2C_SCHEME_1:
>> + /* FALLTHROUGH */
>> + default:
>> + dev->regs = (u8 *)reg_map_ip_v2;
>> + rev = (rev << 16) |
>> + omap_i2c_read_reg(dev, OMAP_I2C_IP_V2_REVNB_LO);
>> + minor = OMAP_I2C_REV_SCHEME_1_MINOR(rev);
>> + major = OMAP_I2C_REV_SCHEME_1_MAJOR(rev);
>> + dev->rev = rev;
>> + }
>>
>> dev->errata = 0;
>>
>> @@ -1155,7 +1187,7 @@ omap_i2c_probe(struct platform_device *pdev)
>>
>> dev->fifo_size = (dev->fifo_size / 2);
>>
>> - if (dev->rev < OMAP_I2C_REV_ON_3630_4430)
>> + if (dev->rev < OMAP_I2C_REV_ON_3630)
>> dev->b_hw = 1; /* Enable hardware fixes */
> looks like this was applicable to 4430 too, what happened ?
No actually this can be deleted completely once the
start -> transaction -> stop sequence recommendation is followed.
>
next prev parent reply other threads:[~2012-11-05 8:34 UTC|newest]
Thread overview: 52+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-11-04 10:44 [PATCHv2 0/7] i2c: omap: updates Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
2012-11-04 10:44 ` [PATCHv2 5/7] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-6-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:54 ` Felipe Balbi
2012-11-05 7:54 ` Felipe Balbi
2012-11-04 10:44 ` [PATCHv2 6/7] i2c: omap: make reset a seperate function Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
2012-11-05 7:55 ` Felipe Balbi
2012-11-05 7:55 ` Felipe Balbi
[not found] ` <1352025873-27492-1-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-04 10:44 ` [PATCHv2 1/7] i2c: omap: Fix the revision register read Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-2-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:50 ` Felipe Balbi
2012-11-05 7:50 ` Felipe Balbi
2012-11-05 8:34 ` Shubhrajyoti [this message]
2012-11-05 8:34 ` Shubhrajyoti
[not found] ` <50977A30.6040907-l0cyMroinI0@public.gmane.org>
2012-11-05 9:04 ` Felipe Balbi
2012-11-05 9:04 ` Felipe Balbi
2012-11-05 9:24 ` Shubhrajyoti Datta
2012-11-05 9:24 ` Shubhrajyoti Datta
2012-11-05 10:01 ` Felipe Balbi
2012-11-05 10:01 ` Felipe Balbi
[not found] ` <20121105100105.GC3327-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-11-05 10:45 ` Felipe Balbi
2012-11-05 10:45 ` Felipe Balbi
2012-11-05 9:40 ` Shubhrajyoti Datta
2012-11-05 9:40 ` Shubhrajyoti Datta
2012-11-04 10:44 ` [PATCHv2 2/7] i2c: omap: use revision check for OMAP_I2C_FLAG_APPLY_ERRATA_I207 Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-3-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:51 ` Felipe Balbi
2012-11-05 7:51 ` Felipe Balbi
2012-11-04 10:44 ` [PATCHv2 3/7] i2c: omap: remove the dtrev Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-4-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:53 ` Felipe Balbi
2012-11-05 7:53 ` Felipe Balbi
[not found] ` <20121105075320.GD32468-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-11-05 8:44 ` Shubhrajyoti
2012-11-05 8:44 ` Shubhrajyoti
2012-11-05 9:05 ` Felipe Balbi
2012-11-05 9:05 ` Felipe Balbi
[not found] ` <20121105090517.GB2913-S8G//mZuvNWo5Im9Ml3/Zg@public.gmane.org>
2012-11-05 9:26 ` Shubhrajyoti
2012-11-05 9:26 ` Shubhrajyoti
2012-11-04 10:44 ` [PATCHv2 4/7] ARM: i2c: omap: Remove the i207 errata flag Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-5-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:53 ` Felipe Balbi
2012-11-05 7:53 ` Felipe Balbi
2012-11-04 10:44 ` [PATCHv2 7/7] i2c: omap: Restore i2c context always Shubhrajyoti D
2012-11-04 10:44 ` Shubhrajyoti D
[not found] ` <1352025873-27492-8-git-send-email-shubhrajyoti-l0cyMroinI0@public.gmane.org>
2012-11-05 7:56 ` Felipe Balbi
2012-11-05 7:56 ` Felipe Balbi
2012-11-05 7:46 ` [PATCHv2 0/7] i2c: omap: updates Felipe Balbi
2012-11-05 7:46 ` Felipe Balbi
2012-11-05 8:34 ` Shubhrajyoti
2012-11-05 8:34 ` Shubhrajyoti
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=50977A30.6040907@ti.com \
--to=shubhrajyoti@ti.com \
--cc=b-cousson@ti.com \
--cc=balbi@ti.com \
--cc=ben-linux@fluff.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-i2c@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=tony@atomide.com \
--cc=w.sang@pengutronix.de \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.