cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

board-sx1.c (8540B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3* linux/arch/arm/mach-omap1/board-sx1.c
      4*
      5* Modified from board-generic.c
      6*
      7* Support for the Siemens SX1 mobile phone.
      8*
      9* Original version : Vladimir Ananiev (Vovan888-at-gmail com)
     10*
     11* Maintainters : Vladimir Ananiev (aka Vovan888), Sergge
     12*		oslik.ru
     13*/
     14#include <linux/gpio.h>
     15#include <linux/kernel.h>
     16#include <linux/init.h>
     17#include <linux/input.h>
     18#include <linux/platform_device.h>
     19#include <linux/notifier.h>
     20#include <linux/mtd/mtd.h>
     21#include <linux/mtd/partitions.h>
     22#include <linux/mtd/physmap.h>
     23#include <linux/types.h>
     24#include <linux/i2c.h>
     25#include <linux/errno.h>
     26#include <linux/export.h>
     27#include <linux/omapfb.h>
     28#include <linux/platform_data/keypad-omap.h>
     29#include <linux/omap-dma.h>
     30#include "tc.h"
     31
     32#include <asm/mach-types.h>
     33#include <asm/mach/arch.h>
     34#include <asm/mach/map.h>
     35
     36#include "flash.h"
     37#include "mux.h"
     38#include "board-sx1.h"
     39#include "hardware.h"
     40#include "usb.h"
     41#include "common.h"
     42
     43/* Write to I2C device */
     44int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value)
     45{
     46	struct i2c_adapter *adap;
     47	int err;
     48	struct i2c_msg msg[1];
     49	unsigned char data[2];
     50
     51	adap = i2c_get_adapter(0);
     52	if (!adap)
     53		return -ENODEV;
     54	msg->addr = devaddr;	/* I2C address of chip */
     55	msg->flags = 0;
     56	msg->len = 2;
     57	msg->buf = data;
     58	data[0] = regoffset;	/* register num */
     59	data[1] = value;		/* register data */
     60	err = i2c_transfer(adap, msg, 1);
     61	i2c_put_adapter(adap);
     62	if (err >= 0)
     63		return 0;
     64	return err;
     65}
     66
     67/* Read from I2C device */
     68int sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value)
     69{
     70	struct i2c_adapter *adap;
     71	int err;
     72	struct i2c_msg msg[1];
     73	unsigned char data[2];
     74
     75	adap = i2c_get_adapter(0);
     76	if (!adap)
     77		return -ENODEV;
     78
     79	msg->addr = devaddr;	/* I2C address of chip */
     80	msg->flags = 0;
     81	msg->len = 1;
     82	msg->buf = data;
     83	data[0] = regoffset;	/* register num */
     84	err = i2c_transfer(adap, msg, 1);
     85
     86	msg->addr = devaddr;	/* I2C address */
     87	msg->flags = I2C_M_RD;
     88	msg->len = 1;
     89	msg->buf = data;
     90	err = i2c_transfer(adap, msg, 1);
     91	*value = data[0];
     92	i2c_put_adapter(adap);
     93
     94	if (err >= 0)
     95		return 0;
     96	return err;
     97}
     98/* set keyboard backlight intensity */
     99int sx1_setkeylight(u8 keylight)
    100{
    101	if (keylight > SOFIA_MAX_LIGHT_VAL)
    102		keylight = SOFIA_MAX_LIGHT_VAL;
    103	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight);
    104}
    105/* get current keylight intensity */
    106int sx1_getkeylight(u8 * keylight)
    107{
    108	return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight);
    109}
    110/* set LCD backlight intensity */
    111int sx1_setbacklight(u8 backlight)
    112{
    113	if (backlight > SOFIA_MAX_LIGHT_VAL)
    114		backlight = SOFIA_MAX_LIGHT_VAL;
    115	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG,
    116				  backlight);
    117}
    118/* get current LCD backlight intensity */
    119int sx1_getbacklight (u8 * backlight)
    120{
    121	return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG,
    122				 backlight);
    123}
    124/* set LCD backlight power on/off */
    125int sx1_setmmipower(u8 onoff)
    126{
    127	int err;
    128	u8 dat = 0;
    129	err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
    130	if (err < 0)
    131		return err;
    132	if (onoff)
    133		dat |= SOFIA_MMILIGHT_POWER;
    134	else
    135		dat &= ~SOFIA_MMILIGHT_POWER;
    136	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
    137}
    138
    139/* set USB power on/off */
    140int sx1_setusbpower(u8 onoff)
    141{
    142	int err;
    143	u8 dat = 0;
    144	err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);
    145	if (err < 0)
    146		return err;
    147	if (onoff)
    148		dat |= SOFIA_USB_POWER;
    149	else
    150		dat &= ~SOFIA_USB_POWER;
    151	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);
    152}
    153
    154EXPORT_SYMBOL(sx1_setkeylight);
    155EXPORT_SYMBOL(sx1_getkeylight);
    156EXPORT_SYMBOL(sx1_setbacklight);
    157EXPORT_SYMBOL(sx1_getbacklight);
    158EXPORT_SYMBOL(sx1_setmmipower);
    159EXPORT_SYMBOL(sx1_setusbpower);
    160
    161/*----------- Keypad -------------------------*/
    162
    163static const unsigned int sx1_keymap[] = {
    164	KEY(3, 5, GROUP_0 | 117), /* camera Qt::Key_F17 */
    165	KEY(4, 0, GROUP_0 | 114), /* voice memo Qt::Key_F14 */
    166	KEY(4, 1, GROUP_2 | 114), /* voice memo */
    167	KEY(4, 2, GROUP_3 | 114), /* voice memo */
    168	KEY(0, 0, GROUP_1 | KEY_F12),	/* red button Qt::Key_Hangup */
    169	KEY(3, 4, GROUP_1 | KEY_LEFT),
    170	KEY(3, 2, GROUP_1 | KEY_DOWN),
    171	KEY(3, 1, GROUP_1 | KEY_RIGHT),
    172	KEY(3, 0, GROUP_1 | KEY_UP),
    173	KEY(3, 3, GROUP_1 | KEY_POWER), /* joystick press or Qt::Key_Select */
    174	KEY(0, 5, GROUP_1 | KEY_1),
    175	KEY(0, 4, GROUP_1 | KEY_2),
    176	KEY(0, 3, GROUP_1 | KEY_3),
    177	KEY(4, 3, GROUP_1 | KEY_4),
    178	KEY(4, 4, GROUP_1 | KEY_5),
    179	KEY(4, 5, GROUP_1 | KEY_KPASTERISK),/* "*" */
    180	KEY(1, 4, GROUP_1 | KEY_6),
    181	KEY(1, 5, GROUP_1 | KEY_7),
    182	KEY(1, 3, GROUP_1 | KEY_8),
    183	KEY(2, 3, GROUP_1 | KEY_9),
    184	KEY(2, 5, GROUP_1 | KEY_0),
    185	KEY(2, 4, GROUP_1 | 113), /* # F13 Toggle input method Qt::Key_F13 */
    186	KEY(1, 0, GROUP_1 | KEY_F11),	/* green button Qt::Key_Call */
    187	KEY(2, 1, GROUP_1 | KEY_YEN),	/* left soft Qt::Key_Context1 */
    188	KEY(2, 2, GROUP_1 | KEY_F8),	/* right soft Qt::Key_Back */
    189	KEY(1, 2, GROUP_1 | KEY_LEFTSHIFT), /* shift */
    190	KEY(1, 1, GROUP_1 | KEY_BACKSPACE), /* C (clear) */
    191	KEY(2, 0, GROUP_1 | KEY_F7),	/* menu Qt::Key_Menu */
    192};
    193
    194static struct resource sx1_kp_resources[] = {
    195	[0] = {
    196		.start	= INT_KEYBOARD,
    197		.end	= INT_KEYBOARD,
    198		.flags	= IORESOURCE_IRQ,
    199	},
    200};
    201
    202static const struct matrix_keymap_data sx1_keymap_data = {
    203	.keymap		= sx1_keymap,
    204	.keymap_size	= ARRAY_SIZE(sx1_keymap),
    205};
    206
    207static struct omap_kp_platform_data sx1_kp_data = {
    208	.rows		= 6,
    209	.cols		= 6,
    210	.keymap_data	= &sx1_keymap_data,
    211	.delay	= 80,
    212};
    213
    214static struct platform_device sx1_kp_device = {
    215	.name		= "omap-keypad",
    216	.id		= -1,
    217	.dev		= {
    218		.platform_data = &sx1_kp_data,
    219	},
    220	.num_resources	= ARRAY_SIZE(sx1_kp_resources),
    221	.resource	= sx1_kp_resources,
    222};
    223
    224/*----------- MTD -------------------------*/
    225
    226static struct mtd_partition sx1_partitions[] = {
    227	/* bootloader (U-Boot, etc) in first sector */
    228	{
    229		.name		= "bootloader",
    230		.offset		= 0x01800000,
    231		.size		= SZ_128K,
    232		.mask_flags	= MTD_WRITEABLE, /* force read-only */
    233	},
    234	/* bootloader params in the next sector */
    235	{
    236		.name		= "params",
    237		.offset		= MTDPART_OFS_APPEND,
    238		.size		= SZ_128K,
    239		.mask_flags	= 0,
    240	},
    241	/* kernel */
    242	{
    243		.name		= "kernel",
    244		.offset		= MTDPART_OFS_APPEND,
    245		.size		= SZ_2M - 2 * SZ_128K,
    246		.mask_flags	= 0
    247	},
    248	/* file system */
    249	{
    250		.name		= "filesystem",
    251		.offset		= MTDPART_OFS_APPEND,
    252		.size		= MTDPART_SIZ_FULL,
    253		.mask_flags	= 0
    254	}
    255};
    256
    257static struct physmap_flash_data sx1_flash_data = {
    258	.width		= 2,
    259	.set_vpp	= omap1_set_vpp,
    260	.parts		= sx1_partitions,
    261	.nr_parts	= ARRAY_SIZE(sx1_partitions),
    262};
    263
    264/* MTD Intel 4000 flash - new flashes */
    265static struct resource sx1_new_flash_resource = {
    266	.start		= OMAP_CS0_PHYS,
    267	.end		= OMAP_CS0_PHYS + SZ_32M - 1,
    268	.flags		= IORESOURCE_MEM,
    269};
    270
    271static struct platform_device sx1_flash_device = {
    272	.name		= "physmap-flash",
    273	.id		= 0,
    274	.dev		= {
    275		.platform_data	= &sx1_flash_data,
    276	},
    277	.num_resources	= 1,
    278	.resource	= &sx1_new_flash_resource,
    279};
    280
    281/*----------- USB -------------------------*/
    282
    283static struct omap_usb_config sx1_usb_config __initdata = {
    284	.otg		= 0,
    285	.register_dev	= 1,
    286	.register_host	= 0,
    287	.hmc_mode	= 0,
    288	.pins[0]	= 2,
    289	.pins[1]	= 0,
    290	.pins[2]	= 0,
    291};
    292
    293/*----------- LCD -------------------------*/
    294
    295static const struct omap_lcd_config sx1_lcd_config __initconst = {
    296	.ctrl_name	= "internal",
    297};
    298
    299/*-----------------------------------------*/
    300static struct platform_device *sx1_devices[] __initdata = {
    301	&sx1_flash_device,
    302	&sx1_kp_device,
    303};
    304
    305/*-----------------------------------------*/
    306
    307static void __init omap_sx1_init(void)
    308{
    309	/* mux pins for uarts */
    310	omap_cfg_reg(UART1_TX);
    311	omap_cfg_reg(UART1_RTS);
    312	omap_cfg_reg(UART2_TX);
    313	omap_cfg_reg(UART2_RTS);
    314	omap_cfg_reg(UART3_TX);
    315	omap_cfg_reg(UART3_RX);
    316
    317	platform_add_devices(sx1_devices, ARRAY_SIZE(sx1_devices));
    318
    319	omap_serial_init();
    320	omap_register_i2c_bus(1, 100, NULL, 0);
    321	omap1_usb_init(&sx1_usb_config);
    322	sx1_mmc_init();
    323
    324	/* turn on USB power */
    325	/* sx1_setusbpower(1); can't do it here because i2c is not ready */
    326	gpio_request(1, "A_IRDA_OFF");
    327	gpio_request(11, "A_SWITCH");
    328	gpio_request(15, "A_USB_ON");
    329	gpio_direction_output(1, 1);	/*A_IRDA_OFF = 1 */
    330	gpio_direction_output(11, 0);	/*A_SWITCH = 0 */
    331	gpio_direction_output(15, 0);	/*A_USB_ON = 0 */
    332
    333	omapfb_set_lcd_config(&sx1_lcd_config);
    334}
    335
    336MACHINE_START(SX1, "OMAP310 based Siemens SX1")
    337	.atag_offset	= 0x100,
    338	.map_io		= omap15xx_map_io,
    339	.init_early     = omap1_init_early,
    340	.init_irq	= omap1_init_irq,
    341	.handle_irq	= omap1_handle_irq,
    342	.init_machine	= omap_sx1_init,
    343	.init_late	= omap1_init_late,
    344	.init_time	= omap1_timer_init,
    345	.restart	= omap1_restart,
    346MACHINE_END