LKML Archive on lore.kernel.org help / color / mirror / Atom feed
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 [not found] <1154689868.12791.267626769@webmail.messagingengine.com> @ 2006-08-05 8:31 ` Jean Delvare 2006-08-07 14:58 ` Tony Lindgren 2006-08-06 14:35 ` Jean Delvare 1 sibling, 1 reply; 9+ messages in thread From: Jean Delvare @ 2006-08-05 8:31 UTC (permalink / raw) To: Komal Shah Cc: tony, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c Hi Komal, Your post ended up in my spam box once again... I really think you should send your patches as text attachements (or inline) rather than binary attachements. Using real names in To: and Cc: fields might help as well. > I have attached the updated patch, which addresses the most of review > comments. I'll review that new version later today, or tomorrow. > >The comment is confusing, as this address is usually known as the > >"slave address" in the I2C world. Masters don't need no address on an > >I2C bus. "own" is not a very explicit parameter name, what about > >"slave_addr"? Ideally this should be retrieved from platform_data too, > >else you can't be sure you won't collide with a device on the bus. > > >"0 for default" doesn't make sense, as the default is, by definition, > >when the user doesn't speficiy anything. That this is internally coded > >as 0 is an implementation detail user-space doesn't need to know. > > Updated the comment and changed to slave_addr , and default is changed to "3". Slightly better, though I still don't get why you worry setting an address that will never be used. > >> + if (armxor_rate > 16000000) > >> + psc = (armxor_rate + 8000000) / 12000000; > >> + else > >> + psc = 0; > > >Can you please explain this formula? > > The OMAP core uses 8-bit value to divide the system clock (SCLK) and > generates its own sampling clock (ICLK), and the core logic is sampled > at clock rate of the system clock for the module, divided by (prescaler value + 1) I should have been more precise, I guess. What surprises me are the numbers themselves. It's frequent to see forumlae of the form "a = (b + c/2) / c" to divide with proper rounding, but here you have 2c/3 instread of c/2. My question was more like: is it intentional, or a typo? Also, with the code above, psc will never have value 1. The "if" part will always compute to at least 2, and the "else" part to 0. Is this OK? > I think it is better to remove those lines and return error if length is zero. > Is that ok? Yes. This can be revisited later when/if someone finds a hack to work around the problem. > >> + /* We have an error */ > >> + if (dev->cmd_err & OMAP_I2C_STAT_NACK) { > >> + if (msg->flags & I2C_M_IGNORE_NAK) > >> + return 0; > > >Couldn't you have other error bits set as well? I2C_M_IGNORE_NAK means > >you can ignore OMAP_I2C_STAT_NACK, not other errors. > > This is now being handled by first checking remaining errors first and then > NACK. Is that ok? Yes. > >> + r = omap_i2c_read_reg(dev, OMAP_I2C_REV_REG) & 0xff; > >> + dev_info(dev->dev, "bus %d rev%d.%d at %d kHz\n", > >> + pdev->id - 1, r >> 4, r & 0xf, clock); > > >This "- 1" is error prone IMHO. > > Only if omap devices.c maintainer pushes the values less than one in device > structure ;) No, what I meant was rather that printing a bus number which differs from the internal numbering might confuse the user at some point. -- Jean Delvare ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-05 8:31 ` [PATCH] OMAP: I2C driver for TI OMAP boards #3 Jean Delvare @ 2006-08-07 14:58 ` Tony Lindgren 2006-08-08 12:57 ` Komal Shah 2006-08-10 8:29 ` Jean Delvare 0 siblings, 2 replies; 9+ messages in thread From: Tony Lindgren @ 2006-08-07 14:58 UTC (permalink / raw) To: Jean Delvare Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c Hi, * Jean Delvare <khali@linux-fr.org> [060805 11:31]: > > > >> + if (armxor_rate > 16000000) > > >> + psc = (armxor_rate + 8000000) / 12000000; > > >> + else > > >> + psc = 0; > > > > >Can you please explain this formula? > > > > The OMAP core uses 8-bit value to divide the system clock (SCLK) and > > generates its own sampling clock (ICLK), and the core logic is sampled > > at clock rate of the system clock for the module, divided by (prescaler value + 1) > > I should have been more precise, I guess. What surprises me are the > numbers themselves. It's frequent to see forumlae of the form > "a = (b + c/2) / c" to divide with proper rounding, but here you have > 2c/3 instread of c/2. My question was more like: is it intentional, or a > typo? Also, with the code above, psc will never have value 1. The "if" > part will always compute to at least 2, and the "else" part to 0. Is > this OK? > Hmmm, this sounds like a bug somewhere. TRM for 5912 says the I2C clock must be prescaled to be between 7 - 12 MHz [1]. The XOR input clock is typically 12, 13 or 19.2 MHz. So we should have code that produces: XOR Mhz Divider Prescaler 12 1 0 13 2 1 19.2 2 1 Then again the original old code produces something different too [2]... I suspect the original code had some hw workarounds and and later code may have a conversion bug somewhere :) I suggest we keep the code as is for now since it's known to work on all omaps, and then submit a follow-up patch later once we have verified that that code based on the TRM works on all omaps. Regards, Tony [1] http://focus.ti.com/general/docs/lit/getliterature.tsp?baseLiteratureNumber=spru681 [2] http://linux-omap.bkbits.net:8080/main/diffs/drivers/i2c/busses/i2c-omap.c@1.12?nav=index.html|src/|src/drivers|src/drivers/i2c|src/drivers/i2c/busses|hist/drivers/i2c/busses/i2c-omap.c ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-07 14:58 ` Tony Lindgren @ 2006-08-08 12:57 ` Komal Shah 2006-08-08 13:09 ` Jean Delvare 2006-08-10 8:29 ` Jean Delvare 1 sibling, 1 reply; 9+ messages in thread From: Komal Shah @ 2006-08-08 12:57 UTC (permalink / raw) To: Tony Lindgren, Jean Delvare Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c --- Tony Lindgren <tony@atomide.com> wrote: > Hi, > > * Jean Delvare <khali@linux-fr.org> [060805 11:31]: > > > > > >> + if (armxor_rate > 16000000) > > > >> + psc = (armxor_rate + 8000000) / 12000000; > > > >> + else > > > >> + psc = 0; > > > > > > >Can you please explain this formula? > > > > > > The OMAP core uses 8-bit value to divide the system clock (SCLK) > and > > > generates its own sampling clock (ICLK), and the core logic is > sampled > > > at clock rate of the system clock for the module, divided by > (prescaler value + 1) > > > > I should have been more precise, I guess. What surprises me are the > > numbers themselves. It's frequent to see forumlae of the form > > "a = (b + c/2) / c" to divide with proper rounding, but here you > have > > 2c/3 instread of c/2. My question was more like: is it intentional, > or a > > typo? Also, with the code above, psc will never have value 1. The > "if" > > part will always compute to at least 2, and the "else" part to 0. > Is > > this OK? > > > > Hmmm, this sounds like a bug somewhere. TRM for 5912 says the I2C > clock > must be prescaled to be between 7 - 12 MHz [1]. The XOR input clock > is > typically 12, 13 or 19.2 MHz. So we should have code that produces: > > XOR Mhz Divider Prescaler > 12 1 0 > 13 2 1 > 19.2 2 1 > > Then again the original old code produces something different too > [2]... > > I suspect the original code had some hw workarounds and and later > code > may have a conversion bug somewhere :) > > I suggest we keep the code as is for now since it's known to work on > all omaps, and then submit a follow-up patch later once we have > verified that that code based on the TRM works on all omaps. I have updated the driver with all other review comments except comment on formula above by Jean. I can some part of description from Tony's explanation along with removing the following code line /* Set Own Address */ omap_i2c_write_reg(dev, OMAP_I2C_OA_REG, dev->own_address); As it is not needed. Please confirm so that I can send the revised patch soon. ---Komal Shah http://komalshah.blogspot.com/ __________________________________________________ Do You Yahoo!? Tired of spam? Yahoo! Mail has the best spam protection around http://mail.yahoo.com ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-08 12:57 ` Komal Shah @ 2006-08-08 13:09 ` Jean Delvare 0 siblings, 0 replies; 9+ messages in thread From: Jean Delvare @ 2006-08-08 13:09 UTC (permalink / raw) To: Komal Shah Cc: Tony Lindgren, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c Hi Komal, > > Hmmm, this sounds like a bug somewhere. TRM for 5912 says the I2C > > clock must be prescaled to be between 7 - 12 MHz [1]. The XOR input > > clock is typically 12, 13 or 19.2 MHz. So we should have code that > > produces: > > > > XOR Mhz Divider Prescaler > > 12 1 0 > > 13 2 1 > > 19.2 2 1 > > > > Then again the original old code produces something different too > > [2]... > > > > I suspect the original code had some hw workarounds and and later > > code > > may have a conversion bug somewhere :) > > > > I suggest we keep the code as is for now since it's known to work on > > all omaps, and then submit a follow-up patch later once we have > > verified that that code based on the TRM works on all omaps. > > I have updated the driver with all other review comments except comment > on formula above by Jean. I can some part of description from Tony's > explanation along with removing the following code line > > /* Set Own Address */ > omap_i2c_write_reg(dev, OMAP_I2C_OA_REG, dev->own_address); > > As it is not needed. Please confirm so that I can send the revised > patch soon. Fine with me. If you remove that line, there are a few others you should be able to remove as well (declaration of slave_add module parameter, definition of DEFAULT_OWN, etc.) Waiting for your updated patch :) Thanks for all the changes you accepted to make, BTW. I believe the driver is in a better shape now. -- Jean Delvare ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-07 14:58 ` Tony Lindgren 2006-08-08 12:57 ` Komal Shah @ 2006-08-10 8:29 ` Jean Delvare 2006-08-10 13:19 ` Tony Lindgren 1 sibling, 1 reply; 9+ messages in thread From: Jean Delvare @ 2006-08-10 8:29 UTC (permalink / raw) To: Tony Lindgren Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c Hi Tony, Komal, > Hmmm, this sounds like a bug somewhere. TRM for 5912 says the I2C clock > must be prescaled to be between 7 - 12 MHz [1]. The XOR input clock is > typically 12, 13 or 19.2 MHz. So we should have code that produces: > > XOR Mhz Divider Prescaler > 12 1 0 > 13 2 1 > 19.2 2 1 Not that 13 MHz cannot actually be prescaled between 7 and 12 MHz, no matter how you look at it. > Then again the original old code produces something different too [2]... > > I suspect the original code had some hw workarounds and and later code > may have a conversion bug somewhere :) > > I suggest we keep the code as is for now since it's known to work on > all omaps, and then submit a follow-up patch later once we have > verified that that code based on the TRM works on all omaps. I've now taken Komal's patch (#4). Here is a proposed patch which brings the prescaler computation formula in line with your comment and table above. It could be applied on top of Komal's patch unless it causes a problem on some of the OMAP systems. For XOR = 13 MHz, it changes the prescaler from 0 to 1. For XOR = 19.2 MHz it changes the prescaler from 2 to 1. I don't have any hardware to test it, though. If it happens to be better to be slightly over 12 MHz than slightly below 7 MHz, the "> 12000000" condition below can be replaced with "> 14000000". i2c: Fix OMAP clock prescaler to match the comment Signed-off-by: Jean Delvare <khali@linux-fr.org> --- drivers/i2c/busses/i2c-omap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- linux-2.6.18-rc4.orig/drivers/i2c/busses/i2c-omap.c 2006-08-10 09:56:54.000000000 +0200 +++ linux-2.6.18-rc4/drivers/i2c/busses/i2c-omap.c 2006-08-10 10:12:03.000000000 +0200 @@ -231,8 +231,8 @@ * 13 2 1 * 19.2 2 1 */ - if (fclk_rate > 16000000) - psc = (fclk_rate + 8000000) / 12000000; + if (fclk_rate > 12000000) + psc = fclk_rate / 12000000; } /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ -- Jean Delvare ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-10 8:29 ` Jean Delvare @ 2006-08-10 13:19 ` Tony Lindgren 2006-12-04 17:49 ` Jean Delvare 0 siblings, 1 reply; 9+ messages in thread From: Tony Lindgren @ 2006-08-10 13:19 UTC (permalink / raw) To: Jean Delvare Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c * Jean Delvare <khali@linux-fr.org> [060810 11:30]: > Hi Tony, Komal, > > > Hmmm, this sounds like a bug somewhere. TRM for 5912 says the I2C clock > > must be prescaled to be between 7 - 12 MHz [1]. The XOR input clock is > > typically 12, 13 or 19.2 MHz. So we should have code that produces: > > > > XOR Mhz Divider Prescaler > > 12 1 0 > > 13 2 1 > > 19.2 2 1 > > Not that 13 MHz cannot actually be prescaled between 7 and 12 MHz, no > matter how you look at it. True :) But that's what the docs say.. > > Then again the original old code produces something different too [2]... > > > > I suspect the original code had some hw workarounds and and later code > > may have a conversion bug somewhere :) > > > > I suggest we keep the code as is for now since it's known to work on > > all omaps, and then submit a follow-up patch later once we have > > verified that that code based on the TRM works on all omaps. > > I've now taken Komal's patch (#4). Here is a proposed patch which brings > the prescaler computation formula in line with your comment and table > above. It could be applied on top of Komal's patch unless it causes a > problem on some of the OMAP systems. For XOR = 13 MHz, it changes the > prescaler from 0 to 1. For XOR = 19.2 MHz it changes the prescaler from > 2 to 1. OK cool. As far as I'm concerned, I'm fine with it too: Signed-off-by: Tony Lindgren <tony@atomide.com> > I don't have any hardware to test it, though. If it happens to be > better to be slightly over 12 MHz than slightly below 7 MHz, the > "> 12000000" condition below can be replaced with "> 14000000". Thanks, we'll test it on various omaps and let you know if it works. Tony ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-08-10 13:19 ` Tony Lindgren @ 2006-12-04 17:49 ` Jean Delvare 2006-12-06 22:45 ` Tony Lindgren 0 siblings, 1 reply; 9+ messages in thread From: Jean Delvare @ 2006-12-04 17:49 UTC (permalink / raw) To: Tony Lindgren; +Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, i2c Hi Tony, all, On Thu, 10 Aug 2006 16:19:26 +0300, Tony Lindgren wrote: > * Jean Delvare <khali@linux-fr.org> [060810 11:30]: > > I've now taken Komal's patch (#4). Here is a proposed patch which brings > > the prescaler computation formula in line with your comment and table > > above. It could be applied on top of Komal's patch unless it causes a > > problem on some of the OMAP systems. For XOR = 13 MHz, it changes the > > prescaler from 0 to 1. For XOR = 19.2 MHz it changes the prescaler from > > 2 to 1. > > OK cool. As far as I'm concerned, I'm fine with it too: > Signed-off-by: Tony Lindgren <tony@atomide.com> > > > I don't have any hardware to test it, though. If it happens to be > > better to be slightly over 12 MHz than slightly below 7 MHz, the > > "> 12000000" condition below can be replaced with "> 14000000". > > Thanks, we'll test it on various omaps and let you know if it works. Any news on this? I still have this patch in my local tree. Should I push it into Linux 2.6.20? i2c: Fix OMAP clock prescaler to match the comment Signed-off-by: Tony Lindgren <tony@atomide.com> Signed-off-by: Jean Delvare <khali@linux-fr.org> --- drivers/i2c/busses/i2c-omap.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) --- linux-2.6.18-rc4.orig/drivers/i2c/busses/i2c-omap.c 2006-08-10 09:56:54.000000000 +0200 +++ linux-2.6.18-rc4/drivers/i2c/busses/i2c-omap.c 2006-08-10 10:12:03.000000000 +0200 @@ -231,8 +231,8 @@ * 13 2 1 * 19.2 2 1 */ - if (fclk_rate > 16000000) - psc = (fclk_rate + 8000000) / 12000000; + if (fclk_rate > 12000000) + psc = fclk_rate / 12000000; } /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ -- Jean Delvare ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 2006-12-04 17:49 ` Jean Delvare @ 2006-12-06 22:45 ` Tony Lindgren 0 siblings, 0 replies; 9+ messages in thread From: Tony Lindgren @ 2006-12-06 22:45 UTC (permalink / raw) To: Jean Delvare; +Cc: Komal Shah, David Brownell, r-woodruff2, linux-kernel, i2c Hi, * Jean Delvare <khali@linux-fr.org> [061204 09:49]: > Hi Tony, all, > > On Thu, 10 Aug 2006 16:19:26 +0300, Tony Lindgren wrote: > > * Jean Delvare <khali@linux-fr.org> [060810 11:30]: > > > I've now taken Komal's patch (#4). Here is a proposed patch which brings > > > the prescaler computation formula in line with your comment and table > > > above. It could be applied on top of Komal's patch unless it causes a > > > problem on some of the OMAP systems. For XOR = 13 MHz, it changes the > > > prescaler from 0 to 1. For XOR = 19.2 MHz it changes the prescaler from > > > 2 to 1. > > > > OK cool. As far as I'm concerned, I'm fine with it too: > > Signed-off-by: Tony Lindgren <tony@atomide.com> > > > > > I don't have any hardware to test it, though. If it happens to be > > > better to be slightly over 12 MHz than slightly below 7 MHz, the > > > "> 12000000" condition below can be replaced with "> 14000000". > > > > Thanks, we'll test it on various omaps and let you know if it works. > > Any news on this? I still have this patch in my local tree. Should I > push it into Linux 2.6.20? > > i2c: Fix OMAP clock prescaler to match the comment > > Signed-off-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Jean Delvare <khali@linux-fr.org> > --- > drivers/i2c/busses/i2c-omap.c | 4 ++-- > 1 file changed, 2 insertions(+), 2 deletions(-) > > --- linux-2.6.18-rc4.orig/drivers/i2c/busses/i2c-omap.c 2006-08-10 09:56:54.000000000 +0200 > +++ linux-2.6.18-rc4/drivers/i2c/busses/i2c-omap.c 2006-08-10 10:12:03.000000000 +0200 > @@ -231,8 +231,8 @@ > * 13 2 1 > * 19.2 2 1 > */ > - if (fclk_rate > 16000000) > - psc = (fclk_rate + 8000000) / 12000000; > + if (fclk_rate > 12000000) > + psc = fclk_rate / 12000000; > } > > /* Setup clock prescaler to obtain approx 12MHz I2C module clock: */ Sorry for the delay in replying. Yes, it's safe to push. When the original code was done, the max limit of 12MHz was ignored. Regards, Tony ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH] OMAP: I2C driver for TI OMAP boards #3 [not found] <1154689868.12791.267626769@webmail.messagingengine.com> 2006-08-05 8:31 ` [PATCH] OMAP: I2C driver for TI OMAP boards #3 Jean Delvare @ 2006-08-06 14:35 ` Jean Delvare 1 sibling, 0 replies; 9+ messages in thread From: Jean Delvare @ 2006-08-06 14:35 UTC (permalink / raw) To: Komal Shah Cc: tony, David Brownell, r-woodruff2, linux-kernel, Andrew Morton, Greg KH, i2c Hi Komal, > I have attached the updated patch, which addresses the most of review > comments. Here we go for another review: > --- a/drivers/i2c/busses/Kconfig > +++ b/drivers/i2c/busses/Kconfig > @@ -287,6 +287,14 @@ config I2C_OCORES > This driver can also be built as a module. If so, the module > will be called i2c-ocores. > > +config I2C_OMAP > + tristate "OMAP I2C adapter" > + depends on I2C && ARCH_OMAP > + default y if MACH_OMAP_H3 || MACH_OMAP_OSK > + help > + If you say yes to this option, support will be included for the > + Texas Instruments OMAP(http://www.ti.com/omap) I2C driver. > + Missing space before opening parenthesis. And "including support for a driver" still doesn't make sense, sorry. The driver is what supports a device. > --- /dev/null > +++ b/drivers/i2c/busses/i2c-omap.c > +/* I2C System Test Register (OMAP_I2C_SYSTEST): */ > +#ifdef DEBUG > +#define OMAP_I2C_SYSTEST_ST_EN (1 << 15) /* System test enable */ > +#define OMAP_I2C_SYSTEST_FREE (1 << 14) /* Free running mode */ > +#define OMAP_I2C_SYSTEST_TMODE_MASK (3 << 12) /* Test mode select */ > +#define OMAP_I2C_SYSTEST_TMODE_SHIFT (12) /* Test mode select */ > +#define OMAP_I2C_SYSTEST_SCL_I (1 << 3) /* SCL line sense in */ > +#define OMAP_I2C_SYSTEST_SCL_O (1 << 2) /* SCL line drive out */ > +#define OMAP_I2C_SYSTEST_SDA_I (1 << 1) /* SDA line sense in */ > +#define OMAP_I2C_SYSTEST_SDA_O (1 << 0) /* SDA line drive out */ > +#endif > + > +/* I2C System Status register (OMAP_I2C_SYSS): */ > +#define OMAP_I2C_SYSS_RDONE 1 /* Reset Done */ Shouldn't it be (1 << 0) for consistency? > + > +/* I2C System Configuration Register (OMAP_I2C_SYSC): */ > +#define OMAP_I2C_SYSC_SRST (1 << 1) /* Soft Reset */ > +static int omap_i2c_get_clocks(struct omap_i2c_dev *dev) > +{ > + if (cpu_is_omap16xx() || cpu_is_omap24xx()) { > + dev->iclk = clk_get(dev->dev, "i2c_ick"); > + if (IS_ERR(dev->iclk)) { > + dev->iclk = NULL; > + return -ENODEV; > + } > + } > + > + dev->fclk = clk_get(dev->dev, "i2c_fck"); > + if (IS_ERR(dev->fclk)) { > + if (dev->iclk != NULL) { > + clk_put(dev->iclk); > + dev->iclk = NULL; > + return -ENODEV; > + } > + } > + > + return 0; > +} You broke the second error path while trying to address my previous objection... dev->fclk is still not reset to NULL on error, and additionally you return 0 (instead of -ENODEV) if dev->iclk == NULL and clk_get(dev->dev, "i2c_fck") fails. Please fix. > +static int omap_i2c_init(struct omap_i2c_dev *dev) > +{ > + u16 psc = 0; > + unsigned long fclk_rate = 12000000; > + unsigned long timeout; > + > + if (!dev->rev1) { > + omap_i2c_write_reg(dev, OMAP_I2C_SYSC_REG, OMAP_I2C_SYSC_SRST); > + /* For some reason we need to set the EN bit before the > + * reset done bit gets set. */ > + timeout = jiffies + OMAP_I2C_TIMEOUT; > + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); > + while (!(omap_i2c_read_reg(dev, OMAP_I2C_SYSS_REG) & > + OMAP_I2C_SYSS_RDONE)) { > + if (time_after(jiffies, timeout)) { > + dev_warn(dev->dev, "timeout waiting" > + "for controller reset\n"); > + return -ETIMEDOUT; > + } > + msleep(1); > + } > + } > + omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); > + > + if (cpu_class_is_omap1()) { > + struct clk *armxor_ck; > + > + armxor_ck = clk_get(NULL, "armxor_ck"); > + if (IS_ERR(armxor_ck)) { > + dev_warn(dev->dev, "i2c: Could not get armxor_ck\n"); The "i2c: " should go away now that you use dev_warn() instead of printk(). > + fclk_rate = 12000000; This is already the value of fclk_rate, you initialized it at the top of the function. > + } else { > + fclk_rate = clk_get_rate(armxor_ck); > + clk_put(armxor_ck); > + } > + > + if (fclk_rate > 16000000) > + psc = (fclk_rate + 8000000) / 12000000; > + else > + psc = 0; Ditto. > + } > + > +/* > + * Low level master read/write transaction. > + */ > +static int omap_i2c_xfer_msg(struct i2c_adapter *adap, > + struct i2c_msg *msg, int stop) > +{ > + struct omap_i2c_dev *dev = i2c_get_adapdata(adap); > + int r; > + u16 w; > + u8 zero_byte = 0; > + > + dev_dbg(dev->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", > + msg->addr, msg->len, msg->flags, stop); > + > + omap_i2c_write_reg(dev, OMAP_I2C_SA_REG, msg->addr); > + > + /* Sigh, seems we can't do zero length transactions. Thus, we > + * can't probe for devices w/o actually sending/receiving at least > + * a single byte. So we'll set count to 1 for the zero length > + * transaction case and hope we don't cause grief for some > + * arbitrary device due to random byte write/read during > + * probes. > + */ > + /* REVISIT: Could the STB bit of I2C_CON be used with probing? */ > + if (msg->len == 0) { > + dev->buf = &zero_byte; > + dev->buf_len = 1; > + } else { Hm, I thought we had all agreed that it wasn't acceptable? If msg->len == 0, you can't handle the message, so return an error. Don't even write to the address register. > + dev->buf = msg->buf; > + dev->buf_len = msg->len; > + } > + omap_i2c_write_reg(dev, OMAP_I2C_CNT_REG, dev->buf_len); > +static u32 > +omap_i2c_func(struct i2c_adapter *adap) > +{ > + return I2C_FUNC_I2C; > +} Most i2c chip drivers will not work then. You can actually achieve most SMBus transactions, just not Quick Command. So you should return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK. > +#ifdef DEBUG > + if (!(stat & OMAP_I2C_STAT_BB)) { > + dev_warn(dev->dev, "XRDY while bus not busy\n"); > + bail_out = 1; > + } > +#endif > + omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); > + omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); > + if (bail_out) > + omap_i2c_complete_cmd(dev, OMAP_I2C_STAT_SBD); > + continue; > + } Enabling debug should never change the functional behavior of a driver. Rest looks OK to me. Please address the few remaining issues and resubmit your patch for inclusion. -- Jean Delvare ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2006-12-06 22:47 UTC | newest] Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <1154689868.12791.267626769@webmail.messagingengine.com> 2006-08-05 8:31 ` [PATCH] OMAP: I2C driver for TI OMAP boards #3 Jean Delvare 2006-08-07 14:58 ` Tony Lindgren 2006-08-08 12:57 ` Komal Shah 2006-08-08 13:09 ` Jean Delvare 2006-08-10 8:29 ` Jean Delvare 2006-08-10 13:19 ` Tony Lindgren 2006-12-04 17:49 ` Jean Delvare 2006-12-06 22:45 ` Tony Lindgren 2006-08-06 14:35 ` Jean Delvare
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).