Path: blob/master/arch/arm/mach-omap2/board-zoom-peripherals.c
10817 views
/*1* Copyright (C) 2009 Texas Instruments Inc.2*3* Modified from mach-omap2/board-zoom2.c4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License version 2 as7* published by the Free Software Foundation.8*/910#include <linux/kernel.h>11#include <linux/init.h>12#include <linux/platform_device.h>13#include <linux/input.h>14#include <linux/input/matrix_keypad.h>15#include <linux/gpio.h>16#include <linux/i2c/twl.h>17#include <linux/regulator/machine.h>18#include <linux/regulator/fixed.h>19#include <linux/wl12xx.h>20#include <linux/mmc/host.h>2122#include <asm/mach-types.h>23#include <asm/mach/arch.h>24#include <asm/mach/map.h>2526#include <plat/common.h>27#include <plat/usb.h>2829#include <mach/board-zoom.h>3031#include "mux.h"32#include "hsmmc.h"33#include "common-board-devices.h"3435#define OMAP_ZOOM_WLAN_PMENA_GPIO (101)36#define OMAP_ZOOM_WLAN_IRQ_GPIO (162)3738#define LCD_PANEL_ENABLE_GPIO (7 + OMAP_MAX_GPIO_LINES)3940/* Zoom2 has Qwerty keyboard*/41static uint32_t board_keymap[] = {42KEY(0, 0, KEY_E),43KEY(0, 1, KEY_R),44KEY(0, 2, KEY_T),45KEY(0, 3, KEY_HOME),46KEY(0, 6, KEY_I),47KEY(0, 7, KEY_LEFTSHIFT),48KEY(1, 0, KEY_D),49KEY(1, 1, KEY_F),50KEY(1, 2, KEY_G),51KEY(1, 3, KEY_SEND),52KEY(1, 6, KEY_K),53KEY(1, 7, KEY_ENTER),54KEY(2, 0, KEY_X),55KEY(2, 1, KEY_C),56KEY(2, 2, KEY_V),57KEY(2, 3, KEY_END),58KEY(2, 6, KEY_DOT),59KEY(2, 7, KEY_CAPSLOCK),60KEY(3, 0, KEY_Z),61KEY(3, 1, KEY_KPPLUS),62KEY(3, 2, KEY_B),63KEY(3, 3, KEY_F1),64KEY(3, 6, KEY_O),65KEY(3, 7, KEY_SPACE),66KEY(4, 0, KEY_W),67KEY(4, 1, KEY_Y),68KEY(4, 2, KEY_U),69KEY(4, 3, KEY_F2),70KEY(4, 4, KEY_VOLUMEUP),71KEY(4, 6, KEY_L),72KEY(4, 7, KEY_LEFT),73KEY(5, 0, KEY_S),74KEY(5, 1, KEY_H),75KEY(5, 2, KEY_J),76KEY(5, 3, KEY_F3),77KEY(5, 4, KEY_UNKNOWN),78KEY(5, 5, KEY_VOLUMEDOWN),79KEY(5, 6, KEY_M),80KEY(5, 7, KEY_RIGHT),81KEY(6, 0, KEY_Q),82KEY(6, 1, KEY_A),83KEY(6, 2, KEY_N),84KEY(6, 3, KEY_BACKSPACE),85KEY(6, 6, KEY_P),86KEY(6, 7, KEY_UP),87KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */88KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */89KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */90KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */91KEY(7, 6, KEY_SELECT),92KEY(7, 7, KEY_DOWN)93};9495static struct matrix_keymap_data board_map_data = {96.keymap = board_keymap,97.keymap_size = ARRAY_SIZE(board_keymap),98};99100static struct twl4030_keypad_data zoom_kp_twl4030_data = {101.keymap_data = &board_map_data,102.rows = 8,103.cols = 8,104.rep = 1,105};106107static struct regulator_consumer_supply zoom_vmmc1_supply = {108.supply = "vmmc",109};110111static struct regulator_consumer_supply zoom_vsim_supply = {112.supply = "vmmc_aux",113};114115static struct regulator_consumer_supply zoom_vmmc2_supply = {116.supply = "vmmc",117};118119static struct regulator_consumer_supply zoom_vmmc3_supply = {120.supply = "vmmc",121.dev_name = "omap_hsmmc.2",122};123124/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */125static struct regulator_init_data zoom_vmmc1 = {126.constraints = {127.min_uV = 1850000,128.max_uV = 3150000,129.valid_modes_mask = REGULATOR_MODE_NORMAL130| REGULATOR_MODE_STANDBY,131.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE132| REGULATOR_CHANGE_MODE133| REGULATOR_CHANGE_STATUS,134},135.num_consumer_supplies = 1,136.consumer_supplies = &zoom_vmmc1_supply,137};138139/* VMMC2 for MMC2 card */140static struct regulator_init_data zoom_vmmc2 = {141.constraints = {142.min_uV = 1850000,143.max_uV = 1850000,144.apply_uV = true,145.valid_modes_mask = REGULATOR_MODE_NORMAL146| REGULATOR_MODE_STANDBY,147.valid_ops_mask = REGULATOR_CHANGE_MODE148| REGULATOR_CHANGE_STATUS,149},150.num_consumer_supplies = 1,151.consumer_supplies = &zoom_vmmc2_supply,152};153154/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */155static struct regulator_init_data zoom_vsim = {156.constraints = {157.min_uV = 1800000,158.max_uV = 3000000,159.valid_modes_mask = REGULATOR_MODE_NORMAL160| REGULATOR_MODE_STANDBY,161.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE162| REGULATOR_CHANGE_MODE163| REGULATOR_CHANGE_STATUS,164},165.num_consumer_supplies = 1,166.consumer_supplies = &zoom_vsim_supply,167};168169static struct regulator_init_data zoom_vmmc3 = {170.constraints = {171.valid_ops_mask = REGULATOR_CHANGE_STATUS,172},173.num_consumer_supplies = 1,174.consumer_supplies = &zoom_vmmc3_supply,175};176177static struct fixed_voltage_config zoom_vwlan = {178.supply_name = "vwl1271",179.microvolts = 1800000, /* 1.8V */180.gpio = OMAP_ZOOM_WLAN_PMENA_GPIO,181.startup_delay = 70000, /* 70msec */182.enable_high = 1,183.enabled_at_boot = 0,184.init_data = &zoom_vmmc3,185};186187static struct platform_device omap_vwlan_device = {188.name = "reg-fixed-voltage",189.id = 1,190.dev = {191.platform_data = &zoom_vwlan,192},193};194195static struct wl12xx_platform_data omap_zoom_wlan_data __initdata = {196.irq = OMAP_GPIO_IRQ(OMAP_ZOOM_WLAN_IRQ_GPIO),197/* ZOOM ref clock is 26 MHz */198.board_ref_clock = 1,199};200201static struct omap2_hsmmc_info mmc[] = {202{203.name = "external",204.mmc = 1,205.caps = MMC_CAP_4_BIT_DATA,206.gpio_wp = -EINVAL,207.power_saving = true,208},209{210.name = "internal",211.mmc = 2,212.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,213.gpio_cd = -EINVAL,214.gpio_wp = -EINVAL,215.nonremovable = true,216.power_saving = true,217},218{219.name = "wl1271",220.mmc = 3,221.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,222.gpio_wp = -EINVAL,223.gpio_cd = -EINVAL,224.nonremovable = true,225},226{} /* Terminator */227};228229static struct regulator_consumer_supply zoom_vpll2_supplies[] = {230REGULATOR_SUPPLY("vdds_dsi", "omapdss"),231REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),232};233234static struct regulator_consumer_supply zoom_vdda_dac_supply =235REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");236237static struct regulator_init_data zoom_vpll2 = {238.constraints = {239.min_uV = 1800000,240.max_uV = 1800000,241.valid_modes_mask = REGULATOR_MODE_NORMAL242| REGULATOR_MODE_STANDBY,243.valid_ops_mask = REGULATOR_CHANGE_MODE244| REGULATOR_CHANGE_STATUS,245},246.num_consumer_supplies = ARRAY_SIZE(zoom_vpll2_supplies),247.consumer_supplies = zoom_vpll2_supplies,248};249250static struct regulator_init_data zoom_vdac = {251.constraints = {252.min_uV = 1800000,253.max_uV = 1800000,254.valid_modes_mask = REGULATOR_MODE_NORMAL255| REGULATOR_MODE_STANDBY,256.valid_ops_mask = REGULATOR_CHANGE_MODE257| REGULATOR_CHANGE_STATUS,258},259.num_consumer_supplies = 1,260.consumer_supplies = &zoom_vdda_dac_supply,261};262263static int zoom_twl_gpio_setup(struct device *dev,264unsigned gpio, unsigned ngpio)265{266int ret;267268/* gpio + 0 is "mmc0_cd" (input/IRQ) */269mmc[0].gpio_cd = gpio + 0;270omap2_hsmmc_init(mmc);271272/* link regulators to MMC adapters ... we "know" the273* regulators will be set up only *after* we return.274*/275zoom_vmmc1_supply.dev = mmc[0].dev;276zoom_vsim_supply.dev = mmc[0].dev;277zoom_vmmc2_supply.dev = mmc[1].dev;278279ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,280"lcd enable");281if (ret)282pr_err("Failed to get LCD_PANEL_ENABLE_GPIO (gpio%d).\n",283LCD_PANEL_ENABLE_GPIO);284285return ret;286}287288/* EXTMUTE callback function */289static void zoom2_set_hs_extmute(int mute)290{291gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);292}293294static int zoom_batt_table[] = {295/* 0 C*/29630800, 29500, 28300, 27100,29726000, 24900, 23900, 22900, 22000, 21100, 20300, 19400, 18700, 17900,29817200, 16500, 15900, 15300, 14700, 14100, 13600, 13100, 12600, 12100,29911600, 11200, 10800, 10400, 10000, 9630, 9280, 8950, 8620, 8310,3008020, 7730, 7460, 7200, 6950, 6710, 6470, 6250, 6040, 5830,3015640, 5450, 5260, 5090, 4920, 4760, 4600, 4450, 4310, 4170,3024040, 3910, 3790, 3670, 3550303};304305static struct twl4030_bci_platform_data zoom_bci_data = {306.battery_tmp_tbl = zoom_batt_table,307.tblsize = ARRAY_SIZE(zoom_batt_table),308};309310static struct twl4030_usb_data zoom_usb_data = {311.usb_mode = T2_USB_MODE_ULPI,312};313314static struct twl4030_gpio_platform_data zoom_gpio_data = {315.gpio_base = OMAP_MAX_GPIO_LINES,316.irq_base = TWL4030_GPIO_IRQ_BASE,317.irq_end = TWL4030_GPIO_IRQ_END,318.setup = zoom_twl_gpio_setup,319};320321static struct twl4030_madc_platform_data zoom_madc_data = {322.irq_line = 1,323};324325static struct twl4030_codec_audio_data zoom_audio_data;326327static struct twl4030_codec_data zoom_codec_data = {328.audio_mclk = 26000000,329.audio = &zoom_audio_data,330};331332static struct twl4030_platform_data zoom_twldata = {333.irq_base = TWL4030_IRQ_BASE,334.irq_end = TWL4030_IRQ_END,335336/* platform_data for children goes here */337.bci = &zoom_bci_data,338.madc = &zoom_madc_data,339.usb = &zoom_usb_data,340.gpio = &zoom_gpio_data,341.keypad = &zoom_kp_twl4030_data,342.codec = &zoom_codec_data,343.vmmc1 = &zoom_vmmc1,344.vmmc2 = &zoom_vmmc2,345.vsim = &zoom_vsim,346.vpll2 = &zoom_vpll2,347.vdac = &zoom_vdac,348};349350static int __init omap_i2c_init(void)351{352if (machine_is_omap_zoom2()) {353zoom_audio_data.ramp_delay_value = 3; /* 161 ms */354zoom_audio_data.hs_extmute = 1;355zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute;356}357omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata);358omap_register_i2c_bus(2, 400, NULL, 0);359omap_register_i2c_bus(3, 400, NULL, 0);360return 0;361}362363static void enable_board_wakeup_source(void)364{365/* T2 interrupt line (keypad) */366omap_mux_init_signal("sys_nirq",367OMAP_WAKEUP_EN | OMAP_PIN_INPUT_PULLUP);368}369370void __init zoom_peripherals_init(void)371{372if (wl12xx_set_platform_data(&omap_zoom_wlan_data))373pr_err("error setting wl12xx data\n");374375omap_i2c_init();376platform_device_register(&omap_vwlan_device);377usb_musb_init(NULL);378enable_board_wakeup_source();379omap_serial_init();380}381382383