mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-15 08:26:40 +07:00
Merge branch 'omap/board' of git+ssh://master.kernel.org/pub/scm/linux/kernel/git/arm/linux-arm-soc into next/board
This commit is contained in:
commit
c33d4326b6
@ -138,7 +138,7 @@ void ams_delta_latch2_write(u16 mask, u16 value)
|
||||
static void __init ams_delta_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static struct map_desc ams_delta_io_desc[] __initdata = {
|
||||
@ -391,7 +391,7 @@ MACHINE_START(AMS_DELTA, "Amstrad E3 (Delta)")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = ams_delta_init_irq,
|
||||
.init_machine = ams_delta_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
||||
EXPORT_SYMBOL(ams_delta_latch1_write);
|
||||
|
@ -329,7 +329,7 @@ static void __init omap_fsample_init(void)
|
||||
static void __init omap_fsample_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
/* Only FPGA needs to be mapped here. All others are done with ioremap */
|
||||
@ -394,5 +394,5 @@ MACHINE_START(OMAP_FSAMPLE, "OMAP730 F-Sample")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_fsample_init_irq,
|
||||
.init_machine = omap_fsample_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -31,7 +31,7 @@
|
||||
static void __init omap_generic_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
/* assume no Mini-AB port */
|
||||
@ -99,5 +99,5 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP1510/1610/1710")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_generic_init_irq,
|
||||
.init_machine = omap_generic_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -376,7 +376,7 @@ static struct i2c_board_info __initdata h2_i2c_board_info[] = {
|
||||
static void __init h2_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static struct omap_usb_config h2_usb_config __initdata = {
|
||||
@ -466,5 +466,5 @@ MACHINE_START(OMAP_H2, "TI-H2")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = h2_init_irq,
|
||||
.init_machine = h2_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -439,7 +439,7 @@ static void __init h3_init(void)
|
||||
static void __init h3_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static void __init h3_map_io(void)
|
||||
@ -454,5 +454,5 @@ MACHINE_START(OMAP_H3, "TI OMAP1710 H3 board")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = h3_init_irq,
|
||||
.init_machine = h3_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -605,7 +605,7 @@ static void __init htcherald_init_irq(void)
|
||||
{
|
||||
printk(KERN_INFO "htcherald_init_irq.\n");
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
MACHINE_START(HERALD, "HTC Herald")
|
||||
@ -616,5 +616,5 @@ MACHINE_START(HERALD, "HTC Herald")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = htcherald_init_irq,
|
||||
.init_machine = htcherald_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -292,7 +292,7 @@ static void __init innovator_init_smc91x(void)
|
||||
static void __init innovator_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP15XX
|
||||
@ -464,5 +464,5 @@ MACHINE_START(OMAP_INNOVATOR, "TI-Innovator")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = innovator_init_irq,
|
||||
.init_machine = innovator_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -51,7 +51,7 @@ static void __init omap_nokia770_init_irq(void)
|
||||
omap_writew((omap_readw(0xfffb5004) & ~2), 0xfffb5004);
|
||||
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static const unsigned int nokia770_keymap[] = {
|
||||
@ -269,5 +269,5 @@ MACHINE_START(NOKIA770, "Nokia 770")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_nokia770_init_irq,
|
||||
.init_machine = omap_nokia770_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -282,7 +282,7 @@ static void __init osk_init_cf(void)
|
||||
static void __init osk_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static struct omap_usb_config osk_usb_config __initdata = {
|
||||
@ -588,5 +588,5 @@ MACHINE_START(OMAP_OSK, "TI-OSK")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = osk_init_irq,
|
||||
.init_machine = osk_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -62,7 +62,7 @@
|
||||
static void __init omap_palmte_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static const unsigned int palmte_keymap[] = {
|
||||
@ -280,5 +280,5 @@ MACHINE_START(OMAP_PALMTE, "OMAP310 based Palm Tungsten E")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_palmte_init_irq,
|
||||
.init_machine = omap_palmte_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -266,7 +266,7 @@ static struct spi_board_info __initdata palmtt_boardinfo[] = {
|
||||
static void __init omap_palmtt_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static struct omap_usb_config palmtt_usb_config __initdata = {
|
||||
@ -326,5 +326,5 @@ MACHINE_START(OMAP_PALMTT, "OMAP1510 based Palm Tungsten|T")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_palmtt_init_irq,
|
||||
.init_machine = omap_palmtt_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -61,7 +61,7 @@ static void __init
|
||||
omap_palmz71_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static const unsigned int palmz71_keymap[] = {
|
||||
@ -346,5 +346,5 @@ MACHINE_START(OMAP_PALMZ71, "OMAP310 based Palm Zire71")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_palmz71_init_irq,
|
||||
.init_machine = omap_palmz71_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -297,7 +297,7 @@ static void __init omap_perseus2_init(void)
|
||||
static void __init omap_perseus2_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
/* Only FPGA needs to be mapped here. All others are done with ioremap */
|
||||
static struct map_desc omap_perseus2_io_desc[] __initdata = {
|
||||
@ -355,5 +355,5 @@ MACHINE_START(OMAP_PERSEUS2, "OMAP730 Perseus2")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_perseus2_init_irq,
|
||||
.init_machine = omap_perseus2_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -411,7 +411,7 @@ static void __init omap_sx1_init(void)
|
||||
static void __init omap_sx1_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
/*----------------------------------------*/
|
||||
|
||||
@ -426,5 +426,5 @@ MACHINE_START(SX1, "OMAP310 based Siemens SX1")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = omap_sx1_init_irq,
|
||||
.init_machine = omap_sx1_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -162,7 +162,7 @@ static struct omap_board_config_kernel voiceblue_config[] = {
|
||||
static void __init voiceblue_init_irq(void)
|
||||
{
|
||||
omap1_init_common_hw();
|
||||
omap_init_irq();
|
||||
omap1_init_irq();
|
||||
}
|
||||
|
||||
static void __init voiceblue_map_io(void)
|
||||
@ -306,5 +306,5 @@ MACHINE_START(VOICEBLUE, "VoiceBlue OMAP5910")
|
||||
.reserve = omap_reserve,
|
||||
.init_irq = voiceblue_init_irq,
|
||||
.init_machine = voiceblue_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap1_timer,
|
||||
MACHINE_END
|
||||
|
@ -175,7 +175,7 @@ static struct irq_chip omap_irq_chip = {
|
||||
.irq_set_wake = omap_wake_irq,
|
||||
};
|
||||
|
||||
void __init omap_init_irq(void)
|
||||
void __init omap1_init_irq(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
|
@ -38,7 +38,7 @@ static void omap1_mcbsp_request(unsigned int id)
|
||||
* On 1510, 1610 and 1710, McBSP1 and McBSP3
|
||||
* are DSP public peripherals.
|
||||
*/
|
||||
if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) {
|
||||
if (id == 0 || id == 2) {
|
||||
if (dsp_use++ == 0) {
|
||||
api_clk = clk_get(NULL, "api_ck");
|
||||
dsp_clk = clk_get(NULL, "dsp_ck");
|
||||
@ -59,7 +59,7 @@ static void omap1_mcbsp_request(unsigned int id)
|
||||
|
||||
static void omap1_mcbsp_free(unsigned int id)
|
||||
{
|
||||
if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3) {
|
||||
if (id == 0 || id == 2) {
|
||||
if (--dsp_use == 0) {
|
||||
if (!IS_ERR(api_clk)) {
|
||||
clk_disable(api_clk);
|
||||
|
@ -297,7 +297,7 @@ static inline int omap_32k_timer_usable(void)
|
||||
* Timer initialization
|
||||
* ---------------------------------------------------------------------------
|
||||
*/
|
||||
static void __init omap_timer_init(void)
|
||||
static void __init omap1_timer_init(void)
|
||||
{
|
||||
if (omap_32k_timer_usable()) {
|
||||
preferred_sched_clock_init(1);
|
||||
@ -307,6 +307,6 @@ static void __init omap_timer_init(void)
|
||||
}
|
||||
}
|
||||
|
||||
struct sys_timer omap_timer = {
|
||||
.init = omap_timer_init,
|
||||
struct sys_timer omap1_timer = {
|
||||
.init = omap1_timer_init,
|
||||
};
|
||||
|
@ -183,10 +183,6 @@ static __init void omap_init_32k_timer(void)
|
||||
bool __init omap_32k_timer_init(void)
|
||||
{
|
||||
omap_init_clocksource_32k();
|
||||
|
||||
#ifdef CONFIG_OMAP_DM_TIMER
|
||||
omap_dm_timer_init();
|
||||
#endif
|
||||
omap_init_32k_timer();
|
||||
|
||||
return true;
|
||||
|
@ -266,9 +266,10 @@ config MACH_OMAP_ZOOM3
|
||||
select REGULATOR_FIXED_VOLTAGE
|
||||
|
||||
config MACH_CM_T35
|
||||
bool "CompuLab CM-T35 module"
|
||||
bool "CompuLab CM-T35/CM-T3730 modules"
|
||||
depends on ARCH_OMAP3
|
||||
default y
|
||||
select MACH_CM_T3730
|
||||
select OMAP_PACKAGE_CUS
|
||||
|
||||
config MACH_CM_T3517
|
||||
@ -277,6 +278,9 @@ config MACH_CM_T3517
|
||||
default y
|
||||
select OMAP_PACKAGE_CBB
|
||||
|
||||
config MACH_CM_T3730
|
||||
bool
|
||||
|
||||
config MACH_IGEP0020
|
||||
bool "IGEP v2 board"
|
||||
depends on ARCH_OMAP3
|
||||
|
@ -3,7 +3,7 @@
|
||||
#
|
||||
|
||||
# Common support
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer-gp.o pm.o \
|
||||
obj-y := id.o io.o control.o mux.o devices.o serial.o gpmc.o timer.o pm.o \
|
||||
common.o gpio.o dma.o wd_timer.o
|
||||
|
||||
omap-2-3-common = irq.o sdrc.o
|
||||
@ -269,4 +269,4 @@ obj-$(CONFIG_ARCH_OMAP4) += hwspinlock.o
|
||||
disp-$(CONFIG_OMAP2_DSS) := display.o
|
||||
obj-y += $(disp-m) $(disp-y)
|
||||
|
||||
obj-y += common-board-devices.o
|
||||
obj-y += common-board-devices.o twl-common.o
|
||||
|
@ -260,7 +260,7 @@ MACHINE_START(OMAP_2430SDP, "OMAP2430 sdp2430 board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap_2430sdp_map_io,
|
||||
.init_early = omap_2430sdp_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = omap_2430sdp_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
@ -231,22 +231,6 @@ static void __init omap_3430sdp_init_early(void)
|
||||
omap2_init_common_devices(hyb18m512160af6_sdrc_params, NULL);
|
||||
}
|
||||
|
||||
static int sdp3430_batt_table[] = {
|
||||
/* 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
|
||||
};
|
||||
|
||||
static struct twl4030_bci_platform_data sdp3430_bci_data = {
|
||||
.battery_tmp_tbl = sdp3430_batt_table,
|
||||
.tblsize = ARRAY_SIZE(sdp3430_batt_table),
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
@ -292,14 +276,6 @@ static struct twl4030_gpio_platform_data sdp3430_gpio_data = {
|
||||
.setup = sdp3430_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data sdp3430_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data sdp3430_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
/* regulator consumer mappings */
|
||||
|
||||
/* ads7846 on SPI */
|
||||
@ -307,16 +283,6 @@ static struct regulator_consumer_supply sdp3430_vaux3_supplies[] = {
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply sdp3430_vdda_dac_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_consumer_supply sdp3430_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply sdp3430_vmmc1_supplies[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
@ -433,54 +399,10 @@ static struct regulator_init_data sdp3430_vsim = {
|
||||
.consumer_supplies = sdp3430_vsim_supplies,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video */
|
||||
static struct regulator_init_data sdp3430_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(sdp3430_vdda_dac_supplies),
|
||||
.consumer_supplies = sdp3430_vdda_dac_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp3430_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(sdp3430_vpll2_supplies),
|
||||
.consumer_supplies = sdp3430_vpll2_supplies,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data sdp3430_audio;
|
||||
|
||||
static struct twl4030_codec_data sdp3430_codec = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &sdp3430_audio,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data sdp3430_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.bci = &sdp3430_bci_data,
|
||||
.gpio = &sdp3430_gpio_data,
|
||||
.madc = &sdp3430_madc_data,
|
||||
.keypad = &sdp3430_kp_data,
|
||||
.usb = &sdp3430_usb_data,
|
||||
.codec = &sdp3430_codec,
|
||||
|
||||
.vaux1 = &sdp3430_vaux1,
|
||||
.vaux2 = &sdp3430_vaux2,
|
||||
@ -489,14 +411,21 @@ static struct twl4030_platform_data sdp3430_twldata = {
|
||||
.vmmc1 = &sdp3430_vmmc1,
|
||||
.vmmc2 = &sdp3430_vmmc2,
|
||||
.vsim = &sdp3430_vsim,
|
||||
.vdac = &sdp3430_vdac,
|
||||
.vpll2 = &sdp3430_vpll2,
|
||||
};
|
||||
|
||||
static int __init omap3430_i2c_init(void)
|
||||
{
|
||||
/* i2c1 for PMIC only */
|
||||
omap3_pmic_get_config(&sdp3430_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_BCI |
|
||||
TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
sdp3430_twldata.vdac->constraints.apply_uV = true;
|
||||
sdp3430_twldata.vpll2->constraints.apply_uV = true;
|
||||
sdp3430_twldata.vpll2->constraints.name = "VDVI";
|
||||
|
||||
omap3_pmic_init("twl4030", &sdp3430_twldata);
|
||||
|
||||
/* i2c2 on camera connector (for sensor control) and optional isp1301 */
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
/* i2c3 on display connector (for DVI, tfp410) */
|
||||
@ -804,7 +733,7 @@ MACHINE_START(OMAP_3430SDP, "OMAP3430 3430SDP board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap_3430sdp_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_3430sdp_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -219,7 +219,7 @@ MACHINE_START(OMAP_3630SDP, "OMAP 3630SDP board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap_sdp_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_sdp_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/gpio_keys.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/leds.h>
|
||||
#include <linux/leds_pwm.h>
|
||||
|
||||
@ -37,10 +38,10 @@
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/omap4-keypad.h>
|
||||
#include <video/omapdss.h>
|
||||
#include <linux/wl12xx.h>
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
@ -52,6 +53,9 @@
|
||||
#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
|
||||
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
|
||||
|
||||
#define GPIO_WIFI_PMENA 54
|
||||
#define GPIO_WIFI_IRQ 53
|
||||
|
||||
static const int sdp4430_keymap[] = {
|
||||
KEY(0, 0, KEY_E),
|
||||
KEY(0, 1, KEY_R),
|
||||
@ -125,6 +129,64 @@ static const int sdp4430_keymap[] = {
|
||||
KEY(7, 6, KEY_OK),
|
||||
KEY(7, 7, KEY_DOWN),
|
||||
};
|
||||
static struct omap_device_pad keypad_pads[] __initdata = {
|
||||
{ .name = "kpd_col1.kpd_col1",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_col1.kpd_col1",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_col2.kpd_col2",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_col3.kpd_col3",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_col4.kpd_col4",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_col5.kpd_col5",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "gpmc_a23.kpd_col7",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "gpmc_a22.kpd_col6",
|
||||
.enable = OMAP_WAKEUP_EN | OMAP_MUX_MODE1,
|
||||
},
|
||||
{ .name = "kpd_row0.kpd_row0",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "kpd_row1.kpd_row1",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "kpd_row2.kpd_row2",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "kpd_row3.kpd_row3",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "kpd_row4.kpd_row4",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "kpd_row5.kpd_row5",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "gpmc_a18.kpd_row6",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
{ .name = "gpmc_a19.kpd_row7",
|
||||
.enable = OMAP_PULL_ENA | OMAP_PULL_UP | OMAP_WAKEUP_EN |
|
||||
OMAP_MUX_MODE1 | OMAP_INPUT_EN,
|
||||
},
|
||||
};
|
||||
|
||||
static struct matrix_keymap_data sdp4430_keymap_data = {
|
||||
.keymap = sdp4430_keymap,
|
||||
@ -136,6 +198,13 @@ static struct omap4_keypad_platform_data sdp4430_keypad_data = {
|
||||
.rows = 8,
|
||||
.cols = 8,
|
||||
};
|
||||
|
||||
static struct omap_board_data keypad_data = {
|
||||
.id = 1,
|
||||
.pads = keypad_pads,
|
||||
.pads_cnt = ARRAY_SIZE(keypad_pads),
|
||||
};
|
||||
|
||||
static struct gpio_led sdp4430_gpio_leds[] = {
|
||||
{
|
||||
.name = "omap4:green:debug0",
|
||||
@ -295,9 +364,6 @@ static void __init omap_4430sdp_init_early(void)
|
||||
{
|
||||
omap2_init_common_infrastructure();
|
||||
omap2_init_common_devices(NULL, NULL);
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
omap2_gp_clockevent_set_gptimer(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
static struct omap_musb_board_data musb_board_data = {
|
||||
@ -306,14 +372,6 @@ static struct omap_musb_board_data musb_board_data = {
|
||||
.power = 100,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap4_usbphy_data = {
|
||||
.phy_init = omap4430_phy_init,
|
||||
.phy_exit = omap4430_phy_exit,
|
||||
.phy_power = omap4430_phy_power,
|
||||
.phy_set_clock = omap4430_phy_set_clk,
|
||||
.phy_suspend = omap4430_phy_suspend,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 2,
|
||||
@ -327,21 +385,52 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{
|
||||
.mmc = 5,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_POWER_OFF_CARD,
|
||||
.gpio_cd = -EINVAL,
|
||||
.gpio_wp = -EINVAL,
|
||||
.ocr_mask = MMC_VDD_165_195,
|
||||
.nonremovable = true,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply sdp4430_vaux_supply[] = {
|
||||
{
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.1",
|
||||
},
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
};
|
||||
static struct regulator_consumer_supply sdp4430_vmmc_supply[] = {
|
||||
{
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.0",
|
||||
|
||||
static struct regulator_consumer_supply omap4_sdp4430_vmmc5_supply = {
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.4",
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vmmc5 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap4_sdp4430_vmmc5_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config sdp4430_vwlan = {
|
||||
.supply_name = "vwl1271",
|
||||
.microvolts = 1800000, /* 1.8V */
|
||||
.gpio = GPIO_WIFI_PMENA,
|
||||
.startup_delay = 70000, /* 70msec */
|
||||
.enable_high = 1,
|
||||
.enabled_at_boot = 0,
|
||||
.init_data = &sdp4430_vmmc5,
|
||||
};
|
||||
|
||||
static struct platform_device omap_vwlan_device = {
|
||||
.name = "reg-fixed-voltage",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &sdp4430_vwlan,
|
||||
},
|
||||
};
|
||||
|
||||
@ -399,65 +488,10 @@ static struct regulator_init_data sdp4430_vaux1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.num_consumer_supplies = ARRAY_SIZE(sdp4430_vaux_supply),
|
||||
.consumer_supplies = sdp4430_vaux_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vaux2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vaux3 = {
|
||||
.constraints = {
|
||||
.min_uV = 1000000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 card */
|
||||
static struct regulator_init_data sdp4430_vmmc = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.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,
|
||||
.consumer_supplies = sdp4430_vmmc_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vpp = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 2500000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vusim = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
@ -471,74 +505,10 @@ static struct regulator_init_data sdp4430_vusim = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vana = {
|
||||
.constraints = {
|
||||
.min_uV = 2100000,
|
||||
.max_uV = 2100000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vcxio = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_vusb = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data sdp4430_clk32kg = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data sdp4430_twldata = {
|
||||
.irq_base = TWL6030_IRQ_BASE,
|
||||
.irq_end = TWL6030_IRQ_END,
|
||||
|
||||
/* Regulators */
|
||||
.vmmc = &sdp4430_vmmc,
|
||||
.vpp = &sdp4430_vpp,
|
||||
.vusim = &sdp4430_vusim,
|
||||
.vana = &sdp4430_vana,
|
||||
.vcxio = &sdp4430_vcxio,
|
||||
.vdac = &sdp4430_vdac,
|
||||
.vusb = &sdp4430_vusb,
|
||||
.vaux1 = &sdp4430_vaux1,
|
||||
.vaux2 = &sdp4430_vaux2,
|
||||
.vaux3 = &sdp4430_vaux3,
|
||||
.clk32kg = &sdp4430_clk32kg,
|
||||
.usb = &omap4_usbphy_data
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata sdp4430_i2c_3_boardinfo[] = {
|
||||
@ -556,6 +526,16 @@ static struct i2c_board_info __initdata sdp4430_i2c_4_boardinfo[] = {
|
||||
};
|
||||
static int __init omap4_i2c_init(void)
|
||||
{
|
||||
omap4_pmic_get_config(&sdp4430_twldata, TWL_COMMON_PDATA_USB,
|
||||
TWL_COMMON_REGULATOR_VDAC |
|
||||
TWL_COMMON_REGULATOR_VAUX2 |
|
||||
TWL_COMMON_REGULATOR_VAUX3 |
|
||||
TWL_COMMON_REGULATOR_VMMC |
|
||||
TWL_COMMON_REGULATOR_VPP |
|
||||
TWL_COMMON_REGULATOR_VANA |
|
||||
TWL_COMMON_REGULATOR_VCXIO |
|
||||
TWL_COMMON_REGULATOR_VUSB |
|
||||
TWL_COMMON_REGULATOR_CLK32KG);
|
||||
omap4_pmic_init("twl6030", &sdp4430_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, sdp4430_i2c_3_boardinfo,
|
||||
@ -723,6 +703,41 @@ static inline void board_serial_init(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void omap4_sdp4430_wifi_mux_init(void)
|
||||
{
|
||||
omap_mux_init_gpio(GPIO_WIFI_IRQ, OMAP_PIN_INPUT |
|
||||
OMAP_PIN_OFF_WAKEUPENABLE);
|
||||
omap_mux_init_gpio(GPIO_WIFI_PMENA, OMAP_PIN_OUTPUT);
|
||||
|
||||
omap_mux_init_signal("sdmmc5_cmd.sdmmc5_cmd",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc5_clk.sdmmc5_clk",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc5_dat0.sdmmc5_dat0",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc5_dat1.sdmmc5_dat1",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc5_dat2.sdmmc5_dat2",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("sdmmc5_dat3.sdmmc5_dat3",
|
||||
OMAP_MUX_MODE0 | OMAP_PIN_INPUT_PULLUP);
|
||||
|
||||
}
|
||||
|
||||
static struct wl12xx_platform_data omap4_sdp4430_wlan_data __initdata = {
|
||||
.irq = OMAP_GPIO_IRQ(GPIO_WIFI_IRQ),
|
||||
.board_ref_clock = WL12XX_REFCLOCK_26,
|
||||
.board_tcxo_clock = WL12XX_TCXOCLOCK_26,
|
||||
};
|
||||
|
||||
static void omap4_sdp4430_wifi_init(void)
|
||||
{
|
||||
omap4_sdp4430_wifi_mux_init();
|
||||
if (wl12xx_set_platform_data(&omap4_sdp4430_wlan_data))
|
||||
pr_err("Error setting wl12xx data\n");
|
||||
platform_device_register(&omap_vwlan_device);
|
||||
}
|
||||
|
||||
static void __init omap_4430sdp_init(void)
|
||||
{
|
||||
int status;
|
||||
@ -739,6 +754,7 @@ static void __init omap_4430sdp_init(void)
|
||||
omap_sfh7741prox_init();
|
||||
platform_add_devices(sdp4430_devices, ARRAY_SIZE(sdp4430_devices));
|
||||
board_serial_init();
|
||||
omap4_sdp4430_wifi_init();
|
||||
omap4_twl6030_hsmmc_init(mmc);
|
||||
|
||||
usb_musb_init(&musb_board_data);
|
||||
@ -752,7 +768,7 @@ static void __init omap_4430sdp_init(void)
|
||||
ARRAY_SIZE(sdp4430_spi_board_info));
|
||||
}
|
||||
|
||||
status = omap4_keyboard_init(&sdp4430_keypad_data);
|
||||
status = omap4_keyboard_init(&sdp4430_keypad_data, &keypad_data);
|
||||
if (status)
|
||||
pr_err("Keypad initialization failed: %d\n", status);
|
||||
|
||||
@ -773,5 +789,5 @@ MACHINE_START(OMAP_4430SDP, "OMAP4430 4430SDP board")
|
||||
.init_early = omap_4430sdp_init_early,
|
||||
.init_irq = gic_init_irq,
|
||||
.init_machine = omap_4430sdp_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap4_timer,
|
||||
MACHINE_END
|
||||
|
@ -104,7 +104,7 @@ MACHINE_START(CRANEBOARD, "AM3517/05 CRANEBOARD")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = am3517_crane_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = am3517_crane_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -494,7 +494,7 @@ MACHINE_START(OMAP3517EVM, "OMAP3517/AM3517 EVM")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = am3517_evm_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = am3517_evm_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -354,7 +354,7 @@ MACHINE_START(OMAP_APOLLON, "OMAP24xx Apollon")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap_apollon_map_io,
|
||||
.init_early = omap_apollon_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = omap_apollon_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
@ -1,8 +1,9 @@
|
||||
/*
|
||||
* board-cm-t35.c (CompuLab CM-T35 module)
|
||||
* CompuLab CM-T35/CM-T3730 modules support
|
||||
*
|
||||
* Copyright (C) 2009 CompuLab, Ltd.
|
||||
* Author: Mike Rapoport <mike@compulab.co.il>
|
||||
* Copyright (C) 2009-2011 CompuLab, Ltd.
|
||||
* Authors: Mike Rapoport <mike@compulab.co.il>
|
||||
* Igor Grinberg <grinberg@compulab.co.il>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
@ -13,11 +14,6 @@
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
@ -149,12 +145,12 @@ static struct mtd_partition cm_t35_nand_partitions[] = {
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x280000 */
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x2A0000 */
|
||||
.size = 32 * NAND_BLOCK_SIZE,
|
||||
},
|
||||
{
|
||||
.name = "rootfs",
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x680000 */
|
||||
.offset = MTDPART_OFS_APPEND, /* Offset = 0x6A0000 */
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
@ -162,9 +158,7 @@ static struct mtd_partition cm_t35_nand_partitions[] = {
|
||||
static struct omap_nand_platform_data cm_t35_nand_data = {
|
||||
.parts = cm_t35_nand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(cm_t35_nand_partitions),
|
||||
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
|
||||
.cs = 0,
|
||||
|
||||
};
|
||||
|
||||
static void __init cm_t35_init_nand(void)
|
||||
@ -337,19 +331,17 @@ static void __init cm_t35_init_display(void)
|
||||
}
|
||||
}
|
||||
|
||||
static struct regulator_consumer_supply cm_t35_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply cm_t35_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply cm_t35_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply cm_t35_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply cm_t35_vdac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
static struct regulator_consumer_supply cm_t35_vdvi_supply =
|
||||
REGULATOR_SUPPLY("vdvi", "omapdss");
|
||||
static struct regulator_consumer_supply cm_t35_vdvi_supply[] = {
|
||||
REGULATOR_SUPPLY("vdvi", "omapdss"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
static struct regulator_init_data cm_t35_vmmc1 = {
|
||||
@ -362,8 +354,8 @@ static struct regulator_init_data cm_t35_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cm_t35_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(cm_t35_vmmc1_supply),
|
||||
.consumer_supplies = cm_t35_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
|
||||
@ -377,41 +369,8 @@ static struct regulator_init_data cm_t35_vsim = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cm_t35_vsim_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
|
||||
static struct regulator_init_data cm_t35_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cm_t35_vdac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_init_data cm_t35_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &cm_t35_vdvi_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data cm_t35_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
.num_consumer_supplies = ARRAY_SIZE(cm_t35_vsim_supply),
|
||||
.consumer_supplies = cm_t35_vsim_supply,
|
||||
};
|
||||
|
||||
static uint32_t cm_t35_keymap[] = {
|
||||
@ -470,9 +429,9 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
|
||||
if (gpio_request_one(wlan_rst, GPIOF_OUT_INIT_HIGH, "WLAN RST") == 0) {
|
||||
gpio_export(wlan_rst, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(wlan_rst, 0);
|
||||
gpio_set_value_cansleep(wlan_rst, 0);
|
||||
udelay(10);
|
||||
gpio_set_value(wlan_rst, 1);
|
||||
gpio_set_value_cansleep(wlan_rst, 1);
|
||||
} else {
|
||||
pr_err("CM-T35: could not obtain gpio for WiFi reset\n");
|
||||
}
|
||||
@ -481,10 +440,6 @@ static int cm_t35_twl_gpio_setup(struct device *dev, unsigned gpio,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters */
|
||||
cm_t35_vmmc1_supply.dev = mmc[0].dev;
|
||||
cm_t35_vsim_supply.dev = mmc[0].dev;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -496,21 +451,23 @@ static struct twl4030_gpio_platform_data cm_t35_gpio_data = {
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data cm_t35_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.keypad = &cm_t35_kp_data,
|
||||
.usb = &cm_t35_usb_data,
|
||||
.gpio = &cm_t35_gpio_data,
|
||||
.vmmc1 = &cm_t35_vmmc1,
|
||||
.vsim = &cm_t35_vsim,
|
||||
.vdac = &cm_t35_vdac,
|
||||
.vpll2 = &cm_t35_vpll2,
|
||||
};
|
||||
|
||||
static void __init cm_t35_init_i2c(void)
|
||||
{
|
||||
omap3_pmic_get_config(&cm_t35_twldata, TWL_COMMON_PDATA_USB,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
cm_t35_twldata.vpll2->constraints.name = "VDVI";
|
||||
cm_t35_twldata.vpll2->num_consumer_supplies =
|
||||
ARRAY_SIZE(cm_t35_vdvi_supply);
|
||||
cm_t35_twldata.vpll2->consumer_supplies = cm_t35_vdvi_supply;
|
||||
|
||||
omap3_pmic_init("tps65930", &cm_t35_twldata);
|
||||
}
|
||||
|
||||
@ -578,17 +535,11 @@ static struct omap_board_mux board_mux[] __initdata = {
|
||||
OMAP3_MUX(UART1_TX, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(UART1_RX, OMAP_MUX_MODE0 | OMAP_PIN_INPUT),
|
||||
|
||||
/* DSS */
|
||||
/* common DSS */
|
||||
OMAP3_MUX(DSS_PCLK, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_HSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_VSYNC, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_ACBIAS, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA0, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA1, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA2, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA3, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA4, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA5, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA6, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA7, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA8, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
@ -601,12 +552,6 @@ static struct omap_board_mux board_mux[] __initdata = {
|
||||
OMAP3_MUX(DSS_DATA15, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA16, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA17, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA18, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA19, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA20, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA21, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA22, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
OMAP3_MUX(DSS_DATA23, OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT),
|
||||
|
||||
/* display controls */
|
||||
OMAP3_MUX(MCBSP1_FSR, OMAP_MUX_MODE4 | OMAP_PIN_OUTPUT),
|
||||
@ -619,19 +564,53 @@ static struct omap_board_mux board_mux[] __initdata = {
|
||||
|
||||
{ .reg_offset = OMAP_MUX_TERMINATOR },
|
||||
};
|
||||
|
||||
static void __init cm_t3x_common_dss_mux_init(int mux_mode)
|
||||
{
|
||||
omap_mux_init_signal("dss_data18", mux_mode);
|
||||
omap_mux_init_signal("dss_data19", mux_mode);
|
||||
omap_mux_init_signal("dss_data20", mux_mode);
|
||||
omap_mux_init_signal("dss_data21", mux_mode);
|
||||
omap_mux_init_signal("dss_data22", mux_mode);
|
||||
omap_mux_init_signal("dss_data23", mux_mode);
|
||||
}
|
||||
|
||||
static void __init cm_t35_init_mux(void)
|
||||
{
|
||||
omap_mux_init_signal("gpio_70", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_71", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_72", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_73", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_74", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("gpio_75", OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
cm_t3x_common_dss_mux_init(OMAP_MUX_MODE0 | OMAP_PIN_OUTPUT);
|
||||
}
|
||||
|
||||
static void __init cm_t3730_init_mux(void)
|
||||
{
|
||||
omap_mux_init_signal("sys_boot0", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sys_boot1", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sys_boot3", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sys_boot4", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sys_boot5", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_signal("sys_boot6", OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
cm_t3x_common_dss_mux_init(OMAP_MUX_MODE3 | OMAP_PIN_OUTPUT);
|
||||
}
|
||||
#else
|
||||
static inline void cm_t35_init_mux(void) {}
|
||||
static inline void cm_t3730_init_mux(void) {}
|
||||
#endif
|
||||
|
||||
static struct omap_board_config_kernel cm_t35_config[] __initdata = {
|
||||
};
|
||||
|
||||
static void __init cm_t35_init(void)
|
||||
static void __init cm_t3x_common_init(void)
|
||||
{
|
||||
omap_board_config = cm_t35_config;
|
||||
omap_board_config_size = ARRAY_SIZE(cm_t35_config);
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CUS);
|
||||
omap_serial_init();
|
||||
cm_t35_init_i2c();
|
||||
cm_t35_init_nand();
|
||||
omap_ads7846_init(1, CM_T35_GPIO_PENDOWN, 0, NULL);
|
||||
cm_t35_init_ethernet();
|
||||
cm_t35_init_led();
|
||||
@ -641,12 +620,35 @@ static void __init cm_t35_init(void)
|
||||
usbhs_init(&usbhs_bdata);
|
||||
}
|
||||
|
||||
static void __init cm_t35_init(void)
|
||||
{
|
||||
cm_t3x_common_init();
|
||||
cm_t35_init_mux();
|
||||
cm_t35_init_nand();
|
||||
}
|
||||
|
||||
static void __init cm_t3730_init(void)
|
||||
{
|
||||
cm_t3x_common_init();
|
||||
cm_t3730_init_mux();
|
||||
}
|
||||
|
||||
MACHINE_START(CM_T35, "Compulab CM-T35")
|
||||
.boot_params = 0x80000100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = cm_t35_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = cm_t35_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(CM_T3730, "Compulab CM-T3730")
|
||||
.boot_params = 0x80000100,
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = cm_t35_init_early,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = cm_t3730_init,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -236,7 +236,6 @@ static struct mtd_partition cm_t3517_nand_partitions[] = {
|
||||
static struct omap_nand_platform_data cm_t3517_nand_data = {
|
||||
.parts = cm_t3517_nand_partitions,
|
||||
.nr_parts = ARRAY_SIZE(cm_t3517_nand_partitions),
|
||||
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
|
||||
.cs = 0,
|
||||
};
|
||||
|
||||
@ -304,7 +303,7 @@ MACHINE_START(CM_T3517, "Compulab CM-T3517")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = cm_t3517_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = cm_t3517_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -58,7 +58,6 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#define OMAP_DM9000_GPIO_IRQ 25
|
||||
@ -130,13 +129,14 @@ static void devkit8000_panel_disable_dvi(struct omap_dss_device *dssdev)
|
||||
gpio_set_value_cansleep(dssdev->reset_gpio, 0);
|
||||
}
|
||||
|
||||
static struct regulator_consumer_supply devkit8000_vmmc1_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
|
||||
|
||||
static struct regulator_consumer_supply devkit8000_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* ads7846 on SPI */
|
||||
static struct regulator_consumer_supply devkit8000_vio_supply =
|
||||
REGULATOR_SUPPLY("vcc", "spi2.0");
|
||||
static struct regulator_consumer_supply devkit8000_vio_supply[] = {
|
||||
REGULATOR_SUPPLY("vcc", "spi2.0"),
|
||||
};
|
||||
|
||||
static struct panel_generic_dpi_data lcd_panel = {
|
||||
.name = "generic",
|
||||
@ -186,9 +186,6 @@ static struct omap_dss_board_info devkit8000_dss_data = {
|
||||
.default_device = &devkit8000_lcd_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply devkit8000_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_1),
|
||||
KEY(1, 0, KEY_2),
|
||||
@ -284,22 +281,8 @@ static struct regulator_init_data devkit8000_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &devkit8000_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
|
||||
static struct regulator_init_data devkit8000_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &devkit8000_vdda_dac_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(devkit8000_vmmc1_supply),
|
||||
.consumer_supplies = devkit8000_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VPLL1 for digital video outputs */
|
||||
@ -327,31 +310,14 @@ static struct regulator_init_data devkit8000_vio = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &devkit8000_vio_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data devkit8000_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data devkit8000_audio_data;
|
||||
|
||||
static struct twl4030_codec_data devkit8000_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &devkit8000_audio_data,
|
||||
.num_consumer_supplies = ARRAY_SIZE(devkit8000_vio_supply),
|
||||
.consumer_supplies = devkit8000_vio_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data devkit8000_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.usb = &devkit8000_usb_data,
|
||||
.gpio = &devkit8000_gpio_data,
|
||||
.codec = &devkit8000_codec_data,
|
||||
.vmmc1 = &devkit8000_vmmc1,
|
||||
.vdac = &devkit8000_vdac,
|
||||
.vpll1 = &devkit8000_vpll1,
|
||||
.vio = &devkit8000_vio,
|
||||
.keypad = &devkit8000_kp_data,
|
||||
@ -359,6 +325,9 @@ static struct twl4030_platform_data devkit8000_twldata = {
|
||||
|
||||
static int __init devkit8000_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&devkit8000_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC);
|
||||
omap3_pmic_init("tps65930", &devkit8000_twldata);
|
||||
/* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||
* projector don't work reliably with 400kHz */
|
||||
@ -438,10 +407,7 @@ static void __init devkit8000_init_early(void)
|
||||
|
||||
static void __init devkit8000_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
omap2_gp_clockevent_set_gptimer(12);
|
||||
#endif
|
||||
omap3_init_irq();
|
||||
}
|
||||
|
||||
#define OMAP_DM9000_BASE 0x2c000000
|
||||
@ -707,5 +673,5 @@ MACHINE_START(DEVKIT8000, "OMAP3 Devkit8000")
|
||||
.init_early = devkit8000_init_early,
|
||||
.init_irq = devkit8000_init_irq,
|
||||
.init_machine = devkit8000_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_secure_timer,
|
||||
MACHINE_END
|
||||
|
@ -132,11 +132,7 @@ static struct gpmc_timings nand_timings = {
|
||||
};
|
||||
|
||||
static struct omap_nand_platform_data board_nand_data = {
|
||||
.nand_setup = NULL,
|
||||
.gpmc_t = &nand_timings,
|
||||
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
|
||||
.dev_ready = NULL,
|
||||
.devsize = 0, /* '0' for 8-bit, '1' for 16-bit device */
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -70,7 +70,7 @@ MACHINE_START(OMAP_GENERIC, "Generic OMAP24xx")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap_generic_map_io,
|
||||
.init_early = omap_generic_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = omap_generic_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -298,7 +298,7 @@ static void __init omap_h4_init_early(void)
|
||||
|
||||
static void __init omap_h4_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
omap2_init_irq();
|
||||
}
|
||||
|
||||
static struct at24_platform_data m24c01 = {
|
||||
@ -388,5 +388,5 @@ MACHINE_START(OMAP_H4, "OMAP2420 H4 board")
|
||||
.init_early = omap_h4_init_early,
|
||||
.init_irq = omap_h4_init_irq,
|
||||
.init_machine = omap_h4_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
@ -222,8 +222,9 @@ static inline void __init igep2_init_smsc911x(void)
|
||||
static inline void __init igep2_init_smsc911x(void) { }
|
||||
#endif
|
||||
|
||||
static struct regulator_consumer_supply igep_vmmc1_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
|
||||
static struct regulator_consumer_supply igep_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
|
||||
static struct regulator_init_data igep_vmmc1 = {
|
||||
@ -236,12 +237,13 @@ static struct regulator_init_data igep_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &igep_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(igep_vmmc1_supply),
|
||||
.consumer_supplies = igep_vmmc1_supply,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply igep_vio_supply =
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply igep_vio_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data igep_vio = {
|
||||
.constraints = {
|
||||
@ -254,20 +256,21 @@ static struct regulator_init_data igep_vio = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &igep_vio_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(igep_vio_supply),
|
||||
.consumer_supplies = igep_vio_supply,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply igep_vmmc2_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply igep_vmmc2_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data igep_vmmc2 = {
|
||||
.constraints = {
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL,
|
||||
.always_on = 1,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &igep_vmmc2_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(igep_vmmc2_supply),
|
||||
.consumer_supplies = igep_vmmc2_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config igep_vwlan = {
|
||||
@ -440,10 +443,6 @@ static struct twl4030_gpio_platform_data igep_twl4030_gpio_pdata = {
|
||||
.setup = igep_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data igep_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int igep2_enable_dvi(struct omap_dss_device *dssdev)
|
||||
{
|
||||
gpio_direction_output(IGEP2_GPIO_DVI_PUP, 1);
|
||||
@ -480,26 +479,6 @@ static struct omap_dss_board_info igep2_dss_data = {
|
||||
.default_device = &igep2_dvi_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply igep2_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data igep2_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(igep2_vpll2_supplies),
|
||||
.consumer_supplies = igep2_vpll2_supplies,
|
||||
};
|
||||
|
||||
static void __init igep2_display_init(void)
|
||||
{
|
||||
int err = gpio_request_one(IGEP2_GPIO_DVI_PUP, GPIOF_OUT_INIT_HIGH,
|
||||
@ -519,13 +498,6 @@ static void __init igep_init_early(void)
|
||||
m65kxxxxam_sdrc_params);
|
||||
}
|
||||
|
||||
static struct twl4030_codec_audio_data igep2_audio_data;
|
||||
|
||||
static struct twl4030_codec_data igep2_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &igep2_audio_data,
|
||||
};
|
||||
|
||||
static int igep2_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_RIGHT),
|
||||
@ -558,11 +530,7 @@ static struct twl4030_keypad_data igep2_keypad_pdata = {
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data igep_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.usb = &igep_usb_data,
|
||||
.gpio = &igep_twl4030_gpio_pdata,
|
||||
.vmmc1 = &igep_vmmc1,
|
||||
.vio = &igep_vio,
|
||||
@ -578,6 +546,8 @@ static void __init igep_i2c_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_USB, 0);
|
||||
|
||||
if (machine_is_igep0020()) {
|
||||
/*
|
||||
* Bus 3 is attached to the DVI port where devices like the
|
||||
@ -588,9 +558,12 @@ static void __init igep_i2c_init(void)
|
||||
if (ret)
|
||||
pr_warning("IGEP2: Could not register I2C3 bus (%d)\n", ret);
|
||||
|
||||
igep_twldata.codec = &igep2_codec_data;
|
||||
igep_twldata.keypad = &igep2_keypad_pdata;
|
||||
igep_twldata.vpll2 = &igep2_vpll2;
|
||||
/* Get common pmic data */
|
||||
omap3_pmic_get_config(&igep_twldata, TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VPLL2);
|
||||
igep_twldata.vpll2->constraints.apply_uV = true;
|
||||
igep_twldata.vpll2->constraints.name = "VDVI";
|
||||
}
|
||||
|
||||
omap3_pmic_init("twl4030", &igep_twldata);
|
||||
@ -703,9 +676,9 @@ MACHINE_START(IGEP0020, "IGEP v2 board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = igep_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = igep_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
||||
@ -713,7 +686,7 @@ MACHINE_START(IGEP0030, "IGEP OMAP3 module")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = igep_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = igep_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -199,22 +199,14 @@ static void __init omap_ldp_init_early(void)
|
||||
omap2_init_common_devices(NULL, NULL);
|
||||
}
|
||||
|
||||
static struct twl4030_usb_data ldp_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_gpio_platform_data ldp_gpio_data = {
|
||||
.gpio_base = OMAP_MAX_GPIO_LINES,
|
||||
.irq_base = TWL4030_GPIO_IRQ_BASE,
|
||||
.irq_end = TWL4030_GPIO_IRQ_END,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data ldp_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply ldp_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply ldp_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
@ -228,8 +220,8 @@ static struct regulator_init_data ldp_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &ldp_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(ldp_vmmc1_supply),
|
||||
.consumer_supplies = ldp_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* ads7846 on SPI */
|
||||
@ -253,12 +245,7 @@ static struct regulator_init_data ldp_vaux1 = {
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data ldp_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.madc = &ldp_madc_data,
|
||||
.usb = &ldp_usb_data,
|
||||
.vmmc1 = &ldp_vmmc1,
|
||||
.vaux1 = &ldp_vaux1,
|
||||
.gpio = &ldp_gpio_data,
|
||||
@ -267,6 +254,8 @@ static struct twl4030_platform_data ldp_twldata = {
|
||||
|
||||
static int __init omap_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&ldp_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC, 0);
|
||||
omap3_pmic_init("twl4030", &ldp_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
@ -341,8 +330,6 @@ static void __init omap_ldp_init(void)
|
||||
ARRAY_SIZE(ldp_nand_partitions), ZOOM_NAND_CS, 0);
|
||||
|
||||
omap2_hsmmc_init(mmc);
|
||||
/* link regulators to MMC adapters */
|
||||
ldp_vmmc1_supply.dev = mmc[0].dev;
|
||||
}
|
||||
|
||||
MACHINE_START(OMAP_LDP, "OMAP LDP board")
|
||||
@ -350,7 +337,7 @@ MACHINE_START(OMAP_LDP, "OMAP LDP board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap_ldp_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_ldp_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -699,9 +699,9 @@ MACHINE_START(NOKIA_N800, "Nokia N800")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = n8x0_map_io,
|
||||
.init_early = n8x0_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = n8x0_init_machine,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_N810, "Nokia N810")
|
||||
@ -709,9 +709,9 @@ MACHINE_START(NOKIA_N810, "Nokia N810")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = n8x0_map_io,
|
||||
.init_early = n8x0_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = n8x0_init_machine,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
|
||||
@ -719,7 +719,7 @@ MACHINE_START(NOKIA_N810_WIMAX, "Nokia N810 WiMAX")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = n8x0_map_io,
|
||||
.init_early = n8x0_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap2_init_irq,
|
||||
.init_machine = n8x0_init_machine,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap2_timer,
|
||||
MACHINE_END
|
||||
|
@ -50,7 +50,6 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "pm.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
@ -61,7 +60,8 @@
|
||||
* AXBX = GPIO173, GPIO172, GPIO171: 1 1 1
|
||||
* C1_3 = GPIO173, GPIO172, GPIO171: 1 1 0
|
||||
* C4 = GPIO173, GPIO172, GPIO171: 1 0 1
|
||||
* XM = GPIO173, GPIO172, GPIO171: 0 0 0
|
||||
* XMA/XMB = GPIO173, GPIO172, GPIO171: 0 0 0
|
||||
* XMC = GPIO173, GPIO172, GPIO171: 0 1 0
|
||||
*/
|
||||
enum {
|
||||
OMAP3BEAGLE_BOARD_UNKN = 0,
|
||||
@ -69,14 +69,26 @@ enum {
|
||||
OMAP3BEAGLE_BOARD_C1_3,
|
||||
OMAP3BEAGLE_BOARD_C4,
|
||||
OMAP3BEAGLE_BOARD_XM,
|
||||
OMAP3BEAGLE_BOARD_XMC,
|
||||
};
|
||||
|
||||
static u8 omap3_beagle_version;
|
||||
|
||||
static u8 omap3_beagle_get_rev(void)
|
||||
{
|
||||
return omap3_beagle_version;
|
||||
}
|
||||
/*
|
||||
* Board-specific configuration
|
||||
* Defaults to BeagleBoard-xMC
|
||||
*/
|
||||
static struct {
|
||||
int mmc1_gpio_wp;
|
||||
int usb_pwr_level;
|
||||
int reset_gpio;
|
||||
int usr_button_gpio;
|
||||
} beagle_config = {
|
||||
.mmc1_gpio_wp = -EINVAL,
|
||||
.usb_pwr_level = GPIOF_OUT_INIT_LOW,
|
||||
.reset_gpio = 129,
|
||||
.usr_button_gpio = 4,
|
||||
};
|
||||
|
||||
static struct gpio omap3_beagle_rev_gpios[] __initdata = {
|
||||
{ 171, GPIOF_IN, "rev_id_0" },
|
||||
@ -111,18 +123,32 @@ static void __init omap3_beagle_init_rev(void)
|
||||
case 7:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: Ax/Bx\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_AXBX;
|
||||
beagle_config.mmc1_gpio_wp = 29;
|
||||
beagle_config.reset_gpio = 170;
|
||||
beagle_config.usr_button_gpio = 7;
|
||||
break;
|
||||
case 6:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: C1/C2/C3\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_C1_3;
|
||||
beagle_config.mmc1_gpio_wp = 23;
|
||||
beagle_config.reset_gpio = 170;
|
||||
beagle_config.usr_button_gpio = 7;
|
||||
break;
|
||||
case 5:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: C4\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_C4;
|
||||
beagle_config.mmc1_gpio_wp = 23;
|
||||
beagle_config.reset_gpio = 170;
|
||||
beagle_config.usr_button_gpio = 7;
|
||||
break;
|
||||
case 0:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: xM\n");
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: xM Ax/Bx\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_XM;
|
||||
beagle_config.usb_pwr_level = GPIOF_OUT_INIT_HIGH;
|
||||
break;
|
||||
case 2:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: xM C\n");
|
||||
omap3_beagle_version = OMAP3BEAGLE_BOARD_XMC;
|
||||
break;
|
||||
default:
|
||||
printk(KERN_INFO "OMAP3 Beagle Rev: unknown %hd\n", beagle_rev);
|
||||
@ -210,14 +236,6 @@ static struct omap_dss_board_info beagle_dss_data = {
|
||||
.default_device = &beagle_dvi_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply beagle_vdac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
static struct regulator_consumer_supply beagle_vdvi_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static void __init beagle_display_init(void)
|
||||
{
|
||||
int r;
|
||||
@ -234,17 +252,17 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
.caps = MMC_CAP_4_BIT_DATA | MMC_CAP_8_BIT_DATA,
|
||||
.gpio_wp = 29,
|
||||
.gpio_wp = -EINVAL,
|
||||
},
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply beagle_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply beagle_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply beagle_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply beagle_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct gpio_led gpio_leds[];
|
||||
@ -252,33 +270,22 @@ static struct gpio_led gpio_leds[];
|
||||
static int beagle_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
int r, usb_pwr_level;
|
||||
int r;
|
||||
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
mmc[0].gpio_wp = -EINVAL;
|
||||
} else if ((omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C1_3) ||
|
||||
(omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_C4)) {
|
||||
omap_mux_init_gpio(23, OMAP_PIN_INPUT);
|
||||
mmc[0].gpio_wp = 23;
|
||||
} else {
|
||||
omap_mux_init_gpio(29, OMAP_PIN_INPUT);
|
||||
}
|
||||
if (beagle_config.mmc1_gpio_wp != -EINVAL)
|
||||
omap_mux_init_gpio(beagle_config.mmc1_gpio_wp, OMAP_PIN_INPUT);
|
||||
mmc[0].gpio_wp = beagle_config.mmc1_gpio_wp;
|
||||
/* gpio + 0 is "mmc0_cd" (input/IRQ) */
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters */
|
||||
beagle_vmmc1_supply.dev = mmc[0].dev;
|
||||
beagle_vsim_supply.dev = mmc[0].dev;
|
||||
|
||||
/*
|
||||
* TWL4030_GPIO_MAX + 0 == ledA, EHCI nEN_USB_PWR (out, XM active
|
||||
* high / others active low)
|
||||
* DVI reset GPIO is different between beagle revisions
|
||||
*/
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
usb_pwr_level = GPIOF_OUT_INIT_HIGH;
|
||||
beagle_dvi_device.reset_gpio = 129;
|
||||
/* Valid for all -xM revisions */
|
||||
if (cpu_is_omap3630()) {
|
||||
/*
|
||||
* gpio + 1 on Xm controls the TFP410's enable line (active low)
|
||||
* gpio + 2 control varies depending on the board rev as below:
|
||||
@ -296,8 +303,6 @@ static int beagle_twl_gpio_setup(struct device *dev,
|
||||
pr_err("%s: unable to configure DVI_LDO_EN\n",
|
||||
__func__);
|
||||
} else {
|
||||
usb_pwr_level = GPIOF_OUT_INIT_LOW;
|
||||
beagle_dvi_device.reset_gpio = 170;
|
||||
/*
|
||||
* REVISIT: need ehci-omap hooks for external VBUS
|
||||
* power switch and overcurrent detect
|
||||
@ -305,8 +310,10 @@ static int beagle_twl_gpio_setup(struct device *dev,
|
||||
if (gpio_request_one(gpio + 1, GPIOF_IN, "EHCI_nOC"))
|
||||
pr_err("%s: unable to configure EHCI_nOC\n", __func__);
|
||||
}
|
||||
beagle_dvi_device.reset_gpio = beagle_config.reset_gpio;
|
||||
|
||||
gpio_request_one(gpio + TWL4030_GPIO_MAX, usb_pwr_level, "nEN_USB_PWR");
|
||||
gpio_request_one(gpio + TWL4030_GPIO_MAX, beagle_config.usb_pwr_level,
|
||||
"nEN_USB_PWR");
|
||||
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
@ -336,8 +343,8 @@ static struct regulator_init_data beagle_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &beagle_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(beagle_vmmc1_supply),
|
||||
.consumer_supplies = beagle_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
|
||||
@ -351,62 +358,15 @@ static struct regulator_init_data beagle_vsim = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &beagle_vsim_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
|
||||
static struct regulator_init_data beagle_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &beagle_vdac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_init_data beagle_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(beagle_vdvi_supplies),
|
||||
.consumer_supplies = beagle_vdvi_supplies,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data beagle_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data beagle_audio_data;
|
||||
|
||||
static struct twl4030_codec_data beagle_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &beagle_audio_data,
|
||||
.num_consumer_supplies = ARRAY_SIZE(beagle_vsim_supply),
|
||||
.consumer_supplies = beagle_vsim_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data beagle_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.usb = &beagle_usb_data,
|
||||
.gpio = &beagle_gpio_data,
|
||||
.codec = &beagle_codec_data,
|
||||
.vmmc1 = &beagle_vmmc1,
|
||||
.vsim = &beagle_vsim,
|
||||
.vdac = &beagle_vdac,
|
||||
.vpll2 = &beagle_vpll2,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
|
||||
@ -417,6 +377,12 @@ static struct i2c_board_info __initdata beagle_i2c_eeprom[] = {
|
||||
|
||||
static int __init omap3_beagle_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&beagle_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
beagle_twldata.vpll2->constraints.name = "VDVI";
|
||||
|
||||
omap3_pmic_init("twl4030", &beagle_twldata);
|
||||
/* Bus 3 is attached to the DVI port where devices like the pico DLP
|
||||
* projector don't work reliably with 400kHz */
|
||||
@ -458,7 +424,8 @@ static struct platform_device leds_gpio = {
|
||||
static struct gpio_keys_button gpio_buttons[] = {
|
||||
{
|
||||
.code = BTN_EXTRA,
|
||||
.gpio = 7,
|
||||
/* Dynamically assigned depending on board */
|
||||
.gpio = -EINVAL,
|
||||
.desc = "user",
|
||||
.wakeup = 1,
|
||||
},
|
||||
@ -486,10 +453,7 @@ static void __init omap3_beagle_init_early(void)
|
||||
|
||||
static void __init omap3_beagle_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
omap2_gp_clockevent_set_gptimer(12);
|
||||
#endif
|
||||
omap3_init_irq();
|
||||
}
|
||||
|
||||
static struct platform_device *omap3_beagle_devices[] __initdata = {
|
||||
@ -525,8 +489,8 @@ static void __init beagle_opp_init(void)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Custom OPP enabled for XM */
|
||||
if (omap3_beagle_get_rev() == OMAP3BEAGLE_BOARD_XM) {
|
||||
/* Custom OPP enabled for all xM versions */
|
||||
if (cpu_is_omap3630()) {
|
||||
struct omap_hwmod *mh = omap_hwmod_lookup("mpu");
|
||||
struct omap_hwmod *dh = omap_hwmod_lookup("iva");
|
||||
struct device *dev;
|
||||
@ -566,6 +530,9 @@ static void __init omap3_beagle_init(void)
|
||||
omap3_mux_init(board_mux, OMAP_PACKAGE_CBB);
|
||||
omap3_beagle_init_rev();
|
||||
omap3_beagle_i2c_init();
|
||||
|
||||
gpio_buttons[0].gpio = beagle_config.usr_button_gpio;
|
||||
|
||||
platform_add_devices(omap3_beagle_devices,
|
||||
ARRAY_SIZE(omap3_beagle_devices));
|
||||
omap_display_init(&beagle_dss_data);
|
||||
@ -599,5 +566,5 @@ MACHINE_START(OMAP3_BEAGLE, "OMAP3 Beagle Board")
|
||||
.init_early = omap3_beagle_init_early,
|
||||
.init_irq = omap3_beagle_init_irq,
|
||||
.init_machine = omap3_beagle_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_secure_timer,
|
||||
MACHINE_END
|
||||
|
@ -273,12 +273,12 @@ static struct omap_dss_board_info omap3_evm_dss_data = {
|
||||
.default_device = &omap3_evm_lcd_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3evm_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply omap3evm_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3evm_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply omap3evm_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
@ -292,8 +292,8 @@ static struct regulator_init_data omap3evm_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3evm_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3evm_vmmc1_supply),
|
||||
.consumer_supplies = omap3evm_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
|
||||
@ -307,8 +307,8 @@ static struct regulator_init_data omap3evm_vsim = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3evm_vsim_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3evm_vsim_supply),
|
||||
.consumer_supplies = omap3evm_vsim_supply,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
@ -365,10 +365,6 @@ static int omap3evm_twl_gpio_setup(struct device *dev,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters */
|
||||
omap3evm_vmmc1_supply.dev = mmc[0].dev;
|
||||
omap3evm_vsim_supply.dev = mmc[0].dev;
|
||||
|
||||
/*
|
||||
* Most GPIOs are for USB OTG. Some are mostly sent to
|
||||
* the P2 connector; notably LEDA for the LCD backlight.
|
||||
@ -400,10 +396,6 @@ static struct twl4030_gpio_platform_data omap3evm_gpio_data = {
|
||||
.setup = omap3evm_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap3evm_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_DOWN),
|
||||
@ -438,58 +430,10 @@ static struct twl4030_keypad_data omap3evm_kp_data = {
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data omap3evm_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data omap3evm_audio_data;
|
||||
|
||||
static struct twl4030_codec_data omap3evm_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &omap3evm_audio_data,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3_evm_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
/* VDAC for DSS driving S-Video */
|
||||
static struct regulator_init_data omap3_evm_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.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,
|
||||
.consumer_supplies = &omap3_evm_vdda_dac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_consumer_supply omap3_evm_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap3_evm_vpll2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3_evm_vpll2_supplies),
|
||||
.consumer_supplies = omap3_evm_vpll2_supplies,
|
||||
};
|
||||
|
||||
/* ads7846 on SPI */
|
||||
static struct regulator_consumer_supply omap3evm_vio_supply =
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0");
|
||||
static struct regulator_consumer_supply omap3evm_vio_supply[] = {
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0"),
|
||||
};
|
||||
|
||||
/* VIO for ads7846 */
|
||||
static struct regulator_init_data omap3evm_vio = {
|
||||
@ -502,8 +446,8 @@ static struct regulator_init_data omap3evm_vio = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3evm_vio_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3evm_vio_supply),
|
||||
.consumer_supplies = omap3evm_vio_supply,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_WL12XX_PLATFORM_DATA
|
||||
@ -511,16 +455,17 @@ static struct regulator_init_data omap3evm_vio = {
|
||||
#define OMAP3EVM_WLAN_PMENA_GPIO (150)
|
||||
#define OMAP3EVM_WLAN_IRQ_GPIO (149)
|
||||
|
||||
static struct regulator_consumer_supply omap3evm_vmmc2_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply omap3evm_vmmc2_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
/* VMMC2 for driving the WL12xx module */
|
||||
static struct regulator_init_data omap3evm_vmmc2 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3evm_vmmc2_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3evm_vmmc2_supply),
|
||||
.consumer_supplies = omap3evm_vmmc2_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config omap3evm_vwlan = {
|
||||
@ -548,17 +493,9 @@ struct wl12xx_platform_data omap3evm_wlan_data __initdata = {
|
||||
#endif
|
||||
|
||||
static struct twl4030_platform_data omap3evm_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.keypad = &omap3evm_kp_data,
|
||||
.madc = &omap3evm_madc_data,
|
||||
.usb = &omap3evm_usb_data,
|
||||
.gpio = &omap3evm_gpio_data,
|
||||
.codec = &omap3evm_codec_data,
|
||||
.vdac = &omap3_evm_vdac,
|
||||
.vpll2 = &omap3_evm_vpll2,
|
||||
.vio = &omap3evm_vio,
|
||||
.vmmc1 = &omap3evm_vmmc1,
|
||||
.vsim = &omap3evm_vsim,
|
||||
@ -566,6 +503,14 @@ static struct twl4030_platform_data omap3evm_twldata = {
|
||||
|
||||
static int __init omap3_evm_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&omap3evm_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
|
||||
TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
omap3evm_twldata.vdac->constraints.apply_uV = true;
|
||||
omap3evm_twldata.vpll2->constraints.apply_uV = true;
|
||||
|
||||
omap3_pmic_init("twl4030", &omap3evm_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
@ -740,7 +685,7 @@ MACHINE_START(OMAP3EVM, "OMAP3 EVM")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3_evm_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap3_evm_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -35,7 +35,6 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "control.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
@ -55,8 +54,8 @@
|
||||
#define OMAP3_TORPEDO_MMC_GPIO_CD 127
|
||||
#define OMAP3_TORPEDO_SMSC911X_GPIO_IRQ 129
|
||||
|
||||
static struct regulator_consumer_supply omap3logic_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply omap3logic_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
@ -71,8 +70,8 @@ static struct regulator_init_data omap3logic_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3logic_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3logic_vmmc1_supply),
|
||||
.consumer_supplies = omap3logic_vmmc1_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_gpio_platform_data omap3logic_gpio_data = {
|
||||
@ -130,8 +129,6 @@ static void __init board_mmc_init(void)
|
||||
}
|
||||
|
||||
omap2_hsmmc_init(board_mmc_info);
|
||||
/* link regulators to MMC adapters */
|
||||
omap3logic_vmmc1_supply.dev = board_mmc_info[0].dev;
|
||||
}
|
||||
|
||||
static struct omap_smsc911x_platform_data __initdata board_smsc911x_data = {
|
||||
@ -215,16 +212,16 @@ MACHINE_START(OMAP3_TORPEDO, "Logic OMAP3 Torpedo board")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3logic_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap3logic_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP3530_LV_SOM, "OMAP Logic 3530 LV SOM board")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3logic_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap3logic_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -320,17 +320,17 @@ static struct twl4030_gpio_platform_data omap3pandora_gpio_data = {
|
||||
.setup = omap3pandora_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_vmmc1_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
|
||||
static struct regulator_consumer_supply pandora_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_vmmc2_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply pandora_vmmc2_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1")
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_vmmc3_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2");
|
||||
|
||||
static struct regulator_consumer_supply pandora_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
static struct regulator_consumer_supply pandora_vmmc3_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_vdds_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_sdi", "omapdss"),
|
||||
@ -338,11 +338,13 @@ static struct regulator_consumer_supply pandora_vdds_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_vcc_lcd_supply =
|
||||
REGULATOR_SUPPLY("vcc", "display0");
|
||||
static struct regulator_consumer_supply pandora_vcc_lcd_supply[] = {
|
||||
REGULATOR_SUPPLY("vcc", "display0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_usb_phy_supply =
|
||||
REGULATOR_SUPPLY("hsusb0", "ehci-omap.0");
|
||||
static struct regulator_consumer_supply pandora_usb_phy_supply[] = {
|
||||
REGULATOR_SUPPLY("hsusb0", "ehci-omap.0"),
|
||||
};
|
||||
|
||||
/* ads7846 on SPI and 2 nub controllers on I2C */
|
||||
static struct regulator_consumer_supply pandora_vaux4_supplies[] = {
|
||||
@ -351,8 +353,9 @@ static struct regulator_consumer_supply pandora_vaux4_supplies[] = {
|
||||
REGULATOR_SUPPLY("vcc", "3-0067"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply pandora_adac_supply =
|
||||
REGULATOR_SUPPLY("vcc", "soc-audio");
|
||||
static struct regulator_consumer_supply pandora_adac_supply[] = {
|
||||
REGULATOR_SUPPLY("vcc", "soc-audio"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
static struct regulator_init_data pandora_vmmc1 = {
|
||||
@ -365,8 +368,8 @@ static struct regulator_init_data pandora_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_vmmc1_supply),
|
||||
.consumer_supplies = pandora_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VMMC2 for MMC2 pins CMD, CLK, DAT0..DAT3 (max 100 mA) */
|
||||
@ -380,38 +383,8 @@ static struct regulator_init_data pandora_vmmc2 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_vmmc2_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video */
|
||||
static struct regulator_init_data pandora_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.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,
|
||||
.consumer_supplies = &pandora_vdda_dac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_init_data pandora_vpll2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_vdds_supplies),
|
||||
.consumer_supplies = pandora_vdds_supplies,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_vmmc2_supply),
|
||||
.consumer_supplies = pandora_vmmc2_supply,
|
||||
};
|
||||
|
||||
/* VAUX1 for LCD */
|
||||
@ -425,8 +398,8 @@ static struct regulator_init_data pandora_vaux1 = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_vcc_lcd_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_vcc_lcd_supply),
|
||||
.consumer_supplies = pandora_vcc_lcd_supply,
|
||||
};
|
||||
|
||||
/* VAUX2 for USB host PHY */
|
||||
@ -440,8 +413,8 @@ static struct regulator_init_data pandora_vaux2 = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_usb_phy_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_usb_phy_supply),
|
||||
.consumer_supplies = pandora_usb_phy_supply,
|
||||
};
|
||||
|
||||
/* VAUX4 for ads7846 and nubs */
|
||||
@ -470,8 +443,8 @@ static struct regulator_init_data pandora_vsim = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_adac_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_adac_supply),
|
||||
.consumer_supplies = pandora_adac_supply,
|
||||
};
|
||||
|
||||
/* Fixed regulator internal to Wifi module */
|
||||
@ -479,8 +452,8 @@ static struct regulator_init_data pandora_vmmc3 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &pandora_vmmc3_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(pandora_vmmc3_supply),
|
||||
.consumer_supplies = pandora_vmmc3_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config pandora_vwlan = {
|
||||
@ -501,29 +474,12 @@ static struct platform_device pandora_vwlan_device = {
|
||||
},
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap3pandora_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data omap3pandora_audio_data;
|
||||
|
||||
static struct twl4030_codec_data omap3pandora_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &omap3pandora_audio_data,
|
||||
};
|
||||
|
||||
static struct twl4030_bci_platform_data pandora_bci_data;
|
||||
|
||||
static struct twl4030_platform_data omap3pandora_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
.gpio = &omap3pandora_gpio_data,
|
||||
.usb = &omap3pandora_usb_data,
|
||||
.codec = &omap3pandora_codec_data,
|
||||
.vmmc1 = &pandora_vmmc1,
|
||||
.vmmc2 = &pandora_vmmc2,
|
||||
.vdac = &pandora_vdac,
|
||||
.vpll2 = &pandora_vpll2,
|
||||
.vaux1 = &pandora_vaux1,
|
||||
.vaux2 = &pandora_vaux2,
|
||||
.vaux4 = &pandora_vaux4,
|
||||
@ -541,6 +497,17 @@ static struct i2c_board_info __initdata omap3pandora_i2c3_boardinfo[] = {
|
||||
|
||||
static int __init omap3pandora_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&omap3pandora_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
omap3pandora_twldata.vdac->constraints.apply_uV = true;
|
||||
|
||||
omap3pandora_twldata.vpll2->constraints.apply_uV = true;
|
||||
omap3pandora_twldata.vpll2->num_consumer_supplies =
|
||||
ARRAY_SIZE(pandora_vdds_supplies);
|
||||
omap3pandora_twldata.vpll2->consumer_supplies = pandora_vdds_supplies;
|
||||
|
||||
omap3_pmic_init("tps65950", &omap3pandora_twldata);
|
||||
/* i2c2 pins are not connected */
|
||||
omap_register_i2c_bus(3, 100, omap3pandora_i2c3_boardinfo,
|
||||
@ -643,7 +610,7 @@ MACHINE_START(OMAP3_PANDORA, "Pandora Handheld Console")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap3pandora_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap3pandora_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -52,7 +52,6 @@
|
||||
#include "sdram-micron-mt46h32m32lf-6.h"
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#if defined(CONFIG_SMSC911X) || defined(CONFIG_SMSC911X_MODULE)
|
||||
@ -206,12 +205,12 @@ static struct omap_dss_board_info omap3_stalker_dss_data = {
|
||||
.default_device = &omap3_stalker_dvi_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3stalker_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply omap3stalker_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3stalker_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply omap3stalker_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
@ -224,8 +223,8 @@ static struct regulator_init_data omap3stalker_vmmc1 = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3stalker_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3stalker_vmmc1_supply),
|
||||
.consumer_supplies = omap3stalker_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
|
||||
@ -238,8 +237,8 @@ static struct regulator_init_data omap3stalker_vsim = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE | REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap3stalker_vsim_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3stalker_vsim_supply),
|
||||
.consumer_supplies = omap3stalker_vsim_supply,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
@ -321,10 +320,6 @@ omap3stalker_twl_gpio_setup(struct device *dev,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters */
|
||||
omap3stalker_vmmc1_supply.dev = mmc[0].dev;
|
||||
omap3stalker_vsim_supply.dev = mmc[0].dev;
|
||||
|
||||
/*
|
||||
* Most GPIOs are for USB OTG. Some are mostly sent to
|
||||
* the P2 connector; notably LEDA for the LCD backlight.
|
||||
@ -354,10 +349,6 @@ static struct twl4030_gpio_platform_data omap3stalker_gpio_data = {
|
||||
.setup = omap3stalker_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap3stalker_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static uint32_t board_keymap[] = {
|
||||
KEY(0, 0, KEY_LEFT),
|
||||
KEY(0, 1, KEY_DOWN),
|
||||
@ -392,68 +383,10 @@ static struct twl4030_keypad_data omap3stalker_kp_data = {
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data omap3stalker_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data omap3stalker_audio_data;
|
||||
|
||||
static struct twl4030_codec_data omap3stalker_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &omap3stalker_audio_data,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3_stalker_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
/* VDAC for DSS driving S-Video */
|
||||
static struct regulator_init_data omap3_stalker_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.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,
|
||||
.consumer_supplies = &omap3_stalker_vdda_dac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_consumer_supply omap3_stalker_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap3_stalker_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3_stalker_vpll2_supplies),
|
||||
.consumer_supplies = omap3_stalker_vpll2_supplies,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data omap3stalker_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.keypad = &omap3stalker_kp_data,
|
||||
.madc = &omap3stalker_madc_data,
|
||||
.usb = &omap3stalker_usb_data,
|
||||
.gpio = &omap3stalker_gpio_data,
|
||||
.codec = &omap3stalker_codec_data,
|
||||
.vdac = &omap3_stalker_vdac,
|
||||
.vpll2 = &omap3_stalker_vpll2,
|
||||
.vmmc1 = &omap3stalker_vmmc1,
|
||||
.vsim = &omap3stalker_vsim,
|
||||
};
|
||||
@ -474,6 +407,15 @@ static struct i2c_board_info __initdata omap3stalker_i2c_boardinfo3[] = {
|
||||
|
||||
static int __init omap3_stalker_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&omap3stalker_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC |
|
||||
TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
omap3stalker_twldata.vdac->constraints.apply_uV = true;
|
||||
omap3stalker_twldata.vpll2->constraints.apply_uV = true;
|
||||
omap3stalker_twldata.vpll2->constraints.name = "VDVI";
|
||||
|
||||
omap3_pmic_init("twl4030", &omap3stalker_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, omap3stalker_i2c_boardinfo3,
|
||||
@ -494,10 +436,7 @@ static void __init omap3_stalker_init_early(void)
|
||||
|
||||
static void __init omap3_stalker_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
omap2_gp_clockevent_set_gptimer(12);
|
||||
#endif
|
||||
omap3_init_irq();
|
||||
}
|
||||
|
||||
static struct platform_device *omap3_stalker_devices[] __initdata = {
|
||||
@ -560,5 +499,5 @@ MACHINE_START(SBC3530, "OMAP3 STALKER")
|
||||
.init_early = omap3_stalker_init_early,
|
||||
.init_irq = omap3_stalker_init_irq,
|
||||
.init_machine = omap3_stalker_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_secure_timer,
|
||||
MACHINE_END
|
||||
|
@ -51,7 +51,6 @@
|
||||
|
||||
#include "mux.h"
|
||||
#include "hsmmc.h"
|
||||
#include "timer-gp.h"
|
||||
#include "common-board-devices.h"
|
||||
|
||||
#include <asm/setup.h>
|
||||
@ -114,12 +113,12 @@ static struct omap_lcd_config omap3_touchbook_lcd_config __initdata = {
|
||||
.ctrl_name = "internal",
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply touchbook_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply touchbook_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply touchbook_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply touchbook_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct gpio_led gpio_leds[];
|
||||
@ -137,10 +136,6 @@ static int touchbook_twl_gpio_setup(struct device *dev,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters */
|
||||
touchbook_vmmc1_supply.dev = mmc[0].dev;
|
||||
touchbook_vsim_supply.dev = mmc[0].dev;
|
||||
|
||||
/* REVISIT: need ehci-omap hooks for external VBUS
|
||||
* power switch and overcurrent detect
|
||||
*/
|
||||
@ -167,14 +162,18 @@ static struct twl4030_gpio_platform_data touchbook_gpio_data = {
|
||||
.setup = touchbook_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply touchbook_vdac_supply = {
|
||||
static struct regulator_consumer_supply touchbook_vdac_supply[] = {
|
||||
{
|
||||
.supply = "vdac",
|
||||
.dev = &omap3_touchbook_lcd_device.dev,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply touchbook_vdvi_supply = {
|
||||
static struct regulator_consumer_supply touchbook_vdvi_supply[] = {
|
||||
{
|
||||
.supply = "vdvi",
|
||||
.dev = &omap3_touchbook_lcd_device.dev,
|
||||
},
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 pins CMD, CLK, DAT0..DAT3 (20 mA, plus card == max 220 mA) */
|
||||
@ -188,8 +187,8 @@ static struct regulator_init_data touchbook_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &touchbook_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(touchbook_vmmc1_supply),
|
||||
.consumer_supplies = touchbook_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VSIM for MMC1 pins DAT4..DAT7 (2 mA, plus card == max 50 mA) */
|
||||
@ -203,62 +202,15 @@ static struct regulator_init_data touchbook_vsim = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &touchbook_vsim_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
|
||||
static struct regulator_init_data touchbook_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &touchbook_vdac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_init_data touchbook_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &touchbook_vdvi_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data touchbook_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data touchbook_audio_data;
|
||||
|
||||
static struct twl4030_codec_data touchbook_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &touchbook_audio_data,
|
||||
.num_consumer_supplies = ARRAY_SIZE(touchbook_vsim_supply),
|
||||
.consumer_supplies = touchbook_vsim_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data touchbook_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.usb = &touchbook_usb_data,
|
||||
.gpio = &touchbook_gpio_data,
|
||||
.codec = &touchbook_codec_data,
|
||||
.vmmc1 = &touchbook_vmmc1,
|
||||
.vsim = &touchbook_vsim,
|
||||
.vdac = &touchbook_vdac,
|
||||
.vpll2 = &touchbook_vpll2,
|
||||
};
|
||||
|
||||
static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
|
||||
@ -270,8 +222,20 @@ static struct i2c_board_info __initdata touchBook_i2c_boardinfo[] = {
|
||||
static int __init omap3_touchbook_i2c_init(void)
|
||||
{
|
||||
/* Standard TouchBook bus */
|
||||
omap3_pmic_init("twl4030", &touchbook_twldata);
|
||||
omap3_pmic_get_config(&touchbook_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
touchbook_twldata.vdac->num_consumer_supplies =
|
||||
ARRAY_SIZE(touchbook_vdac_supply);
|
||||
touchbook_twldata.vdac->consumer_supplies = touchbook_vdac_supply;
|
||||
|
||||
touchbook_twldata.vpll2->constraints.name = "VDVI";
|
||||
touchbook_twldata.vpll2->num_consumer_supplies =
|
||||
ARRAY_SIZE(touchbook_vdvi_supply);
|
||||
touchbook_twldata.vpll2->consumer_supplies = touchbook_vdvi_supply;
|
||||
|
||||
omap3_pmic_init("twl4030", &touchbook_twldata);
|
||||
/* Additional TouchBook bus */
|
||||
omap_register_i2c_bus(3, 100, touchBook_i2c_boardinfo,
|
||||
ARRAY_SIZE(touchBook_i2c_boardinfo));
|
||||
@ -371,10 +335,7 @@ static void __init omap3_touchbook_init_early(void)
|
||||
|
||||
static void __init omap3_touchbook_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
omap2_gp_clockevent_set_gptimer(12);
|
||||
#endif
|
||||
omap3_init_irq();
|
||||
}
|
||||
|
||||
static struct platform_device *omap3_touchbook_devices[] __initdata = {
|
||||
@ -449,5 +410,5 @@ MACHINE_START(TOUCHBOOK, "OMAP3 touchbook Board")
|
||||
.init_early = omap3_touchbook_init_early,
|
||||
.init_irq = omap3_touchbook_init_irq,
|
||||
.init_machine = omap3_touchbook_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_secure_timer,
|
||||
MACHINE_END
|
||||
|
@ -41,7 +41,6 @@
|
||||
#include <plat/usb.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <video/omap-panel-generic-dpi.h>
|
||||
#include "timer-gp.h"
|
||||
|
||||
#include "hsmmc.h"
|
||||
#include "control.h"
|
||||
@ -155,14 +154,6 @@ static struct omap_musb_board_data musb_board_data = {
|
||||
.power = 100,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap4_usbphy_data = {
|
||||
.phy_init = omap4430_phy_init,
|
||||
.phy_exit = omap4430_phy_exit,
|
||||
.phy_power = omap4430_phy_power,
|
||||
.phy_set_clock = omap4430_phy_set_clk,
|
||||
.phy_suspend = omap4430_phy_suspend,
|
||||
};
|
||||
|
||||
static struct omap2_hsmmc_info mmc[] = {
|
||||
{
|
||||
.mmc = 1,
|
||||
@ -182,24 +173,16 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap4_panda_vmmc_supply[] = {
|
||||
{
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.0",
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap4_panda_vmmc5_supply = {
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.4",
|
||||
static struct regulator_consumer_supply omap4_panda_vmmc5_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.4"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data panda_vmmc5 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &omap4_panda_vmmc5_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap4_panda_vmmc5_supply),
|
||||
.consumer_supplies = omap4_panda_vmmc5_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config panda_vwlan = {
|
||||
@ -274,128 +257,8 @@ static int __init omap4_twl6030_hsmmc_init(struct omap2_hsmmc_info *controllers)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct regulator_init_data omap4_panda_vaux2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vaux3 = {
|
||||
.constraints = {
|
||||
.min_uV = 1000000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 card */
|
||||
static struct regulator_init_data omap4_panda_vmmc = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.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,
|
||||
.consumer_supplies = omap4_panda_vmmc_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vpp = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 2500000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vana = {
|
||||
.constraints = {
|
||||
.min_uV = 2100000,
|
||||
.max_uV = 2100000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vcxio = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_vusb = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_panda_clk32kg = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data omap4_panda_twldata = {
|
||||
.irq_base = TWL6030_IRQ_BASE,
|
||||
.irq_end = TWL6030_IRQ_END,
|
||||
|
||||
/* Regulators */
|
||||
.vmmc = &omap4_panda_vmmc,
|
||||
.vpp = &omap4_panda_vpp,
|
||||
.vana = &omap4_panda_vana,
|
||||
.vcxio = &omap4_panda_vcxio,
|
||||
.vdac = &omap4_panda_vdac,
|
||||
.vusb = &omap4_panda_vusb,
|
||||
.vaux2 = &omap4_panda_vaux2,
|
||||
.vaux3 = &omap4_panda_vaux3,
|
||||
.clk32kg = &omap4_panda_clk32kg,
|
||||
.usb = &omap4_usbphy_data,
|
||||
};
|
||||
/* Panda board uses the common PMIC configuration */
|
||||
static struct twl4030_platform_data omap4_panda_twldata;
|
||||
|
||||
/*
|
||||
* Display monitor features are burnt in their EEPROM as EDID data. The EEPROM
|
||||
@ -409,6 +272,16 @@ static struct i2c_board_info __initdata panda_i2c_eeprom[] = {
|
||||
|
||||
static int __init omap4_panda_i2c_init(void)
|
||||
{
|
||||
omap4_pmic_get_config(&omap4_panda_twldata, TWL_COMMON_PDATA_USB,
|
||||
TWL_COMMON_REGULATOR_VDAC |
|
||||
TWL_COMMON_REGULATOR_VAUX2 |
|
||||
TWL_COMMON_REGULATOR_VAUX3 |
|
||||
TWL_COMMON_REGULATOR_VMMC |
|
||||
TWL_COMMON_REGULATOR_VPP |
|
||||
TWL_COMMON_REGULATOR_VANA |
|
||||
TWL_COMMON_REGULATOR_VCXIO |
|
||||
TWL_COMMON_REGULATOR_VUSB |
|
||||
TWL_COMMON_REGULATOR_CLK32KG);
|
||||
omap4_pmic_init("twl6030", &omap4_panda_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
/*
|
||||
@ -716,5 +589,5 @@ MACHINE_START(OMAP4_PANDA, "OMAP4 Panda board")
|
||||
.init_early = omap4_panda_init_early,
|
||||
.init_irq = gic_init_irq,
|
||||
.init_machine = omap4_panda_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap4_timer,
|
||||
MACHINE_END
|
||||
|
@ -74,15 +74,16 @@
|
||||
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
|
||||
/* fixed regulator for ads7846 */
|
||||
static struct regulator_consumer_supply ads7846_supply =
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0");
|
||||
static struct regulator_consumer_supply ads7846_supply[] = {
|
||||
REGULATOR_SUPPLY("vcc", "spi1.0"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data vads7846_regulator = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &ads7846_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(ads7846_supply),
|
||||
.consumer_supplies = ads7846_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config vads7846 = {
|
||||
@ -264,14 +265,6 @@ static struct omap_dss_board_info overo_dss_data = {
|
||||
.default_device = &overo_dvi_device,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply overo_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
static struct regulator_consumer_supply overo_vdds_dsi_supply[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct mtd_partition overo_nand_partitions[] = {
|
||||
{
|
||||
.name = "xloader",
|
||||
@ -319,8 +312,8 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply overo_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply overo_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
@ -415,8 +408,6 @@ static int overo_twl_gpio_setup(struct device *dev,
|
||||
{
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
overo_vmmc1_supply.dev = mmc[0].dev;
|
||||
|
||||
#if defined(CONFIG_LEDS_GPIO) || defined(CONFIG_LEDS_GPIO_MODULE)
|
||||
/* TWL4030_GPIO_MAX + 1 == ledB, PMU_STAT (out, active low LED) */
|
||||
gpio_leds[2].gpio = gpio + TWL4030_GPIO_MAX + 1;
|
||||
@ -433,10 +424,6 @@ static struct twl4030_gpio_platform_data overo_gpio_data = {
|
||||
.setup = overo_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data overo_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct regulator_init_data overo_vmmc1 = {
|
||||
.constraints = {
|
||||
.min_uV = 1850000,
|
||||
@ -447,59 +434,23 @@ static struct regulator_init_data overo_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &overo_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VDAC for DSS driving S-Video (8 mA unloaded, max 65 mA) */
|
||||
static struct regulator_init_data overo_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &overo_vdda_dac_supply,
|
||||
};
|
||||
|
||||
/* VPLL2 for digital video outputs */
|
||||
static struct regulator_init_data overo_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VDVI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(overo_vdds_dsi_supply),
|
||||
.consumer_supplies = overo_vdds_dsi_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data overo_audio_data;
|
||||
|
||||
static struct twl4030_codec_data overo_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &overo_audio_data,
|
||||
.num_consumer_supplies = ARRAY_SIZE(overo_vmmc1_supply),
|
||||
.consumer_supplies = overo_vmmc1_supply,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data overo_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
.gpio = &overo_gpio_data,
|
||||
.usb = &overo_usb_data,
|
||||
.codec = &overo_codec_data,
|
||||
.vmmc1 = &overo_vmmc1,
|
||||
.vdac = &overo_vdac,
|
||||
.vpll2 = &overo_vpll2,
|
||||
};
|
||||
|
||||
static int __init overo_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&overo_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
overo_twldata.vpll2->constraints.name = "VDVI";
|
||||
|
||||
omap3_pmic_init("tps65950", &overo_twldata);
|
||||
/* i2c2 pins are used for gpio */
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
@ -568,7 +519,6 @@ static void __init overo_init(void)
|
||||
usb_musb_init(NULL);
|
||||
usbhs_init(&usbhs_bdata);
|
||||
overo_spi_init();
|
||||
overo_ads7846_init();
|
||||
overo_init_smsc911x();
|
||||
overo_display_init();
|
||||
overo_init_led();
|
||||
@ -615,7 +565,7 @@ MACHINE_START(OVERO, "Gumstix Overo")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = overo_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = overo_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -79,20 +79,14 @@ static struct twl4030_gpio_platform_data rm680_gpio_data = {
|
||||
.pulldowns = BIT(1) | BIT(2) | BIT(8) | BIT(15),
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data rm680_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data rm680_twl_data = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
.gpio = &rm680_gpio_data,
|
||||
.usb = &rm680_usb_data,
|
||||
/* add rest of the children here */
|
||||
};
|
||||
|
||||
static void __init rm680_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&rm680_twl_data, TWL_COMMON_PDATA_USB, 0);
|
||||
omap_pmic_init(1, 2900, "twl5031", INT_34XX_SYS_NIRQ, &rm680_twl_data);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
omap_register_i2c_bus(3, 400, NULL, 0);
|
||||
@ -163,7 +157,7 @@ MACHINE_START(NOKIA_RM680, "Nokia RM-680 board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = rm680_map_io,
|
||||
.init_early = rm680_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = rm680_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -39,6 +39,7 @@
|
||||
#include <sound/tpa6130a2-plat.h>
|
||||
#include <media/radio-si4713.h>
|
||||
#include <media/si4713.h>
|
||||
#include <linux/leds-lp5523.h>
|
||||
|
||||
#include <../drivers/staging/iio/light/tsl2563.h>
|
||||
|
||||
@ -53,6 +54,7 @@
|
||||
#define RX51_WL1251_IRQ_GPIO 42
|
||||
#define RX51_FMTX_RESET_GPIO 163
|
||||
#define RX51_FMTX_IRQ 53
|
||||
#define RX51_LP5523_CHIP_EN_GPIO 41
|
||||
|
||||
#define RX51_USB_TRANSCEIVER_RST_GPIO 67
|
||||
|
||||
@ -71,6 +73,64 @@ static struct tsl2563_platform_data rx51_tsl2563_platform_data = {
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE)
|
||||
static struct lp5523_led_config rx51_lp5523_led_config[] = {
|
||||
{
|
||||
.chan_nr = 0,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 1,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 2,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 3,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 4,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 5,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 6,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 7,
|
||||
.led_current = 50,
|
||||
}, {
|
||||
.chan_nr = 8,
|
||||
.led_current = 50,
|
||||
}
|
||||
};
|
||||
|
||||
static int rx51_lp5523_setup(void)
|
||||
{
|
||||
return gpio_request_one(RX51_LP5523_CHIP_EN_GPIO, GPIOF_DIR_OUT,
|
||||
"lp5523_enable");
|
||||
}
|
||||
|
||||
static void rx51_lp5523_release(void)
|
||||
{
|
||||
gpio_free(RX51_LP5523_CHIP_EN_GPIO);
|
||||
}
|
||||
|
||||
static void rx51_lp5523_enable(bool state)
|
||||
{
|
||||
gpio_set_value(RX51_LP5523_CHIP_EN_GPIO, !!state);
|
||||
}
|
||||
|
||||
static struct lp5523_platform_data rx51_lp5523_platform_data = {
|
||||
.led_config = rx51_lp5523_led_config,
|
||||
.num_channels = ARRAY_SIZE(rx51_lp5523_led_config),
|
||||
.clock_mode = LP5523_CLOCK_AUTO,
|
||||
.setup_resources = rx51_lp5523_setup,
|
||||
.release_resources = rx51_lp5523_release,
|
||||
.enable = rx51_lp5523_enable,
|
||||
};
|
||||
#endif
|
||||
|
||||
static struct omap2_mcspi_device_config wl1251_mcspi_config = {
|
||||
.turbo_mode = 0,
|
||||
.single_channel = 1,
|
||||
@ -288,10 +348,6 @@ static struct twl4030_keypad_data rx51_kp_data = {
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data rx51_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
/* Enable input logic and pull all lines up when eMMC is on. */
|
||||
static struct omap_board_mux rx51_mmc2_on_mux[] = {
|
||||
OMAP3_MUX(SDMMC2_CMD, OMAP_PIN_INPUT_PULLUP | OMAP_MUX_MODE0),
|
||||
@ -358,14 +414,17 @@ static struct omap2_hsmmc_info mmc[] __initdata = {
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply rx51_vmmc1_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0");
|
||||
static struct regulator_consumer_supply rx51_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply rx51_vaux3_supply =
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply rx51_vaux3_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply rx51_vsim_supply =
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1");
|
||||
static struct regulator_consumer_supply rx51_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply rx51_vmmc2_supplies[] = {
|
||||
/* tlv320aic3x analog supplies */
|
||||
@ -395,10 +454,6 @@ static struct regulator_consumer_supply rx51_vaux1_consumers[] = {
|
||||
REGULATOR_SUPPLY("vdd", "2-0063"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply rx51_vdac_supply[] = {
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vaux1 = {
|
||||
.constraints = {
|
||||
.name = "V28",
|
||||
@ -452,8 +507,8 @@ static struct regulator_init_data rx51_vaux3_mmc = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &rx51_vaux3_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(rx51_vaux3_supply),
|
||||
.consumer_supplies = rx51_vaux3_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vaux4 = {
|
||||
@ -479,8 +534,8 @@ static struct regulator_init_data rx51_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &rx51_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(rx51_vmmc1_supply),
|
||||
.consumer_supplies = rx51_vmmc1_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vmmc2 = {
|
||||
@ -500,6 +555,32 @@ static struct regulator_init_data rx51_vmmc2 = {
|
||||
.consumer_supplies = rx51_vmmc2_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vpll1 = {
|
||||
.constraints = {
|
||||
.name = "VPLL",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.always_on = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vpll2 = {
|
||||
.constraints = {
|
||||
.name = "VSDI_CSI",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.apply_uV = true,
|
||||
.always_on = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vsim = {
|
||||
.constraints = {
|
||||
.name = "VMMC2_IO_18",
|
||||
@ -511,23 +592,8 @@ static struct regulator_init_data rx51_vsim = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &rx51_vsim_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vdac = {
|
||||
.constraints = {
|
||||
.name = "VDAC",
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.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,
|
||||
.consumer_supplies = rx51_vdac_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(rx51_vsim_supply),
|
||||
.consumer_supplies = rx51_vsim_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vio = {
|
||||
@ -544,6 +610,43 @@ static struct regulator_init_data rx51_vio = {
|
||||
.consumer_supplies = rx51_vio_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vintana1 = {
|
||||
.constraints = {
|
||||
.name = "VINTANA1",
|
||||
.min_uV = 1500000,
|
||||
.max_uV = 1500000,
|
||||
.always_on = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vintana2 = {
|
||||
.constraints = {
|
||||
.name = "VINTANA2",
|
||||
.min_uV = 2750000,
|
||||
.max_uV = 2750000,
|
||||
.apply_uV = true,
|
||||
.always_on = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data rx51_vintdig = {
|
||||
.constraints = {
|
||||
.name = "VINTDIG",
|
||||
.min_uV = 1500000,
|
||||
.max_uV = 1500000,
|
||||
.always_on = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE,
|
||||
},
|
||||
};
|
||||
|
||||
static struct si4713_platform_data rx51_si4713_i2c_data __initdata_or_module = {
|
||||
.gpio_reset = RX51_FMTX_RESET_GPIO,
|
||||
};
|
||||
@ -600,10 +703,6 @@ static struct twl4030_gpio_platform_data rx51_gpio_data = {
|
||||
.setup = rx51_twlgpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data rx51_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_ins sleep_on_seq[] __initdata = {
|
||||
/*
|
||||
* Turn off everything
|
||||
@ -775,14 +874,9 @@ struct twl4030_codec_data rx51_codec_data __initdata = {
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data rx51_twldata __initdata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.gpio = &rx51_gpio_data,
|
||||
.keypad = &rx51_kp_data,
|
||||
.madc = &rx51_madc_data,
|
||||
.usb = &rx51_usb_data,
|
||||
.power = &rx51_t2scripts_data,
|
||||
.codec = &rx51_codec_data,
|
||||
|
||||
@ -790,8 +884,12 @@ static struct twl4030_platform_data rx51_twldata __initdata = {
|
||||
.vaux2 = &rx51_vaux2,
|
||||
.vaux4 = &rx51_vaux4,
|
||||
.vmmc1 = &rx51_vmmc1,
|
||||
.vpll1 = &rx51_vpll1,
|
||||
.vpll2 = &rx51_vpll2,
|
||||
.vsim = &rx51_vsim,
|
||||
.vdac = &rx51_vdac,
|
||||
.vintana1 = &rx51_vintana1,
|
||||
.vintana2 = &rx51_vintana2,
|
||||
.vintdig = &rx51_vintdig,
|
||||
.vio = &rx51_vio,
|
||||
};
|
||||
|
||||
@ -829,6 +927,12 @@ static struct i2c_board_info __initdata rx51_peripherals_i2c_board_info_2[] = {
|
||||
I2C_BOARD_INFO("tsl2563", 0x29),
|
||||
.platform_data = &rx51_tsl2563_platform_data,
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_LEDS_LP5523) || defined(CONFIG_LEDS_LP5523_MODULE)
|
||||
{
|
||||
I2C_BOARD_INFO("lp5523", 0x32),
|
||||
.platform_data = &rx51_lp5523_platform_data,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
I2C_BOARD_INFO("tpa6130a2", 0x60),
|
||||
@ -847,6 +951,13 @@ static int __init rx51_i2c_init(void)
|
||||
rx51_twldata.vaux3 = &rx51_vaux3_cam;
|
||||
}
|
||||
rx51_twldata.vmmc2 = &rx51_vmmc2;
|
||||
omap3_pmic_get_config(&rx51_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_MADC,
|
||||
TWL_COMMON_REGULATOR_VDAC);
|
||||
|
||||
rx51_twldata.vdac->constraints.apply_uV = true;
|
||||
rx51_twldata.vdac->constraints.name = "VDAC";
|
||||
|
||||
omap_pmic_init(1, 2200, "twl5030", INT_34XX_SYS_NIRQ, &rx51_twldata);
|
||||
omap_register_i2c_bus(2, 100, rx51_peripherals_i2c_board_info_2,
|
||||
ARRAY_SIZE(rx51_peripherals_i2c_board_info_2));
|
||||
@ -973,6 +1084,7 @@ static void __init rx51_init_wl1251(void)
|
||||
void __init rx51_peripherals_init(void)
|
||||
{
|
||||
rx51_i2c_init();
|
||||
regulator_has_full_constraints();
|
||||
gpmc_onenand_init(board_onenand_data);
|
||||
board_smc91x_init();
|
||||
rx51_add_gpio_keys();
|
||||
|
@ -160,7 +160,7 @@ MACHINE_START(NOKIA_RX51, "Nokia RX-51 board")
|
||||
.reserve = rx51_reserve,
|
||||
.map_io = rx51_map_io,
|
||||
.init_early = rx51_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = rx51_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -33,11 +33,6 @@ static void __init ti8168_init_early(void)
|
||||
omap2_init_common_devices(NULL, NULL);
|
||||
}
|
||||
|
||||
static void __init ti8168_evm_init_irq(void)
|
||||
{
|
||||
omap_init_irq();
|
||||
}
|
||||
|
||||
static void __init ti8168_evm_init(void)
|
||||
{
|
||||
omap_serial_init();
|
||||
@ -56,7 +51,7 @@ MACHINE_START(TI8168EVM, "ti8168evm")
|
||||
.boot_params = 0x80000100,
|
||||
.map_io = ti8168_evm_map_io,
|
||||
.init_early = ti8168_init_early,
|
||||
.init_irq = ti8168_evm_init_irq,
|
||||
.timer = &omap_timer,
|
||||
.init_irq = ti816x_init_irq,
|
||||
.timer = &omap3_timer,
|
||||
.init_machine = ti8168_evm_init,
|
||||
MACHINE_END
|
||||
|
@ -23,6 +23,7 @@
|
||||
#define ZOOM_SMSC911X_GPIO 158
|
||||
#define ZOOM_QUADUART_CS 3
|
||||
#define ZOOM_QUADUART_GPIO 102
|
||||
#define ZOOM_QUADUART_RST_GPIO 152
|
||||
#define QUART_CLK 1843200
|
||||
#define DEBUG_BASE 0x08000000
|
||||
#define ZOOM_ETHR_START DEBUG_BASE
|
||||
@ -67,6 +68,14 @@ static inline void __init zoom_init_quaduart(void)
|
||||
unsigned long cs_mem_base;
|
||||
int quart_gpio = 0;
|
||||
|
||||
if (gpio_request_one(ZOOM_QUADUART_RST_GPIO,
|
||||
GPIOF_OUT_INIT_LOW,
|
||||
"TL16CP754C GPIO") < 0) {
|
||||
pr_err("Failed to request GPIO%d for TL16CP754C\n",
|
||||
ZOOM_QUADUART_RST_GPIO);
|
||||
return;
|
||||
}
|
||||
|
||||
quart_cs = ZOOM_QUADUART_CS;
|
||||
|
||||
if (gpmc_cs_request(quart_cs, SZ_1M, &cs_mem_base) < 0) {
|
||||
|
@ -105,21 +105,20 @@ static struct twl4030_keypad_data zoom_kp_twl4030_data = {
|
||||
.rep = 1,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vmmc1_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply zoom_vmmc1_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vsim_supply = {
|
||||
.supply = "vmmc_aux",
|
||||
static struct regulator_consumer_supply zoom_vsim_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc_aux", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vmmc2_supply = {
|
||||
.supply = "vmmc",
|
||||
static struct regulator_consumer_supply zoom_vmmc2_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vmmc3_supply = {
|
||||
.supply = "vmmc",
|
||||
.dev_name = "omap_hsmmc.2",
|
||||
static struct regulator_consumer_supply zoom_vmmc3_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.2"),
|
||||
};
|
||||
|
||||
/* VMMC1 for OMAP VDD_MMC1 (i/o) and MMC1 card */
|
||||
@ -133,8 +132,8 @@ static struct regulator_init_data zoom_vmmc1 = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vmmc1_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(zoom_vmmc1_supply),
|
||||
.consumer_supplies = zoom_vmmc1_supply,
|
||||
};
|
||||
|
||||
/* VMMC2 for MMC2 card */
|
||||
@ -148,8 +147,8 @@ static struct regulator_init_data zoom_vmmc2 = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vmmc2_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(zoom_vmmc2_supply),
|
||||
.consumer_supplies = zoom_vmmc2_supply,
|
||||
};
|
||||
|
||||
/* VSIM for OMAP VDD_MMC1A (i/o for DAT4..DAT7) */
|
||||
@ -163,16 +162,16 @@ static struct regulator_init_data zoom_vsim = {
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vsim_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(zoom_vsim_supply),
|
||||
.consumer_supplies = zoom_vsim_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data zoom_vmmc3 = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vmmc3_supply,
|
||||
.num_consumer_supplies = ARRAY_SIZE(zoom_vmmc3_supply),
|
||||
.consumer_supplies = zoom_vmmc3_supply,
|
||||
};
|
||||
|
||||
static struct fixed_voltage_config zoom_vwlan = {
|
||||
@ -227,40 +226,6 @@ static struct omap2_hsmmc_info mmc[] = {
|
||||
{} /* Terminator */
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply zoom_vdda_dac_supply =
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc");
|
||||
|
||||
static struct regulator_init_data zoom_vpll2 = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(zoom_vpll2_supplies),
|
||||
.consumer_supplies = zoom_vpll2_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_init_data zoom_vdac = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = 1,
|
||||
.consumer_supplies = &zoom_vdda_dac_supply,
|
||||
};
|
||||
|
||||
static int zoom_twl_gpio_setup(struct device *dev,
|
||||
unsigned gpio, unsigned ngpio)
|
||||
{
|
||||
@ -270,13 +235,6 @@ static int zoom_twl_gpio_setup(struct device *dev,
|
||||
mmc[0].gpio_cd = gpio + 0;
|
||||
omap2_hsmmc_init(mmc);
|
||||
|
||||
/* link regulators to MMC adapters ... we "know" the
|
||||
* regulators will be set up only *after* we return.
|
||||
*/
|
||||
zoom_vmmc1_supply.dev = mmc[0].dev;
|
||||
zoom_vsim_supply.dev = mmc[0].dev;
|
||||
zoom_vmmc2_supply.dev = mmc[1].dev;
|
||||
|
||||
ret = gpio_request_one(LCD_PANEL_ENABLE_GPIO, GPIOF_OUT_INIT_LOW,
|
||||
"lcd enable");
|
||||
if (ret)
|
||||
@ -292,26 +250,6 @@ static void zoom2_set_hs_extmute(int mute)
|
||||
gpio_set_value(ZOOM2_HEADSET_EXTMUTE_GPIO, mute);
|
||||
}
|
||||
|
||||
static int zoom_batt_table[] = {
|
||||
/* 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
|
||||
};
|
||||
|
||||
static struct twl4030_bci_platform_data zoom_bci_data = {
|
||||
.battery_tmp_tbl = zoom_batt_table,
|
||||
.tblsize = ARRAY_SIZE(zoom_batt_table),
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data zoom_usb_data = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static struct twl4030_gpio_platform_data zoom_gpio_data = {
|
||||
.gpio_base = OMAP_MAX_GPIO_LINES,
|
||||
.irq_base = TWL4030_GPIO_IRQ_BASE,
|
||||
@ -319,41 +257,29 @@ static struct twl4030_gpio_platform_data zoom_gpio_data = {
|
||||
.setup = zoom_twl_gpio_setup,
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data zoom_madc_data = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data zoom_audio_data;
|
||||
|
||||
static struct twl4030_codec_data zoom_codec_data = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &zoom_audio_data,
|
||||
};
|
||||
|
||||
static struct twl4030_platform_data zoom_twldata = {
|
||||
.irq_base = TWL4030_IRQ_BASE,
|
||||
.irq_end = TWL4030_IRQ_END,
|
||||
|
||||
/* platform_data for children goes here */
|
||||
.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,
|
||||
.vmmc1 = &zoom_vmmc1,
|
||||
.vmmc2 = &zoom_vmmc2,
|
||||
.vsim = &zoom_vsim,
|
||||
.vpll2 = &zoom_vpll2,
|
||||
.vdac = &zoom_vdac,
|
||||
};
|
||||
|
||||
static int __init omap_i2c_init(void)
|
||||
{
|
||||
omap3_pmic_get_config(&zoom_twldata,
|
||||
TWL_COMMON_PDATA_USB | TWL_COMMON_PDATA_BCI |
|
||||
TWL_COMMON_PDATA_MADC | TWL_COMMON_PDATA_AUDIO,
|
||||
TWL_COMMON_REGULATOR_VDAC | TWL_COMMON_REGULATOR_VPLL2);
|
||||
|
||||
if (machine_is_omap_zoom2()) {
|
||||
zoom_audio_data.ramp_delay_value = 3; /* 161 ms */
|
||||
zoom_audio_data.hs_extmute = 1;
|
||||
zoom_audio_data.set_hs_extmute = zoom2_set_hs_extmute;
|
||||
struct twl4030_codec_audio_data *audio_data;
|
||||
audio_data = zoom_twldata.codec->audio;
|
||||
|
||||
audio_data->ramp_delay_value = 3; /* 161 ms */
|
||||
audio_data->hs_extmute = 1;
|
||||
audio_data->set_hs_extmute = zoom2_set_hs_extmute;
|
||||
}
|
||||
omap_pmic_init(1, 2400, "twl5030", INT_34XX_SYS_NIRQ, &zoom_twldata);
|
||||
omap_register_i2c_bus(2, 400, NULL, 0);
|
||||
|
@ -137,9 +137,9 @@ MACHINE_START(OMAP_ZOOM2, "OMAP Zoom2 board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap_zoom_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_zoom_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
||||
MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
|
||||
@ -147,7 +147,7 @@ MACHINE_START(OMAP_ZOOM3, "OMAP Zoom3 board")
|
||||
.reserve = omap_reserve,
|
||||
.map_io = omap3_map_io,
|
||||
.init_early = omap_zoom_init_early,
|
||||
.init_irq = omap_init_irq,
|
||||
.init_irq = omap3_init_irq,
|
||||
.init_machine = omap_zoom_init,
|
||||
.timer = &omap_timer,
|
||||
.timer = &omap3_timer,
|
||||
MACHINE_END
|
||||
|
@ -453,6 +453,7 @@ int __init omap2_clk_switch_mpurate_at_boot(const char *mpurate_ck_name)
|
||||
if (IS_ERR_VALUE(r)) {
|
||||
WARN(1, "clock: %s: unable to set MPU rate to %d: %d\n",
|
||||
mpurate_ck->name, mpurate, r);
|
||||
clk_put(mpurate_ck);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -20,36 +20,15 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/spi/ads7846.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/mcspi.h>
|
||||
#include <plat/nand.h>
|
||||
|
||||
#include "common-board-devices.h"
|
||||
|
||||
static struct i2c_board_info __initdata pmic_i2c_board_info = {
|
||||
.addr = 0x48,
|
||||
.flags = I2C_CLIENT_WAKE,
|
||||
};
|
||||
|
||||
void __init omap_pmic_init(int bus, u32 clkrate,
|
||||
const char *pmic_type, int pmic_irq,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
strncpy(pmic_i2c_board_info.type, pmic_type,
|
||||
sizeof(pmic_i2c_board_info.type));
|
||||
pmic_i2c_board_info.irq = pmic_irq;
|
||||
pmic_i2c_board_info.platform_data = pmic_data;
|
||||
|
||||
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_TOUCHSCREEN_ADS7846) || \
|
||||
defined(CONFIG_TOUCHSCREEN_ADS7846_MODULE)
|
||||
static struct omap2_mcspi_device_config ads7846_mcspi_config = {
|
||||
@ -115,9 +94,7 @@ void __init omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_MTD_NAND_OMAP2) || defined(CONFIG_MTD_NAND_OMAP2_MODULE)
|
||||
static struct omap_nand_platform_data nand_data = {
|
||||
.dma_channel = -1, /* disable DMA in OMAP NAND driver */
|
||||
};
|
||||
static struct omap_nand_platform_data nand_data;
|
||||
|
||||
void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
|
||||
int nr_parts)
|
||||
@ -148,7 +125,7 @@ void __init omap_nand_flash_init(int options, struct mtd_partition *parts,
|
||||
nand_data.cs = nandcs;
|
||||
nand_data.parts = parts;
|
||||
nand_data.nr_parts = nr_parts;
|
||||
nand_data.options = options;
|
||||
nand_data.devsize = options;
|
||||
|
||||
printk(KERN_INFO "Registering NAND on CS%d\n", nandcs);
|
||||
if (gpmc_nand_init(&nand_data) < 0)
|
||||
|
@ -1,33 +1,11 @@
|
||||
#ifndef __OMAP_COMMON_BOARD_DEVICES__
|
||||
#define __OMAP_COMMON_BOARD_DEVICES__
|
||||
|
||||
#include "twl-common.h"
|
||||
|
||||
#define NAND_BLOCK_SIZE SZ_128K
|
||||
|
||||
struct twl4030_platform_data;
|
||||
struct mtd_partition;
|
||||
|
||||
void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq,
|
||||
struct twl4030_platform_data *pmic_data);
|
||||
|
||||
static inline void omap2_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data);
|
||||
}
|
||||
|
||||
static inline void omap3_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data);
|
||||
}
|
||||
|
||||
static inline void omap4_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
/* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */
|
||||
omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data);
|
||||
}
|
||||
|
||||
struct ads7846_platform_data;
|
||||
|
||||
void omap_ads7846_init(int bus_num, int gpio_pendown, int gpio_debounce,
|
||||
|
@ -230,7 +230,7 @@ struct omap_device_pm_latency omap_keyboard_latency[] = {
|
||||
};
|
||||
|
||||
int __init omap4_keyboard_init(struct omap4_keypad_platform_data
|
||||
*sdp4430_keypad_data)
|
||||
*sdp4430_keypad_data, struct omap_board_data *bdata)
|
||||
{
|
||||
struct omap_device *od;
|
||||
struct omap_hwmod *oh;
|
||||
@ -257,6 +257,7 @@ int __init omap4_keyboard_init(struct omap4_keypad_platform_data
|
||||
name, oh->name);
|
||||
return PTR_ERR(od);
|
||||
}
|
||||
oh->mux = omap_hwmod_mux_init(bdata->pads, bdata->pads_cnt);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -20,8 +20,6 @@
|
||||
#include <plat/board.h>
|
||||
#include <plat/gpmc.h>
|
||||
|
||||
static struct omap_nand_platform_data *gpmc_nand_data;
|
||||
|
||||
static struct resource gpmc_nand_resource = {
|
||||
.flags = IORESOURCE_MEM,
|
||||
};
|
||||
@ -33,7 +31,7 @@ static struct platform_device gpmc_nand_device = {
|
||||
.resource = &gpmc_nand_resource,
|
||||
};
|
||||
|
||||
static int omap2_nand_gpmc_retime(void)
|
||||
static int omap2_nand_gpmc_retime(struct omap_nand_platform_data *gpmc_nand_data)
|
||||
{
|
||||
struct gpmc_timings t;
|
||||
int err;
|
||||
@ -83,13 +81,11 @@ static int omap2_nand_gpmc_retime(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data)
|
||||
int __init gpmc_nand_init(struct omap_nand_platform_data *gpmc_nand_data)
|
||||
{
|
||||
int err = 0;
|
||||
struct device *dev = &gpmc_nand_device.dev;
|
||||
|
||||
gpmc_nand_data = _nand_data;
|
||||
gpmc_nand_data->nand_setup = omap2_nand_gpmc_retime;
|
||||
gpmc_nand_device.dev.platform_data = gpmc_nand_data;
|
||||
|
||||
err = gpmc_cs_request(gpmc_nand_data->cs, NAND_IO_SIZE,
|
||||
@ -100,7 +96,7 @@ int __init gpmc_nand_init(struct omap_nand_platform_data *_nand_data)
|
||||
}
|
||||
|
||||
/* Set timings in GPMC */
|
||||
err = omap2_nand_gpmc_retime();
|
||||
err = omap2_nand_gpmc_retime(gpmc_nand_data);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "Unable to set gpmc timings: %d\n", err);
|
||||
return err;
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/omap-pm.h>
|
||||
@ -213,12 +214,10 @@ static int nop_mmc_set_power(struct device *dev, int slot, int power_on,
|
||||
static inline void omap_hsmmc_mux(struct omap_mmc_platform_data *mmc_controller,
|
||||
int controller_nr)
|
||||
{
|
||||
if ((mmc_controller->slots[0].switch_pin > 0) && \
|
||||
(mmc_controller->slots[0].switch_pin < OMAP_MAX_GPIO_LINES))
|
||||
if (gpio_is_valid(mmc_controller->slots[0].switch_pin))
|
||||
omap_mux_init_gpio(mmc_controller->slots[0].switch_pin,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
if ((mmc_controller->slots[0].gpio_wp > 0) && \
|
||||
(mmc_controller->slots[0].gpio_wp < OMAP_MAX_GPIO_LINES))
|
||||
if (gpio_is_valid(mmc_controller->slots[0].gpio_wp))
|
||||
omap_mux_init_gpio(mmc_controller->slots[0].gpio_wp,
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
if (cpu_is_omap34xx()) {
|
||||
|
@ -333,23 +333,9 @@ static int _set_hwmod_postsetup_state(struct omap_hwmod *oh, void *data)
|
||||
return omap_hwmod_set_postsetup_state(oh, *(u8 *)data);
|
||||
}
|
||||
|
||||
/* See irq.c, omap4-common.c and entry-macro.S */
|
||||
void __iomem *omap_irq_base;
|
||||
|
||||
/*
|
||||
* Initialize asm_irq_base for entry-macro.S
|
||||
*/
|
||||
static inline void omap_irq_base_init(void)
|
||||
{
|
||||
if (cpu_is_omap24xx())
|
||||
omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP24XX_IC_BASE);
|
||||
else if (cpu_is_omap34xx())
|
||||
omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP34XX_IC_BASE);
|
||||
else if (cpu_is_omap44xx())
|
||||
omap_irq_base = OMAP2_L4_IO_ADDRESS(OMAP44XX_GIC_CPU_BASE);
|
||||
else
|
||||
pr_err("Could not initialize omap_irq_base\n");
|
||||
}
|
||||
|
||||
void __init omap2_init_common_infrastructure(void)
|
||||
{
|
||||
u8 postsetup_state;
|
||||
@ -422,7 +408,6 @@ void __init omap2_init_common_devices(struct omap_sdrc_params *sdrc_cs0,
|
||||
_omap2_init_reprogram_sdrc();
|
||||
}
|
||||
|
||||
omap_irq_base_init();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -225,8 +225,8 @@ static u32 omap2_get_pte_attr(struct iotlb_entry *e)
|
||||
attr = e->mixed << 5;
|
||||
attr |= e->endian;
|
||||
attr |= e->elsz >> 3;
|
||||
attr <<= ((e->pgsz & MMU_CAM_PGSZ_4K) ? 0 : 6);
|
||||
|
||||
attr <<= (((e->pgsz == MMU_CAM_PGSZ_4K) ||
|
||||
(e->pgsz == MMU_CAM_PGSZ_64K)) ? 0 : 6);
|
||||
return attr;
|
||||
}
|
||||
|
||||
|
@ -141,25 +141,20 @@ omap_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
|
||||
IRQ_NOREQUEST | IRQ_NOPROBE, 0);
|
||||
}
|
||||
|
||||
void __init omap_init_irq(void)
|
||||
static void __init omap_init_irq(u32 base, int nr_irqs)
|
||||
{
|
||||
unsigned long nr_of_irqs = 0;
|
||||
unsigned int nr_banks = 0;
|
||||
int i, j;
|
||||
|
||||
omap_irq_base = ioremap(base, SZ_4K);
|
||||
if (WARN_ON(!omap_irq_base))
|
||||
return;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(irq_banks); i++) {
|
||||
unsigned long base = 0;
|
||||
struct omap_irq_bank *bank = irq_banks + i;
|
||||
|
||||
if (cpu_is_omap24xx())
|
||||
base = OMAP24XX_IC_BASE;
|
||||
else if (cpu_is_omap34xx())
|
||||
base = OMAP34XX_IC_BASE;
|
||||
|
||||
BUG_ON(!base);
|
||||
|
||||
if (cpu_is_ti816x())
|
||||
bank->nr_irqs = 128;
|
||||
bank->nr_irqs = nr_irqs;
|
||||
|
||||
/* Static mapping, never released */
|
||||
bank->base_reg = ioremap(base, SZ_4K);
|
||||
@ -181,6 +176,21 @@ void __init omap_init_irq(void)
|
||||
nr_of_irqs, nr_banks, nr_banks > 1 ? "s" : "");
|
||||
}
|
||||
|
||||
void __init omap2_init_irq(void)
|
||||
{
|
||||
omap_init_irq(OMAP24XX_IC_BASE, 96);
|
||||
}
|
||||
|
||||
void __init omap3_init_irq(void)
|
||||
{
|
||||
omap_init_irq(OMAP34XX_IC_BASE, 96);
|
||||
}
|
||||
|
||||
void __init ti816x_init_irq(void)
|
||||
{
|
||||
omap_init_irq(OMAP34XX_IC_BASE, 128);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
static struct omap3_intc_regs intc_context[ARRAY_SIZE(irq_banks)];
|
||||
|
||||
|
@ -67,7 +67,7 @@ static struct iommu_device omap4_devices[] = {
|
||||
.pdata = {
|
||||
.name = "ducati",
|
||||
.nr_tlb_entries = 32,
|
||||
.clk_name = "ducati_ick",
|
||||
.clk_name = "ipu_fck",
|
||||
.da_start = 0x0,
|
||||
.da_end = 0xFFFFF000,
|
||||
},
|
||||
|
@ -19,6 +19,8 @@
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
|
||||
#include <plat/irqs.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/omap4-common.h>
|
||||
|
||||
@ -31,17 +33,15 @@ void __iomem *gic_dist_base_addr;
|
||||
|
||||
void __init gic_init_irq(void)
|
||||
{
|
||||
void __iomem *gic_cpu_base;
|
||||
|
||||
/* Static mapping, never released */
|
||||
gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);
|
||||
BUG_ON(!gic_dist_base_addr);
|
||||
|
||||
/* Static mapping, never released */
|
||||
gic_cpu_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512);
|
||||
BUG_ON(!gic_cpu_base);
|
||||
omap_irq_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512);
|
||||
BUG_ON(!omap_irq_base);
|
||||
|
||||
gic_init(0, 29, gic_dist_base_addr, gic_cpu_base);
|
||||
gic_init(0, 29, gic_dist_base_addr, omap_irq_base);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CACHE_L2X0
|
||||
|
@ -38,155 +38,12 @@
|
||||
#include "prm2xxx_3xxx.h"
|
||||
#include "pm.h"
|
||||
|
||||
int omap2_pm_debug;
|
||||
u32 enable_off_mode;
|
||||
u32 sleep_while_idle;
|
||||
u32 wakeup_timer_seconds;
|
||||
u32 wakeup_timer_milliseconds;
|
||||
|
||||
#define DUMP_PRM_MOD_REG(mod, reg) \
|
||||
regs[reg_count].name = #mod "." #reg; \
|
||||
regs[reg_count++].val = omap2_prm_read_mod_reg(mod, reg)
|
||||
#define DUMP_CM_MOD_REG(mod, reg) \
|
||||
regs[reg_count].name = #mod "." #reg; \
|
||||
regs[reg_count++].val = omap2_cm_read_mod_reg(mod, reg)
|
||||
#define DUMP_PRM_REG(reg) \
|
||||
regs[reg_count].name = #reg; \
|
||||
regs[reg_count++].val = __raw_readl(reg)
|
||||
#define DUMP_CM_REG(reg) \
|
||||
regs[reg_count].name = #reg; \
|
||||
regs[reg_count++].val = __raw_readl(reg)
|
||||
#define DUMP_INTC_REG(reg, off) \
|
||||
regs[reg_count].name = #reg; \
|
||||
regs[reg_count++].val = \
|
||||
__raw_readl(OMAP2_L4_IO_ADDRESS(0x480fe000 + (off)))
|
||||
|
||||
void omap2_pm_dump(int mode, int resume, unsigned int us)
|
||||
{
|
||||
struct reg {
|
||||
const char *name;
|
||||
u32 val;
|
||||
} regs[32];
|
||||
int reg_count = 0, i;
|
||||
const char *s1 = NULL, *s2 = NULL;
|
||||
|
||||
if (!resume) {
|
||||
#if 0
|
||||
/* MPU */
|
||||
DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRM_IRQENABLE_MPU_OFFSET);
|
||||
DUMP_CM_MOD_REG(MPU_MOD, OMAP2_CM_CLKSTCTRL);
|
||||
DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTCTRL);
|
||||
DUMP_PRM_MOD_REG(MPU_MOD, OMAP2_PM_PWSTST);
|
||||
DUMP_PRM_MOD_REG(MPU_MOD, PM_WKDEP);
|
||||
#endif
|
||||
#if 0
|
||||
/* INTC */
|
||||
DUMP_INTC_REG(INTC_MIR0, 0x0084);
|
||||
DUMP_INTC_REG(INTC_MIR1, 0x00a4);
|
||||
DUMP_INTC_REG(INTC_MIR2, 0x00c4);
|
||||
#endif
|
||||
#if 0
|
||||
DUMP_CM_MOD_REG(CORE_MOD, CM_FCLKEN1);
|
||||
if (cpu_is_omap24xx()) {
|
||||
DUMP_CM_MOD_REG(CORE_MOD, OMAP24XX_CM_FCLKEN2);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD,
|
||||
OMAP2_PRCM_CLKEMUL_CTRL_OFFSET);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_GR_MOD,
|
||||
OMAP2_PRCM_CLKSRC_CTRL_OFFSET);
|
||||
}
|
||||
DUMP_CM_MOD_REG(WKUP_MOD, CM_FCLKEN);
|
||||
DUMP_CM_MOD_REG(CORE_MOD, CM_ICLKEN1);
|
||||
DUMP_CM_MOD_REG(CORE_MOD, CM_ICLKEN2);
|
||||
DUMP_CM_MOD_REG(WKUP_MOD, CM_ICLKEN);
|
||||
DUMP_CM_MOD_REG(PLL_MOD, CM_CLKEN);
|
||||
DUMP_CM_MOD_REG(PLL_MOD, CM_AUTOIDLE);
|
||||
DUMP_PRM_MOD_REG(CORE_MOD, OMAP2_PM_PWSTST);
|
||||
#endif
|
||||
#if 0
|
||||
/* DSP */
|
||||
if (cpu_is_omap24xx()) {
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_FCLKEN);
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_ICLKEN);
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_IDLEST);
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_AUTOIDLE);
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, CM_CLKSEL);
|
||||
DUMP_CM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_CM_CLKSTCTRL);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTCTRL);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_RM_RSTST);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTCTRL);
|
||||
DUMP_PRM_MOD_REG(OMAP24XX_DSP_MOD, OMAP2_PM_PWSTST);
|
||||
}
|
||||
#endif
|
||||
} else {
|
||||
DUMP_PRM_MOD_REG(CORE_MOD, PM_WKST1);
|
||||
if (cpu_is_omap24xx())
|
||||
DUMP_PRM_MOD_REG(CORE_MOD, OMAP24XX_PM_WKST2);
|
||||
DUMP_PRM_MOD_REG(WKUP_MOD, PM_WKST);
|
||||
DUMP_PRM_MOD_REG(OCP_MOD, OMAP2_PRCM_IRQSTATUS_MPU_OFFSET);
|
||||
#if 1
|
||||
DUMP_INTC_REG(INTC_PENDING_IRQ0, 0x0098);
|
||||
DUMP_INTC_REG(INTC_PENDING_IRQ1, 0x00b8);
|
||||
DUMP_INTC_REG(INTC_PENDING_IRQ2, 0x00d8);
|
||||
#endif
|
||||
}
|
||||
|
||||
switch (mode) {
|
||||
case 0:
|
||||
s1 = "full";
|
||||
s2 = "retention";
|
||||
break;
|
||||
case 1:
|
||||
s1 = "MPU";
|
||||
s2 = "retention";
|
||||
break;
|
||||
case 2:
|
||||
s1 = "MPU";
|
||||
s2 = "idle";
|
||||
break;
|
||||
}
|
||||
|
||||
if (!resume)
|
||||
#ifdef CONFIG_NO_HZ
|
||||
printk(KERN_INFO
|
||||
"--- Going to %s %s (next timer after %u ms)\n", s1, s2,
|
||||
jiffies_to_msecs(get_next_timer_interrupt(jiffies) -
|
||||
jiffies));
|
||||
#else
|
||||
printk(KERN_INFO "--- Going to %s %s\n", s1, s2);
|
||||
#endif
|
||||
else
|
||||
printk(KERN_INFO "--- Woke up (slept for %u.%03u ms)\n",
|
||||
us / 1000, us % 1000);
|
||||
|
||||
for (i = 0; i < reg_count; i++)
|
||||
printk(KERN_INFO "%-20s: 0x%08x\n", regs[i].name, regs[i].val);
|
||||
}
|
||||
|
||||
void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds)
|
||||
{
|
||||
u32 tick_rate, cycles;
|
||||
|
||||
if (!seconds && !milliseconds)
|
||||
return;
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer_wakeup));
|
||||
cycles = tick_rate * seconds + tick_rate * milliseconds / 1000;
|
||||
omap_dm_timer_stop(gptimer_wakeup);
|
||||
omap_dm_timer_set_load_start(gptimer_wakeup, 0, 0xffffffff - cycles);
|
||||
|
||||
pr_info("PM: Resume timer in %u.%03u secs"
|
||||
" (%d ticks at %d ticks/sec.)\n",
|
||||
seconds, milliseconds, cycles, tick_rate);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
static void pm_dbg_regset_store(u32 *ptr);
|
||||
|
||||
static struct dentry *pm_dbg_dir;
|
||||
|
||||
static int pm_dbg_init_done;
|
||||
|
||||
static int pm_dbg_init(void);
|
||||
@ -196,160 +53,6 @@ enum {
|
||||
DEBUG_FILE_TIMERS,
|
||||
};
|
||||
|
||||
struct pm_module_def {
|
||||
char name[8]; /* Name of the module */
|
||||
short type; /* CM or PRM */
|
||||
unsigned short offset;
|
||||
int low; /* First register address on this module */
|
||||
int high; /* Last register address on this module */
|
||||
};
|
||||
|
||||
#define MOD_CM 0
|
||||
#define MOD_PRM 1
|
||||
|
||||
static const struct pm_module_def *pm_dbg_reg_modules;
|
||||
static const struct pm_module_def omap3_pm_reg_modules[] = {
|
||||
{ "IVA2", MOD_CM, OMAP3430_IVA2_MOD, 0, 0x4c },
|
||||
{ "OCP", MOD_CM, OCP_MOD, 0, 0x10 },
|
||||
{ "MPU", MOD_CM, MPU_MOD, 4, 0x4c },
|
||||
{ "CORE", MOD_CM, CORE_MOD, 0, 0x4c },
|
||||
{ "SGX", MOD_CM, OMAP3430ES2_SGX_MOD, 0, 0x4c },
|
||||
{ "WKUP", MOD_CM, WKUP_MOD, 0, 0x40 },
|
||||
{ "CCR", MOD_CM, PLL_MOD, 0, 0x70 },
|
||||
{ "DSS", MOD_CM, OMAP3430_DSS_MOD, 0, 0x4c },
|
||||
{ "CAM", MOD_CM, OMAP3430_CAM_MOD, 0, 0x4c },
|
||||
{ "PER", MOD_CM, OMAP3430_PER_MOD, 0, 0x4c },
|
||||
{ "EMU", MOD_CM, OMAP3430_EMU_MOD, 0x40, 0x54 },
|
||||
{ "NEON", MOD_CM, OMAP3430_NEON_MOD, 0x20, 0x48 },
|
||||
{ "USB", MOD_CM, OMAP3430ES2_USBHOST_MOD, 0, 0x4c },
|
||||
|
||||
{ "IVA2", MOD_PRM, OMAP3430_IVA2_MOD, 0x50, 0xfc },
|
||||
{ "OCP", MOD_PRM, OCP_MOD, 4, 0x1c },
|
||||
{ "MPU", MOD_PRM, MPU_MOD, 0x58, 0xe8 },
|
||||
{ "CORE", MOD_PRM, CORE_MOD, 0x58, 0xf8 },
|
||||
{ "SGX", MOD_PRM, OMAP3430ES2_SGX_MOD, 0x58, 0xe8 },
|
||||
{ "WKUP", MOD_PRM, WKUP_MOD, 0xa0, 0xb0 },
|
||||
{ "CCR", MOD_PRM, PLL_MOD, 0x40, 0x70 },
|
||||
{ "DSS", MOD_PRM, OMAP3430_DSS_MOD, 0x58, 0xe8 },
|
||||
{ "CAM", MOD_PRM, OMAP3430_CAM_MOD, 0x58, 0xe8 },
|
||||
{ "PER", MOD_PRM, OMAP3430_PER_MOD, 0x58, 0xe8 },
|
||||
{ "EMU", MOD_PRM, OMAP3430_EMU_MOD, 0x58, 0xe4 },
|
||||
{ "GLBL", MOD_PRM, OMAP3430_GR_MOD, 0x20, 0xe4 },
|
||||
{ "NEON", MOD_PRM, OMAP3430_NEON_MOD, 0x58, 0xe8 },
|
||||
{ "USB", MOD_PRM, OMAP3430ES2_USBHOST_MOD, 0x58, 0xe8 },
|
||||
{ "", 0, 0, 0, 0 },
|
||||
};
|
||||
|
||||
#define PM_DBG_MAX_REG_SETS 4
|
||||
|
||||
static void *pm_dbg_reg_set[PM_DBG_MAX_REG_SETS];
|
||||
|
||||
static int pm_dbg_get_regset_size(void)
|
||||
{
|
||||
static int regset_size;
|
||||
|
||||
if (regset_size == 0) {
|
||||
int i = 0;
|
||||
|
||||
while (pm_dbg_reg_modules[i].name[0] != 0) {
|
||||
regset_size += pm_dbg_reg_modules[i].high +
|
||||
4 - pm_dbg_reg_modules[i].low;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
return regset_size;
|
||||
}
|
||||
|
||||
static int pm_dbg_show_regs(struct seq_file *s, void *unused)
|
||||
{
|
||||
int i, j;
|
||||
unsigned long val;
|
||||
int reg_set = (int)s->private;
|
||||
u32 *ptr;
|
||||
void *store = NULL;
|
||||
int regs;
|
||||
int linefeed;
|
||||
|
||||
if (reg_set == 0) {
|
||||
store = kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL);
|
||||
ptr = store;
|
||||
pm_dbg_regset_store(ptr);
|
||||
} else {
|
||||
ptr = pm_dbg_reg_set[reg_set - 1];
|
||||
}
|
||||
|
||||
i = 0;
|
||||
|
||||
while (pm_dbg_reg_modules[i].name[0] != 0) {
|
||||
regs = 0;
|
||||
linefeed = 0;
|
||||
if (pm_dbg_reg_modules[i].type == MOD_CM)
|
||||
seq_printf(s, "MOD: CM_%s (%08x)\n",
|
||||
pm_dbg_reg_modules[i].name,
|
||||
(u32)(OMAP3430_CM_BASE +
|
||||
pm_dbg_reg_modules[i].offset));
|
||||
else
|
||||
seq_printf(s, "MOD: PRM_%s (%08x)\n",
|
||||
pm_dbg_reg_modules[i].name,
|
||||
(u32)(OMAP3430_PRM_BASE +
|
||||
pm_dbg_reg_modules[i].offset));
|
||||
|
||||
for (j = pm_dbg_reg_modules[i].low;
|
||||
j <= pm_dbg_reg_modules[i].high; j += 4) {
|
||||
val = *(ptr++);
|
||||
if (val != 0) {
|
||||
regs++;
|
||||
if (linefeed) {
|
||||
seq_printf(s, "\n");
|
||||
linefeed = 0;
|
||||
}
|
||||
seq_printf(s, " %02x => %08lx", j, val);
|
||||
if (regs % 4 == 0)
|
||||
linefeed = 1;
|
||||
}
|
||||
}
|
||||
seq_printf(s, "\n");
|
||||
i++;
|
||||
}
|
||||
|
||||
if (store != NULL)
|
||||
kfree(store);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void pm_dbg_regset_store(u32 *ptr)
|
||||
{
|
||||
int i, j;
|
||||
u32 val;
|
||||
|
||||
i = 0;
|
||||
|
||||
while (pm_dbg_reg_modules[i].name[0] != 0) {
|
||||
for (j = pm_dbg_reg_modules[i].low;
|
||||
j <= pm_dbg_reg_modules[i].high; j += 4) {
|
||||
if (pm_dbg_reg_modules[i].type == MOD_CM)
|
||||
val = omap2_cm_read_mod_reg(
|
||||
pm_dbg_reg_modules[i].offset, j);
|
||||
else
|
||||
val = omap2_prm_read_mod_reg(
|
||||
pm_dbg_reg_modules[i].offset, j);
|
||||
*(ptr++) = val;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
int pm_dbg_regset_save(int reg_set)
|
||||
{
|
||||
if (pm_dbg_reg_set[reg_set-1] == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pm_dbg_regset_store(pm_dbg_reg_set[reg_set-1]);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char pwrdm_state_names[][PWRDM_MAX_PWRSTS] = {
|
||||
"OFF",
|
||||
"RET",
|
||||
@ -469,11 +172,6 @@ static int pm_dbg_open(struct inode *inode, struct file *file)
|
||||
};
|
||||
}
|
||||
|
||||
static int pm_dbg_reg_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, pm_dbg_show_regs, inode->i_private);
|
||||
}
|
||||
|
||||
static const struct file_operations debug_fops = {
|
||||
.open = pm_dbg_open,
|
||||
.read = seq_read,
|
||||
@ -481,40 +179,6 @@ static const struct file_operations debug_fops = {
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static const struct file_operations debug_reg_fops = {
|
||||
.open = pm_dbg_reg_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
int pm_dbg_regset_init(int reg_set)
|
||||
{
|
||||
char name[2];
|
||||
|
||||
if (!pm_dbg_init_done)
|
||||
pm_dbg_init();
|
||||
|
||||
if (reg_set < 1 || reg_set > PM_DBG_MAX_REG_SETS ||
|
||||
pm_dbg_reg_set[reg_set-1] != NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pm_dbg_reg_set[reg_set-1] =
|
||||
kmalloc(pm_dbg_get_regset_size(), GFP_KERNEL);
|
||||
|
||||
if (pm_dbg_reg_set[reg_set-1] == NULL)
|
||||
return -ENOMEM;
|
||||
|
||||
if (pm_dbg_dir != NULL) {
|
||||
sprintf(name, "%d", reg_set);
|
||||
|
||||
(void) debugfs_create_file(name, S_IRUGO,
|
||||
pm_dbg_dir, (void *)reg_set, &debug_reg_fops);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pwrdm_suspend_get(void *data, u64 *val)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
@ -576,9 +240,6 @@ static int option_set(void *data, u64 val)
|
||||
{
|
||||
u32 *option = data;
|
||||
|
||||
if (option == &wakeup_timer_milliseconds && val >= 1000)
|
||||
return -EINVAL;
|
||||
|
||||
*option = val;
|
||||
|
||||
if (option == &enable_off_mode) {
|
||||
@ -595,22 +256,13 @@ static int option_set(void *data, u64 val)
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(pm_dbg_option_fops, option_get, option_set, "%llu\n");
|
||||
|
||||
static int pm_dbg_init(void)
|
||||
static int __init pm_dbg_init(void)
|
||||
{
|
||||
int i;
|
||||
struct dentry *d;
|
||||
char name[2];
|
||||
|
||||
if (pm_dbg_init_done)
|
||||
return 0;
|
||||
|
||||
if (cpu_is_omap34xx())
|
||||
pm_dbg_reg_modules = omap3_pm_reg_modules;
|
||||
else {
|
||||
printk(KERN_ERR "%s: only OMAP3 supported\n", __func__);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
d = debugfs_create_dir("pm_debug", NULL);
|
||||
if (IS_ERR(d))
|
||||
return PTR_ERR(d);
|
||||
@ -622,30 +274,8 @@ static int pm_dbg_init(void)
|
||||
|
||||
pwrdm_for_each(pwrdms_setup, (void *)d);
|
||||
|
||||
pm_dbg_dir = debugfs_create_dir("registers", d);
|
||||
if (IS_ERR(pm_dbg_dir))
|
||||
return PTR_ERR(pm_dbg_dir);
|
||||
|
||||
(void) debugfs_create_file("current", S_IRUGO,
|
||||
pm_dbg_dir, (void *)0, &debug_reg_fops);
|
||||
|
||||
for (i = 0; i < PM_DBG_MAX_REG_SETS; i++)
|
||||
if (pm_dbg_reg_set[i] != NULL) {
|
||||
sprintf(name, "%d", i+1);
|
||||
(void) debugfs_create_file(name, S_IRUGO,
|
||||
pm_dbg_dir, (void *)(i+1), &debug_reg_fops);
|
||||
|
||||
}
|
||||
|
||||
(void) debugfs_create_file("enable_off_mode", S_IRUGO | S_IWUSR, d,
|
||||
&enable_off_mode, &pm_dbg_option_fops);
|
||||
(void) debugfs_create_file("sleep_while_idle", S_IRUGO | S_IWUSR, d,
|
||||
&sleep_while_idle, &pm_dbg_option_fops);
|
||||
(void) debugfs_create_file("wakeup_timer_seconds", S_IRUGO | S_IWUSR, d,
|
||||
&wakeup_timer_seconds, &pm_dbg_option_fops);
|
||||
(void) debugfs_create_file("wakeup_timer_milliseconds",
|
||||
S_IRUGO | S_IWUSR, d, &wakeup_timer_milliseconds,
|
||||
&pm_dbg_option_fops);
|
||||
pm_dbg_init_done = 1;
|
||||
|
||||
return 0;
|
||||
|
@ -60,32 +60,16 @@ inline void omap3_pm_init_cpuidle(struct cpuidle_params *cpuidle_board_params)
|
||||
extern int omap3_pm_get_suspend_state(struct powerdomain *pwrdm);
|
||||
extern int omap3_pm_set_suspend_state(struct powerdomain *pwrdm, int state);
|
||||
|
||||
extern u32 wakeup_timer_seconds;
|
||||
extern u32 wakeup_timer_milliseconds;
|
||||
extern struct omap_dm_timer *gptimer_wakeup;
|
||||
|
||||
#ifdef CONFIG_PM_DEBUG
|
||||
extern void omap2_pm_dump(int mode, int resume, unsigned int us);
|
||||
extern void omap2_pm_wakeup_on_timer(u32 seconds, u32 milliseconds);
|
||||
extern int omap2_pm_debug;
|
||||
extern u32 enable_off_mode;
|
||||
extern u32 sleep_while_idle;
|
||||
#else
|
||||
#define omap2_pm_dump(mode, resume, us) do {} while (0);
|
||||
#define omap2_pm_wakeup_on_timer(seconds, milliseconds) do {} while (0);
|
||||
#define omap2_pm_debug 0
|
||||
#define enable_off_mode 0
|
||||
#define sleep_while_idle 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PM_DEBUG) && defined(CONFIG_DEBUG_FS)
|
||||
extern void pm_dbg_update_time(struct powerdomain *pwrdm, int prev);
|
||||
extern int pm_dbg_regset_save(int reg_set);
|
||||
extern int pm_dbg_regset_init(int reg_set);
|
||||
#else
|
||||
#define pm_dbg_update_time(pwrdm, prev) do {} while (0);
|
||||
#define pm_dbg_regset_save(reg_set) do {} while (0);
|
||||
#define pm_dbg_regset_init(reg_set) do {} while (0);
|
||||
#endif /* CONFIG_PM_DEBUG */
|
||||
|
||||
extern void omap24xx_idle_loop_suspend(void);
|
||||
|
@ -53,6 +53,8 @@
|
||||
#include "powerdomain.h"
|
||||
#include "clockdomain.h"
|
||||
|
||||
static int omap2_pm_debug;
|
||||
|
||||
#ifdef CONFIG_SUSPEND
|
||||
static suspend_state_t suspend_state = PM_SUSPEND_ON;
|
||||
static inline bool is_suspending(void)
|
||||
@ -123,7 +125,6 @@ static void omap2_enter_full_retention(void)
|
||||
omap2_gpio_prepare_for_idle(0);
|
||||
|
||||
if (omap2_pm_debug) {
|
||||
omap2_pm_dump(0, 0, 0);
|
||||
getnstimeofday(&ts_preidle);
|
||||
}
|
||||
|
||||
@ -160,7 +161,6 @@ static void omap2_enter_full_retention(void)
|
||||
getnstimeofday(&ts_postidle);
|
||||
ts_idle = timespec_sub(ts_postidle, ts_preidle);
|
||||
tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC;
|
||||
omap2_pm_dump(0, 1, tmp);
|
||||
}
|
||||
omap2_gpio_resume_after_idle();
|
||||
|
||||
@ -247,7 +247,6 @@ static void omap2_enter_mpu_retention(void)
|
||||
}
|
||||
|
||||
if (omap2_pm_debug) {
|
||||
omap2_pm_dump(only_idle ? 2 : 1, 0, 0);
|
||||
getnstimeofday(&ts_preidle);
|
||||
}
|
||||
|
||||
@ -259,7 +258,6 @@ static void omap2_enter_mpu_retention(void)
|
||||
getnstimeofday(&ts_postidle);
|
||||
ts_idle = timespec_sub(ts_postidle, ts_preidle);
|
||||
tmp = timespec_to_ns(&ts_idle) * NSEC_PER_USEC;
|
||||
omap2_pm_dump(only_idle ? 2 : 1, 1, tmp);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -497,8 +497,6 @@ void omap_sram_idle(void)
|
||||
|
||||
int omap3_can_sleep(void)
|
||||
{
|
||||
if (!sleep_while_idle)
|
||||
return 0;
|
||||
if (!omap_uart_can_sleep())
|
||||
return 0;
|
||||
return 1;
|
||||
@ -534,10 +532,6 @@ static int omap3_pm_suspend(void)
|
||||
struct power_state *pwrst;
|
||||
int state, ret = 0;
|
||||
|
||||
if (wakeup_timer_seconds || wakeup_timer_milliseconds)
|
||||
omap2_pm_wakeup_on_timer(wakeup_timer_seconds,
|
||||
wakeup_timer_milliseconds);
|
||||
|
||||
/* Read current next_pwrsts */
|
||||
list_for_each_entry(pwrst, &pwrst_list, node)
|
||||
pwrst->saved_state = pwrdm_read_next_pwrst(pwrst->pwrdm);
|
||||
|
@ -143,7 +143,7 @@ static irqreturn_t sr_interrupt(int irq, void *data)
|
||||
sr_write_reg(sr_info, IRQSTATUS, status);
|
||||
}
|
||||
|
||||
if (sr_class->class_type == SR_CLASS2 && sr_class->notify)
|
||||
if (sr_class->notify)
|
||||
sr_class->notify(sr_info->voltdm, status);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@ -258,9 +258,7 @@ static int sr_late_init(struct omap_sr *sr_info)
|
||||
struct resource *mem;
|
||||
int ret = 0;
|
||||
|
||||
if (sr_class->class_type == SR_CLASS2 &&
|
||||
sr_class->notify_flags && sr_info->irq) {
|
||||
|
||||
if (sr_class->notify && sr_class->notify_flags && sr_info->irq) {
|
||||
name = kasprintf(GFP_KERNEL, "sr_%s", sr_info->voltdm->name);
|
||||
if (name == NULL) {
|
||||
ret = -ENOMEM;
|
||||
@ -270,6 +268,7 @@ static int sr_late_init(struct omap_sr *sr_info)
|
||||
0, name, (void *)sr_info);
|
||||
if (ret)
|
||||
goto error;
|
||||
disable_irq(sr_info->irq);
|
||||
}
|
||||
|
||||
if (pdata && pdata->enable_on_init)
|
||||
@ -278,16 +277,16 @@ static int sr_late_init(struct omap_sr *sr_info)
|
||||
return ret;
|
||||
|
||||
error:
|
||||
iounmap(sr_info->base);
|
||||
mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
list_del(&sr_info->node);
|
||||
dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
|
||||
"interrupt handler. Smartreflex will"
|
||||
"not function as desired\n", __func__);
|
||||
kfree(name);
|
||||
kfree(sr_info);
|
||||
return ret;
|
||||
iounmap(sr_info->base);
|
||||
mem = platform_get_resource(sr_info->pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(mem->start, resource_size(mem));
|
||||
list_del(&sr_info->node);
|
||||
dev_err(&sr_info->pdev->dev, "%s: ERROR in registering"
|
||||
"interrupt handler. Smartreflex will"
|
||||
"not function as desired\n", __func__);
|
||||
kfree(name);
|
||||
kfree(sr_info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void sr_v1_disable(struct omap_sr *sr)
|
||||
@ -808,10 +807,13 @@ static int omap_sr_autocomp_store(void *data, u64 val)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!val)
|
||||
sr_stop_vddautocomp(sr_info);
|
||||
else
|
||||
sr_start_vddautocomp(sr_info);
|
||||
/* control enable/disable only if there is a delta in value */
|
||||
if (sr_info->autocomp_active != val) {
|
||||
if (!val)
|
||||
sr_stop_vddautocomp(sr_info);
|
||||
else
|
||||
sr_start_vddautocomp(sr_info);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,266 +0,0 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/timer-gp.c
|
||||
*
|
||||
* OMAP2 GP timer support.
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation
|
||||
*
|
||||
* Update to use new clocksource/clockevent layers
|
||||
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
|
||||
* Copyright (C) 2007 MontaVista Software, Inc.
|
||||
*
|
||||
* Original driver:
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Author: Paul Mundt <paul.mundt@nokia.com>
|
||||
* Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
* OMAP Dual-mode timer framework support by Timo Teras
|
||||
*
|
||||
* Some parts based off of TI's 24xx code:
|
||||
*
|
||||
* Copyright (C) 2004-2009 Texas Instruments, Inc.
|
||||
*
|
||||
* Roughly modelled after the OMAP1 MPU timer code.
|
||||
* Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <plat/dmtimer.h>
|
||||
#include <asm/localtimer.h>
|
||||
#include <asm/sched_clock.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
|
||||
#include "timer-gp.h"
|
||||
|
||||
|
||||
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
|
||||
#define MAX_GPTIMER_ID 12
|
||||
|
||||
static struct omap_dm_timer *gptimer;
|
||||
static struct clock_event_device clockevent_gpt;
|
||||
static u8 __initdata gptimer_id = 1;
|
||||
static u8 __initdata inited;
|
||||
struct omap_dm_timer *gptimer_wakeup;
|
||||
|
||||
static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct omap_dm_timer *gpt = (struct omap_dm_timer *)dev_id;
|
||||
struct clock_event_device *evt = &clockevent_gpt;
|
||||
|
||||
omap_dm_timer_write_status(gpt, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction omap2_gp_timer_irq = {
|
||||
.name = "gp timer",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = omap2_gp_timer_interrupt,
|
||||
};
|
||||
|
||||
static int omap2_gp_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
omap_dm_timer_set_load_start(gptimer, 0, 0xffffffff - cycles);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 period;
|
||||
|
||||
omap_dm_timer_stop(gptimer);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
period = clk_get_rate(omap_dm_timer_get_fclk(gptimer)) / HZ;
|
||||
period -= 1;
|
||||
omap_dm_timer_set_load_start(gptimer, 1, 0xffffffff - period);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device clockevent_gpt = {
|
||||
.name = "gp timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap2_gp_timer_set_next_event,
|
||||
.set_mode = omap2_gp_timer_set_mode,
|
||||
};
|
||||
|
||||
/**
|
||||
* omap2_gp_clockevent_set_gptimer - set which GPTIMER is used for clockevents
|
||||
* @id: GPTIMER to use (1..MAX_GPTIMER_ID)
|
||||
*
|
||||
* Define the GPTIMER that the system should use for the tick timer.
|
||||
* Meant to be called from board-*.c files in the event that GPTIMER1, the
|
||||
* default, is unsuitable. Returns -EINVAL on error or 0 on success.
|
||||
*/
|
||||
int __init omap2_gp_clockevent_set_gptimer(u8 id)
|
||||
{
|
||||
if (id < 1 || id > MAX_GPTIMER_ID)
|
||||
return -EINVAL;
|
||||
|
||||
BUG_ON(inited);
|
||||
|
||||
gptimer_id = id;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init omap2_gp_clockevent_init(void)
|
||||
{
|
||||
u32 tick_rate;
|
||||
int src;
|
||||
char clockevent_hwmod_name[8]; /* 8 = sizeof("timerXX0") */
|
||||
|
||||
inited = 1;
|
||||
|
||||
sprintf(clockevent_hwmod_name, "timer%d", gptimer_id);
|
||||
omap_hwmod_setup_one(clockevent_hwmod_name);
|
||||
|
||||
gptimer = omap_dm_timer_request_specific(gptimer_id);
|
||||
BUG_ON(gptimer == NULL);
|
||||
gptimer_wakeup = gptimer;
|
||||
|
||||
#if defined(CONFIG_OMAP_32K_TIMER)
|
||||
src = OMAP_TIMER_SRC_32_KHZ;
|
||||
#else
|
||||
src = OMAP_TIMER_SRC_SYS_CLK;
|
||||
WARN(gptimer_id == 12, "WARNING: GPTIMER12 can only use the "
|
||||
"secure 32KiHz clock source\n");
|
||||
#endif
|
||||
|
||||
if (gptimer_id != 12)
|
||||
WARN(IS_ERR_VALUE(omap_dm_timer_set_source(gptimer, src)),
|
||||
"timer-gp: omap_dm_timer_set_source() failed\n");
|
||||
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gptimer));
|
||||
|
||||
pr_info("OMAP clockevent source: GPTIMER%d at %u Hz\n",
|
||||
gptimer_id, tick_rate);
|
||||
|
||||
omap2_gp_timer_irq.dev_id = (void *)gptimer;
|
||||
setup_irq(omap_dm_timer_get_irq(gptimer), &omap2_gp_timer_irq);
|
||||
omap_dm_timer_set_int_enable(gptimer, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
clockevent_gpt.mult = div_sc(tick_rate, NSEC_PER_SEC,
|
||||
clockevent_gpt.shift);
|
||||
clockevent_gpt.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
||||
clockevent_gpt.min_delta_ns =
|
||||
clockevent_delta2ns(3, &clockevent_gpt);
|
||||
/* Timer internal resynch latency. */
|
||||
|
||||
clockevent_gpt.cpumask = cpumask_of(0);
|
||||
clockevents_register_device(&clockevent_gpt);
|
||||
}
|
||||
|
||||
/* Clocksource code */
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
/*
|
||||
* When 32k-timer is enabled, don't use GPTimer for clocksource
|
||||
* instead, just leave default clocksource which uses the 32k
|
||||
* sync counter. See clocksource setup in plat-omap/counter_32k.c
|
||||
*/
|
||||
|
||||
static void __init omap2_gp_clocksource_init(void)
|
||||
{
|
||||
omap_init_clocksource_32k();
|
||||
}
|
||||
|
||||
#else
|
||||
/*
|
||||
* clocksource
|
||||
*/
|
||||
static DEFINE_CLOCK_DATA(cd);
|
||||
static struct omap_dm_timer *gpt_clocksource;
|
||||
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
||||
{
|
||||
return (cycle_t)omap_dm_timer_read_counter(gpt_clocksource);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_gpt = {
|
||||
.name = "gp timer",
|
||||
.rating = 300,
|
||||
.read = clocksource_read_cycles,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static void notrace dmtimer_update_sched_clock(void)
|
||||
{
|
||||
u32 cyc;
|
||||
|
||||
cyc = omap_dm_timer_read_counter(gpt_clocksource);
|
||||
|
||||
update_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
|
||||
/* Setup free-running counter for clocksource */
|
||||
static void __init omap2_gp_clocksource_init(void)
|
||||
{
|
||||
static struct omap_dm_timer *gpt;
|
||||
u32 tick_rate;
|
||||
static char err1[] __initdata = KERN_ERR
|
||||
"%s: failed to request dm-timer\n";
|
||||
static char err2[] __initdata = KERN_ERR
|
||||
"%s: can't register clocksource!\n";
|
||||
|
||||
gpt = omap_dm_timer_request();
|
||||
if (!gpt)
|
||||
printk(err1, clocksource_gpt.name);
|
||||
gpt_clocksource = gpt;
|
||||
|
||||
omap_dm_timer_set_source(gpt, OMAP_TIMER_SRC_SYS_CLK);
|
||||
tick_rate = clk_get_rate(omap_dm_timer_get_fclk(gpt));
|
||||
|
||||
omap_dm_timer_set_load_start(gpt, 1, 0);
|
||||
|
||||
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, tick_rate);
|
||||
|
||||
if (clocksource_register_hz(&clocksource_gpt, tick_rate))
|
||||
printk(err2, clocksource_gpt.name);
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init omap2_gp_timer_init(void)
|
||||
{
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
if (cpu_is_omap44xx()) {
|
||||
twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
|
||||
BUG_ON(!twd_base);
|
||||
}
|
||||
#endif
|
||||
omap_dm_timer_init();
|
||||
|
||||
omap2_gp_clockevent_init();
|
||||
omap2_gp_clocksource_init();
|
||||
}
|
||||
|
||||
struct sys_timer omap_timer = {
|
||||
.init = omap2_gp_timer_init,
|
||||
};
|
@ -1,16 +0,0 @@
|
||||
/*
|
||||
* OMAP2/3 GPTIMER support.headers
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H
|
||||
#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_TIMER_GP_H
|
||||
|
||||
extern int __init omap2_gp_clockevent_set_gptimer(u8 id);
|
||||
|
||||
#endif
|
342
arch/arm/mach-omap2/timer.c
Normal file
342
arch/arm/mach-omap2/timer.c
Normal file
@ -0,0 +1,342 @@
|
||||
/*
|
||||
* linux/arch/arm/mach-omap2/timer.c
|
||||
*
|
||||
* OMAP2 GP timer support.
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation
|
||||
*
|
||||
* Update to use new clocksource/clockevent layers
|
||||
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
|
||||
* Copyright (C) 2007 MontaVista Software, Inc.
|
||||
*
|
||||
* Original driver:
|
||||
* Copyright (C) 2005 Nokia Corporation
|
||||
* Author: Paul Mundt <paul.mundt@nokia.com>
|
||||
* Juha Yrjölä <juha.yrjola@nokia.com>
|
||||
* OMAP Dual-mode timer framework support by Timo Teras
|
||||
*
|
||||
* Some parts based off of TI's 24xx code:
|
||||
*
|
||||
* Copyright (C) 2004-2009 Texas Instruments, Inc.
|
||||
*
|
||||
* Roughly modelled after the OMAP1 MPU timer code.
|
||||
* Added OMAP4 support - Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
* for more details.
|
||||
*/
|
||||
#include <linux/init.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <plat/dmtimer.h>
|
||||
#include <asm/localtimer.h>
|
||||
#include <asm/sched_clock.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
|
||||
/* Parent clocks, eventually these will come from the clock framework */
|
||||
|
||||
#define OMAP2_MPU_SOURCE "sys_ck"
|
||||
#define OMAP3_MPU_SOURCE OMAP2_MPU_SOURCE
|
||||
#define OMAP4_MPU_SOURCE "sys_clkin_ck"
|
||||
#define OMAP2_32K_SOURCE "func_32k_ck"
|
||||
#define OMAP3_32K_SOURCE "omap_32k_fck"
|
||||
#define OMAP4_32K_SOURCE "sys_32k_ck"
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
#define OMAP2_CLKEV_SOURCE OMAP2_32K_SOURCE
|
||||
#define OMAP3_CLKEV_SOURCE OMAP3_32K_SOURCE
|
||||
#define OMAP4_CLKEV_SOURCE OMAP4_32K_SOURCE
|
||||
#define OMAP3_SECURE_TIMER 12
|
||||
#else
|
||||
#define OMAP2_CLKEV_SOURCE OMAP2_MPU_SOURCE
|
||||
#define OMAP3_CLKEV_SOURCE OMAP3_MPU_SOURCE
|
||||
#define OMAP4_CLKEV_SOURCE OMAP4_MPU_SOURCE
|
||||
#define OMAP3_SECURE_TIMER 1
|
||||
#endif
|
||||
|
||||
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
|
||||
#define MAX_GPTIMER_ID 12
|
||||
|
||||
u32 sys_timer_reserved;
|
||||
|
||||
/* Clockevent code */
|
||||
|
||||
static struct omap_dm_timer clkev;
|
||||
static struct clock_event_device clockevent_gpt;
|
||||
|
||||
static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = &clockevent_gpt;
|
||||
|
||||
__omap_dm_timer_write_status(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static struct irqaction omap2_gp_timer_irq = {
|
||||
.name = "gp timer",
|
||||
.flags = IRQF_DISABLED | IRQF_TIMER | IRQF_IRQPOLL,
|
||||
.handler = omap2_gp_timer_interrupt,
|
||||
};
|
||||
|
||||
static int omap2_gp_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
__omap_dm_timer_load_start(clkev.io_base, OMAP_TIMER_CTRL_ST,
|
||||
0xffffffff - cycles, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
u32 period;
|
||||
|
||||
__omap_dm_timer_stop(clkev.io_base, 1, clkev.rate);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
period = clkev.rate / HZ;
|
||||
period -= 1;
|
||||
/* Looks like we need to first set the load value separately */
|
||||
__omap_dm_timer_write(clkev.io_base, OMAP_TIMER_LOAD_REG,
|
||||
0xffffffff - period, 1);
|
||||
__omap_dm_timer_load_start(clkev.io_base,
|
||||
OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST,
|
||||
0xffffffff - period, 1);
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
break;
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_RESUME:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static struct clock_event_device clockevent_gpt = {
|
||||
.name = "gp timer",
|
||||
.features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT,
|
||||
.shift = 32,
|
||||
.set_next_event = omap2_gp_timer_set_next_event,
|
||||
.set_mode = omap2_gp_timer_set_mode,
|
||||
};
|
||||
|
||||
static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
|
||||
int gptimer_id,
|
||||
const char *fck_source)
|
||||
{
|
||||
char name[10]; /* 10 = sizeof("gptXX_Xck0") */
|
||||
struct omap_hwmod *oh;
|
||||
size_t size;
|
||||
int res = 0;
|
||||
|
||||
sprintf(name, "timer%d", gptimer_id);
|
||||
omap_hwmod_setup_one(name);
|
||||
oh = omap_hwmod_lookup(name);
|
||||
if (!oh)
|
||||
return -ENODEV;
|
||||
|
||||
timer->irq = oh->mpu_irqs[0].irq;
|
||||
timer->phys_base = oh->slaves[0]->addr->pa_start;
|
||||
size = oh->slaves[0]->addr->pa_end - timer->phys_base;
|
||||
|
||||
/* Static mapping, never released */
|
||||
timer->io_base = ioremap(timer->phys_base, size);
|
||||
if (!timer->io_base)
|
||||
return -ENXIO;
|
||||
|
||||
/* After the dmtimer is using hwmod these clocks won't be needed */
|
||||
sprintf(name, "gpt%d_fck", gptimer_id);
|
||||
timer->fclk = clk_get(NULL, name);
|
||||
if (IS_ERR(timer->fclk))
|
||||
return -ENODEV;
|
||||
|
||||
sprintf(name, "gpt%d_ick", gptimer_id);
|
||||
timer->iclk = clk_get(NULL, name);
|
||||
if (IS_ERR(timer->iclk)) {
|
||||
clk_put(timer->fclk);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
omap_hwmod_enable(oh);
|
||||
|
||||
sys_timer_reserved |= (1 << (gptimer_id - 1));
|
||||
|
||||
if (gptimer_id != 12) {
|
||||
struct clk *src;
|
||||
|
||||
src = clk_get(NULL, fck_source);
|
||||
if (IS_ERR(src)) {
|
||||
res = -EINVAL;
|
||||
} else {
|
||||
res = __omap_dm_timer_set_source(timer->fclk, src);
|
||||
if (IS_ERR_VALUE(res))
|
||||
pr_warning("%s: timer%i cannot set source\n",
|
||||
__func__, gptimer_id);
|
||||
clk_put(src);
|
||||
}
|
||||
}
|
||||
__omap_dm_timer_reset(timer->io_base, 1, 1);
|
||||
timer->posted = 1;
|
||||
|
||||
timer->rate = clk_get_rate(timer->fclk);
|
||||
|
||||
timer->reserved = 1;
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static void __init omap2_gp_clockevent_init(int gptimer_id,
|
||||
const char *fck_source)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = omap_dm_timer_init_one(&clkev, gptimer_id, fck_source);
|
||||
BUG_ON(res);
|
||||
|
||||
omap2_gp_timer_irq.dev_id = (void *)&clkev;
|
||||
setup_irq(clkev.irq, &omap2_gp_timer_irq);
|
||||
|
||||
__omap_dm_timer_int_enable(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC,
|
||||
clockevent_gpt.shift);
|
||||
clockevent_gpt.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &clockevent_gpt);
|
||||
clockevent_gpt.min_delta_ns =
|
||||
clockevent_delta2ns(3, &clockevent_gpt);
|
||||
/* Timer internal resynch latency. */
|
||||
|
||||
clockevent_gpt.cpumask = cpumask_of(0);
|
||||
clockevents_register_device(&clockevent_gpt);
|
||||
|
||||
pr_info("OMAP clockevent source: GPTIMER%d at %lu Hz\n",
|
||||
gptimer_id, clkev.rate);
|
||||
}
|
||||
|
||||
/* Clocksource code */
|
||||
|
||||
#ifdef CONFIG_OMAP_32K_TIMER
|
||||
/*
|
||||
* When 32k-timer is enabled, don't use GPTimer for clocksource
|
||||
* instead, just leave default clocksource which uses the 32k
|
||||
* sync counter. See clocksource setup in plat-omap/counter_32k.c
|
||||
*/
|
||||
|
||||
static void __init omap2_gp_clocksource_init(int unused, const char *dummy)
|
||||
{
|
||||
omap_init_clocksource_32k();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static struct omap_dm_timer clksrc;
|
||||
|
||||
/*
|
||||
* clocksource
|
||||
*/
|
||||
static DEFINE_CLOCK_DATA(cd);
|
||||
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
||||
{
|
||||
return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_gpt = {
|
||||
.name = "gp timer",
|
||||
.rating = 300,
|
||||
.read = clocksource_read_cycles,
|
||||
.mask = CLOCKSOURCE_MASK(32),
|
||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||
};
|
||||
|
||||
static void notrace dmtimer_update_sched_clock(void)
|
||||
{
|
||||
u32 cyc;
|
||||
|
||||
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
|
||||
update_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
|
||||
unsigned long long notrace sched_clock(void)
|
||||
{
|
||||
u32 cyc = 0;
|
||||
|
||||
if (clksrc.reserved)
|
||||
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
|
||||
return cyc_to_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
|
||||
/* Setup free-running counter for clocksource */
|
||||
static void __init omap2_gp_clocksource_init(int gptimer_id,
|
||||
const char *fck_source)
|
||||
{
|
||||
int res;
|
||||
|
||||
res = omap_dm_timer_init_one(&clksrc, gptimer_id, fck_source);
|
||||
BUG_ON(res);
|
||||
|
||||
pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n",
|
||||
gptimer_id, clksrc.rate);
|
||||
|
||||
__omap_dm_timer_load_start(clksrc.io_base, OMAP_TIMER_CTRL_ST, 0, 1);
|
||||
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate);
|
||||
|
||||
if (clocksource_register_hz(&clocksource_gpt, clksrc.rate))
|
||||
pr_err("Could not register clocksource %s\n",
|
||||
clocksource_gpt.name);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define OMAP_SYS_TIMER_INIT(name, clkev_nr, clkev_src, \
|
||||
clksrc_nr, clksrc_src) \
|
||||
static void __init omap##name##_timer_init(void) \
|
||||
{ \
|
||||
omap2_gp_clockevent_init((clkev_nr), clkev_src); \
|
||||
omap2_gp_clocksource_init((clksrc_nr), clksrc_src); \
|
||||
}
|
||||
|
||||
#define OMAP_SYS_TIMER(name) \
|
||||
struct sys_timer omap##name##_timer = { \
|
||||
.init = omap##name##_timer_init, \
|
||||
};
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP2
|
||||
OMAP_SYS_TIMER_INIT(2, 1, OMAP2_CLKEV_SOURCE, 2, OMAP2_MPU_SOURCE)
|
||||
OMAP_SYS_TIMER(2)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
OMAP_SYS_TIMER_INIT(3, 1, OMAP3_CLKEV_SOURCE, 2, OMAP3_MPU_SOURCE)
|
||||
OMAP_SYS_TIMER(3)
|
||||
OMAP_SYS_TIMER_INIT(3_secure, OMAP3_SECURE_TIMER, OMAP3_CLKEV_SOURCE,
|
||||
2, OMAP3_MPU_SOURCE)
|
||||
OMAP_SYS_TIMER(3_secure)
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP4
|
||||
static void __init omap4_timer_init(void)
|
||||
{
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_256);
|
||||
BUG_ON(!twd_base);
|
||||
#endif
|
||||
omap2_gp_clockevent_init(1, OMAP4_CLKEV_SOURCE);
|
||||
omap2_gp_clocksource_init(2, OMAP4_MPU_SOURCE);
|
||||
}
|
||||
OMAP_SYS_TIMER(4)
|
||||
#endif
|
304
arch/arm/mach-omap2/twl-common.c
Normal file
304
arch/arm/mach-omap2/twl-common.c
Normal file
@ -0,0 +1,304 @@
|
||||
/*
|
||||
* twl-common.c
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments, Inc..
|
||||
* Author: Peter Ujfalusi <peter.ujfalusi@ti.com>
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||||
* 02110-1301 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/i2c/twl.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/regulator/machine.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/usb.h>
|
||||
|
||||
#include "twl-common.h"
|
||||
|
||||
static struct i2c_board_info __initdata pmic_i2c_board_info = {
|
||||
.addr = 0x48,
|
||||
.flags = I2C_CLIENT_WAKE,
|
||||
};
|
||||
|
||||
void __init omap_pmic_init(int bus, u32 clkrate,
|
||||
const char *pmic_type, int pmic_irq,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
strncpy(pmic_i2c_board_info.type, pmic_type,
|
||||
sizeof(pmic_i2c_board_info.type));
|
||||
pmic_i2c_board_info.irq = pmic_irq;
|
||||
pmic_i2c_board_info.platform_data = pmic_data;
|
||||
|
||||
omap_register_i2c_bus(bus, clkrate, &pmic_i2c_board_info, 1);
|
||||
}
|
||||
|
||||
static struct twl4030_usb_data omap4_usb_pdata = {
|
||||
.phy_init = omap4430_phy_init,
|
||||
.phy_exit = omap4430_phy_exit,
|
||||
.phy_power = omap4430_phy_power,
|
||||
.phy_set_clock = omap4430_phy_set_clk,
|
||||
.phy_suspend = omap4430_phy_suspend,
|
||||
};
|
||||
|
||||
static struct twl4030_usb_data omap3_usb_pdata = {
|
||||
.usb_mode = T2_USB_MODE_ULPI,
|
||||
};
|
||||
|
||||
static int omap3_batt_table[] = {
|
||||
/* 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
|
||||
};
|
||||
|
||||
static struct twl4030_bci_platform_data omap3_bci_pdata = {
|
||||
.battery_tmp_tbl = omap3_batt_table,
|
||||
.tblsize = ARRAY_SIZE(omap3_batt_table),
|
||||
};
|
||||
|
||||
static struct twl4030_madc_platform_data omap3_madc_pdata = {
|
||||
.irq_line = 1,
|
||||
};
|
||||
|
||||
static struct twl4030_codec_audio_data omap3_audio;
|
||||
|
||||
static struct twl4030_codec_data omap3_codec_pdata = {
|
||||
.audio_mclk = 26000000,
|
||||
.audio = &omap3_audio,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3_vdda_dac_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdda_dac", "omapdss_venc"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap3_vdac_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3_vdda_dac_supplies),
|
||||
.consumer_supplies = omap3_vdda_dac_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap3_vpll2_supplies[] = {
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss"),
|
||||
REGULATOR_SUPPLY("vdds_dsi", "omapdss_dsi1"),
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap3_vpll2_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap3_vpll2_supplies),
|
||||
.consumer_supplies = omap3_vpll2_supplies,
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vdac_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vaux2_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 2800000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vaux3_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1000000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_consumer_supply omap4_vmmc_supply[] = {
|
||||
REGULATOR_SUPPLY("vmmc", "omap_hsmmc.0"),
|
||||
};
|
||||
|
||||
/* VMMC1 for MMC1 card */
|
||||
static struct regulator_init_data omap4_vmmc_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1200000,
|
||||
.max_uV = 3000000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
.num_consumer_supplies = ARRAY_SIZE(omap4_vmmc_supply),
|
||||
.consumer_supplies = omap4_vmmc_supply,
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vpp_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 2500000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_VOLTAGE
|
||||
| REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vana_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 2100000,
|
||||
.max_uV = 2100000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vcxio_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 1800000,
|
||||
.max_uV = 1800000,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_vusb_idata = {
|
||||
.constraints = {
|
||||
.min_uV = 3300000,
|
||||
.max_uV = 3300000,
|
||||
.apply_uV = true,
|
||||
.valid_modes_mask = REGULATOR_MODE_NORMAL
|
||||
| REGULATOR_MODE_STANDBY,
|
||||
.valid_ops_mask = REGULATOR_CHANGE_MODE
|
||||
| REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
static struct regulator_init_data omap4_clk32kg_idata = {
|
||||
.constraints = {
|
||||
.valid_ops_mask = REGULATOR_CHANGE_STATUS,
|
||||
},
|
||||
};
|
||||
|
||||
void __init omap4_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
u32 pdata_flags, u32 regulators_flags)
|
||||
{
|
||||
if (!pmic_data->irq_base)
|
||||
pmic_data->irq_base = TWL6030_IRQ_BASE;
|
||||
if (!pmic_data->irq_end)
|
||||
pmic_data->irq_end = TWL6030_IRQ_END;
|
||||
|
||||
/* Common platform data configurations */
|
||||
if (pdata_flags & TWL_COMMON_PDATA_USB && !pmic_data->usb)
|
||||
pmic_data->usb = &omap4_usb_pdata;
|
||||
|
||||
/* Common regulator configurations */
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac)
|
||||
pmic_data->vdac = &omap4_vdac_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VAUX2 && !pmic_data->vaux2)
|
||||
pmic_data->vaux2 = &omap4_vaux2_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VAUX3 && !pmic_data->vaux3)
|
||||
pmic_data->vaux3 = &omap4_vaux3_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VMMC && !pmic_data->vmmc)
|
||||
pmic_data->vmmc = &omap4_vmmc_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VPP && !pmic_data->vpp)
|
||||
pmic_data->vpp = &omap4_vpp_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VANA && !pmic_data->vana)
|
||||
pmic_data->vana = &omap4_vana_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VCXIO && !pmic_data->vcxio)
|
||||
pmic_data->vcxio = &omap4_vcxio_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VUSB && !pmic_data->vusb)
|
||||
pmic_data->vusb = &omap4_vusb_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_CLK32KG &&
|
||||
!pmic_data->clk32kg)
|
||||
pmic_data->clk32kg = &omap4_clk32kg_idata;
|
||||
}
|
||||
|
||||
void __init omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
u32 pdata_flags, u32 regulators_flags)
|
||||
{
|
||||
if (!pmic_data->irq_base)
|
||||
pmic_data->irq_base = TWL4030_IRQ_BASE;
|
||||
if (!pmic_data->irq_end)
|
||||
pmic_data->irq_end = TWL4030_IRQ_END;
|
||||
|
||||
/* Common platform data configurations */
|
||||
if (pdata_flags & TWL_COMMON_PDATA_USB && !pmic_data->usb)
|
||||
pmic_data->usb = &omap3_usb_pdata;
|
||||
|
||||
if (pdata_flags & TWL_COMMON_PDATA_BCI && !pmic_data->bci)
|
||||
pmic_data->bci = &omap3_bci_pdata;
|
||||
|
||||
if (pdata_flags & TWL_COMMON_PDATA_MADC && !pmic_data->madc)
|
||||
pmic_data->madc = &omap3_madc_pdata;
|
||||
|
||||
if (pdata_flags & TWL_COMMON_PDATA_AUDIO && !pmic_data->codec)
|
||||
pmic_data->codec = &omap3_codec_pdata;
|
||||
|
||||
/* Common regulator configurations */
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VDAC && !pmic_data->vdac)
|
||||
pmic_data->vdac = &omap3_vdac_idata;
|
||||
|
||||
if (regulators_flags & TWL_COMMON_REGULATOR_VPLL2 && !pmic_data->vpll2)
|
||||
pmic_data->vpll2 = &omap3_vpll2_idata;
|
||||
}
|
59
arch/arm/mach-omap2/twl-common.h
Normal file
59
arch/arm/mach-omap2/twl-common.h
Normal file
@ -0,0 +1,59 @@
|
||||
#ifndef __OMAP_PMIC_COMMON__
|
||||
#define __OMAP_PMIC_COMMON__
|
||||
|
||||
#define TWL_COMMON_PDATA_USB (1 << 0)
|
||||
#define TWL_COMMON_PDATA_BCI (1 << 1)
|
||||
#define TWL_COMMON_PDATA_MADC (1 << 2)
|
||||
#define TWL_COMMON_PDATA_AUDIO (1 << 3)
|
||||
|
||||
/* Common LDO regulators for TWL4030/TWL6030 */
|
||||
#define TWL_COMMON_REGULATOR_VDAC (1 << 0)
|
||||
#define TWL_COMMON_REGULATOR_VAUX1 (1 << 1)
|
||||
#define TWL_COMMON_REGULATOR_VAUX2 (1 << 2)
|
||||
#define TWL_COMMON_REGULATOR_VAUX3 (1 << 3)
|
||||
|
||||
/* TWL6030 LDO regulators */
|
||||
#define TWL_COMMON_REGULATOR_VMMC (1 << 4)
|
||||
#define TWL_COMMON_REGULATOR_VPP (1 << 5)
|
||||
#define TWL_COMMON_REGULATOR_VUSIM (1 << 6)
|
||||
#define TWL_COMMON_REGULATOR_VANA (1 << 7)
|
||||
#define TWL_COMMON_REGULATOR_VCXIO (1 << 8)
|
||||
#define TWL_COMMON_REGULATOR_VUSB (1 << 9)
|
||||
#define TWL_COMMON_REGULATOR_CLK32KG (1 << 10)
|
||||
|
||||
/* TWL4030 LDO regulators */
|
||||
#define TWL_COMMON_REGULATOR_VPLL1 (1 << 4)
|
||||
#define TWL_COMMON_REGULATOR_VPLL2 (1 << 5)
|
||||
|
||||
|
||||
struct twl4030_platform_data;
|
||||
|
||||
void omap_pmic_init(int bus, u32 clkrate, const char *pmic_type, int pmic_irq,
|
||||
struct twl4030_platform_data *pmic_data);
|
||||
|
||||
static inline void omap2_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
omap_pmic_init(2, 2600, pmic_type, INT_24XX_SYS_NIRQ, pmic_data);
|
||||
}
|
||||
|
||||
static inline void omap3_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
omap_pmic_init(1, 2600, pmic_type, INT_34XX_SYS_NIRQ, pmic_data);
|
||||
}
|
||||
|
||||
static inline void omap4_pmic_init(const char *pmic_type,
|
||||
struct twl4030_platform_data *pmic_data)
|
||||
{
|
||||
/* Phoenix Audio IC needs I2C1 to start with 400 KHz or less */
|
||||
omap_pmic_init(1, 400, pmic_type, OMAP44XX_IRQ_SYS_1N, pmic_data);
|
||||
}
|
||||
|
||||
void omap3_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
u32 pdata_flags, u32 regulators_flags);
|
||||
|
||||
void omap4_pmic_get_config(struct twl4030_platform_data *pmic_data,
|
||||
u32 pdata_flags, u32 regulators_flags);
|
||||
|
||||
#endif /* __OMAP_PMIC_COMMON__ */
|
@ -126,7 +126,7 @@ static inline unsigned long long notrace _omap_32k_sched_clock(void)
|
||||
return cyc_to_fixed_sched_clock(&cd, cyc, (u32)~0, SC_MULT, SC_SHIFT);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_OMAP_MPU_TIMER
|
||||
#if defined(CONFIG_OMAP_32K_TIMER) && !defined(CONFIG_OMAP_MPU_TIMER)
|
||||
unsigned long long notrace sched_clock(void)
|
||||
{
|
||||
return _omap_32k_sched_clock();
|
||||
|
@ -41,127 +41,6 @@
|
||||
#include <plat/dmtimer.h>
|
||||
#include <mach/irqs.h>
|
||||
|
||||
/* register offsets */
|
||||
#define _OMAP_TIMER_ID_OFFSET 0x00
|
||||
#define _OMAP_TIMER_OCP_CFG_OFFSET 0x10
|
||||
#define _OMAP_TIMER_SYS_STAT_OFFSET 0x14
|
||||
#define _OMAP_TIMER_STAT_OFFSET 0x18
|
||||
#define _OMAP_TIMER_INT_EN_OFFSET 0x1c
|
||||
#define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20
|
||||
#define _OMAP_TIMER_CTRL_OFFSET 0x24
|
||||
#define OMAP_TIMER_CTRL_GPOCFG (1 << 14)
|
||||
#define OMAP_TIMER_CTRL_CAPTMODE (1 << 13)
|
||||
#define OMAP_TIMER_CTRL_PT (1 << 12)
|
||||
#define OMAP_TIMER_CTRL_TCM_LOWTOHIGH (0x1 << 8)
|
||||
#define OMAP_TIMER_CTRL_TCM_HIGHTOLOW (0x2 << 8)
|
||||
#define OMAP_TIMER_CTRL_TCM_BOTHEDGES (0x3 << 8)
|
||||
#define OMAP_TIMER_CTRL_SCPWM (1 << 7)
|
||||
#define OMAP_TIMER_CTRL_CE (1 << 6) /* compare enable */
|
||||
#define OMAP_TIMER_CTRL_PRE (1 << 5) /* prescaler enable */
|
||||
#define OMAP_TIMER_CTRL_PTV_SHIFT 2 /* prescaler value shift */
|
||||
#define OMAP_TIMER_CTRL_POSTED (1 << 2)
|
||||
#define OMAP_TIMER_CTRL_AR (1 << 1) /* auto-reload enable */
|
||||
#define OMAP_TIMER_CTRL_ST (1 << 0) /* start timer */
|
||||
#define _OMAP_TIMER_COUNTER_OFFSET 0x28
|
||||
#define _OMAP_TIMER_LOAD_OFFSET 0x2c
|
||||
#define _OMAP_TIMER_TRIGGER_OFFSET 0x30
|
||||
#define _OMAP_TIMER_WRITE_PEND_OFFSET 0x34
|
||||
#define WP_NONE 0 /* no write pending bit */
|
||||
#define WP_TCLR (1 << 0)
|
||||
#define WP_TCRR (1 << 1)
|
||||
#define WP_TLDR (1 << 2)
|
||||
#define WP_TTGR (1 << 3)
|
||||
#define WP_TMAR (1 << 4)
|
||||
#define WP_TPIR (1 << 5)
|
||||
#define WP_TNIR (1 << 6)
|
||||
#define WP_TCVR (1 << 7)
|
||||
#define WP_TOCR (1 << 8)
|
||||
#define WP_TOWR (1 << 9)
|
||||
#define _OMAP_TIMER_MATCH_OFFSET 0x38
|
||||
#define _OMAP_TIMER_CAPTURE_OFFSET 0x3c
|
||||
#define _OMAP_TIMER_IF_CTRL_OFFSET 0x40
|
||||
#define _OMAP_TIMER_CAPTURE2_OFFSET 0x44 /* TCAR2, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_POS_OFFSET 0x48 /* TPIR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_NEG_OFFSET 0x4c /* TNIR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_COUNT_OFFSET 0x50 /* TCVR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET 0x54 /* TOCR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET 0x58 /* TOWR, 34xx only */
|
||||
|
||||
/* register offsets with the write pending bit encoded */
|
||||
#define WPSHIFT 16
|
||||
|
||||
#define OMAP_TIMER_ID_REG (_OMAP_TIMER_ID_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_OCP_CFG_REG (_OMAP_TIMER_OCP_CFG_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_SYS_STAT_REG (_OMAP_TIMER_SYS_STAT_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_STAT_REG (_OMAP_TIMER_STAT_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_INT_EN_REG (_OMAP_TIMER_INT_EN_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CTRL_REG (_OMAP_TIMER_CTRL_OFFSET \
|
||||
| (WP_TCLR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_COUNTER_REG (_OMAP_TIMER_COUNTER_OFFSET \
|
||||
| (WP_TCRR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_LOAD_REG (_OMAP_TIMER_LOAD_OFFSET \
|
||||
| (WP_TLDR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TRIGGER_REG (_OMAP_TIMER_TRIGGER_OFFSET \
|
||||
| (WP_TTGR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_WRITE_PEND_REG (_OMAP_TIMER_WRITE_PEND_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_MATCH_REG (_OMAP_TIMER_MATCH_OFFSET \
|
||||
| (WP_TMAR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CAPTURE_REG (_OMAP_TIMER_CAPTURE_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_IF_CTRL_REG (_OMAP_TIMER_IF_CTRL_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CAPTURE2_REG (_OMAP_TIMER_CAPTURE2_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_POS_REG (_OMAP_TIMER_TICK_POS_OFFSET \
|
||||
| (WP_TPIR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_NEG_REG (_OMAP_TIMER_TICK_NEG_OFFSET \
|
||||
| (WP_TNIR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_COUNT_REG (_OMAP_TIMER_TICK_COUNT_OFFSET \
|
||||
| (WP_TCVR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_INT_MASK_SET_REG \
|
||||
(_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_INT_MASK_COUNT_REG \
|
||||
(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT))
|
||||
|
||||
struct omap_dm_timer {
|
||||
unsigned long phys_base;
|
||||
int irq;
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
struct clk *iclk, *fclk;
|
||||
#endif
|
||||
void __iomem *io_base;
|
||||
unsigned reserved:1;
|
||||
unsigned enabled:1;
|
||||
unsigned posted:1;
|
||||
};
|
||||
|
||||
static int dm_timer_count;
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP1
|
||||
@ -291,11 +170,7 @@ static spinlock_t dm_timer_lock;
|
||||
*/
|
||||
static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)
|
||||
{
|
||||
if (timer->posted)
|
||||
while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff))
|
||||
& (reg >> WPSHIFT))
|
||||
cpu_relax();
|
||||
return readl(timer->io_base + (reg & 0xff));
|
||||
return __omap_dm_timer_read(timer->io_base, reg, timer->posted);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -307,11 +182,7 @@ static inline u32 omap_dm_timer_read_reg(struct omap_dm_timer *timer, u32 reg)
|
||||
static void omap_dm_timer_write_reg(struct omap_dm_timer *timer, u32 reg,
|
||||
u32 value)
|
||||
{
|
||||
if (timer->posted)
|
||||
while (readl(timer->io_base + (OMAP_TIMER_WRITE_PEND_REG & 0xff))
|
||||
& (reg >> WPSHIFT))
|
||||
cpu_relax();
|
||||
writel(value, timer->io_base + (reg & 0xff));
|
||||
__omap_dm_timer_write(timer->io_base, reg, value, timer->posted);
|
||||
}
|
||||
|
||||
static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer)
|
||||
@ -330,7 +201,7 @@ static void omap_dm_timer_wait_for_reset(struct omap_dm_timer *timer)
|
||||
|
||||
static void omap_dm_timer_reset(struct omap_dm_timer *timer)
|
||||
{
|
||||
u32 l;
|
||||
int autoidle = 0, wakeup = 0;
|
||||
|
||||
if (!cpu_class_is_omap2() || timer != &dm_timers[0]) {
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG, 0x06);
|
||||
@ -338,28 +209,21 @@ static void omap_dm_timer_reset(struct omap_dm_timer *timer)
|
||||
}
|
||||
omap_dm_timer_set_source(timer, OMAP_TIMER_SRC_32_KHZ);
|
||||
|
||||
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_OCP_CFG_REG);
|
||||
l |= 0x02 << 3; /* Set to smart-idle mode */
|
||||
l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */
|
||||
|
||||
/* Enable autoidle on OMAP2 / OMAP3 */
|
||||
if (cpu_is_omap24xx() || cpu_is_omap34xx())
|
||||
l |= 0x1 << 0;
|
||||
/* Enable autoidle on OMAP2+ */
|
||||
if (cpu_class_is_omap2())
|
||||
autoidle = 1;
|
||||
|
||||
/*
|
||||
* Enable wake-up on OMAP2 CPUs.
|
||||
*/
|
||||
if (cpu_class_is_omap2())
|
||||
l |= 1 << 2;
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_OCP_CFG_REG, l);
|
||||
wakeup = 1;
|
||||
|
||||
/* Match hardware reset default of posted mode */
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_IF_CTRL_REG,
|
||||
OMAP_TIMER_CTRL_POSTED);
|
||||
__omap_dm_timer_reset(timer->io_base, autoidle, wakeup);
|
||||
timer->posted = 1;
|
||||
}
|
||||
|
||||
static void omap_dm_timer_prepare(struct omap_dm_timer *timer)
|
||||
void omap_dm_timer_prepare(struct omap_dm_timer *timer)
|
||||
{
|
||||
omap_dm_timer_enable(timer);
|
||||
omap_dm_timer_reset(timer);
|
||||
@ -531,25 +395,13 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_start);
|
||||
|
||||
void omap_dm_timer_stop(struct omap_dm_timer *timer)
|
||||
{
|
||||
u32 l;
|
||||
unsigned long rate = 0;
|
||||
|
||||
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
|
||||
if (l & OMAP_TIMER_CTRL_ST) {
|
||||
l &= ~0x1;
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
/* Readback to make sure write has completed */
|
||||
omap_dm_timer_read_reg(timer, OMAP_TIMER_CTRL_REG);
|
||||
/*
|
||||
* Wait for functional clock period x 3.5 to make sure that
|
||||
* timer is stopped
|
||||
*/
|
||||
udelay(3500000 / clk_get_rate(timer->fclk) + 1);
|
||||
rate = clk_get_rate(timer->fclk);
|
||||
#endif
|
||||
}
|
||||
/* Ack possibly pending interrupt */
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG,
|
||||
OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
__omap_dm_timer_stop(timer->io_base, timer->posted, rate);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_stop);
|
||||
|
||||
@ -572,22 +424,11 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_set_source);
|
||||
|
||||
int omap_dm_timer_set_source(struct omap_dm_timer *timer, int source)
|
||||
{
|
||||
int ret = -EINVAL;
|
||||
|
||||
if (source < 0 || source >= 3)
|
||||
return -EINVAL;
|
||||
|
||||
clk_disable(timer->fclk);
|
||||
ret = clk_set_parent(timer->fclk, dm_source_clocks[source]);
|
||||
clk_enable(timer->fclk);
|
||||
|
||||
/*
|
||||
* When the functional clock disappears, too quick writes seem
|
||||
* to cause an abort. XXX Is this still necessary?
|
||||
*/
|
||||
__delay(300000);
|
||||
|
||||
return ret;
|
||||
return __omap_dm_timer_set_source(timer->fclk,
|
||||
dm_source_clocks[source]);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_set_source);
|
||||
|
||||
@ -625,8 +466,7 @@ void omap_dm_timer_set_load_start(struct omap_dm_timer *timer, int autoreload,
|
||||
}
|
||||
l |= OMAP_TIMER_CTRL_ST;
|
||||
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_COUNTER_REG, load);
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_CTRL_REG, l);
|
||||
__omap_dm_timer_load_start(timer->io_base, l, load, timer->posted);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_set_load_start);
|
||||
|
||||
@ -679,8 +519,7 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_set_prescaler);
|
||||
void omap_dm_timer_set_int_enable(struct omap_dm_timer *timer,
|
||||
unsigned int value)
|
||||
{
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_INT_EN_REG, value);
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_WAKEUP_EN_REG, value);
|
||||
__omap_dm_timer_int_enable(timer->io_base, value);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_set_int_enable);
|
||||
|
||||
@ -696,17 +535,13 @@ EXPORT_SYMBOL_GPL(omap_dm_timer_read_status);
|
||||
|
||||
void omap_dm_timer_write_status(struct omap_dm_timer *timer, unsigned int value)
|
||||
{
|
||||
omap_dm_timer_write_reg(timer, OMAP_TIMER_STAT_REG, value);
|
||||
__omap_dm_timer_write_status(timer->io_base, value);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_write_status);
|
||||
|
||||
unsigned int omap_dm_timer_read_counter(struct omap_dm_timer *timer)
|
||||
{
|
||||
unsigned int l;
|
||||
|
||||
l = omap_dm_timer_read_reg(timer, OMAP_TIMER_COUNTER_REG);
|
||||
|
||||
return l;
|
||||
return __omap_dm_timer_read_counter(timer->io_base, timer->posted);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timer_read_counter);
|
||||
|
||||
@ -737,7 +572,7 @@ int omap_dm_timers_active(void)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(omap_dm_timers_active);
|
||||
|
||||
int __init omap_dm_timer_init(void)
|
||||
static int __init omap_dm_timer_init(void)
|
||||
{
|
||||
struct omap_dm_timer *timer;
|
||||
int i, map_size = SZ_8K; /* Module 4KB + L4 4KB except on omap1 */
|
||||
@ -790,8 +625,16 @@ int __init omap_dm_timer_init(void)
|
||||
sprintf(clk_name, "gpt%d_fck", i + 1);
|
||||
timer->fclk = clk_get(NULL, clk_name);
|
||||
}
|
||||
|
||||
/* One or two timers may be set up early for sys_timer */
|
||||
if (sys_timer_reserved & (1 << i)) {
|
||||
timer->reserved = 1;
|
||||
timer->posted = 1;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
arch_initcall(omap_dm_timer_init);
|
||||
|
@ -34,7 +34,11 @@
|
||||
struct sys_timer;
|
||||
|
||||
extern void omap_map_common_io(void);
|
||||
extern struct sys_timer omap_timer;
|
||||
extern struct sys_timer omap1_timer;
|
||||
extern struct sys_timer omap2_timer;
|
||||
extern struct sys_timer omap3_timer;
|
||||
extern struct sys_timer omap3_secure_timer;
|
||||
extern struct sys_timer omap4_timer;
|
||||
extern bool omap_32k_timer_init(void);
|
||||
extern int __init omap_init_clocksource_32k(void);
|
||||
extern unsigned long long notrace omap_32k_sched_clock(void);
|
||||
|
@ -32,6 +32,9 @@
|
||||
* 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
|
||||
#ifndef __ASM_ARCH_DMTIMER_H
|
||||
#define __ASM_ARCH_DMTIMER_H
|
||||
|
||||
@ -56,12 +59,8 @@
|
||||
*/
|
||||
#define OMAP_TIMER_IP_VERSION_1 0x1
|
||||
struct omap_dm_timer;
|
||||
extern struct omap_dm_timer *gptimer_wakeup;
|
||||
extern struct sys_timer omap_timer;
|
||||
struct clk;
|
||||
|
||||
int omap_dm_timer_init(void);
|
||||
|
||||
struct omap_dm_timer *omap_dm_timer_request(void);
|
||||
struct omap_dm_timer *omap_dm_timer_request_specific(int timer_id);
|
||||
void omap_dm_timer_free(struct omap_dm_timer *timer);
|
||||
@ -93,5 +92,248 @@ void omap_dm_timer_write_counter(struct omap_dm_timer *timer, unsigned int value
|
||||
|
||||
int omap_dm_timers_active(void);
|
||||
|
||||
/*
|
||||
* Do not use the defines below, they are not needed. They should be only
|
||||
* used by dmtimer.c and sys_timer related code.
|
||||
*/
|
||||
|
||||
/* register offsets */
|
||||
#define _OMAP_TIMER_ID_OFFSET 0x00
|
||||
#define _OMAP_TIMER_OCP_CFG_OFFSET 0x10
|
||||
#define _OMAP_TIMER_SYS_STAT_OFFSET 0x14
|
||||
#define _OMAP_TIMER_STAT_OFFSET 0x18
|
||||
#define _OMAP_TIMER_INT_EN_OFFSET 0x1c
|
||||
#define _OMAP_TIMER_WAKEUP_EN_OFFSET 0x20
|
||||
#define _OMAP_TIMER_CTRL_OFFSET 0x24
|
||||
#define OMAP_TIMER_CTRL_GPOCFG (1 << 14)
|
||||
#define OMAP_TIMER_CTRL_CAPTMODE (1 << 13)
|
||||
#define OMAP_TIMER_CTRL_PT (1 << 12)
|
||||
#define OMAP_TIMER_CTRL_TCM_LOWTOHIGH (0x1 << 8)
|
||||
#define OMAP_TIMER_CTRL_TCM_HIGHTOLOW (0x2 << 8)
|
||||
#define OMAP_TIMER_CTRL_TCM_BOTHEDGES (0x3 << 8)
|
||||
#define OMAP_TIMER_CTRL_SCPWM (1 << 7)
|
||||
#define OMAP_TIMER_CTRL_CE (1 << 6) /* compare enable */
|
||||
#define OMAP_TIMER_CTRL_PRE (1 << 5) /* prescaler enable */
|
||||
#define OMAP_TIMER_CTRL_PTV_SHIFT 2 /* prescaler value shift */
|
||||
#define OMAP_TIMER_CTRL_POSTED (1 << 2)
|
||||
#define OMAP_TIMER_CTRL_AR (1 << 1) /* auto-reload enable */
|
||||
#define OMAP_TIMER_CTRL_ST (1 << 0) /* start timer */
|
||||
#define _OMAP_TIMER_COUNTER_OFFSET 0x28
|
||||
#define _OMAP_TIMER_LOAD_OFFSET 0x2c
|
||||
#define _OMAP_TIMER_TRIGGER_OFFSET 0x30
|
||||
#define _OMAP_TIMER_WRITE_PEND_OFFSET 0x34
|
||||
#define WP_NONE 0 /* no write pending bit */
|
||||
#define WP_TCLR (1 << 0)
|
||||
#define WP_TCRR (1 << 1)
|
||||
#define WP_TLDR (1 << 2)
|
||||
#define WP_TTGR (1 << 3)
|
||||
#define WP_TMAR (1 << 4)
|
||||
#define WP_TPIR (1 << 5)
|
||||
#define WP_TNIR (1 << 6)
|
||||
#define WP_TCVR (1 << 7)
|
||||
#define WP_TOCR (1 << 8)
|
||||
#define WP_TOWR (1 << 9)
|
||||
#define _OMAP_TIMER_MATCH_OFFSET 0x38
|
||||
#define _OMAP_TIMER_CAPTURE_OFFSET 0x3c
|
||||
#define _OMAP_TIMER_IF_CTRL_OFFSET 0x40
|
||||
#define _OMAP_TIMER_CAPTURE2_OFFSET 0x44 /* TCAR2, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_POS_OFFSET 0x48 /* TPIR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_NEG_OFFSET 0x4c /* TNIR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_COUNT_OFFSET 0x50 /* TCVR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_INT_MASK_SET_OFFSET 0x54 /* TOCR, 34xx only */
|
||||
#define _OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET 0x58 /* TOWR, 34xx only */
|
||||
|
||||
/* register offsets with the write pending bit encoded */
|
||||
#define WPSHIFT 16
|
||||
|
||||
#define OMAP_TIMER_ID_REG (_OMAP_TIMER_ID_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_OCP_CFG_REG (_OMAP_TIMER_OCP_CFG_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_SYS_STAT_REG (_OMAP_TIMER_SYS_STAT_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_STAT_REG (_OMAP_TIMER_STAT_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_INT_EN_REG (_OMAP_TIMER_INT_EN_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_WAKEUP_EN_REG (_OMAP_TIMER_WAKEUP_EN_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CTRL_REG (_OMAP_TIMER_CTRL_OFFSET \
|
||||
| (WP_TCLR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_COUNTER_REG (_OMAP_TIMER_COUNTER_OFFSET \
|
||||
| (WP_TCRR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_LOAD_REG (_OMAP_TIMER_LOAD_OFFSET \
|
||||
| (WP_TLDR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TRIGGER_REG (_OMAP_TIMER_TRIGGER_OFFSET \
|
||||
| (WP_TTGR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_WRITE_PEND_REG (_OMAP_TIMER_WRITE_PEND_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_MATCH_REG (_OMAP_TIMER_MATCH_OFFSET \
|
||||
| (WP_TMAR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CAPTURE_REG (_OMAP_TIMER_CAPTURE_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_IF_CTRL_REG (_OMAP_TIMER_IF_CTRL_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_CAPTURE2_REG (_OMAP_TIMER_CAPTURE2_OFFSET \
|
||||
| (WP_NONE << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_POS_REG (_OMAP_TIMER_TICK_POS_OFFSET \
|
||||
| (WP_TPIR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_NEG_REG (_OMAP_TIMER_TICK_NEG_OFFSET \
|
||||
| (WP_TNIR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_COUNT_REG (_OMAP_TIMER_TICK_COUNT_OFFSET \
|
||||
| (WP_TCVR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_INT_MASK_SET_REG \
|
||||
(_OMAP_TIMER_TICK_INT_MASK_SET_OFFSET | (WP_TOCR << WPSHIFT))
|
||||
|
||||
#define OMAP_TIMER_TICK_INT_MASK_COUNT_REG \
|
||||
(_OMAP_TIMER_TICK_INT_MASK_COUNT_OFFSET | (WP_TOWR << WPSHIFT))
|
||||
|
||||
struct omap_dm_timer {
|
||||
unsigned long phys_base;
|
||||
int irq;
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
struct clk *iclk, *fclk;
|
||||
#endif
|
||||
void __iomem *io_base;
|
||||
unsigned long rate;
|
||||
unsigned reserved:1;
|
||||
unsigned enabled:1;
|
||||
unsigned posted:1;
|
||||
};
|
||||
|
||||
extern u32 sys_timer_reserved;
|
||||
void omap_dm_timer_prepare(struct omap_dm_timer *timer);
|
||||
|
||||
static inline u32 __omap_dm_timer_read(void __iomem *base, u32 reg,
|
||||
int posted)
|
||||
{
|
||||
if (posted)
|
||||
while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff))
|
||||
& (reg >> WPSHIFT))
|
||||
cpu_relax();
|
||||
|
||||
return __raw_readl(base + (reg & 0xff));
|
||||
}
|
||||
|
||||
static inline void __omap_dm_timer_write(void __iomem *base, u32 reg, u32 val,
|
||||
int posted)
|
||||
{
|
||||
if (posted)
|
||||
while (__raw_readl(base + (OMAP_TIMER_WRITE_PEND_REG & 0xff))
|
||||
& (reg >> WPSHIFT))
|
||||
cpu_relax();
|
||||
|
||||
__raw_writel(val, base + (reg & 0xff));
|
||||
}
|
||||
|
||||
/* Assumes the source clock has been set by caller */
|
||||
static inline void __omap_dm_timer_reset(void __iomem *base, int autoidle,
|
||||
int wakeup)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
l = __omap_dm_timer_read(base, OMAP_TIMER_OCP_CFG_REG, 0);
|
||||
l |= 0x02 << 3; /* Set to smart-idle mode */
|
||||
l |= 0x2 << 8; /* Set clock activity to perserve f-clock on idle */
|
||||
|
||||
if (autoidle)
|
||||
l |= 0x1 << 0;
|
||||
|
||||
if (wakeup)
|
||||
l |= 1 << 2;
|
||||
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_OCP_CFG_REG, l, 0);
|
||||
|
||||
/* Match hardware reset default of posted mode */
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_IF_CTRL_REG,
|
||||
OMAP_TIMER_CTRL_POSTED, 0);
|
||||
}
|
||||
|
||||
static inline int __omap_dm_timer_set_source(struct clk *timer_fck,
|
||||
struct clk *parent)
|
||||
{
|
||||
int ret;
|
||||
|
||||
clk_disable(timer_fck);
|
||||
ret = clk_set_parent(timer_fck, parent);
|
||||
clk_enable(timer_fck);
|
||||
|
||||
/*
|
||||
* When the functional clock disappears, too quick writes seem
|
||||
* to cause an abort. XXX Is this still necessary?
|
||||
*/
|
||||
__delay(300000);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void __omap_dm_timer_stop(void __iomem *base, int posted,
|
||||
unsigned long rate)
|
||||
{
|
||||
u32 l;
|
||||
|
||||
l = __omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted);
|
||||
if (l & OMAP_TIMER_CTRL_ST) {
|
||||
l &= ~0x1;
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, l, posted);
|
||||
#ifdef CONFIG_ARCH_OMAP2PLUS
|
||||
/* Readback to make sure write has completed */
|
||||
__omap_dm_timer_read(base, OMAP_TIMER_CTRL_REG, posted);
|
||||
/*
|
||||
* Wait for functional clock period x 3.5 to make sure that
|
||||
* timer is stopped
|
||||
*/
|
||||
udelay(3500000 / rate + 1);
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Ack possibly pending interrupt */
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_STAT_REG,
|
||||
OMAP_TIMER_INT_OVERFLOW, 0);
|
||||
}
|
||||
|
||||
static inline void __omap_dm_timer_load_start(void __iomem *base, u32 ctrl,
|
||||
unsigned int load, int posted)
|
||||
{
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_COUNTER_REG, load, posted);
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_CTRL_REG, ctrl, posted);
|
||||
}
|
||||
|
||||
static inline void __omap_dm_timer_int_enable(void __iomem *base,
|
||||
unsigned int value)
|
||||
{
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_INT_EN_REG, value, 0);
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_WAKEUP_EN_REG, value, 0);
|
||||
}
|
||||
|
||||
static inline unsigned int __omap_dm_timer_read_counter(void __iomem *base,
|
||||
int posted)
|
||||
{
|
||||
return __omap_dm_timer_read(base, OMAP_TIMER_COUNTER_REG, posted);
|
||||
}
|
||||
|
||||
static inline void __omap_dm_timer_write_status(void __iomem *base,
|
||||
unsigned int value)
|
||||
{
|
||||
__omap_dm_timer_write(base, OMAP_TIMER_STAT_REG, value, 0);
|
||||
}
|
||||
|
||||
#endif /* __ASM_ARCH_DMTIMER_H */
|
||||
|
@ -428,7 +428,11 @@
|
||||
#define INTCPS_NR_IRQS 96
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
extern void omap_init_irq(void);
|
||||
extern void __iomem *omap_irq_base;
|
||||
void omap1_init_irq(void);
|
||||
void omap2_init_irq(void);
|
||||
void omap3_init_irq(void);
|
||||
void ti816x_init_irq(void);
|
||||
extern int omap_irq_pending(void);
|
||||
void omap_intc_save_context(void);
|
||||
void omap_intc_restore_context(void);
|
||||
|
@ -24,7 +24,6 @@
|
||||
#ifndef __ASM_ARCH_OMAP_MCBSP_H
|
||||
#define __ASM_ARCH_OMAP_MCBSP_H
|
||||
|
||||
#include <linux/completion.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
@ -34,7 +33,7 @@
|
||||
#define OMAP_MCBSP_PLATFORM_DEVICE(port_nr) \
|
||||
static struct platform_device omap_mcbsp##port_nr = { \
|
||||
.name = "omap-mcbsp-dai", \
|
||||
.id = OMAP_MCBSP##port_nr, \
|
||||
.id = port_nr - 1, \
|
||||
}
|
||||
|
||||
#define MCBSP_CONFIG_TYPE2 0x2
|
||||
@ -332,18 +331,6 @@ struct omap_mcbsp_reg_cfg {
|
||||
u16 rccr;
|
||||
};
|
||||
|
||||
typedef enum {
|
||||
OMAP_MCBSP1 = 0,
|
||||
OMAP_MCBSP2,
|
||||
OMAP_MCBSP3,
|
||||
OMAP_MCBSP4,
|
||||
OMAP_MCBSP5
|
||||
} omap_mcbsp_id;
|
||||
|
||||
typedef int __bitwise omap_mcbsp_io_type_t;
|
||||
#define OMAP_MCBSP_IRQ_IO ((__force omap_mcbsp_io_type_t) 1)
|
||||
#define OMAP_MCBSP_POLL_IO ((__force omap_mcbsp_io_type_t) 2)
|
||||
|
||||
typedef enum {
|
||||
OMAP_MCBSP_WORD_8 = 0,
|
||||
OMAP_MCBSP_WORD_12,
|
||||
@ -353,38 +340,6 @@ typedef enum {
|
||||
OMAP_MCBSP_WORD_32,
|
||||
} omap_mcbsp_word_length;
|
||||
|
||||
typedef enum {
|
||||
OMAP_MCBSP_CLK_RISING = 0,
|
||||
OMAP_MCBSP_CLK_FALLING,
|
||||
} omap_mcbsp_clk_polarity;
|
||||
|
||||
typedef enum {
|
||||
OMAP_MCBSP_FS_ACTIVE_HIGH = 0,
|
||||
OMAP_MCBSP_FS_ACTIVE_LOW,
|
||||
} omap_mcbsp_fs_polarity;
|
||||
|
||||
typedef enum {
|
||||
OMAP_MCBSP_CLK_STP_MODE_NO_DELAY = 0,
|
||||
OMAP_MCBSP_CLK_STP_MODE_DELAY,
|
||||
} omap_mcbsp_clk_stp_mode;
|
||||
|
||||
|
||||
/******* SPI specific mode **********/
|
||||
typedef enum {
|
||||
OMAP_MCBSP_SPI_MASTER = 0,
|
||||
OMAP_MCBSP_SPI_SLAVE,
|
||||
} omap_mcbsp_spi_mode;
|
||||
|
||||
struct omap_mcbsp_spi_cfg {
|
||||
omap_mcbsp_spi_mode spi_mode;
|
||||
omap_mcbsp_clk_polarity rx_clock_polarity;
|
||||
omap_mcbsp_clk_polarity tx_clock_polarity;
|
||||
omap_mcbsp_fs_polarity fsx_polarity;
|
||||
u8 clk_div;
|
||||
omap_mcbsp_clk_stp_mode clk_stp_mode;
|
||||
omap_mcbsp_word_length word_length;
|
||||
};
|
||||
|
||||
/* Platform specific configuration */
|
||||
struct omap_mcbsp_ops {
|
||||
void (*request)(unsigned int);
|
||||
@ -422,25 +377,13 @@ struct omap_mcbsp {
|
||||
void __iomem *io_base;
|
||||
u8 id;
|
||||
u8 free;
|
||||
omap_mcbsp_word_length rx_word_length;
|
||||
omap_mcbsp_word_length tx_word_length;
|
||||
|
||||
omap_mcbsp_io_type_t io_type; /* IRQ or poll */
|
||||
/* IRQ based TX/RX */
|
||||
int rx_irq;
|
||||
int tx_irq;
|
||||
|
||||
/* DMA stuff */
|
||||
u8 dma_rx_sync;
|
||||
short dma_rx_lch;
|
||||
u8 dma_tx_sync;
|
||||
short dma_tx_lch;
|
||||
|
||||
/* Completion queues */
|
||||
struct completion tx_irq_completion;
|
||||
struct completion rx_irq_completion;
|
||||
struct completion tx_dma_completion;
|
||||
struct completion rx_dma_completion;
|
||||
|
||||
/* Protect the field .free, while checking if the mcbsp is in use */
|
||||
spinlock_t lock;
|
||||
@ -499,24 +442,9 @@ int omap_mcbsp_request(unsigned int id);
|
||||
void omap_mcbsp_free(unsigned int id);
|
||||
void omap_mcbsp_start(unsigned int id, int tx, int rx);
|
||||
void omap_mcbsp_stop(unsigned int id, int tx, int rx);
|
||||
void omap_mcbsp_xmit_word(unsigned int id, u32 word);
|
||||
u32 omap_mcbsp_recv_word(unsigned int id);
|
||||
|
||||
int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer, unsigned int length);
|
||||
int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer, unsigned int length);
|
||||
int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word);
|
||||
int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 * word);
|
||||
|
||||
|
||||
/* McBSP functional clock source changing function */
|
||||
extern int omap2_mcbsp_set_clks_src(u8 id, u8 fck_src_id);
|
||||
/* SPI specific API */
|
||||
void omap_mcbsp_set_spi_mode(unsigned int id, const struct omap_mcbsp_spi_cfg * spi_cfg);
|
||||
|
||||
/* Polled read/write functions */
|
||||
int omap_mcbsp_pollread(unsigned int id, u16 * buf);
|
||||
int omap_mcbsp_pollwrite(unsigned int id, u16 buf);
|
||||
int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type);
|
||||
|
||||
/* McBSP signal muxing API */
|
||||
void omap2_mcbsp1_mux_clkr_src(u8 mux);
|
||||
|
@ -19,15 +19,11 @@ enum nand_io {
|
||||
};
|
||||
|
||||
struct omap_nand_platform_data {
|
||||
unsigned int options;
|
||||
int cs;
|
||||
int gpio_irq;
|
||||
struct mtd_partition *parts;
|
||||
struct gpmc_timings *gpmc_t;
|
||||
int nr_parts;
|
||||
int (*nand_setup)(void);
|
||||
int (*dev_ready)(struct omap_nand_platform_data *);
|
||||
int dma_channel;
|
||||
bool dev_ready;
|
||||
int gpmc_irq;
|
||||
enum nand_io xfer_type;
|
||||
unsigned long phys_base;
|
||||
|
@ -10,5 +10,6 @@ struct omap4_keypad_platform_data {
|
||||
u8 cols;
|
||||
};
|
||||
|
||||
extern int omap4_keyboard_init(struct omap4_keypad_platform_data *);
|
||||
extern int omap4_keyboard_init(struct omap4_keypad_platform_data *,
|
||||
struct omap_board_data *);
|
||||
#endif
|
||||
|
@ -148,6 +148,7 @@ static inline void __arch_decomp_setup(unsigned long arch_id)
|
||||
/* omap3 based boards using UART3 */
|
||||
DEBUG_LL_OMAP3(3, cm_t35);
|
||||
DEBUG_LL_OMAP3(3, cm_t3517);
|
||||
DEBUG_LL_OMAP3(3, cm_t3730);
|
||||
DEBUG_LL_OMAP3(3, craneboard);
|
||||
DEBUG_LL_OMAP3(3, devkit8000);
|
||||
DEBUG_LL_OMAP3(3, igep0020);
|
||||
|
@ -72,7 +72,7 @@ static size_t sgtable_len(const struct sg_table *sgt)
|
||||
for_each_sg(sgt->sgl, sg, sgt->nents, i) {
|
||||
size_t bytes;
|
||||
|
||||
bytes = sg_dma_len(sg);
|
||||
bytes = sg->length;
|
||||
|
||||
if (!iopgsz_ok(bytes)) {
|
||||
pr_err("%s: sg[%d] not iommu pagesize(%x)\n",
|
||||
@ -198,7 +198,7 @@ static void *vmap_sg(const struct sg_table *sgt)
|
||||
int err;
|
||||
|
||||
pa = sg_phys(sg);
|
||||
bytes = sg_dma_len(sg);
|
||||
bytes = sg->length;
|
||||
|
||||
BUG_ON(bytes != PAGE_SIZE);
|
||||
|
||||
@ -476,7 +476,7 @@ static int map_iovm_area(struct iommu *obj, struct iovm_struct *new,
|
||||
struct iotlb_entry e;
|
||||
|
||||
pa = sg_phys(sg);
|
||||
bytes = sg_dma_len(sg);
|
||||
bytes = sg->length;
|
||||
|
||||
flags &= ~IOVMF_PGSZ_MASK;
|
||||
pgsz = bytes_to_iopgsz(bytes);
|
||||
|
@ -16,8 +16,6 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/wait.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/clk.h>
|
||||
@ -25,7 +23,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <plat/dma.h>
|
||||
#include <plat/mcbsp.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
@ -136,8 +133,6 @@ static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id)
|
||||
irqst_spcr2);
|
||||
/* Writing zero to XSYNC_ERR clears the IRQ */
|
||||
MCBSP_WRITE(mcbsp_tx, SPCR2, MCBSP_READ_CACHE(mcbsp_tx, SPCR2));
|
||||
} else {
|
||||
complete(&mcbsp_tx->tx_irq_completion);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
@ -156,41 +151,11 @@ static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id)
|
||||
irqst_spcr1);
|
||||
/* Writing zero to RSYNC_ERR clears the IRQ */
|
||||
MCBSP_WRITE(mcbsp_rx, SPCR1, MCBSP_READ_CACHE(mcbsp_rx, SPCR1));
|
||||
} else {
|
||||
complete(&mcbsp_rx->rx_irq_completion);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp_dma_tx = data;
|
||||
|
||||
dev_dbg(mcbsp_dma_tx->dev, "TX DMA callback : 0x%x\n",
|
||||
MCBSP_READ(mcbsp_dma_tx, SPCR2));
|
||||
|
||||
/* We can free the channels */
|
||||
omap_free_dma(mcbsp_dma_tx->dma_tx_lch);
|
||||
mcbsp_dma_tx->dma_tx_lch = -1;
|
||||
|
||||
complete(&mcbsp_dma_tx->tx_dma_completion);
|
||||
}
|
||||
|
||||
static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp_dma_rx = data;
|
||||
|
||||
dev_dbg(mcbsp_dma_rx->dev, "RX DMA callback : 0x%x\n",
|
||||
MCBSP_READ(mcbsp_dma_rx, SPCR2));
|
||||
|
||||
/* We can free the channels */
|
||||
omap_free_dma(mcbsp_dma_rx->dma_rx_lch);
|
||||
mcbsp_dma_rx->dma_rx_lch = -1;
|
||||
|
||||
complete(&mcbsp_dma_rx->rx_dma_completion);
|
||||
}
|
||||
|
||||
/*
|
||||
* omap_mcbsp_config simply write a config to the
|
||||
* appropriate McBSP.
|
||||
@ -758,37 +723,6 @@ static inline void omap_st_start(struct omap_mcbsp *mcbsp) {}
|
||||
static inline void omap_st_stop(struct omap_mcbsp *mcbsp) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We can choose between IRQ based or polled IO.
|
||||
* This needs to be called before omap_mcbsp_request().
|
||||
*/
|
||||
int omap_mcbsp_set_io_type(unsigned int id, omap_mcbsp_io_type_t io_type)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
spin_lock(&mcbsp->lock);
|
||||
|
||||
if (!mcbsp->free) {
|
||||
dev_err(mcbsp->dev, "McBSP%d is currently in use\n",
|
||||
mcbsp->id);
|
||||
spin_unlock(&mcbsp->lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mcbsp->io_type = io_type;
|
||||
|
||||
spin_unlock(&mcbsp->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_set_io_type);
|
||||
|
||||
int omap_mcbsp_request(unsigned int id)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
@ -833,29 +767,24 @@ int omap_mcbsp_request(unsigned int id)
|
||||
MCBSP_WRITE(mcbsp, SPCR1, 0);
|
||||
MCBSP_WRITE(mcbsp, SPCR2, 0);
|
||||
|
||||
if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
|
||||
/* We need to get IRQs here */
|
||||
init_completion(&mcbsp->tx_irq_completion);
|
||||
err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler,
|
||||
0, "McBSP", (void *)mcbsp);
|
||||
if (err != 0) {
|
||||
dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->tx_irq,
|
||||
mcbsp->id);
|
||||
goto err_clk_disable;
|
||||
}
|
||||
err = request_irq(mcbsp->tx_irq, omap_mcbsp_tx_irq_handler,
|
||||
0, "McBSP", (void *)mcbsp);
|
||||
if (err != 0) {
|
||||
dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->tx_irq,
|
||||
mcbsp->id);
|
||||
goto err_clk_disable;
|
||||
}
|
||||
|
||||
if (mcbsp->rx_irq) {
|
||||
init_completion(&mcbsp->rx_irq_completion);
|
||||
err = request_irq(mcbsp->rx_irq,
|
||||
omap_mcbsp_rx_irq_handler,
|
||||
0, "McBSP", (void *)mcbsp);
|
||||
if (err != 0) {
|
||||
dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->rx_irq,
|
||||
mcbsp->id);
|
||||
goto err_free_irq;
|
||||
}
|
||||
if (mcbsp->rx_irq) {
|
||||
err = request_irq(mcbsp->rx_irq,
|
||||
omap_mcbsp_rx_irq_handler,
|
||||
0, "McBSP", (void *)mcbsp);
|
||||
if (err != 0) {
|
||||
dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->rx_irq,
|
||||
mcbsp->id);
|
||||
goto err_free_irq;
|
||||
}
|
||||
}
|
||||
|
||||
@ -901,12 +830,9 @@ void omap_mcbsp_free(unsigned int id)
|
||||
|
||||
pm_runtime_put_sync(mcbsp->dev);
|
||||
|
||||
if (mcbsp->io_type == OMAP_MCBSP_IRQ_IO) {
|
||||
/* Free IRQs */
|
||||
if (mcbsp->rx_irq)
|
||||
free_irq(mcbsp->rx_irq, (void *)mcbsp);
|
||||
free_irq(mcbsp->tx_irq, (void *)mcbsp);
|
||||
}
|
||||
if (mcbsp->rx_irq)
|
||||
free_irq(mcbsp->rx_irq, (void *)mcbsp);
|
||||
free_irq(mcbsp->tx_irq, (void *)mcbsp);
|
||||
|
||||
reg_cache = mcbsp->reg_cache;
|
||||
|
||||
@ -943,9 +869,6 @@ void omap_mcbsp_start(unsigned int id, int tx, int rx)
|
||||
if (cpu_is_omap34xx())
|
||||
omap_st_start(mcbsp);
|
||||
|
||||
mcbsp->rx_word_length = (MCBSP_READ_CACHE(mcbsp, RCR1) >> 5) & 0x7;
|
||||
mcbsp->tx_word_length = (MCBSP_READ_CACHE(mcbsp, XCR1) >> 5) & 0x7;
|
||||
|
||||
/* Only enable SRG, if McBSP is master */
|
||||
w = MCBSP_READ_CACHE(mcbsp, PCR0);
|
||||
if (w & (FSXM | FSRM | CLKXM | CLKRM))
|
||||
@ -1043,485 +966,6 @@ void omap_mcbsp_stop(unsigned int id, int tx, int rx)
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_stop);
|
||||
|
||||
/* polled mcbsp i/o operations */
|
||||
int omap_mcbsp_pollwrite(unsigned int id, u16 buf)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
MCBSP_WRITE(mcbsp, DXR1, buf);
|
||||
/* if frame sync error - clear the error */
|
||||
if (MCBSP_READ(mcbsp, SPCR2) & XSYNC_ERR) {
|
||||
/* clear error */
|
||||
MCBSP_WRITE(mcbsp, SPCR2, MCBSP_READ_CACHE(mcbsp, SPCR2));
|
||||
/* resend */
|
||||
return -1;
|
||||
} else {
|
||||
/* wait for transmit confirmation */
|
||||
int attemps = 0;
|
||||
while (!(MCBSP_READ(mcbsp, SPCR2) & XRDY)) {
|
||||
if (attemps++ > 1000) {
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) &
|
||||
(~XRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) |
|
||||
(XRST));
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "Could not write to"
|
||||
" McBSP%d Register\n", mcbsp->id);
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_pollwrite);
|
||||
|
||||
int omap_mcbsp_pollread(unsigned int id, u16 *buf)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
/* if frame sync error - clear the error */
|
||||
if (MCBSP_READ(mcbsp, SPCR1) & RSYNC_ERR) {
|
||||
/* clear error */
|
||||
MCBSP_WRITE(mcbsp, SPCR1, MCBSP_READ_CACHE(mcbsp, SPCR1));
|
||||
/* resend */
|
||||
return -1;
|
||||
} else {
|
||||
/* wait for receive confirmation */
|
||||
int attemps = 0;
|
||||
while (!(MCBSP_READ(mcbsp, SPCR1) & RRDY)) {
|
||||
if (attemps++ > 1000) {
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) &
|
||||
(~RRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) |
|
||||
(RRST));
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "Could not read from"
|
||||
" McBSP%d Register\n", mcbsp->id);
|
||||
return -2;
|
||||
}
|
||||
}
|
||||
}
|
||||
*buf = MCBSP_READ(mcbsp, DRR1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_pollread);
|
||||
|
||||
/*
|
||||
* IRQ based word transmission.
|
||||
*/
|
||||
void omap_mcbsp_xmit_word(unsigned int id, u32 word)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
omap_mcbsp_word_length word_length;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return;
|
||||
}
|
||||
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
word_length = mcbsp->tx_word_length;
|
||||
|
||||
wait_for_completion(&mcbsp->tx_irq_completion);
|
||||
|
||||
if (word_length > OMAP_MCBSP_WORD_16)
|
||||
MCBSP_WRITE(mcbsp, DXR2, word >> 16);
|
||||
MCBSP_WRITE(mcbsp, DXR1, word & 0xffff);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_xmit_word);
|
||||
|
||||
u32 omap_mcbsp_recv_word(unsigned int id)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
u16 word_lsb, word_msb = 0;
|
||||
omap_mcbsp_word_length word_length;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
word_length = mcbsp->rx_word_length;
|
||||
|
||||
wait_for_completion(&mcbsp->rx_irq_completion);
|
||||
|
||||
if (word_length > OMAP_MCBSP_WORD_16)
|
||||
word_msb = MCBSP_READ(mcbsp, DRR2);
|
||||
word_lsb = MCBSP_READ(mcbsp, DRR1);
|
||||
|
||||
return (word_lsb | (word_msb << 16));
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_recv_word);
|
||||
|
||||
int omap_mcbsp_spi_master_xmit_word_poll(unsigned int id, u32 word)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
omap_mcbsp_word_length tx_word_length;
|
||||
omap_mcbsp_word_length rx_word_length;
|
||||
u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
tx_word_length = mcbsp->tx_word_length;
|
||||
rx_word_length = mcbsp->rx_word_length;
|
||||
|
||||
if (tx_word_length != rx_word_length)
|
||||
return -EINVAL;
|
||||
|
||||
/* First we wait for the transmitter to be ready */
|
||||
spcr2 = MCBSP_READ(mcbsp, SPCR2);
|
||||
while (!(spcr2 & XRDY)) {
|
||||
spcr2 = MCBSP_READ(mcbsp, SPCR2);
|
||||
if (attempts++ > 1000) {
|
||||
/* We must reset the transmitter */
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST);
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "McBSP%d transmitter not "
|
||||
"ready\n", mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
|
||||
/* Now we can push the data */
|
||||
if (tx_word_length > OMAP_MCBSP_WORD_16)
|
||||
MCBSP_WRITE(mcbsp, DXR2, word >> 16);
|
||||
MCBSP_WRITE(mcbsp, DXR1, word & 0xffff);
|
||||
|
||||
/* We wait for the receiver to be ready */
|
||||
spcr1 = MCBSP_READ(mcbsp, SPCR1);
|
||||
while (!(spcr1 & RRDY)) {
|
||||
spcr1 = MCBSP_READ(mcbsp, SPCR1);
|
||||
if (attempts++ > 1000) {
|
||||
/* We must reset the receiver */
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST);
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "McBSP%d receiver not "
|
||||
"ready\n", mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
|
||||
/* Receiver is ready, let's read the dummy data */
|
||||
if (rx_word_length > OMAP_MCBSP_WORD_16)
|
||||
word_msb = MCBSP_READ(mcbsp, DRR2);
|
||||
word_lsb = MCBSP_READ(mcbsp, DRR1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_spi_master_xmit_word_poll);
|
||||
|
||||
int omap_mcbsp_spi_master_recv_word_poll(unsigned int id, u32 *word)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
u32 clock_word = 0;
|
||||
omap_mcbsp_word_length tx_word_length;
|
||||
omap_mcbsp_word_length rx_word_length;
|
||||
u16 spcr2, spcr1, attempts = 0, word_lsb, word_msb = 0;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
tx_word_length = mcbsp->tx_word_length;
|
||||
rx_word_length = mcbsp->rx_word_length;
|
||||
|
||||
if (tx_word_length != rx_word_length)
|
||||
return -EINVAL;
|
||||
|
||||
/* First we wait for the transmitter to be ready */
|
||||
spcr2 = MCBSP_READ(mcbsp, SPCR2);
|
||||
while (!(spcr2 & XRDY)) {
|
||||
spcr2 = MCBSP_READ(mcbsp, SPCR2);
|
||||
if (attempts++ > 1000) {
|
||||
/* We must reset the transmitter */
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) & (~XRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR2,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR2) | XRST);
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "McBSP%d transmitter not "
|
||||
"ready\n", mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
|
||||
/* We first need to enable the bus clock */
|
||||
if (tx_word_length > OMAP_MCBSP_WORD_16)
|
||||
MCBSP_WRITE(mcbsp, DXR2, clock_word >> 16);
|
||||
MCBSP_WRITE(mcbsp, DXR1, clock_word & 0xffff);
|
||||
|
||||
/* We wait for the receiver to be ready */
|
||||
spcr1 = MCBSP_READ(mcbsp, SPCR1);
|
||||
while (!(spcr1 & RRDY)) {
|
||||
spcr1 = MCBSP_READ(mcbsp, SPCR1);
|
||||
if (attempts++ > 1000) {
|
||||
/* We must reset the receiver */
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) & (~RRST));
|
||||
udelay(10);
|
||||
MCBSP_WRITE(mcbsp, SPCR1,
|
||||
MCBSP_READ_CACHE(mcbsp, SPCR1) | RRST);
|
||||
udelay(10);
|
||||
dev_err(mcbsp->dev, "McBSP%d receiver not "
|
||||
"ready\n", mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
}
|
||||
|
||||
/* Receiver is ready, there is something for us */
|
||||
if (rx_word_length > OMAP_MCBSP_WORD_16)
|
||||
word_msb = MCBSP_READ(mcbsp, DRR2);
|
||||
word_lsb = MCBSP_READ(mcbsp, DRR1);
|
||||
|
||||
word[0] = (word_lsb | (word_msb << 16));
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_spi_master_recv_word_poll);
|
||||
|
||||
/*
|
||||
* Simple DMA based buffer rx/tx routines.
|
||||
* Nothing fancy, just a single buffer tx/rx through DMA.
|
||||
* The DMA resources are released once the transfer is done.
|
||||
* For anything fancier, you should use your own customized DMA
|
||||
* routines and callbacks.
|
||||
*/
|
||||
int omap_mcbsp_xmit_buffer(unsigned int id, dma_addr_t buffer,
|
||||
unsigned int length)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
int dma_tx_ch;
|
||||
int src_port = 0;
|
||||
int dest_port = 0;
|
||||
int sync_dev = 0;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
if (omap_request_dma(mcbsp->dma_tx_sync, "McBSP TX",
|
||||
omap_mcbsp_tx_dma_callback,
|
||||
mcbsp,
|
||||
&dma_tx_ch)) {
|
||||
dev_err(mcbsp->dev, " Unable to request DMA channel for "
|
||||
"McBSP%d TX. Trying IRQ based TX\n",
|
||||
mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
mcbsp->dma_tx_lch = dma_tx_ch;
|
||||
|
||||
dev_err(mcbsp->dev, "McBSP%d TX DMA on channel %d\n", mcbsp->id,
|
||||
dma_tx_ch);
|
||||
|
||||
init_completion(&mcbsp->tx_dma_completion);
|
||||
|
||||
if (cpu_class_is_omap1()) {
|
||||
src_port = OMAP_DMA_PORT_TIPB;
|
||||
dest_port = OMAP_DMA_PORT_EMIFF;
|
||||
}
|
||||
if (cpu_class_is_omap2())
|
||||
sync_dev = mcbsp->dma_tx_sync;
|
||||
|
||||
omap_set_dma_transfer_params(mcbsp->dma_tx_lch,
|
||||
OMAP_DMA_DATA_TYPE_S16,
|
||||
length >> 1, 1,
|
||||
OMAP_DMA_SYNC_ELEMENT,
|
||||
sync_dev, 0);
|
||||
|
||||
omap_set_dma_dest_params(mcbsp->dma_tx_lch,
|
||||
src_port,
|
||||
OMAP_DMA_AMODE_CONSTANT,
|
||||
mcbsp->phys_base + OMAP_MCBSP_REG_DXR1,
|
||||
0, 0);
|
||||
|
||||
omap_set_dma_src_params(mcbsp->dma_tx_lch,
|
||||
dest_port,
|
||||
OMAP_DMA_AMODE_POST_INC,
|
||||
buffer,
|
||||
0, 0);
|
||||
|
||||
omap_start_dma(mcbsp->dma_tx_lch);
|
||||
wait_for_completion(&mcbsp->tx_dma_completion);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_xmit_buffer);
|
||||
|
||||
int omap_mcbsp_recv_buffer(unsigned int id, dma_addr_t buffer,
|
||||
unsigned int length)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
int dma_rx_ch;
|
||||
int src_port = 0;
|
||||
int dest_port = 0;
|
||||
int sync_dev = 0;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return -ENODEV;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
if (omap_request_dma(mcbsp->dma_rx_sync, "McBSP RX",
|
||||
omap_mcbsp_rx_dma_callback,
|
||||
mcbsp,
|
||||
&dma_rx_ch)) {
|
||||
dev_err(mcbsp->dev, "Unable to request DMA channel for "
|
||||
"McBSP%d RX. Trying IRQ based RX\n",
|
||||
mcbsp->id);
|
||||
return -EAGAIN;
|
||||
}
|
||||
mcbsp->dma_rx_lch = dma_rx_ch;
|
||||
|
||||
dev_err(mcbsp->dev, "McBSP%d RX DMA on channel %d\n", mcbsp->id,
|
||||
dma_rx_ch);
|
||||
|
||||
init_completion(&mcbsp->rx_dma_completion);
|
||||
|
||||
if (cpu_class_is_omap1()) {
|
||||
src_port = OMAP_DMA_PORT_TIPB;
|
||||
dest_port = OMAP_DMA_PORT_EMIFF;
|
||||
}
|
||||
if (cpu_class_is_omap2())
|
||||
sync_dev = mcbsp->dma_rx_sync;
|
||||
|
||||
omap_set_dma_transfer_params(mcbsp->dma_rx_lch,
|
||||
OMAP_DMA_DATA_TYPE_S16,
|
||||
length >> 1, 1,
|
||||
OMAP_DMA_SYNC_ELEMENT,
|
||||
sync_dev, 0);
|
||||
|
||||
omap_set_dma_src_params(mcbsp->dma_rx_lch,
|
||||
src_port,
|
||||
OMAP_DMA_AMODE_CONSTANT,
|
||||
mcbsp->phys_base + OMAP_MCBSP_REG_DRR1,
|
||||
0, 0);
|
||||
|
||||
omap_set_dma_dest_params(mcbsp->dma_rx_lch,
|
||||
dest_port,
|
||||
OMAP_DMA_AMODE_POST_INC,
|
||||
buffer,
|
||||
0, 0);
|
||||
|
||||
omap_start_dma(mcbsp->dma_rx_lch);
|
||||
wait_for_completion(&mcbsp->rx_dma_completion);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_recv_buffer);
|
||||
|
||||
/*
|
||||
* SPI wrapper.
|
||||
* Since SPI setup is much simpler than the generic McBSP one,
|
||||
* this wrapper just need an omap_mcbsp_spi_cfg structure as an input.
|
||||
* Once this is done, you can call omap_mcbsp_start().
|
||||
*/
|
||||
void omap_mcbsp_set_spi_mode(unsigned int id,
|
||||
const struct omap_mcbsp_spi_cfg *spi_cfg)
|
||||
{
|
||||
struct omap_mcbsp *mcbsp;
|
||||
struct omap_mcbsp_reg_cfg mcbsp_cfg;
|
||||
|
||||
if (!omap_mcbsp_check_valid_id(id)) {
|
||||
printk(KERN_ERR "%s: Invalid id (%d)\n", __func__, id + 1);
|
||||
return;
|
||||
}
|
||||
mcbsp = id_to_mcbsp_ptr(id);
|
||||
|
||||
memset(&mcbsp_cfg, 0, sizeof(struct omap_mcbsp_reg_cfg));
|
||||
|
||||
/* SPI has only one frame */
|
||||
mcbsp_cfg.rcr1 |= (RWDLEN1(spi_cfg->word_length) | RFRLEN1(0));
|
||||
mcbsp_cfg.xcr1 |= (XWDLEN1(spi_cfg->word_length) | XFRLEN1(0));
|
||||
|
||||
/* Clock stop mode */
|
||||
if (spi_cfg->clk_stp_mode == OMAP_MCBSP_CLK_STP_MODE_NO_DELAY)
|
||||
mcbsp_cfg.spcr1 |= (1 << 12);
|
||||
else
|
||||
mcbsp_cfg.spcr1 |= (3 << 11);
|
||||
|
||||
/* Set clock parities */
|
||||
if (spi_cfg->rx_clock_polarity == OMAP_MCBSP_CLK_RISING)
|
||||
mcbsp_cfg.pcr0 |= CLKRP;
|
||||
else
|
||||
mcbsp_cfg.pcr0 &= ~CLKRP;
|
||||
|
||||
if (spi_cfg->tx_clock_polarity == OMAP_MCBSP_CLK_RISING)
|
||||
mcbsp_cfg.pcr0 &= ~CLKXP;
|
||||
else
|
||||
mcbsp_cfg.pcr0 |= CLKXP;
|
||||
|
||||
/* Set SCLKME to 0 and CLKSM to 1 */
|
||||
mcbsp_cfg.pcr0 &= ~SCLKME;
|
||||
mcbsp_cfg.srgr2 |= CLKSM;
|
||||
|
||||
/* Set FSXP */
|
||||
if (spi_cfg->fsx_polarity == OMAP_MCBSP_FS_ACTIVE_HIGH)
|
||||
mcbsp_cfg.pcr0 &= ~FSXP;
|
||||
else
|
||||
mcbsp_cfg.pcr0 |= FSXP;
|
||||
|
||||
if (spi_cfg->spi_mode == OMAP_MCBSP_SPI_MASTER) {
|
||||
mcbsp_cfg.pcr0 |= CLKXM;
|
||||
mcbsp_cfg.srgr1 |= CLKGDV(spi_cfg->clk_div - 1);
|
||||
mcbsp_cfg.pcr0 |= FSXM;
|
||||
mcbsp_cfg.srgr2 &= ~FSGM;
|
||||
mcbsp_cfg.xcr2 |= XDATDLY(1);
|
||||
mcbsp_cfg.rcr2 |= RDATDLY(1);
|
||||
} else {
|
||||
mcbsp_cfg.pcr0 &= ~CLKXM;
|
||||
mcbsp_cfg.srgr1 |= CLKGDV(1);
|
||||
mcbsp_cfg.pcr0 &= ~FSXM;
|
||||
mcbsp_cfg.xcr2 &= ~XDATDLY(3);
|
||||
mcbsp_cfg.rcr2 &= ~RDATDLY(3);
|
||||
}
|
||||
|
||||
mcbsp_cfg.xcr2 &= ~XPHASE;
|
||||
mcbsp_cfg.rcr2 &= ~RPHASE;
|
||||
|
||||
omap_mcbsp_config(id, &mcbsp_cfg);
|
||||
}
|
||||
EXPORT_SYMBOL(omap_mcbsp_set_spi_mode);
|
||||
|
||||
#ifdef CONFIG_ARCH_OMAP3
|
||||
#define max_thres(m) (mcbsp->pdata->buffer_size)
|
||||
#define valid_threshold(m, val) ((val) <= max_thres(m))
|
||||
@ -1833,8 +1277,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
|
||||
spin_lock_init(&mcbsp->lock);
|
||||
mcbsp->id = id + 1;
|
||||
mcbsp->free = true;
|
||||
mcbsp->dma_tx_lch = -1;
|
||||
mcbsp->dma_rx_lch = -1;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "mpu");
|
||||
if (!res) {
|
||||
@ -1860,9 +1302,6 @@ static int __devinit omap_mcbsp_probe(struct platform_device *pdev)
|
||||
else
|
||||
mcbsp->phys_dma_base = res->start;
|
||||
|
||||
/* Default I/O is IRQ based */
|
||||
mcbsp->io_type = OMAP_MCBSP_IRQ_IO;
|
||||
|
||||
mcbsp->tx_irq = platform_get_irq_byname(pdev, "tx");
|
||||
mcbsp->rx_irq = platform_get_irq_byname(pdev, "rx");
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user