diff options
Diffstat (limited to 'arch/arm/mach-s3c64xx')
-rw-r--r-- | arch/arm/mach-s3c64xx/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/Makefile | 2 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/clock.c | 121 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/cpuidle.c | 91 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/mach-crag6410.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/mach-smartq.c | 3 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/mach-smdk6410.c | 4 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/setup-usb-phy.c | 90 |
8 files changed, 313 insertions, 10 deletions
diff --git a/arch/arm/mach-s3c64xx/Kconfig b/arch/arm/mach-s3c64xx/Kconfig index dd20c66cd700..326ea3a98725 100644 --- a/arch/arm/mach-s3c64xx/Kconfig +++ b/arch/arm/mach-s3c64xx/Kconfig | |||
@@ -83,6 +83,11 @@ config S3C64XX_SETUP_SPI | |||
83 | help | 83 | help |
84 | Common setup code for SPI GPIO configurations | 84 | Common setup code for SPI GPIO configurations |
85 | 85 | ||
86 | config S3C64XX_SETUP_USB_PHY | ||
87 | bool | ||
88 | help | ||
89 | Common setup code for USB PHY controller | ||
90 | |||
86 | # S36400 Macchine support | 91 | # S36400 Macchine support |
87 | 92 | ||
88 | config MACH_SMDK6400 | 93 | config MACH_SMDK6400 |
@@ -157,6 +162,7 @@ config MACH_SMDK6410 | |||
157 | select S3C64XX_SETUP_IDE | 162 | select S3C64XX_SETUP_IDE |
158 | select S3C64XX_SETUP_FB_24BPP | 163 | select S3C64XX_SETUP_FB_24BPP |
159 | select S3C64XX_SETUP_KEYPAD | 164 | select S3C64XX_SETUP_KEYPAD |
165 | select S3C64XX_SETUP_USB_PHY | ||
160 | help | 166 | help |
161 | Machine support for the Samsung SMDK6410 | 167 | Machine support for the Samsung SMDK6410 |
162 | 168 | ||
@@ -256,6 +262,7 @@ config MACH_SMARTQ | |||
256 | select S3C_DEV_USB_HOST | 262 | select S3C_DEV_USB_HOST |
257 | select S3C64XX_SETUP_SDHCI | 263 | select S3C64XX_SETUP_SDHCI |
258 | select S3C64XX_SETUP_FB_24BPP | 264 | select S3C64XX_SETUP_FB_24BPP |
265 | select S3C64XX_SETUP_USB_PHY | ||
259 | select SAMSUNG_DEV_ADC | 266 | select SAMSUNG_DEV_ADC |
260 | select SAMSUNG_DEV_PWM | 267 | select SAMSUNG_DEV_PWM |
261 | select SAMSUNG_DEV_TS | 268 | select SAMSUNG_DEV_TS |
@@ -283,6 +290,7 @@ config MACH_WLF_CRAGG_6410 | |||
283 | select S3C64XX_SETUP_FB_24BPP | 290 | select S3C64XX_SETUP_FB_24BPP |
284 | select S3C64XX_SETUP_KEYPAD | 291 | select S3C64XX_SETUP_KEYPAD |
285 | select S3C64XX_SETUP_SPI | 292 | select S3C64XX_SETUP_SPI |
293 | select S3C64XX_SETUP_USB_PHY | ||
286 | select SAMSUNG_DEV_ADC | 294 | select SAMSUNG_DEV_ADC |
287 | select SAMSUNG_DEV_KEYPAD | 295 | select SAMSUNG_DEV_KEYPAD |
288 | select S3C_DEV_USB_HOST | 296 | select S3C_DEV_USB_HOST |
diff --git a/arch/arm/mach-s3c64xx/Makefile b/arch/arm/mach-s3c64xx/Makefile index 1822ac2eba31..f9ce1dc28ce4 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile | |||
@@ -22,6 +22,7 @@ obj-$(CONFIG_CPU_S3C6410) += s3c6410.o | |||
22 | # PM | 22 | # PM |
23 | 23 | ||
24 | obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o | 24 | obj-$(CONFIG_PM) += pm.o irq-pm.o sleep.o |
25 | obj-$(CONFIG_CPU_IDLE) += cpuidle.o | ||
25 | 26 | ||
26 | # DMA support | 27 | # DMA support |
27 | 28 | ||
@@ -42,6 +43,7 @@ obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o | |||
42 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o | 43 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o |
43 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 44 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
44 | obj-$(CONFIG_S3C64XX_SETUP_SPI) += setup-spi.o | 45 | obj-$(CONFIG_S3C64XX_SETUP_SPI) += setup-spi.o |
46 | obj-$(CONFIG_S3C64XX_SETUP_USB_PHY) += setup-usb-phy.o | ||
45 | 47 | ||
46 | # Machine support | 48 | # Machine support |
47 | 49 | ||
diff --git a/arch/arm/mach-s3c64xx/clock.c b/arch/arm/mach-s3c64xx/clock.c index aebbcc291b4e..52f079a691cb 100644 --- a/arch/arm/mach-s3c64xx/clock.c +++ b/arch/arm/mach-s3c64xx/clock.c | |||
@@ -207,6 +207,15 @@ static struct clk init_clocks_off[] = { | |||
207 | .enable = s3c64xx_sclk_ctrl, | 207 | .enable = s3c64xx_sclk_ctrl, |
208 | .ctrlbit = S3C_CLKCON_SCLK_MMC2_48, | 208 | .ctrlbit = S3C_CLKCON_SCLK_MMC2_48, |
209 | }, { | 209 | }, { |
210 | .name = "ac97", | ||
211 | .parent = &clk_p, | ||
212 | .ctrlbit = S3C_CLKCON_PCLK_AC97, | ||
213 | }, { | ||
214 | .name = "cfcon", | ||
215 | .parent = &clk_h, | ||
216 | .enable = s3c64xx_hclk_ctrl, | ||
217 | .ctrlbit = S3C_CLKCON_HCLK_IHOST, | ||
218 | }, { | ||
210 | .name = "dma0", | 219 | .name = "dma0", |
211 | .parent = &clk_h, | 220 | .parent = &clk_h, |
212 | .enable = s3c64xx_hclk_ctrl, | 221 | .enable = s3c64xx_hclk_ctrl, |
@@ -216,6 +225,107 @@ static struct clk init_clocks_off[] = { | |||
216 | .parent = &clk_h, | 225 | .parent = &clk_h, |
217 | .enable = s3c64xx_hclk_ctrl, | 226 | .enable = s3c64xx_hclk_ctrl, |
218 | .ctrlbit = S3C_CLKCON_HCLK_DMA1, | 227 | .ctrlbit = S3C_CLKCON_HCLK_DMA1, |
228 | }, { | ||
229 | .name = "3dse", | ||
230 | .parent = &clk_h, | ||
231 | .enable = s3c64xx_hclk_ctrl, | ||
232 | .ctrlbit = S3C_CLKCON_HCLK_3DSE, | ||
233 | }, { | ||
234 | .name = "hclk_secur", | ||
235 | .parent = &clk_h, | ||
236 | .enable = s3c64xx_hclk_ctrl, | ||
237 | .ctrlbit = S3C_CLKCON_HCLK_SECUR, | ||
238 | }, { | ||
239 | .name = "sdma1", | ||
240 | .parent = &clk_h, | ||
241 | .enable = s3c64xx_hclk_ctrl, | ||
242 | .ctrlbit = S3C_CLKCON_HCLK_SDMA1, | ||
243 | }, { | ||
244 | .name = "sdma0", | ||
245 | .parent = &clk_h, | ||
246 | .enable = s3c64xx_hclk_ctrl, | ||
247 | .ctrlbit = S3C_CLKCON_HCLK_SDMA0, | ||
248 | }, { | ||
249 | .name = "hclk_jpeg", | ||
250 | .parent = &clk_h, | ||
251 | .enable = s3c64xx_hclk_ctrl, | ||
252 | .ctrlbit = S3C_CLKCON_HCLK_JPEG, | ||
253 | }, { | ||
254 | .name = "camif", | ||
255 | .parent = &clk_h, | ||
256 | .enable = s3c64xx_hclk_ctrl, | ||
257 | .ctrlbit = S3C_CLKCON_HCLK_CAMIF, | ||
258 | }, { | ||
259 | .name = "hclk_scaler", | ||
260 | .parent = &clk_h, | ||
261 | .enable = s3c64xx_hclk_ctrl, | ||
262 | .ctrlbit = S3C_CLKCON_HCLK_SCALER, | ||
263 | }, { | ||
264 | .name = "2d", | ||
265 | .parent = &clk_h, | ||
266 | .enable = s3c64xx_hclk_ctrl, | ||
267 | .ctrlbit = S3C_CLKCON_HCLK_2D, | ||
268 | }, { | ||
269 | .name = "tv", | ||
270 | .parent = &clk_h, | ||
271 | .enable = s3c64xx_hclk_ctrl, | ||
272 | .ctrlbit = S3C_CLKCON_HCLK_TV, | ||
273 | }, { | ||
274 | .name = "post0", | ||
275 | .parent = &clk_h, | ||
276 | .enable = s3c64xx_hclk_ctrl, | ||
277 | .ctrlbit = S3C_CLKCON_HCLK_POST0, | ||
278 | }, { | ||
279 | .name = "rot", | ||
280 | .parent = &clk_h, | ||
281 | .enable = s3c64xx_hclk_ctrl, | ||
282 | .ctrlbit = S3C_CLKCON_HCLK_ROT, | ||
283 | }, { | ||
284 | .name = "hclk_mfc", | ||
285 | .parent = &clk_h, | ||
286 | .enable = s3c64xx_hclk_ctrl, | ||
287 | .ctrlbit = S3C_CLKCON_HCLK_MFC, | ||
288 | }, { | ||
289 | .name = "pclk_mfc", | ||
290 | .parent = &clk_p, | ||
291 | .enable = s3c64xx_pclk_ctrl, | ||
292 | .ctrlbit = S3C_CLKCON_PCLK_MFC, | ||
293 | }, { | ||
294 | .name = "dac27", | ||
295 | .enable = s3c64xx_sclk_ctrl, | ||
296 | .ctrlbit = S3C_CLKCON_SCLK_DAC27, | ||
297 | }, { | ||
298 | .name = "tv27", | ||
299 | .enable = s3c64xx_sclk_ctrl, | ||
300 | .ctrlbit = S3C_CLKCON_SCLK_TV27, | ||
301 | }, { | ||
302 | .name = "scaler27", | ||
303 | .enable = s3c64xx_sclk_ctrl, | ||
304 | .ctrlbit = S3C_CLKCON_SCLK_SCALER27, | ||
305 | }, { | ||
306 | .name = "sclk_scaler", | ||
307 | .enable = s3c64xx_sclk_ctrl, | ||
308 | .ctrlbit = S3C_CLKCON_SCLK_SCALER, | ||
309 | }, { | ||
310 | .name = "post0_27", | ||
311 | .enable = s3c64xx_sclk_ctrl, | ||
312 | .ctrlbit = S3C_CLKCON_SCLK_POST0_27, | ||
313 | }, { | ||
314 | .name = "secur", | ||
315 | .enable = s3c64xx_sclk_ctrl, | ||
316 | .ctrlbit = S3C_CLKCON_SCLK_SECUR, | ||
317 | }, { | ||
318 | .name = "sclk_mfc", | ||
319 | .enable = s3c64xx_sclk_ctrl, | ||
320 | .ctrlbit = S3C_CLKCON_SCLK_MFC, | ||
321 | }, { | ||
322 | .name = "cam", | ||
323 | .enable = s3c64xx_sclk_ctrl, | ||
324 | .ctrlbit = S3C_CLKCON_SCLK_CAM, | ||
325 | }, { | ||
326 | .name = "sclk_jpeg", | ||
327 | .enable = s3c64xx_sclk_ctrl, | ||
328 | .ctrlbit = S3C_CLKCON_SCLK_JPEG, | ||
219 | }, | 329 | }, |
220 | }; | 330 | }; |
221 | 331 | ||
@@ -289,16 +399,7 @@ static struct clk init_clocks[] = { | |||
289 | .name = "watchdog", | 399 | .name = "watchdog", |
290 | .parent = &clk_p, | 400 | .parent = &clk_p, |
291 | .ctrlbit = S3C_CLKCON_PCLK_WDT, | 401 | .ctrlbit = S3C_CLKCON_PCLK_WDT, |
292 | }, { | 402 | }, |
293 | .name = "ac97", | ||
294 | .parent = &clk_p, | ||
295 | .ctrlbit = S3C_CLKCON_PCLK_AC97, | ||
296 | }, { | ||
297 | .name = "cfcon", | ||
298 | .parent = &clk_h, | ||
299 | .enable = s3c64xx_hclk_ctrl, | ||
300 | .ctrlbit = S3C_CLKCON_HCLK_IHOST, | ||
301 | } | ||
302 | }; | 403 | }; |
303 | 404 | ||
304 | static struct clk clk_hsmmc0 = { | 405 | static struct clk clk_hsmmc0 = { |
diff --git a/arch/arm/mach-s3c64xx/cpuidle.c b/arch/arm/mach-s3c64xx/cpuidle.c new file mode 100644 index 000000000000..179460f38db7 --- /dev/null +++ b/arch/arm/mach-s3c64xx/cpuidle.c | |||
@@ -0,0 +1,91 @@ | |||
1 | /* linux/arch/arm/mach-s3c64xx/cpuidle.c | ||
2 | * | ||
3 | * Copyright (c) 2011 Wolfson Microelectronics, plc | ||
4 | * Copyright (c) 2011 Samsung Electronics Co., Ltd. | ||
5 | * http://www.samsung.com | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License version 2 as | ||
9 | * published by the Free Software Foundation. | ||
10 | */ | ||
11 | |||
12 | #include <linux/kernel.h> | ||
13 | #include <linux/init.h> | ||
14 | #include <linux/cpuidle.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/export.h> | ||
17 | #include <linux/time.h> | ||
18 | |||
19 | #include <asm/proc-fns.h> | ||
20 | |||
21 | #include <mach/map.h> | ||
22 | |||
23 | #include <mach/regs-sys.h> | ||
24 | #include <mach/regs-syscon-power.h> | ||
25 | |||
26 | static int s3c64xx_enter_idle(struct cpuidle_device *dev, | ||
27 | struct cpuidle_driver *drv, | ||
28 | int index) | ||
29 | { | ||
30 | struct timeval before, after; | ||
31 | unsigned long tmp; | ||
32 | int idle_time; | ||
33 | |||
34 | local_irq_disable(); | ||
35 | do_gettimeofday(&before); | ||
36 | |||
37 | /* Setup PWRCFG to enter idle mode */ | ||
38 | tmp = __raw_readl(S3C64XX_PWR_CFG); | ||
39 | tmp &= ~S3C64XX_PWRCFG_CFG_WFI_MASK; | ||
40 | tmp |= S3C64XX_PWRCFG_CFG_WFI_IDLE; | ||
41 | __raw_writel(tmp, S3C64XX_PWR_CFG); | ||
42 | |||
43 | cpu_do_idle(); | ||
44 | |||
45 | do_gettimeofday(&after); | ||
46 | local_irq_enable(); | ||
47 | idle_time = (after.tv_sec - before.tv_sec) * USEC_PER_SEC + | ||
48 | (after.tv_usec - before.tv_usec); | ||
49 | |||
50 | dev->last_residency = idle_time; | ||
51 | return index; | ||
52 | } | ||
53 | |||
54 | static struct cpuidle_state s3c64xx_cpuidle_set[] = { | ||
55 | [0] = { | ||
56 | .enter = s3c64xx_enter_idle, | ||
57 | .exit_latency = 1, | ||
58 | .target_residency = 1, | ||
59 | .flags = CPUIDLE_FLAG_TIME_VALID, | ||
60 | .name = "IDLE", | ||
61 | .desc = "System active, ARM gated", | ||
62 | }, | ||
63 | }; | ||
64 | |||
65 | static struct cpuidle_driver s3c64xx_cpuidle_driver = { | ||
66 | .name = "s3c64xx_cpuidle", | ||
67 | .owner = THIS_MODULE, | ||
68 | .state_count = ARRAY_SIZE(s3c64xx_cpuidle_set), | ||
69 | }; | ||
70 | |||
71 | static struct cpuidle_device s3c64xx_cpuidle_device = { | ||
72 | .state_count = ARRAY_SIZE(s3c64xx_cpuidle_set), | ||
73 | }; | ||
74 | |||
75 | static int __init s3c64xx_init_cpuidle(void) | ||
76 | { | ||
77 | int ret; | ||
78 | |||
79 | memcpy(s3c64xx_cpuidle_driver.states, s3c64xx_cpuidle_set, | ||
80 | sizeof(s3c64xx_cpuidle_set)); | ||
81 | cpuidle_register_driver(&s3c64xx_cpuidle_driver); | ||
82 | |||
83 | ret = cpuidle_register_device(&s3c64xx_cpuidle_device); | ||
84 | if (ret) { | ||
85 | pr_err("Failed to register cpuidle device: %d\n", ret); | ||
86 | return ret; | ||
87 | } | ||
88 | |||
89 | return 0; | ||
90 | } | ||
91 | device_initcall(s3c64xx_init_cpuidle); | ||
diff --git a/arch/arm/mach-s3c64xx/mach-crag6410.c b/arch/arm/mach-s3c64xx/mach-crag6410.c index 8077f650eb0e..3b56bd9cb880 100644 --- a/arch/arm/mach-s3c64xx/mach-crag6410.c +++ b/arch/arm/mach-s3c64xx/mach-crag6410.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #include <plat/sdhci.h> | 59 | #include <plat/sdhci.h> |
60 | #include <plat/gpio-cfg.h> | 60 | #include <plat/gpio-cfg.h> |
61 | #include <plat/s3c64xx-spi.h> | 61 | #include <plat/s3c64xx-spi.h> |
62 | #include <plat/udc-hs.h> | ||
62 | 63 | ||
63 | #include <plat/keypad.h> | 64 | #include <plat/keypad.h> |
64 | #include <plat/clock.h> | 65 | #include <plat/clock.h> |
@@ -698,6 +699,8 @@ static struct s3c_sdhci_platdata crag6410_hsmmc0_pdata = { | |||
698 | .cfg_gpio = crag6410_cfg_sdhci0, | 699 | .cfg_gpio = crag6410_cfg_sdhci0, |
699 | }; | 700 | }; |
700 | 701 | ||
702 | static struct s3c_hsotg_plat crag6410_hsotg_pdata; | ||
703 | |||
701 | static void __init crag6410_machine_init(void) | 704 | static void __init crag6410_machine_init(void) |
702 | { | 705 | { |
703 | /* Open drain IRQs need pullups */ | 706 | /* Open drain IRQs need pullups */ |
@@ -722,6 +725,7 @@ static void __init crag6410_machine_init(void) | |||
722 | s3c_i2c0_set_platdata(&i2c0_pdata); | 725 | s3c_i2c0_set_platdata(&i2c0_pdata); |
723 | s3c_i2c1_set_platdata(&i2c1_pdata); | 726 | s3c_i2c1_set_platdata(&i2c1_pdata); |
724 | s3c_fb_set_platdata(&crag6410_lcd_pdata); | 727 | s3c_fb_set_platdata(&crag6410_lcd_pdata); |
728 | s3c_hsotg_set_platdata(&crag6410_hsotg_pdata); | ||
725 | 729 | ||
726 | i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0)); | 730 | i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0)); |
727 | i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); | 731 | i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1)); |
diff --git a/arch/arm/mach-s3c64xx/mach-smartq.c b/arch/arm/mach-s3c64xx/mach-smartq.c index ce31db136231..ce745e19aa27 100644 --- a/arch/arm/mach-s3c64xx/mach-smartq.c +++ b/arch/arm/mach-s3c64xx/mach-smartq.c | |||
@@ -187,6 +187,8 @@ static struct s3c_hwmon_pdata smartq_hwmon_pdata __initdata = { | |||
187 | }, | 187 | }, |
188 | }; | 188 | }; |
189 | 189 | ||
190 | static struct s3c_hsotg_plat smartq_hsotg_pdata; | ||
191 | |||
190 | static int __init smartq_lcd_setup_gpio(void) | 192 | static int __init smartq_lcd_setup_gpio(void) |
191 | { | 193 | { |
192 | int ret; | 194 | int ret; |
@@ -383,6 +385,7 @@ void __init smartq_map_io(void) | |||
383 | void __init smartq_machine_init(void) | 385 | void __init smartq_machine_init(void) |
384 | { | 386 | { |
385 | s3c_i2c0_set_platdata(NULL); | 387 | s3c_i2c0_set_platdata(NULL); |
388 | s3c_hsotg_set_platdata(&smartq_hsotg_pdata); | ||
386 | s3c_hwmon_set_platdata(&smartq_hwmon_pdata); | 389 | s3c_hwmon_set_platdata(&smartq_hwmon_pdata); |
387 | s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata); | 390 | s3c_sdhci1_set_platdata(&smartq_internal_hsmmc_pdata); |
388 | s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata); | 391 | s3c_sdhci2_set_platdata(&smartq_internal_hsmmc_pdata); |
diff --git a/arch/arm/mach-s3c64xx/mach-smdk6410.c b/arch/arm/mach-s3c64xx/mach-smdk6410.c index ca6fc204f0ea..d55bc96d9582 100644 --- a/arch/arm/mach-s3c64xx/mach-smdk6410.c +++ b/arch/arm/mach-s3c64xx/mach-smdk6410.c | |||
@@ -72,6 +72,7 @@ | |||
72 | #include <plat/keypad.h> | 72 | #include <plat/keypad.h> |
73 | #include <plat/backlight.h> | 73 | #include <plat/backlight.h> |
74 | #include <plat/regs-fb-v4.h> | 74 | #include <plat/regs-fb-v4.h> |
75 | #include <plat/udc-hs.h> | ||
75 | 76 | ||
76 | #include "common.h" | 77 | #include "common.h" |
77 | 78 | ||
@@ -631,6 +632,8 @@ static struct platform_pwm_backlight_data smdk6410_bl_data = { | |||
631 | .pwm_id = 1, | 632 | .pwm_id = 1, |
632 | }; | 633 | }; |
633 | 634 | ||
635 | static struct s3c_hsotg_plat smdk6410_hsotg_pdata; | ||
636 | |||
634 | static void __init smdk6410_map_io(void) | 637 | static void __init smdk6410_map_io(void) |
635 | { | 638 | { |
636 | u32 tmp; | 639 | u32 tmp; |
@@ -659,6 +662,7 @@ static void __init smdk6410_machine_init(void) | |||
659 | s3c_i2c0_set_platdata(NULL); | 662 | s3c_i2c0_set_platdata(NULL); |
660 | s3c_i2c1_set_platdata(NULL); | 663 | s3c_i2c1_set_platdata(NULL); |
661 | s3c_fb_set_platdata(&smdk6410_lcd_pdata); | 664 | s3c_fb_set_platdata(&smdk6410_lcd_pdata); |
665 | s3c_hsotg_set_platdata(&smdk6410_hsotg_pdata); | ||
662 | 666 | ||
663 | samsung_keypad_set_platdata(&smdk6410_keypad_data); | 667 | samsung_keypad_set_platdata(&smdk6410_keypad_data); |
664 | 668 | ||
diff --git a/arch/arm/mach-s3c64xx/setup-usb-phy.c b/arch/arm/mach-s3c64xx/setup-usb-phy.c new file mode 100644 index 000000000000..f6757e02d7db --- /dev/null +++ b/arch/arm/mach-s3c64xx/setup-usb-phy.c | |||
@@ -0,0 +1,90 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2011 Samsung Electronics Co.Ltd | ||
3 | * Author: Joonyoung Shim <jy0922.shim@samsung.com> | ||
4 | * | ||
5 | * This program is free software; you can redistribute it and/or modify it | ||
6 | * under the terms of the GNU General Public License as published by the | ||
7 | * Free Software Foundation; either version 2 of the License, or (at your | ||
8 | * option) any later version. | ||
9 | * | ||
10 | */ | ||
11 | |||
12 | #include <linux/clk.h> | ||
13 | #include <linux/delay.h> | ||
14 | #include <linux/err.h> | ||
15 | #include <linux/io.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <mach/map.h> | ||
18 | #include <mach/regs-sys.h> | ||
19 | #include <plat/cpu.h> | ||
20 | #include <plat/regs-usb-hsotg-phy.h> | ||
21 | #include <plat/usb-phy.h> | ||
22 | |||
23 | static int s3c_usb_otgphy_init(struct platform_device *pdev) | ||
24 | { | ||
25 | struct clk *xusbxti; | ||
26 | u32 phyclk; | ||
27 | |||
28 | writel(readl(S3C64XX_OTHERS) | S3C64XX_OTHERS_USBMASK, S3C64XX_OTHERS); | ||
29 | |||
30 | /* set clock frequency for PLL */ | ||
31 | phyclk = readl(S3C_PHYCLK) & ~S3C_PHYCLK_CLKSEL_MASK; | ||
32 | |||
33 | xusbxti = clk_get(&pdev->dev, "xusbxti"); | ||
34 | if (xusbxti && !IS_ERR(xusbxti)) { | ||
35 | switch (clk_get_rate(xusbxti)) { | ||
36 | case 12 * MHZ: | ||
37 | phyclk |= S3C_PHYCLK_CLKSEL_12M; | ||
38 | break; | ||
39 | case 24 * MHZ: | ||
40 | phyclk |= S3C_PHYCLK_CLKSEL_24M; | ||
41 | break; | ||
42 | default: | ||
43 | case 48 * MHZ: | ||
44 | /* default reference clock */ | ||
45 | break; | ||
46 | } | ||
47 | clk_put(xusbxti); | ||
48 | } | ||
49 | |||
50 | /* TODO: select external clock/oscillator */ | ||
51 | writel(phyclk | S3C_PHYCLK_CLK_FORCE, S3C_PHYCLK); | ||
52 | |||
53 | /* set to normal OTG PHY */ | ||
54 | writel((readl(S3C_PHYPWR) & ~S3C_PHYPWR_NORMAL_MASK), S3C_PHYPWR); | ||
55 | mdelay(1); | ||
56 | |||
57 | /* reset OTG PHY and Link */ | ||
58 | writel(S3C_RSTCON_PHY | S3C_RSTCON_HCLK | S3C_RSTCON_PHYCLK, | ||
59 | S3C_RSTCON); | ||
60 | udelay(20); /* at-least 10uS */ | ||
61 | writel(0, S3C_RSTCON); | ||
62 | |||
63 | return 0; | ||
64 | } | ||
65 | |||
66 | static int s3c_usb_otgphy_exit(struct platform_device *pdev) | ||
67 | { | ||
68 | writel((readl(S3C_PHYPWR) | S3C_PHYPWR_ANALOG_POWERDOWN | | ||
69 | S3C_PHYPWR_OTG_DISABLE), S3C_PHYPWR); | ||
70 | |||
71 | writel(readl(S3C64XX_OTHERS) & ~S3C64XX_OTHERS_USBMASK, S3C64XX_OTHERS); | ||
72 | |||
73 | return 0; | ||
74 | } | ||
75 | |||
76 | int s5p_usb_phy_init(struct platform_device *pdev, int type) | ||
77 | { | ||
78 | if (type == S5P_USB_PHY_DEVICE) | ||
79 | return s3c_usb_otgphy_init(pdev); | ||
80 | |||
81 | return -EINVAL; | ||
82 | } | ||
83 | |||
84 | int s5p_usb_phy_exit(struct platform_device *pdev, int type) | ||
85 | { | ||
86 | if (type == S5P_USB_PHY_DEVICE) | ||
87 | return s3c_usb_otgphy_exit(pdev); | ||
88 | |||
89 | return -EINVAL; | ||
90 | } | ||