diff options
author | Robert Jarzmik <robert.jarzmik@free.fr> | 2009-07-06 16:16:42 -0400 |
---|---|---|
committer | Eric Miao <eric.y.miao@gmail.com> | 2009-09-10 06:49:30 -0400 |
commit | 7a648256b20c493c99757fe1d248daf7954647bc (patch) | |
tree | 82aa6566accc96ea07a89121cb9779090a6dab40 /arch/arm/mach-pxa/palmz72.c | |
parent | b405db6c015fe8e4c9d8199a0355bb16d95d7049 (diff) |
[ARM] pxa: factor pxamci gpio handling
Several boards use always the same pattern with pxamci :
request gpio, request irq for that gpio to detect MMC card
insertion, request gpio for read-only mode detection, etc
...
Now that pxamci provides platform_data to describe simple
gpio management of the MMC external controls, use it.
Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Acked-by: Mike Rapoport <mike@compulab.co.il>
Acked-by: Philipp Zabel <philipp.zabel@gmail.com>
Acked-by: Dmitry Eremin-Solenikov <dbaryshkov@gmail.com>
Cc: rpurdie@rpsys.net
Cc: drwyrm@gmail.com
Cc: sakoman@gmail.com
Cc: marek.vasut@gmail.com
Cc: s.hauer@pengutronix.de
Signed-off-by: Eric Miao <eric.y.miao@gmail.com>
Diffstat (limited to 'arch/arm/mach-pxa/palmz72.c')
-rw-r--r-- | arch/arm/mach-pxa/palmz72.c | 88 |
1 files changed, 7 insertions, 81 deletions
diff --git a/arch/arm/mach-pxa/palmz72.c b/arch/arm/mach-pxa/palmz72.c index c3645aa3fa3d..d8fa53c19178 100644 --- a/arch/arm/mach-pxa/palmz72.c +++ b/arch/arm/mach-pxa/palmz72.c | |||
@@ -129,88 +129,14 @@ static unsigned long palmz72_pin_config[] __initdata = { | |||
129 | /****************************************************************************** | 129 | /****************************************************************************** |
130 | * SD/MMC card controller | 130 | * SD/MMC card controller |
131 | ******************************************************************************/ | 131 | ******************************************************************************/ |
132 | static int palmz72_mci_init(struct device *dev, | 132 | /* SD_POWER is not actually power, but it is more like chip |
133 | irq_handler_t palmz72_detect_int, void *data) | 133 | * select, i.e. it is inverted */ |
134 | { | ||
135 | int err = 0; | ||
136 | |||
137 | /* Setup an interrupt for detecting card insert/remove events */ | ||
138 | err = gpio_request(GPIO_NR_PALMZ72_SD_DETECT_N, "SD IRQ"); | ||
139 | if (err) | ||
140 | goto err; | ||
141 | err = gpio_direction_input(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
142 | if (err) | ||
143 | goto err2; | ||
144 | err = request_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), | ||
145 | palmz72_detect_int, IRQF_DISABLED | IRQF_SAMPLE_RANDOM | | ||
146 | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING, | ||
147 | "SD/MMC card detect", data); | ||
148 | if (err) { | ||
149 | printk(KERN_ERR "%s: cannot request SD/MMC card detect IRQ\n", | ||
150 | __func__); | ||
151 | goto err2; | ||
152 | } | ||
153 | |||
154 | /* SD_POWER is not actually power, but it is more like chip | ||
155 | * select, i.e. it is inverted */ | ||
156 | |||
157 | err = gpio_request(GPIO_NR_PALMZ72_SD_POWER_N, "SD_POWER"); | ||
158 | if (err) | ||
159 | goto err3; | ||
160 | err = gpio_direction_output(GPIO_NR_PALMZ72_SD_POWER_N, 0); | ||
161 | if (err) | ||
162 | goto err4; | ||
163 | err = gpio_request(GPIO_NR_PALMZ72_SD_RO, "SD_RO"); | ||
164 | if (err) | ||
165 | goto err4; | ||
166 | err = gpio_direction_input(GPIO_NR_PALMZ72_SD_RO); | ||
167 | if (err) | ||
168 | goto err5; | ||
169 | |||
170 | printk(KERN_DEBUG "%s: irq registered\n", __func__); | ||
171 | |||
172 | return 0; | ||
173 | |||
174 | err5: | ||
175 | gpio_free(GPIO_NR_PALMZ72_SD_RO); | ||
176 | err4: | ||
177 | gpio_free(GPIO_NR_PALMZ72_SD_POWER_N); | ||
178 | err3: | ||
179 | free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data); | ||
180 | err2: | ||
181 | gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
182 | err: | ||
183 | return err; | ||
184 | } | ||
185 | |||
186 | static void palmz72_mci_exit(struct device *dev, void *data) | ||
187 | { | ||
188 | gpio_free(GPIO_NR_PALMZ72_SD_POWER_N); | ||
189 | free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data); | ||
190 | gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N); | ||
191 | gpio_free(GPIO_NR_PALMZ72_SD_RO); | ||
192 | } | ||
193 | |||
194 | static void palmz72_mci_power(struct device *dev, unsigned int vdd) | ||
195 | { | ||
196 | struct pxamci_platform_data *p_d = dev->platform_data; | ||
197 | if (p_d->ocr_mask & (1 << vdd)) | ||
198 | gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 0); | ||
199 | else | ||
200 | gpio_set_value(GPIO_NR_PALMZ72_SD_POWER_N, 1); | ||
201 | } | ||
202 | |||
203 | static int palmz72_mci_ro(struct device *dev) | ||
204 | { | ||
205 | return gpio_get_value(GPIO_NR_PALMZ72_SD_RO); | ||
206 | } | ||
207 | |||
208 | static struct pxamci_platform_data palmz72_mci_platform_data = { | 134 | static struct pxamci_platform_data palmz72_mci_platform_data = { |
209 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, | 135 | .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34, |
210 | .setpower = palmz72_mci_power, | 136 | .gpio_card_detect = GPIO_NR_PALMZ72_SD_DETECT_N, |
211 | .get_ro = palmz72_mci_ro, | 137 | .gpio_card_ro = GPIO_NR_PALMZ72_SD_RO, |
212 | .init = palmz72_mci_init, | 138 | .gpio_power = GPIO_NR_PALMZ72_SD_POWER_N, |
213 | .exit = palmz72_mci_exit, | 139 | .gpio_power_invert = 1, |
214 | }; | 140 | }; |
215 | 141 | ||
216 | /****************************************************************************** | 142 | /****************************************************************************** |