* [PATCH 0/2] OMAP2/3: fix the i2c,gpio reset timeouts during boot.
@ 2011-04-01 15:34 Avinash.H.M
2011-04-01 15:34 ` [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup Avinash.H.M
2011-04-01 15:34 ` [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen " Avinash.H.M
0 siblings, 2 replies; 9+ messages in thread
From: Avinash.H.M @ 2011-04-01 15:34 UTC (permalink / raw)
To: linux-omap; +Cc: Avinash.H.M
Hi ,
The patches solve the reset timeouts seen in i2c and gpio modules while
booting omap2 and omap3.
Baseline:
The patches are based on
* git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6.git
* master branch.
* v2.6.39-rc1 commit (0ce790e)
Testing:
* build tested omap2plus_defconfig for warnings and errors. none introduced.
* boot tested on 2430.
* tested for 'core off' in suspend resume on 3430 sdp. core off counters
increment after suspend resume. Core off works with below commands,
echo 1 > /debug/pm_debug/enable_off_mode
echo mem > /sys/power/state
cat /debug/pm_debug/count | grep ^core
Dependencies:
* need patch "OMAP2+: hwmod data: Set hwmod flags to only allow 16-bit
accesses to i2c" from Andry Green for accessing i2c_sysc. Without this even
with this patch, we will see i2c reset timeouts.
br ,
- Avinash
Avinash.H.M (2):
OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
OMAP2/3: hwmod: fix gpio-reset timeouts seen during bootup.
arch/arm/mach-omap2/omap_hwmod.c | 59 ++++++++++++++++++++++++++
arch/arm/mach-omap2/omap_hwmod_2420_data.c | 5 ++
arch/arm/mach-omap2/omap_hwmod_2430_data.c | 6 +++
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 7 +++
arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 +
5 files changed, 79 insertions(+), 0 deletions(-)
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
2011-04-01 15:34 [PATCH 0/2] OMAP2/3: fix the i2c,gpio reset timeouts during boot Avinash.H.M
@ 2011-04-01 15:34 ` Avinash.H.M
2011-04-01 20:28 ` Paul Walmsley
2011-04-01 21:12 ` Kevin Hilman
2011-04-01 15:34 ` [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen " Avinash.H.M
1 sibling, 2 replies; 9+ messages in thread
From: Avinash.H.M @ 2011-04-01 15:34 UTC (permalink / raw)
To: linux-omap
Cc: Avinash.H.M, Rajendra Nayak, Paul Walmsley, Benoit Cousson,
Kevin Hilman
The i2c module has a special reset sequence. The sequence is
- Disable the I2C.
- Write to SOFTRESET bit.
- Enable the I2C.
- Poll on the RESETDONE bit.
This sequence must be followed for i2c reset in omap2, omap3. The sequence is
implemented as a function and the i2c_class is updated with the correct
'reset' pointer.
Cc: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Signed-off-by: Avinash.H.M <avinashhm@ti.com>
---
arch/arm/mach-omap2/omap_hwmod.c | 59 ++++++++++++++++++++++++++
arch/arm/mach-omap2/omap_hwmod_2420_data.c | 1 +
arch/arm/mach-omap2/omap_hwmod_2430_data.c | 1 +
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 1 +
arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 +
5 files changed, 64 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
index e034294..f61c9c8 100644
--- a/arch/arm/mach-omap2/omap_hwmod.c
+++ b/arch/arm/mach-omap2/omap_hwmod.c
@@ -156,6 +156,10 @@
/* Name of the OMAP hwmod for the MPU */
#define MPU_INITIATOR_NAME "mpu"
+/* In register I2C_CON, Bit 15 is the I2C enable bit */
+#define I2C_EN BIT(15)
+#define I2C_CON_OFFSET 0x24
+
/* omap_hwmod_list contains all registered struct omap_hwmods */
static LIST_HEAD(omap_hwmod_list);
@@ -2369,3 +2373,58 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
return 0;
}
+
+/**
+ * omap_i2c_reset- reset the omap i2c module.
+ * @oh: struct omap_hwmod *
+ *
+ * The i2c moudle in omap2, omap3 had a special sequence to reset. The
+ * sequence is:
+ * - Disable the I2C.
+ * - Write to SOFTRESET bit.
+ * - Enable the I2C.
+ * - Poll on the RESETDONE bit.
+ * The sequence is implemented in below function. This is called for 2420,
+ * 2430 and omap3.
+ */
+int omap_i2c_reset(struct omap_hwmod *oh)
+{
+ u32 v = 0;
+ int ret = 0, c = 0;
+
+ /* Disable I2C */
+ v = omap_hwmod_read(oh, I2C_CON_OFFSET);
+ v = v & ~I2C_EN;
+ omap_hwmod_write(v, oh, I2C_CON_OFFSET);
+
+ /* Write to the SOFTRESET bit */
+ v = oh->_sysc_cache;
+ ret = _set_softreset(oh, &v);
+ if (ret)
+ goto err1;
+ _write_sysconfig(v, oh);
+
+ /* Enable I2C */
+ v = omap_hwmod_read(oh, I2C_CON_OFFSET);
+ v |= I2C_EN;
+ omap_hwmod_write(v, oh, I2C_CON_OFFSET);
+
+ /* Poll on RESETDONE bit */
+ omap_test_timeout((omap_hwmod_read(oh,
+ oh->class->sysc->syss_offs)
+ & SYSS_RESETDONE_MASK),
+ MAX_MODULE_SOFTRESET_WAIT, c);
+
+ if (c == MAX_MODULE_SOFTRESET_WAIT)
+ pr_warning("%s: %s: softreset failed (waited %d usec)\n",
+ __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT);
+ else
+ pr_debug("%s: %s: softreset in %d usec\n", __func__,
+ oh->name, c);
+
+ return 0;
+
+err1:
+ pr_warning("%s: returned error from _set_softreset\n", __func__);
+ return ret;
+}
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index 8eb3ce1..82ff5f7 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -1447,6 +1447,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {
static struct omap_hwmod_class i2c_class = {
.name = "i2c",
.sysc = &i2c_sysc,
+ .reset = &omap_i2c_reset,
};
static struct omap_i2c_dev_attr i2c_dev_attr;
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index a860fb5..ce292f0 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -1524,6 +1524,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {
static struct omap_hwmod_class i2c_class = {
.name = "i2c",
.sysc = &i2c_sysc,
+ .reset = &omap_i2c_reset,
};
static struct omap_i2c_dev_attr i2c_dev_attr = {
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index b98e2df..c74f972 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -1460,6 +1460,7 @@ static struct omap_hwmod omap3xxx_uart4_hwmod = {
static struct omap_hwmod_class i2c_class = {
.name = "i2c",
.sysc = &i2c_sysc,
+ .reset = &omap_i2c_reset,
};
/*
diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
index 1adea9c..26b7ad3 100644
--- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
+++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
@@ -545,6 +545,8 @@ struct omap_hwmod {
};
int omap_hwmod_register(struct omap_hwmod **ohs);
+int omap_i2c_reset(struct omap_hwmod *oh);
+
struct omap_hwmod *omap_hwmod_lookup(const char *name);
int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
void *data);
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen during bootup.
2011-04-01 15:34 [PATCH 0/2] OMAP2/3: fix the i2c,gpio reset timeouts during boot Avinash.H.M
2011-04-01 15:34 ` [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup Avinash.H.M
@ 2011-04-01 15:34 ` Avinash.H.M
2011-04-20 19:32 ` Paul Walmsley
1 sibling, 1 reply; 9+ messages in thread
From: Avinash.H.M @ 2011-04-01 15:34 UTC (permalink / raw)
To: linux-omap
Cc: Avinash.H.M, Rajendra Nayak, Paul Walmsley, Benoit Cousson,
Kevin Hilman
GPIO module expects the debounce clocks to be enabled during reset. It doesn't
reset properly and timeouts are seen, if this clock isn't enabled during
reset. Add the HWMOD_CONTROL_OPT_CLKS_IN_RESET flags to the GPIO HWMODs, with
which the debounce clocks are enabled during reset.
Cc: Rajendra Nayak <rnayak@ti.com>
Cc: Paul Walmsley <paul@pwsan.com>
Cc: Benoit Cousson <b-cousson@ti.com>
Cc: Kevin Hilman <khilman@ti.com>
Signed-off-by: Avinash.H.M <avinashhm@ti.com>
---
arch/arm/mach-omap2/omap_hwmod_2420_data.c | 4 ++++
arch/arm/mach-omap2/omap_hwmod_2430_data.c | 5 +++++
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 6 ++++++
3 files changed, 15 insertions(+), 0 deletions(-)
diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
index 82ff5f7..e0bda0a 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
@@ -1640,6 +1640,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio1_slaves[] = {
static struct omap_hwmod omap2420_gpio1_hwmod = {
.name = "gpio1",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap242x_gpio1_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio1_irqs),
.main_clk = "gpios_fck",
@@ -1670,6 +1671,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio2_slaves[] = {
static struct omap_hwmod omap2420_gpio2_hwmod = {
.name = "gpio2",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap242x_gpio2_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio2_irqs),
.main_clk = "gpios_fck",
@@ -1700,6 +1702,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio3_slaves[] = {
static struct omap_hwmod omap2420_gpio3_hwmod = {
.name = "gpio3",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap242x_gpio3_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio3_irqs),
.main_clk = "gpios_fck",
@@ -1730,6 +1733,7 @@ static struct omap_hwmod_ocp_if *omap2420_gpio4_slaves[] = {
static struct omap_hwmod omap2420_gpio4_hwmod = {
.name = "gpio4",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap242x_gpio4_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap242x_gpio4_irqs),
.main_clk = "gpios_fck",
diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
index ce292f0..99cd7bd 100644
--- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
@@ -1743,6 +1743,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio1_slaves[] = {
static struct omap_hwmod omap2430_gpio1_hwmod = {
.name = "gpio1",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio1_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio1_irqs),
.main_clk = "gpios_fck",
@@ -1773,6 +1774,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio2_slaves[] = {
static struct omap_hwmod omap2430_gpio2_hwmod = {
.name = "gpio2",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio2_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio2_irqs),
.main_clk = "gpios_fck",
@@ -1803,6 +1805,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio3_slaves[] = {
static struct omap_hwmod omap2430_gpio3_hwmod = {
.name = "gpio3",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio3_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio3_irqs),
.main_clk = "gpios_fck",
@@ -1833,6 +1836,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio4_slaves[] = {
static struct omap_hwmod omap2430_gpio4_hwmod = {
.name = "gpio4",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio4_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio4_irqs),
.main_clk = "gpios_fck",
@@ -1863,6 +1867,7 @@ static struct omap_hwmod_ocp_if *omap2430_gpio5_slaves[] = {
static struct omap_hwmod omap2430_gpio5_hwmod = {
.name = "gpio5",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap243x_gpio5_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap243x_gpio5_irqs),
.main_clk = "gpio5_fck",
diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
index c74f972..7552b2f 100644
--- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
+++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
@@ -2142,6 +2142,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio1_slaves[] = {
static struct omap_hwmod omap3xxx_gpio1_hwmod = {
.name = "gpio1",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio1_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio1_irqs),
.main_clk = "gpio1_ick",
@@ -2178,6 +2179,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio2_slaves[] = {
static struct omap_hwmod omap3xxx_gpio2_hwmod = {
.name = "gpio2",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio2_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio2_irqs),
.main_clk = "gpio2_ick",
@@ -2214,6 +2216,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio3_slaves[] = {
static struct omap_hwmod omap3xxx_gpio3_hwmod = {
.name = "gpio3",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio3_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio3_irqs),
.main_clk = "gpio3_ick",
@@ -2250,6 +2253,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio4_slaves[] = {
static struct omap_hwmod omap3xxx_gpio4_hwmod = {
.name = "gpio4",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio4_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio4_irqs),
.main_clk = "gpio4_ick",
@@ -2286,6 +2290,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio5_slaves[] = {
static struct omap_hwmod omap3xxx_gpio5_hwmod = {
.name = "gpio5",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio5_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio5_irqs),
.main_clk = "gpio5_ick",
@@ -2322,6 +2327,7 @@ static struct omap_hwmod_ocp_if *omap3xxx_gpio6_slaves[] = {
static struct omap_hwmod omap3xxx_gpio6_hwmod = {
.name = "gpio6",
+ .flags = HWMOD_CONTROL_OPT_CLKS_IN_RESET,
.mpu_irqs = omap3xxx_gpio6_irqs,
.mpu_irqs_cnt = ARRAY_SIZE(omap3xxx_gpio6_irqs),
.main_clk = "gpio6_ick",
--
1.7.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
2011-04-01 15:34 ` [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup Avinash.H.M
@ 2011-04-01 20:28 ` Paul Walmsley
2011-04-05 6:40 ` Avinash.H.M.
2011-04-01 21:12 ` Kevin Hilman
1 sibling, 1 reply; 9+ messages in thread
From: Paul Walmsley @ 2011-04-01 20:28 UTC (permalink / raw)
To: Avinash.H.M; +Cc: linux-omap, Rajendra Nayak, Benoit Cousson, Kevin Hilman
Hi
some comments
On Fri, 1 Apr 2011, Avinash.H.M wrote:
> The i2c module has a special reset sequence. The sequence is
> - Disable the I2C.
> - Write to SOFTRESET bit.
> - Enable the I2C.
> - Poll on the RESETDONE bit.
> This sequence must be followed for i2c reset in omap2, omap3. The sequence is
> implemented as a function and the i2c_class is updated with the correct
> 'reset' pointer.
>
> Cc: Rajendra Nayak <rnayak@ti.com>
> Cc: Paul Walmsley <paul@pwsan.com>
> Cc: Benoit Cousson <b-cousson@ti.com>
> Cc: Kevin Hilman <khilman@ti.com>
> Signed-off-by: Avinash.H.M <avinashhm@ti.com>
> ---
> arch/arm/mach-omap2/omap_hwmod.c | 59 ++++++++++++++++++++++++++
> arch/arm/mach-omap2/omap_hwmod_2420_data.c | 1 +
> arch/arm/mach-omap2/omap_hwmod_2430_data.c | 1 +
> arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 1 +
> arch/arm/plat-omap/include/plat/omap_hwmod.h | 2 +
> 5 files changed, 64 insertions(+), 0 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/omap_hwmod.c b/arch/arm/mach-omap2/omap_hwmod.c
> index e034294..f61c9c8 100644
> --- a/arch/arm/mach-omap2/omap_hwmod.c
> +++ b/arch/arm/mach-omap2/omap_hwmod.c
> @@ -156,6 +156,10 @@
> /* Name of the OMAP hwmod for the MPU */
> #define MPU_INITIATOR_NAME "mpu"
>
> +/* In register I2C_CON, Bit 15 is the I2C enable bit */
> +#define I2C_EN BIT(15)
> +#define I2C_CON_OFFSET 0x24
This stuff, along with omap_i2c_reset(), doesn't belong in omap_hwmod.c,
which is common code that is not I2C-specific. Please put it in
mach-omap2/i2c.c instead.
> +
> /* omap_hwmod_list contains all registered struct omap_hwmods */
> static LIST_HEAD(omap_hwmod_list);
>
> @@ -2369,3 +2373,58 @@ int omap_hwmod_no_setup_reset(struct omap_hwmod *oh)
>
> return 0;
> }
> +
> +/**
> + * omap_i2c_reset- reset the omap i2c module.
> + * @oh: struct omap_hwmod *
> + *
> + * The i2c moudle in omap2, omap3 had a special sequence to reset. The
> + * sequence is:
> + * - Disable the I2C.
> + * - Write to SOFTRESET bit.
> + * - Enable the I2C.
> + * - Poll on the RESETDONE bit.
> + * The sequence is implemented in below function. This is called for 2420,
> + * 2430 and omap3.
> + */
> +int omap_i2c_reset(struct omap_hwmod *oh)
> +{
> + u32 v = 0;
no need to initialize this to 0
> + int ret = 0, c = 0;
no need to initialize ret to 0
> +
> + /* Disable I2C */
> + v = omap_hwmod_read(oh, I2C_CON_OFFSET);
> + v = v & ~I2C_EN;
> + omap_hwmod_write(v, oh, I2C_CON_OFFSET);
> +
> + /* Write to the SOFTRESET bit */
> + v = oh->_sysc_cache;
> + ret = _set_softreset(oh, &v);
> + if (ret)
> + goto err1;
> + _write_sysconfig(v, oh);
> +
> + /* Enable I2C */
> + v = omap_hwmod_read(oh, I2C_CON_OFFSET);
> + v |= I2C_EN;
> + omap_hwmod_write(v, oh, I2C_CON_OFFSET);
> +
> + /* Poll on RESETDONE bit */
> + omap_test_timeout((omap_hwmod_read(oh,
> + oh->class->sysc->syss_offs)
> + & SYSS_RESETDONE_MASK),
> + MAX_MODULE_SOFTRESET_WAIT, c);
> +
> + if (c == MAX_MODULE_SOFTRESET_WAIT)
> + pr_warning("%s: %s: softreset failed (waited %d usec)\n",
> + __func__, oh->name, MAX_MODULE_SOFTRESET_WAIT);
> + else
> + pr_debug("%s: %s: softreset in %d usec\n", __func__,
> + oh->name, c);
> +
> + return 0;
> +
> +err1:
> + pr_warning("%s: returned error from _set_softreset\n", __func__);
> + return ret;
> +}
> diff --git a/arch/arm/mach-omap2/omap_hwmod_2420_data.c b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> index 8eb3ce1..82ff5f7 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_2420_data.c
> @@ -1447,6 +1447,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {
> static struct omap_hwmod_class i2c_class = {
> .name = "i2c",
> .sysc = &i2c_sysc,
> + .reset = &omap_i2c_reset,
> };
>
> static struct omap_i2c_dev_attr i2c_dev_attr;
> diff --git a/arch/arm/mach-omap2/omap_hwmod_2430_data.c b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> index a860fb5..ce292f0 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_2430_data.c
> @@ -1524,6 +1524,7 @@ static struct omap_hwmod_class_sysconfig i2c_sysc = {
> static struct omap_hwmod_class i2c_class = {
> .name = "i2c",
> .sysc = &i2c_sysc,
> + .reset = &omap_i2c_reset,
> };
>
> static struct omap_i2c_dev_attr i2c_dev_attr = {
> diff --git a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> index b98e2df..c74f972 100644
> --- a/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> +++ b/arch/arm/mach-omap2/omap_hwmod_3xxx_data.c
> @@ -1460,6 +1460,7 @@ static struct omap_hwmod omap3xxx_uart4_hwmod = {
> static struct omap_hwmod_class i2c_class = {
> .name = "i2c",
> .sysc = &i2c_sysc,
> + .reset = &omap_i2c_reset,
> };
>
> /*
> diff --git a/arch/arm/plat-omap/include/plat/omap_hwmod.h b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> index 1adea9c..26b7ad3 100644
> --- a/arch/arm/plat-omap/include/plat/omap_hwmod.h
> +++ b/arch/arm/plat-omap/include/plat/omap_hwmod.h
> @@ -545,6 +545,8 @@ struct omap_hwmod {
> };
>
> int omap_hwmod_register(struct omap_hwmod **ohs);
> +int omap_i2c_reset(struct omap_hwmod *oh);
This should go into plat-omap/include/plat/i2c.h
> +
> struct omap_hwmod *omap_hwmod_lookup(const char *name);
> int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
> void *data);
> --
> 1.7.1
>
- Paul
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
2011-04-01 15:34 ` [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup Avinash.H.M
2011-04-01 20:28 ` Paul Walmsley
@ 2011-04-01 21:12 ` Kevin Hilman
2011-04-02 7:30 ` Avinash.H.M.
1 sibling, 1 reply; 9+ messages in thread
From: Kevin Hilman @ 2011-04-01 21:12 UTC (permalink / raw)
To: Avinash.H.M; +Cc: linux-omap, Rajendra Nayak, Paul Walmsley, Benoit Cousson
Hi Avinash,
"Avinash.H.M" <avinashhm@ti.com> writes:
> The i2c module has a special reset sequence. The sequence is
> - Disable the I2C.
> - Write to SOFTRESET bit.
> - Enable the I2C.
> - Poll on the RESETDONE bit.
Shouldn't the final state be disabled after reset? IOW, Shouldn't the
I2C be disabled again after the polling?
Also, when reposting, please be sure to Cc the linux-arm-kernel mailing
list for patches that are targetted for upstream.
Thanks,
Kevin
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
2011-04-01 21:12 ` Kevin Hilman
@ 2011-04-02 7:30 ` Avinash.H.M.
0 siblings, 0 replies; 9+ messages in thread
From: Avinash.H.M. @ 2011-04-02 7:30 UTC (permalink / raw)
To: Kevin Hilman; +Cc: linux-omap, Rajendra Nayak, Paul Walmsley, Benoit Cousson
Hi Kevin,
>
> Shouldn't the final state be disabled after reset? IOW, Shouldn't the
> I2C be disabled again after the polling?
Yes, the I2C should be disabled after polling. We need not explicitly
program it to disabled state because, the reset value of the I2C_EN bit
is '0'. So, it is kept disabled after reset.
>
> Also, when reposting, please be sure to Cc the linux-arm-kernel mailing
> list for patches that are targetted for upstream.
Thanks for pointing it kevin. I wasn't aware of this. I will CC lak
for my further patches from now onwards.
thanks,
- avinash
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup
2011-04-01 20:28 ` Paul Walmsley
@ 2011-04-05 6:40 ` Avinash.H.M.
0 siblings, 0 replies; 9+ messages in thread
From: Avinash.H.M. @ 2011-04-05 6:40 UTC (permalink / raw)
To: Paul Walmsley; +Cc: linux-omap, Rajendra Nayak, Benoit Cousson, Kevin Hilman
Hi Paul ,
Thanks for the review.
> > +/* In register I2C_CON, Bit 15 is the I2C enable bit */
> > +#define I2C_EN BIT(15)
> > +#define I2C_CON_OFFSET 0x24
>
> This stuff, along with omap_i2c_reset(), doesn't belong in omap_hwmod.c,
> which is common code that is not I2C-specific. Please put it in
> mach-omap2/i2c.c instead.
I agree. I ll move these I2C specific things from omap_hwmod.c to
mach-omap2/i2c.c.
[...]
> > + */
> > +int omap_i2c_reset(struct omap_hwmod *oh)
> > +{
> > + u32 v = 0;
>
> no need to initialize this to 0
>
> > + int ret = 0, c = 0;
>
> no need to initialize ret to 0
OK . I ll remove initialization of 'v'.
Since now i am moving the function to i2c.c, i can't call _set_softreset
and _write_sysconfig(static functions in omap_hwmod.c). Instead, i ll
set the SOFTRESET bit and write into SYSC register directly. So i do not
need 'ret'. I ll remove it.
Just curios. I understand there is no use of initializing 'v' to 0
here. But by programming practice, i usually initialize local variables
to '0'. Is there anything wrong in doing this ? Any negative impact ?
[...]
> > int omap_hwmod_register(struct omap_hwmod **ohs);
> > +int omap_i2c_reset(struct omap_hwmod *oh);
>
> This should go into plat-omap/include/plat/i2c.h
Sure. I will move this change to plat/i2c.h.
I ll send out the v2 of this shortly after testing.
thanks ,
- avinash
>
> > +
> > struct omap_hwmod *omap_hwmod_lookup(const char *name);
> > int omap_hwmod_for_each(int (*fn)(struct omap_hwmod *oh, void *data),
> > void *data);
> > --
> > 1.7.1
> >
>
>
> - Paul
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen during bootup.
2011-04-01 15:34 ` [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen " Avinash.H.M
@ 2011-04-20 19:32 ` Paul Walmsley
2011-04-21 6:21 ` Avinash.H.M.
0 siblings, 1 reply; 9+ messages in thread
From: Paul Walmsley @ 2011-04-20 19:32 UTC (permalink / raw)
To: Avinash.H.M; +Cc: linux-omap, Rajendra Nayak, Benoit Cousson, Kevin Hilman
Thanks, queued for 2.6.39-rc.
- Paul
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen during bootup.
2011-04-20 19:32 ` Paul Walmsley
@ 2011-04-21 6:21 ` Avinash.H.M.
0 siblings, 0 replies; 9+ messages in thread
From: Avinash.H.M. @ 2011-04-21 6:21 UTC (permalink / raw)
To: Paul Walmsley; +Cc: linux-omap, Rajendra Nayak, Benoit Cousson, Kevin Hilman
On Wed, Apr 20, 2011 at 01:32:00PM -0600, Paul Walmsley wrote:
>
> Thanks, queued for 2.6.39-rc.
Thanks Paul.
- Avinash
>
>
> - Paul
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2011-04-21 6:22 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-04-01 15:34 [PATCH 0/2] OMAP2/3: fix the i2c,gpio reset timeouts during boot Avinash.H.M
2011-04-01 15:34 ` [PATCH 1/2] OMAP2/3: hwmod: fix the i2c-reset timeout during bootup Avinash.H.M
2011-04-01 20:28 ` Paul Walmsley
2011-04-05 6:40 ` Avinash.H.M.
2011-04-01 21:12 ` Kevin Hilman
2011-04-02 7:30 ` Avinash.H.M.
2011-04-01 15:34 ` [PATCH 2/2] OMAP2/3: hwmod: fix gpio-reset timeouts seen " Avinash.H.M
2011-04-20 19:32 ` Paul Walmsley
2011-04-21 6:21 ` Avinash.H.M.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox