* [PATCHv4 0/2] i2c: omap: cleanups @ 2012-10-25 14:43 Shubhrajyoti D 2012-10-25 14:43 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D 2012-10-25 14:43 ` [PATCHv4 2/2] i2c: omap: make reset a seperate function Shubhrajyoti D 0 siblings, 2 replies; 6+ messages in thread From: Shubhrajyoti D @ 2012-10-25 14:43 UTC (permalink / raw) To: linux-arm-kernel Applies on Felipe's series http://www.spinics.net/lists/linux-omap/msg79995.html Tested with Terro sys fix + Felipe's stop sched_clock() during suspend on omap3630 beagle both idle and suspend. Functional testing on omap4sdp. Todo: all the error cases may not need a reset. Shubhrajyoti D (2): i2c: omap: re-factor omap_i2c_init function i2c: omap: make reset a seperate function drivers/i2c/busses/i2c-omap.c | 97 +++++++++++++++++++++-------------------- 1 files changed, 50 insertions(+), 47 deletions(-) -- 1.7.5.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function 2012-10-25 14:43 [PATCHv4 0/2] i2c: omap: cleanups Shubhrajyoti D @ 2012-10-25 14:43 ` Shubhrajyoti D 2012-10-29 19:50 ` Felipe Balbi 2012-10-25 14:43 ` [PATCHv4 2/2] i2c: omap: make reset a seperate function Shubhrajyoti D 1 sibling, 1 reply; 6+ messages in thread From: Shubhrajyoti D @ 2012-10-25 14:43 UTC (permalink / raw) To: linux-arm-kernel re-factor omap_i2c_init() so that we can re-use it for resume. While at it also remove the bufstate variable as we write it in omap_i2c_resize_fifo for every transfer. Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> --- v4: add spaces for readability drivers/i2c/busses/i2c-omap.c | 74 +++++++++++++++++++--------------------- 1 files changed, 35 insertions(+), 39 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index be329e9..38acf1a 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -209,7 +209,6 @@ struct omap_i2c_dev { u16 pscstate; u16 scllstate; u16 sclhstate; - u16 bufstate; u16 syscstate; u16 westate; u16 errata; @@ -285,9 +284,34 @@ static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) } } +static void __omap_i2c_init(struct omap_i2c_dev *dev) +{ + + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); + + /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ + omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, dev->pscstate); + + /* SCL low and high time values */ + omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, dev->scllstate); + omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, dev->sclhstate); + if (dev->rev >= OMAP_I2C_REV_ON_3430_3530) + omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate); + + /* Take the I2C module out of reset: */ + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); + + /* + * Don't write to this register if the IE state is 0 as it can + * cause deadlock. + */ + if (dev->iestate) + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); +} + static int omap_i2c_init(struct omap_i2c_dev *dev) { - u16 psc = 0, scll = 0, sclh = 0, buf = 0; + u16 psc = 0, scll = 0, sclh = 0; u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; unsigned long fclk_rate = 12000000; unsigned long timeout; @@ -337,11 +361,8 @@ 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); } } - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); if (dev->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) { /* @@ -426,28 +447,18 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) sclh = fclk_rate / (dev->speed * 2) - 7 + psc; } - /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ - omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, psc); - - /* SCL low and high time values */ - omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); - omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); - - /* Take the I2C module out of reset: */ - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); - /* Enable interrupts */ dev->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | OMAP_I2C_IE_NACK | OMAP_I2C_IE_AL) | ((dev->fifo_size) ? (OMAP_I2C_IE_RDR | OMAP_I2C_IE_XDR) : 0); - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); - if (dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { - dev->pscstate = psc; - dev->scllstate = scll; - dev->sclhstate = sclh; - dev->bufstate = buf; - } + + dev->pscstate = psc; + dev->scllstate = scll; + dev->sclhstate = sclh; + + __omap_i2c_init(dev); + return 0; } @@ -1267,23 +1278,8 @@ static int omap_i2c_runtime_resume(struct device *dev) { struct omap_i2c_dev *_dev = dev_get_drvdata(dev); - if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, 0); - omap_i2c_write_reg(_dev, OMAP_I2C_PSC_REG, _dev->pscstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SCLL_REG, _dev->scllstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SCLH_REG, _dev->sclhstate); - omap_i2c_write_reg(_dev, OMAP_I2C_BUF_REG, _dev->bufstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SYSC_REG, _dev->syscstate); - omap_i2c_write_reg(_dev, OMAP_I2C_WE_REG, _dev->westate); - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); - } - - /* - * Don't write to this register if the IE state is 0 as it can - * cause deadlock. - */ - if (_dev->iestate) - omap_i2c_write_reg(_dev, OMAP_I2C_IE_REG, _dev->iestate); + if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) + __omap_i2c_init(_dev); return 0; } -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function 2012-10-25 14:43 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D @ 2012-10-29 19:50 ` Felipe Balbi 0 siblings, 0 replies; 6+ messages in thread From: Felipe Balbi @ 2012-10-29 19:50 UTC (permalink / raw) To: linux-arm-kernel On Thu, Oct 25, 2012 at 08:13:18PM +0530, Shubhrajyoti D wrote: > re-factor omap_i2c_init() so that we can re-use it for resume. > While at it also remove the bufstate variable as we write it > in omap_i2c_resize_fifo for every transfer. > > Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> FWIW: Reviewed-by: Felipe Balbi <balbi@ti.com> (if I have time I will test this tomorrow and reply with a Tested-by) > --- > v4: add spaces for readability > > drivers/i2c/busses/i2c-omap.c | 74 +++++++++++++++++++--------------------- > 1 files changed, 35 insertions(+), 39 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c > index be329e9..38acf1a 100644 > --- a/drivers/i2c/busses/i2c-omap.c > +++ b/drivers/i2c/busses/i2c-omap.c > @@ -209,7 +209,6 @@ struct omap_i2c_dev { > u16 pscstate; > u16 scllstate; > u16 sclhstate; > - u16 bufstate; > u16 syscstate; > u16 westate; > u16 errata; > @@ -285,9 +284,34 @@ static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) > } > } > > +static void __omap_i2c_init(struct omap_i2c_dev *dev) > +{ > + > + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); > + > + /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ > + omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, dev->pscstate); > + > + /* SCL low and high time values */ > + omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, dev->scllstate); > + omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, dev->sclhstate); > + if (dev->rev >= OMAP_I2C_REV_ON_3430_3530) > + omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate); > + > + /* Take the I2C module out of reset: */ > + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); > + > + /* > + * Don't write to this register if the IE state is 0 as it can > + * cause deadlock. > + */ > + if (dev->iestate) > + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); > +} > + > static int omap_i2c_init(struct omap_i2c_dev *dev) > { > - u16 psc = 0, scll = 0, sclh = 0, buf = 0; > + u16 psc = 0, scll = 0, sclh = 0; > u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; > unsigned long fclk_rate = 12000000; > unsigned long timeout; > @@ -337,11 +361,8 @@ 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); > } > } > - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); > > if (dev->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) { > /* > @@ -426,28 +447,18 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) > sclh = fclk_rate / (dev->speed * 2) - 7 + psc; > } > > - /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ > - omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, psc); > - > - /* SCL low and high time values */ > - omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); > - omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); > - > - /* Take the I2C module out of reset: */ > - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); > - > /* Enable interrupts */ > dev->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | > OMAP_I2C_IE_NACK | OMAP_I2C_IE_AL) | > ((dev->fifo_size) ? (OMAP_I2C_IE_RDR | > OMAP_I2C_IE_XDR) : 0); > - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); > - if (dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { > - dev->pscstate = psc; > - dev->scllstate = scll; > - dev->sclhstate = sclh; > - dev->bufstate = buf; > - } > + > + dev->pscstate = psc; > + dev->scllstate = scll; > + dev->sclhstate = sclh; > + > + __omap_i2c_init(dev); > + > return 0; > } > > @@ -1267,23 +1278,8 @@ static int omap_i2c_runtime_resume(struct device *dev) > { > struct omap_i2c_dev *_dev = dev_get_drvdata(dev); > > - if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { > - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, 0); > - omap_i2c_write_reg(_dev, OMAP_I2C_PSC_REG, _dev->pscstate); > - omap_i2c_write_reg(_dev, OMAP_I2C_SCLL_REG, _dev->scllstate); > - omap_i2c_write_reg(_dev, OMAP_I2C_SCLH_REG, _dev->sclhstate); > - omap_i2c_write_reg(_dev, OMAP_I2C_BUF_REG, _dev->bufstate); > - omap_i2c_write_reg(_dev, OMAP_I2C_SYSC_REG, _dev->syscstate); > - omap_i2c_write_reg(_dev, OMAP_I2C_WE_REG, _dev->westate); > - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); > - } > - > - /* > - * Don't write to this register if the IE state is 0 as it can > - * cause deadlock. > - */ > - if (_dev->iestate) > - omap_i2c_write_reg(_dev, OMAP_I2C_IE_REG, _dev->iestate); > + if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) > + __omap_i2c_init(_dev); > > return 0; > } > -- > 1.7.5.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121029/b6f627e0/attachment.sig> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv4 2/2] i2c: omap: make reset a seperate function 2012-10-25 14:43 [PATCHv4 0/2] i2c: omap: cleanups Shubhrajyoti D 2012-10-25 14:43 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D @ 2012-10-25 14:43 ` Shubhrajyoti D 2012-10-29 19:52 ` Felipe Balbi 1 sibling, 1 reply; 6+ messages in thread From: Shubhrajyoti D @ 2012-10-25 14:43 UTC (permalink / raw) To: linux-arm-kernel Implement reset as a separate function. This will enable us to make sure that we don't do the calculation again on every transfer. Also at probe the reset is not added as the hwmod is doing that for us. Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> --- some of the errors may not need a reset. will check and post separate patch. drivers/i2c/busses/i2c-omap.c | 25 ++++++++++++++++--------- 1 files changed, 16 insertions(+), 9 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 38acf1a..a25b7b0 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -309,15 +309,9 @@ static void __omap_i2c_init(struct omap_i2c_dev *dev) omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); } -static int omap_i2c_init(struct omap_i2c_dev *dev) +static int omap_i2c_reset(struct omap_i2c_dev *dev) { - u16 psc = 0, scll = 0, sclh = 0; - u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; - unsigned long fclk_rate = 12000000; unsigned long timeout; - unsigned long internal_clk = 0; - struct clk *fclk; - if (dev->rev >= OMAP_I2C_OMAP1_REV_2) { /* Disable I2C controller before soft reset */ omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, @@ -363,6 +357,17 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) dev->westate = OMAP_I2C_WE_ALL; } } + return 0; +} + +static int omap_i2c_init(struct omap_i2c_dev *dev) +{ + u16 psc = 0, scll = 0, sclh = 0; + u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; + unsigned long fclk_rate = 12000000; + unsigned long internal_clk = 0; + struct clk *fclk; + if (dev->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) { /* @@ -595,7 +600,8 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, if (timeout == 0) { dev_err(dev->dev, "controller timed out\n"); ret = -ETIMEDOUT; - omap_i2c_init(dev); + omap_i2c_reset(dev); + __omap_i2c_init(dev); goto out; } @@ -606,7 +612,8 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, if (dev->cmd_err & (OMAP_I2C_STAT_AL | OMAP_I2C_STAT_ROVR | OMAP_I2C_STAT_XUDF)) { ret = -EIO; - omap_i2c_init(dev); + omap_i2c_reset(dev); + __omap_i2c_init(dev); goto out; } -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCHv4 2/2] i2c: omap: make reset a seperate function 2012-10-25 14:43 ` [PATCHv4 2/2] i2c: omap: make reset a seperate function Shubhrajyoti D @ 2012-10-29 19:52 ` Felipe Balbi 0 siblings, 0 replies; 6+ messages in thread From: Felipe Balbi @ 2012-10-29 19:52 UTC (permalink / raw) To: linux-arm-kernel On Thu, Oct 25, 2012 at 08:13:19PM +0530, Shubhrajyoti D wrote: > Implement reset as a separate function. > This will enable us to make sure that we don't do the > calculation again on every transfer. > Also at probe the reset is not added as the hwmod is doing that > for us. > > Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> Reviewed-by: Felipe Balbi <balbi@ti.com> (again, will test tomorrow if I have time) Next step would be to figure out if it is necessary to reset the IP in case of error. I don't think so, but only testing will say... > --- > some of the errors may not need a reset. > will check and post separate patch. > > drivers/i2c/busses/i2c-omap.c | 25 ++++++++++++++++--------- > 1 files changed, 16 insertions(+), 9 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c > index 38acf1a..a25b7b0 100644 > --- a/drivers/i2c/busses/i2c-omap.c > +++ b/drivers/i2c/busses/i2c-omap.c > @@ -309,15 +309,9 @@ static void __omap_i2c_init(struct omap_i2c_dev *dev) > omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); > } > > -static int omap_i2c_init(struct omap_i2c_dev *dev) > +static int omap_i2c_reset(struct omap_i2c_dev *dev) > { > - u16 psc = 0, scll = 0, sclh = 0; > - u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; > - unsigned long fclk_rate = 12000000; > unsigned long timeout; > - unsigned long internal_clk = 0; > - struct clk *fclk; > - > if (dev->rev >= OMAP_I2C_OMAP1_REV_2) { > /* Disable I2C controller before soft reset */ > omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, > @@ -363,6 +357,17 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) > dev->westate = OMAP_I2C_WE_ALL; > } > } > + return 0; > +} > + > +static int omap_i2c_init(struct omap_i2c_dev *dev) > +{ > + u16 psc = 0, scll = 0, sclh = 0; > + u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; > + unsigned long fclk_rate = 12000000; > + unsigned long internal_clk = 0; > + struct clk *fclk; > + > > if (dev->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) { > /* > @@ -595,7 +600,8 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, > if (timeout == 0) { > dev_err(dev->dev, "controller timed out\n"); > ret = -ETIMEDOUT; > - omap_i2c_init(dev); > + omap_i2c_reset(dev); > + __omap_i2c_init(dev); > goto out; > } > > @@ -606,7 +612,8 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, > if (dev->cmd_err & (OMAP_I2C_STAT_AL | OMAP_I2C_STAT_ROVR | > OMAP_I2C_STAT_XUDF)) { > ret = -EIO; > - omap_i2c_init(dev); > + omap_i2c_reset(dev); > + __omap_i2c_init(dev); > goto out; > } > > -- > 1.7.5.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo at vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- balbi -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 836 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20121029/387812c4/attachment.sig> ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv4 0/2] i2c: omap: cleanups @ 2012-10-25 14:39 Shubhrajyoti D 2012-10-25 14:39 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D 0 siblings, 1 reply; 6+ messages in thread From: Shubhrajyoti D @ 2012-10-25 14:39 UTC (permalink / raw) To: linux-arm-kernel Applies on Felipe's series http://www.spinics.net/lists/linux-omap/msg79995.html Tested with Terro sys fix + Felipe's stop sched_clock() during suspend on omap3630 beagle both idle and suspend. Functional testing on omap4sdp. Todo: all the error cases may not need a reset. Shubhrajyoti D (2): i2c: omap: re-factor omap_i2c_init function i2c: omap: make reset a seperate function drivers/i2c/busses/i2c-omap.c | 97 +++++++++++++++++++++-------------------- 1 files changed, 50 insertions(+), 47 deletions(-) -- 1.7.5.4 ^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function 2012-10-25 14:39 [PATCHv4 0/2] i2c: omap: cleanups Shubhrajyoti D @ 2012-10-25 14:39 ` Shubhrajyoti D 0 siblings, 0 replies; 6+ messages in thread From: Shubhrajyoti D @ 2012-10-25 14:39 UTC (permalink / raw) To: linux-arm-kernel re-factor omap_i2c_init() so that we can re-use it for resume. While at it also remove the bufstate variable as we write it in omap_i2c_resize_fifo for every transfer. Signed-off-by: Shubhrajyoti D <shubhrajyoti@ti.com> --- v4: add spaces for readability drivers/i2c/busses/i2c-omap.c | 74 +++++++++++++++++++--------------------- 1 files changed, 35 insertions(+), 39 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index be329e9..38acf1a 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -209,7 +209,6 @@ struct omap_i2c_dev { u16 pscstate; u16 scllstate; u16 sclhstate; - u16 bufstate; u16 syscstate; u16 westate; u16 errata; @@ -285,9 +284,34 @@ static inline u16 omap_i2c_read_reg(struct omap_i2c_dev *i2c_dev, int reg) } } +static void __omap_i2c_init(struct omap_i2c_dev *dev) +{ + + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); + + /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ + omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, dev->pscstate); + + /* SCL low and high time values */ + omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, dev->scllstate); + omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, dev->sclhstate); + if (dev->rev >= OMAP_I2C_REV_ON_3430_3530) + omap_i2c_write_reg(dev, OMAP_I2C_WE_REG, dev->westate); + + /* Take the I2C module out of reset: */ + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); + + /* + * Don't write to this register if the IE state is 0 as it can + * cause deadlock. + */ + if (dev->iestate) + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); +} + static int omap_i2c_init(struct omap_i2c_dev *dev) { - u16 psc = 0, scll = 0, sclh = 0, buf = 0; + u16 psc = 0, scll = 0, sclh = 0; u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; unsigned long fclk_rate = 12000000; unsigned long timeout; @@ -337,11 +361,8 @@ 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); } } - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); if (dev->flags & OMAP_I2C_FLAG_ALWAYS_ARMXOR_CLK) { /* @@ -426,28 +447,18 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) sclh = fclk_rate / (dev->speed * 2) - 7 + psc; } - /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ - omap_i2c_write_reg(dev, OMAP_I2C_PSC_REG, psc); - - /* SCL low and high time values */ - omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); - omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); - - /* Take the I2C module out of reset: */ - omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); - /* Enable interrupts */ dev->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | OMAP_I2C_IE_NACK | OMAP_I2C_IE_AL) | ((dev->fifo_size) ? (OMAP_I2C_IE_RDR | OMAP_I2C_IE_XDR) : 0); - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); - if (dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { - dev->pscstate = psc; - dev->scllstate = scll; - dev->sclhstate = sclh; - dev->bufstate = buf; - } + + dev->pscstate = psc; + dev->scllstate = scll; + dev->sclhstate = sclh; + + __omap_i2c_init(dev); + return 0; } @@ -1267,23 +1278,8 @@ static int omap_i2c_runtime_resume(struct device *dev) { struct omap_i2c_dev *_dev = dev_get_drvdata(dev); - if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) { - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, 0); - omap_i2c_write_reg(_dev, OMAP_I2C_PSC_REG, _dev->pscstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SCLL_REG, _dev->scllstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SCLH_REG, _dev->sclhstate); - omap_i2c_write_reg(_dev, OMAP_I2C_BUF_REG, _dev->bufstate); - omap_i2c_write_reg(_dev, OMAP_I2C_SYSC_REG, _dev->syscstate); - omap_i2c_write_reg(_dev, OMAP_I2C_WE_REG, _dev->westate); - omap_i2c_write_reg(_dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); - } - - /* - * Don't write to this register if the IE state is 0 as it can - * cause deadlock. - */ - if (_dev->iestate) - omap_i2c_write_reg(_dev, OMAP_I2C_IE_REG, _dev->iestate); + if (_dev->flags & OMAP_I2C_FLAG_RESET_REGS_POSTIDLE) + __omap_i2c_init(_dev); return 0; } -- 1.7.5.4 ^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2012-10-29 19:52 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2012-10-25 14:43 [PATCHv4 0/2] i2c: omap: cleanups Shubhrajyoti D 2012-10-25 14:43 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D 2012-10-29 19:50 ` Felipe Balbi 2012-10-25 14:43 ` [PATCHv4 2/2] i2c: omap: make reset a seperate function Shubhrajyoti D 2012-10-29 19:52 ` Felipe Balbi -- strict thread matches above, loose matches on Subject: below -- 2012-10-25 14:39 [PATCHv4 0/2] i2c: omap: cleanups Shubhrajyoti D 2012-10-25 14:39 ` [PATCHv4 1/2] i2c: omap: re-factor omap_i2c_init function Shubhrajyoti D
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox