ohci-at91.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. /*
  2. * (C) Copyright 2006
  3. * DENX Software Engineering <mk@denx.de>
  4. *
  5. * SPDX-License-Identifier: GPL-2.0+
  6. */
  7. #include <common.h>
  8. #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT)
  9. #include <asm/io.h>
  10. #include <asm/arch/hardware.h>
  11. #include <asm/arch/at91_pmc.h>
  12. #include <asm/arch/clk.h>
  13. int usb_cpu_init(void)
  14. {
  15. at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
  16. #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB
  17. /* Enable PLLB */
  18. writel(get_pllb_init(), &pmc->pllbr);
  19. while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB)
  20. ;
  21. #ifdef CONFIG_AT91SAM9N12
  22. writel(AT91_PMC_USBS_USB_PLLB | AT91_PMC_USB_DIV_2, &pmc->usb);
  23. #endif
  24. #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL)
  25. /* Enable UPLL */
  26. writel(readl(&pmc->uckr) | AT91_PMC_UPLLEN | AT91_PMC_BIASEN,
  27. &pmc->uckr);
  28. while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU)
  29. ;
  30. /* Select PLLA as input clock of OHCI */
  31. writel(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10, &pmc->usb);
  32. #endif
  33. /* Enable USB host clock. */
  34. #ifdef CONFIG_SAMA5D3
  35. writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcer1);
  36. #else
  37. writel(1 << ATMEL_ID_UHP, &pmc->pcer);
  38. #endif
  39. #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
  40. writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scer);
  41. #else
  42. writel(ATMEL_PMC_UHP, &pmc->scer);
  43. #endif
  44. return 0;
  45. }
  46. int usb_cpu_stop(void)
  47. {
  48. at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC;
  49. /* Disable USB host clock. */
  50. #ifdef CONFIG_SAMA5D3
  51. writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcdr1);
  52. #else
  53. writel(1 << ATMEL_ID_UHP, &pmc->pcdr);
  54. #endif
  55. #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10)
  56. writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scdr);
  57. #else
  58. writel(ATMEL_PMC_UHP, &pmc->scdr);
  59. #endif
  60. #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB
  61. #ifdef CONFIG_AT91SAM9N12
  62. writel(0, &pmc->usb);
  63. #endif
  64. /* Disable PLLB */
  65. writel(0, &pmc->pllbr);
  66. while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0)
  67. ;
  68. #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL)
  69. /* Disable UPLL */
  70. writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr);
  71. while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU)
  72. ;
  73. #endif
  74. return 0;
  75. }
  76. int usb_cpu_init_fail(void)
  77. {
  78. return usb_cpu_stop();
  79. }
  80. #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) */