18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * linux/arch/arm/mach-mmp/aspenite.c 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Support for the Marvell PXA168-based Aspenite and Zylonite2 68c2ecf20Sopenharmony_ci * Development Platform. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#include <linux/gpio.h> 98c2ecf20Sopenharmony_ci#include <linux/gpio-pxa.h> 108c2ecf20Sopenharmony_ci#include <linux/init.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 138c2ecf20Sopenharmony_ci#include <linux/smc91x.h> 148c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 158c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 168c2ecf20Sopenharmony_ci#include <linux/mtd/rawnand.h> 178c2ecf20Sopenharmony_ci#include <linux/interrupt.h> 188c2ecf20Sopenharmony_ci#include <linux/platform_data/mv_usb.h> 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 218c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 228c2ecf20Sopenharmony_ci#include <video/pxa168fb.h> 238c2ecf20Sopenharmony_ci#include <linux/input.h> 248c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-pxa27x.h> 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci#include "addr-map.h" 278c2ecf20Sopenharmony_ci#include "mfp-pxa168.h" 288c2ecf20Sopenharmony_ci#include "pxa168.h" 298c2ecf20Sopenharmony_ci#include "pxa910.h" 308c2ecf20Sopenharmony_ci#include "irqs.h" 318c2ecf20Sopenharmony_ci#include "common.h" 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_cistatic unsigned long common_pin_config[] __initdata = { 348c2ecf20Sopenharmony_ci /* Data Flash Interface */ 358c2ecf20Sopenharmony_ci GPIO0_DFI_D15, 368c2ecf20Sopenharmony_ci GPIO1_DFI_D14, 378c2ecf20Sopenharmony_ci GPIO2_DFI_D13, 388c2ecf20Sopenharmony_ci GPIO3_DFI_D12, 398c2ecf20Sopenharmony_ci GPIO4_DFI_D11, 408c2ecf20Sopenharmony_ci GPIO5_DFI_D10, 418c2ecf20Sopenharmony_ci GPIO6_DFI_D9, 428c2ecf20Sopenharmony_ci GPIO7_DFI_D8, 438c2ecf20Sopenharmony_ci GPIO8_DFI_D7, 448c2ecf20Sopenharmony_ci GPIO9_DFI_D6, 458c2ecf20Sopenharmony_ci GPIO10_DFI_D5, 468c2ecf20Sopenharmony_ci GPIO11_DFI_D4, 478c2ecf20Sopenharmony_ci GPIO12_DFI_D3, 488c2ecf20Sopenharmony_ci GPIO13_DFI_D2, 498c2ecf20Sopenharmony_ci GPIO14_DFI_D1, 508c2ecf20Sopenharmony_ci GPIO15_DFI_D0, 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci /* Static Memory Controller */ 538c2ecf20Sopenharmony_ci GPIO18_SMC_nCS0, 548c2ecf20Sopenharmony_ci GPIO34_SMC_nCS1, 558c2ecf20Sopenharmony_ci GPIO23_SMC_nLUA, 568c2ecf20Sopenharmony_ci GPIO25_SMC_nLLA, 578c2ecf20Sopenharmony_ci GPIO28_SMC_RDY, 588c2ecf20Sopenharmony_ci GPIO29_SMC_SCLK, 598c2ecf20Sopenharmony_ci GPIO35_SMC_BE1, 608c2ecf20Sopenharmony_ci GPIO36_SMC_BE2, 618c2ecf20Sopenharmony_ci GPIO27_GPIO, /* Ethernet IRQ */ 628c2ecf20Sopenharmony_ci 638c2ecf20Sopenharmony_ci /* UART1 */ 648c2ecf20Sopenharmony_ci GPIO107_UART1_RXD, 658c2ecf20Sopenharmony_ci GPIO108_UART1_TXD, 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci /* SSP1 */ 688c2ecf20Sopenharmony_ci GPIO113_I2S_MCLK, 698c2ecf20Sopenharmony_ci GPIO114_I2S_FRM, 708c2ecf20Sopenharmony_ci GPIO115_I2S_BCLK, 718c2ecf20Sopenharmony_ci GPIO116_I2S_RXD, 728c2ecf20Sopenharmony_ci GPIO117_I2S_TXD, 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci /* LCD */ 758c2ecf20Sopenharmony_ci GPIO56_LCD_FCLK_RD, 768c2ecf20Sopenharmony_ci GPIO57_LCD_LCLK_A0, 778c2ecf20Sopenharmony_ci GPIO58_LCD_PCLK_WR, 788c2ecf20Sopenharmony_ci GPIO59_LCD_DENA_BIAS, 798c2ecf20Sopenharmony_ci GPIO60_LCD_DD0, 808c2ecf20Sopenharmony_ci GPIO61_LCD_DD1, 818c2ecf20Sopenharmony_ci GPIO62_LCD_DD2, 828c2ecf20Sopenharmony_ci GPIO63_LCD_DD3, 838c2ecf20Sopenharmony_ci GPIO64_LCD_DD4, 848c2ecf20Sopenharmony_ci GPIO65_LCD_DD5, 858c2ecf20Sopenharmony_ci GPIO66_LCD_DD6, 868c2ecf20Sopenharmony_ci GPIO67_LCD_DD7, 878c2ecf20Sopenharmony_ci GPIO68_LCD_DD8, 888c2ecf20Sopenharmony_ci GPIO69_LCD_DD9, 898c2ecf20Sopenharmony_ci GPIO70_LCD_DD10, 908c2ecf20Sopenharmony_ci GPIO71_LCD_DD11, 918c2ecf20Sopenharmony_ci GPIO72_LCD_DD12, 928c2ecf20Sopenharmony_ci GPIO73_LCD_DD13, 938c2ecf20Sopenharmony_ci GPIO74_LCD_DD14, 948c2ecf20Sopenharmony_ci GPIO75_LCD_DD15, 958c2ecf20Sopenharmony_ci GPIO76_LCD_DD16, 968c2ecf20Sopenharmony_ci GPIO77_LCD_DD17, 978c2ecf20Sopenharmony_ci GPIO78_LCD_DD18, 988c2ecf20Sopenharmony_ci GPIO79_LCD_DD19, 998c2ecf20Sopenharmony_ci GPIO80_LCD_DD20, 1008c2ecf20Sopenharmony_ci GPIO81_LCD_DD21, 1018c2ecf20Sopenharmony_ci GPIO82_LCD_DD22, 1028c2ecf20Sopenharmony_ci GPIO83_LCD_DD23, 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci /* Keypad */ 1058c2ecf20Sopenharmony_ci GPIO109_KP_MKIN1, 1068c2ecf20Sopenharmony_ci GPIO110_KP_MKIN0, 1078c2ecf20Sopenharmony_ci GPIO111_KP_MKOUT7, 1088c2ecf20Sopenharmony_ci GPIO112_KP_MKOUT6, 1098c2ecf20Sopenharmony_ci GPIO121_KP_MKIN4, 1108c2ecf20Sopenharmony_ci}; 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_cistatic struct pxa_gpio_platform_data pxa168_gpio_pdata = { 1138c2ecf20Sopenharmony_ci .irq_base = MMP_GPIO_TO_IRQ(0), 1148c2ecf20Sopenharmony_ci}; 1158c2ecf20Sopenharmony_ci 1168c2ecf20Sopenharmony_cistatic struct smc91x_platdata smc91x_info = { 1178c2ecf20Sopenharmony_ci .flags = SMC91X_USE_16BIT | SMC91X_NOWAIT, 1188c2ecf20Sopenharmony_ci}; 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistatic struct resource smc91x_resources[] = { 1218c2ecf20Sopenharmony_ci [0] = { 1228c2ecf20Sopenharmony_ci .start = SMC_CS1_PHYS_BASE + 0x300, 1238c2ecf20Sopenharmony_ci .end = SMC_CS1_PHYS_BASE + 0xfffff, 1248c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 1258c2ecf20Sopenharmony_ci }, 1268c2ecf20Sopenharmony_ci [1] = { 1278c2ecf20Sopenharmony_ci .start = MMP_GPIO_TO_IRQ(27), 1288c2ecf20Sopenharmony_ci .end = MMP_GPIO_TO_IRQ(27), 1298c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHEDGE, 1308c2ecf20Sopenharmony_ci } 1318c2ecf20Sopenharmony_ci}; 1328c2ecf20Sopenharmony_ci 1338c2ecf20Sopenharmony_cistatic struct platform_device smc91x_device = { 1348c2ecf20Sopenharmony_ci .name = "smc91x", 1358c2ecf20Sopenharmony_ci .id = 0, 1368c2ecf20Sopenharmony_ci .dev = { 1378c2ecf20Sopenharmony_ci .platform_data = &smc91x_info, 1388c2ecf20Sopenharmony_ci }, 1398c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(smc91x_resources), 1408c2ecf20Sopenharmony_ci .resource = smc91x_resources, 1418c2ecf20Sopenharmony_ci}; 1428c2ecf20Sopenharmony_ci 1438c2ecf20Sopenharmony_cistatic struct mtd_partition aspenite_nand_partitions[] = { 1448c2ecf20Sopenharmony_ci { 1458c2ecf20Sopenharmony_ci .name = "bootloader", 1468c2ecf20Sopenharmony_ci .offset = 0, 1478c2ecf20Sopenharmony_ci .size = SZ_1M, 1488c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, 1498c2ecf20Sopenharmony_ci }, { 1508c2ecf20Sopenharmony_ci .name = "reserved", 1518c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1528c2ecf20Sopenharmony_ci .size = SZ_128K, 1538c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, 1548c2ecf20Sopenharmony_ci }, { 1558c2ecf20Sopenharmony_ci .name = "reserved", 1568c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1578c2ecf20Sopenharmony_ci .size = SZ_8M, 1588c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, 1598c2ecf20Sopenharmony_ci }, { 1608c2ecf20Sopenharmony_ci .name = "kernel", 1618c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1628c2ecf20Sopenharmony_ci .size = (SZ_2M + SZ_1M), 1638c2ecf20Sopenharmony_ci .mask_flags = 0, 1648c2ecf20Sopenharmony_ci }, { 1658c2ecf20Sopenharmony_ci .name = "filesystem", 1668c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 1678c2ecf20Sopenharmony_ci .size = SZ_32M + SZ_16M, 1688c2ecf20Sopenharmony_ci .mask_flags = 0, 1698c2ecf20Sopenharmony_ci } 1708c2ecf20Sopenharmony_ci}; 1718c2ecf20Sopenharmony_ci 1728c2ecf20Sopenharmony_cistatic struct pxa3xx_nand_platform_data aspenite_nand_info = { 1738c2ecf20Sopenharmony_ci .parts = aspenite_nand_partitions, 1748c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(aspenite_nand_partitions), 1758c2ecf20Sopenharmony_ci}; 1768c2ecf20Sopenharmony_ci 1778c2ecf20Sopenharmony_cistatic struct i2c_board_info aspenite_i2c_info[] __initdata = { 1788c2ecf20Sopenharmony_ci { I2C_BOARD_INFO("wm8753", 0x1b), }, 1798c2ecf20Sopenharmony_ci}; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic struct fb_videomode video_modes[] = { 1828c2ecf20Sopenharmony_ci [0] = { 1838c2ecf20Sopenharmony_ci .pixclock = 30120, 1848c2ecf20Sopenharmony_ci .refresh = 60, 1858c2ecf20Sopenharmony_ci .xres = 800, 1868c2ecf20Sopenharmony_ci .yres = 480, 1878c2ecf20Sopenharmony_ci .hsync_len = 1, 1888c2ecf20Sopenharmony_ci .left_margin = 215, 1898c2ecf20Sopenharmony_ci .right_margin = 40, 1908c2ecf20Sopenharmony_ci .vsync_len = 1, 1918c2ecf20Sopenharmony_ci .upper_margin = 34, 1928c2ecf20Sopenharmony_ci .lower_margin = 10, 1938c2ecf20Sopenharmony_ci .sync = FB_SYNC_VERT_HIGH_ACT | FB_SYNC_HOR_HIGH_ACT, 1948c2ecf20Sopenharmony_ci }, 1958c2ecf20Sopenharmony_ci}; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_cistruct pxa168fb_mach_info aspenite_lcd_info = { 1988c2ecf20Sopenharmony_ci .id = "Graphic Frame", 1998c2ecf20Sopenharmony_ci .modes = video_modes, 2008c2ecf20Sopenharmony_ci .num_modes = ARRAY_SIZE(video_modes), 2018c2ecf20Sopenharmony_ci .pix_fmt = PIX_FMT_RGB565, 2028c2ecf20Sopenharmony_ci .io_pin_allocation_mode = PIN_MODE_DUMB_24, 2038c2ecf20Sopenharmony_ci .dumb_mode = DUMB_MODE_RGB888, 2048c2ecf20Sopenharmony_ci .active = 1, 2058c2ecf20Sopenharmony_ci .panel_rbswap = 0, 2068c2ecf20Sopenharmony_ci .invert_pixclock = 0, 2078c2ecf20Sopenharmony_ci}; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistatic const unsigned int aspenite_matrix_key_map[] = { 2108c2ecf20Sopenharmony_ci KEY(0, 6, KEY_UP), /* SW 4 */ 2118c2ecf20Sopenharmony_ci KEY(0, 7, KEY_DOWN), /* SW 5 */ 2128c2ecf20Sopenharmony_ci KEY(1, 6, KEY_LEFT), /* SW 6 */ 2138c2ecf20Sopenharmony_ci KEY(1, 7, KEY_RIGHT), /* SW 7 */ 2148c2ecf20Sopenharmony_ci KEY(4, 6, KEY_ENTER), /* SW 8 */ 2158c2ecf20Sopenharmony_ci KEY(4, 7, KEY_ESC), /* SW 9 */ 2168c2ecf20Sopenharmony_ci}; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_cistatic struct matrix_keymap_data aspenite_matrix_keymap_data = { 2198c2ecf20Sopenharmony_ci .keymap = aspenite_matrix_key_map, 2208c2ecf20Sopenharmony_ci .keymap_size = ARRAY_SIZE(aspenite_matrix_key_map), 2218c2ecf20Sopenharmony_ci}; 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_cistatic struct pxa27x_keypad_platform_data aspenite_keypad_info __initdata = { 2248c2ecf20Sopenharmony_ci .matrix_key_rows = 5, 2258c2ecf20Sopenharmony_ci .matrix_key_cols = 8, 2268c2ecf20Sopenharmony_ci .matrix_keymap_data = &aspenite_matrix_keymap_data, 2278c2ecf20Sopenharmony_ci .debounce_interval = 30, 2288c2ecf20Sopenharmony_ci}; 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_EHCI_MV) 2318c2ecf20Sopenharmony_cistatic struct mv_usb_platform_data pxa168_sph_pdata = { 2328c2ecf20Sopenharmony_ci .mode = MV_USB_MODE_HOST, 2338c2ecf20Sopenharmony_ci .phy_init = pxa_usb_phy_init, 2348c2ecf20Sopenharmony_ci .phy_deinit = pxa_usb_phy_deinit, 2358c2ecf20Sopenharmony_ci .set_vbus = NULL, 2368c2ecf20Sopenharmony_ci}; 2378c2ecf20Sopenharmony_ci#endif 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistatic void __init common_init(void) 2408c2ecf20Sopenharmony_ci{ 2418c2ecf20Sopenharmony_ci mfp_config(ARRAY_AND_SIZE(common_pin_config)); 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci /* on-chip devices */ 2448c2ecf20Sopenharmony_ci pxa168_add_uart(1); 2458c2ecf20Sopenharmony_ci pxa168_add_twsi(1, NULL, ARRAY_AND_SIZE(aspenite_i2c_info)); 2468c2ecf20Sopenharmony_ci pxa168_add_ssp(1); 2478c2ecf20Sopenharmony_ci pxa168_add_nand(&aspenite_nand_info); 2488c2ecf20Sopenharmony_ci pxa168_add_fb(&aspenite_lcd_info); 2498c2ecf20Sopenharmony_ci pxa168_add_keypad(&aspenite_keypad_info); 2508c2ecf20Sopenharmony_ci platform_device_add_data(&pxa168_device_gpio, &pxa168_gpio_pdata, 2518c2ecf20Sopenharmony_ci sizeof(struct pxa_gpio_platform_data)); 2528c2ecf20Sopenharmony_ci platform_device_register(&pxa168_device_gpio); 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci /* off-chip devices */ 2558c2ecf20Sopenharmony_ci platform_device_register(&smc91x_device); 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_SUPPORT) 2588c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_PHY_PXA_USB) 2598c2ecf20Sopenharmony_ci platform_device_register(&pxa168_device_usb_phy); 2608c2ecf20Sopenharmony_ci#endif 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci#if IS_ENABLED(CONFIG_USB_EHCI_MV) 2638c2ecf20Sopenharmony_ci pxa168_add_usb_host(&pxa168_sph_pdata); 2648c2ecf20Sopenharmony_ci#endif 2658c2ecf20Sopenharmony_ci#endif 2668c2ecf20Sopenharmony_ci} 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ciMACHINE_START(ASPENITE, "PXA168-based Aspenite Development Platform") 2698c2ecf20Sopenharmony_ci .map_io = mmp_map_io, 2708c2ecf20Sopenharmony_ci .nr_irqs = MMP_NR_IRQS, 2718c2ecf20Sopenharmony_ci .init_irq = pxa168_init_irq, 2728c2ecf20Sopenharmony_ci .init_time = pxa168_timer_init, 2738c2ecf20Sopenharmony_ci .init_machine = common_init, 2748c2ecf20Sopenharmony_ci .restart = pxa168_restart, 2758c2ecf20Sopenharmony_ciMACHINE_END 2768c2ecf20Sopenharmony_ci 2778c2ecf20Sopenharmony_ciMACHINE_START(ZYLONITE2, "PXA168-based Zylonite2 Development Platform") 2788c2ecf20Sopenharmony_ci .map_io = mmp_map_io, 2798c2ecf20Sopenharmony_ci .nr_irqs = MMP_NR_IRQS, 2808c2ecf20Sopenharmony_ci .init_irq = pxa168_init_irq, 2818c2ecf20Sopenharmony_ci .init_time = pxa168_timer_init, 2828c2ecf20Sopenharmony_ci .init_machine = common_init, 2838c2ecf20Sopenharmony_ci .restart = pxa168_restart, 2848c2ecf20Sopenharmony_ciMACHINE_END 285