Patchwork [U-Boot] Atmel : usb : add EHCI driver for Atmel SoC

login
register
mail settings
Submitter Bo Shen
Date June 21, 2012, 7:50 a.m.
Message ID <1340265033-31321-1-git-send-email-voice.shen@atmel.com>
Download mbox | patch
Permalink /patch/166242/
State Superseded
Headers show

Comments

Bo Shen - June 21, 2012, 7:50 a.m.
Some Atmel SoC support USB EHCI, add the EHCI driver to support it.

To enable the USB EHCI, add the following configuration options into
board relative configuration file and remove USB OHCI options.

  #define CONFIG_USB_EHCI
  #define CONFIG_USB_EHCI_ATMEL
  #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2

Signed-off-by: Bo Shen <voice.shen@atmel.com>
---
 drivers/usb/host/Makefile     |    1 +
 drivers/usb/host/ehci-atmel.c |   67 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 68 insertions(+)
 create mode 100644 drivers/usb/host/ehci-atmel.c
Marek Vasut - June 21, 2012, 10:17 a.m.
Dear Bo Shen,

> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
> 
> To enable the USB EHCI, add the following configuration options into
> board relative configuration file and remove USB OHCI options.
> 
>   #define CONFIG_USB_EHCI
>   #define CONFIG_USB_EHCI_ATMEL
>   #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
> 
> Signed-off-by: Bo Shen <voice.shen@atmel.com>
> ---
>  drivers/usb/host/Makefile     |    1 +
>  drivers/usb/host/ehci-atmel.c |   67
> +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68
> insertions(+)
>  create mode 100644 drivers/usb/host/ehci-atmel.c
> 
> diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
> index 59c3e57..4547f37 100644
> --- a/drivers/usb/host/Makefile
> +++ b/drivers/usb/host/Makefile
> @@ -36,6 +36,7 @@ COBJS-$(CONFIG_USB_SL811HS) += sl811-hcd.o
>  # echi
>  COBJS-$(CONFIG_USB_EHCI) += ehci-hcd.o
>  COBJS-$(CONFIG_USB_EHCI_ARMADA100) += ehci-armada100.o utmi-armada100.o
> +COBJS-$(CONFIG_USB_EHCI_ATMEL) += ehci-atmel.o
>  ifdef CONFIG_MPC512X
>  COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-mpc512x.o
>  else
> diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
> new file mode 100644
> index 0000000..a3418c4
> --- /dev/null
> +++ b/drivers/usb/host/ehci-atmel.c
> @@ -0,0 +1,67 @@
> +/*
> + * (C) Copyright 2012
> + * Atmel Semiconductor <www.atmel.com>
> + * Written-by: Bo Shen <voice.shen@atmel.com>
> + *
> + * See file CREDITS for list of people who contributed to this
> + * project.
> + *
> + * This program is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU General Public License as
> + * published by the Free Software Foundation; either version 2 of
> + * the License, or (at your option) any later version.
> + *
> + * This program is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
> + * GNU General Public License for more details.
> + *
> + * You should have received a copy of the GNU General Public License
> + * along with this program; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
> + * MA 02110-1301 USA
> + */
> +
> +#include <common.h>
> +#include <usb.h>
> +#include <asm/io.h>
> +#include <asm/arch/hardware.h>
> +#include <asm/arch/at91_pmc.h>
> +#include <asm/arch/clk.h>
> +
> +#include "ehci.h"
> +#include "ehci-core.h"
> +
> +int ehci_hcd_init(void)
> +{
> +	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
> +
> +	/* Enable UPLL  */
> +	writel(AT91_PMC_UPLLEN | AT91_PMC_BIASEN, &pmc->uckr);
> +	while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU)
> +		;

Add WATCHDOG_RESET() and fix it not to be an endless loop.

> +
> +	/* Enable USB Host clock */
> +	writel(1 << ATMEL_ID_UHPHS, &pmc->pcer);
> +
> +	hccr = (struct ehci_hccr *)ATMEL_BASE_EHCI;
> +	hcor = (struct ehci_hcor *)((uint32_t)hccr +
> +			HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
> +
> +	return 0;
> +}
> +
> +int ehci_hcd_stop(void)
> +{
> +	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
> +
> +	/* Disable USB Host Clock */
> +	writel(1 << ATMEL_ID_UHPHS, &pmc->pcdr);
> +
> +	/* Disable UPLL */
> +	writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr);
> +	while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
> +		;

DTTO

> +
> +	return 0;
> +}

btw do you have some user for this code?

Best regards,
Marek Vasut
Bo Shen - June 25, 2012, 1:31 a.m.
Hi Marek,

On 6/21/2012 18:17, Marek Vasut wrote:
> Dear Bo Shen,
>
>> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
>>
>> To enable the USB EHCI, add the following configuration options into
>> board relative configuration file and remove USB OHCI options.
>>
>>    #define CONFIG_USB_EHCI
>>    #define CONFIG_USB_EHCI_ATMEL
>>    #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
>>
>> Signed-off-by: Bo Shen<voice.shen@atmel.com>
>> ---
>>   drivers/usb/host/Makefile     |    1 +
>>   drivers/usb/host/ehci-atmel.c |   67
>> +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68
>> insertions(+)
>>   create mode 100644 drivers/usb/host/ehci-atmel.c
>>
>> diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
>> index 59c3e57..4547f37 100644
>> --- a/drivers/usb/host/Makefile
>> +++ b/drivers/usb/host/Makefile
>> @@ -36,6 +36,7 @@ COBJS-$(CONFIG_USB_SL811HS) += sl811-hcd.o
>>   # echi
>>   COBJS-$(CONFIG_USB_EHCI) += ehci-hcd.o
>>   COBJS-$(CONFIG_USB_EHCI_ARMADA100) += ehci-armada100.o utmi-armada100.o
>> +COBJS-$(CONFIG_USB_EHCI_ATMEL) += ehci-atmel.o
>>   ifdef CONFIG_MPC512X
>>   COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-mpc512x.o
>>   else
>> diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
>> new file mode 100644
>> index 0000000..a3418c4
>> --- /dev/null
>> +++ b/drivers/usb/host/ehci-atmel.c
>> @@ -0,0 +1,67 @@
>> +/*
>> + * (C) Copyright 2012
>> + * Atmel Semiconductor<www.atmel.com>
>> + * Written-by: Bo Shen<voice.shen@atmel.com>
>> + *
>> + * See file CREDITS for list of people who contributed to this
>> + * project.
>> + *
>> + * This program is free software; you can redistribute it and/or
>> + * modify it under the terms of the GNU General Public License as
>> + * published by the Free Software Foundation; either version 2 of
>> + * the License, or (at your option) any later version.
>> + *
>> + * This program is distributed in the hope that it will be useful,
>> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
>> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
>> + * GNU General Public License for more details.
>> + *
>> + * You should have received a copy of the GNU General Public License
>> + * along with this program; if not, write to the Free Software
>> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
>> + * MA 02110-1301 USA
>> + */
>> +
>> +#include<common.h>
>> +#include<usb.h>
>> +#include<asm/io.h>
>> +#include<asm/arch/hardware.h>
>> +#include<asm/arch/at91_pmc.h>
>> +#include<asm/arch/clk.h>
>> +
>> +#include "ehci.h"
>> +#include "ehci-core.h"
>> +
>> +int ehci_hcd_init(void)
>> +{
>> +	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
>> +
>> +	/* Enable UPLL  */
>> +	writel(AT91_PMC_UPLLEN | AT91_PMC_BIASEN,&pmc->uckr);
>> +	while ((readl(&pmc->sr)&  AT91_PMC_LOCKU) != AT91_PMC_LOCKU)
>> +		;
>
> Add WATCHDOG_RESET() and fix it not to be an endless loop.

OK, I will fix it at next version patch.

>
>> +
>> +	/* Enable USB Host clock */
>> +	writel(1<<  ATMEL_ID_UHPHS,&pmc->pcer);
>> +
>> +	hccr = (struct ehci_hccr *)ATMEL_BASE_EHCI;
>> +	hcor = (struct ehci_hcor *)((uint32_t)hccr +
>> +			HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
>> +
>> +	return 0;
>> +}
>> +
>> +int ehci_hcd_stop(void)
>> +{
>> +	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
>> +
>> +	/* Disable USB Host Clock */
>> +	writel(1<<  ATMEL_ID_UHPHS,&pmc->pcdr);
>> +
>> +	/* Disable UPLL */
>> +	writel(readl(&pmc->uckr)&  (~AT91_PMC_UPLLEN),&pmc->uckr);
>> +	while ((readl(&pmc->sr)&  AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
>> +		;
>
> DTTO

OK, I will fix it at next version patch.

>
>> +
>> +	return 0;
>> +}
>
> btw do you have some user for this code?

The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New 
coming boards will use EHCI.

>
> Best regards,
> Marek Vasut
Marek Vasut - June 25, 2012, 2:57 a.m.
Dear Bo Shen,

> Hi Marek,
> 
> On 6/21/2012 18:17, Marek Vasut wrote:
> > Dear Bo Shen,
> > 
> >> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
> >> 
> >> To enable the USB EHCI, add the following configuration options into
> >> board relative configuration file and remove USB OHCI options.
> >> 
> >>    #define CONFIG_USB_EHCI
> >>    #define CONFIG_USB_EHCI_ATMEL
> >>    #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
> >> 
> >> Signed-off-by: Bo Shen<voice.shen@atmel.com>
> >> ---
[...]

> 
> OK, I will fix it at next version patch.
> 

Thank you!

> >> +
> >> +	return 0;
> >> +}
> > 
> > btw do you have some user for this code?
> 
> The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New
> coming boards will use EHCI.

When do you see such board appearing please?

> > Best regards,
> > Marek Vasut

Best regards,
Marek Vasut
Bo Shen - June 25, 2012, 3:13 a.m.
Hi Marek,

On 6/25/2012 10:57, Marek Vasut wrote:
> Dear Bo Shen,
>
>> Hi Marek,
>>
>> On 6/21/2012 18:17, Marek Vasut wrote:
>>> Dear Bo Shen,
>>>
>>>> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
>>>>
>>>> To enable the USB EHCI, add the following configuration options into
>>>> board relative configuration file and remove USB OHCI options.
>>>>
>>>>     #define CONFIG_USB_EHCI
>>>>     #define CONFIG_USB_EHCI_ATMEL
>>>>     #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
>>>>
>>>> Signed-off-by: Bo Shen<voice.shen@atmel.com>
>>>> ---

[...]

>>> btw do you have some user for this code?
>>
>> The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New
>> coming boards will use EHCI.
>
> When do you see such board appearing please?

   The at91sam9m10g45ek board has existed in mainline. As to AT91 
maintainer has no response, so I just send the EHCI driver separately.

   For new boards, I have submitted some patches (Please take the link 
as a reference: http://patchwork.ozlabs.org/patch/160581/), but AT91 
maintainer has no response and also, not others response.

BRs,
Bo Shen

>
>>> Best regards,
>>> Marek Vasut
>
> Best regards,
> Marek Vasut
Marek Vasut - June 25, 2012, 1:07 p.m.
Dear Bo Shen,

> Hi Marek,
> 
> On 6/25/2012 10:57, Marek Vasut wrote:
> > Dear Bo Shen,
> > 
> >> Hi Marek,
> >> 
> >> On 6/21/2012 18:17, Marek Vasut wrote:
> >>> Dear Bo Shen,
> >>> 
> >>>> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
> >>>> 
> >>>> To enable the USB EHCI, add the following configuration options into
> >>>> board relative configuration file and remove USB OHCI options.
> >>>> 
> >>>>     #define CONFIG_USB_EHCI
> >>>>     #define CONFIG_USB_EHCI_ATMEL
> >>>>     #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
> >>>> 
> >>>> Signed-off-by: Bo Shen<voice.shen@atmel.com>
> >>>> ---
> 
> [...]
> 
> >>> btw do you have some user for this code?
> >> 
> >> The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New
> >> coming boards will use EHCI.
> > 
> > When do you see such board appearing please?
> 
>    The at91sam9m10g45ek board has existed in mainline. As to AT91
> maintainer has no response, so I just send the EHCI driver separately.

I think there're some issues with the at91 maintainer. Ccing Andreas, maybe he 
can actually start picking up the atmel patches?

>    For new boards, I have submitted some patches (Please take the link
> as a reference: http://patchwork.ozlabs.org/patch/160581/), but AT91
> maintainer has no response and also, not others response.

And CCing Albert so he can pick it up. But it'd be great if you also added some 
user of this code, so it's not completely dead.

> BRs,
> Bo Shen
> 
> >>> Best regards,
> >>> Marek Vasut
> > 
> > Best regards,
> > Marek Vasut

Best regards,
Marek Vasut
Bo Shen - June 26, 2012, 2:23 a.m.
Hi Marek,

On 6/25/2012 21:07, Marek Vasut wrote:
> Dear Bo Shen,
>
>> Hi Marek,
>>
>> On 6/25/2012 10:57, Marek Vasut wrote:
>>> Dear Bo Shen,
>>>
>>>> Hi Marek,
>>>>
>>>> On 6/21/2012 18:17, Marek Vasut wrote:
>>>>> Dear Bo Shen,
>>>>>
>>>>>> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
>>>>>>
>>>>>> To enable the USB EHCI, add the following configuration options into
>>>>>> board relative configuration file and remove USB OHCI options.
>>>>>>
>>>>>>      #define CONFIG_USB_EHCI
>>>>>>      #define CONFIG_USB_EHCI_ATMEL
>>>>>>      #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
>>>>>>
>>>>>> Signed-off-by: Bo Shen<voice.shen@atmel.com>
>>>>>> ---
>>
>> [...]
>>
>>>>> btw do you have some user for this code?
>>>>
>>>> The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New
>>>> coming boards will use EHCI.
>>>
>>> When do you see such board appearing please?
>>
>>     The at91sam9m10g45ek board has existed in mainline. As to AT91
>> maintainer has no response, so I just send the EHCI driver separately.
>
> I think there're some issues with the at91 maintainer. Ccing Andreas, maybe he
> can actually start picking up the atmel patches?
>
>>     For new boards, I have submitted some patches (Please take the link
>> as a reference: http://patchwork.ozlabs.org/patch/160581/), but AT91
>> maintainer has no response and also, not others response.
>
> And CCing Albert so he can pick it up. But it'd be great if you also added some
> user of this code, so it's not completely dead.

OK, I will send out the v2 patches.
Thanks

>
>> BRs,
>> Bo Shen
>>
>>>>> Best regards,
>>>>> Marek Vasut
>>>
>>> Best regards,
>>> Marek Vasut
>
> Best regards,
> Marek Vasut
>
Andreas Bießmann - June 27, 2012, 9:08 a.m.
Dear all,

On 25.06.12 15:07, Marek Vasut wrote:
> Dear Bo Shen,
> 
>> Hi Marek,
>>
>> On 6/25/2012 10:57, Marek Vasut wrote:
>>> Dear Bo Shen,
>>>
>>>> Hi Marek,
>>>>
>>>> On 6/21/2012 18:17, Marek Vasut wrote:
>>>>> Dear Bo Shen,
>>>>>
>>>>>> Some Atmel SoC support USB EHCI, add the EHCI driver to support it.
>>>>>>
>>>>>> To enable the USB EHCI, add the following configuration options into
>>>>>> board relative configuration file and remove USB OHCI options.
>>>>>>
>>>>>>     #define CONFIG_USB_EHCI
>>>>>>     #define CONFIG_USB_EHCI_ATMEL
>>>>>>     #define CONFIG_SYS_USB_EHCI_MAX_ROOT_PORTS     2
>>>>>>
>>>>>> Signed-off-by: Bo Shen<voice.shen@atmel.com>
>>>>>> ---
>>
>> [...]
>>
>>>>> btw do you have some user for this code?
>>>>
>>>> The at91sam9m10g45ek now uses OHCI, if needed, it can use EHCI. New
>>>> coming boards will use EHCI.
>>>
>>> When do you see such board appearing please?
>>
>>    The at91sam9m10g45ek board has existed in mainline. As to AT91
>> maintainer has no response, so I just send the EHCI driver separately.
> 
> I think there're some issues with the at91 maintainer. Ccing Andreas, maybe he 
> can actually start picking up the atmel patches?
> 

Sorry for being late, I read the list not really daily these days.

AFAIR Reinhard gave up somewhere end of last year, in fact we currently
have no at91 maintainer.
I'm willing to step into at least for a while. My main aim is to get the
latest Atmel patches into mainline for 2012.07, if Albert is willing to
pull them (well less than 20 days left, and some of the patches where
slightly after close of MW for 2012.07).

As far as I can see these patches are left:

Bo Shen (new board):
http://patchwork.ozlabs.org/patch/160581/
http://patchwork.ozlabs.org/patch/167290/

Alexandre Belloni (change address for dataflash; first submission in
February!):
http://patchwork.ozlabs.org/patch/154242/

Jens Scharsig (fixes):
http://patchwork.ozlabs.org/patch/147550/
http://patchwork.ozlabs.org/patch/147534/

Vladimir Zapolskiy (new board):
http://patchwork.ozlabs.org/patch/135526/

Wolfgang and Albert, how do you think about?

best regards

Andreas Bießmann
Wolfgang Denk - June 27, 2012, 1:47 p.m.
Dear Andreas,

In message <4FEACD7E.8000506@gmail.com> you wrote:
> 
> AFAIR Reinhard gave up somewhere end of last year, in fact we currently
> have no at91 maintainer.
> I'm willing to step into at least for a while. My main aim is to get the
> latest Atmel patches into mainline for 2012.07, if Albert is willing to
> pull them (well less than 20 days left, and some of the patches where
> slightly after close of MW for 2012.07).
...
> Wolfgang and Albert, how do you think about?

I am really glad you are volunteering - you close a pretty painful
gap.  Thanks a lot for your work in advance, it is highly appreciated.


Your SSH key has been installed for both u-boot-atmel and u-boot-at91
so you should be able to start working.

Best regards,

Wolfgang Denk

Patch

diff --git a/drivers/usb/host/Makefile b/drivers/usb/host/Makefile
index 59c3e57..4547f37 100644
--- a/drivers/usb/host/Makefile
+++ b/drivers/usb/host/Makefile
@@ -36,6 +36,7 @@  COBJS-$(CONFIG_USB_SL811HS) += sl811-hcd.o
 # echi
 COBJS-$(CONFIG_USB_EHCI) += ehci-hcd.o
 COBJS-$(CONFIG_USB_EHCI_ARMADA100) += ehci-armada100.o utmi-armada100.o
+COBJS-$(CONFIG_USB_EHCI_ATMEL) += ehci-atmel.o
 ifdef CONFIG_MPC512X
 COBJS-$(CONFIG_USB_EHCI_FSL) += ehci-mpc512x.o
 else
diff --git a/drivers/usb/host/ehci-atmel.c b/drivers/usb/host/ehci-atmel.c
new file mode 100644
index 0000000..a3418c4
--- /dev/null
+++ b/drivers/usb/host/ehci-atmel.c
@@ -0,0 +1,67 @@ 
+/*
+ * (C) Copyright 2012
+ * Atmel Semiconductor <www.atmel.com>
+ * Written-by: Bo Shen <voice.shen@atmel.com>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+ * MA 02110-1301 USA
+ */
+
+#include <common.h>
+#include <usb.h>
+#include <asm/io.h>
+#include <asm/arch/hardware.h>
+#include <asm/arch/at91_pmc.h>
+#include <asm/arch/clk.h>
+
+#include "ehci.h"
+#include "ehci-core.h"
+
+int ehci_hcd_init(void)
+{
+	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
+
+	/* Enable UPLL  */
+	writel(AT91_PMC_UPLLEN | AT91_PMC_BIASEN, &pmc->uckr);
+	while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU)
+		;
+
+	/* Enable USB Host clock */
+	writel(1 << ATMEL_ID_UHPHS, &pmc->pcer);
+
+	hccr = (struct ehci_hccr *)ATMEL_BASE_EHCI;
+	hcor = (struct ehci_hcor *)((uint32_t)hccr +
+			HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
+
+	return 0;
+}
+
+int ehci_hcd_stop(void)
+{
+	at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
+
+	/* Disable USB Host Clock */
+	writel(1 << ATMEL_ID_UHPHS, &pmc->pcdr);
+
+	/* Disable UPLL */
+	writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr);
+	while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
+		;
+
+	return 0;
+}