* [U-Boot] I2C on iMX25
@ 2012-09-24 9:32 Matthias Weißer
2012-09-24 9:45 ` Stefano Babic
0 siblings, 1 reply; 7+ messages in thread
From: Matthias Weißer @ 2012-09-24 9:32 UTC (permalink / raw)
To: u-boot
Hi Stefano
I am currently in the process of updating my zmx25 board support for a new
hardware revision where I need I2C access. I2C on imx25 currently fails
to build:
mxc_i2c.c: In function 'i2c_imx_get_clk':
mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use in this
function)
I can easily fix this by replacing MXC_IPG_PERCLK with MXC_I2C_CLK. But
MXC_I2C_CLK is only defined for imx25. So, this change will break all other
imx chips. I can now add MXC_IPG_PERCLK to arch-mx25/clock.h and adopt
generic.c accordingly but I don't think that this is the right way to go
as the i2c clock can be different from perclk. Doing this
#define MXC_IPG_PERCLK MXC_I2C_CLK
in my config file is even more ugly.
Do you have any advice for me how to solve that?
Regards
Matthias
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 9:32 [U-Boot] I2C on iMX25 Matthias Weißer
@ 2012-09-24 9:45 ` Stefano Babic
2012-09-24 11:04 ` Matthias Weißer
2012-09-24 11:05 ` Benoît Thébaudeau
0 siblings, 2 replies; 7+ messages in thread
From: Stefano Babic @ 2012-09-24 9:45 UTC (permalink / raw)
To: u-boot
On 24/09/2012 11:32, Matthias Wei?er wrote:
> Hi Stefano
>
Hi Matthias,
> I am currently in the process of updating my zmx25 board support for a new
> hardware revision where I need I2C access. I2C on imx25 currently fails
> to build:
>
> mxc_i2c.c: In function 'i2c_imx_get_clk':
> mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use in this
> function)
Ok, I see.
>
> I can easily fix this by replacing MXC_IPG_PERCLK with MXC_I2C_CLK. But
> MXC_I2C_CLK is only defined for imx25. So, this change will break all other
> imx chips.
But this seems the right solution. The mxc_get_clk() gets as parameter
an enum representing a peripheral or a special clock name, valid for a
SOC. The driver should use the peripheral name.
> I can now add MXC_IPG_PERCLK to arch-mx25/clock.h and adopt
> generic.c accordingly but I don't think that this is the right way to go
> as the i2c clock can be different from perclk. Doing this
> #define MXC_IPG_PERCLK MXC_I2C_CLK
> in my config file is even more ugly.
This is wrong.
Really I think the right way is to add MXC_I2C_CLK to the other SOCs,
adding the case in their specific mxc_get_clock() implementation, for
example for mx6 something like this:
diff --git a/arch/arm/cpu/armv7/mx5/clock.c b/arch/arm/cpu/armv7/mx5/clock.c
index c67c3cf..8fa737a 100644
--- a/arch/arm/cpu/armv7/mx5/clock.c
+++ b/arch/arm/cpu/armv7/mx5/clock.c
@@ -482,6 +482,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
case MXC_IPG_CLK:
return get_ipg_clk();
case MXC_IPG_PERCLK:
+ case MXC_I2C_CLK:
return get_ipg_per_clk();
case MXC_UART_CLK:
return get_uart_clk();
and updating the mxc_i2c driver to follow the same rule.
Best regards,
Stefano
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 9:45 ` Stefano Babic
@ 2012-09-24 11:04 ` Matthias Weißer
2012-09-24 11:05 ` Benoît Thébaudeau
1 sibling, 0 replies; 7+ messages in thread
From: Matthias Weißer @ 2012-09-24 11:04 UTC (permalink / raw)
To: u-boot
Hi Stefano
Am 24.09.2012 11:45, schrieb Stefano Babic:
> On 24/09/2012 11:32, Matthias Wei?er wrote:
>> Hi Stefano
>>
>
> Hi Matthias,
>
>> I am currently in the process of updating my zmx25 board support for a new
>> hardware revision where I need I2C access. I2C on imx25 currently fails
>> to build:
>>
>> mxc_i2c.c: In function 'i2c_imx_get_clk':
>> mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use in this
>> function)
>
> Ok, I see.
>
>>
>> I can easily fix this by replacing MXC_IPG_PERCLK with MXC_I2C_CLK. But
>> MXC_I2C_CLK is only defined for imx25. So, this change will break all other
>> imx chips.
>
> But this seems the right solution. The mxc_get_clk() gets as parameter
> an enum representing a peripheral or a special clock name, valid for a
> SOC. The driver should use the peripheral name.
ACK
> and updating the mxc_i2c driver to follow the same rule.
I can create such a patch but I am not able to runtime test it on any
other system then imx25. Will do so.
Regards
Matthias
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 9:45 ` Stefano Babic
2012-09-24 11:04 ` Matthias Weißer
@ 2012-09-24 11:05 ` Benoît Thébaudeau
2012-09-24 11:34 ` Matthias Weißer
2012-09-24 11:54 ` Stefano Babic
1 sibling, 2 replies; 7+ messages in thread
From: Benoît Thébaudeau @ 2012-09-24 11:05 UTC (permalink / raw)
To: u-boot
Hi Stefano, Matthias,
On Monday, September 24, 2012 11:45:33 AM, Stefano Babic wrote:
> On 24/09/2012 11:32, Matthias Wei?er wrote:
> > Hi Stefano
> >
>
> Hi Matthias,
>
> > I am currently in the process of updating my zmx25 board support
> > for a new
> > hardware revision where I need I2C access. I2C on imx25 currently
> > fails
> > to build:
> >
> > mxc_i2c.c: In function 'i2c_imx_get_clk':
> > mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use in
> > this
> > function)
>
> Ok, I see.
I had the same issue a while ago. I have a fix for that. I will try to post it
tonight.
> > I can easily fix this by replacing MXC_IPG_PERCLK with MXC_I2C_CLK.
> > But
> > MXC_I2C_CLK is only defined for imx25. So, this change will break
> > all other
> > imx chips.
>
> But this seems the right solution. The mxc_get_clk() gets as
> parameter
> an enum representing a peripheral or a special clock name, valid for
> a
> SOC. The driver should use the peripheral name.
Yes and no. The best would be to add a clock abstraction function
imx_get_i2cclk(), like what exists for UART. This is what I did.
> > I can now add MXC_IPG_PERCLK to arch-mx25/clock.h and adopt
> > generic.c accordingly but I don't think that this is the right way
> > to go
> > as the i2c clock can be different from perclk. Doing this
> > #define MXC_IPG_PERCLK MXC_I2C_CLK
> > in my config file is even more ugly.
>
> This is wrong.
I agree. MXC_IPG_PERCLK means something else, and the I?C clock is not that
clock on i.MX25.
> Really I think the right way is to add MXC_I2C_CLK to the other SOCs,
> adding the case in their specific mxc_get_clock() implementation, for
> example for mx6 something like this:
>
> diff --git a/arch/arm/cpu/armv7/mx5/clock.c
> b/arch/arm/cpu/armv7/mx5/clock.c
> index c67c3cf..8fa737a 100644
> --- a/arch/arm/cpu/armv7/mx5/clock.c
> +++ b/arch/arm/cpu/armv7/mx5/clock.c
> @@ -482,6 +482,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
> case MXC_IPG_CLK:
> return get_ipg_clk();
> case MXC_IPG_PERCLK:
> + case MXC_I2C_CLK:
> return get_ipg_per_clk();
> case MXC_UART_CLK:
> return get_uart_clk();
>
>
> and updating the mxc_i2c driver to follow the same rule.
That can be a good solution. What do you think about my imx_get_i2cclk()?
Also, note that there are some broken clocks for i.MX25. I?C is one of them. It
should be:
case MXC_I2C_CLK:
return imx_get_perclk(I2C_PER_CLK);
Best regards,
Beno?t
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 11:05 ` Benoît Thébaudeau
@ 2012-09-24 11:34 ` Matthias Weißer
2012-09-24 12:35 ` Benoît Thébaudeau
2012-09-24 11:54 ` Stefano Babic
1 sibling, 1 reply; 7+ messages in thread
From: Matthias Weißer @ 2012-09-24 11:34 UTC (permalink / raw)
To: u-boot
Am 24.09.2012 13:05, schrieb Beno?t Th?baudeau:
> Hi Stefano, Matthias,
>
> On Monday, September 24, 2012 11:45:33 AM, Stefano Babic wrote:
>> On 24/09/2012 11:32, Matthias Wei?er wrote:
>> > Hi Stefano
>> >
>>
>> Hi Matthias,
>>
>> > I am currently in the process of updating my zmx25 board support
>> > for a new
>> > hardware revision where I need I2C access. I2C on imx25 currently
>> > fails
>> > to build:
>> >
>> > mxc_i2c.c: In function 'i2c_imx_get_clk':
>> > mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use in
>> > this
>> > function)
>>
>> Ok, I see.
>
> I had the same issue a while ago. I have a fix for that. I will try to post it
> tonight.
>
>> > I can easily fix this by replacing MXC_IPG_PERCLK with MXC_I2C_CLK.
>> > But
>> > MXC_I2C_CLK is only defined for imx25. So, this change will break
>> > all other
>> > imx chips.
>>
>> But this seems the right solution. The mxc_get_clk() gets as
>> parameter
>> an enum representing a peripheral or a special clock name, valid for
>> a
>> SOC. The driver should use the peripheral name.
>
> Yes and no. The best would be to add a clock abstraction function
> imx_get_i2cclk(), like what exists for UART. This is what I did.
What is the advantage of such a function over i2c_imx_get_clk(MXC_I2C_CLK)?
>> Really I think the right way is to add MXC_I2C_CLK to the other SOCs,
>> adding the case in their specific mxc_get_clock() implementation, for
>> example for mx6 something like this:
>>
>> diff --git a/arch/arm/cpu/armv7/mx5/clock.c
>> b/arch/arm/cpu/armv7/mx5/clock.c
>> index c67c3cf..8fa737a 100644
>> --- a/arch/arm/cpu/armv7/mx5/clock.c
>> +++ b/arch/arm/cpu/armv7/mx5/clock.c
>> @@ -482,6 +482,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
>> case MXC_IPG_CLK:
>> return get_ipg_clk();
>> case MXC_IPG_PERCLK:
>> + case MXC_I2C_CLK:
>> return get_ipg_per_clk();
>> case MXC_UART_CLK:
>> return get_uart_clk();
>>
>>
>> and updating the mxc_i2c driver to follow the same rule.
>
> That can be a good solution. What do you think about my imx_get_i2cclk()?
>
> Also, note that there are some broken clocks for i.MX25. I?C is one of them. It
> should be:
> case MXC_I2C_CLK:
> return imx_get_perclk(I2C_PER_CLK);
Why that? My understanding is that imx_get_perclk picks the right clock
as long as the 16 first entries of enum mxc_clock ar in the rigth order.
Regards
Matthias
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 11:05 ` Benoît Thébaudeau
2012-09-24 11:34 ` Matthias Weißer
@ 2012-09-24 11:54 ` Stefano Babic
1 sibling, 0 replies; 7+ messages in thread
From: Stefano Babic @ 2012-09-24 11:54 UTC (permalink / raw)
To: u-boot
On 24/09/2012 13:05, Beno?t Th?baudeau wrote:
>> But this seems the right solution. The mxc_get_clk() gets as
>> parameter
>> an enum representing a peripheral or a special clock name, valid for
>> a
>> SOC. The driver should use the peripheral name.
>
> Yes and no. The best would be to add a clock abstraction function
> imx_get_i2cclk(), like what exists for UART. This is what I did.
However, this duplicates the interface because we have a mxc_get_clk()
and a function names for each peripheral. We have then a plethora of new
functions, one for each peripheral, and all SOCs must implement them to
be consistent.
I prefer to have only one function, available for all SOCs. Everybody
who starts with a new iMX SOC then knows that he must implement
mxc_get_clk(), and that is all.
>> diff --git a/arch/arm/cpu/armv7/mx5/clock.c
>> b/arch/arm/cpu/armv7/mx5/clock.c
>> index c67c3cf..8fa737a 100644
>> --- a/arch/arm/cpu/armv7/mx5/clock.c
>> +++ b/arch/arm/cpu/armv7/mx5/clock.c
>> @@ -482,6 +482,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
>> case MXC_IPG_CLK:
>> return get_ipg_clk();
>> case MXC_IPG_PERCLK:
>> + case MXC_I2C_CLK:
>> return get_ipg_per_clk();
>> case MXC_UART_CLK:
>> return get_uart_clk();
>>
>>
>> and updating the mxc_i2c driver to follow the same rule.
>
> That can be a good solution. What do you think about my imx_get_i2cclk()?
>
My preference goes to not add it.
Regards,
Stefano
--
=====================================================================
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
^ permalink raw reply [flat|nested] 7+ messages in thread
* [U-Boot] I2C on iMX25
2012-09-24 11:34 ` Matthias Weißer
@ 2012-09-24 12:35 ` Benoît Thébaudeau
0 siblings, 0 replies; 7+ messages in thread
From: Benoît Thébaudeau @ 2012-09-24 12:35 UTC (permalink / raw)
To: u-boot
On Monday, September 24, 2012 1:34:57 PM, Matthias Wei?er wrote:
> Am 24.09.2012 13:05, schrieb Beno?t Th?baudeau:
> > Hi Stefano, Matthias,
> >
> > On Monday, September 24, 2012 11:45:33 AM, Stefano Babic wrote:
> >> On 24/09/2012 11:32, Matthias Wei?er wrote:
> >> > Hi Stefano
> >> >
> >>
> >> Hi Matthias,
> >>
> >> > I am currently in the process of updating my zmx25 board support
> >> > for a new
> >> > hardware revision where I need I2C access. I2C on imx25
> >> > currently
> >> > fails
> >> > to build:
> >> >
> >> > mxc_i2c.c: In function 'i2c_imx_get_clk':
> >> > mxc_i2c.c:101:31: error: 'MXC_IPG_PERCLK' undeclared (first use
> >> > in
> >> > this
> >> > function)
> >>
> >> Ok, I see.
> >
> > I had the same issue a while ago. I have a fix for that. I will try
> > to post it
> > tonight.
> >
> >> > I can easily fix this by replacing MXC_IPG_PERCLK with
> >> > MXC_I2C_CLK.
> >> > But
> >> > MXC_I2C_CLK is only defined for imx25. So, this change will
> >> > break
> >> > all other
> >> > imx chips.
> >>
> >> But this seems the right solution. The mxc_get_clk() gets as
> >> parameter
> >> an enum representing a peripheral or a special clock name, valid
> >> for
> >> a
> >> SOC. The driver should use the peripheral name.
> >
> > Yes and no. The best would be to add a clock abstraction function
> > imx_get_i2cclk(), like what exists for UART. This is what I did.
>
> What is the advantage of such a function over
> i2c_imx_get_clk(MXC_I2C_CLK)?
Not to introduce a clock ID that does not match register controls, but this is
really a nit. The MXC_I2C_CLK solution is less noisy than adding a new function,
so let's stick to it, all the more Stefano prefers it. I will update my local
patch with that before posting it.
> >> Really I think the right way is to add MXC_I2C_CLK to the other
> >> SOCs,
> >> adding the case in their specific mxc_get_clock() implementation,
> >> for
> >> example for mx6 something like this:
> >>
> >> diff --git a/arch/arm/cpu/armv7/mx5/clock.c
> >> b/arch/arm/cpu/armv7/mx5/clock.c
> >> index c67c3cf..8fa737a 100644
> >> --- a/arch/arm/cpu/armv7/mx5/clock.c
> >> +++ b/arch/arm/cpu/armv7/mx5/clock.c
> >> @@ -482,6 +482,7 @@ unsigned int mxc_get_clock(enum mxc_clock clk)
> >> case MXC_IPG_CLK:
> >> return get_ipg_clk();
> >> case MXC_IPG_PERCLK:
> >> + case MXC_I2C_CLK:
> >> return get_ipg_per_clk();
> >> case MXC_UART_CLK:
> >> return get_uart_clk();
> >>
> >>
> >> and updating the mxc_i2c driver to follow the same rule.
> >
> > That can be a good solution. What do you think about my
> > imx_get_i2cclk()?
> >
> > Also, note that there are some broken clocks for i.MX25. I?C is one
> > of them. It
> > should be:
> > case MXC_I2C_CLK:
> > return imx_get_perclk(I2C_PER_CLK);
>
> Why that? My understanding is that imx_get_perclk picks the right
> clock
> as long as the 16 first entries of enum mxc_clock ar in the rigth
> order.
You're right. I looked too quickly at my local changes when I said that this
clock was broken. It works. What I did locally is split the per clocks away from
enum mxc_clock to be cleaner than having a mix of all types of clocks, but this
is actually only cosmetic, and I'm not sure I will keep this change.
Best regards,
Beno?t
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2012-09-24 12:35 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-09-24 9:32 [U-Boot] I2C on iMX25 Matthias Weißer
2012-09-24 9:45 ` Stefano Babic
2012-09-24 11:04 ` Matthias Weißer
2012-09-24 11:05 ` Benoît Thébaudeau
2012-09-24 11:34 ` Matthias Weißer
2012-09-24 12:35 ` Benoît Thébaudeau
2012-09-24 11:54 ` Stefano Babic
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox