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