board-zoom-peripherals.c 6.4 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
/*
 * Copyright (C) 2009 Texas Instruments Inc.
 *
 * Modified from mach-omap2/board-zoom2.c
 *
 * 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/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <linux/input/matrix_keypad.h>
#include <linux/gpio.h>
17
#include <linux/i2c/twl.h>
18 19 20 21 22 23 24 25 26
#include <linux/regulator/machine.h>

#include <asm/mach-types.h>
#include <asm/mach/arch.h>
#include <asm/mach/map.h>

#include <plat/common.h>
#include <plat/usb.h>

27
#include "hsmmc.h"
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65

/* Zoom2 has Qwerty keyboard*/
static int board_keymap[] = {
	KEY(0, 0, KEY_E),
	KEY(0, 1, KEY_R),
	KEY(0, 2, KEY_T),
	KEY(0, 3, KEY_HOME),
	KEY(0, 6, KEY_I),
	KEY(0, 7, KEY_LEFTSHIFT),
	KEY(1, 0, KEY_D),
	KEY(1, 1, KEY_F),
	KEY(1, 2, KEY_G),
	KEY(1, 3, KEY_SEND),
	KEY(1, 6, KEY_K),
	KEY(1, 7, KEY_ENTER),
	KEY(2, 0, KEY_X),
	KEY(2, 1, KEY_C),
	KEY(2, 2, KEY_V),
	KEY(2, 3, KEY_END),
	KEY(2, 6, KEY_DOT),
	KEY(2, 7, KEY_CAPSLOCK),
	KEY(3, 0, KEY_Z),
	KEY(3, 1, KEY_KPPLUS),
	KEY(3, 2, KEY_B),
	KEY(3, 3, KEY_F1),
	KEY(3, 6, KEY_O),
	KEY(3, 7, KEY_SPACE),
	KEY(4, 0, KEY_W),
	KEY(4, 1, KEY_Y),
	KEY(4, 2, KEY_U),
	KEY(4, 3, KEY_F2),
	KEY(4, 4, KEY_VOLUMEUP),
	KEY(4, 6, KEY_L),
	KEY(4, 7, KEY_LEFT),
	KEY(5, 0, KEY_S),
	KEY(5, 1, KEY_H),
	KEY(5, 2, KEY_J),
	KEY(5, 3, KEY_F3),
66
	KEY(5, 4, KEY_UNKNOWN),
67 68
	KEY(5, 5, KEY_VOLUMEDOWN),
	KEY(5, 6, KEY_M),
69
	KEY(5, 7, KEY_RIGHT),
70 71 72 73 74
	KEY(6, 0, KEY_Q),
	KEY(6, 1, KEY_A),
	KEY(6, 2, KEY_N),
	KEY(6, 3, KEY_BACKSPACE),
	KEY(6, 6, KEY_P),
75
	KEY(6, 7, KEY_UP),
76 77 78 79
	KEY(7, 0, KEY_PROG1),	/*MACRO 1 <User defined> */
	KEY(7, 1, KEY_PROG2),	/*MACRO 2 <User defined> */
	KEY(7, 2, KEY_PROG3),	/*MACRO 3 <User defined> */
	KEY(7, 3, KEY_PROG4),	/*MACRO 4 <User defined> */
80
	KEY(7, 6, KEY_SELECT),
81 82 83 84 85 86 87 88
	KEY(7, 7, KEY_DOWN)
};

static struct matrix_keymap_data board_map_data = {
	.keymap			= board_keymap,
	.keymap_size		= ARRAY_SIZE(board_keymap),
};

89
static struct twl4030_keypad_data zoom_kp_twl4030_data = {
90 91 92 93 94 95
	.keymap_data	= &board_map_data,
	.rows		= 8,
	.cols		= 8,
	.rep		= 1,
};

96
static struct regulator_consumer_supply zoom_vmmc1_supply = {
97 98 99
	.supply		= "vmmc",
};

100
static struct regulator_consumer_supply zoom_vsim_supply = {
101 102 103
	.supply		= "vmmc_aux",
};

104
static struct regulator_consumer_supply zoom_vmmc2_supply = {
105 106 107 108
	.supply		= "vmmc",
};

/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
109
static struct regulator_init_data zoom_vmmc1 = {
110 111 112 113 114 115 116 117 118 119
	.constraints = {
		.min_uV			= 1850000,
		.max_uV			= 3150000,
		.valid_modes_mask	= REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
					| REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
	},
	.num_consumer_supplies  = 1,
120
	.consumer_supplies      = &zoom_vmmc1_supply,
121 122 123
};

/* VMMC2 for MMC2 card */
124
static struct regulator_init_data zoom_vmmc2 = {
125 126 127 128 129 130 131 132 133 134
	.constraints = {
		.min_uV			= 1850000,
		.max_uV			= 1850000,
		.apply_uV		= true,
		.valid_modes_mask	= REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
		.valid_ops_mask		= REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
	},
	.num_consumer_supplies  = 1,
135
	.consumer_supplies      = &zoom_vmmc2_supply,
136 137 138
};

/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
139
static struct regulator_init_data zoom_vsim = {
140 141 142 143 144 145 146 147 148 149
	.constraints = {
		.min_uV			= 1800000,
		.max_uV			= 3000000,
		.valid_modes_mask	= REGULATOR_MODE_NORMAL
					| REGULATOR_MODE_STANDBY,
		.valid_ops_mask		= REGULATOR_CHANGE_VOLTAGE
					| REGULATOR_CHANGE_MODE
					| REGULATOR_CHANGE_STATUS,
	},
	.num_consumer_supplies  = 1,
150
	.consumer_supplies      = &zoom_vsim_supply,
151 152
};

153
static struct omap2_hsmmc_info mmc[] __initdata = {
154
	{
155
		.name		= "external",
156 157 158
		.mmc		= 1,
		.wires		= 4,
		.gpio_wp	= -EINVAL,
159
		.power_saving	= true,
160 161
	},
	{
162
		.name		= "internal",
163
		.mmc		= 2,
164 165
		.wires		= 8,
		.gpio_cd	= -EINVAL,
166
		.gpio_wp	= -EINVAL,
167 168
		.nonremovable	= true,
		.power_saving	= true,
169 170 171 172
	},
	{}      /* Terminator */
};

173
static int zoom_twl_gpio_setup(struct device *dev,
174 175
		unsigned gpio, unsigned ngpio)
{
176
	/* gpio + 0 is "mmc0_cd" (input/IRQ) */
177
	mmc[0].gpio_cd = gpio + 0;
178
	omap2_hsmmc_init(mmc);
179 180 181 182

	/* link regulators to MMC adapters ... we "know" the
	 * regulators will be set up only *after* we return.
	*/
183 184 185
	zoom_vmmc1_supply.dev = mmc[0].dev;
	zoom_vsim_supply.dev = mmc[0].dev;
	zoom_vmmc2_supply.dev = mmc[1].dev;
186 187 188 189 190

	return 0;
}


191
static int zoom_batt_table[] = {
192 193 194 195 196 197 198 199 200 201
/* 0 C*/
30800, 29500, 28300, 27100,
26000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,
17200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,
11600, 11200, 10800, 10400, 10000, 9630,  9280,  8950,  8620,  8310,
8020,  7730,  7460,  7200,  6950,  6710,  6470,  6250,  6040,  5830,
5640,  5450,  5260,  5090,  4920,  4760,  4600,  4450,  4310,  4170,
4040,  3910,  3790,  3670,  3550
};

202 203 204
static struct twl4030_bci_platform_data zoom_bci_data = {
	.battery_tmp_tbl	= zoom_batt_table,
	.tblsize		= ARRAY_SIZE(zoom_batt_table),
205 206
};

207
static struct twl4030_usb_data zoom_usb_data = {
208 209 210
	.usb_mode	= T2_USB_MODE_ULPI,
};

211
static struct twl4030_gpio_platform_data zoom_gpio_data = {
212 213 214
	.gpio_base	= OMAP_MAX_GPIO_LINES,
	.irq_base	= TWL4030_GPIO_IRQ_BASE,
	.irq_end	= TWL4030_GPIO_IRQ_END,
215
	.setup		= zoom_twl_gpio_setup,
216 217
};

218
static struct twl4030_madc_platform_data zoom_madc_data = {
219 220 221
	.irq_line	= 1,
};

222
static struct twl4030_codec_audio_data zoom_audio_data = {
223 224 225
	.audio_mclk = 26000000,
};

226
static struct twl4030_codec_data zoom_codec_data = {
227
	.audio_mclk = 26000000,
228
	.audio = &zoom_audio_data,
229 230
};

231
static struct twl4030_platform_data zoom_twldata = {
232 233 234 235
	.irq_base	= TWL4030_IRQ_BASE,
	.irq_end	= TWL4030_IRQ_END,

	/* platform_data for children goes here */
236 237 238 239 240 241
	.bci		= &zoom_bci_data,
	.madc		= &zoom_madc_data,
	.usb		= &zoom_usb_data,
	.gpio		= &zoom_gpio_data,
	.keypad		= &zoom_kp_twl4030_data,
	.codec		= &zoom_codec_data,
242
	.vmmc1          = &zoom_vmmc1,
243 244
	.vmmc2          = &zoom_vmmc2,
	.vsim           = &zoom_vsim,
245 246 247

};

248
static struct i2c_board_info __initdata zoom_i2c_boardinfo[] = {
249
	{
250
		I2C_BOARD_INFO("twl5030", 0x48),
251 252
		.flags		= I2C_CLIENT_WAKE,
		.irq		= INT_34XX_SYS_NIRQ,
253
		.platform_data	= &zoom_twldata,
254 255 256 257 258
	},
};

static int __init omap_i2c_init(void)
{
259
	omap_register_i2c_bus(1, 2400, zoom_i2c_boardinfo,
260
			ARRAY_SIZE(zoom_i2c_boardinfo));
261 262 263 264 265 266 267 268 269 270 271
	omap_register_i2c_bus(2, 400, NULL, 0);
	omap_register_i2c_bus(3, 400, NULL, 0);
	return 0;
}

void __init zoom_peripherals_init(void)
{
	omap_i2c_init();
	omap_serial_init();
	usb_musb_init();
}