Commit 94ee0e37 authored by Tony Lindgren's avatar Tony Lindgren

ARM: OMAP: Sync board specific files with linux-omap

This patch syncs omap board specific files with linux-omap.

Patch consists mostly of driver updates done in linux-omap
tree for drivers not yet in mainline kernel.
Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent c90b79c8
...@@ -158,6 +158,10 @@ static struct map_desc ams_delta_io_desc[] __initdata = { ...@@ -158,6 +158,10 @@ static struct map_desc ams_delta_io_desc[] __initdata = {
} }
}; };
static struct omap_lcd_config ams_delta_lcd_config __initdata = {
.ctrl_name = "internal",
};
static struct omap_uart_config ams_delta_uart_config __initdata = { static struct omap_uart_config ams_delta_uart_config __initdata = {
.enabled_uarts = 1, .enabled_uarts = 1,
}; };
...@@ -169,6 +173,7 @@ static struct omap_usb_config ams_delta_usb_config __initdata = { ...@@ -169,6 +173,7 @@ static struct omap_usb_config ams_delta_usb_config __initdata = {
}; };
static struct omap_board_config_kernel ams_delta_config[] = { static struct omap_board_config_kernel ams_delta_config[] = {
{ OMAP_TAG_LCD, &ams_delta_lcd_config },
{ OMAP_TAG_UART, &ams_delta_uart_config }, { OMAP_TAG_UART, &ams_delta_uart_config },
{ OMAP_TAG_USB, &ams_delta_usb_config }, { OMAP_TAG_USB, &ams_delta_usb_config },
}; };
...@@ -199,6 +204,11 @@ static struct platform_device ams_delta_kp_device = { ...@@ -199,6 +204,11 @@ static struct platform_device ams_delta_kp_device = {
.resource = ams_delta_kp_resources, .resource = ams_delta_kp_resources,
}; };
static struct platform_device ams_delta_lcd_device = {
.name = "lcd_ams_delta",
.id = -1,
};
static struct platform_device ams_delta_led_device = { static struct platform_device ams_delta_led_device = {
.name = "ams-delta-led", .name = "ams-delta-led",
.id = -1 .id = -1
...@@ -206,6 +216,7 @@ static struct platform_device ams_delta_led_device = { ...@@ -206,6 +216,7 @@ static struct platform_device ams_delta_led_device = {
static struct platform_device *ams_delta_devices[] __initdata = { static struct platform_device *ams_delta_devices[] __initdata = {
&ams_delta_kp_device, &ams_delta_kp_device,
&ams_delta_lcd_device,
&ams_delta_led_device, &ams_delta_led_device,
}; };
......
...@@ -139,6 +139,66 @@ static struct platform_device h2_nor_device = { ...@@ -139,6 +139,66 @@ static struct platform_device h2_nor_device = {
.resource = &h2_nor_resource, .resource = &h2_nor_resource,
}; };
#if 0 /* REVISIT: Enable when nand_platform_data is applied */
static struct mtd_partition h2_nand_partitions[] = {
#if 0
/* REVISIT: enable these partitions if you make NAND BOOT
* work on your H2 (rev C or newer); published versions of
* x-load only support P2 and H3.
*/
{
.name = "xloader",
.offset = 0,
.size = 64 * 1024,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
{
.name = "bootloader",
.offset = MTDPART_OFS_APPEND,
.size = 256 * 1024,
.mask_flags = MTD_WRITEABLE, /* force read-only */
},
{
.name = "params",
.offset = MTDPART_OFS_APPEND,
.size = 192 * 1024,
},
{
.name = "kernel",
.offset = MTDPART_OFS_APPEND,
.size = 2 * SZ_1M,
},
#endif
{
.name = "filesystem",
.size = MTDPART_SIZ_FULL,
.offset = MTDPART_OFS_APPEND,
},
};
/* dip switches control NAND chip access: 8 bit, 16 bit, or neither */
static struct nand_platform_data h2_nand_data = {
.options = NAND_SAMSUNG_LP_OPTIONS,
.parts = h2_nand_partitions,
.nr_parts = ARRAY_SIZE(h2_nand_partitions),
};
static struct resource h2_nand_resource = {
.flags = IORESOURCE_MEM,
};
static struct platform_device h2_nand_device = {
.name = "omapnand",
.id = 0,
.dev = {
.platform_data = &h2_nand_data,
},
.num_resources = 1,
.resource = &h2_nand_resource,
};
#endif
static struct resource h2_smc91x_resources[] = { static struct resource h2_smc91x_resources[] = {
[0] = { [0] = {
.start = OMAP1610_ETHR_START, /* Physical */ .start = OMAP1610_ETHR_START, /* Physical */
...@@ -218,11 +278,15 @@ static struct resource h2_irda_resources[] = { ...@@ -218,11 +278,15 @@ static struct resource h2_irda_resources[] = {
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
static u64 irda_dmamask = 0xffffffff;
static struct platform_device h2_irda_device = { static struct platform_device h2_irda_device = {
.name = "omapirda", .name = "omapirda",
.id = 0, .id = 0,
.dev = { .dev = {
.platform_data = &h2_irda_data, .platform_data = &h2_irda_data,
.dma_mask = &irda_dmamask,
}, },
.num_resources = ARRAY_SIZE(h2_irda_resources), .num_resources = ARRAY_SIZE(h2_irda_resources),
.resource = h2_irda_resources, .resource = h2_irda_resources,
...@@ -270,6 +334,7 @@ static struct platform_device h2_mcbsp1_device = { ...@@ -270,6 +334,7 @@ static struct platform_device h2_mcbsp1_device = {
static struct platform_device *h2_devices[] __initdata = { static struct platform_device *h2_devices[] __initdata = {
&h2_nor_device, &h2_nor_device,
//&h2_nand_device,
&h2_smc91x_device, &h2_smc91x_device,
&h2_irda_device, &h2_irda_device,
&h2_kp_device, &h2_kp_device,
...@@ -333,6 +398,13 @@ static struct omap_board_config_kernel h2_config[] = { ...@@ -333,6 +398,13 @@ static struct omap_board_config_kernel h2_config[] = {
{ OMAP_TAG_LCD, &h2_lcd_config }, { OMAP_TAG_LCD, &h2_lcd_config },
}; };
#define H2_NAND_RB_GPIO_PIN 62
static int h2_nand_dev_ready(struct nand_platform_data *data)
{
return omap_get_gpio_datain(H2_NAND_RB_GPIO_PIN);
}
static void __init h2_init(void) static void __init h2_init(void)
{ {
/* Here we assume the NOR boot config: NOR on CS3 (possibly swapped /* Here we assume the NOR boot config: NOR on CS3 (possibly swapped
...@@ -347,6 +419,13 @@ static void __init h2_init(void) ...@@ -347,6 +419,13 @@ static void __init h2_init(void)
h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys(); h2_nor_resource.end = h2_nor_resource.start = omap_cs3_phys();
h2_nor_resource.end += SZ_32M - 1; h2_nor_resource.end += SZ_32M - 1;
#if 0 /* REVISIT: Enable when nand_platform_data is applied */
h2_nand_resource.end = h2_nand_resource.start = OMAP_CS2B_PHYS;
h2_nand_resource.end += SZ_4K - 1;
if (!(omap_request_gpio(H2_NAND_RB_GPIO_PIN)))
h2_nand_data.dev_ready = h2_nand_dev_ready;
#endif
omap_cfg_reg(L3_1610_FLASH_CS2B_OE); omap_cfg_reg(L3_1610_FLASH_CS2B_OE);
omap_cfg_reg(M8_1610_FLASH_CS2B_WE); omap_cfg_reg(M8_1610_FLASH_CS2B_WE);
......
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
#include <asm/arch/keypad.h> #include <asm/arch/keypad.h>
#include <asm/arch/dma.h> #include <asm/arch/dma.h>
#include <asm/arch/common.h> #include <asm/arch/common.h>
#include <asm/arch/mcbsp.h>
#include <asm/arch/omap-alsa.h>
extern int omap_gpio_init(void); extern int omap_gpio_init(void);
...@@ -349,11 +351,14 @@ static struct resource h3_irda_resources[] = { ...@@ -349,11 +351,14 @@ static struct resource h3_irda_resources[] = {
}, },
}; };
static u64 irda_dmamask = 0xffffffff;
static struct platform_device h3_irda_device = { static struct platform_device h3_irda_device = {
.name = "omapirda", .name = "omapirda",
.id = 0, .id = 0,
.dev = { .dev = {
.platform_data = &h3_irda_data, .platform_data = &h3_irda_data,
.dma_mask = &irda_dmamask,
}, },
.num_resources = ARRAY_SIZE(h3_irda_resources), .num_resources = ARRAY_SIZE(h3_irda_resources),
.resource = h3_irda_resources, .resource = h3_irda_resources,
...@@ -364,6 +369,41 @@ static struct platform_device h3_lcd_device = { ...@@ -364,6 +369,41 @@ static struct platform_device h3_lcd_device = {
.id = -1, .id = -1,
}; };
static struct omap_mcbsp_reg_cfg mcbsp_regs = {
.spcr2 = FREE | FRST | GRST | XRST | XINTM(3),
.spcr1 = RINTM(3) | RRST,
.rcr2 = RPHASE | RFRLEN2(OMAP_MCBSP_WORD_8) |
RWDLEN2(OMAP_MCBSP_WORD_16) | RDATDLY(1),
.rcr1 = RFRLEN1(OMAP_MCBSP_WORD_8) | RWDLEN1(OMAP_MCBSP_WORD_16),
.xcr2 = XPHASE | XFRLEN2(OMAP_MCBSP_WORD_8) |
XWDLEN2(OMAP_MCBSP_WORD_16) | XDATDLY(1) | XFIG,
.xcr1 = XFRLEN1(OMAP_MCBSP_WORD_8) | XWDLEN1(OMAP_MCBSP_WORD_16),
.srgr1 = FWID(15),
.srgr2 = GSYNC | CLKSP | FSGM | FPER(31),
.pcr0 = CLKRM | SCLKME | FSXP | FSRP | CLKXP | CLKRP,
//.pcr0 = CLKXP | CLKRP, /* mcbsp: slave */
};
static struct omap_alsa_codec_config alsa_config = {
.name = "H3 TSC2101",
.mcbsp_regs_alsa = &mcbsp_regs,
.codec_configure_dev = NULL, // tsc2101_configure,
.codec_set_samplerate = NULL, // tsc2101_set_samplerate,
.codec_clock_setup = NULL, // tsc2101_clock_setup,
.codec_clock_on = NULL, // tsc2101_clock_on,
.codec_clock_off = NULL, // tsc2101_clock_off,
.get_default_samplerate = NULL, // tsc2101_get_default_samplerate,
};
static struct platform_device h3_mcbsp1_device = {
.name = "omap_alsa_mcbsp",
.id = 1,
.dev = {
.platform_data = &alsa_config,
},
};
static struct platform_device *devices[] __initdata = { static struct platform_device *devices[] __initdata = {
&nor_device, &nor_device,
&nand_device, &nand_device,
...@@ -372,6 +412,7 @@ static struct platform_device *devices[] __initdata = { ...@@ -372,6 +412,7 @@ static struct platform_device *devices[] __initdata = {
&h3_irda_device, &h3_irda_device,
&h3_kp_device, &h3_kp_device,
&h3_lcd_device, &h3_lcd_device,
&h3_mcbsp1_device,
}; };
static struct omap_usb_config h3_usb_config __initdata = { static struct omap_usb_config h3_usb_config __initdata = {
......
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
#include <asm/arch/aic23.h> #include <asm/arch/aic23.h>
#include <asm/arch/gpio.h> #include <asm/arch/gpio.h>
#include "../plat-omap/dsp/dsp_common.h"
static void __init omap_nokia770_init_irq(void) static void __init omap_nokia770_init_irq(void)
{ {
/* On Nokia 770, the SleepX signal is masked with an /* On Nokia 770, the SleepX signal is masked with an
...@@ -153,6 +155,7 @@ static struct omap_board_config_kernel nokia770_config[] = { ...@@ -153,6 +155,7 @@ static struct omap_board_config_kernel nokia770_config[] = {
{ OMAP_TAG_MMC, &nokia770_mmc_config }, { OMAP_TAG_MMC, &nokia770_mmc_config },
}; };
#if defined(CONFIG_OMAP_DSP)
/* /*
* audio power control * audio power control
*/ */
...@@ -183,7 +186,7 @@ static void nokia770_audio_pwr_up(void) ...@@ -183,7 +186,7 @@ static void nokia770_audio_pwr_up(void)
clk_enable(dspxor_ck); clk_enable(dspxor_ck);
/* Turn on codec */ /* Turn on codec */
tlv320aic23_power_up(); aic23_power_up();
if (omap_get_gpio_datain(HEADPHONE_GPIO)) if (omap_get_gpio_datain(HEADPHONE_GPIO))
/* HP not connected, turn on amplifier */ /* HP not connected, turn on amplifier */
...@@ -197,7 +200,7 @@ static void codec_delayed_power_down(struct work_struct *work) ...@@ -197,7 +200,7 @@ static void codec_delayed_power_down(struct work_struct *work)
{ {
down(&audio_pwr_sem); down(&audio_pwr_sem);
if (audio_pwr_state == -1) if (audio_pwr_state == -1)
tlv320aic23_power_down(); aic23_power_down();
clk_disable(dspxor_ck); clk_disable(dspxor_ck);
up(&audio_pwr_sem); up(&audio_pwr_sem);
} }
...@@ -213,7 +216,8 @@ static void nokia770_audio_pwr_down(void) ...@@ -213,7 +216,8 @@ static void nokia770_audio_pwr_down(void)
schedule_delayed_work(&codec_power_down_work, HZ / 20); /* 50ms */ schedule_delayed_work(&codec_power_down_work, HZ / 20); /* 50ms */
} }
void nokia770_audio_pwr_up_request(int stage) static int
nokia770_audio_pwr_up_request(struct dsp_kfunc_device *kdev, int stage)
{ {
down(&audio_pwr_sem); down(&audio_pwr_sem);
if (audio_pwr_state == -1) if (audio_pwr_state == -1)
...@@ -221,9 +225,11 @@ void nokia770_audio_pwr_up_request(int stage) ...@@ -221,9 +225,11 @@ void nokia770_audio_pwr_up_request(int stage)
/* force audio_pwr_state = 0, even if it was 1. */ /* force audio_pwr_state = 0, even if it was 1. */
audio_pwr_state = 0; audio_pwr_state = 0;
up(&audio_pwr_sem); up(&audio_pwr_sem);
return 0;
} }
void nokia770_audio_pwr_down_request(int stage) static int
nokia770_audio_pwr_down_request(struct dsp_kfunc_device *kdev, int stage)
{ {
down(&audio_pwr_sem); down(&audio_pwr_sem);
switch (stage) { switch (stage) {
...@@ -239,7 +245,38 @@ void nokia770_audio_pwr_down_request(int stage) ...@@ -239,7 +245,38 @@ void nokia770_audio_pwr_down_request(int stage)
break; break;
} }
up(&audio_pwr_sem); up(&audio_pwr_sem);
return 0;
}
static struct dsp_kfunc_device nokia770_audio_device = {
.name = "audio",
.type = DSP_KFUNC_DEV_TYPE_AUDIO,
.enable = nokia770_audio_pwr_up_request,
.disable = nokia770_audio_pwr_down_request,
};
static __init int omap_dsp_init(void)
{
int ret;
dspxor_ck = clk_get(0, "dspxor_ck");
if (IS_ERR(dspxor_ck)) {
printk(KERN_ERR "couldn't acquire dspxor_ck\n");
return PTR_ERR(dspxor_ck);
}
ret = dsp_kfunc_device_register(&nokia770_audio_device);
if (ret) {
printk(KERN_ERR
"KFUNC device registration faild: %s\n",
nokia770_audio_device.name);
goto out;
}
return 0;
out:
return ret;
} }
#endif /* CONFIG_OMAP_DSP */
static void __init omap_nokia770_init(void) static void __init omap_nokia770_init(void)
{ {
...@@ -251,9 +288,7 @@ static void __init omap_nokia770_init(void) ...@@ -251,9 +288,7 @@ static void __init omap_nokia770_init(void)
omap_board_config = nokia770_config; omap_board_config = nokia770_config;
omap_board_config_size = ARRAY_SIZE(nokia770_config); omap_board_config_size = ARRAY_SIZE(nokia770_config);
omap_serial_init(); omap_serial_init();
omap_dsp_audio_pwr_up_request = nokia770_audio_pwr_up_request; omap_dsp_init();
omap_dsp_audio_pwr_down_request = nokia770_audio_pwr_down_request;
dspxor_ck = clk_get(0, "dspxor_ck");
} }
static void __init omap_nokia770_map_io(void) static void __init omap_nokia770_map_io(void)
......
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/interrupt.h>
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
......
...@@ -321,116 +321,6 @@ static struct tsc2102_config palmte_tsc2102_config = { ...@@ -321,116 +321,6 @@ static struct tsc2102_config palmte_tsc2102_config = {
.alsa_config = &palmte_alsa_config, .alsa_config = &palmte_alsa_config,
}; };
static struct omap_mcbsp_reg_cfg palmte_mcbsp1_regs = {
.spcr2 = FRST | GRST | XRST | XINTM(3),
.xcr2 = XDATDLY(1) | XFIG,
.xcr1 = XWDLEN1(OMAP_MCBSP_WORD_32),
.pcr0 = SCLKME | FSXP | CLKXP,
};
static struct omap_alsa_codec_config palmte_alsa_config = {
.name = "TSC2102 audio",
.mcbsp_regs_alsa = &palmte_mcbsp1_regs,
.codec_configure_dev = NULL, /* tsc2102_configure, */
.codec_set_samplerate = NULL, /* tsc2102_set_samplerate, */
.codec_clock_setup = NULL, /* tsc2102_clock_setup, */
.codec_clock_on = NULL, /* tsc2102_clock_on, */
.codec_clock_off = NULL, /* tsc2102_clock_off, */
.get_default_samplerate = NULL, /* tsc2102_get_default_samplerate, */
};
#ifdef CONFIG_APM
/*
* Values measured in 10 minute intervals averaged over 10 samples.
* May differ slightly from device to device but should be accurate
* enough to give basic idea of battery life left and trigger
* potential alerts.
*/
static const int palmte_battery_sample[] = {
2194, 2157, 2138, 2120,
2104, 2089, 2075, 2061,
2048, 2038, 2026, 2016,
2008, 1998, 1989, 1980,
1970, 1958, 1945, 1928,
1910, 1888, 1860, 1827,
1791, 1751, 1709, 1656,
};
#define INTERVAL 10
#define BATTERY_HIGH_TRESHOLD 66
#define BATTERY_LOW_TRESHOLD 33
static void palmte_get_power_status(struct apm_power_info *info, int *battery)
{
int charging, batt, hi, lo, mid;
charging = !omap_get_gpio_datain(PALMTE_DC_GPIO);
batt = battery[0];
if (charging)
batt -= 60;
hi = ARRAY_SIZE(palmte_battery_sample);
lo = 0;
info->battery_flag = 0;
info->units = APM_UNITS_MINS;
if (batt > palmte_battery_sample[lo]) {
info->battery_life = 100;
info->time = INTERVAL * ARRAY_SIZE(palmte_battery_sample);
} else if (batt <= palmte_battery_sample[hi - 1]) {
info->battery_life = 0;
info->time = 0;
} else {
while (hi > lo + 1) {
mid = (hi + lo) >> 2;
if (batt <= palmte_battery_sample[mid])
lo = mid;
else
hi = mid;
}
mid = palmte_battery_sample[lo] - palmte_battery_sample[hi];
hi = palmte_battery_sample[lo] - batt;
info->battery_life = 100 - (100 * lo + 100 * hi / mid) /
ARRAY_SIZE(palmte_battery_sample);
info->time = INTERVAL * (ARRAY_SIZE(palmte_battery_sample) -
lo) - INTERVAL * hi / mid;
}
if (charging) {
info->ac_line_status = APM_AC_ONLINE;
info->battery_status = APM_BATTERY_STATUS_CHARGING;
info->battery_flag |= APM_BATTERY_FLAG_CHARGING;
} else {
info->ac_line_status = APM_AC_OFFLINE;
if (info->battery_life > BATTERY_HIGH_TRESHOLD)
info->battery_status = APM_BATTERY_STATUS_HIGH;
else if (info->battery_life > BATTERY_LOW_TRESHOLD)
info->battery_status = APM_BATTERY_STATUS_LOW;
else
info->battery_status = APM_BATTERY_STATUS_CRITICAL;
}
if (info->battery_life > BATTERY_HIGH_TRESHOLD)
info->battery_flag |= APM_BATTERY_FLAG_HIGH;
else if (info->battery_life > BATTERY_LOW_TRESHOLD)
info->battery_flag |= APM_BATTERY_FLAG_LOW;
else
info->battery_flag |= APM_BATTERY_FLAG_CRITICAL;
}
#else
#define palmte_get_power_status NULL
#endif
static struct tsc2102_config palmte_tsc2102_config = {
.use_internal = 0,
.monitor = TSC_BAT1 | TSC_AUX | TSC_TEMP,
.temp_at25c = { 2200, 2615 },
.apm_report = palmte_get_power_status,
.alsa_config = &palmte_alsa_config,
};
static struct omap_board_config_kernel palmte_config[] = { static struct omap_board_config_kernel palmte_config[] = {
{ OMAP_TAG_USB, &palmte_usb_config }, { OMAP_TAG_USB, &palmte_usb_config },
{ OMAP_TAG_MMC, &palmte_mmc_config }, { OMAP_TAG_MMC, &palmte_mmc_config },
...@@ -449,17 +339,6 @@ static struct spi_board_info palmte_spi_info[] __initdata = { ...@@ -449,17 +339,6 @@ static struct spi_board_info palmte_spi_info[] __initdata = {
}, },
}; };
static struct spi_board_info palmte_spi_info[] __initdata = {
{
.modalias = "tsc2102",
.bus_num = 2, /* uWire (officially) */
.chip_select = 0, /* As opposed to 3 */
.irq = OMAP_GPIO_IRQ(PALMTE_PINTDAV_GPIO),
.platform_data = &palmte_tsc2102_config,
.max_speed_hz = 8000000,
},
};
/* Periodically check for changes on important input pins */ /* Periodically check for changes on important input pins */
struct timer_list palmte_pin_timer; struct timer_list palmte_pin_timer;
int prev_power, prev_headphones; int prev_power, prev_headphones;
...@@ -539,8 +418,6 @@ static void __init omap_palmte_init(void) ...@@ -539,8 +418,6 @@ static void __init omap_palmte_init(void)
spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info)); spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
spi_register_board_info(palmte_spi_info, ARRAY_SIZE(palmte_spi_info));
omap_serial_init(); omap_serial_init();
palmte_gpio_setup(); palmte_gpio_setup();
} }
......
...@@ -235,7 +235,7 @@ static struct notifier_block panic_block = { ...@@ -235,7 +235,7 @@ static struct notifier_block panic_block = {
static int __init voiceblue_setup(void) static int __init voiceblue_setup(void)
{ {
/* Setup panic notifier */ /* Setup panic notifier */
notifier_chain_register(&panic_notifier_list, &panic_block); atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
return 0; return 0;
} }
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/err.h>
#include <linux/clk.h>
#include <asm/hardware.h> #include <asm/hardware.h>
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -36,10 +38,14 @@ ...@@ -36,10 +38,14 @@
#include <asm/arch/keypad.h> #include <asm/arch/keypad.h>
#include <asm/arch/menelaus.h> #include <asm/arch/menelaus.h>
#include <asm/arch/dma.h> #include <asm/arch/dma.h>
#include <asm/arch/gpmc.h>
#include "prcm-regs.h" #include "prcm-regs.h"
#include <asm/io.h> #include <asm/io.h>
#define H4_FLASH_CS 0
#define H4_SMC91X_CS 1
static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 }; static unsigned int row_gpios[6] = { 88, 89, 124, 11, 6, 96 };
static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 }; static unsigned int col_gpios[7] = { 90, 91, 100, 36, 12, 97, 98 };
...@@ -116,8 +122,6 @@ static struct flash_platform_data h4_flash_data = { ...@@ -116,8 +122,6 @@ static struct flash_platform_data h4_flash_data = {
}; };
static struct resource h4_flash_resource = { static struct resource h4_flash_resource = {
.start = H4_CS0_BASE,
.end = H4_CS0_BASE + SZ_64M - 1,
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}; };
...@@ -133,6 +137,7 @@ static struct platform_device h4_flash_device = { ...@@ -133,6 +137,7 @@ static struct platform_device h4_flash_device = {
/* Select between the IrDA and aGPS module /* Select between the IrDA and aGPS module
*/ */
#if defined(CONFIG_OMAP_IR) || defined(CONFIG_OMAP_IR_MODULE)
static int h4_select_irda(struct device *dev, int state) static int h4_select_irda(struct device *dev, int state)
{ {
unsigned char expa; unsigned char expa;
...@@ -192,6 +197,10 @@ static int h4_transceiver_mode(struct device *dev, int mode) ...@@ -192,6 +197,10 @@ static int h4_transceiver_mode(struct device *dev, int mode)
return 0; return 0;
} }
#else
static int h4_select_irda(struct device *dev, int state) { return 0; }
static int h4_transceiver_mode(struct device *dev, int mode) { return 0; }
#endif
static struct omap_irda_config h4_irda_data = { static struct omap_irda_config h4_irda_data = {
.transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE, .transceiver_cap = IR_SIRMODE | IR_MIRMODE | IR_FIRMODE,
...@@ -253,16 +262,80 @@ static struct platform_device *h4_devices[] __initdata = { ...@@ -253,16 +262,80 @@ static struct platform_device *h4_devices[] __initdata = {
&h4_lcd_device, &h4_lcd_device,
}; };
/* 2420 Sysboot setup (2430 is different) */
static u32 get_sysboot_value(void)
{
return (omap_readl(OMAP242X_CONTROL_STATUS) & 0xFFF);
}
/* FIXME: This function should be moved to some other file, gpmc.c? */
/* H4-2420's always used muxed mode, H4-2422's always use non-muxed
*
* Note: OMAP-GIT doesn't correctly do is_cpu_omap2422 and is_cpu_omap2423
* correctly. The macro needs to look at production_id not just hawkeye.
*/
static u32 is_gpmc_muxed(void)
{
u32 mux;
mux = get_sysboot_value();
if ((mux & 0xF) == 0xd)
return 1; /* NAND config (could be either) */
if (mux & 0x2) /* if mux'ed */
return 1;
else
return 0;
}
static inline void __init h4_init_debug(void) static inline void __init h4_init_debug(void)
{ {
int eth_cs;
unsigned long cs_mem_base;
unsigned int muxed, rate;
struct clk *l3ck;
eth_cs = H4_SMC91X_CS;
l3ck = clk_get(NULL, "core_l3_ck");
if (IS_ERR(l3ck))
rate = 100000000;
else
rate = clk_get_rate(l3ck);
if (is_gpmc_muxed())
muxed = 0x200;
else
muxed = 0;
/* Make sure CS1 timings are correct */ /* Make sure CS1 timings are correct */
GPMC_CONFIG1_1 = 0x00011200; gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG1,
GPMC_CONFIG2_1 = 0x001f1f01; 0x00011000 | muxed);
GPMC_CONFIG3_1 = 0x00080803;
GPMC_CONFIG4_1 = 0x1c091c09; if (rate >= 160000000) {
GPMC_CONFIG5_1 = 0x041f1f1f; gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f01);
GPMC_CONFIG6_1 = 0x000004c4; gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080803);
GPMC_CONFIG7_1 = 0x00000f40 | (0x08000000 >> 24); gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1c0b1c0a);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
} else if (rate >= 130000000) {
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x041f1F1F);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000004C4);
} else {/* rate = 100000000 */
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG2, 0x001f1f00);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG3, 0x00080802);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG4, 0x1C091C09);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG5, 0x031A1F1F);
gpmc_cs_write_reg(eth_cs, GPMC_CS_CONFIG6, 0x000003C2);
}
if (gpmc_cs_request(eth_cs, SZ_16M, &cs_mem_base) < 0) {
printk(KERN_ERR "Failed to request GPMC mem for smc91x\n");
return;
}
udelay(100); udelay(100);
omap_cfg_reg(M15_24XX_GPIO92); omap_cfg_reg(M15_24XX_GPIO92);
...@@ -270,11 +343,24 @@ static inline void __init h4_init_debug(void) ...@@ -270,11 +343,24 @@ static inline void __init h4_init_debug(void)
gpmc_cs_free(eth_cs); gpmc_cs_free(eth_cs);
} }
static void __init h4_init_flash(void)
{
unsigned long base;
if (gpmc_cs_request(H4_FLASH_CS, SZ_64M, &base) < 0) {
printk("Can't request GPMC CS for flash\n");
return;
}
h4_flash_resource.start = base;
h4_flash_resource.end = base + SZ_64M - 1;
}
static void __init omap_h4_init_irq(void) static void __init omap_h4_init_irq(void)
{ {
omap2_init_common_hw(); omap2_init_common_hw();
omap_init_irq(); omap_init_irq();
omap_gpio_init(); omap_gpio_init();
h4_init_flash();
} }
static struct omap_uart_config h4_uart_config __initdata = { static struct omap_uart_config h4_uart_config __initdata = {
...@@ -339,6 +425,72 @@ static struct omap_board_config_kernel h4_config[] = { ...@@ -339,6 +425,72 @@ static struct omap_board_config_kernel h4_config[] = {
{ OMAP_TAG_USB, &h4_usb_config }, { OMAP_TAG_USB, &h4_usb_config },
}; };
#ifdef CONFIG_MACH_OMAP_H4_TUSB
#include <linux/usb/musb.h>
static struct musb_hdrc_platform_data tusb_data = {
.mode = MUSB_OTG,
.min_power = 25, /* x2 = 50 mA drawn from VBUS as peripheral */
/* 1.8V supplied by Menelaus, other voltages supplied by VBAT;
* so no switching.
*/
};
static void __init tusb_evm_setup(void)
{
static char announce[] __initdata =
KERN_INFO "TUSB 6010 EVM\n";
int irq;
unsigned dmachan = 0;
/* There are at least 32 different combinations of boards that
* are loosely called "H4", with a 2420 ... different OMAP chip
* revisions (with pin mux changes for DMAREQ, GPMC errata, etc),
* modifications of the CPU board, mainboard, EVM, TUSB etc.
* Plus omap2422, omap2423, etc.
*
* So you might need to tweak this setup to make the TUSB EVM
* behave on your particular setup ...
*/
/* Already set up: GPMC AD[0..15], CLK, nOE, nWE, nADV_ALE */
omap_cfg_reg(E2_GPMC_NCS2);
omap_cfg_reg(L2_GPMC_NCS7);
omap_cfg_reg(M1_GPMC_WAIT2);
switch ((system_rev >> 8) & 0x0f) {
case 0: /* ES 1.0 */
case 1: /* ES 2.0 */
/* Assume early board revision without optional ES2.0
* rework to swap J15 & AA10 so DMAREQ0 works
*/
omap_cfg_reg(AA10_242X_GPIO13);
irq = 13;
// omap_cfg_reg(J15_24XX_DMAREQ0);
break;
default:
/* Later Menelaus boards can support all 6 DMA request
* lines, at the price of boot flash A23-A26.
*/
omap_cfg_reg(J15_24XX_GPIO99);
irq = 99;
omap_cfg_reg(AA10_242X_DMAREQ0);
omap_cfg_reg(AA6_242X_DMAREQ1);
dmachan = (1 << 1) | (1 << 0);
break;
}
if (tusb6010_setup_interface(&tusb_data,
TUSB6010_REFCLK_24, /* waitpin */ 2,
/* async cs */ 2, /* sync cs */ 7,
irq, dmachan) == 0)
printk(announce);
}
#endif
static void __init omap_h4_init(void) static void __init omap_h4_init(void)
{ {
/* /*
...@@ -371,6 +523,14 @@ static void __init omap_h4_init(void) ...@@ -371,6 +523,14 @@ static void __init omap_h4_init(void)
omap_board_config = h4_config; omap_board_config = h4_config;
omap_board_config_size = ARRAY_SIZE(h4_config); omap_board_config_size = ARRAY_SIZE(h4_config);
omap_serial_init(); omap_serial_init();
/* smc91x, debug leds, ps/2, extra uarts */
h4_init_debug();
#ifdef CONFIG_MACH_OMAP_H4_TUSB
tusb_evm_setup();
#endif
} }
static void __init omap_h4_map_io(void) static void __init omap_h4_map_io(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment