diff options
-rw-r--r-- | arch/arm/mach-pxa/poodle.c | 89 |
1 files changed, 71 insertions, 18 deletions
diff --git a/arch/arm/mach-pxa/poodle.c b/arch/arm/mach-pxa/poodle.c index 8972dccab5cf..00f0c897e5f8 100644 --- a/arch/arm/mach-pxa/poodle.c +++ b/arch/arm/mach-pxa/poodle.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <linux/fb.h> | 20 | #include <linux/fb.h> |
21 | #include <linux/pm.h> | 21 | #include <linux/pm.h> |
22 | #include <linux/delay.h> | 22 | #include <linux/delay.h> |
23 | #include <linux/gpio.h> | ||
23 | 24 | ||
24 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
25 | #include <asm/mach-types.h> | 26 | #include <asm/mach-types.h> |
@@ -208,19 +209,51 @@ static int poodle_mci_init(struct device *dev, irq_handler_t poodle_detect_int, | |||
208 | /* setup GPIO for PXA25x MMC controller */ | 209 | /* setup GPIO for PXA25x MMC controller */ |
209 | pxa_gpio_mode(GPIO6_MMCCLK_MD); | 210 | pxa_gpio_mode(GPIO6_MMCCLK_MD); |
210 | pxa_gpio_mode(GPIO8_MMCCS0_MD); | 211 | pxa_gpio_mode(GPIO8_MMCCS0_MD); |
211 | pxa_gpio_mode(POODLE_GPIO_nSD_DETECT | GPIO_IN); | 212 | |
212 | pxa_gpio_mode(POODLE_GPIO_nSD_WP | GPIO_IN); | 213 | err = gpio_request(POODLE_GPIO_nSD_DETECT, "nSD_DETECT"); |
213 | pxa_gpio_mode(POODLE_GPIO_SD_PWR | GPIO_OUT); | 214 | if (err) |
214 | pxa_gpio_mode(POODLE_GPIO_SD_PWR1 | GPIO_OUT); | 215 | goto err_out; |
216 | |||
217 | err = gpio_request(POODLE_GPIO_nSD_WP, "nSD_WP"); | ||
218 | if (err) | ||
219 | goto err_free_1; | ||
220 | |||
221 | err = gpio_request(POODLE_GPIO_SD_PWR, "SD_PWR"); | ||
222 | if (err) | ||
223 | goto err_free_2; | ||
224 | |||
225 | err = gpio_request(POODLE_GPIO_SD_PWR1, "SD_PWR1"); | ||
226 | if (err) | ||
227 | goto err_free_3; | ||
228 | |||
229 | gpio_direction_input(POODLE_GPIO_nSD_DETECT); | ||
230 | gpio_direction_input(POODLE_GPIO_nSD_WP); | ||
231 | |||
232 | gpio_direction_output(POODLE_GPIO_SD_PWR, 0); | ||
233 | gpio_direction_output(POODLE_GPIO_SD_PWR1, 0); | ||
215 | 234 | ||
216 | poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250); | 235 | poodle_mci_platform_data.detect_delay = msecs_to_jiffies(250); |
217 | 236 | ||
218 | err = request_irq(POODLE_IRQ_GPIO_nSD_DETECT, poodle_detect_int, | 237 | err = request_irq(POODLE_IRQ_GPIO_nSD_DETECT, poodle_detect_int, |
219 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, | 238 | IRQF_DISABLED | IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, |
220 | "MMC card detect", data); | 239 | "MMC card detect", data); |
221 | if (err) | 240 | if (err) { |
222 | printk(KERN_ERR "poodle_mci_init: MMC/SD: can't request MMC card detect IRQ\n"); | 241 | pr_err("%s: MMC/SD: can't request MMC card detect IRQ\n", |
242 | __func__); | ||
243 | goto err_free_4; | ||
244 | } | ||
245 | |||
246 | return 0; | ||
223 | 247 | ||
248 | err_free_4: | ||
249 | gpio_free(POODLE_GPIO_SD_PWR1); | ||
250 | err_free_3: | ||
251 | gpio_free(POODLE_GPIO_SD_PWR); | ||
252 | err_free_2: | ||
253 | gpio_free(POODLE_GPIO_nSD_WP); | ||
254 | err_free_1: | ||
255 | gpio_free(POODLE_GPIO_nSD_DETECT); | ||
256 | err_out: | ||
224 | return err; | 257 | return err; |
225 | } | 258 | } |
226 | 259 | ||
@@ -228,18 +261,19 @@ static void poodle_mci_setpower(struct device *dev, unsigned int vdd) | |||
228 | { | 261 | { |
229 | struct pxamci_platform_data* p_d = dev->platform_data; | 262 | struct pxamci_platform_data* p_d = dev->platform_data; |
230 | 263 | ||
231 | if (( 1 << vdd) & p_d->ocr_mask) { | 264 | if ((1 << vdd) & p_d->ocr_mask) { |
232 | GPSR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR); | 265 | gpio_set_value(POODLE_GPIO_SD_PWR, 1); |
233 | mdelay(2); | 266 | mdelay(2); |
234 | GPSR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1); | 267 | gpio_set_value(POODLE_GPIO_SD_PWR1, 1); |
235 | } else { | 268 | } else { |
236 | GPCR(POODLE_GPIO_SD_PWR1) = GPIO_bit(POODLE_GPIO_SD_PWR1); | 269 | gpio_set_value(POODLE_GPIO_SD_PWR1, 0); |
237 | GPCR(POODLE_GPIO_SD_PWR) = GPIO_bit(POODLE_GPIO_SD_PWR); | 270 | gpio_set_value(POODLE_GPIO_SD_PWR, 0); |
238 | } | 271 | } |
239 | } | 272 | } |
240 | 273 | ||
241 | static int poodle_mci_get_ro(struct device *dev) | 274 | static int poodle_mci_get_ro(struct device *dev) |
242 | { | 275 | { |
276 | return !!gpio_get_value(POODLE_GPIO_nSD_WP); | ||
243 | return GPLR(POODLE_GPIO_nSD_WP) & GPIO_bit(POODLE_GPIO_nSD_WP); | 277 | return GPLR(POODLE_GPIO_nSD_WP) & GPIO_bit(POODLE_GPIO_nSD_WP); |
244 | } | 278 | } |
245 | 279 | ||
@@ -247,6 +281,10 @@ static int poodle_mci_get_ro(struct device *dev) | |||
247 | static void poodle_mci_exit(struct device *dev, void *data) | 281 | static void poodle_mci_exit(struct device *dev, void *data) |
248 | { | 282 | { |
249 | free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data); | 283 | free_irq(POODLE_IRQ_GPIO_nSD_DETECT, data); |
284 | gpio_free(POODLE_GPIO_SD_PWR1); | ||
285 | gpio_free(POODLE_GPIO_SD_PWR); | ||
286 | gpio_free(POODLE_GPIO_nSD_WP); | ||
287 | gpio_free(POODLE_GPIO_nSD_DETECT); | ||
250 | } | 288 | } |
251 | 289 | ||
252 | static struct pxamci_platform_data poodle_mci_platform_data = { | 290 | static struct pxamci_platform_data poodle_mci_platform_data = { |
@@ -263,17 +301,32 @@ static struct pxamci_platform_data poodle_mci_platform_data = { | |||
263 | */ | 301 | */ |
264 | static void poodle_irda_transceiver_mode(struct device *dev, int mode) | 302 | static void poodle_irda_transceiver_mode(struct device *dev, int mode) |
265 | { | 303 | { |
266 | if (mode & IR_OFF) { | 304 | gpio_set_value(POODLE_GPIO_IR_ON, mode & IR_OFF); |
267 | GPSR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON); | ||
268 | } else { | ||
269 | GPCR(POODLE_GPIO_IR_ON) = GPIO_bit(POODLE_GPIO_IR_ON); | ||
270 | } | ||
271 | pxa2xx_transceiver_mode(dev, mode); | 305 | pxa2xx_transceiver_mode(dev, mode); |
272 | } | 306 | } |
273 | 307 | ||
308 | static int poodle_irda_startup(struct device *dev) | ||
309 | { | ||
310 | int err; | ||
311 | |||
312 | err = gpio_request(POODLE_GPIO_IR_ON, "IR_ON"); | ||
313 | if (err) | ||
314 | return err; | ||
315 | |||
316 | gpio_direction_output(POODLE_GPIO_IR_ON, 1); | ||
317 | return 0; | ||
318 | } | ||
319 | |||
320 | static void poodle_irda_shutdown(struct device *dev) | ||
321 | { | ||
322 | gpio_free(POODLE_GPIO_IR_ON); | ||
323 | } | ||
324 | |||
274 | static struct pxaficp_platform_data poodle_ficp_platform_data = { | 325 | static struct pxaficp_platform_data poodle_ficp_platform_data = { |
275 | .transceiver_cap = IR_SIRMODE | IR_OFF, | 326 | .transceiver_cap = IR_SIRMODE | IR_OFF, |
276 | .transceiver_mode = poodle_irda_transceiver_mode, | 327 | .transceiver_mode = poodle_irda_transceiver_mode, |
328 | .startup = poodle_irda_startup, | ||
329 | .shutdown = poodle_irda_shutdown, | ||
277 | }; | 330 | }; |
278 | 331 | ||
279 | 332 | ||