aboutsummaryrefslogtreecommitdiffstats
path: root/arch/arm/mach-pxa/palmz72.c
diff options
context:
space:
mode:
authorRobert Jarzmik <robert.jarzmik@free.fr>2009-07-06 16:16:42 -0400
committerEric Miao <eric.y.miao@gmail.com>2009-09-10 06:49:30 -0400
commit7a648256b20c493c99757fe1d248daf7954647bc (patch)
tree82aa6566accc96ea07a89121cb9779090a6dab40 /arch/arm/mach-pxa/palmz72.c
parentb405db6c015fe8e4c9d8199a0355bb16d95d7049 (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.c88
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 ******************************************************************************/
132static 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
174err5:
175 gpio_free(GPIO_NR_PALMZ72_SD_RO);
176err4:
177 gpio_free(GPIO_NR_PALMZ72_SD_POWER_N);
178err3:
179 free_irq(gpio_to_irq(GPIO_NR_PALMZ72_SD_DETECT_N), data);
180err2:
181 gpio_free(GPIO_NR_PALMZ72_SD_DETECT_N);
182err:
183 return err;
184}
185
186static 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
194static 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
203static int palmz72_mci_ro(struct device *dev)
204{
205 return gpio_get_value(GPIO_NR_PALMZ72_SD_RO);
206}
207
208static struct pxamci_platform_data palmz72_mci_platform_data = { 134static 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/******************************************************************************