18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci* linux/arch/arm/mach-omap1/board-sx1.c 48c2ecf20Sopenharmony_ci* 58c2ecf20Sopenharmony_ci* Modified from board-generic.c 68c2ecf20Sopenharmony_ci* 78c2ecf20Sopenharmony_ci* Support for the Siemens SX1 mobile phone. 88c2ecf20Sopenharmony_ci* 98c2ecf20Sopenharmony_ci* Original version : Vladimir Ananiev (Vovan888-at-gmail com) 108c2ecf20Sopenharmony_ci* 118c2ecf20Sopenharmony_ci* Maintainters : Vladimir Ananiev (aka Vovan888), Sergge 128c2ecf20Sopenharmony_ci* oslik.ru 138c2ecf20Sopenharmony_ci*/ 148c2ecf20Sopenharmony_ci#include <linux/gpio.h> 158c2ecf20Sopenharmony_ci#include <linux/kernel.h> 168c2ecf20Sopenharmony_ci#include <linux/init.h> 178c2ecf20Sopenharmony_ci#include <linux/input.h> 188c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 198c2ecf20Sopenharmony_ci#include <linux/notifier.h> 208c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 218c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 228c2ecf20Sopenharmony_ci#include <linux/mtd/physmap.h> 238c2ecf20Sopenharmony_ci#include <linux/types.h> 248c2ecf20Sopenharmony_ci#include <linux/i2c.h> 258c2ecf20Sopenharmony_ci#include <linux/errno.h> 268c2ecf20Sopenharmony_ci#include <linux/export.h> 278c2ecf20Sopenharmony_ci#include <linux/omapfb.h> 288c2ecf20Sopenharmony_ci#include <linux/platform_data/keypad-omap.h> 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 318c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 328c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci#include "flash.h" 358c2ecf20Sopenharmony_ci#include <mach/mux.h> 368c2ecf20Sopenharmony_ci#include <linux/omap-dma.h> 378c2ecf20Sopenharmony_ci#include <mach/tc.h> 388c2ecf20Sopenharmony_ci#include "board-sx1.h" 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci#include <mach/hardware.h> 418c2ecf20Sopenharmony_ci#include <mach/usb.h> 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci#include "common.h" 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci/* Write to I2C device */ 468c2ecf20Sopenharmony_ciint sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value) 478c2ecf20Sopenharmony_ci{ 488c2ecf20Sopenharmony_ci struct i2c_adapter *adap; 498c2ecf20Sopenharmony_ci int err; 508c2ecf20Sopenharmony_ci struct i2c_msg msg[1]; 518c2ecf20Sopenharmony_ci unsigned char data[2]; 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci adap = i2c_get_adapter(0); 548c2ecf20Sopenharmony_ci if (!adap) 558c2ecf20Sopenharmony_ci return -ENODEV; 568c2ecf20Sopenharmony_ci msg->addr = devaddr; /* I2C address of chip */ 578c2ecf20Sopenharmony_ci msg->flags = 0; 588c2ecf20Sopenharmony_ci msg->len = 2; 598c2ecf20Sopenharmony_ci msg->buf = data; 608c2ecf20Sopenharmony_ci data[0] = regoffset; /* register num */ 618c2ecf20Sopenharmony_ci data[1] = value; /* register data */ 628c2ecf20Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 638c2ecf20Sopenharmony_ci i2c_put_adapter(adap); 648c2ecf20Sopenharmony_ci if (err >= 0) 658c2ecf20Sopenharmony_ci return 0; 668c2ecf20Sopenharmony_ci return err; 678c2ecf20Sopenharmony_ci} 688c2ecf20Sopenharmony_ci 698c2ecf20Sopenharmony_ci/* Read from I2C device */ 708c2ecf20Sopenharmony_ciint sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value) 718c2ecf20Sopenharmony_ci{ 728c2ecf20Sopenharmony_ci struct i2c_adapter *adap; 738c2ecf20Sopenharmony_ci int err; 748c2ecf20Sopenharmony_ci struct i2c_msg msg[1]; 758c2ecf20Sopenharmony_ci unsigned char data[2]; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci adap = i2c_get_adapter(0); 788c2ecf20Sopenharmony_ci if (!adap) 798c2ecf20Sopenharmony_ci return -ENODEV; 808c2ecf20Sopenharmony_ci 818c2ecf20Sopenharmony_ci msg->addr = devaddr; /* I2C address of chip */ 828c2ecf20Sopenharmony_ci msg->flags = 0; 838c2ecf20Sopenharmony_ci msg->len = 1; 848c2ecf20Sopenharmony_ci msg->buf = data; 858c2ecf20Sopenharmony_ci data[0] = regoffset; /* register num */ 868c2ecf20Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 878c2ecf20Sopenharmony_ci 888c2ecf20Sopenharmony_ci msg->addr = devaddr; /* I2C address */ 898c2ecf20Sopenharmony_ci msg->flags = I2C_M_RD; 908c2ecf20Sopenharmony_ci msg->len = 1; 918c2ecf20Sopenharmony_ci msg->buf = data; 928c2ecf20Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 938c2ecf20Sopenharmony_ci *value = data[0]; 948c2ecf20Sopenharmony_ci i2c_put_adapter(adap); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if (err >= 0) 978c2ecf20Sopenharmony_ci return 0; 988c2ecf20Sopenharmony_ci return err; 998c2ecf20Sopenharmony_ci} 1008c2ecf20Sopenharmony_ci/* set keyboard backlight intensity */ 1018c2ecf20Sopenharmony_ciint sx1_setkeylight(u8 keylight) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci if (keylight > SOFIA_MAX_LIGHT_VAL) 1048c2ecf20Sopenharmony_ci keylight = SOFIA_MAX_LIGHT_VAL; 1058c2ecf20Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight); 1068c2ecf20Sopenharmony_ci} 1078c2ecf20Sopenharmony_ci/* get current keylight intensity */ 1088c2ecf20Sopenharmony_ciint sx1_getkeylight(u8 * keylight) 1098c2ecf20Sopenharmony_ci{ 1108c2ecf20Sopenharmony_ci return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight); 1118c2ecf20Sopenharmony_ci} 1128c2ecf20Sopenharmony_ci/* set LCD backlight intensity */ 1138c2ecf20Sopenharmony_ciint sx1_setbacklight(u8 backlight) 1148c2ecf20Sopenharmony_ci{ 1158c2ecf20Sopenharmony_ci if (backlight > SOFIA_MAX_LIGHT_VAL) 1168c2ecf20Sopenharmony_ci backlight = SOFIA_MAX_LIGHT_VAL; 1178c2ecf20Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG, 1188c2ecf20Sopenharmony_ci backlight); 1198c2ecf20Sopenharmony_ci} 1208c2ecf20Sopenharmony_ci/* get current LCD backlight intensity */ 1218c2ecf20Sopenharmony_ciint sx1_getbacklight (u8 * backlight) 1228c2ecf20Sopenharmony_ci{ 1238c2ecf20Sopenharmony_ci return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG, 1248c2ecf20Sopenharmony_ci backlight); 1258c2ecf20Sopenharmony_ci} 1268c2ecf20Sopenharmony_ci/* set LCD backlight power on/off */ 1278c2ecf20Sopenharmony_ciint sx1_setmmipower(u8 onoff) 1288c2ecf20Sopenharmony_ci{ 1298c2ecf20Sopenharmony_ci int err; 1308c2ecf20Sopenharmony_ci u8 dat = 0; 1318c2ecf20Sopenharmony_ci err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat); 1328c2ecf20Sopenharmony_ci if (err < 0) 1338c2ecf20Sopenharmony_ci return err; 1348c2ecf20Sopenharmony_ci if (onoff) 1358c2ecf20Sopenharmony_ci dat |= SOFIA_MMILIGHT_POWER; 1368c2ecf20Sopenharmony_ci else 1378c2ecf20Sopenharmony_ci dat &= ~SOFIA_MMILIGHT_POWER; 1388c2ecf20Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat); 1398c2ecf20Sopenharmony_ci} 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci/* set USB power on/off */ 1428c2ecf20Sopenharmony_ciint sx1_setusbpower(u8 onoff) 1438c2ecf20Sopenharmony_ci{ 1448c2ecf20Sopenharmony_ci int err; 1458c2ecf20Sopenharmony_ci u8 dat = 0; 1468c2ecf20Sopenharmony_ci err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat); 1478c2ecf20Sopenharmony_ci if (err < 0) 1488c2ecf20Sopenharmony_ci return err; 1498c2ecf20Sopenharmony_ci if (onoff) 1508c2ecf20Sopenharmony_ci dat |= SOFIA_USB_POWER; 1518c2ecf20Sopenharmony_ci else 1528c2ecf20Sopenharmony_ci dat &= ~SOFIA_USB_POWER; 1538c2ecf20Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat); 1548c2ecf20Sopenharmony_ci} 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_setkeylight); 1578c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_getkeylight); 1588c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_setbacklight); 1598c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_getbacklight); 1608c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_setmmipower); 1618c2ecf20Sopenharmony_ciEXPORT_SYMBOL(sx1_setusbpower); 1628c2ecf20Sopenharmony_ci 1638c2ecf20Sopenharmony_ci/*----------- Keypad -------------------------*/ 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_cistatic const unsigned int sx1_keymap[] = { 1668c2ecf20Sopenharmony_ci KEY(3, 5, GROUP_0 | 117), /* camera Qt::Key_F17 */ 1678c2ecf20Sopenharmony_ci KEY(4, 0, GROUP_0 | 114), /* voice memo Qt::Key_F14 */ 1688c2ecf20Sopenharmony_ci KEY(4, 1, GROUP_2 | 114), /* voice memo */ 1698c2ecf20Sopenharmony_ci KEY(4, 2, GROUP_3 | 114), /* voice memo */ 1708c2ecf20Sopenharmony_ci KEY(0, 0, GROUP_1 | KEY_F12), /* red button Qt::Key_Hangup */ 1718c2ecf20Sopenharmony_ci KEY(3, 4, GROUP_1 | KEY_LEFT), 1728c2ecf20Sopenharmony_ci KEY(3, 2, GROUP_1 | KEY_DOWN), 1738c2ecf20Sopenharmony_ci KEY(3, 1, GROUP_1 | KEY_RIGHT), 1748c2ecf20Sopenharmony_ci KEY(3, 0, GROUP_1 | KEY_UP), 1758c2ecf20Sopenharmony_ci KEY(3, 3, GROUP_1 | KEY_POWER), /* joystick press or Qt::Key_Select */ 1768c2ecf20Sopenharmony_ci KEY(0, 5, GROUP_1 | KEY_1), 1778c2ecf20Sopenharmony_ci KEY(0, 4, GROUP_1 | KEY_2), 1788c2ecf20Sopenharmony_ci KEY(0, 3, GROUP_1 | KEY_3), 1798c2ecf20Sopenharmony_ci KEY(4, 3, GROUP_1 | KEY_4), 1808c2ecf20Sopenharmony_ci KEY(4, 4, GROUP_1 | KEY_5), 1818c2ecf20Sopenharmony_ci KEY(4, 5, GROUP_1 | KEY_KPASTERISK),/* "*" */ 1828c2ecf20Sopenharmony_ci KEY(1, 4, GROUP_1 | KEY_6), 1838c2ecf20Sopenharmony_ci KEY(1, 5, GROUP_1 | KEY_7), 1848c2ecf20Sopenharmony_ci KEY(1, 3, GROUP_1 | KEY_8), 1858c2ecf20Sopenharmony_ci KEY(2, 3, GROUP_1 | KEY_9), 1868c2ecf20Sopenharmony_ci KEY(2, 5, GROUP_1 | KEY_0), 1878c2ecf20Sopenharmony_ci KEY(2, 4, GROUP_1 | 113), /* # F13 Toggle input method Qt::Key_F13 */ 1888c2ecf20Sopenharmony_ci KEY(1, 0, GROUP_1 | KEY_F11), /* green button Qt::Key_Call */ 1898c2ecf20Sopenharmony_ci KEY(2, 1, GROUP_1 | KEY_YEN), /* left soft Qt::Key_Context1 */ 1908c2ecf20Sopenharmony_ci KEY(2, 2, GROUP_1 | KEY_F8), /* right soft Qt::Key_Back */ 1918c2ecf20Sopenharmony_ci KEY(1, 2, GROUP_1 | KEY_LEFTSHIFT), /* shift */ 1928c2ecf20Sopenharmony_ci KEY(1, 1, GROUP_1 | KEY_BACKSPACE), /* C (clear) */ 1938c2ecf20Sopenharmony_ci KEY(2, 0, GROUP_1 | KEY_F7), /* menu Qt::Key_Menu */ 1948c2ecf20Sopenharmony_ci}; 1958c2ecf20Sopenharmony_ci 1968c2ecf20Sopenharmony_cistatic struct resource sx1_kp_resources[] = { 1978c2ecf20Sopenharmony_ci [0] = { 1988c2ecf20Sopenharmony_ci .start = INT_KEYBOARD, 1998c2ecf20Sopenharmony_ci .end = INT_KEYBOARD, 2008c2ecf20Sopenharmony_ci .flags = IORESOURCE_IRQ, 2018c2ecf20Sopenharmony_ci }, 2028c2ecf20Sopenharmony_ci}; 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_cistatic const struct matrix_keymap_data sx1_keymap_data = { 2058c2ecf20Sopenharmony_ci .keymap = sx1_keymap, 2068c2ecf20Sopenharmony_ci .keymap_size = ARRAY_SIZE(sx1_keymap), 2078c2ecf20Sopenharmony_ci}; 2088c2ecf20Sopenharmony_ci 2098c2ecf20Sopenharmony_cistatic struct omap_kp_platform_data sx1_kp_data = { 2108c2ecf20Sopenharmony_ci .rows = 6, 2118c2ecf20Sopenharmony_ci .cols = 6, 2128c2ecf20Sopenharmony_ci .keymap_data = &sx1_keymap_data, 2138c2ecf20Sopenharmony_ci .delay = 80, 2148c2ecf20Sopenharmony_ci}; 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cistatic struct platform_device sx1_kp_device = { 2178c2ecf20Sopenharmony_ci .name = "omap-keypad", 2188c2ecf20Sopenharmony_ci .id = -1, 2198c2ecf20Sopenharmony_ci .dev = { 2208c2ecf20Sopenharmony_ci .platform_data = &sx1_kp_data, 2218c2ecf20Sopenharmony_ci }, 2228c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(sx1_kp_resources), 2238c2ecf20Sopenharmony_ci .resource = sx1_kp_resources, 2248c2ecf20Sopenharmony_ci}; 2258c2ecf20Sopenharmony_ci 2268c2ecf20Sopenharmony_ci/*----------- MTD -------------------------*/ 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistatic struct mtd_partition sx1_partitions[] = { 2298c2ecf20Sopenharmony_ci /* bootloader (U-Boot, etc) in first sector */ 2308c2ecf20Sopenharmony_ci { 2318c2ecf20Sopenharmony_ci .name = "bootloader", 2328c2ecf20Sopenharmony_ci .offset = 0x01800000, 2338c2ecf20Sopenharmony_ci .size = SZ_128K, 2348c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* force read-only */ 2358c2ecf20Sopenharmony_ci }, 2368c2ecf20Sopenharmony_ci /* bootloader params in the next sector */ 2378c2ecf20Sopenharmony_ci { 2388c2ecf20Sopenharmony_ci .name = "params", 2398c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 2408c2ecf20Sopenharmony_ci .size = SZ_128K, 2418c2ecf20Sopenharmony_ci .mask_flags = 0, 2428c2ecf20Sopenharmony_ci }, 2438c2ecf20Sopenharmony_ci /* kernel */ 2448c2ecf20Sopenharmony_ci { 2458c2ecf20Sopenharmony_ci .name = "kernel", 2468c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 2478c2ecf20Sopenharmony_ci .size = SZ_2M - 2 * SZ_128K, 2488c2ecf20Sopenharmony_ci .mask_flags = 0 2498c2ecf20Sopenharmony_ci }, 2508c2ecf20Sopenharmony_ci /* file system */ 2518c2ecf20Sopenharmony_ci { 2528c2ecf20Sopenharmony_ci .name = "filesystem", 2538c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 2548c2ecf20Sopenharmony_ci .size = MTDPART_SIZ_FULL, 2558c2ecf20Sopenharmony_ci .mask_flags = 0 2568c2ecf20Sopenharmony_ci } 2578c2ecf20Sopenharmony_ci}; 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_cistatic struct physmap_flash_data sx1_flash_data = { 2608c2ecf20Sopenharmony_ci .width = 2, 2618c2ecf20Sopenharmony_ci .set_vpp = omap1_set_vpp, 2628c2ecf20Sopenharmony_ci .parts = sx1_partitions, 2638c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(sx1_partitions), 2648c2ecf20Sopenharmony_ci}; 2658c2ecf20Sopenharmony_ci 2668c2ecf20Sopenharmony_ci/* MTD Intel 4000 flash - new flashes */ 2678c2ecf20Sopenharmony_cistatic struct resource sx1_new_flash_resource = { 2688c2ecf20Sopenharmony_ci .start = OMAP_CS0_PHYS, 2698c2ecf20Sopenharmony_ci .end = OMAP_CS0_PHYS + SZ_32M - 1, 2708c2ecf20Sopenharmony_ci .flags = IORESOURCE_MEM, 2718c2ecf20Sopenharmony_ci}; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_cistatic struct platform_device sx1_flash_device = { 2748c2ecf20Sopenharmony_ci .name = "physmap-flash", 2758c2ecf20Sopenharmony_ci .id = 0, 2768c2ecf20Sopenharmony_ci .dev = { 2778c2ecf20Sopenharmony_ci .platform_data = &sx1_flash_data, 2788c2ecf20Sopenharmony_ci }, 2798c2ecf20Sopenharmony_ci .num_resources = 1, 2808c2ecf20Sopenharmony_ci .resource = &sx1_new_flash_resource, 2818c2ecf20Sopenharmony_ci}; 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci/*----------- USB -------------------------*/ 2848c2ecf20Sopenharmony_ci 2858c2ecf20Sopenharmony_cistatic struct omap_usb_config sx1_usb_config __initdata = { 2868c2ecf20Sopenharmony_ci .otg = 0, 2878c2ecf20Sopenharmony_ci .register_dev = 1, 2888c2ecf20Sopenharmony_ci .register_host = 0, 2898c2ecf20Sopenharmony_ci .hmc_mode = 0, 2908c2ecf20Sopenharmony_ci .pins[0] = 2, 2918c2ecf20Sopenharmony_ci .pins[1] = 0, 2928c2ecf20Sopenharmony_ci .pins[2] = 0, 2938c2ecf20Sopenharmony_ci}; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci/*----------- LCD -------------------------*/ 2968c2ecf20Sopenharmony_ci 2978c2ecf20Sopenharmony_cistatic const struct omap_lcd_config sx1_lcd_config __initconst = { 2988c2ecf20Sopenharmony_ci .ctrl_name = "internal", 2998c2ecf20Sopenharmony_ci}; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci/*-----------------------------------------*/ 3028c2ecf20Sopenharmony_cistatic struct platform_device *sx1_devices[] __initdata = { 3038c2ecf20Sopenharmony_ci &sx1_flash_device, 3048c2ecf20Sopenharmony_ci &sx1_kp_device, 3058c2ecf20Sopenharmony_ci}; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci/*-----------------------------------------*/ 3088c2ecf20Sopenharmony_ci 3098c2ecf20Sopenharmony_cistatic void __init omap_sx1_init(void) 3108c2ecf20Sopenharmony_ci{ 3118c2ecf20Sopenharmony_ci /* mux pins for uarts */ 3128c2ecf20Sopenharmony_ci omap_cfg_reg(UART1_TX); 3138c2ecf20Sopenharmony_ci omap_cfg_reg(UART1_RTS); 3148c2ecf20Sopenharmony_ci omap_cfg_reg(UART2_TX); 3158c2ecf20Sopenharmony_ci omap_cfg_reg(UART2_RTS); 3168c2ecf20Sopenharmony_ci omap_cfg_reg(UART3_TX); 3178c2ecf20Sopenharmony_ci omap_cfg_reg(UART3_RX); 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices)); 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci omap_serial_init(); 3228c2ecf20Sopenharmony_ci omap_register_i2c_bus(1, 100, NULL, 0); 3238c2ecf20Sopenharmony_ci omap1_usb_init(&sx1_usb_config); 3248c2ecf20Sopenharmony_ci sx1_mmc_init(); 3258c2ecf20Sopenharmony_ci 3268c2ecf20Sopenharmony_ci /* turn on USB power */ 3278c2ecf20Sopenharmony_ci /* sx1_setusbpower(1); can't do it here because i2c is not ready */ 3288c2ecf20Sopenharmony_ci gpio_request(1, "A_IRDA_OFF"); 3298c2ecf20Sopenharmony_ci gpio_request(11, "A_SWITCH"); 3308c2ecf20Sopenharmony_ci gpio_request(15, "A_USB_ON"); 3318c2ecf20Sopenharmony_ci gpio_direction_output(1, 1); /*A_IRDA_OFF = 1 */ 3328c2ecf20Sopenharmony_ci gpio_direction_output(11, 0); /*A_SWITCH = 0 */ 3338c2ecf20Sopenharmony_ci gpio_direction_output(15, 0); /*A_USB_ON = 0 */ 3348c2ecf20Sopenharmony_ci 3358c2ecf20Sopenharmony_ci omapfb_set_lcd_config(&sx1_lcd_config); 3368c2ecf20Sopenharmony_ci} 3378c2ecf20Sopenharmony_ci 3388c2ecf20Sopenharmony_ciMACHINE_START(SX1, "OMAP310 based Siemens SX1") 3398c2ecf20Sopenharmony_ci .atag_offset = 0x100, 3408c2ecf20Sopenharmony_ci .map_io = omap15xx_map_io, 3418c2ecf20Sopenharmony_ci .init_early = omap1_init_early, 3428c2ecf20Sopenharmony_ci .init_irq = omap1_init_irq, 3438c2ecf20Sopenharmony_ci .handle_irq = omap1_handle_irq, 3448c2ecf20Sopenharmony_ci .init_machine = omap_sx1_init, 3458c2ecf20Sopenharmony_ci .init_late = omap1_init_late, 3468c2ecf20Sopenharmony_ci .init_time = omap1_timer_init, 3478c2ecf20Sopenharmony_ci .restart = omap1_restart, 3488c2ecf20Sopenharmony_ciMACHINE_END 349