[U-Boot] [PATCH] USB OHCI support for at91sam9g45 SoC
Remy Bohmer
linux at bohmer.net
Tue Jun 15 22:12:13 CEST 2010
Hi,
2010/6/9 Sergey Matyukevich <geomatsi at gmail.com>:
> Add USB OHCI support for at91sam9g45ekes/at91sam9m10g45ek boards.
>
> Note that according to errata from Atmel, OHCI is not operational
> on the first revision of at91sam9g45 chip. So this patch enables
> OHCI support for later revisions.
>
> Signed-off-by: Sergey Matyukevich <geomatsi at gmail.com>
Applied to u-boot-usb (after a small coding style fix)
Thanks.
Kind regards,
Remy
> ---
> arch/arm/include/asm/arch-at91/at91_pmc.h | 14 ++++++++++++--
> board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c | 13 +++++++++++++
> drivers/usb/host/ohci-at91.c | 13 +++++++++++++
> 3 files changed, 38 insertions(+), 2 deletions(-)
>
> diff --git a/arch/arm/include/asm/arch-at91/at91_pmc.h b/arch/arm/include/asm/arch-at91/at91_pmc.h
> index 5b1a85d..2f9ad96 100644
> --- a/arch/arm/include/asm/arch-at91/at91_pmc.h
> +++ b/arch/arm/include/asm/arch-at91/at91_pmc.h
> @@ -35,13 +35,15 @@ typedef struct at91_pmc {
> u32 pcer; /* 0x10 Peripheral Clock Enable Register */
> u32 pcdr; /* 0x14 Peripheral Clock Disable Register */
> u32 pcsr; /* 0x18 Peripheral Clock Status Register */
> - u32 reserved1;
> + u32 uckr; /* 0x1C UTMI Clock Register */
> u32 mor; /* 0x20 Main Oscilator Register */
> u32 mcfr; /* 0x24 Main Clock Frequency Register */
> u32 pllar; /* 0x28 PLL A Register */
> u32 pllbr; /* 0x2C PLL B Register */
> u32 mckr; /* 0x30 Master Clock Register */
> - u32 reserved2[3];
> + u32 reserved1;
> + u32 usb; /* 0x38 USB Clock Register */
> + u32 reserved2;
> u32 pck[4]; /* 0x40 Programmable Clock Register 0 - 3 */
> u32 reserved3[4];
> u32 ier; /* 0x60 Interrupt Enable Register */
> @@ -199,6 +201,14 @@ typedef struct at91_pmc {
> #define AT91_PMC_PDIV_2 (1 << 12)
>
> #ifdef CONFIG_AT91_LEGACY
> +#define AT91_PMC_USB (AT91_PMC + 0x38) /* USB Clock Register */
> +#endif
> +#define AT91_PMC_USBS_USB_PLLA (0x0) /* USB Clock Input is PLLA */
> +#define AT91_PMC_USBS_USB_UPLL (0x1) /* USB Clock Input is UPLL */
> +#define AT91_PMC_USBDIV_8 (0x7 << 8) /* USB Clock divided by 8 */
> +#define AT91_PMC_USBDIV_10 (0x9 << 8) /* USB Clock divided by 10 */
> +
> +#ifdef CONFIG_AT91_LEGACY
> #define AT91_PMC_PCKR(n) (AT91_PMC + 0x40 + ((n) * 4)) /* Programmable Clock 0-3 Registers */
>
> #define AT91_PMC_IER (AT91_PMC + 0x60) /* Interrupt Enable Register */
> diff --git a/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c b/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
> index edfb627..8fa0449 100644
> --- a/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
> +++ b/board/atmel/at91sam9m10g45ek/at91sam9m10g45ek.c
> @@ -87,6 +87,16 @@ static void at91sam9m10g45ek_nand_hw_init(void)
> }
> #endif
>
> +#ifdef CONFIG_CMD_USB
> +static void at91sam9m10g45ek_usb_hw_init(void)
> +{
> + at91_sys_write(AT91_PMC_PCER, 1 << AT91SAM9G45_ID_PIODE);
> +
> + at91_set_gpio_output(AT91_PIN_PD1, 0);
> + at91_set_gpio_output(AT91_PIN_PD3, 0);
> +}
> +#endif
> +
> #ifdef CONFIG_MACB
> static void at91sam9m10g45ek_macb_hw_init(void)
> {
> @@ -251,6 +261,9 @@ int board_init(void)
> #ifdef CONFIG_CMD_NAND
> at91sam9m10g45ek_nand_hw_init();
> #endif
> +#ifdef CONFIG_CMD_USB
> + at91sam9m10g45ek_usb_hw_init();
> +#endif
> #ifdef CONFIG_HAS_DATAFLASH
> at91_spi0_hw_init(1 << 0);
> #endif
> diff --git a/drivers/usb/host/ohci-at91.c b/drivers/usb/host/ohci-at91.c
> index b2e03bc..f791df7 100644
> --- a/drivers/usb/host/ohci-at91.c
> +++ b/drivers/usb/host/ohci-at91.c
> @@ -41,6 +41,14 @@ int usb_cpu_init(void)
> writel(get_pllb_init(), &pmc->pllbr);
> while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB)
> ;
> +#elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
> + /* Enable UPLL */
> + writel(readl(&pmc->uckr) | AT91_PMC_UPLLEN | AT91_PMC_BIASEN, &pmc->uckr);
> + while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU)
> + ;
> +
> + /* Select PLLA as input clock of OHCI */
> + writel(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10, &pmc->usb);
> #endif
>
> /* Enable USB host clock. */
> @@ -72,6 +80,11 @@ int usb_cpu_stop(void)
> writel(0, &pmc->pllbr);
> while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0)
> ;
> +#elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45)
> + /* Disable UPLL */
> + writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr);
> + while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
> + ;
> #endif
>
> return 0;
> --
> 1.6.2.5
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
>
More information about the U-Boot
mailing list