aspenite.c (6457B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * linux/arch/arm/mach-mmp/aspenite.c 4 * 5 * Support for the Marvell PXA168-based Aspenite and Zylonite2 6 * Development Platform. 7 */ 8#include <linux/gpio.h> 9#include <linux/gpio-pxa.h> 10#include <linux/init.h> 11#include <linux/kernel.h> 12#include <linux/platform_device.h> 13#include <linux/smc91x.h> 14#include <linux/mtd/mtd.h> 15#include <linux/mtd/partitions.h> 16#include <linux/mtd/rawnand.h> 17#include <linux/interrupt.h> 18#include <linux/platform_data/mv_usb.h> 19 20#include <asm/mach-types.h> 21#include <asm/mach/arch.h> 22#include <video/pxa168fb.h> 23#include <linux/input.h> 24#include <linux/platform_data/keypad-pxa27x.h> 25 26#include "addr-map.h" 27#include "mfp-pxa168.h" 28#include "pxa168.h" 29#include "pxa910.h" 30#include "irqs.h" 31#include "common.h" 32 33static unsigned long common_pin_config[] __initdata = { 34 /* Data Flash Interface */ 35 GPIO0_DFI_D15, 36 GPIO1_DFI_D14, 37 GPIO2_DFI_D13, 38 GPIO3_DFI_D12, 39 GPIO4_DFI_D11, 40 GPIO5_DFI_D10, 41 GPIO6_DFI_D9, 42 GPIO7_DFI_D8, 43 GPIO8_DFI_D7, 44 GPIO9_DFI_D6, 45 GPIO10_DFI_D5, 46 GPIO11_DFI_D4, 47 GPIO12_DFI_D3, 48 GPIO13_DFI_D2, 49 GPIO14_DFI_D1, 50 GPIO15_DFI_D0, 51 52 /* Static Memory Controller */ 53 GPIO18_SMC_nCS0, 54 GPIO34_SMC_nCS1, 55 GPIO23_SMC_nLUA, 56 GPIO25_SMC_nLLA, 57 GPIO28_SMC_RDY, 58 GPIO29_SMC_SCLK, 59 GPIO35_SMC_BE1, 60 GPIO36_SMC_BE2, 61 GPIO27_GPIO, /* Ethernet IRQ */ 62 63 /* UART1 */ 64 GPIO107_UART1_RXD, 65 GPIO108_UART1_TXD, 66 67 /* SSP1 */ 68 GPIO113_I2S_MCLK, 69 GPIO114_I2S_FRM, 70 GPIO115_I2S_BCLK, 71 GPIO116_I2S_RXD, 72 GPIO117_I2S_TXD, 73 74 /* LCD */ 75 GPIO56_LCD_FCLK_RD, 76 GPIO57_LCD_LCLK_A0, 77 GPIO58_LCD_PCLK_WR, 78 GPIO59_LCD_DENA_BIAS, 79 GPIO60_LCD_DD0, 80 GPIO61_LCD_DD1, 81 GPIO62_LCD_DD2, 82 GPIO63_LCD_DD3, 83 GPIO64_LCD_DD4, 84 GPIO65_LCD_DD5, 85 GPIO66_LCD_DD6, 86 GPIO67_LCD_DD7, 87 GPIO68_LCD_DD8, 88 GPIO69_LCD_DD9, 89 GPIO70_LCD_DD10, 90 GPIO71_LCD_DD11, 91 GPIO72_LCD_DD12, 92 GPIO73_LCD_DD13, 93 GPIO74_LCD_DD14, 94 GPIO75_LCD_DD15, 95 GPIO76_LCD_DD16, 96 GPIO77_LCD_DD17, 97 GPIO78_LCD_DD18, 98 GPIO79_LCD_DD19, 99 GPIO80_LCD_DD20, 100 GPIO81_LCD_DD21, 101 GPIO82_LCD_DD22, 102 GPIO83_LCD_DD23, 103 104 /* Keypad */ 105 GPIO109_KP_MKIN1, 106 GPIO110_KP_MKIN0, 107 GPIO111_KP_MKOUT7, 108 GPIO112_KP_MKOUT6, 109 GPIO121_KP_MKIN4, 110}; 111 112static struct pxa_gpio_platform_data pxa168_gpio_pdata = { 113 .irq_base = MMP_GPIO_TO_IRQ(0), 114}; 115 116static struct smc91x_platdata smc91x_info = { 117 .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 118}; 119 120static struct resource smc91x_resources[] = { 121 [0] = { 122 .start = SMC_CS1_PHYS_BASE + 0x300, 123 .end = SMC_CS1_PHYS_BASE + 0xfffff, 124 .flags = IORESOURCE_MEM, 125 }, 126 [1] = { 127 .start = MMP_GPIO_TO_IRQ(27), 128 .end = MMP_GPIO_TO_IRQ(27), 129 .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, 130 } 131}; 132 133static struct platform_device smc91x_device = { 134 .name = "smc91x", 135 .id = 0, 136 .dev = { 137 .platform_data = &smc91x_info, 138 }, 139 .num_resources = ARRAY_SIZE(smc91x_resources), 140 .resource = smc91x_resources, 141}; 142 143static struct mtd_partition aspenite_nand_partitions[] = { 144 { 145 .name = "bootloader", 146 .offset = 0, 147 .size = SZ_1M, 148 .mask_flags = MTD_WRITEABLE, 149 }, { 150 .name = "reserved", 151 .offset = MTDPART_OFS_APPEND, 152 .size = SZ_128K, 153 .mask_flags = MTD_WRITEABLE, 154 }, { 155 .name = "reserved", 156 .offset = MTDPART_OFS_APPEND, 157 .size = SZ_8M, 158 .mask_flags = MTD_WRITEABLE, 159 }, { 160 .name = "kernel", 161 .offset = MTDPART_OFS_APPEND, 162 .size = (SZ_2M + SZ_1M), 163 .mask_flags = 0, 164 }, { 165 .name = "filesystem", 166 .offset = MTDPART_OFS_APPEND, 167 .size = SZ_32M + SZ_16M, 168 .mask_flags = 0, 169 } 170}; 171 172static struct pxa3xx_nand_platform_data aspenite_nand_info = { 173 .parts = aspenite_nand_partitions, 174 .nr_parts = ARRAY_SIZE(aspenite_nand_partitions), 175}; 176 177static struct i2c_board_info aspenite_i2c_info[] __initdata = { 178 { I2C_BOARD_INFO("wm8753", 0x1b), }, 179}; 180 181static struct fb_videomode video_modes[] = { 182 [0] = { 183 .pixclock = 30120, 184 .refresh = 60, 185 .xres = 800, 186 .yres = 480, 187 .hsync_len = 1, 188 .left_margin = 215, 189 .right_margin = 40, 190 .vsync_len = 1, 191 .upper_margin = 34, 192 .lower_margin = 10, 193 .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, 194 }, 195}; 196 197struct pxa168fb_mach_info aspenite_lcd_info = { 198 .id = "Graphic Frame", 199 .modes = video_modes, 200 .num_modes = ARRAY_SIZE(video_modes), 201 .pix_fmt = PIX_FMT_RGB565, 202 .io_pin_allocation_mode = PIN_MODE_DUMB_24, 203 .dumb_mode = DUMB_MODE_RGB888, 204 .active = 1, 205 .panel_rbswap = 0, 206 .invert_pixclock = 0, 207}; 208 209static const unsigned int aspenite_matrix_key_map[] = { 210 KEY(0, 6, KEY_UP), /* SW 4 */ 211 KEY(0, 7, KEY_DOWN), /* SW 5 */ 212 KEY(1, 6, KEY_LEFT), /* SW 6 */ 213 KEY(1, 7, KEY_RIGHT), /* SW 7 */ 214 KEY(4, 6, KEY_ENTER), /* SW 8 */ 215 KEY(4, 7, KEY_ESC), /* SW 9 */ 216}; 217 218static struct matrix_keymap_data aspenite_matrix_keymap_data = { 219 .keymap = aspenite_matrix_key_map, 220 .keymap_size = ARRAY_SIZE(aspenite_matrix_key_map), 221}; 222 223static struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = { 224 .matrix_key_rows = 5, 225 .matrix_key_cols = 8, 226 .matrix_keymap_data = &aspenite_matrix_keymap_data, 227 .debounce_interval = 30, 228}; 229 230#if IS_ENABLED(CONFIG_USB_EHCI_MV) 231static struct mv_usb_platform_data pxa168_sph_pdata = { 232 .mode = MV_USB_MODE_HOST, 233 .phy_init = pxa_usb_phy_init, 234 .phy_deinit = pxa_usb_phy_deinit, 235 .set_vbus = NULL, 236}; 237#endif 238 239static void __init common_init(void) 240{ 241 mfp_config(ARRAY_AND_SIZE(common_pin_config)); 242 243 /* on-chip devices */ 244 pxa168_add_uart(1); 245 pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); 246 pxa168_add_ssp(1); 247 pxa168_add_nand(&aspenite_nand_info); 248 pxa168_add_fb(&aspenite_lcd_info); 249 pxa168_add_keypad(&aspenite_keypad_info); 250 platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, 251 sizeof(struct pxa_gpio_platform_data)); 252 platform_device_register(&pxa168_device_gpio); 253 254 /* off-chip devices */ 255 platform_device_register(&smc91x_device); 256 257#if IS_ENABLED(CONFIG_USB_SUPPORT) 258#if IS_ENABLED(CONFIG_PHY_PXA_USB) 259 platform_device_register(&pxa168_device_usb_phy); 260#endif 261 262#if IS_ENABLED(CONFIG_USB_EHCI_MV) 263 pxa168_add_usb_host(&pxa168_sph_pdata); 264#endif 265#endif 266} 267 268MACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform") 269 .map_io = mmp_map_io, 270 .nr_irqs = MMP_NR_IRQS, 271 .init_irq = pxa168_init_irq, 272 .init_time = pxa168_timer_init, 273 .init_machine = common_init, 274 .restart = pxa168_restart, 275MACHINE_END 276 277MACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") 278 .map_io = mmp_map_io, 279 .nr_irqs = MMP_NR_IRQS, 280 .init_irq = pxa168_init_irq, 281 .init_time = pxa168_timer_init, 282 .init_machine = common_init, 283 .restart = pxa168_restart, 284MACHINE_END