From mboxrd@z Thu Jan 1 00:00:00 1970 From: jouni.hogander@nokia.com (=?utf-8?Q?H=C3=B6gander?= Jouni) Subject: Re: [PATCH 04/12] I2C re-init for every cmd Date: Tue, 16 Sep 2008 13:13:08 +0300 Message-ID: <87r67kwg97.fsf@trdhcp146196.ntc.nokia.com> References: <56249.192.168.10.89.1221148518.squirrel@dbdmail.itg.ti.com> <877i9h7qjw.fsf@trdhcp146196.ntc.nokia.com> <87d4j4moh3.fsf@deeprootsystems.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from smtp.nokia.com ([192.100.122.230]:51392 "EHLO mgw-mx03.nokia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751913AbYIPKLs (ORCPT ); Tue, 16 Sep 2008 06:11:48 -0400 In-Reply-To: <87d4j4moh3.fsf@deeprootsystems.com> (ext Kevin Hilman's message of "Tue, 16 Sep 2008 12:25:44 +0300") Sender: linux-omap-owner@vger.kernel.org List-Id: linux-omap@vger.kernel.org To: ext Kevin Hilman Cc: ext chandra shekhar , linux-omap@vger.kernel.org --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable "ext Kevin Hilman" writes: > jouni.hogander@nokia.com (H=C3=B6gander Jouni) writes: > >> @@ -209,16 +215,21 @@ static void omap_i2c_unidle(struct omap_i2c_dev *d= ev) >> if (dev->iclk !=3D NULL) >> clk_enable(dev->iclk); >> clk_enable(dev->fclk); >> + >> +#ifdef CONFIG_ARCH_OMAP34XX >> + 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); >> +#endif > > The above should also be inside an if cpu_is_omap34xx() block so > it works correctly on multi-omap kernels. Here you are: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-OMAP3-I2C-Implement-i2c-save-restore.patch >>From 24db406dfb2ba6c9069b70c2efd1134ea29c23eb Mon Sep 17 00:00:00 2001 From: Jouni Hogander Date: Tue, 16 Sep 2008 13:03:24 +0300 Subject: [RFC] OMAP3: I2C: Implement i2c save/restore Signed-off-by: Jouni Hogander --- drivers/i2c/busses/i2c-omap.c | 52 ++++++++++++++++++++++++++++------------ 1 files changed, 36 insertions(+), 16 deletions(-) diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 3778735..6f6cfcc 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c @@ -147,6 +147,12 @@ struct omap_i2c_dev { unsigned b_hw:1; /* bad h/w fixes */ unsigned idle:1; u16 iestate; /* Saved interrupt register */ +#ifdef CONFIG_ARCH_OMAP34XX + u16 pscstate; + u16 scllstate; + u16 sclhstate; + u16 bufstate; +#endif }; static inline void omap_i2c_write_reg(struct omap_i2c_dev *i2c_dev, @@ -209,16 +215,23 @@ static void omap_i2c_unidle(struct omap_i2c_dev *dev) if (dev->iclk != NULL) clk_enable(dev->iclk); clk_enable(dev->fclk); + +#ifdef CONFIG_ARCH_OMAP34XX + if (cpu_is_omap34xx()) { + 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); + } +#endif dev->idle = 0; - if (dev->iestate) - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); } static void omap_i2c_idle(struct omap_i2c_dev *dev) { u16 iv; - dev->iestate = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, 0); if (dev->rev1) iv = omap_i2c_read_reg(dev, OMAP_I2C_IV_REG); @@ -238,7 +251,7 @@ static void omap_i2c_idle(struct omap_i2c_dev *dev) static int omap_i2c_init(struct omap_i2c_dev *dev) { - u16 psc = 0, scll = 0, sclh = 0; + u16 psc = 0, scll = 0, sclh = 0, buf = 0; u16 fsscll = 0, fssclh = 0, hsscll = 0, hssclh = 0; unsigned long fclk_rate = 12000000; unsigned long timeout; @@ -327,23 +340,32 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); - if (dev->fifo_size) - /* Note: setup required fifo size - 1 */ - omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, - (dev->fifo_size - 1) << 8 | /* RTRSH */ - OMAP_I2C_BUF_RXFIF_CLR | - (dev->fifo_size - 1) | /* XTRSH */ - OMAP_I2C_BUF_TXFIF_CLR); + if (dev->fifo_size) { + /* Note: setup required fifo size - 1. RTRSH and XTRSH */ + buf = (dev->fifo_size - 1) << 8 | OMAP_I2C_BUF_RXFIF_CLR | + (dev->fifo_size - 1) | OMAP_I2C_BUF_TXFIF_CLR; + omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, buf); + } /* Take the I2C module out of reset: */ omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); /* Enable interrupts */ - omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, - (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | + dev->iestate = (OMAP_I2C_IE_XRDY | OMAP_I2C_IE_RRDY | OMAP_I2C_IE_ARDY | OMAP_I2C_IE_NACK | OMAP_I2C_IE_AL) | ((dev->fifo_size) ? - (OMAP_I2C_IE_RDR | OMAP_I2C_IE_XDR) : 0)); + (OMAP_I2C_IE_RDR | OMAP_I2C_IE_XDR) : 0); + omap_i2c_write_reg(dev, OMAP_I2C_IE_REG, dev->iestate); + +#ifdef CONFIG_ARCH_OMAP34XX + if (cpu_is_omap34xx()) { + dev->pscstate = psc; + dev->scllstate = scll; + dev->sclhstate = sclh; + dev->bufstate = buf; + } +#endif + return 0; } @@ -496,8 +518,6 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) omap_i2c_unidle(dev); - omap_i2c_init(dev); - if ((r = omap_i2c_wait_for_bb(dev)) < 0) goto out; -- 1.5.5 --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable --=20 Jouni H=C3=B6gander --=-=-=--