aboutsummaryrefslogtreecommitdiffstats
path: root/packages/linux/linux-ezx-2.6.21/patches/e680-mci.patch
blob: b5bb2931f17d44e7d8e59878bc5c9a23651c2880 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
Index: linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c
===================================================================
--- linux-2.6.21.orig/arch/arm/mach-pxa/ezx-e680.c	2007-05-24 00:43:08.000000000 -0300
+++ linux-2.6.21/arch/arm/mach-pxa/ezx-e680.c	2007-05-24 00:48:20.000000000 -0300
@@ -13,11 +13,14 @@
 #include <linux/init.h>
 #include <linux/platform_device.h>
 #include <linux/fb.h>
+#include <linux/mmc/host.h>
+#include <linux/irq.h>
 
 #include <asm/mach-types.h>
 #include <asm/mach/arch.h>
 #include <asm/arch/pxa-regs.h>
 #include <asm/arch/pxafb.h>
+#include <asm/arch/mmc.h>
 
 #include "generic.h"
 #include "ezx.h"
@@ -25,6 +28,99 @@
 extern void ezx_lcd_power(int, struct fb_var_screeninfo *);
 extern void ezx_backlight_power(int);
 
+#ifdef CONFIG_EZX_PCAP
+extern int ezx_pcap_mmcsd_power(int);
+extern void ezx_pcap_mmcsd_voltage(u_int32_t);
+#else
+#define ezx_pcap_mmcsd_voltage(x) {}
+#define ezx_pcap_mmcsd_power(x) {}
+#endif
+
+static struct pxamci_platform_data e680_mci_platform_data;
+
+static u_int8_t mmc_voltage[] = {
+	[MMC_VDD_160] = 3,
+	[MMC_VDD_170] = 3,
+	[MMC_VDD_180] = 3,
+	[MMC_VDD_190] = 3,
+	[MMC_VDD_200] = 3,
+	[MMC_VDD_210] = 3,
+	[MMC_VDD_220] = 3,
+	[MMC_VDD_230] = 3,
+	[MMC_VDD_240] = 3,
+	[MMC_VDD_250] = 3,
+	[MMC_VDD_260] = 3,
+	[MMC_VDD_270] = 3,
+	[MMC_VDD_280] = 3,
+	[MMC_VDD_290] = 3,
+	[MMC_VDD_300] = 3,
+	[MMC_VDD_310] = 3,
+	[MMC_VDD_320] = 3,
+	[MMC_VDD_330] = 3,
+	[MMC_VDD_340] = 3,
+	[MMC_VDD_350] = 3,
+	[MMC_VDD_360] = 3,
+};
+
+static int e680_mci_init(struct device *dev,
+                       irqreturn_t (*ezx_detect_int)(int, void *),
+                       void *data)
+{
+       int err;
+
+       /* Setup GPIO for PXA27x MMC/SD controller */
+       pxa_gpio_mode(GPIO32_MMCCLK_MD);
+       pxa_gpio_mode(GPIO112_MMCCMD_MD);
+       pxa_gpio_mode(GPIO92_MMCDAT0_MD);
+       pxa_gpio_mode(GPIO109_MMCDAT1_MD);
+       pxa_gpio_mode(GPIO110_MMCDAT2_MD);
+       pxa_gpio_mode(GPIO111_MMCDAT3_MD);
+
+       ezx_pcap_mmcsd_power(1);
+
+       e680_mci_platform_data.detect_delay = msecs_to_jiffies(250);
+
+       err = request_irq(0x49, ezx_detect_int, SA_INTERRUPT,
+                       "MMC card detect", data);
+       if (err) {
+               printk(KERN_ERR "ezx_mci_detect: MMC/SD: can't request "
+                       "MMC card detect IRQ\n");
+               return -1;
+       }
+
+       set_irq_type(0x0b, IRQT_BOTHEDGE);
+
+       return 0;
+}
+
+
+static inline int e680_mci_get_ro(struct device *dev)
+{
+        return (GPLR3 & 0x800);
+}
+
+static void e680_mci_setpower(struct device *dev, unsigned int vdd)
+{
+        if (vdd <= MMC_VDD_360)
+                ezx_pcap_mmcsd_voltage(mmc_voltage[vdd]);
+
+        ezx_pcap_mmcsd_power(1);
+}
+
+static void e680_mci_exit(struct device *dev, void *data)
+{
+	ezx_pcap_mmcsd_power(0);
+	free_irq(0x49, data);
+}
+
+static struct pxamci_platform_data e680_mci_platform_data = {
+	.ocr_mask       = MMC_VDD_27_28,
+	.init           = e680_mci_init,
+	.get_ro		= e680_mci_get_ro,
+	.setpower       = e680_mci_setpower,
+	.exit           = e680_mci_exit,
+};
+
 static struct pxafb_mode_info mode_e680 = {
 	.pixclock	= 150000,
 	.xres		= 240,
@@ -65,6 +161,7 @@
 	PSLR  = 0x05800f00;
 
 	set_pxa_fb_info(&e680_fb_info);
+	pxa_set_mci_info(&e680_mci_platform_data);
 
         /* clear EMU MUX1/MUX2 (low) to close the audio path to EMU */
 	pxa_gpio_mode(GPIO_EMU_MUX1|GPIO_OUT);
Index: linux-2.6.21/arch/arm/mach-pxa/Kconfig
===================================================================
--- linux-2.6.21.orig/arch/arm/mach-pxa/Kconfig	2007-05-24 00:48:28.000000000 -0300
+++ linux-2.6.21/arch/arm/mach-pxa/Kconfig	2007-05-24 00:48:55.000000000 -0300
@@ -83,6 +83,7 @@
 config PXA_EZX_E680
 	bool "Motorola E680 GSM Phone"
 	select PXA27x
+	select EZX_MCI_SD
 
 config PXA_EZX_A780
 	bool "Motorola A780 GSM Phone"