Commit c0f607c6 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'omap-fixes-for-linus' of...

Merge branch 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6

* 'omap-fixes-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (26 commits)
  OMAP2 clock: dynamically allocate CPUFreq frequency table
  OMAP clock/CPUFreq: add clk_exit_cpufreq_table()
  OMAP2xxx OPP: clean up comments in OPP data
  OMAP2xxx clock: clk2xxx.c doesn't compile if CPUFREQ is enabled
  OMAP1 clock: remove __initdata from struct clk_functions to prevent crash
  OMAP1 clock: Add missing clocks for OMAP 7xx
  OMAP clock: remove incorrect EXPORT_SYMBOL()s
  OMAP3 clock: Add capability to change rate of dpll4_m5_ck
  OMAP3 clock: McBSP 2, 3, 4 functional clock parent is PER_96M_FCLK, not CORE_96M_FCLK
  OMAP3: clock: add clockdomains for UART1 & 2
  OMAP2420 IO mapping: move IVA mapping virtual address out of vmalloc space
  OMAP2xxx IO mapping: mark DSP mappings as being 2420-only
  ARM: OMAP3: PM: Fix the Invalid CM_CLKSTCTRL reg access.
  OMAP2: remove duplicated #include
  omap3: EVM: Choose OMAP_PACKAGE_CBB
  omap3: Fix booting if package is uninitialized
  omap3: add missing parentheses
  omap3: add missing parentheses
  omap2/3: ZOOM: Correcting key mapping for few keys
  omap2/3: make serial_in_override() address the right uart port
  ...
parents 598cace0 27dba4bc
...@@ -599,7 +599,7 @@ static struct clk i2c_ick = { ...@@ -599,7 +599,7 @@ static struct clk i2c_ick = {
static struct omap_clk omap_clks[] = { static struct omap_clk omap_clks[] = {
/* non-ULPD clocks */ /* non-ULPD clocks */
CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX), CLK(NULL, "ck_ref", &ck_ref, CK_16XX | CK_1510 | CK_310 | CK_7XX),
CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310), CLK(NULL, "ck_dpll1", &ck_dpll1, CK_16XX | CK_1510 | CK_310 | CK_7XX),
/* CK_GEN1 clocks */ /* CK_GEN1 clocks */
CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX), CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX), CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
...@@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = { ...@@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = {
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX), CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310), CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX), CLK(NULL, "dma_lcdfree_ck", &dma_lcdfree_ck, CK_16XX),
CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310), CLK(NULL, "api_ck", &api_ck.clk, CK_16XX | CK_1510 | CK_310 | CK_7XX),
CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310), CLK(NULL, "lb_ck", &lb_ck.clk, CK_1510 | CK_310),
CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX), CLK(NULL, "rhea1_ck", &rhea1_ck, CK_16XX),
CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX), CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
...@@ -658,6 +658,10 @@ static struct omap_clk omap_clks[] = { ...@@ -658,6 +658,10 @@ static struct omap_clk omap_clks[] = {
CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX), CLK("i2c_omap.1", "fck", &i2c_fck, CK_16XX | CK_1510 | CK_310 | CK_7XX),
CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX), CLK("i2c_omap.1", "ick", &i2c_ick, CK_16XX),
CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX), CLK("i2c_omap.1", "ick", &dummy_ck, CK_1510 | CK_310 | CK_7XX),
CLK("omap1_spi100k.1", "fck", &dummy_ck, CK_7XX),
CLK("omap1_spi100k.1", "ick", &dummy_ck, CK_7XX),
CLK("omap1_spi100k.2", "fck", &dummy_ck, CK_7XX),
CLK("omap1_spi100k.2", "ick", &dummy_ck, CK_7XX),
CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310), CLK("omap_uwire", "fck", &armxor_ck.clk, CK_16XX | CK_1510 | CK_310),
CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX), CLK("omap-mcbsp.1", "ick", &dspper_ck, CK_16XX),
CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310), CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
...@@ -674,7 +678,7 @@ static struct omap_clk omap_clks[] = { ...@@ -674,7 +678,7 @@ static struct omap_clk omap_clks[] = {
* init * init
*/ */
static struct clk_functions omap1_clk_functions __initdata = { static struct clk_functions omap1_clk_functions = {
.clk_enable = omap1_clk_enable, .clk_enable = omap1_clk_enable,
.clk_disable = omap1_clk_disable, .clk_disable = omap1_clk_disable,
.clk_round_rate = omap1_clk_round_rate, .clk_round_rate = omap1_clk_round_rate,
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/spi/spi.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -23,6 +24,7 @@ ...@@ -23,6 +24,7 @@
#include <plat/mux.h> #include <plat/mux.h>
#include <mach/gpio.h> #include <mach/gpio.h>
#include <plat/mmc.h> #include <plat/mmc.h>
#include <plat/omap7xx.h>
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
...@@ -196,6 +198,38 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data, ...@@ -196,6 +198,38 @@ void __init omap1_init_mmc(struct omap_mmc_platform_data **mmc_data,
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
/* OMAP7xx SPI support */
#if defined(CONFIG_SPI_OMAP_100K) || defined(CONFIG_SPI_OMAP_100K_MODULE)
struct platform_device omap_spi1 = {
.name = "omap1_spi100k",
.id = 1,
};
struct platform_device omap_spi2 = {
.name = "omap1_spi100k",
.id = 2,
};
static void omap_init_spi100k(void)
{
omap_spi1.dev.platform_data = ioremap(OMAP7XX_SPI1_BASE, 0x7ff);
if (omap_spi1.dev.platform_data)
platform_device_register(&omap_spi1);
omap_spi2.dev.platform_data = ioremap(OMAP7XX_SPI2_BASE, 0x7ff);
if (omap_spi2.dev.platform_data)
platform_device_register(&omap_spi2);
}
#else
static inline void omap_init_spi100k(void)
{
}
#endif
/*-------------------------------------------------------------------------*/
#if defined(CONFIG_OMAP_STI) #if defined(CONFIG_OMAP_STI)
#define OMAP1_STI_BASE 0xfffea000 #define OMAP1_STI_BASE 0xfffea000
...@@ -263,6 +297,7 @@ static int __init omap1_init_devices(void) ...@@ -263,6 +297,7 @@ static int __init omap1_init_devices(void)
omap_init_mbox(); omap_init_mbox();
omap_init_rtc(); omap_init_rtc();
omap_init_spi100k();
omap_init_sti(); omap_init_sti();
return 0; return 0;
......
...@@ -62,6 +62,14 @@ MUX_CFG_7XX("MMC_7XX_DAT0", 2, 17, 0, 16, 1, 0) ...@@ -62,6 +62,14 @@ MUX_CFG_7XX("MMC_7XX_DAT0", 2, 17, 0, 16, 1, 0)
/* I2C interface */ /* I2C interface */
MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0) MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 0, 0, 1, 0)
MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0) MUX_CFG_7XX("I2C_7XX_SDA", 5, 5, 0, 0, 1, 0)
/* SPI pins */
MUX_CFG_7XX("SPI_7XX_1", 6, 5, 4, 4, 1, 0)
MUX_CFG_7XX("SPI_7XX_2", 6, 9, 4, 8, 1, 0)
MUX_CFG_7XX("SPI_7XX_3", 6, 13, 4, 12, 1, 0)
MUX_CFG_7XX("SPI_7XX_4", 6, 17, 4, 16, 1, 0)
MUX_CFG_7XX("SPI_7XX_5", 8, 25, 0, 24, 0, 0)
MUX_CFG_7XX("SPI_7XX_6", 9, 5, 0, 4, 0, 0)
}; };
#define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins) #define OMAP7XX_PINS_SZ ARRAY_SIZE(omap7xx_pins)
#else #else
......
...@@ -80,6 +80,7 @@ config MACH_OVERO ...@@ -80,6 +80,7 @@ config MACH_OVERO
config MACH_OMAP3EVM config MACH_OMAP3EVM
bool "OMAP 3530 EVM board" bool "OMAP 3530 EVM board"
depends on ARCH_OMAP3 && ARCH_OMAP34XX depends on ARCH_OMAP3 && ARCH_OMAP34XX
select OMAP_PACKAGE_CBB
config MACH_OMAP3517EVM config MACH_OMAP3517EVM
bool "OMAP3517/ AM3517 EVM board" bool "OMAP3517/ AM3517 EVM board"
......
...@@ -63,21 +63,21 @@ static int board_keymap[] = { ...@@ -63,21 +63,21 @@ static int board_keymap[] = {
KEY(5, 1, KEY_H), KEY(5, 1, KEY_H),
KEY(5, 2, KEY_J), KEY(5, 2, KEY_J),
KEY(5, 3, KEY_F3), KEY(5, 3, KEY_F3),
KEY(5, 4, KEY_UNKNOWN),
KEY(5, 5, KEY_VOLUMEDOWN), KEY(5, 5, KEY_VOLUMEDOWN),
KEY(5, 6, KEY_M), KEY(5, 6, KEY_M),
KEY(5, 7, KEY_ENTER), KEY(5, 7, KEY_RIGHT),
KEY(6, 0, KEY_Q), KEY(6, 0, KEY_Q),
KEY(6, 1, KEY_A), KEY(6, 1, KEY_A),
KEY(6, 2, KEY_N), KEY(6, 2, KEY_N),
KEY(6, 3, KEY_BACKSPACE), KEY(6, 3, KEY_BACKSPACE),
KEY(6, 6, KEY_P), KEY(6, 6, KEY_P),
KEY(6, 7, KEY_SELECT), KEY(6, 7, KEY_UP),
KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */ KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */ KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */ KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */ KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
KEY(7, 5, KEY_RIGHT), KEY(7, 6, KEY_SELECT),
KEY(7, 6, KEY_UP),
KEY(7, 7, KEY_DOWN) KEY(7, 7, KEY_DOWN)
}; };
......
...@@ -449,40 +449,78 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate) ...@@ -449,40 +449,78 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
/* /*
* Walk PRCM rate table and fillout cpufreq freq_table * Walk PRCM rate table and fillout cpufreq freq_table
* XXX This should be replaced by an OPP layer in the near future
*/ */
static struct cpufreq_frequency_table freq_table[ARRAY_SIZE(rate_table)]; static struct cpufreq_frequency_table *freq_table;
void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table) void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
{ {
struct prcm_config *prcm; const struct prcm_config *prcm;
long sys_ck_rate;
int i = 0; int i = 0;
int tbl_sz = 0;
sys_ck_rate = clk_get_rate(sclk);
for (prcm = rate_table; prcm->mpu_speed; prcm++) { for (prcm = rate_table; prcm->mpu_speed; prcm++) {
if (!(prcm->flags & cpu_mask)) if (!(prcm->flags & cpu_mask))
continue; continue;
if (prcm->xtal_speed != sys_ck.rate) if (prcm->xtal_speed != sys_ck_rate)
continue; continue;
/* don't put bypass rates in table */ /* don't put bypass rates in table */
if (prcm->dpll_speed == prcm->xtal_speed) if (prcm->dpll_speed == prcm->xtal_speed)
continue; continue;
freq_table[i].index = i; tbl_sz++;
freq_table[i].frequency = prcm->mpu_speed / 1000;
i++;
} }
if (i == 0) { /*
printk(KERN_WARNING "%s: failed to initialize frequency " * XXX Ensure that we're doing what CPUFreq expects for this error
"table\n", __func__); * case and the following one
*/
if (tbl_sz == 0) {
pr_warning("%s: no matching entries in rate_table\n",
__func__);
return;
}
/* Include the CPUFREQ_TABLE_END terminator entry */
tbl_sz++;
freq_table = kzalloc(sizeof(struct cpufreq_frequency_table) * tbl_sz,
GFP_ATOMIC);
if (!freq_table) {
pr_err("%s: could not kzalloc frequency table\n", __func__);
return; return;
} }
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
if (!(prcm->flags & cpu_mask))
continue;
if (prcm->xtal_speed != sys_ck_rate)
continue;
/* don't put bypass rates in table */
if (prcm->dpll_speed == prcm->xtal_speed)
continue;
freq_table[i].index = i;
freq_table[i].frequency = prcm->mpu_speed / 1000;
i++;
}
freq_table[i].index = i; freq_table[i].index = i;
freq_table[i].frequency = CPUFREQ_TABLE_END; freq_table[i].frequency = CPUFREQ_TABLE_END;
*table = &freq_table[0]; *table = &freq_table[0];
} }
void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
{
kfree(freq_table);
}
#endif #endif
struct clk_functions omap2_clk_functions = { struct clk_functions omap2_clk_functions = {
...@@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = { ...@@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = {
.clk_disable_unused = omap2_clk_disable_unused, .clk_disable_unused = omap2_clk_disable_unused,
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
.clk_init_cpufreq_table = omap2_clk_init_cpufreq_table, .clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
.clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table,
#endif #endif
}; };
......
...@@ -34,7 +34,6 @@ ...@@ -34,7 +34,6 @@
#include <asm/div64.h> #include <asm/div64.h>
#include <asm/clkdev.h> #include <asm/clkdev.h>
#include <plat/sdrc.h>
#include "clock.h" #include "clock.h"
#include "clock34xx.h" #include "clock34xx.h"
#include "sdrc.h" #include "sdrc.h"
......
...@@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = { ...@@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = {
.clksel_mask = OMAP3430_CLKSEL_CAM_MASK, .clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
.clksel = div16_dpll4_clksel, .clksel = div16_dpll4_clksel,
.clkdm_name = "dpll4_clkdm", .clkdm_name = "dpll4_clkdm",
.set_rate = &omap2_clksel_set_rate,
.round_rate = &omap2_clksel_round_rate,
.recalc = &omap2_clksel_recalc, .recalc = &omap2_clksel_recalc,
}; };
...@@ -1500,6 +1502,7 @@ static struct clk uart2_fck = { ...@@ -1500,6 +1502,7 @@ static struct clk uart2_fck = {
.parent = &core_48m_fck, .parent = &core_48m_fck,
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
.enable_bit = OMAP3430_EN_UART2_SHIFT, .enable_bit = OMAP3430_EN_UART2_SHIFT,
.clkdm_name = "core_l4_clkdm",
.recalc = &followparent_recalc, .recalc = &followparent_recalc,
}; };
...@@ -1509,6 +1512,7 @@ static struct clk uart1_fck = { ...@@ -1509,6 +1512,7 @@ static struct clk uart1_fck = {
.parent = &core_48m_fck, .parent = &core_48m_fck,
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1), .enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
.enable_bit = OMAP3430_EN_UART1_SHIFT, .enable_bit = OMAP3430_EN_UART1_SHIFT,
.clkdm_name = "core_l4_clkdm",
.recalc = &followparent_recalc, .recalc = &followparent_recalc,
}; };
...@@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = { ...@@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = {
}; };
static const struct clksel mcbsp_234_clksel[] = { static const struct clksel mcbsp_234_clksel[] = {
{ .parent = &core_96m_fck, .rates = common_mcbsp_96m_rates }, { .parent = &per_96m_fck, .rates = common_mcbsp_96m_rates },
{ .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates }, { .parent = &mcbsp_clks, .rates = common_mcbsp_mcbsp_rates },
{ .parent = NULL } { .parent = NULL }
}; };
......
...@@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk) ...@@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
* downstream clocks for debugging purposes? * downstream clocks for debugging purposes?
*/ */
if (!clkdm || !clk) if (!clkdm || !clk || !clkdm->clktrctrl_mask)
return -EINVAL; return -EINVAL;
if (atomic_inc_return(&clkdm->usecount) > 1) if (atomic_inc_return(&clkdm->usecount) > 1)
...@@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk) ...@@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
* downstream clocks for debugging purposes? * downstream clocks for debugging purposes?
*/ */
if (!clkdm || !clk) if (!clkdm || !clk || !clkdm->clktrctrl_mask)
return -EINVAL; return -EINVAL;
#ifdef DEBUG #ifdef DEBUG
......
...@@ -33,7 +33,6 @@ ...@@ -33,7 +33,6 @@
#include <plat/sdrc.h> #include <plat/sdrc.h>
#include <plat/gpmc.h> #include <plat/gpmc.h>
#include <plat/serial.h> #include <plat/serial.h>
#include <plat/mux.h>
#include <plat/vram.h> #include <plat/vram.h>
#include "clock.h" #include "clock.h"
...@@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = { ...@@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = {
#ifdef CONFIG_ARCH_OMAP2420 #ifdef CONFIG_ARCH_OMAP2420
static struct map_desc omap242x_io_desc[] __initdata = { static struct map_desc omap242x_io_desc[] __initdata = {
{ {
.virtual = DSP_MEM_24XX_VIRT, .virtual = DSP_MEM_2420_VIRT,
.pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS), .pfn = __phys_to_pfn(DSP_MEM_2420_PHYS),
.length = DSP_MEM_24XX_SIZE, .length = DSP_MEM_2420_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, },
{ {
.virtual = DSP_IPI_24XX_VIRT, .virtual = DSP_IPI_2420_VIRT,
.pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS), .pfn = __phys_to_pfn(DSP_IPI_2420_PHYS),
.length = DSP_IPI_24XX_SIZE, .length = DSP_IPI_2420_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, },
{ {
.virtual = DSP_MMU_24XX_VIRT, .virtual = DSP_MMU_2420_VIRT,
.pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS), .pfn = __phys_to_pfn(DSP_MMU_2420_PHYS),
.length = DSP_MMU_24XX_SIZE, .length = DSP_MMU_2420_SIZE,
.type = MT_DEVICE .type = MT_DEVICE
}, },
}; };
......
...@@ -994,7 +994,9 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size, ...@@ -994,7 +994,9 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
} }
#ifdef CONFIG_OMAP_MUX #ifdef CONFIG_OMAP_MUX
if (package_subset)
omap_mux_package_fixup(package_subset, superset); omap_mux_package_fixup(package_subset, superset);
if (package_balls)
omap_mux_package_init_balls(package_balls, superset); omap_mux_package_init_balls(package_balls, superset);
omap_mux_set_cmdline_signals(); omap_mux_set_cmdline_signals();
omap_mux_set_board_signals(board_mux); omap_mux_set_board_signals(board_mux);
......
...@@ -9,45 +9,47 @@ ...@@ -9,45 +9,47 @@
* The OMAP2 processor can be run at several discrete 'PRCM configurations'. * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
* These configurations are characterized by voltage and speed for clocks. * These configurations are characterized by voltage and speed for clocks.
* The device is only validated for certain combinations. One way to express * The device is only validated for certain combinations. One way to express
* these combinations is via the 'ratio's' which the clocks operate with * these combinations is via the 'ratios' which the clocks operate with
* respect to each other. These ratio sets are for a given voltage/DPLL * respect to each other. These ratio sets are for a given voltage/DPLL
* setting. All configurations can be described by a DPLL setting and a ratio * setting. All configurations can be described by a DPLL setting and a ratio.
* There are 3 ratio sets for the 2430 and X ratio sets for 2420.
*
* 2430 differs from 2420 in that there are no more phase synchronizers used.
* They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
* 2430 (iva2.1, NOdsp, mdm)
* *
* XXX Missing voltage data. * XXX Missing voltage data.
* XXX Missing 19.2MHz sys_clk rate sets (needed for N800/N810)
* *
* THe format described in this file is deprecated. Once a reasonable * THe format described in this file is deprecated. Once a reasonable
* OPP API exists, the data in this file should be converted to use it. * OPP API exists, the data in this file should be converted to use it.
* *
* This is technically part of the OMAP2xxx clock code. * This is technically part of the OMAP2xxx clock code.
*
* Considerable work is still needed to fully support dynamic frequency
* changes on OMAP2xxx-series chips. Readers interested in such a
* project are encouraged to review the Maemo Diablo RX-34 and RX-44
* kernel source at:
* http://repository.maemo.org/pool/diablo/free/k/kernel-source-diablo/
*/ */
#include "opp2xxx.h" #include "opp2xxx.h"
#include "sdrc.h" #include "sdrc.h"
#include "clock.h" #include "clock.h"
/*------------------------------------------------------------------------- /*
* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM * CM_CLKSEL2_PLL, CM_CLKSEL_MDM
* *
* Filling in table based on H4 boards and 2430-SDPs variants available. * Filling in table based on H4 boards available. There are quite a
* There are quite a few more rates combinations which could be defined. * few more rate combinations which could be defined.
* *
* When multiple values are defined the start up will try and choose the * When multiple values are defined the start up will try and choose
* fastest one. If a 'fast' value is defined, then automatically, the /2 * the fastest one. If a 'fast' value is defined, then automatically,
* one should be included as it can be used. Generally having more that * the /2 one should be included as it can be used. Generally having
* one fast set does not make sense, as static timings need to be changed * more than one fast set does not make sense, as static timings need
* to change the set. The exception is the bypass setting which is * to be changed to change the set. The exception is the bypass
* availble for low power bypass. * setting which is available for low power bypass.
* *
* Note: This table needs to be sorted, fastest to slowest. * Note: This table needs to be sorted, fastest to slowest.
*-------------------------------------------------------------------------*/ **/
const struct prcm_config omap2420_rate_table[] = { const struct prcm_config omap2420_rate_table[] = {
/* PRCM I - FAST */ /* PRCM I - FAST */
{S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */ {S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
......
/* /*
* opp2420_data.c - old-style "OPP" table for OMAP2420 * opp2430_data.c - old-style "OPP" table for OMAP2430
* *
* Copyright (C) 2005-2009 Texas Instruments, Inc. * Copyright (C) 2005-2009 Texas Instruments, Inc.
* Copyright (C) 2004-2009 Nokia Corporation * Copyright (C) 2004-2009 Nokia Corporation
...@@ -9,16 +9,16 @@ ...@@ -9,16 +9,16 @@
* The OMAP2 processor can be run at several discrete 'PRCM configurations'. * The OMAP2 processor can be run at several discrete 'PRCM configurations'.
* These configurations are characterized by voltage and speed for clocks. * These configurations are characterized by voltage and speed for clocks.
* The device is only validated for certain combinations. One way to express * The device is only validated for certain combinations. One way to express
* these combinations is via the 'ratio's' which the clocks operate with * these combinations is via the 'ratios' which the clocks operate with
* respect to each other. These ratio sets are for a given voltage/DPLL * respect to each other. These ratio sets are for a given voltage/DPLL
* setting. All configurations can be described by a DPLL setting and a ratio * setting. All configurations can be described by a DPLL setting and a ratio.
* There are 3 ratio sets for the 2430 and X ratio sets for 2420.
* *
* 2430 differs from 2420 in that there are no more phase synchronizers used. * 2430 differs from 2420 in that there are no more phase synchronizers used.
* They both have a slightly different clock domain setup. 2420(iva1,dsp) vs * They both have a slightly different clock domain setup. 2420(iva1,dsp) vs
* 2430 (iva2.1, NOdsp, mdm) * 2430 (iva2.1, NOdsp, mdm)
* *
* XXX Missing voltage data. * XXX Missing voltage data.
* XXX Missing 19.2MHz sys_clk rate sets.
* *
* THe format described in this file is deprecated. Once a reasonable * THe format described in this file is deprecated. Once a reasonable
* OPP API exists, the data in this file should be converted to use it. * OPP API exists, the data in this file should be converted to use it.
...@@ -30,24 +30,24 @@ ...@@ -30,24 +30,24 @@
#include "sdrc.h" #include "sdrc.h"
#include "clock.h" #include "clock.h"
/*------------------------------------------------------------------------- /*
* Key dividers which make up a PRCM set. Ratio's for a PRCM are mandated. * Key dividers which make up a PRCM set. Ratios for a PRCM are mandated.
* xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU, * xtal_speed, dpll_speed, mpu_speed, CM_CLKSEL_MPU,
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL, * CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM * CM_CLKSEL2_PLL, CM_CLKSEL_MDM
* *
* Filling in table based on H4 boards and 2430-SDPs variants available. * Filling in table based on 2430-SDPs variants available. There are
* There are quite a few more rates combinations which could be defined. * quite a few more rate combinations which could be defined.
* *
* When multiple values are defined the start up will try and choose the * When multiple values are defined the start up will try and choose
* fastest one. If a 'fast' value is defined, then automatically, the /2 * the fastest one. If a 'fast' value is defined, then automatically,
* one should be included as it can be used. Generally having more that * the /2 one should be included as it can be used. Generally having
* one fast set does not make sense, as static timings need to be changed * more than one fast set does not make sense, as static timings need
* to change the set. The exception is the bypass setting which is * to be changed to change the set. The exception is the bypass
* availble for low power bypass. * setting which is available for low power bypass.
* *
* Note: This table needs to be sorted, fastest to slowest. * Note: This table needs to be sorted, fastest to slowest.
*-------------------------------------------------------------------------*/ */
const struct prcm_config omap2430_rate_table[] = { const struct prcm_config omap2430_rate_table[] = {
/* PRCM #4 - ratio2 (ES2.1) - FAST */ /* PRCM #4 - ratio2 (ES2.1) - FAST */
{S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */ {S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
......
...@@ -124,8 +124,8 @@ static void omap3_core_save_context(void) ...@@ -124,8 +124,8 @@ static void omap3_core_save_context(void)
control_padconf_off |= START_PADCONF_SAVE; control_padconf_off |= START_PADCONF_SAVE;
omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF); omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
/* wait for the save to complete */ /* wait for the save to complete */
while (!omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS) while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
& PADCONF_SAVE_DONE) & PADCONF_SAVE_DONE))
; ;
/* Save the Interrupt controller context */ /* Save the Interrupt controller context */
omap_intc_save_context(); omap_intc_save_context();
......
...@@ -125,6 +125,13 @@ static struct plat_serial8250_port serial_platform_data3[] = { ...@@ -125,6 +125,13 @@ static struct plat_serial8250_port serial_platform_data3[] = {
} }
}; };
#endif #endif
static inline unsigned int __serial_read_reg(struct uart_port *up,
int offset)
{
offset <<= up->regshift;
return (unsigned int)__raw_readb(up->membase + offset);
}
static inline unsigned int serial_read_reg(struct plat_serial8250_port *up, static inline unsigned int serial_read_reg(struct plat_serial8250_port *up,
int offset) int offset)
{ {
...@@ -583,11 +590,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset) ...@@ -583,11 +590,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset)
{ {
if (UART_RX == offset) { if (UART_RX == offset) {
unsigned int lsr; unsigned int lsr;
lsr = serial_read_reg(omap_uart[up->line].p, UART_LSR); lsr = __serial_read_reg(up, UART_LSR);
if (!(lsr & UART_LSR_DR)) if (!(lsr & UART_LSR_DR))
return -EPERM; return -EPERM;
} }
return serial_read_reg(omap_uart[up->line].p, offset);
return __serial_read_reg(up, offset);
} }
void __init omap_serial_early_init(void) void __init omap_serial_early_init(void)
......
...@@ -36,10 +36,6 @@ static struct clk_functions *arch_clock; ...@@ -36,10 +36,6 @@ static struct clk_functions *arch_clock;
* Standard clock functions defined in include/linux/clk.h * Standard clock functions defined in include/linux/clk.h
*-------------------------------------------------------------------------*/ *-------------------------------------------------------------------------*/
/* This functions is moved to arch/arm/common/clkdev.c. For OMAP4 since
* clock framework is not up , it is defined here to avoid rework in
* every driver. Also dummy prcm reset function is added */
int clk_enable(struct clk *clk) int clk_enable(struct clk *clk)
{ {
unsigned long flags; unsigned long flags;
...@@ -305,7 +301,6 @@ void clk_enable_init_clocks(void) ...@@ -305,7 +301,6 @@ void clk_enable_init_clocks(void)
clk_enable(clkp); clk_enable(clkp);
} }
} }
EXPORT_SYMBOL(clk_enable_init_clocks);
/* /*
* Low level helpers * Low level helpers
...@@ -334,7 +329,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table) ...@@ -334,7 +329,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
arch_clock->clk_init_cpufreq_table(table); arch_clock->clk_init_cpufreq_table(table);
spin_unlock_irqrestore(&clockfw_lock, flags); spin_unlock_irqrestore(&clockfw_lock, flags);
} }
EXPORT_SYMBOL(clk_init_cpufreq_table);
void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
{
unsigned long flags;
spin_lock_irqsave(&clockfw_lock, flags);
if (arch_clock->clk_exit_cpufreq_table)
arch_clock->clk_exit_cpufreq_table(table);
spin_unlock_irqrestore(&clockfw_lock, flags);
}
#endif #endif
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
......
...@@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy) ...@@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
static int omap_cpu_exit(struct cpufreq_policy *policy) static int omap_cpu_exit(struct cpufreq_policy *policy)
{ {
clk_exit_cpufreq_table(&freq_table);
clk_put(mpu_clk); clk_put(mpu_clk);
return 0; return 0;
} }
......
...@@ -192,6 +192,7 @@ struct gpio_bank { ...@@ -192,6 +192,7 @@ struct gpio_bank {
u32 saved_risingdetect; u32 saved_risingdetect;
#endif #endif
u32 level_mask; u32 level_mask;
u32 toggle_mask;
spinlock_t lock; spinlock_t lock;
struct gpio_chip chip; struct gpio_chip chip;
struct clk *dbck; struct clk *dbck;
...@@ -749,6 +750,44 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio, ...@@ -749,6 +750,44 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
} }
#endif #endif
/*
* This only applies to chips that can't do both rising and falling edge
* detection at once. For all other chips, this function is a noop.
*/
static void _toggle_gpio_edge_triggering(struct gpio_bank *bank, int gpio)
{
void __iomem *reg = bank->base;
u32 l = 0;
switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP1
case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_INT_EDGE;
break;
#endif
#ifdef CONFIG_ARCH_OMAP15XX
case METHOD_GPIO_1510:
reg += OMAP1510_GPIO_INT_CONTROL;
break;
#endif
#if defined(CONFIG_ARCH_OMAP730) || defined(CONFIG_ARCH_OMAP850)
case METHOD_GPIO_7XX:
reg += OMAP7XX_GPIO_INT_CONTROL;
break;
#endif
default:
return;
}
l = __raw_readl(reg);
if ((l >> gpio) & 1)
l &= ~(1 << gpio);
else
l |= 1 << gpio;
__raw_writel(l, reg);
}
static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
{ {
void __iomem *reg = bank->base; void __iomem *reg = bank->base;
...@@ -759,6 +798,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) ...@@ -759,6 +798,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
case METHOD_MPUIO: case METHOD_MPUIO:
reg += OMAP_MPUIO_GPIO_INT_EDGE; reg += OMAP_MPUIO_GPIO_INT_EDGE;
l = __raw_readl(reg); l = __raw_readl(reg);
if (trigger & IRQ_TYPE_EDGE_BOTH)
bank->toggle_mask |= 1 << gpio;
if (trigger & IRQ_TYPE_EDGE_RISING) if (trigger & IRQ_TYPE_EDGE_RISING)
l |= 1 << gpio; l |= 1 << gpio;
else if (trigger & IRQ_TYPE_EDGE_FALLING) else if (trigger & IRQ_TYPE_EDGE_FALLING)
...@@ -771,6 +812,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) ...@@ -771,6 +812,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
case METHOD_GPIO_1510: case METHOD_GPIO_1510:
reg += OMAP1510_GPIO_INT_CONTROL; reg += OMAP1510_GPIO_INT_CONTROL;
l = __raw_readl(reg); l = __raw_readl(reg);
if (trigger & IRQ_TYPE_EDGE_BOTH)
bank->toggle_mask |= 1 << gpio;
if (trigger & IRQ_TYPE_EDGE_RISING) if (trigger & IRQ_TYPE_EDGE_RISING)
l |= 1 << gpio; l |= 1 << gpio;
else if (trigger & IRQ_TYPE_EDGE_FALLING) else if (trigger & IRQ_TYPE_EDGE_FALLING)
...@@ -803,6 +846,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger) ...@@ -803,6 +846,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
case METHOD_GPIO_7XX: case METHOD_GPIO_7XX:
reg += OMAP7XX_GPIO_INT_CONTROL; reg += OMAP7XX_GPIO_INT_CONTROL;
l = __raw_readl(reg); l = __raw_readl(reg);
if (trigger & IRQ_TYPE_EDGE_BOTH)
bank->toggle_mask |= 1 << gpio;
if (trigger & IRQ_TYPE_EDGE_RISING) if (trigger & IRQ_TYPE_EDGE_RISING)
l |= 1 << gpio; l |= 1 << gpio;
else if (trigger & IRQ_TYPE_EDGE_FALLING) else if (trigger & IRQ_TYPE_EDGE_FALLING)
...@@ -1072,7 +1117,7 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena ...@@ -1072,7 +1117,7 @@ static inline void _set_gpio_irqenable(struct gpio_bank *bank, int gpio, int ena
*/ */
static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable) static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
{ {
unsigned long flags; unsigned long uninitialized_var(flags);
switch (bank->method) { switch (bank->method) {
#ifdef CONFIG_ARCH_OMAP16XX #ifdef CONFIG_ARCH_OMAP16XX
...@@ -1217,7 +1262,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) ...@@ -1217,7 +1262,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
{ {
void __iomem *isr_reg = NULL; void __iomem *isr_reg = NULL;
u32 isr; u32 isr;
unsigned int gpio_irq; unsigned int gpio_irq, gpio_index;
struct gpio_bank *bank; struct gpio_bank *bank;
u32 retrigger = 0; u32 retrigger = 0;
int unmasked = 0; int unmasked = 0;
...@@ -1284,9 +1329,23 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc) ...@@ -1284,9 +1329,23 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
gpio_irq = bank->virtual_irq_start; gpio_irq = bank->virtual_irq_start;
for (; isr != 0; isr >>= 1, gpio_irq++) { for (; isr != 0; isr >>= 1, gpio_irq++) {
gpio_index = get_gpio_index(irq_to_gpio(gpio_irq));
if (!(isr & 1)) if (!(isr & 1))
continue; continue;
#ifdef CONFIG_ARCH_OMAP1
/*
* Some chips can't respond to both rising and falling
* at the same time. If this irq was requested with
* both flags, we need to flip the ICR data for the IRQ
* to respond to the IRQ for the opposite direction.
* This will be indicated in the bank toggle_mask.
*/
if (bank->toggle_mask & (1 << gpio_index))
_toggle_gpio_edge_triggering(bank, gpio_index);
#endif
generic_handle_irq(gpio_irq); generic_handle_irq(gpio_irq);
} }
} }
......
...@@ -99,7 +99,6 @@ struct fb_info; ...@@ -99,7 +99,6 @@ struct fb_info;
struct omap_backlight_config { struct omap_backlight_config {
int default_intensity; int default_intensity;
int (*set_power)(struct device *dev, int state); int (*set_power)(struct device *dev, int state);
int (*check_fb)(struct fb_info *fb);
}; };
struct omap_fbmem_config { struct omap_fbmem_config {
......
...@@ -119,6 +119,7 @@ struct clk_functions { ...@@ -119,6 +119,7 @@ struct clk_functions {
void (*clk_disable_unused)(struct clk *clk); void (*clk_disable_unused)(struct clk *clk);
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **); void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **);
void (*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **);
#endif #endif
}; };
...@@ -135,6 +136,7 @@ extern unsigned long followparent_recalc(struct clk *clk); ...@@ -135,6 +136,7 @@ extern unsigned long followparent_recalc(struct clk *clk);
extern void clk_enable_init_clocks(void); extern void clk_enable_init_clocks(void);
#ifdef CONFIG_CPU_FREQ #ifdef CONFIG_CPU_FREQ
extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table); extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table);
extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table);
#endif #endif
extern const struct clkops clkops_null; extern const struct clkops clkops_null;
......
...@@ -147,7 +147,7 @@ ...@@ -147,7 +147,7 @@
#define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190) #define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190)
#define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194) #define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194)
#define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \ #define OMAP343X_CONTROL_DEBOBS(i) (OMAP2_CONTROL_GENERAL + 0x01B0 \
+ ((i) >> 1) * 4 + (!(i) & 1) * 2) + ((i) >> 1) * 4 + (!((i) & 1)) * 2)
#define OMAP343X_CONTROL_PROG_IO0 (OMAP2_CONTROL_GENERAL + 0x01D4) #define OMAP343X_CONTROL_PROG_IO0 (OMAP2_CONTROL_GENERAL + 0x01D4)
#define OMAP343X_CONTROL_PROG_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8) #define OMAP343X_CONTROL_PROG_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8)
#define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0) #define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0)
......
...@@ -122,16 +122,21 @@ ...@@ -122,16 +122,21 @@
#define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET) #define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
#define OMAP243X_SMS_SIZE SZ_1M #define OMAP243X_SMS_SIZE SZ_1M
/* DSP */ /* 2420 IVA */
#define DSP_MEM_24XX_PHYS OMAP2420_DSP_MEM_BASE /* 0x58000000 */ #define DSP_MEM_2420_PHYS OMAP2420_DSP_MEM_BASE
#define DSP_MEM_24XX_VIRT 0xe0000000 /* 0x58000000 --> 0xfc100000 */
#define DSP_MEM_24XX_SIZE 0x28000 #define DSP_MEM_2420_VIRT 0xfc100000
#define DSP_IPI_24XX_PHYS OMAP2420_DSP_IPI_BASE /* 0x59000000 */ #define DSP_MEM_2420_SIZE 0x28000
#define DSP_IPI_24XX_VIRT 0xe1000000 #define DSP_IPI_2420_PHYS OMAP2420_DSP_IPI_BASE
#define DSP_IPI_24XX_SIZE SZ_4K /* 0x59000000 --> 0xfc128000 */
#define DSP_MMU_24XX_PHYS OMAP2420_DSP_MMU_BASE /* 0x5a000000 */ #define DSP_IPI_2420_VIRT 0xfc128000
#define DSP_MMU_24XX_VIRT 0xe2000000 #define DSP_IPI_2420_SIZE SZ_4K
#define DSP_MMU_24XX_SIZE SZ_4K #define DSP_MMU_2420_PHYS OMAP2420_DSP_MMU_BASE
/* 0x5a000000 --> 0xfc129000 */
#define DSP_MMU_2420_VIRT 0xfc129000
#define DSP_MMU_2420_SIZE SZ_4K
/* 2430 IVA2.1 - currently unmapped */
/* /*
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
...@@ -182,16 +187,7 @@ ...@@ -182,16 +187,7 @@
#define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET) #define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
#define OMAP343X_SDRC_SIZE SZ_1M #define OMAP343X_SDRC_SIZE SZ_1M
/* DSP */ /* 3430 IVA - currently unmapped */
#define DSP_MEM_34XX_PHYS OMAP34XX_DSP_MEM_BASE /* 0x58000000 */
#define DSP_MEM_34XX_VIRT 0xe0000000
#define DSP_MEM_34XX_SIZE 0x28000
#define DSP_IPI_34XX_PHYS OMAP34XX_DSP_IPI_BASE /* 0x59000000 */
#define DSP_IPI_34XX_VIRT 0xe1000000
#define DSP_IPI_34XX_SIZE SZ_4K
#define DSP_MMU_34XX_PHYS OMAP34XX_DSP_MMU_BASE /* 0x5a000000 */
#define DSP_MMU_34XX_VIRT 0xe2000000
#define DSP_MMU_34XX_SIZE SZ_4K
/* /*
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
......
...@@ -183,6 +183,14 @@ enum omap7xx_index { ...@@ -183,6 +183,14 @@ enum omap7xx_index {
/* I2C */ /* I2C */
I2C_7XX_SCL, I2C_7XX_SCL,
I2C_7XX_SDA, I2C_7XX_SDA,
/* SPI */
SPI_7XX_1,
SPI_7XX_2,
SPI_7XX_3,
SPI_7XX_4,
SPI_7XX_5,
SPI_7XX_6,
}; };
enum omap1xxx_index { enum omap1xxx_index {
......
...@@ -46,6 +46,9 @@ ...@@ -46,6 +46,9 @@
#define OMAP7XX_DSPREG_SIZE SZ_128K #define OMAP7XX_DSPREG_SIZE SZ_128K
#define OMAP7XX_DSPREG_START 0xE1000000 #define OMAP7XX_DSPREG_START 0xE1000000
#define OMAP7XX_SPI1_BASE 0xfffc0800
#define OMAP7XX_SPI2_BASE 0xfffc1000
/* /*
* ---------------------------------------------------------------------------- * ----------------------------------------------------------------------------
* OMAP7XX specific configuration registers * OMAP7XX specific configuration registers
......
...@@ -66,12 +66,12 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type) ...@@ -66,12 +66,12 @@ void __iomem *omap_ioremap(unsigned long p, size_t size, unsigned int type)
return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT); return XLATE(p, L4_24XX_PHYS, L4_24XX_VIRT);
} }
if (cpu_is_omap2420()) { if (cpu_is_omap2420()) {
if (BETWEEN(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_SIZE)) if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE))
return XLATE(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_VIRT); return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT);
if (BETWEEN(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE)) if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE))
return XLATE(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE); return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE);
if (BETWEEN(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_SIZE)) if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE))
return XLATE(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_VIRT); return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT);
} }
if (cpu_is_omap2430()) { if (cpu_is_omap2430()) {
if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE)) if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE))
......
...@@ -827,7 +827,7 @@ EXPORT_SYMBOL_GPL(iommu_get); ...@@ -827,7 +827,7 @@ EXPORT_SYMBOL_GPL(iommu_get);
**/ **/
void iommu_put(struct iommu *obj) void iommu_put(struct iommu *obj)
{ {
if (!obj && IS_ERR(obj)) if (!obj || IS_ERR(obj))
return; return;
mutex_lock(&obj->iommu_lock); mutex_lock(&obj->iommu_lock);
......
...@@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id) ...@@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id)
dev_err(mcbsp->dev, "Unable to request TX IRQ %d " dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
"for McBSP%d\n", mcbsp->tx_irq, "for McBSP%d\n", mcbsp->tx_irq,
mcbsp->id); mcbsp->id);
return err; goto error;
} }
init_completion(&mcbsp->rx_irq_completion); init_completion(&mcbsp->rx_irq_completion);
...@@ -446,12 +446,26 @@ int omap_mcbsp_request(unsigned int id) ...@@ -446,12 +446,26 @@ int omap_mcbsp_request(unsigned int id)
dev_err(mcbsp->dev, "Unable to request RX IRQ %d " dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
"for McBSP%d\n", mcbsp->rx_irq, "for McBSP%d\n", mcbsp->rx_irq,
mcbsp->id); mcbsp->id);
free_irq(mcbsp->tx_irq, (void *)mcbsp); goto tx_irq;
return err;
} }
} }
return 0; return 0;
tx_irq:
free_irq(mcbsp->tx_irq, (void *)mcbsp);
error:
if (mcbsp->pdata && mcbsp->pdata->ops && mcbsp->pdata->ops->free)
mcbsp->pdata->ops->free(id);
/* Do procedure specific to omap34xx arch, if applicable */
omap34xx_mcbsp_free(mcbsp);
clk_disable(mcbsp->fclk);
clk_disable(mcbsp->iclk);
mcbsp->free = 1;
return err;
} }
EXPORT_SYMBOL(omap_mcbsp_request); EXPORT_SYMBOL(omap_mcbsp_request);
......
...@@ -139,8 +139,6 @@ static int omapbl_probe(struct platform_device *pdev) ...@@ -139,8 +139,6 @@ static int omapbl_probe(struct platform_device *pdev)
if (!pdata) if (!pdata)
return -ENXIO; return -ENXIO;
omapbl_ops.check_fb = pdata->check_fb;
bl = kzalloc(sizeof(struct omap_backlight), GFP_KERNEL); bl = kzalloc(sizeof(struct omap_backlight), GFP_KERNEL);
if (unlikely(!bl)) if (unlikely(!bl))
return -ENOMEM; return -ENOMEM;
......
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