GNU Linux-libre 5.19-rc6-gnu
[releases.git] / arch / arm / mach-omap1 / board-palmte.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * linux/arch/arm/mach-omap1/board-palmte.c
4  *
5  * Modified from board-generic.c
6  *
7  * Support for the Palm Tungsten E PDA.
8  *
9  * Original version : Laurent Gonzalez
10  *
11  * Maintainers : http://palmtelinux.sf.net
12  *                palmtelinux-developpers@lists.sf.net
13  *
14  * Copyright (c) 2006 Andrzej Zaborowski  <balrog@zabor.org>
15  */
16 #include <linux/gpio.h>
17 #include <linux/kernel.h>
18 #include <linux/init.h>
19 #include <linux/input.h>
20 #include <linux/platform_device.h>
21 #include <linux/mtd/mtd.h>
22 #include <linux/mtd/partitions.h>
23 #include <linux/mtd/physmap.h>
24 #include <linux/spi/spi.h>
25 #include <linux/interrupt.h>
26 #include <linux/apm-emulation.h>
27 #include <linux/omapfb.h>
28 #include <linux/omap-dma.h>
29 #include <linux/platform_data/keypad-omap.h>
30 #include <linux/platform_data/omap1_bl.h>
31
32 #include <asm/mach-types.h>
33 #include <asm/mach/arch.h>
34 #include <asm/mach/map.h>
35
36 #include "tc.h"
37 #include "flash.h"
38 #include "mux.h"
39 #include "hardware.h"
40 #include "usb.h"
41 #include "mmc.h"
42 #include "common.h"
43
44 #define PALMTE_USBDETECT_GPIO   0
45 #define PALMTE_USB_OR_DC_GPIO   1
46 #define PALMTE_TSC_GPIO         4
47 #define PALMTE_PINTDAV_GPIO     6
48 #define PALMTE_MMC_WP_GPIO      8
49 #define PALMTE_MMC_POWER_GPIO   9
50 #define PALMTE_HDQ_GPIO         11
51 #define PALMTE_HEADPHONES_GPIO  14
52 #define PALMTE_SPEAKER_GPIO     15
53 #define PALMTE_DC_GPIO          OMAP_MPUIO(2)
54 #define PALMTE_MMC_SWITCH_GPIO  OMAP_MPUIO(4)
55 #define PALMTE_MMC1_GPIO        OMAP_MPUIO(6)
56 #define PALMTE_MMC2_GPIO        OMAP_MPUIO(7)
57 #define PALMTE_MMC3_GPIO        OMAP_MPUIO(11)
58
59 static const unsigned int palmte_keymap[] = {
60         KEY(0, 0, KEY_F1),              /* Calendar */
61         KEY(1, 0, KEY_F2),              /* Contacts */
62         KEY(2, 0, KEY_F3),              /* Tasks List */
63         KEY(3, 0, KEY_F4),              /* Note Pad */
64         KEY(4, 0, KEY_POWER),
65         KEY(0, 1, KEY_LEFT),
66         KEY(1, 1, KEY_DOWN),
67         KEY(2, 1, KEY_UP),
68         KEY(3, 1, KEY_RIGHT),
69         KEY(4, 1, KEY_ENTER),
70 };
71
72 static const struct matrix_keymap_data palmte_keymap_data = {
73         .keymap         = palmte_keymap,
74         .keymap_size    = ARRAY_SIZE(palmte_keymap),
75 };
76
77 static struct omap_kp_platform_data palmte_kp_data = {
78         .rows   = 8,
79         .cols   = 8,
80         .keymap_data = &palmte_keymap_data,
81         .rep    = true,
82         .delay  = 12,
83 };
84
85 static struct resource palmte_kp_resources[] = {
86         [0]     = {
87                 .start  = INT_KEYBOARD,
88                 .end    = INT_KEYBOARD,
89                 .flags  = IORESOURCE_IRQ,
90         },
91 };
92
93 static struct platform_device palmte_kp_device = {
94         .name           = "omap-keypad",
95         .id             = -1,
96         .dev            = {
97                 .platform_data  = &palmte_kp_data,
98         },
99         .num_resources  = ARRAY_SIZE(palmte_kp_resources),
100         .resource       = palmte_kp_resources,
101 };
102
103 static struct mtd_partition palmte_rom_partitions[] = {
104         /* PalmOS "Small ROM", contains the bootloader and the debugger */
105         {
106                 .name           = "smallrom",
107                 .offset         = 0,
108                 .size           = 0xa000,
109                 .mask_flags     = MTD_WRITEABLE,
110         },
111         /* PalmOS "Big ROM", a filesystem with all the OS code and data */
112         {
113                 .name           = "bigrom",
114                 .offset         = SZ_128K,
115                 /*
116                  * 0x5f0000 bytes big in the multi-language ("EFIGS") version,
117                  * 0x7b0000 bytes in the English-only ("enUS") version.
118                  */
119                 .size           = 0x7b0000,
120                 .mask_flags     = MTD_WRITEABLE,
121         },
122 };
123
124 static struct physmap_flash_data palmte_rom_data = {
125         .width          = 2,
126         .set_vpp        = omap1_set_vpp,
127         .parts          = palmte_rom_partitions,
128         .nr_parts       = ARRAY_SIZE(palmte_rom_partitions),
129 };
130
131 static struct resource palmte_rom_resource = {
132         .start          = OMAP_CS0_PHYS,
133         .end            = OMAP_CS0_PHYS + SZ_8M - 1,
134         .flags          = IORESOURCE_MEM,
135 };
136
137 static struct platform_device palmte_rom_device = {
138         .name           = "physmap-flash",
139         .id             = -1,
140         .dev            = {
141                 .platform_data  = &palmte_rom_data,
142         },
143         .num_resources  = 1,
144         .resource       = &palmte_rom_resource,
145 };
146
147 static struct platform_device palmte_lcd_device = {
148         .name           = "lcd_palmte",
149         .id             = -1,
150 };
151
152 static struct omap_backlight_config palmte_backlight_config = {
153         .default_intensity      = 0xa0,
154 };
155
156 static struct platform_device palmte_backlight_device = {
157         .name           = "omap-bl",
158         .id             = -1,
159         .dev            = {
160                 .platform_data  = &palmte_backlight_config,
161         },
162 };
163
164 static struct platform_device *palmte_devices[] __initdata = {
165         &palmte_rom_device,
166         &palmte_kp_device,
167         &palmte_lcd_device,
168         &palmte_backlight_device,
169 };
170
171 static struct omap_usb_config palmte_usb_config __initdata = {
172         .register_dev   = 1,    /* Mini-B only receptacle */
173         .hmc_mode       = 0,
174         .pins[0]        = 2,
175 };
176
177 static const struct omap_lcd_config palmte_lcd_config __initconst = {
178         .ctrl_name      = "internal",
179 };
180
181 static struct spi_board_info palmte_spi_info[] __initdata = {
182         {
183                 .modalias       = "tsc2102",
184                 .bus_num        = 2,    /* uWire (officially) */
185                 .chip_select    = 0,    /* As opposed to 3 */
186                 .max_speed_hz   = 8000000,
187         },
188 };
189
190 static void __init palmte_misc_gpio_setup(void)
191 {
192         /* Set TSC2102 PINTDAV pin as input (used by TSC2102 driver) */
193         if (gpio_request(PALMTE_PINTDAV_GPIO, "TSC2102 PINTDAV") < 0) {
194                 printk(KERN_ERR "Could not reserve PINTDAV GPIO!\n");
195                 return;
196         }
197         gpio_direction_input(PALMTE_PINTDAV_GPIO);
198
199         /* Set USB-or-DC-IN pin as input (unused) */
200         if (gpio_request(PALMTE_USB_OR_DC_GPIO, "USB/DC-IN") < 0) {
201                 printk(KERN_ERR "Could not reserve cable signal GPIO!\n");
202                 return;
203         }
204         gpio_direction_input(PALMTE_USB_OR_DC_GPIO);
205 }
206
207 #if IS_ENABLED(CONFIG_MMC_OMAP)
208
209 static struct omap_mmc_platform_data _palmte_mmc_config = {
210         .nr_slots                       = 1,
211         .slots[0]                       = {
212                 .ocr_mask               = MMC_VDD_32_33|MMC_VDD_33_34,
213                 .name                   = "mmcblk",
214         },
215 };
216
217 static struct omap_mmc_platform_data *palmte_mmc_config[OMAP15XX_NR_MMC] = {
218         [0] = &_palmte_mmc_config,
219 };
220
221 static void palmte_mmc_init(void)
222 {
223         omap1_init_mmc(palmte_mmc_config, OMAP15XX_NR_MMC);
224 }
225
226 #else /* CONFIG_MMC_OMAP */
227
228 static void palmte_mmc_init(void)
229 {
230 }
231
232 #endif /* CONFIG_MMC_OMAP */
233
234 static void __init omap_palmte_init(void)
235 {
236         /* mux pins for uarts */
237         omap_cfg_reg(UART1_TX);
238         omap_cfg_reg(UART1_RTS);
239         omap_cfg_reg(UART2_TX);
240         omap_cfg_reg(UART2_RTS);
241         omap_cfg_reg(UART3_TX);
242         omap_cfg_reg(UART3_RX);
243
244         platform_add_devices(palmte_devices, ARRAY_SIZE(palmte_devices));
245
246         palmte_spi_info[0].irq = gpio_to_irq(PALMTE_PINTDAV_GPIO);
247         spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
248         palmte_misc_gpio_setup();
249         omap_serial_init();
250         omap1_usb_init(&palmte_usb_config);
251         omap_register_i2c_bus(1, 100, NULL, 0);
252
253         omapfb_set_lcd_config(&palmte_lcd_config);
254         palmte_mmc_init();
255 }
256
257 MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
258         .atag_offset    = 0x100,
259         .map_io         = omap15xx_map_io,
260         .init_early     = omap1_init_early,
261         .init_irq       = omap1_init_irq,
262         .handle_irq     = omap1_handle_irq,
263         .init_machine   = omap_palmte_init,
264         .init_late      = omap1_init_late,
265         .init_time      = omap1_timer_init,
266         .restart        = omap1_restart,
267 MACHINE_END