Commit | Line | Data |
---|---|---|
3db3ae5e | 1 | /* linux/arch/arm/mach-exynos4/setup-sdhci-gpio.c |
19315114 | 2 | * |
3db3ae5e KK |
3 | * Copyright (c) 2010-2011 Samsung Electronics Co., Ltd. |
4 | * http://www.samsung.com | |
19315114 | 5 | * |
3db3ae5e | 6 | * EXYNOS4 - Helper functions for setting up SDHCI device(s) GPIO (HSMMC) |
19315114 HL |
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 version 2 as | |
10 | * published by the Free Software Foundation. | |
11 | */ | |
12 | ||
13 | #include <linux/kernel.h> | |
14 | #include <linux/types.h> | |
15 | #include <linux/interrupt.h> | |
16 | #include <linux/platform_device.h> | |
17 | #include <linux/io.h> | |
18 | #include <linux/gpio.h> | |
19 | #include <linux/mmc/host.h> | |
20 | #include <linux/mmc/card.h> | |
21 | ||
22 | #include <plat/gpio-cfg.h> | |
23 | #include <plat/regs-sdhci.h> | |
24 | #include <plat/sdhci.h> | |
25 | ||
3db3ae5e | 26 | void exynos4_setup_sdhci0_cfg_gpio(struct platform_device *dev, int width) |
19315114 HL |
27 | { |
28 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | |
29 | unsigned int gpio; | |
30 | ||
31 | /* Set all the necessary GPK0[0:1] pins to special-function 2 */ | |
3db3ae5e | 32 | for (gpio = EXYNOS4_GPK0(0); gpio < EXYNOS4_GPK0(2); gpio++) { |
19315114 HL |
33 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); |
34 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | |
35 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
36 | } | |
37 | ||
38 | switch (width) { | |
39 | case 8: | |
3db3ae5e | 40 | for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) { |
25985edc | 41 | /* Data pin GPK1[3:6] to special-function 3 */ |
19315114 HL |
42 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); |
43 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
44 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
45 | } | |
46 | case 4: | |
3db3ae5e | 47 | for (gpio = EXYNOS4_GPK0(3); gpio <= EXYNOS4_GPK0(6); gpio++) { |
25985edc | 48 | /* Data pin GPK0[3:6] to special-function 2 */ |
19315114 HL |
49 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); |
50 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
51 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
52 | } | |
53 | default: | |
54 | break; | |
55 | } | |
56 | ||
57 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | |
3db3ae5e KK |
58 | s3c_gpio_cfgpin(EXYNOS4_GPK0(2), S3C_GPIO_SFN(2)); |
59 | s3c_gpio_setpull(EXYNOS4_GPK0(2), S3C_GPIO_PULL_UP); | |
19315114 HL |
60 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); |
61 | } | |
62 | } | |
63 | ||
3db3ae5e | 64 | void exynos4_setup_sdhci1_cfg_gpio(struct platform_device *dev, int width) |
19315114 HL |
65 | { |
66 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | |
67 | unsigned int gpio; | |
68 | ||
69 | /* Set all the necessary GPK1[0:1] pins to special-function 2 */ | |
3db3ae5e | 70 | for (gpio = EXYNOS4_GPK1(0); gpio < EXYNOS4_GPK1(2); gpio++) { |
19315114 HL |
71 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); |
72 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | |
73 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
74 | } | |
75 | ||
3db3ae5e | 76 | for (gpio = EXYNOS4_GPK1(3); gpio <= EXYNOS4_GPK1(6); gpio++) { |
19315114 HL |
77 | /* Data pin GPK1[3:6] to special-function 2 */ |
78 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | |
79 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
80 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
81 | } | |
82 | ||
83 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | |
3db3ae5e KK |
84 | s3c_gpio_cfgpin(EXYNOS4_GPK1(2), S3C_GPIO_SFN(2)); |
85 | s3c_gpio_setpull(EXYNOS4_GPK1(2), S3C_GPIO_PULL_UP); | |
19315114 HL |
86 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); |
87 | } | |
88 | } | |
89 | ||
3db3ae5e | 90 | void exynos4_setup_sdhci2_cfg_gpio(struct platform_device *dev, int width) |
19315114 HL |
91 | { |
92 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | |
93 | unsigned int gpio; | |
94 | ||
95 | /* Set all the necessary GPK2[0:1] pins to special-function 2 */ | |
3db3ae5e | 96 | for (gpio = EXYNOS4_GPK2(0); gpio < EXYNOS4_GPK2(2); gpio++) { |
19315114 HL |
97 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); |
98 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | |
99 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
100 | } | |
101 | ||
102 | switch (width) { | |
103 | case 8: | |
3db3ae5e | 104 | for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) { |
19315114 HL |
105 | /* Data pin GPK3[3:6] to special-function 3 */ |
106 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(3)); | |
107 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
108 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
109 | } | |
110 | case 4: | |
3db3ae5e | 111 | for (gpio = EXYNOS4_GPK2(3); gpio <= EXYNOS4_GPK2(6); gpio++) { |
19315114 HL |
112 | /* Data pin GPK2[3:6] to special-function 2 */ |
113 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | |
114 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
115 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
116 | } | |
117 | default: | |
118 | break; | |
119 | } | |
120 | ||
121 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | |
3db3ae5e KK |
122 | s3c_gpio_cfgpin(EXYNOS4_GPK2(2), S3C_GPIO_SFN(2)); |
123 | s3c_gpio_setpull(EXYNOS4_GPK2(2), S3C_GPIO_PULL_UP); | |
19315114 HL |
124 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); |
125 | } | |
126 | } | |
127 | ||
3db3ae5e | 128 | void exynos4_setup_sdhci3_cfg_gpio(struct platform_device *dev, int width) |
19315114 HL |
129 | { |
130 | struct s3c_sdhci_platdata *pdata = dev->dev.platform_data; | |
131 | unsigned int gpio; | |
132 | ||
133 | /* Set all the necessary GPK3[0:1] pins to special-function 2 */ | |
3db3ae5e | 134 | for (gpio = EXYNOS4_GPK3(0); gpio < EXYNOS4_GPK3(2); gpio++) { |
19315114 HL |
135 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); |
136 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_NONE); | |
137 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
138 | } | |
139 | ||
3db3ae5e | 140 | for (gpio = EXYNOS4_GPK3(3); gpio <= EXYNOS4_GPK3(6); gpio++) { |
19315114 HL |
141 | /* Data pin GPK3[3:6] to special-function 2 */ |
142 | s3c_gpio_cfgpin(gpio, S3C_GPIO_SFN(2)); | |
143 | s3c_gpio_setpull(gpio, S3C_GPIO_PULL_UP); | |
144 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); | |
145 | } | |
146 | ||
147 | if (pdata->cd_type == S3C_SDHCI_CD_INTERNAL) { | |
3db3ae5e KK |
148 | s3c_gpio_cfgpin(EXYNOS4_GPK3(2), S3C_GPIO_SFN(2)); |
149 | s3c_gpio_setpull(EXYNOS4_GPK3(2), S3C_GPIO_PULL_UP); | |
19315114 HL |
150 | s5p_gpio_set_drvstr(gpio, S5P_GPIO_DRVSTR_LV4); |
151 | } | |
152 | } |