1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Hardware definitions for PalmTX
4  *
5  * Author:     Marek Vasut <marek.vasut@gmail.com>
6  *
7  * Based on work of:
8  *		Alex Osborne <ato@meshy.org>
9  *		Cristiano P. <cristianop@users.sourceforge.net>
10  *		Jan Herman <2hp@seznam.cz>
11  *		Michal Hrusecky
12  *
13  * (find more info at www.hackndev.com)
14  */
15 
16 #include <linux/platform_device.h>
17 #include <linux/delay.h>
18 #include <linux/irq.h>
19 #include <linux/gpio_keys.h>
20 #include <linux/input.h>
21 #include <linux/pda_power.h>
22 #include <linux/pwm_backlight.h>
23 #include <linux/gpio.h>
24 #include <linux/wm97xx.h>
25 #include <linux/power_supply.h>
26 #include <linux/mtd/platnand.h>
27 #include <linux/mtd/mtd.h>
28 #include <linux/mtd/physmap.h>
29 
30 #include <asm/mach-types.h>
31 #include <asm/mach/arch.h>
32 #include <asm/mach/map.h>
33 
34 #include "pxa27x.h"
35 #include <linux/platform_data/asoc-pxa.h>
36 #include "palmtx.h"
37 #include <linux/platform_data/mmc-pxamci.h>
38 #include <linux/platform_data/video-pxafb.h>
39 #include <linux/platform_data/irda-pxaficp.h>
40 #include <linux/platform_data/keypad-pxa27x.h>
41 #include "udc.h"
42 #include <linux/platform_data/asoc-palm27x.h>
43 #include "palm27x.h"
44 
45 #include "generic.h"
46 #include "devices.h"
47 
48 /******************************************************************************
49  * Pin configuration
50  ******************************************************************************/
51 static unsigned long palmtx_pin_config[] __initdata = {
52 	/* MMC */
53 	GPIO32_MMC_CLK,
54 	GPIO92_MMC_DAT_0,
55 	GPIO109_MMC_DAT_1,
56 	GPIO110_MMC_DAT_2,
57 	GPIO111_MMC_DAT_3,
58 	GPIO112_MMC_CMD,
59 	GPIO14_GPIO,	/* SD detect */
60 	GPIO114_GPIO,	/* SD power */
61 	GPIO115_GPIO,	/* SD r/o switch */
62 
63 	/* AC97 */
64 	GPIO28_AC97_BITCLK,
65 	GPIO29_AC97_SDATA_IN_0,
66 	GPIO30_AC97_SDATA_OUT,
67 	GPIO31_AC97_SYNC,
68 	GPIO89_AC97_SYSCLK,
69 	GPIO95_AC97_nRESET,
70 
71 	/* IrDA */
72 	GPIO40_GPIO,	/* ir disable */
73 	GPIO46_FICP_RXD,
74 	GPIO47_FICP_TXD,
75 
76 	/* PWM */
77 	GPIO16_PWM0_OUT,
78 
79 	/* USB */
80 	GPIO13_GPIO,	/* usb detect */
81 	GPIO93_GPIO,	/* usb power */
82 
83 	/* PCMCIA */
84 	GPIO48_nPOE,
85 	GPIO49_nPWE,
86 	GPIO50_nPIOR,
87 	GPIO51_nPIOW,
88 	GPIO85_nPCE_1,
89 	GPIO54_nPCE_2,
90 	GPIO79_PSKTSEL,
91 	GPIO55_nPREG,
92 	GPIO56_nPWAIT,
93 	GPIO57_nIOIS16,
94 	GPIO94_GPIO,	/* wifi power 1 */
95 	GPIO108_GPIO,	/* wifi power 2 */
96 	GPIO116_GPIO,	/* wifi ready */
97 
98 	/* MATRIX KEYPAD */
99 	GPIO100_KP_MKIN_0 | WAKEUP_ON_LEVEL_HIGH,
100 	GPIO101_KP_MKIN_1 | WAKEUP_ON_LEVEL_HIGH,
101 	GPIO102_KP_MKIN_2 | WAKEUP_ON_LEVEL_HIGH,
102 	GPIO97_KP_MKIN_3 | WAKEUP_ON_LEVEL_HIGH,
103 	GPIO103_KP_MKOUT_0,
104 	GPIO104_KP_MKOUT_1,
105 	GPIO105_KP_MKOUT_2,
106 
107 	/* LCD */
108 	GPIOxx_LCD_TFT_16BPP,
109 
110 	/* FFUART */
111 	GPIO34_FFUART_RXD,
112 	GPIO39_FFUART_TXD,
113 
114 	/* NAND */
115 	GPIO15_nCS_1,
116 	GPIO18_RDY,
117 
118 	/* MISC. */
119 	GPIO10_GPIO,	/* hotsync button */
120 	GPIO12_GPIO,	/* power detect */
121 	GPIO107_GPIO,	/* earphone detect */
122 };
123 
124 /******************************************************************************
125  * NOR Flash
126  ******************************************************************************/
127 #if defined(CONFIG_MTD_PHYSMAP) || defined(CONFIG_MTD_PHYSMAP_MODULE)
128 static struct mtd_partition palmtx_partitions[] = {
129 	{
130 		.name		= "Flash",
131 		.offset		= 0x00000000,
132 		.size		= MTDPART_SIZ_FULL,
133 		.mask_flags	= 0
134 	}
135 };
136 
137 static struct physmap_flash_data palmtx_flash_data[] = {
138 	{
139 		.width		= 2,			/* bankwidth in bytes */
140 		.parts		= palmtx_partitions,
141 		.nr_parts	= ARRAY_SIZE(palmtx_partitions)
142 	}
143 };
144 
145 static struct resource palmtx_flash_resource = {
146 	.start	= PXA_CS0_PHYS,
147 	.end	= PXA_CS0_PHYS + SZ_8M - 1,
148 	.flags	= IORESOURCE_MEM,
149 };
150 
151 static struct platform_device palmtx_flash = {
152 	.name		= "physmap-flash",
153 	.id		= 0,
154 	.resource	= &palmtx_flash_resource,
155 	.num_resources	= 1,
156 	.dev 		= {
157 		.platform_data = palmtx_flash_data,
158 	},
159 };
160 
palmtx_nor_init(void)161 static void __init palmtx_nor_init(void)
162 {
163 	platform_device_register(&palmtx_flash);
164 }
165 #else
palmtx_nor_init(void)166 static inline void palmtx_nor_init(void) {}
167 #endif
168 
169 /******************************************************************************
170  * GPIO keyboard
171  ******************************************************************************/
172 #if defined(CONFIG_KEYBOARD_PXA27x) || defined(CONFIG_KEYBOARD_PXA27x_MODULE)
173 static const unsigned int palmtx_matrix_keys[] = {
174 	KEY(0, 0, KEY_POWER),
175 	KEY(0, 1, KEY_F1),
176 	KEY(0, 2, KEY_ENTER),
177 
178 	KEY(1, 0, KEY_F2),
179 	KEY(1, 1, KEY_F3),
180 	KEY(1, 2, KEY_F4),
181 
182 	KEY(2, 0, KEY_UP),
183 	KEY(2, 2, KEY_DOWN),
184 
185 	KEY(3, 0, KEY_RIGHT),
186 	KEY(3, 2, KEY_LEFT),
187 };
188 
189 static struct matrix_keymap_data palmtx_matrix_keymap_data = {
190 	.keymap			= palmtx_matrix_keys,
191 	.keymap_size		= ARRAY_SIZE(palmtx_matrix_keys),
192 };
193 
194 static struct pxa27x_keypad_platform_data palmtx_keypad_platform_data = {
195 	.matrix_key_rows	= 4,
196 	.matrix_key_cols	= 3,
197 	.matrix_keymap_data	= &palmtx_matrix_keymap_data,
198 
199 	.debounce_interval	= 30,
200 };
201 
palmtx_kpc_init(void)202 static void __init palmtx_kpc_init(void)
203 {
204 	pxa_set_keypad_info(&palmtx_keypad_platform_data);
205 }
206 #else
palmtx_kpc_init(void)207 static inline void palmtx_kpc_init(void) {}
208 #endif
209 
210 /******************************************************************************
211  * GPIO keys
212  ******************************************************************************/
213 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
214 static struct gpio_keys_button palmtx_pxa_buttons[] = {
215 	{KEY_F8, GPIO_NR_PALMTX_HOTSYNC_BUTTON_N, 1, "HotSync Button" },
216 };
217 
218 static struct gpio_keys_platform_data palmtx_pxa_keys_data = {
219 	.buttons	= palmtx_pxa_buttons,
220 	.nbuttons	= ARRAY_SIZE(palmtx_pxa_buttons),
221 };
222 
223 static struct platform_device palmtx_pxa_keys = {
224 	.name	= "gpio-keys",
225 	.id	= -1,
226 	.dev	= {
227 		.platform_data = &palmtx_pxa_keys_data,
228 	},
229 };
230 
palmtx_keys_init(void)231 static void __init palmtx_keys_init(void)
232 {
233 	platform_device_register(&palmtx_pxa_keys);
234 }
235 #else
palmtx_keys_init(void)236 static inline void palmtx_keys_init(void) {}
237 #endif
238 
239 /******************************************************************************
240  * NAND Flash
241  ******************************************************************************/
242 #if defined(CONFIG_MTD_NAND_PLATFORM) || \
243 	defined(CONFIG_MTD_NAND_PLATFORM_MODULE)
palmtx_nand_cmd_ctl(struct nand_chip * this,int cmd,unsigned int ctrl)244 static void palmtx_nand_cmd_ctl(struct nand_chip *this, int cmd,
245 				unsigned int ctrl)
246 {
247 	char __iomem *nandaddr = this->legacy.IO_ADDR_W;
248 
249 	if (cmd == NAND_CMD_NONE)
250 		return;
251 
252 	if (ctrl & NAND_CLE)
253 		writeb(cmd, PALMTX_NAND_CLE_VIRT);
254 	else if (ctrl & NAND_ALE)
255 		writeb(cmd, PALMTX_NAND_ALE_VIRT);
256 	else
257 		writeb(cmd, nandaddr);
258 }
259 
260 static struct mtd_partition palmtx_partition_info[] = {
261 	[0] = {
262 		.name	= "palmtx-0",
263 		.offset	= 0,
264 		.size	= MTDPART_SIZ_FULL
265 	},
266 };
267 
268 struct platform_nand_data palmtx_nand_platdata = {
269 	.chip	= {
270 		.nr_chips		= 1,
271 		.chip_offset		= 0,
272 		.nr_partitions		= ARRAY_SIZE(palmtx_partition_info),
273 		.partitions		= palmtx_partition_info,
274 		.chip_delay		= 20,
275 	},
276 	.ctrl	= {
277 		.cmd_ctrl	= palmtx_nand_cmd_ctl,
278 	},
279 };
280 
281 static struct resource palmtx_nand_resource[] = {
282 	[0]	= {
283 		.start	= PXA_CS1_PHYS,
284 		.end	= PXA_CS1_PHYS + SZ_1M - 1,
285 		.flags	= IORESOURCE_MEM,
286 	},
287 };
288 
289 static struct platform_device palmtx_nand = {
290 	.name		= "gen_nand",
291 	.num_resources	= ARRAY_SIZE(palmtx_nand_resource),
292 	.resource	= palmtx_nand_resource,
293 	.id		= -1,
294 	.dev		= {
295 		.platform_data	= &palmtx_nand_platdata,
296 	}
297 };
298 
palmtx_nand_init(void)299 static void __init palmtx_nand_init(void)
300 {
301 	platform_device_register(&palmtx_nand);
302 }
303 #else
palmtx_nand_init(void)304 static inline void palmtx_nand_init(void) {}
305 #endif
306 
307 /******************************************************************************
308  * Machine init
309  ******************************************************************************/
310 static struct map_desc palmtx_io_desc[] __initdata = {
311 {
312 	.virtual	= (unsigned long)PALMTX_PCMCIA_VIRT,
313 	.pfn		= __phys_to_pfn(PALMTX_PCMCIA_PHYS),
314 	.length		= PALMTX_PCMCIA_SIZE,
315 	.type		= MT_DEVICE,
316 }, {
317 	.virtual	= (unsigned long)PALMTX_NAND_ALE_VIRT,
318 	.pfn		= __phys_to_pfn(PALMTX_NAND_ALE_PHYS),
319 	.length		= SZ_1M,
320 	.type		= MT_DEVICE,
321 }, {
322 	.virtual	= (unsigned long)PALMTX_NAND_CLE_VIRT,
323 	.pfn		= __phys_to_pfn(PALMTX_NAND_CLE_PHYS),
324 	.length		= SZ_1M,
325 	.type		= MT_DEVICE,
326 }
327 };
328 
palmtx_map_io(void)329 static void __init palmtx_map_io(void)
330 {
331 	pxa27x_map_io();
332 	iotable_init(palmtx_io_desc, ARRAY_SIZE(palmtx_io_desc));
333 }
334 
335 static struct gpiod_lookup_table palmtx_mci_gpio_table = {
336 	.dev_id = "pxa2xx-mci.0",
337 	.table = {
338 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_DETECT_N,
339 			    "cd", GPIO_ACTIVE_LOW),
340 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_READONLY,
341 			    "wp", GPIO_ACTIVE_LOW),
342 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTX_SD_POWER,
343 			    "power", GPIO_ACTIVE_HIGH),
344 		{ },
345 	},
346 };
347 
348 static struct gpiod_lookup_table palmtx_wm97xx_touch_gpio_table = {
349 	.dev_id = "wm97xx-touch",
350 	.table = {
351 		GPIO_LOOKUP("gpio-pxa", 27, "touch", GPIO_ACTIVE_HIGH),
352 		{ },
353 	},
354 };
355 
palmtx_init(void)356 static void __init palmtx_init(void)
357 {
358 	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmtx_pin_config));
359 	pxa_set_ffuart_info(NULL);
360 	pxa_set_btuart_info(NULL);
361 	pxa_set_stuart_info(NULL);
362 
363 	palm27x_mmc_init(&palmtx_mci_gpio_table);
364 	gpiod_add_lookup_table(&palmtx_wm97xx_touch_gpio_table);
365 	palm27x_pm_init(PALMTX_STR_BASE);
366 	palm27x_lcd_init(-1, &palm_320x480_lcd_mode);
367 	palm27x_udc_init(GPIO_NR_PALMTX_USB_DETECT_N,
368 			GPIO_NR_PALMTX_USB_PULLUP, 1);
369 	palm27x_irda_init(GPIO_NR_PALMTX_IR_DISABLE);
370 	palm27x_ac97_init(PALMTX_BAT_MIN_VOLTAGE, PALMTX_BAT_MAX_VOLTAGE,
371 			GPIO_NR_PALMTX_EARPHONE_DETECT, 95);
372 	palm27x_pwm_init(GPIO_NR_PALMTX_BL_POWER, GPIO_NR_PALMTX_LCD_POWER);
373 	palm27x_power_init(GPIO_NR_PALMTX_POWER_DETECT, -1);
374 	palm27x_pmic_init();
375 	palmtx_kpc_init();
376 	palmtx_keys_init();
377 	palmtx_nor_init();
378 	palmtx_nand_init();
379 }
380 
381 MACHINE_START(PALMTX, "Palm T|X")
382 	.atag_offset	= 0x100,
383 	.map_io		= palmtx_map_io,
384 	.nr_irqs	= PXA_NR_IRQS,
385 	.init_irq	= pxa27x_init_irq,
386 	.handle_irq	= pxa27x_handle_irq,
387 	.init_time	= pxa_timer_init,
388 	.init_machine	= palmtx_init,
389 	.restart	= pxa_restart,
390 MACHINE_END
391