162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci* linux/arch/arm/mach-omap1/board-sx1.c 462306a36Sopenharmony_ci* 562306a36Sopenharmony_ci* Modified from board-generic.c 662306a36Sopenharmony_ci* 762306a36Sopenharmony_ci* Support for the Siemens SX1 mobile phone. 862306a36Sopenharmony_ci* 962306a36Sopenharmony_ci* Original version : Vladimir Ananiev (Vovan888-at-gmail com) 1062306a36Sopenharmony_ci* 1162306a36Sopenharmony_ci* Maintainters : Vladimir Ananiev (aka Vovan888), Sergge 1262306a36Sopenharmony_ci* oslik.ru 1362306a36Sopenharmony_ci*/ 1462306a36Sopenharmony_ci#include <linux/gpio/machine.h> 1562306a36Sopenharmony_ci#include <linux/gpio/consumer.h> 1662306a36Sopenharmony_ci#include <linux/kernel.h> 1762306a36Sopenharmony_ci#include <linux/init.h> 1862306a36Sopenharmony_ci#include <linux/input.h> 1962306a36Sopenharmony_ci#include <linux/platform_device.h> 2062306a36Sopenharmony_ci#include <linux/notifier.h> 2162306a36Sopenharmony_ci#include <linux/mtd/mtd.h> 2262306a36Sopenharmony_ci#include <linux/mtd/partitions.h> 2362306a36Sopenharmony_ci#include <linux/mtd/physmap.h> 2462306a36Sopenharmony_ci#include <linux/types.h> 2562306a36Sopenharmony_ci#include <linux/i2c.h> 2662306a36Sopenharmony_ci#include <linux/errno.h> 2762306a36Sopenharmony_ci#include <linux/export.h> 2862306a36Sopenharmony_ci#include <linux/omapfb.h> 2962306a36Sopenharmony_ci#include <linux/platform_data/keypad-omap.h> 3062306a36Sopenharmony_ci#include <linux/omap-dma.h> 3162306a36Sopenharmony_ci#include "tc.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#include <asm/mach-types.h> 3462306a36Sopenharmony_ci#include <asm/mach/arch.h> 3562306a36Sopenharmony_ci#include <asm/mach/map.h> 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci#include "flash.h" 3862306a36Sopenharmony_ci#include "mux.h" 3962306a36Sopenharmony_ci#include "board-sx1.h" 4062306a36Sopenharmony_ci#include "hardware.h" 4162306a36Sopenharmony_ci#include "usb.h" 4262306a36Sopenharmony_ci#include "common.h" 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci/* Write to I2C device */ 4562306a36Sopenharmony_ciint sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value) 4662306a36Sopenharmony_ci{ 4762306a36Sopenharmony_ci struct i2c_adapter *adap; 4862306a36Sopenharmony_ci int err; 4962306a36Sopenharmony_ci struct i2c_msg msg[1]; 5062306a36Sopenharmony_ci unsigned char data[2]; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci adap = i2c_get_adapter(0); 5362306a36Sopenharmony_ci if (!adap) 5462306a36Sopenharmony_ci return -ENODEV; 5562306a36Sopenharmony_ci msg->addr = devaddr; /* I2C address of chip */ 5662306a36Sopenharmony_ci msg->flags = 0; 5762306a36Sopenharmony_ci msg->len = 2; 5862306a36Sopenharmony_ci msg->buf = data; 5962306a36Sopenharmony_ci data[0] = regoffset; /* register num */ 6062306a36Sopenharmony_ci data[1] = value; /* register data */ 6162306a36Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 6262306a36Sopenharmony_ci i2c_put_adapter(adap); 6362306a36Sopenharmony_ci if (err >= 0) 6462306a36Sopenharmony_ci return 0; 6562306a36Sopenharmony_ci return err; 6662306a36Sopenharmony_ci} 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* Read from I2C device */ 6962306a36Sopenharmony_ciint sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value) 7062306a36Sopenharmony_ci{ 7162306a36Sopenharmony_ci struct i2c_adapter *adap; 7262306a36Sopenharmony_ci int err; 7362306a36Sopenharmony_ci struct i2c_msg msg[1]; 7462306a36Sopenharmony_ci unsigned char data[2]; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci adap = i2c_get_adapter(0); 7762306a36Sopenharmony_ci if (!adap) 7862306a36Sopenharmony_ci return -ENODEV; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci msg->addr = devaddr; /* I2C address of chip */ 8162306a36Sopenharmony_ci msg->flags = 0; 8262306a36Sopenharmony_ci msg->len = 1; 8362306a36Sopenharmony_ci msg->buf = data; 8462306a36Sopenharmony_ci data[0] = regoffset; /* register num */ 8562306a36Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci msg->addr = devaddr; /* I2C address */ 8862306a36Sopenharmony_ci msg->flags = I2C_M_RD; 8962306a36Sopenharmony_ci msg->len = 1; 9062306a36Sopenharmony_ci msg->buf = data; 9162306a36Sopenharmony_ci err = i2c_transfer(adap, msg, 1); 9262306a36Sopenharmony_ci *value = data[0]; 9362306a36Sopenharmony_ci i2c_put_adapter(adap); 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ci if (err >= 0) 9662306a36Sopenharmony_ci return 0; 9762306a36Sopenharmony_ci return err; 9862306a36Sopenharmony_ci} 9962306a36Sopenharmony_ci/* set keyboard backlight intensity */ 10062306a36Sopenharmony_ciint sx1_setkeylight(u8 keylight) 10162306a36Sopenharmony_ci{ 10262306a36Sopenharmony_ci if (keylight > SOFIA_MAX_LIGHT_VAL) 10362306a36Sopenharmony_ci keylight = SOFIA_MAX_LIGHT_VAL; 10462306a36Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight); 10562306a36Sopenharmony_ci} 10662306a36Sopenharmony_ci/* get current keylight intensity */ 10762306a36Sopenharmony_ciint sx1_getkeylight(u8 * keylight) 10862306a36Sopenharmony_ci{ 10962306a36Sopenharmony_ci return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight); 11062306a36Sopenharmony_ci} 11162306a36Sopenharmony_ci/* set LCD backlight intensity */ 11262306a36Sopenharmony_ciint sx1_setbacklight(u8 backlight) 11362306a36Sopenharmony_ci{ 11462306a36Sopenharmony_ci if (backlight > SOFIA_MAX_LIGHT_VAL) 11562306a36Sopenharmony_ci backlight = SOFIA_MAX_LIGHT_VAL; 11662306a36Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG, 11762306a36Sopenharmony_ci backlight); 11862306a36Sopenharmony_ci} 11962306a36Sopenharmony_ci/* get current LCD backlight intensity */ 12062306a36Sopenharmony_ciint sx1_getbacklight (u8 * backlight) 12162306a36Sopenharmony_ci{ 12262306a36Sopenharmony_ci return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG, 12362306a36Sopenharmony_ci backlight); 12462306a36Sopenharmony_ci} 12562306a36Sopenharmony_ci/* set LCD backlight power on/off */ 12662306a36Sopenharmony_ciint sx1_setmmipower(u8 onoff) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci int err; 12962306a36Sopenharmony_ci u8 dat = 0; 13062306a36Sopenharmony_ci err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat); 13162306a36Sopenharmony_ci if (err < 0) 13262306a36Sopenharmony_ci return err; 13362306a36Sopenharmony_ci if (onoff) 13462306a36Sopenharmony_ci dat |= SOFIA_MMILIGHT_POWER; 13562306a36Sopenharmony_ci else 13662306a36Sopenharmony_ci dat &= ~SOFIA_MMILIGHT_POWER; 13762306a36Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat); 13862306a36Sopenharmony_ci} 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci/* set USB power on/off */ 14162306a36Sopenharmony_ciint sx1_setusbpower(u8 onoff) 14262306a36Sopenharmony_ci{ 14362306a36Sopenharmony_ci int err; 14462306a36Sopenharmony_ci u8 dat = 0; 14562306a36Sopenharmony_ci err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat); 14662306a36Sopenharmony_ci if (err < 0) 14762306a36Sopenharmony_ci return err; 14862306a36Sopenharmony_ci if (onoff) 14962306a36Sopenharmony_ci dat |= SOFIA_USB_POWER; 15062306a36Sopenharmony_ci else 15162306a36Sopenharmony_ci dat &= ~SOFIA_USB_POWER; 15262306a36Sopenharmony_ci return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat); 15362306a36Sopenharmony_ci} 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_setkeylight); 15662306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_getkeylight); 15762306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_setbacklight); 15862306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_getbacklight); 15962306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_setmmipower); 16062306a36Sopenharmony_ciEXPORT_SYMBOL(sx1_setusbpower); 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci/*----------- Keypad -------------------------*/ 16362306a36Sopenharmony_ci 16462306a36Sopenharmony_cistatic const unsigned int sx1_keymap[] = { 16562306a36Sopenharmony_ci KEY(3, 5, GROUP_0 | 117), /* camera Qt::Key_F17 */ 16662306a36Sopenharmony_ci KEY(4, 0, GROUP_0 | 114), /* voice memo Qt::Key_F14 */ 16762306a36Sopenharmony_ci KEY(4, 1, GROUP_2 | 114), /* voice memo */ 16862306a36Sopenharmony_ci KEY(4, 2, GROUP_3 | 114), /* voice memo */ 16962306a36Sopenharmony_ci KEY(0, 0, GROUP_1 | KEY_F12), /* red button Qt::Key_Hangup */ 17062306a36Sopenharmony_ci KEY(3, 4, GROUP_1 | KEY_LEFT), 17162306a36Sopenharmony_ci KEY(3, 2, GROUP_1 | KEY_DOWN), 17262306a36Sopenharmony_ci KEY(3, 1, GROUP_1 | KEY_RIGHT), 17362306a36Sopenharmony_ci KEY(3, 0, GROUP_1 | KEY_UP), 17462306a36Sopenharmony_ci KEY(3, 3, GROUP_1 | KEY_POWER), /* joystick press or Qt::Key_Select */ 17562306a36Sopenharmony_ci KEY(0, 5, GROUP_1 | KEY_1), 17662306a36Sopenharmony_ci KEY(0, 4, GROUP_1 | KEY_2), 17762306a36Sopenharmony_ci KEY(0, 3, GROUP_1 | KEY_3), 17862306a36Sopenharmony_ci KEY(4, 3, GROUP_1 | KEY_4), 17962306a36Sopenharmony_ci KEY(4, 4, GROUP_1 | KEY_5), 18062306a36Sopenharmony_ci KEY(4, 5, GROUP_1 | KEY_KPASTERISK),/* "*" */ 18162306a36Sopenharmony_ci KEY(1, 4, GROUP_1 | KEY_6), 18262306a36Sopenharmony_ci KEY(1, 5, GROUP_1 | KEY_7), 18362306a36Sopenharmony_ci KEY(1, 3, GROUP_1 | KEY_8), 18462306a36Sopenharmony_ci KEY(2, 3, GROUP_1 | KEY_9), 18562306a36Sopenharmony_ci KEY(2, 5, GROUP_1 | KEY_0), 18662306a36Sopenharmony_ci KEY(2, 4, GROUP_1 | 113), /* # F13 Toggle input method Qt::Key_F13 */ 18762306a36Sopenharmony_ci KEY(1, 0, GROUP_1 | KEY_F11), /* green button Qt::Key_Call */ 18862306a36Sopenharmony_ci KEY(2, 1, GROUP_1 | KEY_YEN), /* left soft Qt::Key_Context1 */ 18962306a36Sopenharmony_ci KEY(2, 2, GROUP_1 | KEY_F8), /* right soft Qt::Key_Back */ 19062306a36Sopenharmony_ci KEY(1, 2, GROUP_1 | KEY_LEFTSHIFT), /* shift */ 19162306a36Sopenharmony_ci KEY(1, 1, GROUP_1 | KEY_BACKSPACE), /* C (clear) */ 19262306a36Sopenharmony_ci KEY(2, 0, GROUP_1 | KEY_F7), /* menu Qt::Key_Menu */ 19362306a36Sopenharmony_ci}; 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic struct resource sx1_kp_resources[] = { 19662306a36Sopenharmony_ci [0] = { 19762306a36Sopenharmony_ci .start = INT_KEYBOARD, 19862306a36Sopenharmony_ci .end = INT_KEYBOARD, 19962306a36Sopenharmony_ci .flags = IORESOURCE_IRQ, 20062306a36Sopenharmony_ci }, 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic const struct matrix_keymap_data sx1_keymap_data = { 20462306a36Sopenharmony_ci .keymap = sx1_keymap, 20562306a36Sopenharmony_ci .keymap_size = ARRAY_SIZE(sx1_keymap), 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_cistatic struct omap_kp_platform_data sx1_kp_data = { 20962306a36Sopenharmony_ci .rows = 6, 21062306a36Sopenharmony_ci .cols = 6, 21162306a36Sopenharmony_ci .keymap_data = &sx1_keymap_data, 21262306a36Sopenharmony_ci .delay = 80, 21362306a36Sopenharmony_ci}; 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_cistatic struct platform_device sx1_kp_device = { 21662306a36Sopenharmony_ci .name = "omap-keypad", 21762306a36Sopenharmony_ci .id = -1, 21862306a36Sopenharmony_ci .dev = { 21962306a36Sopenharmony_ci .platform_data = &sx1_kp_data, 22062306a36Sopenharmony_ci }, 22162306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(sx1_kp_resources), 22262306a36Sopenharmony_ci .resource = sx1_kp_resources, 22362306a36Sopenharmony_ci}; 22462306a36Sopenharmony_ci 22562306a36Sopenharmony_ci/*----------- MTD -------------------------*/ 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_cistatic struct mtd_partition sx1_partitions[] = { 22862306a36Sopenharmony_ci /* bootloader (U-Boot, etc) in first sector */ 22962306a36Sopenharmony_ci { 23062306a36Sopenharmony_ci .name = "bootloader", 23162306a36Sopenharmony_ci .offset = 0x01800000, 23262306a36Sopenharmony_ci .size = SZ_128K, 23362306a36Sopenharmony_ci .mask_flags = MTD_WRITEABLE, /* force read-only */ 23462306a36Sopenharmony_ci }, 23562306a36Sopenharmony_ci /* bootloader params in the next sector */ 23662306a36Sopenharmony_ci { 23762306a36Sopenharmony_ci .name = "params", 23862306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 23962306a36Sopenharmony_ci .size = SZ_128K, 24062306a36Sopenharmony_ci .mask_flags = 0, 24162306a36Sopenharmony_ci }, 24262306a36Sopenharmony_ci /* kernel */ 24362306a36Sopenharmony_ci { 24462306a36Sopenharmony_ci .name = "kernel", 24562306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 24662306a36Sopenharmony_ci .size = SZ_2M - 2 * SZ_128K, 24762306a36Sopenharmony_ci .mask_flags = 0 24862306a36Sopenharmony_ci }, 24962306a36Sopenharmony_ci /* file system */ 25062306a36Sopenharmony_ci { 25162306a36Sopenharmony_ci .name = "filesystem", 25262306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 25362306a36Sopenharmony_ci .size = MTDPART_SIZ_FULL, 25462306a36Sopenharmony_ci .mask_flags = 0 25562306a36Sopenharmony_ci } 25662306a36Sopenharmony_ci}; 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_cistatic struct physmap_flash_data sx1_flash_data = { 25962306a36Sopenharmony_ci .width = 2, 26062306a36Sopenharmony_ci .set_vpp = omap1_set_vpp, 26162306a36Sopenharmony_ci .parts = sx1_partitions, 26262306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(sx1_partitions), 26362306a36Sopenharmony_ci}; 26462306a36Sopenharmony_ci 26562306a36Sopenharmony_ci/* MTD Intel 4000 flash - new flashes */ 26662306a36Sopenharmony_cistatic struct resource sx1_new_flash_resource = { 26762306a36Sopenharmony_ci .start = OMAP_CS0_PHYS, 26862306a36Sopenharmony_ci .end = OMAP_CS0_PHYS + SZ_32M - 1, 26962306a36Sopenharmony_ci .flags = IORESOURCE_MEM, 27062306a36Sopenharmony_ci}; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_cistatic struct platform_device sx1_flash_device = { 27362306a36Sopenharmony_ci .name = "physmap-flash", 27462306a36Sopenharmony_ci .id = 0, 27562306a36Sopenharmony_ci .dev = { 27662306a36Sopenharmony_ci .platform_data = &sx1_flash_data, 27762306a36Sopenharmony_ci }, 27862306a36Sopenharmony_ci .num_resources = 1, 27962306a36Sopenharmony_ci .resource = &sx1_new_flash_resource, 28062306a36Sopenharmony_ci}; 28162306a36Sopenharmony_ci 28262306a36Sopenharmony_ci/*----------- USB -------------------------*/ 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_cistatic struct omap_usb_config sx1_usb_config __initdata = { 28562306a36Sopenharmony_ci .otg = 0, 28662306a36Sopenharmony_ci .register_dev = 1, 28762306a36Sopenharmony_ci .register_host = 0, 28862306a36Sopenharmony_ci .hmc_mode = 0, 28962306a36Sopenharmony_ci .pins[0] = 2, 29062306a36Sopenharmony_ci .pins[1] = 0, 29162306a36Sopenharmony_ci .pins[2] = 0, 29262306a36Sopenharmony_ci}; 29362306a36Sopenharmony_ci 29462306a36Sopenharmony_ci/*----------- LCD -------------------------*/ 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_cistatic const struct omap_lcd_config sx1_lcd_config __initconst = { 29762306a36Sopenharmony_ci .ctrl_name = "internal", 29862306a36Sopenharmony_ci}; 29962306a36Sopenharmony_ci 30062306a36Sopenharmony_ci/*-----------------------------------------*/ 30162306a36Sopenharmony_cistatic struct platform_device *sx1_devices[] __initdata = { 30262306a36Sopenharmony_ci &sx1_flash_device, 30362306a36Sopenharmony_ci &sx1_kp_device, 30462306a36Sopenharmony_ci}; 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci/*-----------------------------------------*/ 30762306a36Sopenharmony_ci 30862306a36Sopenharmony_cistatic struct gpiod_lookup_table sx1_gpio_table = { 30962306a36Sopenharmony_ci .dev_id = NULL, 31062306a36Sopenharmony_ci .table = { 31162306a36Sopenharmony_ci GPIO_LOOKUP("gpio-0-15", 1, "irda_off", 31262306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 31362306a36Sopenharmony_ci GPIO_LOOKUP("gpio-0-15", 11, "switch", 31462306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 31562306a36Sopenharmony_ci GPIO_LOOKUP("gpio-0-15", 15, "usb_on", 31662306a36Sopenharmony_ci GPIO_ACTIVE_HIGH), 31762306a36Sopenharmony_ci { } 31862306a36Sopenharmony_ci }, 31962306a36Sopenharmony_ci}; 32062306a36Sopenharmony_ci 32162306a36Sopenharmony_cistatic void __init omap_sx1_init(void) 32262306a36Sopenharmony_ci{ 32362306a36Sopenharmony_ci struct gpio_desc *d; 32462306a36Sopenharmony_ci 32562306a36Sopenharmony_ci /* mux pins for uarts */ 32662306a36Sopenharmony_ci omap_cfg_reg(UART1_TX); 32762306a36Sopenharmony_ci omap_cfg_reg(UART1_RTS); 32862306a36Sopenharmony_ci omap_cfg_reg(UART2_TX); 32962306a36Sopenharmony_ci omap_cfg_reg(UART2_RTS); 33062306a36Sopenharmony_ci omap_cfg_reg(UART3_TX); 33162306a36Sopenharmony_ci omap_cfg_reg(UART3_RX); 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices)); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci omap_serial_init(); 33662306a36Sopenharmony_ci omap_register_i2c_bus(1, 100, NULL, 0); 33762306a36Sopenharmony_ci omap1_usb_init(&sx1_usb_config); 33862306a36Sopenharmony_ci sx1_mmc_init(); 33962306a36Sopenharmony_ci gpiod_add_lookup_table(&sx1_gpio_table); 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci /* turn on USB power */ 34262306a36Sopenharmony_ci /* sx1_setusbpower(1); can't do it here because i2c is not ready */ 34362306a36Sopenharmony_ci d = gpiod_get(NULL, "irda_off", GPIOD_OUT_HIGH); 34462306a36Sopenharmony_ci if (IS_ERR(d)) 34562306a36Sopenharmony_ci pr_err("Unable to get IRDA OFF GPIO descriptor\n"); 34662306a36Sopenharmony_ci else 34762306a36Sopenharmony_ci gpiod_put(d); 34862306a36Sopenharmony_ci d = gpiod_get(NULL, "switch", GPIOD_OUT_LOW); 34962306a36Sopenharmony_ci if (IS_ERR(d)) 35062306a36Sopenharmony_ci pr_err("Unable to get SWITCH GPIO descriptor\n"); 35162306a36Sopenharmony_ci else 35262306a36Sopenharmony_ci gpiod_put(d); 35362306a36Sopenharmony_ci d = gpiod_get(NULL, "usb_on", GPIOD_OUT_LOW); 35462306a36Sopenharmony_ci if (IS_ERR(d)) 35562306a36Sopenharmony_ci pr_err("Unable to get USB ON GPIO descriptor\n"); 35662306a36Sopenharmony_ci else 35762306a36Sopenharmony_ci gpiod_put(d); 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci omapfb_set_lcd_config(&sx1_lcd_config); 36062306a36Sopenharmony_ci} 36162306a36Sopenharmony_ci 36262306a36Sopenharmony_ciMACHINE_START(SX1, "OMAP310 based Siemens SX1") 36362306a36Sopenharmony_ci .atag_offset = 0x100, 36462306a36Sopenharmony_ci .map_io = omap1_map_io, 36562306a36Sopenharmony_ci .init_early = omap1_init_early, 36662306a36Sopenharmony_ci .init_irq = omap1_init_irq, 36762306a36Sopenharmony_ci .init_machine = omap_sx1_init, 36862306a36Sopenharmony_ci .init_late = omap1_init_late, 36962306a36Sopenharmony_ci .init_time = omap1_timer_init, 37062306a36Sopenharmony_ci .restart = omap1_restart, 37162306a36Sopenharmony_ciMACHINE_END 372