1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Hardware definitions for Palm Tungsten|E2
4  *
5  * Author:
6  *	Carlos Eduardo Medaglia Dyonisio <cadu@nerdfeliz.com>
7  *
8  * Rewrite for mainline:
9  *	Marek Vasut <marek.vasut@gmail.com>
10  *
11  * (find more info at www.hackndev.com)
12  */
13 
14 #include <linux/platform_device.h>
15 #include <linux/delay.h>
16 #include <linux/irq.h>
17 #include <linux/gpio_keys.h>
18 #include <linux/gpio/machine.h>
19 #include <linux/input.h>
20 #include <linux/pda_power.h>
21 #include <linux/pwm.h>
22 #include <linux/pwm_backlight.h>
23 #include <linux/gpio.h>
24 #include <linux/wm97xx.h>
25 #include <linux/power_supply.h>
26 
27 #include <asm/mach-types.h>
28 #include <asm/mach/arch.h>
29 #include <asm/mach/map.h>
30 
31 #include "pxa25x.h"
32 #include <mach/audio.h>
33 #include "palmte2.h"
34 #include <linux/platform_data/mmc-pxamci.h>
35 #include <linux/platform_data/video-pxafb.h>
36 #include <linux/platform_data/irda-pxaficp.h>
37 #include "udc.h"
38 #include <linux/platform_data/asoc-palm27x.h>
39 
40 #include "generic.h"
41 #include "devices.h"
42 
43 /******************************************************************************
44  * Pin configuration
45  ******************************************************************************/
46 static unsigned long palmte2_pin_config[] __initdata = {
47 	/* MMC */
48 	GPIO6_MMC_CLK,
49 	GPIO8_MMC_CS0,
50 	GPIO10_GPIO,	/* SD detect */
51 	GPIO55_GPIO,	/* SD power */
52 	GPIO51_GPIO,	/* SD r/o switch */
53 
54 	/* AC97 */
55 	GPIO28_AC97_BITCLK,
56 	GPIO29_AC97_SDATA_IN_0,
57 	GPIO30_AC97_SDATA_OUT,
58 	GPIO31_AC97_SYNC,
59 
60 	/* PWM */
61 	GPIO16_PWM0_OUT,
62 
63 	/* USB */
64 	GPIO15_GPIO,	/* usb detect */
65 	GPIO53_GPIO,	/* usb power */
66 
67 	/* IrDA */
68 	GPIO48_GPIO,	/* ir disable */
69 	GPIO46_FICP_RXD,
70 	GPIO47_FICP_TXD,
71 
72 	/* LCD */
73 	GPIOxx_LCD_TFT_16BPP,
74 
75 	/* GPIO KEYS */
76 	GPIO5_GPIO,	/* notes */
77 	GPIO7_GPIO,	/* tasks */
78 	GPIO11_GPIO,	/* calendar */
79 	GPIO13_GPIO,	/* contacts */
80 	GPIO14_GPIO,	/* center */
81 	GPIO19_GPIO,	/* left */
82 	GPIO20_GPIO,	/* right */
83 	GPIO21_GPIO,	/* down */
84 	GPIO22_GPIO,	/* up */
85 
86 	/* MISC */
87 	GPIO1_RST,	/* reset */
88 	GPIO4_GPIO,	/* Hotsync button */
89 	GPIO9_GPIO,	/* power detect */
90 	GPIO15_GPIO,	/* earphone detect */
91 	GPIO37_GPIO,	/* LCD power */
92 	GPIO56_GPIO,	/* Backlight power */
93 };
94 
95 /******************************************************************************
96  * SD/MMC card controller
97  ******************************************************************************/
98 static struct pxamci_platform_data palmte2_mci_platform_data = {
99 	.ocr_mask		= MMC_VDD_32_33 | MMC_VDD_33_34,
100 };
101 
102 static struct gpiod_lookup_table palmte2_mci_gpio_table = {
103 	.dev_id = "pxa2xx-mci.0",
104 	.table = {
105 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_DETECT_N,
106 			    "cd", GPIO_ACTIVE_LOW),
107 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_READONLY,
108 			    "wp", GPIO_ACTIVE_LOW),
109 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_SD_POWER,
110 			    "power", GPIO_ACTIVE_HIGH),
111 		{ },
112 	},
113 };
114 
115 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
116 /******************************************************************************
117  * GPIO keys
118  ******************************************************************************/
119 static struct gpio_keys_button palmte2_pxa_buttons[] = {
120 	{KEY_F1,	GPIO_NR_PALMTE2_KEY_CONTACTS,	1, "Contacts" },
121 	{KEY_F2,	GPIO_NR_PALMTE2_KEY_CALENDAR,	1, "Calendar" },
122 	{KEY_F3,	GPIO_NR_PALMTE2_KEY_TASKS,	1, "Tasks" },
123 	{KEY_F4,	GPIO_NR_PALMTE2_KEY_NOTES,	1, "Notes" },
124 	{KEY_ENTER,	GPIO_NR_PALMTE2_KEY_CENTER,	1, "Center" },
125 	{KEY_LEFT,	GPIO_NR_PALMTE2_KEY_LEFT,	1, "Left" },
126 	{KEY_RIGHT,	GPIO_NR_PALMTE2_KEY_RIGHT,	1, "Right" },
127 	{KEY_DOWN,	GPIO_NR_PALMTE2_KEY_DOWN,	1, "Down" },
128 	{KEY_UP,	GPIO_NR_PALMTE2_KEY_UP,		1, "Up" },
129 };
130 
131 static struct gpio_keys_platform_data palmte2_pxa_keys_data = {
132 	.buttons	= palmte2_pxa_buttons,
133 	.nbuttons	= ARRAY_SIZE(palmte2_pxa_buttons),
134 };
135 
136 static struct platform_device palmte2_pxa_keys = {
137 	.name	= "gpio-keys",
138 	.id	= -1,
139 	.dev	= {
140 		.platform_data = &palmte2_pxa_keys_data,
141 	},
142 };
143 #endif
144 
145 /******************************************************************************
146  * Backlight
147  ******************************************************************************/
148 static struct pwm_lookup palmte2_pwm_lookup[] = {
149 	PWM_LOOKUP("pxa25x-pwm.0", 0, "pwm-backlight.0", NULL,
150 		   PALMTE2_PERIOD_NS, PWM_POLARITY_NORMAL),
151 };
152 
153 static struct gpio palmte_bl_gpios[] = {
154 	{ GPIO_NR_PALMTE2_BL_POWER, GPIOF_INIT_LOW, "Backlight power" },
155 	{ GPIO_NR_PALMTE2_LCD_POWER, GPIOF_INIT_LOW, "LCD power" },
156 };
157 
palmte2_backlight_init(struct device * dev)158 static int palmte2_backlight_init(struct device *dev)
159 {
160 	return gpio_request_array(ARRAY_AND_SIZE(palmte_bl_gpios));
161 }
162 
palmte2_backlight_notify(struct device * dev,int brightness)163 static int palmte2_backlight_notify(struct device *dev, int brightness)
164 {
165 	gpio_set_value(GPIO_NR_PALMTE2_BL_POWER, brightness);
166 	gpio_set_value(GPIO_NR_PALMTE2_LCD_POWER, brightness);
167 	return brightness;
168 }
169 
palmte2_backlight_exit(struct device * dev)170 static void palmte2_backlight_exit(struct device *dev)
171 {
172 	gpio_free_array(ARRAY_AND_SIZE(palmte_bl_gpios));
173 }
174 
175 static struct platform_pwm_backlight_data palmte2_backlight_data = {
176 	.max_brightness	= PALMTE2_MAX_INTENSITY,
177 	.dft_brightness	= PALMTE2_MAX_INTENSITY,
178 	.init		= palmte2_backlight_init,
179 	.notify		= palmte2_backlight_notify,
180 	.exit		= palmte2_backlight_exit,
181 };
182 
183 static struct platform_device palmte2_backlight = {
184 	.name	= "pwm-backlight",
185 	.dev	= {
186 		.parent		= &pxa25x_device_pwm0.dev,
187 		.platform_data	= &palmte2_backlight_data,
188 	},
189 };
190 
191 /******************************************************************************
192  * IrDA
193  ******************************************************************************/
194 static struct pxaficp_platform_data palmte2_ficp_platform_data = {
195 	.gpio_pwdown		= GPIO_NR_PALMTE2_IR_DISABLE,
196 	.transceiver_cap	= IR_SIRMODE | IR_OFF,
197 };
198 
199 /******************************************************************************
200  * UDC
201  ******************************************************************************/
202 static struct gpiod_lookup_table palmte2_udc_gpiod_table = {
203 	.dev_id = "gpio-vbus",
204 	.table = {
205 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_DETECT_N,
206 			    "vbus", GPIO_ACTIVE_LOW),
207 		GPIO_LOOKUP("gpio-pxa", GPIO_NR_PALMTE2_USB_PULLUP,
208 			    "pullup", GPIO_ACTIVE_HIGH),
209 		{ },
210 	},
211 };
212 
213 static struct platform_device palmte2_gpio_vbus = {
214 	.name	= "gpio-vbus",
215 	.id	= -1,
216 };
217 
218 /******************************************************************************
219  * Power supply
220  ******************************************************************************/
power_supply_init(struct device * dev)221 static int power_supply_init(struct device *dev)
222 {
223 	int ret;
224 
225 	ret = gpio_request(GPIO_NR_PALMTE2_POWER_DETECT, "CABLE_STATE_AC");
226 	if (ret)
227 		goto err1;
228 	ret = gpio_direction_input(GPIO_NR_PALMTE2_POWER_DETECT);
229 	if (ret)
230 		goto err2;
231 
232 	return 0;
233 
234 err2:
235 	gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
236 err1:
237 	return ret;
238 }
239 
palmte2_is_ac_online(void)240 static int palmte2_is_ac_online(void)
241 {
242 	return gpio_get_value(GPIO_NR_PALMTE2_POWER_DETECT);
243 }
244 
power_supply_exit(struct device * dev)245 static void power_supply_exit(struct device *dev)
246 {
247 	gpio_free(GPIO_NR_PALMTE2_POWER_DETECT);
248 }
249 
250 static char *palmte2_supplicants[] = {
251 	"main-battery",
252 };
253 
254 static struct pda_power_pdata power_supply_info = {
255 	.init            = power_supply_init,
256 	.is_ac_online    = palmte2_is_ac_online,
257 	.exit            = power_supply_exit,
258 	.supplied_to     = palmte2_supplicants,
259 	.num_supplicants = ARRAY_SIZE(palmte2_supplicants),
260 };
261 
262 static struct platform_device power_supply = {
263 	.name = "pda-power",
264 	.id   = -1,
265 	.dev  = {
266 		.platform_data = &power_supply_info,
267 	},
268 };
269 
270 /******************************************************************************
271  * WM97xx audio, battery
272  ******************************************************************************/
273 static struct wm97xx_batt_pdata palmte2_batt_pdata = {
274 	.batt_aux	= WM97XX_AUX_ID3,
275 	.temp_aux	= WM97XX_AUX_ID2,
276 	.max_voltage	= PALMTE2_BAT_MAX_VOLTAGE,
277 	.min_voltage	= PALMTE2_BAT_MIN_VOLTAGE,
278 	.batt_mult	= 1000,
279 	.batt_div	= 414,
280 	.temp_mult	= 1,
281 	.temp_div	= 1,
282 	.batt_tech	= POWER_SUPPLY_TECHNOLOGY_LIPO,
283 	.batt_name	= "main-batt",
284 };
285 
286 static struct wm97xx_pdata palmte2_wm97xx_pdata = {
287 	.batt_pdata	= &palmte2_batt_pdata,
288 };
289 
290 static pxa2xx_audio_ops_t palmte2_ac97_pdata = {
291 	.codec_pdata	= { &palmte2_wm97xx_pdata, },
292 };
293 
294 static struct palm27x_asoc_info palmte2_asoc_pdata = {
295 	.jack_gpio	= GPIO_NR_PALMTE2_EARPHONE_DETECT,
296 };
297 
298 static struct platform_device palmte2_asoc = {
299 	.name = "palm27x-asoc",
300 	.id   = -1,
301 	.dev  = {
302 		.platform_data = &palmte2_asoc_pdata,
303 	},
304 };
305 
306 /******************************************************************************
307  * Framebuffer
308  ******************************************************************************/
309 static struct pxafb_mode_info palmte2_lcd_modes[] = {
310 {
311 	.pixclock	= 77757,
312 	.xres		= 320,
313 	.yres		= 320,
314 	.bpp		= 16,
315 
316 	.left_margin	= 28,
317 	.right_margin	= 7,
318 	.upper_margin	= 7,
319 	.lower_margin	= 5,
320 
321 	.hsync_len	= 4,
322 	.vsync_len	= 1,
323 },
324 };
325 
326 static struct pxafb_mach_info palmte2_lcd_screen = {
327 	.modes		= palmte2_lcd_modes,
328 	.num_modes	= ARRAY_SIZE(palmte2_lcd_modes),
329 	.lcd_conn	= LCD_COLOR_TFT_16BPP | LCD_PCLK_EDGE_FALL,
330 };
331 
332 /******************************************************************************
333  * Machine init
334  ******************************************************************************/
335 static struct platform_device *devices[] __initdata = {
336 #if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
337 	&palmte2_pxa_keys,
338 #endif
339 	&palmte2_backlight,
340 	&power_supply,
341 	&palmte2_asoc,
342 	&palmte2_gpio_vbus,
343 };
344 
345 /* setup udc GPIOs initial state */
palmte2_udc_init(void)346 static void __init palmte2_udc_init(void)
347 {
348 	if (!gpio_request(GPIO_NR_PALMTE2_USB_PULLUP, "UDC Vbus")) {
349 		gpio_direction_output(GPIO_NR_PALMTE2_USB_PULLUP, 1);
350 		gpio_free(GPIO_NR_PALMTE2_USB_PULLUP);
351 	}
352 }
353 
palmte2_init(void)354 static void __init palmte2_init(void)
355 {
356 	pxa2xx_mfp_config(ARRAY_AND_SIZE(palmte2_pin_config));
357 
358 	pxa_set_ffuart_info(NULL);
359 	pxa_set_btuart_info(NULL);
360 	pxa_set_stuart_info(NULL);
361 
362 	pxa_set_fb_info(NULL, &palmte2_lcd_screen);
363 	gpiod_add_lookup_table(&palmte2_mci_gpio_table);
364 	pxa_set_mci_info(&palmte2_mci_platform_data);
365 	palmte2_udc_init();
366 	pxa_set_ac97_info(&palmte2_ac97_pdata);
367 	pxa_set_ficp_info(&palmte2_ficp_platform_data);
368 
369 	pwm_add_table(palmte2_pwm_lookup, ARRAY_SIZE(palmte2_pwm_lookup));
370 	gpiod_add_lookup_table(&palmte2_udc_gpiod_table);
371 	platform_add_devices(devices, ARRAY_SIZE(devices));
372 }
373 
374 MACHINE_START(PALMTE2, "Palm Tungsten|E2")
375 	.atag_offset	= 0x100,
376 	.map_io		= pxa25x_map_io,
377 	.nr_irqs	= PXA_NR_IRQS,
378 	.init_irq	= pxa25x_init_irq,
379 	.handle_irq	= pxa25x_handle_irq,
380 	.init_time	= pxa_timer_init,
381 	.init_machine	= palmte2_init,
382 	.restart	= pxa_restart,
383 MACHINE_END
384