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 ...
This commit is contained in:
Коммит
c0f607c608
|
@ -599,7 +599,7 @@ static struct clk i2c_ick = {
|
|||
static struct omap_clk omap_clks[] = {
|
||||
/* non-ULPD clocks */
|
||||
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 */
|
||||
CLK(NULL, "ck_dpll1out", &ck_dpll1out.clk, CK_16XX),
|
||||
CLK(NULL, "ck_sossi", &sossi_ck, CK_16XX),
|
||||
|
@ -627,7 +627,7 @@ static struct omap_clk omap_clks[] = {
|
|||
CLK(NULL, "tc2_ck", &tc2_ck, CK_16XX),
|
||||
CLK(NULL, "dma_ck", &dma_ck, CK_16XX | CK_1510 | CK_310),
|
||||
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, "rhea1_ck", &rhea1_ck, CK_16XX),
|
||||
CLK(NULL, "rhea2_ck", &rhea2_ck, CK_16XX),
|
||||
|
@ -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", "ick", &i2c_ick, CK_16XX),
|
||||
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-mcbsp.1", "ick", &dspper_ck, CK_16XX),
|
||||
CLK("omap-mcbsp.1", "ick", &dummy_ck, CK_1510 | CK_310),
|
||||
|
@ -674,7 +678,7 @@ static struct omap_clk omap_clks[] = {
|
|||
* init
|
||||
*/
|
||||
|
||||
static struct clk_functions omap1_clk_functions __initdata = {
|
||||
static struct clk_functions omap1_clk_functions = {
|
||||
.clk_enable = omap1_clk_enable,
|
||||
.clk_disable = omap1_clk_disable,
|
||||
.clk_round_rate = omap1_clk_round_rate,
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/spi/spi.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -23,6 +24,7 @@
|
|||
#include <plat/mux.h>
|
||||
#include <mach/gpio.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,
|
|||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
/* 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)
|
||||
|
||||
#define OMAP1_STI_BASE 0xfffea000
|
||||
|
@ -263,6 +297,7 @@ static int __init omap1_init_devices(void)
|
|||
|
||||
omap_init_mbox();
|
||||
omap_init_rtc();
|
||||
omap_init_spi100k();
|
||||
omap_init_sti();
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -62,6 +62,14 @@ MUX_CFG_7XX("MMC_7XX_DAT0", 2, 17, 0, 16, 1, 0)
|
|||
/* I2C interface */
|
||||
MUX_CFG_7XX("I2C_7XX_SCL", 5, 1, 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)
|
||||
#else
|
||||
|
|
|
@ -80,6 +80,7 @@ config MACH_OVERO
|
|||
config MACH_OMAP3EVM
|
||||
bool "OMAP 3530 EVM board"
|
||||
depends on ARCH_OMAP3 && ARCH_OMAP34XX
|
||||
select OMAP_PACKAGE_CBB
|
||||
|
||||
config MACH_OMAP3517EVM
|
||||
bool "OMAP3517/ AM3517 EVM board"
|
||||
|
|
|
@ -63,21 +63,21 @@ static int board_keymap[] = {
|
|||
KEY(5, 1, KEY_H),
|
||||
KEY(5, 2, KEY_J),
|
||||
KEY(5, 3, KEY_F3),
|
||||
KEY(5, 4, KEY_UNKNOWN),
|
||||
KEY(5, 5, KEY_VOLUMEDOWN),
|
||||
KEY(5, 6, KEY_M),
|
||||
KEY(5, 7, KEY_ENTER),
|
||||
KEY(5, 7, KEY_RIGHT),
|
||||
KEY(6, 0, KEY_Q),
|
||||
KEY(6, 1, KEY_A),
|
||||
KEY(6, 2, KEY_N),
|
||||
KEY(6, 3, KEY_BACKSPACE),
|
||||
KEY(6, 6, KEY_P),
|
||||
KEY(6, 7, KEY_SELECT),
|
||||
KEY(6, 7, KEY_UP),
|
||||
KEY(7, 0, KEY_PROG1), /*MACRO 1 <User defined> */
|
||||
KEY(7, 1, KEY_PROG2), /*MACRO 2 <User defined> */
|
||||
KEY(7, 2, KEY_PROG3), /*MACRO 3 <User defined> */
|
||||
KEY(7, 3, KEY_PROG4), /*MACRO 4 <User defined> */
|
||||
KEY(7, 5, KEY_RIGHT),
|
||||
KEY(7, 6, KEY_UP),
|
||||
KEY(7, 6, KEY_SELECT),
|
||||
KEY(7, 7, KEY_DOWN)
|
||||
};
|
||||
|
||||
|
|
|
@ -449,18 +449,56 @@ int omap2_select_table_rate(struct clk *clk, unsigned long rate)
|
|||
#ifdef CONFIG_CPU_FREQ
|
||||
/*
|
||||
* 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)
|
||||
{
|
||||
struct prcm_config *prcm;
|
||||
const struct prcm_config *prcm;
|
||||
long sys_ck_rate;
|
||||
int i = 0;
|
||||
int tbl_sz = 0;
|
||||
|
||||
sys_ck_rate = clk_get_rate(sclk);
|
||||
|
||||
for (prcm = rate_table; prcm->mpu_speed; prcm++) {
|
||||
if (!(prcm->flags & cpu_mask))
|
||||
continue;
|
||||
if (prcm->xtal_speed != sys_ck.rate)
|
||||
if (prcm->xtal_speed != sys_ck_rate)
|
||||
continue;
|
||||
|
||||
/* don't put bypass rates in table */
|
||||
if (prcm->dpll_speed == prcm->xtal_speed)
|
||||
continue;
|
||||
|
||||
tbl_sz++;
|
||||
}
|
||||
|
||||
/*
|
||||
* XXX Ensure that we're doing what CPUFreq expects for this error
|
||||
* 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;
|
||||
}
|
||||
|
||||
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 */
|
||||
|
@ -472,17 +510,17 @@ void omap2_clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
|||
i++;
|
||||
}
|
||||
|
||||
if (i == 0) {
|
||||
printk(KERN_WARNING "%s: failed to initialize frequency "
|
||||
"table\n", __func__);
|
||||
return;
|
||||
}
|
||||
|
||||
freq_table[i].index = i;
|
||||
freq_table[i].frequency = CPUFREQ_TABLE_END;
|
||||
|
||||
*table = &freq_table[0];
|
||||
}
|
||||
|
||||
void omap2_clk_exit_cpufreq_table(struct cpufreq_frequency_table **table)
|
||||
{
|
||||
kfree(freq_table);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
struct clk_functions omap2_clk_functions = {
|
||||
|
@ -494,6 +532,7 @@ struct clk_functions omap2_clk_functions = {
|
|||
.clk_disable_unused = omap2_clk_disable_unused,
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
.clk_init_cpufreq_table = omap2_clk_init_cpufreq_table,
|
||||
.clk_exit_cpufreq_table = omap2_clk_exit_cpufreq_table,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <asm/div64.h>
|
||||
#include <asm/clkdev.h>
|
||||
|
||||
#include <plat/sdrc.h>
|
||||
#include "clock.h"
|
||||
#include "clock34xx.h"
|
||||
#include "sdrc.h"
|
||||
|
|
|
@ -776,6 +776,8 @@ static struct clk dpll4_m5_ck = {
|
|||
.clksel_mask = OMAP3430_CLKSEL_CAM_MASK,
|
||||
.clksel = div16_dpll4_clksel,
|
||||
.clkdm_name = "dpll4_clkdm",
|
||||
.set_rate = &omap2_clksel_set_rate,
|
||||
.round_rate = &omap2_clksel_round_rate,
|
||||
.recalc = &omap2_clksel_recalc,
|
||||
};
|
||||
|
||||
|
@ -1500,6 +1502,7 @@ static struct clk uart2_fck = {
|
|||
.parent = &core_48m_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP3430_EN_UART2_SHIFT,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -1509,6 +1512,7 @@ static struct clk uart1_fck = {
|
|||
.parent = &core_48m_fck,
|
||||
.enable_reg = OMAP_CM_REGADDR(CORE_MOD, CM_FCLKEN1),
|
||||
.enable_bit = OMAP3430_EN_UART1_SHIFT,
|
||||
.clkdm_name = "core_l4_clkdm",
|
||||
.recalc = &followparent_recalc,
|
||||
};
|
||||
|
||||
|
@ -2745,7 +2749,7 @@ static struct clk mcbsp4_ick = {
|
|||
};
|
||||
|
||||
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 = NULL }
|
||||
};
|
||||
|
|
|
@ -559,7 +559,7 @@ int omap2_clkdm_clk_enable(struct clockdomain *clkdm, struct clk *clk)
|
|||
* downstream clocks for debugging purposes?
|
||||
*/
|
||||
|
||||
if (!clkdm || !clk)
|
||||
if (!clkdm || !clk || !clkdm->clktrctrl_mask)
|
||||
return -EINVAL;
|
||||
|
||||
if (atomic_inc_return(&clkdm->usecount) > 1)
|
||||
|
@ -610,7 +610,7 @@ int omap2_clkdm_clk_disable(struct clockdomain *clkdm, struct clk *clk)
|
|||
* downstream clocks for debugging purposes?
|
||||
*/
|
||||
|
||||
if (!clkdm || !clk)
|
||||
if (!clkdm || !clk || !clkdm->clktrctrl_mask)
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
#include <plat/sdrc.h>
|
||||
#include <plat/gpmc.h>
|
||||
#include <plat/serial.h>
|
||||
#include <plat/mux.h>
|
||||
#include <plat/vram.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
@ -73,21 +72,21 @@ static struct map_desc omap24xx_io_desc[] __initdata = {
|
|||
#ifdef CONFIG_ARCH_OMAP2420
|
||||
static struct map_desc omap242x_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = DSP_MEM_24XX_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_MEM_24XX_PHYS),
|
||||
.length = DSP_MEM_24XX_SIZE,
|
||||
.virtual = DSP_MEM_2420_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_MEM_2420_PHYS),
|
||||
.length = DSP_MEM_2420_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = DSP_IPI_24XX_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_IPI_24XX_PHYS),
|
||||
.length = DSP_IPI_24XX_SIZE,
|
||||
.virtual = DSP_IPI_2420_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_IPI_2420_PHYS),
|
||||
.length = DSP_IPI_2420_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
{
|
||||
.virtual = DSP_MMU_24XX_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_MMU_24XX_PHYS),
|
||||
.length = DSP_MMU_24XX_SIZE,
|
||||
.virtual = DSP_MMU_2420_VIRT,
|
||||
.pfn = __phys_to_pfn(DSP_MMU_2420_PHYS),
|
||||
.length = DSP_MMU_2420_SIZE,
|
||||
.type = MT_DEVICE
|
||||
},
|
||||
};
|
||||
|
|
|
@ -994,8 +994,10 @@ int __init omap_mux_init(u32 mux_pbase, u32 mux_size,
|
|||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
omap_mux_package_fixup(package_subset, superset);
|
||||
omap_mux_package_init_balls(package_balls, superset);
|
||||
if (package_subset)
|
||||
omap_mux_package_fixup(package_subset, superset);
|
||||
if (package_balls)
|
||||
omap_mux_package_init_balls(package_balls, superset);
|
||||
omap_mux_set_cmdline_signals();
|
||||
omap_mux_set_board_signals(board_mux);
|
||||
#endif
|
||||
|
|
|
@ -9,45 +9,47 @@
|
|||
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
||||
* These configurations are characterized by voltage and speed for clocks.
|
||||
* 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
|
||||
* 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)
|
||||
* setting. All configurations can be described by a DPLL setting and a ratio.
|
||||
*
|
||||
* 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
|
||||
* OPP API exists, the data in this file should be converted to use it.
|
||||
*
|
||||
* 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 "sdrc.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,
|
||||
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
||||
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
||||
*
|
||||
* Filling in table based on H4 boards and 2430-SDPs variants available.
|
||||
* There are quite a few more rates combinations which could be defined.
|
||||
* Filling in table based on H4 boards available. There are quite a
|
||||
* few more rate combinations which could be defined.
|
||||
*
|
||||
* When multiple values are defined the start up will try and choose the
|
||||
* fastest one. If a 'fast' value is defined, then automatically, the /2
|
||||
* one should be included as it can be used. Generally having more that
|
||||
* one fast set does not make sense, as static timings need to be changed
|
||||
* to change the set. The exception is the bypass setting which is
|
||||
* availble for low power bypass.
|
||||
* When multiple values are defined the start up will try and choose
|
||||
* the fastest one. If a 'fast' value is defined, then automatically,
|
||||
* the /2 one should be included as it can be used. Generally having
|
||||
* more than one fast set does not make sense, as static timings need
|
||||
* to be changed to change the set. The exception is the bypass
|
||||
* setting which is available for low power bypass.
|
||||
*
|
||||
* Note: This table needs to be sorted, fastest to slowest.
|
||||
*-------------------------------------------------------------------------*/
|
||||
**/
|
||||
const struct prcm_config omap2420_rate_table[] = {
|
||||
/* PRCM I - FAST */
|
||||
{S12M, S660M, S330M, RI_CM_CLKSEL_MPU_VAL, /* 330MHz ARM */
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* 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) 2004-2009 Nokia Corporation
|
||||
|
@ -9,16 +9,16 @@
|
|||
* The OMAP2 processor can be run at several discrete 'PRCM configurations'.
|
||||
* These configurations are characterized by voltage and speed for clocks.
|
||||
* 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
|
||||
* 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.
|
||||
* setting. All configurations can be described by a DPLL setting and a ratio.
|
||||
*
|
||||
* 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 19.2MHz sys_clk rate sets.
|
||||
*
|
||||
* 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.
|
||||
|
@ -30,24 +30,24 @@
|
|||
#include "sdrc.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,
|
||||
* CM_CLKSEL_DSP, CM_CLKSEL_GFX, CM_CLKSEL1_CORE, CM_CLKSEL1_PLL,
|
||||
* CM_CLKSEL2_PLL, CM_CLKSEL_MDM
|
||||
*
|
||||
* Filling in table based on H4 boards and 2430-SDPs variants available.
|
||||
* There are quite a few more rates combinations which could be defined.
|
||||
* Filling in table based on 2430-SDPs variants available. There are
|
||||
* quite a few more rate combinations which could be defined.
|
||||
*
|
||||
* When multiple values are defined the start up will try and choose the
|
||||
* fastest one. If a 'fast' value is defined, then automatically, the /2
|
||||
* one should be included as it can be used. Generally having more that
|
||||
* one fast set does not make sense, as static timings need to be changed
|
||||
* to change the set. The exception is the bypass setting which is
|
||||
* availble for low power bypass.
|
||||
* When multiple values are defined the start up will try and choose
|
||||
* the fastest one. If a 'fast' value is defined, then automatically,
|
||||
* the /2 one should be included as it can be used. Generally having
|
||||
* more than one fast set does not make sense, as static timings need
|
||||
* to be changed to change the set. The exception is the bypass
|
||||
* setting which is available for low power bypass.
|
||||
*
|
||||
* Note: This table needs to be sorted, fastest to slowest.
|
||||
*-------------------------------------------------------------------------*/
|
||||
*/
|
||||
const struct prcm_config omap2430_rate_table[] = {
|
||||
/* PRCM #4 - ratio2 (ES2.1) - FAST */
|
||||
{S13M, S798M, S399M, R2_CM_CLKSEL_MPU_VAL, /* 399MHz ARM */
|
||||
|
|
|
@ -124,8 +124,8 @@ static void omap3_core_save_context(void)
|
|||
control_padconf_off |= START_PADCONF_SAVE;
|
||||
omap_ctrl_writel(control_padconf_off, OMAP343X_CONTROL_PADCONF_OFF);
|
||||
/* wait for the save to complete */
|
||||
while (!omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
|
||||
& PADCONF_SAVE_DONE)
|
||||
while (!(omap_ctrl_readl(OMAP343X_CONTROL_GENERAL_PURPOSE_STATUS)
|
||||
& PADCONF_SAVE_DONE))
|
||||
;
|
||||
/* Save the Interrupt controller context */
|
||||
omap_intc_save_context();
|
||||
|
|
|
@ -125,6 +125,13 @@ static struct plat_serial8250_port serial_platform_data3[] = {
|
|||
}
|
||||
};
|
||||
#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,
|
||||
int offset)
|
||||
{
|
||||
|
@ -583,11 +590,12 @@ static unsigned int serial_in_override(struct uart_port *up, int offset)
|
|||
{
|
||||
if (UART_RX == offset) {
|
||||
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))
|
||||
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)
|
||||
|
|
|
@ -36,10 +36,6 @@ static struct clk_functions *arch_clock;
|
|||
* 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)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
@ -305,7 +301,6 @@ void clk_enable_init_clocks(void)
|
|||
clk_enable(clkp);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(clk_enable_init_clocks);
|
||||
|
||||
/*
|
||||
* Low level helpers
|
||||
|
@ -334,7 +329,16 @@ void clk_init_cpufreq_table(struct cpufreq_frequency_table **table)
|
|||
arch_clock->clk_init_cpufreq_table(table);
|
||||
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
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
|
|
@ -134,6 +134,7 @@ static int __init omap_cpu_init(struct cpufreq_policy *policy)
|
|||
|
||||
static int omap_cpu_exit(struct cpufreq_policy *policy)
|
||||
{
|
||||
clk_exit_cpufreq_table(&freq_table);
|
||||
clk_put(mpu_clk);
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -192,6 +192,7 @@ struct gpio_bank {
|
|||
u32 saved_risingdetect;
|
||||
#endif
|
||||
u32 level_mask;
|
||||
u32 toggle_mask;
|
||||
spinlock_t lock;
|
||||
struct gpio_chip chip;
|
||||
struct clk *dbck;
|
||||
|
@ -749,6 +750,44 @@ static inline void set_24xx_gpio_triggering(struct gpio_bank *bank, int gpio,
|
|||
}
|
||||
#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)
|
||||
{
|
||||
void __iomem *reg = bank->base;
|
||||
|
@ -759,6 +798,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
|
|||
case METHOD_MPUIO:
|
||||
reg += OMAP_MPUIO_GPIO_INT_EDGE;
|
||||
l = __raw_readl(reg);
|
||||
if (trigger & IRQ_TYPE_EDGE_BOTH)
|
||||
bank->toggle_mask |= 1 << gpio;
|
||||
if (trigger & IRQ_TYPE_EDGE_RISING)
|
||||
l |= 1 << gpio;
|
||||
else if (trigger & IRQ_TYPE_EDGE_FALLING)
|
||||
|
@ -771,6 +812,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
|
|||
case METHOD_GPIO_1510:
|
||||
reg += OMAP1510_GPIO_INT_CONTROL;
|
||||
l = __raw_readl(reg);
|
||||
if (trigger & IRQ_TYPE_EDGE_BOTH)
|
||||
bank->toggle_mask |= 1 << gpio;
|
||||
if (trigger & IRQ_TYPE_EDGE_RISING)
|
||||
l |= 1 << gpio;
|
||||
else if (trigger & IRQ_TYPE_EDGE_FALLING)
|
||||
|
@ -803,6 +846,8 @@ static int _set_gpio_triggering(struct gpio_bank *bank, int gpio, int trigger)
|
|||
case METHOD_GPIO_7XX:
|
||||
reg += OMAP7XX_GPIO_INT_CONTROL;
|
||||
l = __raw_readl(reg);
|
||||
if (trigger & IRQ_TYPE_EDGE_BOTH)
|
||||
bank->toggle_mask |= 1 << gpio;
|
||||
if (trigger & IRQ_TYPE_EDGE_RISING)
|
||||
l |= 1 << gpio;
|
||||
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
|
|||
*/
|
||||
static int _set_gpio_wakeup(struct gpio_bank *bank, int gpio, int enable)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long uninitialized_var(flags);
|
||||
|
||||
switch (bank->method) {
|
||||
#ifdef CONFIG_ARCH_OMAP16XX
|
||||
|
@ -1217,7 +1262,7 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
{
|
||||
void __iomem *isr_reg = NULL;
|
||||
u32 isr;
|
||||
unsigned int gpio_irq;
|
||||
unsigned int gpio_irq, gpio_index;
|
||||
struct gpio_bank *bank;
|
||||
u32 retrigger = 0;
|
||||
int unmasked = 0;
|
||||
|
@ -1284,9 +1329,23 @@ static void gpio_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
|
||||
gpio_irq = bank->virtual_irq_start;
|
||||
for (; isr != 0; isr >>= 1, gpio_irq++) {
|
||||
gpio_index = get_gpio_index(irq_to_gpio(gpio_irq));
|
||||
|
||||
if (!(isr & 1))
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -99,7 +99,6 @@ struct fb_info;
|
|||
struct omap_backlight_config {
|
||||
int default_intensity;
|
||||
int (*set_power)(struct device *dev, int state);
|
||||
int (*check_fb)(struct fb_info *fb);
|
||||
};
|
||||
|
||||
struct omap_fbmem_config {
|
||||
|
|
|
@ -119,6 +119,7 @@ struct clk_functions {
|
|||
void (*clk_disable_unused)(struct clk *clk);
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
void (*clk_init_cpufreq_table)(struct cpufreq_frequency_table **);
|
||||
void (*clk_exit_cpufreq_table)(struct cpufreq_frequency_table **);
|
||||
#endif
|
||||
};
|
||||
|
||||
|
@ -135,6 +136,7 @@ extern unsigned long followparent_recalc(struct clk *clk);
|
|||
extern void clk_enable_init_clocks(void);
|
||||
#ifdef CONFIG_CPU_FREQ
|
||||
extern void clk_init_cpufreq_table(struct cpufreq_frequency_table **table);
|
||||
extern void clk_exit_cpufreq_table(struct cpufreq_frequency_table **table);
|
||||
#endif
|
||||
|
||||
extern const struct clkops clkops_null;
|
||||
|
|
|
@ -147,7 +147,7 @@
|
|||
#define OMAP343X_CONTROL_IVA2_BOOTADDR (OMAP2_CONTROL_GENERAL + 0x0190)
|
||||
#define OMAP343X_CONTROL_IVA2_BOOTMOD (OMAP2_CONTROL_GENERAL + 0x0194)
|
||||
#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_IO1 (OMAP2_CONTROL_GENERAL + 0x01D8)
|
||||
#define OMAP343X_CONTROL_DSS_DPLL_SPREADING (OMAP2_CONTROL_GENERAL + 0x01E0)
|
||||
|
|
|
@ -122,16 +122,21 @@
|
|||
#define OMAP243X_SMS_VIRT (OMAP243X_SMS_PHYS + OMAP2_L3_IO_OFFSET)
|
||||
#define OMAP243X_SMS_SIZE SZ_1M
|
||||
|
||||
/* DSP */
|
||||
#define DSP_MEM_24XX_PHYS OMAP2420_DSP_MEM_BASE /* 0x58000000 */
|
||||
#define DSP_MEM_24XX_VIRT 0xe0000000
|
||||
#define DSP_MEM_24XX_SIZE 0x28000
|
||||
#define DSP_IPI_24XX_PHYS OMAP2420_DSP_IPI_BASE /* 0x59000000 */
|
||||
#define DSP_IPI_24XX_VIRT 0xe1000000
|
||||
#define DSP_IPI_24XX_SIZE SZ_4K
|
||||
#define DSP_MMU_24XX_PHYS OMAP2420_DSP_MMU_BASE /* 0x5a000000 */
|
||||
#define DSP_MMU_24XX_VIRT 0xe2000000
|
||||
#define DSP_MMU_24XX_SIZE SZ_4K
|
||||
/* 2420 IVA */
|
||||
#define DSP_MEM_2420_PHYS OMAP2420_DSP_MEM_BASE
|
||||
/* 0x58000000 --> 0xfc100000 */
|
||||
#define DSP_MEM_2420_VIRT 0xfc100000
|
||||
#define DSP_MEM_2420_SIZE 0x28000
|
||||
#define DSP_IPI_2420_PHYS OMAP2420_DSP_IPI_BASE
|
||||
/* 0x59000000 --> 0xfc128000 */
|
||||
#define DSP_IPI_2420_VIRT 0xfc128000
|
||||
#define DSP_IPI_2420_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 @@
|
|||
#define OMAP343X_SDRC_VIRT (OMAP343X_SDRC_PHYS + OMAP2_L3_IO_OFFSET)
|
||||
#define OMAP343X_SDRC_SIZE SZ_1M
|
||||
|
||||
/* DSP */
|
||||
#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
|
||||
/* 3430 IVA - currently unmapped */
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
|
|
|
@ -183,6 +183,14 @@ enum omap7xx_index {
|
|||
/* I2C */
|
||||
I2C_7XX_SCL,
|
||||
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 {
|
||||
|
|
|
@ -46,6 +46,9 @@
|
|||
#define OMAP7XX_DSPREG_SIZE SZ_128K
|
||||
#define OMAP7XX_DSPREG_START 0xE1000000
|
||||
|
||||
#define OMAP7XX_SPI1_BASE 0xfffc0800
|
||||
#define OMAP7XX_SPI2_BASE 0xfffc1000
|
||||
|
||||
/*
|
||||
* ----------------------------------------------------------------------------
|
||||
* OMAP7XX specific configuration registers
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
if (cpu_is_omap2420()) {
|
||||
if (BETWEEN(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_SIZE))
|
||||
return XLATE(p, DSP_MEM_24XX_PHYS, DSP_MEM_24XX_VIRT);
|
||||
if (BETWEEN(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE))
|
||||
return XLATE(p, DSP_IPI_24XX_PHYS, DSP_IPI_24XX_SIZE);
|
||||
if (BETWEEN(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_SIZE))
|
||||
return XLATE(p, DSP_MMU_24XX_PHYS, DSP_MMU_24XX_VIRT);
|
||||
if (BETWEEN(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_SIZE))
|
||||
return XLATE(p, DSP_MEM_2420_PHYS, DSP_MEM_2420_VIRT);
|
||||
if (BETWEEN(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE))
|
||||
return XLATE(p, DSP_IPI_2420_PHYS, DSP_IPI_2420_SIZE);
|
||||
if (BETWEEN(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_SIZE))
|
||||
return XLATE(p, DSP_MMU_2420_PHYS, DSP_MMU_2420_VIRT);
|
||||
}
|
||||
if (cpu_is_omap2430()) {
|
||||
if (BETWEEN(p, L4_WK_243X_PHYS, L4_WK_243X_SIZE))
|
||||
|
|
|
@ -827,7 +827,7 @@ EXPORT_SYMBOL_GPL(iommu_get);
|
|||
**/
|
||||
void iommu_put(struct iommu *obj)
|
||||
{
|
||||
if (!obj && IS_ERR(obj))
|
||||
if (!obj || IS_ERR(obj))
|
||||
return;
|
||||
|
||||
mutex_lock(&obj->iommu_lock);
|
||||
|
|
|
@ -436,7 +436,7 @@ int omap_mcbsp_request(unsigned int id)
|
|||
dev_err(mcbsp->dev, "Unable to request TX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->tx_irq,
|
||||
mcbsp->id);
|
||||
return err;
|
||||
goto error;
|
||||
}
|
||||
|
||||
init_completion(&mcbsp->rx_irq_completion);
|
||||
|
@ -446,12 +446,26 @@ int omap_mcbsp_request(unsigned int id)
|
|||
dev_err(mcbsp->dev, "Unable to request RX IRQ %d "
|
||||
"for McBSP%d\n", mcbsp->rx_irq,
|
||||
mcbsp->id);
|
||||
free_irq(mcbsp->tx_irq, (void *)mcbsp);
|
||||
return err;
|
||||
goto tx_irq;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -139,8 +139,6 @@ static int omapbl_probe(struct platform_device *pdev)
|
|||
if (!pdata)
|
||||
return -ENXIO;
|
||||
|
||||
omapbl_ops.check_fb = pdata->check_fb;
|
||||
|
||||
bl = kzalloc(sizeof(struct omap_backlight), GFP_KERNEL);
|
||||
if (unlikely(!bl))
|
||||
return -ENOMEM;
|
||||
|
|
Загрузка…
Ссылка в новой задаче