diff options
-rw-r--r-- | arch/arm/mach-pxa/e330.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-pxa/e350.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-pxa/e400.c | 65 | ||||
-rw-r--r-- | arch/arm/mach-pxa/e740.c | 46 | ||||
-rw-r--r-- | arch/arm/mach-pxa/e750.c | 36 | ||||
-rw-r--r-- | arch/arm/mach-pxa/e800.c | 30 | ||||
-rw-r--r-- | arch/arm/mach-pxa/eseries.c | 124 | ||||
-rw-r--r-- | arch/arm/mach-pxa/eseries.h | 12 | ||||
-rw-r--r-- | arch/arm/mach-pxa/include/mach/eseries-gpio.h | 4 | ||||
-rw-r--r-- | drivers/pcmcia/Kconfig | 2 | ||||
-rw-r--r-- | drivers/pcmcia/Makefile | 1 | ||||
-rw-r--r-- | drivers/pcmcia/pxa2xx_e740.c | 176 |
12 files changed, 558 insertions, 10 deletions
diff --git a/arch/arm/mach-pxa/e330.c b/arch/arm/mach-pxa/e330.c index d488eded2058..1bd7f740427c 100644 --- a/arch/arm/mach-pxa/e330.c +++ b/arch/arm/mach-pxa/e330.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Hardware definitions for the Toshiba eseries PDAs | 2 | * Hardware definitions for the Toshiba e330 PDAs |
3 | * | 3 | * |
4 | * Copyright (c) 2003 Ian Molton <spyro@f2s.com> | 4 | * Copyright (c) 2003 Ian Molton <spyro@f2s.com> |
5 | * | 5 | * |
@@ -12,6 +12,9 @@ | |||
12 | 12 | ||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mfd/tc6387xb.h> | ||
15 | 18 | ||
16 | #include <asm/setup.h> | 19 | #include <asm/setup.h> |
17 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
@@ -19,13 +22,44 @@ | |||
19 | 22 | ||
20 | #include <mach/mfp-pxa25x.h> | 23 | #include <mach/mfp-pxa25x.h> |
21 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
25 | #include <mach/pxa-regs.h> | ||
26 | #include <mach/eseries-gpio.h> | ||
22 | #include <mach/udc.h> | 27 | #include <mach/udc.h> |
23 | 28 | ||
24 | #include "generic.h" | 29 | #include "generic.h" |
25 | #include "eseries.h" | 30 | #include "eseries.h" |
31 | #include "clock.h" | ||
32 | |||
33 | /* -------------------- e330 tc6387xb parameters -------------------- */ | ||
34 | |||
35 | static struct tc6387xb_platform_data e330_tc6387xb_info = { | ||
36 | .enable = &eseries_tmio_enable, | ||
37 | .disable = &eseries_tmio_disable, | ||
38 | .suspend = &eseries_tmio_suspend, | ||
39 | .resume = &eseries_tmio_resume, | ||
40 | }; | ||
41 | |||
42 | static struct platform_device e330_tc6387xb_device = { | ||
43 | .name = "tc6387xb", | ||
44 | .id = -1, | ||
45 | .dev = { | ||
46 | .platform_data = &e330_tc6387xb_info, | ||
47 | }, | ||
48 | .num_resources = 2, | ||
49 | .resource = eseries_tmio_resources, | ||
50 | }; | ||
51 | |||
52 | /* --------------------------------------------------------------- */ | ||
53 | |||
54 | static struct platform_device *devices[] __initdata = { | ||
55 | &e330_tc6387xb_device, | ||
56 | }; | ||
26 | 57 | ||
27 | static void __init e330_init(void) | 58 | static void __init e330_init(void) |
28 | { | 59 | { |
60 | eseries_register_clks(); | ||
61 | eseries_get_tmio_gpios(); | ||
62 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
29 | pxa_set_udc_info(&e7xx_udc_mach_info); | 63 | pxa_set_udc_info(&e7xx_udc_mach_info); |
30 | } | 64 | } |
31 | 65 | ||
diff --git a/arch/arm/mach-pxa/e350.c b/arch/arm/mach-pxa/e350.c index 8ecbc5479828..251129391d7d 100644 --- a/arch/arm/mach-pxa/e350.c +++ b/arch/arm/mach-pxa/e350.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Hardware definitions for the Toshiba eseries PDAs | 2 | * Hardware definitions for the Toshiba e350 PDAs |
3 | * | 3 | * |
4 | * Copyright (c) 2003 Ian Molton <spyro@f2s.com> | 4 | * Copyright (c) 2003 Ian Molton <spyro@f2s.com> |
5 | * | 5 | * |
@@ -12,20 +12,54 @@ | |||
12 | 12 | ||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mfd/t7l66xb.h> | ||
15 | 18 | ||
16 | #include <asm/setup.h> | 19 | #include <asm/setup.h> |
17 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
18 | #include <asm/mach-types.h> | 21 | #include <asm/mach-types.h> |
19 | 22 | ||
20 | #include <mach/mfp-pxa25x.h> | 23 | #include <mach/mfp-pxa25x.h> |
24 | #include <mach/pxa-regs.h> | ||
21 | #include <mach/hardware.h> | 25 | #include <mach/hardware.h> |
26 | #include <mach/eseries-gpio.h> | ||
22 | #include <mach/udc.h> | 27 | #include <mach/udc.h> |
23 | 28 | ||
24 | #include "generic.h" | 29 | #include "generic.h" |
25 | #include "eseries.h" | 30 | #include "eseries.h" |
31 | #include "clock.h" | ||
32 | |||
33 | /* -------------------- e350 t7l66xb parameters -------------------- */ | ||
34 | |||
35 | static struct t7l66xb_platform_data e350_t7l66xb_info = { | ||
36 | .irq_base = IRQ_BOARD_START, | ||
37 | .enable = &eseries_tmio_enable, | ||
38 | .suspend = &eseries_tmio_suspend, | ||
39 | .resume = &eseries_tmio_resume, | ||
40 | }; | ||
41 | |||
42 | static struct platform_device e350_t7l66xb_device = { | ||
43 | .name = "t7l66xb", | ||
44 | .id = -1, | ||
45 | .dev = { | ||
46 | .platform_data = &e350_t7l66xb_info, | ||
47 | }, | ||
48 | .num_resources = 2, | ||
49 | .resource = eseries_tmio_resources, | ||
50 | }; | ||
51 | |||
52 | /* ---------------------------------------------------------- */ | ||
53 | |||
54 | static struct platform_device *devices[] __initdata = { | ||
55 | &e350_t7l66xb_device, | ||
56 | }; | ||
26 | 57 | ||
27 | static void __init e350_init(void) | 58 | static void __init e350_init(void) |
28 | { | 59 | { |
60 | eseries_register_clks(); | ||
61 | eseries_get_tmio_gpios(); | ||
62 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
29 | pxa_set_udc_info(&e7xx_udc_mach_info); | 63 | pxa_set_udc_info(&e7xx_udc_mach_info); |
30 | } | 64 | } |
31 | 65 | ||
diff --git a/arch/arm/mach-pxa/e400.c b/arch/arm/mach-pxa/e400.c index 544bbaa20621..7716ad0c3b34 100644 --- a/arch/arm/mach-pxa/e400.c +++ b/arch/arm/mach-pxa/e400.c | |||
@@ -12,20 +12,26 @@ | |||
12 | 12 | ||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/clk.h> | ||
16 | #include <linux/platform_device.h> | ||
17 | #include <linux/mfd/t7l66xb.h> | ||
18 | #include <linux/mtd/nand.h> | ||
19 | #include <linux/mtd/partitions.h> | ||
15 | 20 | ||
16 | #include <asm/setup.h> | 21 | #include <asm/setup.h> |
17 | #include <asm/mach/arch.h> | 22 | #include <asm/mach/arch.h> |
18 | #include <asm/mach-types.h> | 23 | #include <asm/mach-types.h> |
19 | 24 | ||
20 | #include <mach/pxa-regs.h> | ||
21 | #include <mach/mfp-pxa25x.h> | 25 | #include <mach/mfp-pxa25x.h> |
26 | #include <mach/pxa-regs.h> | ||
22 | #include <mach/hardware.h> | 27 | #include <mach/hardware.h> |
23 | 28 | #include <mach/eseries-gpio.h> | |
24 | #include <mach/pxafb.h> | 29 | #include <mach/pxafb.h> |
25 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
26 | 31 | ||
27 | #include "generic.h" | 32 | #include "generic.h" |
28 | #include "eseries.h" | 33 | #include "eseries.h" |
34 | #include "clock.h" | ||
29 | 35 | ||
30 | /* ------------------------ E400 LCD definitions ------------------------ */ | 36 | /* ------------------------ E400 LCD definitions ------------------------ */ |
31 | 37 | ||
@@ -65,7 +71,10 @@ static unsigned long e400_pin_config[] __initdata = { | |||
65 | GPIO42_BTUART_RXD, | 71 | GPIO42_BTUART_RXD, |
66 | GPIO43_BTUART_TXD, | 72 | GPIO43_BTUART_TXD, |
67 | GPIO44_BTUART_CTS, | 73 | GPIO44_BTUART_CTS, |
68 | GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | 74 | |
75 | /* TMIO controller */ | ||
76 | GPIO19_GPIO, /* t7l66xb #PCLR */ | ||
77 | GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */ | ||
69 | 78 | ||
70 | /* wakeup */ | 79 | /* wakeup */ |
71 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | 80 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, |
@@ -73,10 +82,60 @@ static unsigned long e400_pin_config[] __initdata = { | |||
73 | 82 | ||
74 | /* ---------------------------------------------------------------------- */ | 83 | /* ---------------------------------------------------------------------- */ |
75 | 84 | ||
85 | static struct mtd_partition partition_a = { | ||
86 | .name = "Internal NAND flash", | ||
87 | .offset = 0, | ||
88 | .size = MTDPART_SIZ_FULL, | ||
89 | }; | ||
90 | |||
91 | static uint8_t scan_ff_pattern[] = { 0xff, 0xff }; | ||
92 | |||
93 | static struct nand_bbt_descr e400_t7l66xb_nand_bbt = { | ||
94 | .options = 0, | ||
95 | .offs = 4, | ||
96 | .len = 2, | ||
97 | .pattern = scan_ff_pattern | ||
98 | }; | ||
99 | |||
100 | static struct tmio_nand_data e400_t7l66xb_nand_config = { | ||
101 | .num_partitions = 1, | ||
102 | .partition = &partition_a, | ||
103 | .badblock_pattern = &e400_t7l66xb_nand_bbt, | ||
104 | }; | ||
105 | |||
106 | static struct t7l66xb_platform_data e400_t7l66xb_info = { | ||
107 | .irq_base = IRQ_BOARD_START, | ||
108 | .enable = &eseries_tmio_enable, | ||
109 | .suspend = &eseries_tmio_suspend, | ||
110 | .resume = &eseries_tmio_resume, | ||
111 | |||
112 | .nand_data = &e400_t7l66xb_nand_config, | ||
113 | }; | ||
114 | |||
115 | static struct platform_device e400_t7l66xb_device = { | ||
116 | .name = "t7l66xb", | ||
117 | .id = -1, | ||
118 | .dev = { | ||
119 | .platform_data = &e400_t7l66xb_info, | ||
120 | }, | ||
121 | .num_resources = 2, | ||
122 | .resource = eseries_tmio_resources, | ||
123 | }; | ||
124 | |||
125 | /* ---------------------------------------------------------- */ | ||
126 | |||
127 | static struct platform_device *devices[] __initdata = { | ||
128 | &e400_t7l66xb_device, | ||
129 | }; | ||
130 | |||
76 | static void __init e400_init(void) | 131 | static void __init e400_init(void) |
77 | { | 132 | { |
78 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config)); | 133 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config)); |
134 | /* Fixme - e400 may have a switched clock */ | ||
135 | eseries_register_clks(); | ||
136 | eseries_get_tmio_gpios(); | ||
79 | set_pxa_fb_info(&e400_pxafb_mach_info); | 137 | set_pxa_fb_info(&e400_pxafb_mach_info); |
138 | platform_add_devices(devices, ARRAY_SIZE(devices)); | ||
80 | pxa_set_udc_info(&e7xx_udc_mach_info); | 139 | pxa_set_udc_info(&e7xx_udc_mach_info); |
81 | } | 140 | } |
82 | 141 | ||
diff --git a/arch/arm/mach-pxa/e740.c b/arch/arm/mach-pxa/e740.c index c57a15b37f0d..b00d670b2ea6 100644 --- a/arch/arm/mach-pxa/e740.c +++ b/arch/arm/mach-pxa/e740.c | |||
@@ -15,6 +15,8 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/clk.h> | ||
19 | #include <linux/mfd/t7l66xb.h> | ||
18 | 20 | ||
19 | #include <video/w100fb.h> | 21 | #include <video/w100fb.h> |
20 | 22 | ||
@@ -23,12 +25,16 @@ | |||
23 | #include <asm/mach-types.h> | 25 | #include <asm/mach-types.h> |
24 | 26 | ||
25 | #include <mach/mfp-pxa25x.h> | 27 | #include <mach/mfp-pxa25x.h> |
28 | #include <mach/pxa-regs.h> | ||
26 | #include <mach/hardware.h> | 29 | #include <mach/hardware.h> |
30 | #include <mach/eseries-gpio.h> | ||
27 | #include <mach/udc.h> | 31 | #include <mach/udc.h> |
32 | #include <mach/irda.h> | ||
28 | 33 | ||
29 | #include "generic.h" | 34 | #include "generic.h" |
30 | #include "eseries.h" | 35 | #include "eseries.h" |
31 | 36 | #include "clock.h" | |
37 | #include "devices.h" | ||
32 | 38 | ||
33 | /* ------------------------ e740 video support --------------------------- */ | 39 | /* ------------------------ e740 video support --------------------------- */ |
34 | 40 | ||
@@ -116,7 +122,17 @@ static unsigned long e740_pin_config[] __initdata = { | |||
116 | GPIO42_BTUART_RXD, | 122 | GPIO42_BTUART_RXD, |
117 | GPIO43_BTUART_TXD, | 123 | GPIO43_BTUART_TXD, |
118 | GPIO44_BTUART_CTS, | 124 | GPIO44_BTUART_CTS, |
119 | GPIO45_GPIO, /* Used by TMIO for #SUSPEND */ | 125 | |
126 | /* TMIO controller */ | ||
127 | GPIO19_GPIO, /* t7l66xb #PCLR */ | ||
128 | GPIO45_GPIO, /* t7l66xb #SUSPEND (NOT BTUART!) */ | ||
129 | |||
130 | /* UDC */ | ||
131 | GPIO13_GPIO, | ||
132 | GPIO3_GPIO, | ||
133 | |||
134 | /* IrDA */ | ||
135 | GPIO38_GPIO | MFP_LPM_DRIVE_HIGH, | ||
120 | 136 | ||
121 | /* PC Card */ | 137 | /* PC Card */ |
122 | GPIO8_GPIO, /* CD0 */ | 138 | GPIO8_GPIO, /* CD0 */ |
@@ -142,17 +158,43 @@ static unsigned long e740_pin_config[] __initdata = { | |||
142 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, | 158 | GPIO0_GPIO | WAKEUP_ON_EDGE_RISE, |
143 | }; | 159 | }; |
144 | 160 | ||
161 | /* -------------------- e740 t7l66xb parameters -------------------- */ | ||
162 | |||
163 | static struct t7l66xb_platform_data e740_t7l66xb_info = { | ||
164 | .irq_base = IRQ_BOARD_START, | ||
165 | .enable = &eseries_tmio_enable, | ||
166 | .suspend = &eseries_tmio_suspend, | ||
167 | .resume = &eseries_tmio_resume, | ||
168 | }; | ||
169 | |||
170 | static struct platform_device e740_t7l66xb_device = { | ||
171 | .name = "t7l66xb", | ||
172 | .id = -1, | ||
173 | .dev = { | ||
174 | .platform_data = &e740_t7l66xb_info, | ||
175 | }, | ||
176 | .num_resources = 2, | ||
177 | .resource = eseries_tmio_resources, | ||
178 | }; | ||
179 | |||
145 | /* ----------------------------------------------------------------------- */ | 180 | /* ----------------------------------------------------------------------- */ |
146 | 181 | ||
147 | static struct platform_device *devices[] __initdata = { | 182 | static struct platform_device *devices[] __initdata = { |
148 | &e740_fb_device, | 183 | &e740_fb_device, |
184 | &e740_t7l66xb_device, | ||
149 | }; | 185 | }; |
150 | 186 | ||
151 | static void __init e740_init(void) | 187 | static void __init e740_init(void) |
152 | { | 188 | { |
153 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config)); | 189 | pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config)); |
190 | eseries_register_clks(); | ||
191 | clk_add_alias("CLK_CK48M", &e740_t7l66xb_device.dev, | ||
192 | "UDCCLK", &pxa25x_device_udc.dev), | ||
193 | eseries_get_tmio_gpios(); | ||
154 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 194 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
155 | pxa_set_udc_info(&e7xx_udc_mach_info); | 195 | pxa_set_udc_info(&e7xx_udc_mach_info); |
196 | e7xx_irda_init(); | ||
197 | pxa_set_ficp_info(&e7xx_ficp_platform_data); | ||
156 | } | 198 | } |
157 | 199 | ||
158 | MACHINE_START(E740, "Toshiba e740") | 200 | MACHINE_START(E740, "Toshiba e740") |
diff --git a/arch/arm/mach-pxa/e750.c b/arch/arm/mach-pxa/e750.c index 640e738b85df..84d7c1aac58d 100644 --- a/arch/arm/mach-pxa/e750.c +++ b/arch/arm/mach-pxa/e750.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/mfd/tc6393xb.h> | ||
18 | 19 | ||
19 | #include <video/w100fb.h> | 20 | #include <video/w100fb.h> |
20 | 21 | ||
@@ -23,11 +24,15 @@ | |||
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
24 | 25 | ||
25 | #include <mach/mfp-pxa25x.h> | 26 | #include <mach/mfp-pxa25x.h> |
27 | #include <mach/pxa-regs.h> | ||
26 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
29 | #include <mach/eseries-gpio.h> | ||
27 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
31 | #include <mach/irda.h> | ||
28 | 32 | ||
29 | #include "generic.h" | 33 | #include "generic.h" |
30 | #include "eseries.h" | 34 | #include "eseries.h" |
35 | #include "clock.h" | ||
31 | 36 | ||
32 | /* ---------------------- E750 LCD definitions -------------------- */ | 37 | /* ---------------------- E750 LCD definitions -------------------- */ |
33 | 38 | ||
@@ -100,16 +105,45 @@ static struct platform_device e750_fb_device = { | |||
100 | .resource = e750_fb_resources, | 105 | .resource = e750_fb_resources, |
101 | }; | 106 | }; |
102 | 107 | ||
103 | /* ----------------------------------------------------------------------- */ | 108 | /* ----------------- e750 tc6393xb parameters ------------------ */ |
109 | |||
110 | static struct tc6393xb_platform_data e750_tc6393xb_info = { | ||
111 | .irq_base = IRQ_BOARD_START, | ||
112 | .scr_pll2cr = 0x0cc1, | ||
113 | .scr_gper = 0, | ||
114 | .gpio_base = -1, | ||
115 | .suspend = &eseries_tmio_suspend, | ||
116 | .resume = &eseries_tmio_resume, | ||
117 | .enable = &eseries_tmio_enable, | ||
118 | .disable = &eseries_tmio_disable, | ||
119 | }; | ||
120 | |||
121 | static struct platform_device e750_tc6393xb_device = { | ||
122 | .name = "tc6393xb", | ||
123 | .id = -1, | ||
124 | .dev = { | ||
125 | .platform_data = &e750_tc6393xb_info, | ||
126 | }, | ||
127 | .num_resources = 2, | ||
128 | .resource = eseries_tmio_resources, | ||
129 | }; | ||
130 | |||
131 | /* ------------------------------------------------------------- */ | ||
104 | 132 | ||
105 | static struct platform_device *devices[] __initdata = { | 133 | static struct platform_device *devices[] __initdata = { |
106 | &e750_fb_device, | 134 | &e750_fb_device, |
135 | &e750_tc6393xb_device, | ||
107 | }; | 136 | }; |
108 | 137 | ||
109 | static void __init e750_init(void) | 138 | static void __init e750_init(void) |
110 | { | 139 | { |
140 | clk_add_alias("CLK_CK3P6MI", &e750_tc6393xb_device.dev, | ||
141 | "GPIO11_CLK", NULL), | ||
142 | eseries_get_tmio_gpios(); | ||
111 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 143 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
112 | pxa_set_udc_info(&e7xx_udc_mach_info); | 144 | pxa_set_udc_info(&e7xx_udc_mach_info); |
145 | e7xx_irda_init(); | ||
146 | pxa_set_ficp_info(&e7xx_ficp_platform_data); | ||
113 | } | 147 | } |
114 | 148 | ||
115 | MACHINE_START(E750, "Toshiba e750") | 149 | MACHINE_START(E750, "Toshiba e750") |
diff --git a/arch/arm/mach-pxa/e800.c b/arch/arm/mach-pxa/e800.c index a293e09bfe25..9a86a426f924 100644 --- a/arch/arm/mach-pxa/e800.c +++ b/arch/arm/mach-pxa/e800.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/device.h> | 15 | #include <linux/device.h> |
16 | #include <linux/platform_device.h> | 16 | #include <linux/platform_device.h> |
17 | #include <linux/fb.h> | 17 | #include <linux/fb.h> |
18 | #include <linux/mfd/tc6393xb.h> | ||
18 | 19 | ||
19 | #include <video/w100fb.h> | 20 | #include <video/w100fb.h> |
20 | 21 | ||
@@ -23,12 +24,14 @@ | |||
23 | #include <asm/mach-types.h> | 24 | #include <asm/mach-types.h> |
24 | 25 | ||
25 | #include <mach/mfp-pxa25x.h> | 26 | #include <mach/mfp-pxa25x.h> |
27 | #include <mach/pxa-regs.h> | ||
26 | #include <mach/hardware.h> | 28 | #include <mach/hardware.h> |
27 | #include <mach/eseries-gpio.h> | 29 | #include <mach/eseries-gpio.h> |
28 | #include <mach/udc.h> | 30 | #include <mach/udc.h> |
29 | 31 | ||
30 | #include "generic.h" | 32 | #include "generic.h" |
31 | #include "eseries.h" | 33 | #include "eseries.h" |
34 | #include "clock.h" | ||
32 | 35 | ||
33 | /* ------------------------ e800 LCD definitions ------------------------- */ | 36 | /* ------------------------ e800 LCD definitions ------------------------- */ |
34 | 37 | ||
@@ -160,14 +163,41 @@ static struct pxa2xx_udc_mach_info e800_udc_mach_info = { | |||
160 | .gpio_pullup_inverted = 1 | 163 | .gpio_pullup_inverted = 1 |
161 | }; | 164 | }; |
162 | 165 | ||
166 | /* ----------------- e800 tc6393xb parameters ------------------ */ | ||
167 | |||
168 | static struct tc6393xb_platform_data e800_tc6393xb_info = { | ||
169 | .irq_base = IRQ_BOARD_START, | ||
170 | .scr_pll2cr = 0x0cc1, | ||
171 | .scr_gper = 0, | ||
172 | .gpio_base = -1, | ||
173 | .suspend = &eseries_tmio_suspend, | ||
174 | .resume = &eseries_tmio_resume, | ||
175 | .enable = &eseries_tmio_enable, | ||
176 | .disable = &eseries_tmio_disable, | ||
177 | }; | ||
178 | |||
179 | static struct platform_device e800_tc6393xb_device = { | ||
180 | .name = "tc6393xb", | ||
181 | .id = -1, | ||
182 | .dev = { | ||
183 | .platform_data = &e800_tc6393xb_info, | ||
184 | }, | ||
185 | .num_resources = 2, | ||
186 | .resource = eseries_tmio_resources, | ||
187 | }; | ||
188 | |||
163 | /* ----------------------------------------------------------------------- */ | 189 | /* ----------------------------------------------------------------------- */ |
164 | 190 | ||
165 | static struct platform_device *devices[] __initdata = { | 191 | static struct platform_device *devices[] __initdata = { |
166 | &e800_fb_device, | 192 | &e800_fb_device, |
193 | &e800_tc6393xb_device, | ||
167 | }; | 194 | }; |
168 | 195 | ||
169 | static void __init e800_init(void) | 196 | static void __init e800_init(void) |
170 | { | 197 | { |
198 | clk_add_alias("CLK_CK3P6MI", &e800_tc6393xb_device.dev, | ||
199 | "GPIO11_CLK", NULL), | ||
200 | eseries_get_tmio_gpios(); | ||
171 | platform_add_devices(devices, ARRAY_SIZE(devices)); | 201 | platform_add_devices(devices, ARRAY_SIZE(devices)); |
172 | pxa_set_udc_info(&e800_udc_mach_info); | 202 | pxa_set_udc_info(&e800_udc_mach_info); |
173 | } | 203 | } |
diff --git a/arch/arm/mach-pxa/eseries.c b/arch/arm/mach-pxa/eseries.c index d28849b50a14..dfce7d5b659e 100644 --- a/arch/arm/mach-pxa/eseries.c +++ b/arch/arm/mach-pxa/eseries.c | |||
@@ -12,6 +12,9 @@ | |||
12 | 12 | ||
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/init.h> | 14 | #include <linux/init.h> |
15 | #include <linux/gpio.h> | ||
16 | #include <linux/delay.h> | ||
17 | #include <linux/platform_device.h> | ||
15 | 18 | ||
16 | #include <asm/setup.h> | 19 | #include <asm/setup.h> |
17 | #include <asm/mach/arch.h> | 20 | #include <asm/mach/arch.h> |
@@ -21,8 +24,10 @@ | |||
21 | #include <mach/hardware.h> | 24 | #include <mach/hardware.h> |
22 | #include <mach/eseries-gpio.h> | 25 | #include <mach/eseries-gpio.h> |
23 | #include <mach/udc.h> | 26 | #include <mach/udc.h> |
27 | #include <mach/irda.h> | ||
24 | 28 | ||
25 | #include "generic.h" | 29 | #include "generic.h" |
30 | #include "clock.h" | ||
26 | 31 | ||
27 | /* Only e800 has 128MB RAM */ | 32 | /* Only e800 has 128MB RAM */ |
28 | void __init eseries_fixup(struct machine_desc *desc, | 33 | void __init eseries_fixup(struct machine_desc *desc, |
@@ -43,3 +48,122 @@ struct pxa2xx_udc_mach_info e7xx_udc_mach_info = { | |||
43 | .gpio_pullup_inverted = 1 | 48 | .gpio_pullup_inverted = 1 |
44 | }; | 49 | }; |
45 | 50 | ||
51 | static void e7xx_irda_transceiver_mode(struct device *dev, int mode) | ||
52 | { | ||
53 | if (mode & IR_OFF) { | ||
54 | gpio_set_value(GPIO_E7XX_IR_OFF, 1); | ||
55 | pxa2xx_transceiver_mode(dev, mode); | ||
56 | } else { | ||
57 | pxa2xx_transceiver_mode(dev, mode); | ||
58 | gpio_set_value(GPIO_E7XX_IR_OFF, 0); | ||
59 | } | ||
60 | } | ||
61 | |||
62 | int e7xx_irda_init(void) | ||
63 | { | ||
64 | int ret; | ||
65 | |||
66 | ret = gpio_request(GPIO_E7XX_IR_OFF, "IrDA power"); | ||
67 | if (ret) | ||
68 | goto out; | ||
69 | |||
70 | ret = gpio_direction_output(GPIO_E7XX_IR_OFF, 0); | ||
71 | if (ret) | ||
72 | goto out; | ||
73 | |||
74 | e7xx_irda_transceiver_mode(NULL, IR_SIRMODE | IR_OFF); | ||
75 | out: | ||
76 | return ret; | ||
77 | } | ||
78 | |||
79 | static void e7xx_irda_shutdown(struct device *dev) | ||
80 | { | ||
81 | e7xx_irda_transceiver_mode(dev, IR_SIRMODE | IR_OFF); | ||
82 | gpio_free(GPIO_E7XX_IR_OFF); | ||
83 | } | ||
84 | |||
85 | struct pxaficp_platform_data e7xx_ficp_platform_data = { | ||
86 | .transceiver_cap = IR_SIRMODE | IR_OFF, | ||
87 | .transceiver_mode = e7xx_irda_transceiver_mode, | ||
88 | .shutdown = e7xx_irda_shutdown, | ||
89 | }; | ||
90 | |||
91 | int eseries_tmio_enable(struct platform_device *dev) | ||
92 | { | ||
93 | /* Reset - bring SUSPEND high before PCLR */ | ||
94 | gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0); | ||
95 | gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0); | ||
96 | msleep(1); | ||
97 | gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1); | ||
98 | msleep(1); | ||
99 | gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 1); | ||
100 | msleep(1); | ||
101 | return 0; | ||
102 | } | ||
103 | |||
104 | int eseries_tmio_disable(struct platform_device *dev) | ||
105 | { | ||
106 | gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0); | ||
107 | gpio_set_value(GPIO_ESERIES_TMIO_PCLR, 0); | ||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | int eseries_tmio_suspend(struct platform_device *dev) | ||
112 | { | ||
113 | gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 0); | ||
114 | return 0; | ||
115 | } | ||
116 | |||
117 | int eseries_tmio_resume(struct platform_device *dev) | ||
118 | { | ||
119 | gpio_set_value(GPIO_ESERIES_TMIO_SUSPEND, 1); | ||
120 | msleep(1); | ||
121 | return 0; | ||
122 | } | ||
123 | |||
124 | void eseries_get_tmio_gpios(void) | ||
125 | { | ||
126 | gpio_request(GPIO_ESERIES_TMIO_SUSPEND, NULL); | ||
127 | gpio_request(GPIO_ESERIES_TMIO_PCLR, NULL); | ||
128 | gpio_direction_output(GPIO_ESERIES_TMIO_SUSPEND, 0); | ||
129 | gpio_direction_output(GPIO_ESERIES_TMIO_PCLR, 0); | ||
130 | } | ||
131 | |||
132 | /* TMIO controller uses the same resources on all e-series machines. */ | ||
133 | struct resource eseries_tmio_resources[] = { | ||
134 | [0] = { | ||
135 | .start = PXA_CS4_PHYS, | ||
136 | .end = PXA_CS4_PHYS + 0x1fffff, | ||
137 | .flags = IORESOURCE_MEM, | ||
138 | }, | ||
139 | [1] = { | ||
140 | .start = IRQ_GPIO(GPIO_ESERIES_TMIO_IRQ), | ||
141 | .end = IRQ_GPIO(GPIO_ESERIES_TMIO_IRQ), | ||
142 | .flags = IORESOURCE_IRQ, | ||
143 | }, | ||
144 | }; | ||
145 | |||
146 | /* Some e-series hardware cannot control the 32K clock */ | ||
147 | static void clk_32k_dummy(struct clk *clk) | ||
148 | { | ||
149 | } | ||
150 | |||
151 | static const struct clkops clk_32k_dummy_ops = { | ||
152 | .enable = clk_32k_dummy, | ||
153 | .disable = clk_32k_dummy, | ||
154 | }; | ||
155 | |||
156 | static struct clk tmio_dummy_clk = { | ||
157 | .ops = &clk_32k_dummy_ops, | ||
158 | .rate = 32768, | ||
159 | }; | ||
160 | |||
161 | static struct clk_lookup eseries_clkregs[] = { | ||
162 | INIT_CLKREG(&tmio_dummy_clk, NULL, "CLK_CK32K"), | ||
163 | }; | ||
164 | |||
165 | void eseries_register_clks(void) | ||
166 | { | ||
167 | clks_register(eseries_clkregs, ARRAY_SIZE(eseries_clkregs)); | ||
168 | } | ||
169 | |||
diff --git a/arch/arm/mach-pxa/eseries.h b/arch/arm/mach-pxa/eseries.h index a83f88d4b6ad..5930f5e2a123 100644 --- a/arch/arm/mach-pxa/eseries.h +++ b/arch/arm/mach-pxa/eseries.h | |||
@@ -2,3 +2,15 @@ void __init eseries_fixup(struct machine_desc *desc, | |||
2 | struct tag *tags, char **cmdline, struct meminfo *mi); | 2 | struct tag *tags, char **cmdline, struct meminfo *mi); |
3 | 3 | ||
4 | extern struct pxa2xx_udc_mach_info e7xx_udc_mach_info; | 4 | extern struct pxa2xx_udc_mach_info e7xx_udc_mach_info; |
5 | extern struct pxaficp_platform_data e7xx_ficp_platform_data; | ||
6 | extern int e7xx_irda_init(void); | ||
7 | |||
8 | extern int eseries_tmio_enable(struct platform_device *dev); | ||
9 | extern int eseries_tmio_disable(struct platform_device *dev); | ||
10 | extern int eseries_tmio_suspend(struct platform_device *dev); | ||
11 | extern int eseries_tmio_resume(struct platform_device *dev); | ||
12 | extern void eseries_get_tmio_gpios(void); | ||
13 | extern struct resource eseries_tmio_resources[]; | ||
14 | extern struct platform_device e300_tc6387xb_device; | ||
15 | extern void eseries_register_clks(void); | ||
16 | |||
diff --git a/arch/arm/mach-pxa/include/mach/eseries-gpio.h b/arch/arm/mach-pxa/include/mach/eseries-gpio.h index 4c90b1310270..efbd2aa9ecec 100644 --- a/arch/arm/mach-pxa/include/mach/eseries-gpio.h +++ b/arch/arm/mach-pxa/include/mach/eseries-gpio.h | |||
@@ -43,8 +43,10 @@ | |||
43 | #define GPIO_E800_PCMCIA_PWR1 73 | 43 | #define GPIO_E800_PCMCIA_PWR1 73 |
44 | 44 | ||
45 | /* e7xx IrDA power control */ | 45 | /* e7xx IrDA power control */ |
46 | #define GPIO_E7XX_IR_ON 38 | 46 | #define GPIO_E7XX_IR_OFF 38 |
47 | 47 | ||
48 | /* ASIC related GPIOs */ | 48 | /* ASIC related GPIOs */ |
49 | #define GPIO_ESERIES_TMIO_IRQ 5 | 49 | #define GPIO_ESERIES_TMIO_IRQ 5 |
50 | #define GPIO_ESERIES_TMIO_PCLR 19 | ||
51 | #define GPIO_ESERIES_TMIO_SUSPEND 45 | ||
50 | #define GPIO_E800_ANGELX_IRQ 8 | 52 | #define GPIO_E800_ANGELX_IRQ 8 |
diff --git a/drivers/pcmcia/Kconfig b/drivers/pcmcia/Kconfig index 222904411a13..276473543982 100644 --- a/drivers/pcmcia/Kconfig +++ b/drivers/pcmcia/Kconfig | |||
@@ -217,7 +217,7 @@ config PCMCIA_PXA2XX | |||
217 | depends on ARM && ARCH_PXA && PCMCIA | 217 | depends on ARM && ARCH_PXA && PCMCIA |
218 | depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ | 218 | depends on (ARCH_LUBBOCK || MACH_MAINSTONE || PXA_SHARPSL \ |
219 | || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ | 219 | || MACH_ARMCORE || ARCH_PXA_PALM || TRIZEPS_PCMCIA \ |
220 | || ARCH_VIPER) | 220 | || ARCH_VIPER || ARCH_PXA_ESERIES) |
221 | help | 221 | help |
222 | Say Y here to include support for the PXA2xx PCMCIA controller | 222 | Say Y here to include support for the PXA2xx PCMCIA controller |
223 | 223 | ||
diff --git a/drivers/pcmcia/Makefile b/drivers/pcmcia/Makefile index 238629ad7f7c..bbac46327227 100644 --- a/drivers/pcmcia/Makefile +++ b/drivers/pcmcia/Makefile | |||
@@ -72,5 +72,6 @@ pxa2xx-obj-$(CONFIG_ARCH_VIPER) += pxa2xx_viper.o | |||
72 | pxa2xx-obj-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps4.o | 72 | pxa2xx-obj-$(CONFIG_TRIZEPS_PCMCIA) += pxa2xx_trizeps4.o |
73 | pxa2xx-obj-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o | 73 | pxa2xx-obj-$(CONFIG_MACH_PALMTX) += pxa2xx_palmtx.o |
74 | pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o | 74 | pxa2xx-obj-$(CONFIG_MACH_PALMLD) += pxa2xx_palmld.o |
75 | pxa2xx-obj-$(CONFIG_MACH_E740) += pxa2xx_e740.o | ||
75 | 76 | ||
76 | obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) | 77 | obj-$(CONFIG_PCMCIA_PXA2XX) += pxa2xx_core.o $(pxa2xx-obj-y) |
diff --git a/drivers/pcmcia/pxa2xx_e740.c b/drivers/pcmcia/pxa2xx_e740.c new file mode 100644 index 000000000000..f663a011bf4a --- /dev/null +++ b/drivers/pcmcia/pxa2xx_e740.c | |||
@@ -0,0 +1,176 @@ | |||
1 | /* | ||
2 | * Toshiba e740 PCMCIA specific routines. | ||
3 | * | ||
4 | * (c) 2004 Ian Molton <spyro@f2s.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License version 2 as | ||
8 | * published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/init.h> | ||
12 | #include <linux/module.h> | ||
13 | #include <linux/kernel.h> | ||
14 | #include <linux/errno.h> | ||
15 | #include <linux/gpio.h> | ||
16 | #include <linux/interrupt.h> | ||
17 | #include <linux/platform_device.h> | ||
18 | |||
19 | #include <mach/hardware.h> | ||
20 | #include <mach/pxa-regs.h> | ||
21 | #include <mach/eseries-gpio.h> | ||
22 | |||
23 | #include <asm/irq.h> | ||
24 | #include <asm/mach-types.h> | ||
25 | |||
26 | #include "soc_common.h" | ||
27 | |||
28 | static struct pcmcia_irqs cd_irqs[] = { | ||
29 | { | ||
30 | .sock = 0, | ||
31 | .irq = IRQ_GPIO(GPIO_E740_PCMCIA_CD0), | ||
32 | .str = "CF card detect" | ||
33 | }, | ||
34 | { | ||
35 | .sock = 1, | ||
36 | .irq = IRQ_GPIO(GPIO_E740_PCMCIA_CD1), | ||
37 | .str = "Wifi switch" | ||
38 | }, | ||
39 | }; | ||
40 | |||
41 | static int e740_pcmcia_hw_init(struct soc_pcmcia_socket *skt) | ||
42 | { | ||
43 | skt->irq = skt->nr == 0 ? IRQ_GPIO(GPIO_E740_PCMCIA_RDY0) : | ||
44 | IRQ_GPIO(GPIO_E740_PCMCIA_RDY1); | ||
45 | |||
46 | return soc_pcmcia_request_irqs(skt, &cd_irqs[skt->nr], 1); | ||
47 | } | ||
48 | |||
49 | /* | ||
50 | * Release all resources. | ||
51 | */ | ||
52 | static void e740_pcmcia_hw_shutdown(struct soc_pcmcia_socket *skt) | ||
53 | { | ||
54 | soc_pcmcia_free_irqs(skt, &cd_irqs[skt->nr], 1); | ||
55 | } | ||
56 | |||
57 | static void e740_pcmcia_socket_state(struct soc_pcmcia_socket *skt, | ||
58 | struct pcmcia_state *state) | ||
59 | { | ||
60 | if (skt->nr == 0) { | ||
61 | state->detect = gpio_get_value(GPIO_E740_PCMCIA_CD0) ? 0 : 1; | ||
62 | state->ready = gpio_get_value(GPIO_E740_PCMCIA_RDY0) ? 1 : 0; | ||
63 | } else { | ||
64 | state->detect = gpio_get_value(GPIO_E740_PCMCIA_CD1) ? 0 : 1; | ||
65 | state->ready = gpio_get_value(GPIO_E740_PCMCIA_RDY1) ? 1 : 0; | ||
66 | } | ||
67 | |||
68 | state->vs_3v = 1; | ||
69 | state->bvd1 = 1; | ||
70 | state->bvd2 = 1; | ||
71 | state->wrprot = 0; | ||
72 | state->vs_Xv = 0; | ||
73 | } | ||
74 | |||
75 | static int e740_pcmcia_configure_socket(struct soc_pcmcia_socket *skt, | ||
76 | const socket_state_t *state) | ||
77 | { | ||
78 | if (state->flags & SS_RESET) { | ||
79 | if (skt->nr == 0) | ||
80 | gpio_set_value(GPIO_E740_PCMCIA_RST0, 1); | ||
81 | else | ||
82 | gpio_set_value(GPIO_E740_PCMCIA_RST1, 1); | ||
83 | } else { | ||
84 | if (skt->nr == 0) | ||
85 | gpio_set_value(GPIO_E740_PCMCIA_RST0, 0); | ||
86 | else | ||
87 | gpio_set_value(GPIO_E740_PCMCIA_RST1, 0); | ||
88 | } | ||
89 | |||
90 | switch (state->Vcc) { | ||
91 | case 0: /* Socket off */ | ||
92 | if (skt->nr == 0) | ||
93 | gpio_set_value(GPIO_E740_PCMCIA_PWR0, 0); | ||
94 | else | ||
95 | gpio_set_value(GPIO_E740_PCMCIA_PWR1, 1); | ||
96 | break; | ||
97 | case 50: | ||
98 | case 33: /* socket on */ | ||
99 | if (skt->nr == 0) | ||
100 | gpio_set_value(GPIO_E740_PCMCIA_PWR0, 1); | ||
101 | else | ||
102 | gpio_set_value(GPIO_E740_PCMCIA_PWR1, 0); | ||
103 | break; | ||
104 | default: | ||
105 | printk(KERN_ERR "e740_cs: Unsupported Vcc: %d\n", state->Vcc); | ||
106 | } | ||
107 | |||
108 | return 0; | ||
109 | } | ||
110 | |||
111 | /* | ||
112 | * Enable card status IRQs on (re-)initialisation. This can | ||
113 | * be called at initialisation, power management event, or | ||
114 | * pcmcia event. | ||
115 | */ | ||
116 | static void e740_pcmcia_socket_init(struct soc_pcmcia_socket *skt) | ||
117 | { | ||
118 | soc_pcmcia_enable_irqs(skt, cd_irqs, ARRAY_SIZE(cd_irqs)); | ||
119 | } | ||
120 | |||
121 | /* | ||
122 | * Disable card status IRQs on suspend. | ||
123 | */ | ||
124 | static void e740_pcmcia_socket_suspend(struct soc_pcmcia_socket *skt) | ||
125 | { | ||
126 | soc_pcmcia_disable_irqs(skt, cd_irqs, ARRAY_SIZE(cd_irqs)); | ||
127 | } | ||
128 | |||
129 | static struct pcmcia_low_level e740_pcmcia_ops = { | ||
130 | .owner = THIS_MODULE, | ||
131 | .hw_init = e740_pcmcia_hw_init, | ||
132 | .hw_shutdown = e740_pcmcia_hw_shutdown, | ||
133 | .socket_state = e740_pcmcia_socket_state, | ||
134 | .configure_socket = e740_pcmcia_configure_socket, | ||
135 | .socket_init = e740_pcmcia_socket_init, | ||
136 | .socket_suspend = e740_pcmcia_socket_suspend, | ||
137 | .nr = 2, | ||
138 | }; | ||
139 | |||
140 | static struct platform_device *e740_pcmcia_device; | ||
141 | |||
142 | static int __init e740_pcmcia_init(void) | ||
143 | { | ||
144 | int ret; | ||
145 | |||
146 | if (!machine_is_e740()) | ||
147 | return -ENODEV; | ||
148 | |||
149 | e740_pcmcia_device = platform_device_alloc("pxa2xx-pcmcia", -1); | ||
150 | if (!e740_pcmcia_device) | ||
151 | return -ENOMEM; | ||
152 | |||
153 | ret = platform_device_add_data(e740_pcmcia_device, &e740_pcmcia_ops, | ||
154 | sizeof(e740_pcmcia_ops)); | ||
155 | |||
156 | if (!ret) | ||
157 | ret = platform_device_add(e740_pcmcia_device); | ||
158 | |||
159 | if (ret) | ||
160 | platform_device_put(e740_pcmcia_device); | ||
161 | |||
162 | return ret; | ||
163 | } | ||
164 | |||
165 | static void __exit e740_pcmcia_exit(void) | ||
166 | { | ||
167 | platform_device_unregister(e740_pcmcia_device); | ||
168 | } | ||
169 | |||
170 | module_init(e740_pcmcia_init); | ||
171 | module_exit(e740_pcmcia_exit); | ||
172 | |||
173 | MODULE_LICENSE("GPL v2"); | ||
174 | MODULE_AUTHOR("Ian Molton <spyro@f2s.com>"); | ||
175 | MODULE_ALIAS("platform:pxa2xx-pcmcia"); | ||
176 | MODULE_DESCRIPTION("e740 PCMCIA platform support"); | ||