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