| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185 | /** linux/arch/arm/mach-omap1/board-sx1.c** Modified from board-generic.c** Support for the Siemens SX1 mobile phone.** Original version : Vladimir Ananiev (Vovan888-at-gmail com)** Maintainters : Vladimir Ananiev (aka Vovan888), Sergge*		oslik.ru** This program is free software; you can redistribute it and/or modify* it under the terms of the GNU General Public License version 2 as* published by the Free Software Foundation.*/#include <linux/gpio.h>#include <linux/kernel.h>#include <linux/init.h>#include <linux/input.h>#include <linux/platform_device.h>#include <linux/notifier.h>#include <linux/mtd/mtd.h>#include <linux/mtd/partitions.h>#include <linux/mtd/physmap.h>#include <linux/types.h>#include <linux/i2c.h>#include <linux/errno.h>#include <linux/export.h>#include <linux/omapfb.h>#include <linux/platform_data/keypad-omap.h>#include <asm/mach-types.h>#include <asm/mach/arch.h>#include <asm/mach/map.h>#include <mach/flash.h>#include <mach/mux.h>#include <linux/omap-dma.h>#include <mach/irda.h>#include <mach/tc.h>#include <mach/board-sx1.h>#include <mach/hardware.h>#include <mach/usb.h>#include "common.h"#include "dma.h"/* Write to I2C device */int sx1_i2c_write_byte(u8 devaddr, u8 regoffset, u8 value){	struct i2c_adapter *adap;	int err;	struct i2c_msg msg[1];	unsigned char data[2];	adap = i2c_get_adapter(0);	if (!adap)		return -ENODEV;	msg->addr = devaddr;	/* I2C address of chip */	msg->flags = 0;	msg->len = 2;	msg->buf = data;	data[0] = regoffset;	/* register num */	data[1] = value;		/* register data */	err = i2c_transfer(adap, msg, 1);	i2c_put_adapter(adap);	if (err >= 0)		return 0;	return err;}/* Read from I2C device */int sx1_i2c_read_byte(u8 devaddr, u8 regoffset, u8 *value){	struct i2c_adapter *adap;	int err;	struct i2c_msg msg[1];	unsigned char data[2];	adap = i2c_get_adapter(0);	if (!adap)		return -ENODEV;	msg->addr = devaddr;	/* I2C address of chip */	msg->flags = 0;	msg->len = 1;	msg->buf = data;	data[0] = regoffset;	/* register num */	err = i2c_transfer(adap, msg, 1);	msg->addr = devaddr;	/* I2C address */	msg->flags = I2C_M_RD;	msg->len = 1;	msg->buf = data;	err = i2c_transfer(adap, msg, 1);	*value = data[0];	i2c_put_adapter(adap);	if (err >= 0)		return 0;	return err;}/* set keyboard backlight intensity */int sx1_setkeylight(u8 keylight){	if (keylight > SOFIA_MAX_LIGHT_VAL)		keylight = SOFIA_MAX_LIGHT_VAL;	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight);}/* get current keylight intensity */int sx1_getkeylight(u8 * keylight){	return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_KEYLIGHT_REG, keylight);}/* set LCD backlight intensity */int sx1_setbacklight(u8 backlight){	if (backlight > SOFIA_MAX_LIGHT_VAL)		backlight = SOFIA_MAX_LIGHT_VAL;	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG,				  backlight);}/* get current LCD backlight intensity */int sx1_getbacklight (u8 * backlight){	return sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_BACKLIGHT_REG,				 backlight);}/* set LCD backlight power on/off */int sx1_setmmipower(u8 onoff){	int err;	u8 dat = 0;	err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);	if (err < 0)		return err;	if (onoff)		dat |= SOFIA_MMILIGHT_POWER;	else		dat &= ~SOFIA_MMILIGHT_POWER;	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);}/* set USB power on/off */int sx1_setusbpower(u8 onoff){	int err;	u8 dat = 0;	err = sx1_i2c_read_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, &dat);	if (err < 0)		return err;	if (onoff)		dat |= SOFIA_USB_POWER;	else		dat &= ~SOFIA_USB_POWER;	return sx1_i2c_write_byte(SOFIA_I2C_ADDR, SOFIA_POWER1_REG, dat);}EXPORT_SYMBOL(sx1_setkeylight);EXPORT_SYMBOL(sx1_getkeylight);EXPORT_SYMBOL(sx1_setbacklight);EXPORT_SYMBOL(sx1_getbacklight);EXPORT_SYMBOL(sx1_setmmipower);EXPORT_SYMBOL(sx1_setusbpower);/*----------- Keypad -------------------------*/static const unsigned int sx1_keymap[] = {	KEY(3, 5, GROUP_0 | 117), /* camera Qt::Key_F17 */	KEY(4, 0, GROUP_0 | 114), /* voice memo Qt::Key_F14 */	KEY(4, 1, GROUP_2 | 114), /* voice memo */	KEY(4, 2, GROUP_3 | 114), /* voice memo */	KEY(0, 0, GROUP_1 | KEY_F12),	/* red button Qt::Key_Hangup */	KEY(3, 4, GROUP_1 | KEY_LEFT),	KEY(3, 2, GROUP_1 | KEY_DOWN),	KEY(3, 1, GROUP_1 | KEY_RIGHT),	KEY(3, 0, GROUP_1 | KEY_UP),	KEY(3, 3, GROUP_1 | KEY_POWER), /* joystick press or Qt::Key_Select */	KEY(0, 5, GROUP_1 | KEY_1),	KEY(0, 4, GROUP_1 | KEY_2),	KEY(0, 3, GROUP_1 | KEY_3),	KEY(4, 3, GROUP_1 | KEY_4),	KEY(4, 4, GROUP_1 | KEY_5),
 |