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