diff options
author | Arnd Bergmann <arnd@arndb.de> | 2012-03-15 10:48:42 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-03-15 10:48:42 -0400 |
commit | f66f9bdf6d2c2b540f73bb57bd24b886b39beb14 (patch) | |
tree | 03d52df19bd6b7b2c424ed5d94590fcde666ab28 | |
parent | f6175f228cc8dab421e762158ad40f5614b18941 (diff) | |
parent | 36225decb417a20abcb0b2c24cdbcb6f1d608f83 (diff) |
Merge branch 'lpc32xx/drivers' into next/drivers
-rw-r--r-- | arch/arm/configs/lpc32xx_defconfig | 145 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/Kconfig | 25 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/clock.c | 149 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/common.c | 47 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/common.h | 6 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/include/mach/board.h | 24 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/include/mach/platform.h | 51 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/irq.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/phy3250.c | 5 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/pm.c | 2 | ||||
-rw-r--r-- | arch/arm/mach-lpc32xx/timer.c | 48 |
11 files changed, 389 insertions, 117 deletions
diff --git a/arch/arm/configs/lpc32xx_defconfig b/arch/arm/configs/lpc32xx_defconfig new file mode 100644 index 000000000000..fb2088171ca9 --- /dev/null +++ b/arch/arm/configs/lpc32xx_defconfig | |||
@@ -0,0 +1,145 @@ | |||
1 | CONFIG_EXPERIMENTAL=y | ||
2 | CONFIG_SYSVIPC=y | ||
3 | CONFIG_IKCONFIG=y | ||
4 | CONFIG_IKCONFIG_PROC=y | ||
5 | CONFIG_LOG_BUF_SHIFT=14 | ||
6 | CONFIG_SYSFS_DEPRECATED=y | ||
7 | CONFIG_SYSFS_DEPRECATED_V2=y | ||
8 | CONFIG_BLK_DEV_INITRD=y | ||
9 | CONFIG_CC_OPTIMIZE_FOR_SIZE=y | ||
10 | CONFIG_SYSCTL_SYSCALL=y | ||
11 | CONFIG_EMBEDDED=y | ||
12 | CONFIG_SLAB=y | ||
13 | CONFIG_MODULES=y | ||
14 | CONFIG_MODULE_UNLOAD=y | ||
15 | # CONFIG_BLK_DEV_BSG is not set | ||
16 | CONFIG_PARTITION_ADVANCED=y | ||
17 | CONFIG_ARCH_LPC32XX=y | ||
18 | CONFIG_NO_HZ=y | ||
19 | CONFIG_HIGH_RES_TIMERS=y | ||
20 | CONFIG_PREEMPT=y | ||
21 | CONFIG_AEABI=y | ||
22 | CONFIG_ZBOOT_ROM_TEXT=0x0 | ||
23 | CONFIG_ZBOOT_ROM_BSS=0x0 | ||
24 | CONFIG_CMDLINE="console=ttyS0,115200n81 root=/dev/ram0" | ||
25 | CONFIG_CPU_IDLE=y | ||
26 | CONFIG_FPE_NWFPE=y | ||
27 | CONFIG_VFP=y | ||
28 | # CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set | ||
29 | CONFIG_BINFMT_AOUT=y | ||
30 | CONFIG_NET=y | ||
31 | CONFIG_PACKET=y | ||
32 | CONFIG_UNIX=y | ||
33 | CONFIG_INET=y | ||
34 | CONFIG_IP_MULTICAST=y | ||
35 | CONFIG_IP_PNP=y | ||
36 | CONFIG_IP_PNP_DHCP=y | ||
37 | CONFIG_IP_PNP_BOOTP=y | ||
38 | # CONFIG_INET_XFRM_MODE_TRANSPORT is not set | ||
39 | # CONFIG_INET_XFRM_MODE_TUNNEL is not set | ||
40 | # CONFIG_INET_XFRM_MODE_BEET is not set | ||
41 | # CONFIG_INET_LRO is not set | ||
42 | # CONFIG_INET_DIAG is not set | ||
43 | # CONFIG_IPV6 is not set | ||
44 | # CONFIG_WIRELESS is not set | ||
45 | CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug" | ||
46 | # CONFIG_FW_LOADER is not set | ||
47 | CONFIG_MTD=y | ||
48 | CONFIG_MTD_CMDLINE_PARTS=y | ||
49 | CONFIG_MTD_CHAR=y | ||
50 | CONFIG_MTD_BLOCK=y | ||
51 | CONFIG_MTD_NAND=y | ||
52 | CONFIG_MTD_NAND_MUSEUM_IDS=y | ||
53 | CONFIG_BLK_DEV_LOOP=y | ||
54 | CONFIG_BLK_DEV_CRYPTOLOOP=y | ||
55 | CONFIG_BLK_DEV_RAM=y | ||
56 | CONFIG_BLK_DEV_RAM_COUNT=1 | ||
57 | CONFIG_BLK_DEV_RAM_SIZE=16384 | ||
58 | CONFIG_MISC_DEVICES=y | ||
59 | CONFIG_EEPROM_AT25=y | ||
60 | CONFIG_SCSI=y | ||
61 | CONFIG_BLK_DEV_SD=y | ||
62 | CONFIG_NETDEVICES=y | ||
63 | CONFIG_MII=y | ||
64 | CONFIG_PHYLIB=y | ||
65 | CONFIG_SMSC_PHY=y | ||
66 | # CONFIG_WLAN is not set | ||
67 | # CONFIG_INPUT_MOUSEDEV_PSAUX is not set | ||
68 | CONFIG_INPUT_MOUSEDEV_SCREEN_X=240 | ||
69 | CONFIG_INPUT_MOUSEDEV_SCREEN_Y=320 | ||
70 | CONFIG_INPUT_EVDEV=y | ||
71 | # CONFIG_INPUT_MOUSE is not set | ||
72 | CONFIG_INPUT_TOUCHSCREEN=y | ||
73 | CONFIG_TOUCHSCREEN_LPC32XX=y | ||
74 | # CONFIG_LEGACY_PTYS is not set | ||
75 | CONFIG_SERIAL_8250=y | ||
76 | CONFIG_SERIAL_8250_CONSOLE=y | ||
77 | # CONFIG_HW_RANDOM is not set | ||
78 | CONFIG_I2C=y | ||
79 | CONFIG_I2C_CHARDEV=y | ||
80 | CONFIG_I2C_PNX=y | ||
81 | CONFIG_SPI=y | ||
82 | CONFIG_SPI_PL022=y | ||
83 | CONFIG_GPIO_SYSFS=y | ||
84 | # CONFIG_HWMON is not set | ||
85 | CONFIG_WATCHDOG=y | ||
86 | CONFIG_PNX4008_WATCHDOG=y | ||
87 | CONFIG_FB=y | ||
88 | CONFIG_FB_ARMCLCD=y | ||
89 | CONFIG_FRAMEBUFFER_CONSOLE=y | ||
90 | CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y | ||
91 | CONFIG_LOGO=y | ||
92 | # CONFIG_LOGO_LINUX_MONO is not set | ||
93 | # CONFIG_LOGO_LINUX_VGA16 is not set | ||
94 | CONFIG_SOUND=y | ||
95 | CONFIG_SND=y | ||
96 | CONFIG_SND_SEQUENCER=y | ||
97 | CONFIG_SND_MIXER_OSS=y | ||
98 | CONFIG_SND_PCM_OSS=y | ||
99 | CONFIG_SND_SEQUENCER_OSS=y | ||
100 | CONFIG_SND_DYNAMIC_MINORS=y | ||
101 | # CONFIG_SND_VERBOSE_PROCFS is not set | ||
102 | # CONFIG_SND_DRIVERS is not set | ||
103 | # CONFIG_SND_ARM is not set | ||
104 | # CONFIG_SND_SPI is not set | ||
105 | CONFIG_SND_SOC=y | ||
106 | # CONFIG_HID_SUPPORT is not set | ||
107 | CONFIG_USB=y | ||
108 | CONFIG_USB_STORAGE=y | ||
109 | CONFIG_USB_LIBUSUAL=y | ||
110 | CONFIG_MMC=y | ||
111 | # CONFIG_MMC_BLOCK_BOUNCE is not set | ||
112 | CONFIG_MMC_ARMMMCI=y | ||
113 | CONFIG_NEW_LEDS=y | ||
114 | CONFIG_LEDS_CLASS=y | ||
115 | CONFIG_LEDS_GPIO=y | ||
116 | CONFIG_LEDS_TRIGGERS=y | ||
117 | CONFIG_LEDS_TRIGGER_HEARTBEAT=y | ||
118 | CONFIG_RTC_CLASS=y | ||
119 | CONFIG_RTC_INTF_DEV_UIE_EMUL=y | ||
120 | CONFIG_RTC_DRV_LPC32XX=y | ||
121 | CONFIG_EXT2_FS=y | ||
122 | CONFIG_AUTOFS4_FS=y | ||
123 | CONFIG_MSDOS_FS=y | ||
124 | CONFIG_VFAT_FS=y | ||
125 | CONFIG_TMPFS=y | ||
126 | CONFIG_JFFS2_FS=y | ||
127 | CONFIG_JFFS2_FS_WBUF_VERIFY=y | ||
128 | CONFIG_CRAMFS=y | ||
129 | CONFIG_NFS_FS=y | ||
130 | CONFIG_NFS_V3=y | ||
131 | CONFIG_ROOT_NFS=y | ||
132 | CONFIG_NLS_CODEPAGE_437=y | ||
133 | CONFIG_NLS_ASCII=y | ||
134 | CONFIG_NLS_ISO8859_1=y | ||
135 | CONFIG_NLS_UTF8=y | ||
136 | # CONFIG_SCHED_DEBUG is not set | ||
137 | # CONFIG_DEBUG_PREEMPT is not set | ||
138 | CONFIG_DEBUG_INFO=y | ||
139 | # CONFIG_FTRACE is not set | ||
140 | # CONFIG_ARM_UNWIND is not set | ||
141 | CONFIG_DEBUG_LL=y | ||
142 | CONFIG_EARLY_PRINTK=y | ||
143 | CONFIG_CRYPTO_ANSI_CPRNG=y | ||
144 | # CONFIG_CRYPTO_HW is not set | ||
145 | CONFIG_CRC_CCITT=y | ||
diff --git a/arch/arm/mach-lpc32xx/Kconfig b/arch/arm/mach-lpc32xx/Kconfig index fde663508696..75946ac89ee9 100644 --- a/arch/arm/mach-lpc32xx/Kconfig +++ b/arch/arm/mach-lpc32xx/Kconfig | |||
@@ -29,5 +29,30 @@ config ARCH_LPC32XX_UART6_SELECT | |||
29 | 29 | ||
30 | endmenu | 30 | endmenu |
31 | 31 | ||
32 | menu "LPC32XX chip components" | ||
33 | |||
34 | config ARCH_LPC32XX_IRAM_FOR_NET | ||
35 | bool "Use IRAM for network buffers" | ||
36 | default y | ||
37 | help | ||
38 | Say Y here to use the LPC internal fast IRAM (i.e. 256KB SRAM) as | ||
39 | network buffer. If the total combined required buffer sizes is | ||
40 | larger than the size of IRAM, then SDRAM will be used instead. | ||
41 | |||
42 | This can be enabled safely if the IRAM is not intended for other | ||
43 | uses. | ||
44 | |||
45 | config ARCH_LPC32XX_MII_SUPPORT | ||
46 | bool "Check to enable MII support or leave disabled for RMII support" | ||
47 | help | ||
48 | Say Y here to enable MII support, or N for RMII support. Regardless of | ||
49 | which support is selected, the ethernet interface driver needs to be | ||
50 | selected in the device driver networking section. | ||
51 | |||
52 | The PHY3250 reference board uses RMII, so users of this board should | ||
53 | say N. | ||
54 | |||
55 | endmenu | ||
56 | |||
32 | endif | 57 | endif |
33 | 58 | ||
diff --git a/arch/arm/mach-lpc32xx/clock.c b/arch/arm/mach-lpc32xx/clock.c index 473015ac07bd..47639f31ba38 100644 --- a/arch/arm/mach-lpc32xx/clock.c +++ b/arch/arm/mach-lpc32xx/clock.c | |||
@@ -82,10 +82,12 @@ | |||
82 | * will also impact the individual peripheral rates. | 82 | * will also impact the individual peripheral rates. |
83 | */ | 83 | */ |
84 | 84 | ||
85 | #include <linux/export.h> | ||
85 | #include <linux/kernel.h> | 86 | #include <linux/kernel.h> |
86 | #include <linux/list.h> | 87 | #include <linux/list.h> |
87 | #include <linux/errno.h> | 88 | #include <linux/errno.h> |
88 | #include <linux/device.h> | 89 | #include <linux/device.h> |
90 | #include <linux/delay.h> | ||
89 | #include <linux/err.h> | 91 | #include <linux/err.h> |
90 | #include <linux/clk.h> | 92 | #include <linux/clk.h> |
91 | #include <linux/amba/bus.h> | 93 | #include <linux/amba/bus.h> |
@@ -97,9 +99,12 @@ | |||
97 | #include "clock.h" | 99 | #include "clock.h" |
98 | #include "common.h" | 100 | #include "common.h" |
99 | 101 | ||
102 | static DEFINE_SPINLOCK(global_clkregs_lock); | ||
103 | |||
104 | static int usb_pll_enable, usb_pll_valid; | ||
105 | |||
100 | static struct clk clk_armpll; | 106 | static struct clk clk_armpll; |
101 | static struct clk clk_usbpll; | 107 | static struct clk clk_usbpll; |
102 | static DEFINE_MUTEX(clkm_lock); | ||
103 | 108 | ||
104 | /* | 109 | /* |
105 | * Post divider values for PLLs based on selected register value | 110 | * Post divider values for PLLs based on selected register value |
@@ -127,7 +132,7 @@ static struct clk osc_32KHz = { | |||
127 | static int local_pll397_enable(struct clk *clk, int enable) | 132 | static int local_pll397_enable(struct clk *clk, int enable) |
128 | { | 133 | { |
129 | u32 reg; | 134 | u32 reg; |
130 | unsigned long timeout = 1 + msecs_to_jiffies(10); | 135 | unsigned long timeout = jiffies + msecs_to_jiffies(10); |
131 | 136 | ||
132 | reg = __raw_readl(LPC32XX_CLKPWR_PLL397_CTRL); | 137 | reg = __raw_readl(LPC32XX_CLKPWR_PLL397_CTRL); |
133 | 138 | ||
@@ -142,7 +147,7 @@ static int local_pll397_enable(struct clk *clk, int enable) | |||
142 | /* Wait for PLL397 lock */ | 147 | /* Wait for PLL397 lock */ |
143 | while (((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) & | 148 | while (((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) & |
144 | LPC32XX_CLKPWR_SYSCTRL_PLL397_STS) == 0) && | 149 | LPC32XX_CLKPWR_SYSCTRL_PLL397_STS) == 0) && |
145 | (timeout > jiffies)) | 150 | time_before(jiffies, timeout)) |
146 | cpu_relax(); | 151 | cpu_relax(); |
147 | 152 | ||
148 | if ((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) & | 153 | if ((__raw_readl(LPC32XX_CLKPWR_PLL397_CTRL) & |
@@ -156,7 +161,7 @@ static int local_pll397_enable(struct clk *clk, int enable) | |||
156 | static int local_oscmain_enable(struct clk *clk, int enable) | 161 | static int local_oscmain_enable(struct clk *clk, int enable) |
157 | { | 162 | { |
158 | u32 reg; | 163 | u32 reg; |
159 | unsigned long timeout = 1 + msecs_to_jiffies(10); | 164 | unsigned long timeout = jiffies + msecs_to_jiffies(10); |
160 | 165 | ||
161 | reg = __raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL); | 166 | reg = __raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL); |
162 | 167 | ||
@@ -171,7 +176,7 @@ static int local_oscmain_enable(struct clk *clk, int enable) | |||
171 | /* Wait for main oscillator to start */ | 176 | /* Wait for main oscillator to start */ |
172 | while (((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) & | 177 | while (((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) & |
173 | LPC32XX_CLKPWR_MOSC_DISABLE) != 0) && | 178 | LPC32XX_CLKPWR_MOSC_DISABLE) != 0) && |
174 | (timeout > jiffies)) | 179 | time_before(jiffies, timeout)) |
175 | cpu_relax(); | 180 | cpu_relax(); |
176 | 181 | ||
177 | if ((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) & | 182 | if ((__raw_readl(LPC32XX_CLKPWR_MAIN_OSC_CTRL) & |
@@ -382,30 +387,62 @@ static u32 local_clk_usbpll_setup(struct clk_pll_setup *pHCLKPllSetup) | |||
382 | static int local_usbpll_enable(struct clk *clk, int enable) | 387 | static int local_usbpll_enable(struct clk *clk, int enable) |
383 | { | 388 | { |
384 | u32 reg; | 389 | u32 reg; |
385 | int ret = -ENODEV; | 390 | int ret = 0; |
386 | unsigned long timeout = 1 + msecs_to_jiffies(10); | 391 | unsigned long timeout = jiffies + msecs_to_jiffies(20); |
387 | 392 | ||
388 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); | 393 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); |
389 | 394 | ||
390 | if (enable == 0) { | 395 | __raw_writel(reg & ~(LPC32XX_CLKPWR_USBCTRL_CLK_EN2 | |
391 | reg &= ~(LPC32XX_CLKPWR_USBCTRL_CLK_EN1 | | 396 | LPC32XX_CLKPWR_USBCTRL_PLL_PWRUP), |
392 | LPC32XX_CLKPWR_USBCTRL_CLK_EN2); | 397 | LPC32XX_CLKPWR_USB_CTRL); |
393 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | 398 | __raw_writel(reg & ~LPC32XX_CLKPWR_USBCTRL_CLK_EN1, |
394 | } else if (reg & LPC32XX_CLKPWR_USBCTRL_PLL_PWRUP) { | 399 | LPC32XX_CLKPWR_USB_CTRL); |
400 | |||
401 | if (enable && usb_pll_valid && usb_pll_enable) { | ||
402 | ret = -ENODEV; | ||
403 | /* | ||
404 | * If the PLL rate has been previously set, then the rate | ||
405 | * in the PLL register is valid and can be enabled here. | ||
406 | * Otherwise, it needs to be enabled as part of setrate. | ||
407 | */ | ||
408 | |||
409 | /* | ||
410 | * Gate clock into PLL | ||
411 | */ | ||
395 | reg |= LPC32XX_CLKPWR_USBCTRL_CLK_EN1; | 412 | reg |= LPC32XX_CLKPWR_USBCTRL_CLK_EN1; |
396 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | 413 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); |
397 | 414 | ||
398 | /* Wait for PLL lock */ | 415 | /* |
399 | while ((timeout > jiffies) & (ret == -ENODEV)) { | 416 | * Enable PLL |
417 | */ | ||
418 | reg |= LPC32XX_CLKPWR_USBCTRL_PLL_PWRUP; | ||
419 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | ||
420 | |||
421 | /* | ||
422 | * Wait for PLL to lock | ||
423 | */ | ||
424 | while (time_before(jiffies, timeout) && (ret == -ENODEV)) { | ||
400 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); | 425 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); |
401 | if (reg & LPC32XX_CLKPWR_USBCTRL_PLL_STS) | 426 | if (reg & LPC32XX_CLKPWR_USBCTRL_PLL_STS) |
402 | ret = 0; | 427 | ret = 0; |
428 | else | ||
429 | udelay(10); | ||
403 | } | 430 | } |
404 | 431 | ||
432 | /* | ||
433 | * Gate clock from PLL if PLL is locked | ||
434 | */ | ||
405 | if (ret == 0) { | 435 | if (ret == 0) { |
406 | reg |= LPC32XX_CLKPWR_USBCTRL_CLK_EN2; | 436 | __raw_writel(reg | LPC32XX_CLKPWR_USBCTRL_CLK_EN2, |
407 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | 437 | LPC32XX_CLKPWR_USB_CTRL); |
438 | } else { | ||
439 | __raw_writel(reg & ~(LPC32XX_CLKPWR_USBCTRL_CLK_EN1 | | ||
440 | LPC32XX_CLKPWR_USBCTRL_PLL_PWRUP), | ||
441 | LPC32XX_CLKPWR_USB_CTRL); | ||
408 | } | 442 | } |
443 | } else if ((enable == 0) && usb_pll_valid && usb_pll_enable) { | ||
444 | usb_pll_valid = 0; | ||
445 | usb_pll_enable = 0; | ||
409 | } | 446 | } |
410 | 447 | ||
411 | return ret; | 448 | return ret; |
@@ -423,7 +460,7 @@ static unsigned long local_usbpll_round_rate(struct clk *clk, | |||
423 | */ | 460 | */ |
424 | rate = rate * 1000; | 461 | rate = rate * 1000; |
425 | 462 | ||
426 | clkin = clk->parent->rate; | 463 | clkin = clk->get_rate(clk); |
427 | usbdiv = (__raw_readl(LPC32XX_CLKPWR_USBCLK_PDIV) & | 464 | usbdiv = (__raw_readl(LPC32XX_CLKPWR_USBCLK_PDIV) & |
428 | LPC32XX_CLKPWR_USBPDIV_PLL_MASK) + 1; | 465 | LPC32XX_CLKPWR_USBPDIV_PLL_MASK) + 1; |
429 | clkin = clkin / usbdiv; | 466 | clkin = clkin / usbdiv; |
@@ -437,7 +474,8 @@ static unsigned long local_usbpll_round_rate(struct clk *clk, | |||
437 | 474 | ||
438 | static int local_usbpll_set_rate(struct clk *clk, unsigned long rate) | 475 | static int local_usbpll_set_rate(struct clk *clk, unsigned long rate) |
439 | { | 476 | { |
440 | u32 clkin, reg, usbdiv; | 477 | int ret = -ENODEV; |
478 | u32 clkin, usbdiv; | ||
441 | struct clk_pll_setup pllsetup; | 479 | struct clk_pll_setup pllsetup; |
442 | 480 | ||
443 | /* | 481 | /* |
@@ -446,7 +484,7 @@ static int local_usbpll_set_rate(struct clk *clk, unsigned long rate) | |||
446 | */ | 484 | */ |
447 | rate = rate * 1000; | 485 | rate = rate * 1000; |
448 | 486 | ||
449 | clkin = clk->get_rate(clk); | 487 | clkin = clk->get_rate(clk->parent); |
450 | usbdiv = (__raw_readl(LPC32XX_CLKPWR_USBCLK_PDIV) & | 488 | usbdiv = (__raw_readl(LPC32XX_CLKPWR_USBCLK_PDIV) & |
451 | LPC32XX_CLKPWR_USBPDIV_PLL_MASK) + 1; | 489 | LPC32XX_CLKPWR_USBPDIV_PLL_MASK) + 1; |
452 | clkin = clkin / usbdiv; | 490 | clkin = clkin / usbdiv; |
@@ -455,22 +493,25 @@ static int local_usbpll_set_rate(struct clk *clk, unsigned long rate) | |||
455 | if (local_clk_find_pll_cfg(clkin, rate, &pllsetup) == 0) | 493 | if (local_clk_find_pll_cfg(clkin, rate, &pllsetup) == 0) |
456 | return -EINVAL; | 494 | return -EINVAL; |
457 | 495 | ||
496 | /* | ||
497 | * Disable PLL clocks during PLL change | ||
498 | */ | ||
458 | local_usbpll_enable(clk, 0); | 499 | local_usbpll_enable(clk, 0); |
459 | 500 | pllsetup.analog_on = 0; | |
460 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); | ||
461 | reg |= LPC32XX_CLKPWR_USBCTRL_CLK_EN1; | ||
462 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | ||
463 | |||
464 | pllsetup.analog_on = 1; | ||
465 | local_clk_usbpll_setup(&pllsetup); | 501 | local_clk_usbpll_setup(&pllsetup); |
466 | 502 | ||
467 | clk->rate = clk_check_pll_setup(clkin, &pllsetup); | 503 | /* |
504 | * Start USB PLL and check PLL status | ||
505 | */ | ||
468 | 506 | ||
469 | reg = __raw_readl(LPC32XX_CLKPWR_USB_CTRL); | 507 | usb_pll_valid = 1; |
470 | reg |= LPC32XX_CLKPWR_USBCTRL_CLK_EN2; | 508 | usb_pll_enable = 1; |
471 | __raw_writel(reg, LPC32XX_CLKPWR_USB_CTRL); | ||
472 | 509 | ||
473 | return 0; | 510 | ret = local_usbpll_enable(clk, 1); |
511 | if (ret >= 0) | ||
512 | clk->rate = clk_check_pll_setup(clkin, &pllsetup); | ||
513 | |||
514 | return ret; | ||
474 | } | 515 | } |
475 | 516 | ||
476 | static struct clk clk_usbpll = { | 517 | static struct clk clk_usbpll = { |
@@ -926,20 +967,8 @@ static struct clk clk_lcd = { | |||
926 | .enable_mask = LPC32XX_CLKPWR_LCDCTRL_CLK_EN, | 967 | .enable_mask = LPC32XX_CLKPWR_LCDCTRL_CLK_EN, |
927 | }; | 968 | }; |
928 | 969 | ||
929 | static inline void clk_lock(void) | ||
930 | { | ||
931 | mutex_lock(&clkm_lock); | ||
932 | } | ||
933 | |||
934 | static inline void clk_unlock(void) | ||
935 | { | ||
936 | mutex_unlock(&clkm_lock); | ||
937 | } | ||
938 | |||
939 | static void local_clk_disable(struct clk *clk) | 970 | static void local_clk_disable(struct clk *clk) |
940 | { | 971 | { |
941 | WARN_ON(clk->usecount == 0); | ||
942 | |||
943 | /* Don't attempt to disable clock if it has no users */ | 972 | /* Don't attempt to disable clock if it has no users */ |
944 | if (clk->usecount > 0) { | 973 | if (clk->usecount > 0) { |
945 | clk->usecount--; | 974 | clk->usecount--; |
@@ -982,10 +1011,11 @@ static int local_clk_enable(struct clk *clk) | |||
982 | int clk_enable(struct clk *clk) | 1011 | int clk_enable(struct clk *clk) |
983 | { | 1012 | { |
984 | int ret; | 1013 | int ret; |
1014 | unsigned long flags; | ||
985 | 1015 | ||
986 | clk_lock(); | 1016 | spin_lock_irqsave(&global_clkregs_lock, flags); |
987 | ret = local_clk_enable(clk); | 1017 | ret = local_clk_enable(clk); |
988 | clk_unlock(); | 1018 | spin_unlock_irqrestore(&global_clkregs_lock, flags); |
989 | 1019 | ||
990 | return ret; | 1020 | return ret; |
991 | } | 1021 | } |
@@ -996,9 +1026,11 @@ EXPORT_SYMBOL(clk_enable); | |||
996 | */ | 1026 | */ |
997 | void clk_disable(struct clk *clk) | 1027 | void clk_disable(struct clk *clk) |
998 | { | 1028 | { |
999 | clk_lock(); | 1029 | unsigned long flags; |
1030 | |||
1031 | spin_lock_irqsave(&global_clkregs_lock, flags); | ||
1000 | local_clk_disable(clk); | 1032 | local_clk_disable(clk); |
1001 | clk_unlock(); | 1033 | spin_unlock_irqrestore(&global_clkregs_lock, flags); |
1002 | } | 1034 | } |
1003 | EXPORT_SYMBOL(clk_disable); | 1035 | EXPORT_SYMBOL(clk_disable); |
1004 | 1036 | ||
@@ -1007,13 +1039,7 @@ EXPORT_SYMBOL(clk_disable); | |||
1007 | */ | 1039 | */ |
1008 | unsigned long clk_get_rate(struct clk *clk) | 1040 | unsigned long clk_get_rate(struct clk *clk) |
1009 | { | 1041 | { |
1010 | unsigned long rate; | 1042 | return clk->get_rate(clk); |
1011 | |||
1012 | clk_lock(); | ||
1013 | rate = clk->get_rate(clk); | ||
1014 | clk_unlock(); | ||
1015 | |||
1016 | return rate; | ||
1017 | } | 1043 | } |
1018 | EXPORT_SYMBOL(clk_get_rate); | 1044 | EXPORT_SYMBOL(clk_get_rate); |
1019 | 1045 | ||
@@ -1029,11 +1055,8 @@ int clk_set_rate(struct clk *clk, unsigned long rate) | |||
1029 | * the actual rate set as part of the peripheral dividers | 1055 | * the actual rate set as part of the peripheral dividers |
1030 | * instead of high level clock control | 1056 | * instead of high level clock control |
1031 | */ | 1057 | */ |
1032 | if (clk->set_rate) { | 1058 | if (clk->set_rate) |
1033 | clk_lock(); | ||
1034 | ret = clk->set_rate(clk, rate); | 1059 | ret = clk->set_rate(clk, rate); |
1035 | clk_unlock(); | ||
1036 | } | ||
1037 | 1060 | ||
1038 | return ret; | 1061 | return ret; |
1039 | } | 1062 | } |
@@ -1044,15 +1067,11 @@ EXPORT_SYMBOL(clk_set_rate); | |||
1044 | */ | 1067 | */ |
1045 | long clk_round_rate(struct clk *clk, unsigned long rate) | 1068 | long clk_round_rate(struct clk *clk, unsigned long rate) |
1046 | { | 1069 | { |
1047 | clk_lock(); | ||
1048 | |||
1049 | if (clk->round_rate) | 1070 | if (clk->round_rate) |
1050 | rate = clk->round_rate(clk, rate); | 1071 | rate = clk->round_rate(clk, rate); |
1051 | else | 1072 | else |
1052 | rate = clk->get_rate(clk); | 1073 | rate = clk->get_rate(clk); |
1053 | 1074 | ||
1054 | clk_unlock(); | ||
1055 | |||
1056 | return rate; | 1075 | return rate; |
1057 | } | 1076 | } |
1058 | EXPORT_SYMBOL(clk_round_rate); | 1077 | EXPORT_SYMBOL(clk_round_rate); |
@@ -1110,12 +1129,12 @@ static struct clk_lookup lookups[] = { | |||
1110 | _REGISTER_CLOCK("dev:ssp1", NULL, clk_ssp1) | 1129 | _REGISTER_CLOCK("dev:ssp1", NULL, clk_ssp1) |
1111 | _REGISTER_CLOCK("lpc32xx_keys.0", NULL, clk_kscan) | 1130 | _REGISTER_CLOCK("lpc32xx_keys.0", NULL, clk_kscan) |
1112 | _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand) | 1131 | _REGISTER_CLOCK("lpc32xx-nand.0", "nand_ck", clk_nand) |
1132 | _REGISTER_CLOCK(NULL, "i2s0_ck", clk_i2s0) | ||
1133 | _REGISTER_CLOCK(NULL, "i2s1_ck", clk_i2s1) | ||
1113 | _REGISTER_CLOCK("lpc32xx-adc", NULL, clk_adc) | 1134 | _REGISTER_CLOCK("lpc32xx-adc", NULL, clk_adc) |
1114 | _REGISTER_CLOCK("tbd", "i2s0_ck", clk_i2s0) | ||
1115 | _REGISTER_CLOCK("tbd", "i2s1_ck", clk_i2s1) | ||
1116 | _REGISTER_CLOCK("ts-lpc32xx", NULL, clk_tsc) | 1135 | _REGISTER_CLOCK("ts-lpc32xx", NULL, clk_tsc) |
1117 | _REGISTER_CLOCK("dev:mmc0", "MCLK", clk_mmc) | 1136 | _REGISTER_CLOCK("dev:mmc0", NULL, clk_mmc) |
1118 | _REGISTER_CLOCK("lpc-net.0", NULL, clk_net) | 1137 | _REGISTER_CLOCK("lpc-eth.0", NULL, clk_net) |
1119 | _REGISTER_CLOCK("dev:clcd", NULL, clk_lcd) | 1138 | _REGISTER_CLOCK("dev:clcd", NULL, clk_lcd) |
1120 | _REGISTER_CLOCK("lpc32xx_udc", "ck_usbd", clk_usbd) | 1139 | _REGISTER_CLOCK("lpc32xx_udc", "ck_usbd", clk_usbd) |
1121 | _REGISTER_CLOCK("lpc32xx_rtc", NULL, clk_rtc) | 1140 | _REGISTER_CLOCK("lpc32xx_rtc", NULL, clk_rtc) |
diff --git a/arch/arm/mach-lpc32xx/common.c b/arch/arm/mach-lpc32xx/common.c index 6c76bb36559b..bbbf063a74c2 100644 --- a/arch/arm/mach-lpc32xx/common.c +++ b/arch/arm/mach-lpc32xx/common.c | |||
@@ -160,6 +160,53 @@ struct platform_device lpc32xx_adc_device = { | |||
160 | }; | 160 | }; |
161 | 161 | ||
162 | /* | 162 | /* |
163 | * USB support | ||
164 | */ | ||
165 | /* The dmamask must be set for OHCI to work */ | ||
166 | static u64 ohci_dmamask = ~(u32) 0; | ||
167 | static struct resource ohci_resources[] = { | ||
168 | { | ||
169 | .start = IO_ADDRESS(LPC32XX_USB_BASE), | ||
170 | .end = IO_ADDRESS(LPC32XX_USB_BASE + 0x100 - 1), | ||
171 | .flags = IORESOURCE_MEM, | ||
172 | }, { | ||
173 | .start = IRQ_LPC32XX_USB_HOST, | ||
174 | .flags = IORESOURCE_IRQ, | ||
175 | }, | ||
176 | }; | ||
177 | struct platform_device lpc32xx_ohci_device = { | ||
178 | .name = "usb-ohci", | ||
179 | .id = -1, | ||
180 | .dev = { | ||
181 | .dma_mask = &ohci_dmamask, | ||
182 | .coherent_dma_mask = 0xFFFFFFFF, | ||
183 | }, | ||
184 | .num_resources = ARRAY_SIZE(ohci_resources), | ||
185 | .resource = ohci_resources, | ||
186 | }; | ||
187 | |||
188 | /* | ||
189 | * Network Support | ||
190 | */ | ||
191 | static struct resource net_resources[] = { | ||
192 | [0] = DEFINE_RES_MEM(LPC32XX_ETHERNET_BASE, SZ_4K), | ||
193 | [1] = DEFINE_RES_MEM(LPC32XX_IRAM_BASE, SZ_128K), | ||
194 | [2] = DEFINE_RES_IRQ(IRQ_LPC32XX_ETHERNET), | ||
195 | }; | ||
196 | |||
197 | static u64 lpc32xx_mac_dma_mask = 0xffffffffUL; | ||
198 | struct platform_device lpc32xx_net_device = { | ||
199 | .name = "lpc-eth", | ||
200 | .id = 0, | ||
201 | .dev = { | ||
202 | .dma_mask = &lpc32xx_mac_dma_mask, | ||
203 | .coherent_dma_mask = 0xffffffffUL, | ||
204 | }, | ||
205 | .num_resources = ARRAY_SIZE(net_resources), | ||
206 | .resource = net_resources, | ||
207 | }; | ||
208 | |||
209 | /* | ||
163 | * Returns the unique ID for the device | 210 | * Returns the unique ID for the device |
164 | */ | 211 | */ |
165 | void lpc32xx_get_uid(u32 devid[4]) | 212 | void lpc32xx_get_uid(u32 devid[4]) |
diff --git a/arch/arm/mach-lpc32xx/common.h b/arch/arm/mach-lpc32xx/common.h index 04b72739eb9c..23c21905ff89 100644 --- a/arch/arm/mach-lpc32xx/common.h +++ b/arch/arm/mach-lpc32xx/common.h | |||
@@ -19,6 +19,7 @@ | |||
19 | #ifndef __LPC32XX_COMMON_H | 19 | #ifndef __LPC32XX_COMMON_H |
20 | #define __LPC32XX_COMMON_H | 20 | #define __LPC32XX_COMMON_H |
21 | 21 | ||
22 | #include <mach/board.h> | ||
22 | #include <linux/platform_device.h> | 23 | #include <linux/platform_device.h> |
23 | 24 | ||
24 | /* | 25 | /* |
@@ -31,6 +32,8 @@ extern struct platform_device lpc32xx_i2c2_device; | |||
31 | extern struct platform_device lpc32xx_tsc_device; | 32 | extern struct platform_device lpc32xx_tsc_device; |
32 | extern struct platform_device lpc32xx_adc_device; | 33 | extern struct platform_device lpc32xx_adc_device; |
33 | extern struct platform_device lpc32xx_rtc_device; | 34 | extern struct platform_device lpc32xx_rtc_device; |
35 | extern struct platform_device lpc32xx_ohci_device; | ||
36 | extern struct platform_device lpc32xx_net_device; | ||
34 | 37 | ||
35 | /* | 38 | /* |
36 | * Other arch specific structures and functions | 39 | * Other arch specific structures and functions |
@@ -66,9 +69,6 @@ extern u32 clk_get_pclk_div(void); | |||
66 | */ | 69 | */ |
67 | extern void lpc32xx_get_uid(u32 devid[4]); | 70 | extern void lpc32xx_get_uid(u32 devid[4]); |
68 | 71 | ||
69 | extern void lpc32xx_watchdog_reset(void); | ||
70 | extern u32 lpc32xx_return_iram_size(void); | ||
71 | |||
72 | /* | 72 | /* |
73 | * Pointers used for sizing and copying suspend function data | 73 | * Pointers used for sizing and copying suspend function data |
74 | */ | 74 | */ |
diff --git a/arch/arm/mach-lpc32xx/include/mach/board.h b/arch/arm/mach-lpc32xx/include/mach/board.h new file mode 100644 index 000000000000..52531ca7bd1d --- /dev/null +++ b/arch/arm/mach-lpc32xx/include/mach/board.h | |||
@@ -0,0 +1,24 @@ | |||
1 | /* | ||
2 | * arm/arch/mach-lpc32xx/include/mach/board.h | ||
3 | * | ||
4 | * Author: Kevin Wells <kevin.wells@nxp.com> | ||
5 | * | ||
6 | * Copyright (C) 2010 NXP Semiconductors | ||
7 | * | ||
8 | * This program is free software; you can redistribute it and/or modify | ||
9 | * it under the terms of the GNU General Public License as published by | ||
10 | * the Free Software Foundation; either version 2 of the License, or | ||
11 | * (at your option) any later version. | ||
12 | * | ||
13 | * This program is distributed in the hope that it will be useful, | ||
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
16 | * GNU General Public License for more details. | ||
17 | */ | ||
18 | |||
19 | #ifndef __ASM_ARCH_BOARD_H | ||
20 | #define __ASM_ARCH_BOARD_H | ||
21 | |||
22 | extern u32 lpc32xx_return_iram_size(void); | ||
23 | |||
24 | #endif /* __ASM_ARCH_BOARD_H */ | ||
diff --git a/arch/arm/mach-lpc32xx/include/mach/platform.h b/arch/arm/mach-lpc32xx/include/mach/platform.h index 14ea8d1aadb5..c584f5bb164f 100644 --- a/arch/arm/mach-lpc32xx/include/mach/platform.h +++ b/arch/arm/mach-lpc32xx/include/mach/platform.h | |||
@@ -591,42 +591,42 @@ | |||
591 | /* | 591 | /* |
592 | * Timer/counter register offsets | 592 | * Timer/counter register offsets |
593 | */ | 593 | */ |
594 | #define LCP32XX_TIMER_IR(x) io_p2v((x) + 0x00) | 594 | #define LPC32XX_TIMER_IR(x) io_p2v((x) + 0x00) |
595 | #define LCP32XX_TIMER_TCR(x) io_p2v((x) + 0x04) | 595 | #define LPC32XX_TIMER_TCR(x) io_p2v((x) + 0x04) |
596 | #define LCP32XX_TIMER_TC(x) io_p2v((x) + 0x08) | 596 | #define LPC32XX_TIMER_TC(x) io_p2v((x) + 0x08) |
597 | #define LCP32XX_TIMER_PR(x) io_p2v((x) + 0x0C) | 597 | #define LPC32XX_TIMER_PR(x) io_p2v((x) + 0x0C) |
598 | #define LCP32XX_TIMER_PC(x) io_p2v((x) + 0x10) | 598 | #define LPC32XX_TIMER_PC(x) io_p2v((x) + 0x10) |
599 | #define LCP32XX_TIMER_MCR(x) io_p2v((x) + 0x14) | 599 | #define LPC32XX_TIMER_MCR(x) io_p2v((x) + 0x14) |
600 | #define LCP32XX_TIMER_MR0(x) io_p2v((x) + 0x18) | 600 | #define LPC32XX_TIMER_MR0(x) io_p2v((x) + 0x18) |
601 | #define LCP32XX_TIMER_MR1(x) io_p2v((x) + 0x1C) | 601 | #define LPC32XX_TIMER_MR1(x) io_p2v((x) + 0x1C) |
602 | #define LCP32XX_TIMER_MR2(x) io_p2v((x) + 0x20) | 602 | #define LPC32XX_TIMER_MR2(x) io_p2v((x) + 0x20) |
603 | #define LCP32XX_TIMER_MR3(x) io_p2v((x) + 0x24) | 603 | #define LPC32XX_TIMER_MR3(x) io_p2v((x) + 0x24) |
604 | #define LCP32XX_TIMER_CCR(x) io_p2v((x) + 0x28) | 604 | #define LPC32XX_TIMER_CCR(x) io_p2v((x) + 0x28) |
605 | #define LCP32XX_TIMER_CR0(x) io_p2v((x) + 0x2C) | 605 | #define LPC32XX_TIMER_CR0(x) io_p2v((x) + 0x2C) |
606 | #define LCP32XX_TIMER_CR1(x) io_p2v((x) + 0x30) | 606 | #define LPC32XX_TIMER_CR1(x) io_p2v((x) + 0x30) |
607 | #define LCP32XX_TIMER_CR2(x) io_p2v((x) + 0x34) | 607 | #define LPC32XX_TIMER_CR2(x) io_p2v((x) + 0x34) |
608 | #define LCP32XX_TIMER_CR3(x) io_p2v((x) + 0x38) | 608 | #define LPC32XX_TIMER_CR3(x) io_p2v((x) + 0x38) |
609 | #define LCP32XX_TIMER_EMR(x) io_p2v((x) + 0x3C) | 609 | #define LPC32XX_TIMER_EMR(x) io_p2v((x) + 0x3C) |
610 | #define LCP32XX_TIMER_CTCR(x) io_p2v((x) + 0x70) | 610 | #define LPC32XX_TIMER_CTCR(x) io_p2v((x) + 0x70) |
611 | 611 | ||
612 | /* | 612 | /* |
613 | * ir register definitions | 613 | * ir register definitions |
614 | */ | 614 | */ |
615 | #define LCP32XX_TIMER_CNTR_MTCH_BIT(n) (1 << ((n) & 0x3)) | 615 | #define LPC32XX_TIMER_CNTR_MTCH_BIT(n) (1 << ((n) & 0x3)) |
616 | #define LCP32XX_TIMER_CNTR_CAPT_BIT(n) (1 << (4 + ((n) & 0x3))) | 616 | #define LPC32XX_TIMER_CNTR_CAPT_BIT(n) (1 << (4 + ((n) & 0x3))) |
617 | 617 | ||
618 | /* | 618 | /* |
619 | * tcr register definitions | 619 | * tcr register definitions |
620 | */ | 620 | */ |
621 | #define LCP32XX_TIMER_CNTR_TCR_EN 0x1 | 621 | #define LPC32XX_TIMER_CNTR_TCR_EN 0x1 |
622 | #define LCP32XX_TIMER_CNTR_TCR_RESET 0x2 | 622 | #define LPC32XX_TIMER_CNTR_TCR_RESET 0x2 |
623 | 623 | ||
624 | /* | 624 | /* |
625 | * mcr register definitions | 625 | * mcr register definitions |
626 | */ | 626 | */ |
627 | #define LCP32XX_TIMER_CNTR_MCR_MTCH(n) (0x1 << ((n) * 3)) | 627 | #define LPC32XX_TIMER_CNTR_MCR_MTCH(n) (0x1 << ((n) * 3)) |
628 | #define LCP32XX_TIMER_CNTR_MCR_RESET(n) (0x1 << (((n) * 3) + 1)) | 628 | #define LPC32XX_TIMER_CNTR_MCR_RESET(n) (0x1 << (((n) * 3) + 1)) |
629 | #define LCP32XX_TIMER_CNTR_MCR_STOP(n) (0x1 << (((n) * 3) + 2)) | 629 | #define LPC32XX_TIMER_CNTR_MCR_STOP(n) (0x1 << (((n) * 3) + 2)) |
630 | 630 | ||
631 | /* | 631 | /* |
632 | * Standard UART register offsets | 632 | * Standard UART register offsets |
@@ -690,5 +690,8 @@ | |||
690 | #define LPC32XX_GPIO_P1_MUX_SET _GPREG(0x130) | 690 | #define LPC32XX_GPIO_P1_MUX_SET _GPREG(0x130) |
691 | #define LPC32XX_GPIO_P1_MUX_CLR _GPREG(0x134) | 691 | #define LPC32XX_GPIO_P1_MUX_CLR _GPREG(0x134) |
692 | #define LPC32XX_GPIO_P1_MUX_STATE _GPREG(0x138) | 692 | #define LPC32XX_GPIO_P1_MUX_STATE _GPREG(0x138) |
693 | #define LPC32XX_GPIO_P2_MUX_SET _GPREG(0x028) | ||
694 | #define LPC32XX_GPIO_P2_MUX_CLR _GPREG(0x02C) | ||
695 | #define LPC32XX_GPIO_P2_MUX_STATE _GPREG(0x030) | ||
693 | 696 | ||
694 | #endif | 697 | #endif |
diff --git a/arch/arm/mach-lpc32xx/irq.c b/arch/arm/mach-lpc32xx/irq.c index c74de01ab5b6..d080cb1123dd 100644 --- a/arch/arm/mach-lpc32xx/irq.c +++ b/arch/arm/mach-lpc32xx/irq.c | |||
@@ -150,6 +150,10 @@ static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = { | |||
150 | .event_group = &lpc32xx_event_int_regs, | 150 | .event_group = &lpc32xx_event_int_regs, |
151 | .mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT, | 151 | .mask = LPC32XX_CLKPWR_INTSRC_KEY_BIT, |
152 | }, | 152 | }, |
153 | [IRQ_LPC32XX_ETHERNET] = { | ||
154 | .event_group = &lpc32xx_event_int_regs, | ||
155 | .mask = LPC32XX_CLKPWR_INTSRC_MAC_BIT, | ||
156 | }, | ||
153 | [IRQ_LPC32XX_USB_OTG_ATX] = { | 157 | [IRQ_LPC32XX_USB_OTG_ATX] = { |
154 | .event_group = &lpc32xx_event_int_regs, | 158 | .event_group = &lpc32xx_event_int_regs, |
155 | .mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT, | 159 | .mask = LPC32XX_CLKPWR_INTSRC_USBATXINT_BIT, |
diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c index a539f4f72f28..7f7401ec7487 100644 --- a/arch/arm/mach-lpc32xx/phy3250.c +++ b/arch/arm/mach-lpc32xx/phy3250.c | |||
@@ -37,6 +37,7 @@ | |||
37 | 37 | ||
38 | #include <mach/hardware.h> | 38 | #include <mach/hardware.h> |
39 | #include <mach/platform.h> | 39 | #include <mach/platform.h> |
40 | #include <mach/board.h> | ||
40 | #include <mach/gpio-lpc32xx.h> | 41 | #include <mach/gpio-lpc32xx.h> |
41 | #include "common.h" | 42 | #include "common.h" |
42 | 43 | ||
@@ -247,12 +248,16 @@ static struct platform_device lpc32xx_gpio_led_device = { | |||
247 | }; | 248 | }; |
248 | 249 | ||
249 | static struct platform_device *phy3250_devs[] __initdata = { | 250 | static struct platform_device *phy3250_devs[] __initdata = { |
251 | &lpc32xx_rtc_device, | ||
252 | &lpc32xx_tsc_device, | ||
250 | &lpc32xx_i2c0_device, | 253 | &lpc32xx_i2c0_device, |
251 | &lpc32xx_i2c1_device, | 254 | &lpc32xx_i2c1_device, |
252 | &lpc32xx_i2c2_device, | 255 | &lpc32xx_i2c2_device, |
253 | &lpc32xx_watchdog_device, | 256 | &lpc32xx_watchdog_device, |
254 | &lpc32xx_gpio_led_device, | 257 | &lpc32xx_gpio_led_device, |
255 | &lpc32xx_adc_device, | 258 | &lpc32xx_adc_device, |
259 | &lpc32xx_ohci_device, | ||
260 | &lpc32xx_net_device, | ||
256 | }; | 261 | }; |
257 | 262 | ||
258 | static struct amba_device *amba_devs[] __initdata = { | 263 | static struct amba_device *amba_devs[] __initdata = { |
diff --git a/arch/arm/mach-lpc32xx/pm.c b/arch/arm/mach-lpc32xx/pm.c index b9c80597b7bf..207e81275ff0 100644 --- a/arch/arm/mach-lpc32xx/pm.c +++ b/arch/arm/mach-lpc32xx/pm.c | |||
@@ -13,7 +13,7 @@ | |||
13 | /* | 13 | /* |
14 | * LPC32XX CPU and system power management | 14 | * LPC32XX CPU and system power management |
15 | * | 15 | * |
16 | * The LCP32XX has three CPU modes for controlling system power: run, | 16 | * The LPC32XX has three CPU modes for controlling system power: run, |
17 | * direct-run, and halt modes. When switching between halt and run modes, | 17 | * direct-run, and halt modes. When switching between halt and run modes, |
18 | * the CPU transistions through direct-run mode. For Linux, direct-run | 18 | * the CPU transistions through direct-run mode. For Linux, direct-run |
19 | * mode is not used in normal operation. Halt mode is used when the | 19 | * mode is not used in normal operation. Halt mode is used when the |
diff --git a/arch/arm/mach-lpc32xx/timer.c b/arch/arm/mach-lpc32xx/timer.c index b42c909bbeeb..c40667c33161 100644 --- a/arch/arm/mach-lpc32xx/timer.c +++ b/arch/arm/mach-lpc32xx/timer.c | |||
@@ -34,11 +34,11 @@ | |||
34 | static int lpc32xx_clkevt_next_event(unsigned long delta, | 34 | static int lpc32xx_clkevt_next_event(unsigned long delta, |
35 | struct clock_event_device *dev) | 35 | struct clock_event_device *dev) |
36 | { | 36 | { |
37 | __raw_writel(LCP32XX_TIMER_CNTR_TCR_RESET, | 37 | __raw_writel(LPC32XX_TIMER_CNTR_TCR_RESET, |
38 | LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); | 38 | LPC32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); |
39 | __raw_writel(delta, LCP32XX_TIMER_PR(LPC32XX_TIMER0_BASE)); | 39 | __raw_writel(delta, LPC32XX_TIMER_PR(LPC32XX_TIMER0_BASE)); |
40 | __raw_writel(LCP32XX_TIMER_CNTR_TCR_EN, | 40 | __raw_writel(LPC32XX_TIMER_CNTR_TCR_EN, |
41 | LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); | 41 | LPC32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); |
42 | 42 | ||
43 | return 0; | 43 | return 0; |
44 | } | 44 | } |
@@ -58,7 +58,7 @@ static void lpc32xx_clkevt_mode(enum clock_event_mode mode, | |||
58 | * disable the timer to wait for the first call to | 58 | * disable the timer to wait for the first call to |
59 | * set_next_event(). | 59 | * set_next_event(). |
60 | */ | 60 | */ |
61 | __raw_writel(0, LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); | 61 | __raw_writel(0, LPC32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); |
62 | break; | 62 | break; |
63 | 63 | ||
64 | case CLOCK_EVT_MODE_UNUSED: | 64 | case CLOCK_EVT_MODE_UNUSED: |
@@ -81,8 +81,8 @@ static irqreturn_t lpc32xx_timer_interrupt(int irq, void *dev_id) | |||
81 | struct clock_event_device *evt = &lpc32xx_clkevt; | 81 | struct clock_event_device *evt = &lpc32xx_clkevt; |
82 | 82 | ||
83 | /* Clear match */ | 83 | /* Clear match */ |
84 | __raw_writel(LCP32XX_TIMER_CNTR_MTCH_BIT(0), | 84 | __raw_writel(LPC32XX_TIMER_CNTR_MTCH_BIT(0), |
85 | LCP32XX_TIMER_IR(LPC32XX_TIMER0_BASE)); | 85 | LPC32XX_TIMER_IR(LPC32XX_TIMER0_BASE)); |
86 | 86 | ||
87 | evt->event_handler(evt); | 87 | evt->event_handler(evt); |
88 | 88 | ||
@@ -128,14 +128,14 @@ static void __init lpc32xx_timer_init(void) | |||
128 | clkrate = clkrate / clk_get_pclk_div(); | 128 | clkrate = clkrate / clk_get_pclk_div(); |
129 | 129 | ||
130 | /* Initial timer setup */ | 130 | /* Initial timer setup */ |
131 | __raw_writel(0, LCP32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); | 131 | __raw_writel(0, LPC32XX_TIMER_TCR(LPC32XX_TIMER0_BASE)); |
132 | __raw_writel(LCP32XX_TIMER_CNTR_MTCH_BIT(0), | 132 | __raw_writel(LPC32XX_TIMER_CNTR_MTCH_BIT(0), |
133 | LCP32XX_TIMER_IR(LPC32XX_TIMER0_BASE)); | 133 | LPC32XX_TIMER_IR(LPC32XX_TIMER0_BASE)); |
134 | __raw_writel(1, LCP32XX_TIMER_MR0(LPC32XX_TIMER0_BASE)); | 134 | __raw_writel(1, LPC32XX_TIMER_MR0(LPC32XX_TIMER0_BASE)); |
135 | __raw_writel(LCP32XX_TIMER_CNTR_MCR_MTCH(0) | | 135 | __raw_writel(LPC32XX_TIMER_CNTR_MCR_MTCH(0) | |
136 | LCP32XX_TIMER_CNTR_MCR_STOP(0) | | 136 | LPC32XX_TIMER_CNTR_MCR_STOP(0) | |
137 | LCP32XX_TIMER_CNTR_MCR_RESET(0), | 137 | LPC32XX_TIMER_CNTR_MCR_RESET(0), |
138 | LCP32XX_TIMER_MCR(LPC32XX_TIMER0_BASE)); | 138 | LPC32XX_TIMER_MCR(LPC32XX_TIMER0_BASE)); |
139 | 139 | ||
140 | /* Setup tick interrupt */ | 140 | /* Setup tick interrupt */ |
141 | setup_irq(IRQ_LPC32XX_TIMER0, &lpc32xx_timer_irq); | 141 | setup_irq(IRQ_LPC32XX_TIMER0, &lpc32xx_timer_irq); |
@@ -151,14 +151,14 @@ static void __init lpc32xx_timer_init(void) | |||
151 | clockevents_register_device(&lpc32xx_clkevt); | 151 | clockevents_register_device(&lpc32xx_clkevt); |
152 | 152 | ||
153 | /* Use timer1 as clock source. */ | 153 | /* Use timer1 as clock source. */ |
154 | __raw_writel(LCP32XX_TIMER_CNTR_TCR_RESET, | 154 | __raw_writel(LPC32XX_TIMER_CNTR_TCR_RESET, |
155 | LCP32XX_TIMER_TCR(LPC32XX_TIMER1_BASE)); | 155 | LPC32XX_TIMER_TCR(LPC32XX_TIMER1_BASE)); |
156 | __raw_writel(0, LCP32XX_TIMER_PR(LPC32XX_TIMER1_BASE)); | 156 | __raw_writel(0, LPC32XX_TIMER_PR(LPC32XX_TIMER1_BASE)); |
157 | __raw_writel(0, LCP32XX_TIMER_MCR(LPC32XX_TIMER1_BASE)); | 157 | __raw_writel(0, LPC32XX_TIMER_MCR(LPC32XX_TIMER1_BASE)); |
158 | __raw_writel(LCP32XX_TIMER_CNTR_TCR_EN, | 158 | __raw_writel(LPC32XX_TIMER_CNTR_TCR_EN, |
159 | LCP32XX_TIMER_TCR(LPC32XX_TIMER1_BASE)); | 159 | LPC32XX_TIMER_TCR(LPC32XX_TIMER1_BASE)); |
160 | 160 | ||
161 | clocksource_mmio_init(LCP32XX_TIMER_TC(LPC32XX_TIMER1_BASE), | 161 | clocksource_mmio_init(LPC32XX_TIMER_TC(LPC32XX_TIMER1_BASE), |
162 | "lpc32xx_clksrc", clkrate, 300, 32, clocksource_mmio_readl_up); | 162 | "lpc32xx_clksrc", clkrate, 300, 32, clocksource_mmio_readl_up); |
163 | } | 163 | } |
164 | 164 | ||