diff options
-rw-r--r-- | arch/arm/mach-s3c64xx/Kconfig | 8 | ||||
-rw-r--r-- | arch/arm/mach-s3c64xx/Makefile | 1 | ||||
-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 | ||||
-rw-r--r-- | arch/arm/plat-samsung/devs.c | 14 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/regs-usb-hsotg-phy.h | 7 | ||||
-rw-r--r-- | arch/arm/plat-samsung/include/plat/udc-hs.h | 5 |
9 files changed, 133 insertions, 3 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 610fe2807ed7..f9ce1dc28ce4 100644 --- a/arch/arm/mach-s3c64xx/Makefile +++ b/arch/arm/mach-s3c64xx/Makefile | |||
@@ -43,6 +43,7 @@ obj-$(CONFIG_S3C64XX_SETUP_IDE) += setup-ide.o | |||
43 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o | 43 | obj-$(CONFIG_S3C64XX_SETUP_KEYPAD) += setup-keypad.o |
44 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o | 44 | obj-$(CONFIG_S3C64XX_SETUP_SDHCI_GPIO) += setup-sdhci-gpio.o |
45 | 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 | ||
46 | 47 | ||
47 | # Machine support | 48 | # Machine support |
48 | 49 | ||
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 | } | ||
diff --git a/arch/arm/plat-samsung/devs.c b/arch/arm/plat-samsung/devs.c index 145580a4a62c..21168eaad356 100644 --- a/arch/arm/plat-samsung/devs.c +++ b/arch/arm/plat-samsung/devs.c | |||
@@ -57,6 +57,7 @@ | |||
57 | #include <plat/sdhci.h> | 57 | #include <plat/sdhci.h> |
58 | #include <plat/ts.h> | 58 | #include <plat/ts.h> |
59 | #include <plat/udc.h> | 59 | #include <plat/udc.h> |
60 | #include <plat/udc-hs.h> | ||
60 | #include <plat/usb-control.h> | 61 | #include <plat/usb-control.h> |
61 | #include <plat/usb-phy.h> | 62 | #include <plat/usb-phy.h> |
62 | #include <plat/regs-iic.h> | 63 | #include <plat/regs-iic.h> |
@@ -1449,6 +1450,19 @@ struct platform_device s3c_device_usb_hsotg = { | |||
1449 | .coherent_dma_mask = DMA_BIT_MASK(32), | 1450 | .coherent_dma_mask = DMA_BIT_MASK(32), |
1450 | }, | 1451 | }, |
1451 | }; | 1452 | }; |
1453 | |||
1454 | void __init s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd) | ||
1455 | { | ||
1456 | struct s3c_hsotg_plat *npd; | ||
1457 | |||
1458 | npd = s3c_set_platdata(pd, sizeof(struct s3c_hsotg_plat), | ||
1459 | &s3c_device_usb_hsotg); | ||
1460 | |||
1461 | if (!npd->phy_init) | ||
1462 | npd->phy_init = s5p_usb_phy_init; | ||
1463 | if (!npd->phy_exit) | ||
1464 | npd->phy_exit = s5p_usb_phy_exit; | ||
1465 | } | ||
1452 | #endif /* CONFIG_S3C_DEV_USB_HSOTG */ | 1466 | #endif /* CONFIG_S3C_DEV_USB_HSOTG */ |
1453 | 1467 | ||
1454 | /* USB High Spped 2.0 Device (Gadget) */ | 1468 | /* USB High Spped 2.0 Device (Gadget) */ |
diff --git a/arch/arm/plat-samsung/include/plat/regs-usb-hsotg-phy.h b/arch/arm/plat-samsung/include/plat/regs-usb-hsotg-phy.h index a111ad871833..fcf279662067 100644 --- a/arch/arm/plat-samsung/include/plat/regs-usb-hsotg-phy.h +++ b/arch/arm/plat-samsung/include/plat/regs-usb-hsotg-phy.h | |||
@@ -25,8 +25,9 @@ | |||
25 | #define S3C_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY) | 25 | #define S3C_HSOTG_PHYREG(x) ((x) + S3C_VA_USB_HSPHY) |
26 | 26 | ||
27 | #define S3C_PHYPWR S3C_HSOTG_PHYREG(0x00) | 27 | #define S3C_PHYPWR S3C_HSOTG_PHYREG(0x00) |
28 | #define SRC_PHYPWR_OTG_DISABLE (1 << 4) | 28 | #define S3C_PHYPWR_NORMAL_MASK (0x19 << 0) |
29 | #define SRC_PHYPWR_ANALOG_POWERDOWN (1 << 3) | 29 | #define S3C_PHYPWR_OTG_DISABLE (1 << 4) |
30 | #define S3C_PHYPWR_ANALOG_POWERDOWN (1 << 3) | ||
30 | #define SRC_PHYPWR_FORCE_SUSPEND (1 << 1) | 31 | #define SRC_PHYPWR_FORCE_SUSPEND (1 << 1) |
31 | 32 | ||
32 | #define S3C_PHYCLK S3C_HSOTG_PHYREG(0x04) | 33 | #define S3C_PHYCLK S3C_HSOTG_PHYREG(0x04) |
@@ -42,7 +43,7 @@ | |||
42 | 43 | ||
43 | #define S3C_RSTCON S3C_HSOTG_PHYREG(0x08) | 44 | #define S3C_RSTCON S3C_HSOTG_PHYREG(0x08) |
44 | #define S3C_RSTCON_PHYCLK (1 << 2) | 45 | #define S3C_RSTCON_PHYCLK (1 << 2) |
45 | #define S3C_RSTCON_HCLK (1 << 2) | 46 | #define S3C_RSTCON_HCLK (1 << 1) |
46 | #define S3C_RSTCON_PHY (1 << 0) | 47 | #define S3C_RSTCON_PHY (1 << 0) |
47 | 48 | ||
48 | #define S3C_PHYTUNE S3C_HSOTG_PHYREG(0x20) | 49 | #define S3C_PHYTUNE S3C_HSOTG_PHYREG(0x20) |
diff --git a/arch/arm/plat-samsung/include/plat/udc-hs.h b/arch/arm/plat-samsung/include/plat/udc-hs.h index a22a4f2eea94..c9e3667cb2b1 100644 --- a/arch/arm/plat-samsung/include/plat/udc-hs.h +++ b/arch/arm/plat-samsung/include/plat/udc-hs.h | |||
@@ -26,4 +26,9 @@ enum s3c_hsotg_dmamode { | |||
26 | struct s3c_hsotg_plat { | 26 | struct s3c_hsotg_plat { |
27 | enum s3c_hsotg_dmamode dma; | 27 | enum s3c_hsotg_dmamode dma; |
28 | unsigned int is_osc : 1; | 28 | unsigned int is_osc : 1; |
29 | |||
30 | int (*phy_init)(struct platform_device *pdev, int type); | ||
31 | int (*phy_exit)(struct platform_device *pdev, int type); | ||
29 | }; | 32 | }; |
33 | |||
34 | extern void s3c_hsotg_set_platdata(struct s3c_hsotg_plat *pd); | ||