Commit a408e8f423e91a50727e7e85461cf7677d25ebf6

Authored by Alexandre Pereira da Silva
Committed by Roland Stigge
1 parent a0a30b6a69

ARM: LPC32xx: Cleanup USB clock init

Move most of usb clock initialization from lpc32xx_udc and ohci-nxp to
clock.c. Also adds ohci clocks and otg clocks.

Signed-off-by: Alexandre Pereira da Silva <aletes.xgr@gmail.com>
Signed-off-by: Roland Stigge <stigge@antcom.de>

Showing 2 changed files with 81 additions and 1 deletions Side-by-side Diff

arch/arm/mach-lpc32xx/clock.c
... ... @@ -739,14 +739,77 @@
739 739 .get_rate = local_return_parent_rate,
740 740 };
741 741  
  742 +static int local_usb_enable(struct clk *clk, int enable)
  743 +{
  744 + u32 tmp;
  745 +
  746 + if (enable) {
  747 + /* Set up I2C pull levels */
  748 + tmp = __raw_readl(LPC32XX_CLKPWR_I2C_CLK_CTRL);
  749 + tmp |= LPC32XX_CLKPWR_I2CCLK_USBI2CHI_DRIVE;
  750 + __raw_writel(tmp, LPC32XX_CLKPWR_I2C_CLK_CTRL);
  751 + }
  752 +
  753 + return local_onoff_enable(clk, enable);
  754 +}
  755 +
742 756 static struct clk clk_usbd = {
743 757 .parent = &clk_usbpll,
744   - .enable = local_onoff_enable,
  758 + .enable = local_usb_enable,
745 759 .enable_reg = LPC32XX_CLKPWR_USB_CTRL,
746 760 .enable_mask = LPC32XX_CLKPWR_USBCTRL_HCLK_EN,
747 761 .get_rate = local_return_parent_rate,
748 762 };
749 763  
  764 +#define OTG_ALWAYS_MASK (LPC32XX_USB_OTG_OTG_CLOCK_ON | \
  765 + LPC32XX_USB_OTG_I2C_CLOCK_ON)
  766 +
  767 +static int local_usb_otg_enable(struct clk *clk, int enable)
  768 +{
  769 + int to = 1000;
  770 +
  771 + if (enable) {
  772 + __raw_writel(clk->enable_mask, clk->enable_reg);
  773 +
  774 + while (((__raw_readl(LPC32XX_USB_OTG_CLK_STAT) &
  775 + clk->enable_mask) != clk->enable_mask) && (to > 0))
  776 + to--;
  777 + } else {
  778 + __raw_writel(OTG_ALWAYS_MASK, clk->enable_reg);
  779 +
  780 + while (((__raw_readl(LPC32XX_USB_OTG_CLK_STAT) &
  781 + OTG_ALWAYS_MASK) != OTG_ALWAYS_MASK) && (to > 0))
  782 + to--;
  783 + }
  784 +
  785 + if (to)
  786 + return 0;
  787 + else
  788 + return -1;
  789 +}
  790 +
  791 +static struct clk clk_usb_otg_dev = {
  792 + .parent = &clk_usbpll,
  793 + .enable = local_usb_otg_enable,
  794 + .enable_reg = LPC32XX_USB_OTG_CLK_CTRL,
  795 + .enable_mask = LPC32XX_USB_OTG_AHB_M_CLOCK_ON |
  796 + LPC32XX_USB_OTG_OTG_CLOCK_ON |
  797 + LPC32XX_USB_OTG_DEV_CLOCK_ON |
  798 + LPC32XX_USB_OTG_I2C_CLOCK_ON,
  799 + .get_rate = local_return_parent_rate,
  800 +};
  801 +
  802 +static struct clk clk_usb_otg_host = {
  803 + .parent = &clk_usbpll,
  804 + .enable = local_usb_otg_enable,
  805 + .enable_reg = LPC32XX_USB_OTG_CLK_CTRL,
  806 + .enable_mask = LPC32XX_USB_OTG_AHB_M_CLOCK_ON |
  807 + LPC32XX_USB_OTG_OTG_CLOCK_ON |
  808 + LPC32XX_USB_OTG_HOST_CLOCK_ON |
  809 + LPC32XX_USB_OTG_I2C_CLOCK_ON,
  810 + .get_rate = local_return_parent_rate,
  811 +};
  812 +
750 813 static int tsc_onoff_enable(struct clk *clk, int enable)
751 814 {
752 815 u32 tmp;
... ... @@ -1145,6 +1208,9 @@
1145 1208 CLKDEV_INIT("31060000.ethernet", NULL, &clk_net),
1146 1209 CLKDEV_INIT("dev:clcd", NULL, &clk_lcd),
1147 1210 CLKDEV_INIT("31020000.usbd", "ck_usbd", &clk_usbd),
  1211 + CLKDEV_INIT("31020000.ohci", "ck_usbd", &clk_usbd),
  1212 + CLKDEV_INIT("31020000.usbd", "ck_usb_otg", &clk_usb_otg_dev),
  1213 + CLKDEV_INIT("31020000.ohci", "ck_usb_otg", &clk_usb_otg_host),
1148 1214 CLKDEV_INIT("lpc32xx_rtc", NULL, &clk_rtc),
1149 1215 };
1150 1216  
arch/arm/mach-lpc32xx/include/mach/platform.h
... ... @@ -694,5 +694,19 @@
694 694 #define LPC32XX_GPIO_P2_MUX_CLR _GPREG(0x02C)
695 695 #define LPC32XX_GPIO_P2_MUX_STATE _GPREG(0x030)
696 696  
  697 +/*
  698 + * USB Otg Registers
  699 + */
  700 +#define _OTGREG(x) io_p2v(LPC32XX_USB_OTG_BASE + (x))
  701 +#define LPC32XX_USB_OTG_CLK_CTRL _OTGREG(0xFF4)
  702 +#define LPC32XX_USB_OTG_CLK_STAT _OTGREG(0xFF8)
  703 +
  704 +/* USB OTG CLK CTRL bit defines */
  705 +#define LPC32XX_USB_OTG_AHB_M_CLOCK_ON _BIT(4)
  706 +#define LPC32XX_USB_OTG_OTG_CLOCK_ON _BIT(3)
  707 +#define LPC32XX_USB_OTG_I2C_CLOCK_ON _BIT(2)
  708 +#define LPC32XX_USB_OTG_DEV_CLOCK_ON _BIT(1)
  709 +#define LPC32XX_USB_OTG_HOST_CLOCK_ON _BIT(0)
  710 +
697 711 #endif