hh.org updates
[hh.org.git] / arch / arm / mach-pxa / asus730 / a730_mmc.c
blob4922acad4a1ac821504fef7ab8213f07671fcf5a
1 /*
2 * Based on arch/arm/mach-pxa/mainstone.h
4 */
6 #include <linux/config.h>
7 #include <linux/init.h>
8 #include <linux/platform_device.h>
9 #include <linux/irq.h>
11 #include <asm/arch/mmc.h>
12 #include <asm/hardware.h>
14 #include <asm/mach/arch.h>
15 #include <asm/mach/map.h>
16 #include <asm/mach-types.h>
18 #include <asm/arch/pxa-regs.h>
19 #include <asm/arch/asus730-gpio.h>
21 static int a730_mci_init(struct device *dev, irqreturn_t (*a730_detect_int)(int, void *, struct pt_regs *), void *data)
23 int err;
24 printk("%s\n", __FUNCTION__);
26 * setup GPIO for PXA27x MMC controller
29 pxa_gpio_mode(GPIO32_MMCCLK_MD);
30 pxa_gpio_mode(GPIO92_MMCDAT0_MD);
31 pxa_gpio_mode(GPIO109_MMCDAT1_MD);
32 pxa_gpio_mode(GPIO110_MMCDAT2_MD);
33 pxa_gpio_mode(GPIO111_MMCDAT3_MD);
34 pxa_gpio_mode(GPIO112_MMCCMD_MD);
36 set_irq_type(A730_IRQ(SD_DETECT_N), IRQF_TRIGGET_RISING | IRQF_TRIGGER_FALLING);
37 err = request_irq(A730_IRQ(SD_DETECT_N), a730_detect_int, IRQF_DISABLED, "SD/MMC card detect", data);
38 if (err) {
39 printk(KERN_ERR "a730_mci_init: SD/MMC: can't request SD/MMC card detect IRQ\n");
40 return -1;
43 return 0;
46 static void a730_mci_setpower(struct device *dev, unsigned int vdd)
48 struct pxamci_platform_data* p_d = dev->platform_data;
49 printk("%s\n", __FUNCTION__);
50 if (( 1 << vdd) & p_d->ocr_mask)
52 printk(KERN_DEBUG "%s: on\n", __FUNCTION__);
53 SET_A730_GPIO(SD_PWR, 0);
55 else
57 printk(KERN_DEBUG "%s: off\n", __FUNCTION__);
58 SET_A730_GPIO(SD_PWR, 1);
62 static int a730_mci_get_ro(struct device *dev)
64 return GET_A730_GPIO(SD_RO);
67 static void a730_mci_exit(struct device *dev, void *data)
69 printk("%s\n", __FUNCTION__);
70 free_irq(A730_IRQ(SD_DETECT_N), data);
73 static struct pxamci_platform_data a730_mci_platform_data = {
74 .ocr_mask = MMC_VDD_32_33 | MMC_VDD_33_34,
75 .init = a730_mci_init,
76 .setpower = a730_mci_setpower,
77 .get_ro = a730_mci_get_to,
78 .exit = a730_mci_exit,
81 static int __init a730_mci_mod_init(void)
83 if (!machine_is_a730()) return -ENODEV;
84 printk("%s\n", __FUNCTION__);
85 pxa_set_mci_info(&a730_mci_platform_data);
86 return 0;
89 static void __exit a730_mci_mod_exit(void)
91 //printk("%s\n",__PRETTY_FUNCTION__);
92 //platform_device_unregister(&a730_pcmcia_device);
95 module_init(a730_mci_mod_init);
96 module_exit(a730_mci_mod_exit);
98 MODULE_LICENSE("GPL");
99 MODULE_AUTHOR("Serge Nikolaenko <mypal_hh@utl.ru>");
100 MODULE_DESCRIPTION("MCI platform support for Asus MyPal 730");