Commit d8e7b2b3 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:
  omapfb: Blizzard: constify register address tables
  omapfb: Blizzard: fix pointer to be const
  omapfb: Condition mutex acquisition
  omap: iovmm: Add missing mutex_unlock
  omap: iovmm: Fix incorrect spelling
  omap: SRAM: flush the right address after memcpy in omap_sram_push
  omap: Lock DPLL5 at boot
  omap: Fix incorrect 730 vs 850 detection
  OMAP3: PM: introduce a new powerdomain walk helper
  OMAP3: PM: Enable GPIO module-level wakeups
  OMAP3: PM: USBHOST: clear wakeup events on both hosts
  OMAP3: PM: PRCM interrupt: only handle selected PRCM interrupts
  OMAP3: PM: PRCM interrupt: check MPUGRPSEL register
  OMAP3: PM: Prevent hang in prcm_interrupt_handler
parents 1bfd16a6 ab8d64d7
...@@ -338,6 +338,13 @@ static struct omap_clk omap34xx_clks[] = { ...@@ -338,6 +338,13 @@ static struct omap_clk omap34xx_clks[] = {
*/ */
#define SDRC_MPURATE_LOOPS 96 #define SDRC_MPURATE_LOOPS 96
/*
* DPLL5_FREQ_FOR_USBHOST: USBHOST and USBTLL are the only clocks
* that are sourced by DPLL5, and both of these require this clock
* to be at 120 MHz for proper operation.
*/
#define DPLL5_FREQ_FOR_USBHOST 120000000
/** /**
* omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI * omap3430es2_clk_ssi_find_idlest - return CM_IDLEST info for SSI
* @clk: struct clk * being enabled * @clk: struct clk * being enabled
...@@ -1056,6 +1063,28 @@ void omap2_clk_prepare_for_reboot(void) ...@@ -1056,6 +1063,28 @@ void omap2_clk_prepare_for_reboot(void)
#endif #endif
} }
static void omap3_clk_lock_dpll5(void)
{
struct clk *dpll5_clk;
struct clk *dpll5_m2_clk;
dpll5_clk = clk_get(NULL, "dpll5_ck");
clk_set_rate(dpll5_clk, DPLL5_FREQ_FOR_USBHOST);
clk_enable(dpll5_clk);
/* Enable autoidle to allow it to enter low power bypass */
omap3_dpll_allow_idle(dpll5_clk);
/* Program dpll5_m2_clk divider for no division */
dpll5_m2_clk = clk_get(NULL, "dpll5_m2_ck");
clk_enable(dpll5_m2_clk);
clk_set_rate(dpll5_m2_clk, DPLL5_FREQ_FOR_USBHOST);
clk_disable(dpll5_m2_clk);
clk_disable(dpll5_clk);
return;
}
/* REVISIT: Move this init stuff out into clock.c */ /* REVISIT: Move this init stuff out into clock.c */
/* /*
...@@ -1148,6 +1177,12 @@ int __init omap2_clk_init(void) ...@@ -1148,6 +1177,12 @@ int __init omap2_clk_init(void)
*/ */
clk_enable_init_clocks(); clk_enable_init_clocks();
/*
* Lock DPLL5 and put it in autoidle.
*/
if (omap_rev() >= OMAP3430_REV_ES2_0)
omap3_clk_lock_dpll5();
/* Avoid sleeping during omap2_clk_prepare_for_reboot() */ /* Avoid sleeping during omap2_clk_prepare_for_reboot() */
/* REVISIT: not yet ready for 343x */ /* REVISIT: not yet ready for 343x */
#if 0 #if 0
......
...@@ -551,7 +551,7 @@ static int __init pm_dbg_init(void) ...@@ -551,7 +551,7 @@ static int __init pm_dbg_init(void)
(void) debugfs_create_file("time", S_IRUGO, (void) debugfs_create_file("time", S_IRUGO,
d, (void *)DEBUG_FILE_TIMERS, &debug_fops); d, (void *)DEBUG_FILE_TIMERS, &debug_fops);
pwrdm_for_each(pwrdms_setup, (void *)d); pwrdm_for_each_nolock(pwrdms_setup, (void *)d);
pm_dbg_dir = debugfs_create_dir("registers", d); pm_dbg_dir = debugfs_create_dir("registers", d);
if (IS_ERR(pm_dbg_dir)) if (IS_ERR(pm_dbg_dir))
......
...@@ -51,97 +51,112 @@ static void (*_omap_sram_idle)(u32 *addr, int save_state); ...@@ -51,97 +51,112 @@ static void (*_omap_sram_idle)(u32 *addr, int save_state);
static struct powerdomain *mpu_pwrdm; static struct powerdomain *mpu_pwrdm;
/* PRCM Interrupt Handler for wakeups */ /*
static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id) * PRCM Interrupt Handler Helper Function
*
* The purpose of this function is to clear any wake-up events latched
* in the PRCM PM_WKST_x registers. It is possible that a wake-up event
* may occur whilst attempting to clear a PM_WKST_x register and thus
* set another bit in this register. A while loop is used to ensure
* that any peripheral wake-up events occurring while attempting to
* clear the PM_WKST_x are detected and cleared.
*/
static int prcm_clear_mod_irqs(s16 module, u8 regs)
{ {
u32 wkst, irqstatus_mpu; u32 wkst, fclk, iclk, clken;
u32 fclk, iclk; u16 wkst_off = (regs == 3) ? OMAP3430ES2_PM_WKST3 : PM_WKST1;
u16 fclk_off = (regs == 3) ? OMAP3430ES2_CM_FCLKEN3 : CM_FCLKEN1;
/* WKUP */ u16 iclk_off = (regs == 3) ? CM_ICLKEN3 : CM_ICLKEN1;
wkst = prm_read_mod_reg(WKUP_MOD, PM_WKST); u16 grpsel_off = (regs == 3) ?
OMAP3430ES2_PM_MPUGRPSEL3 : OMAP3430_PM_MPUGRPSEL;
int c = 0;
wkst = prm_read_mod_reg(module, wkst_off);
wkst &= prm_read_mod_reg(module, grpsel_off);
if (wkst) { if (wkst) {
iclk = cm_read_mod_reg(WKUP_MOD, CM_ICLKEN); iclk = cm_read_mod_reg(module, iclk_off);
fclk = cm_read_mod_reg(WKUP_MOD, CM_FCLKEN); fclk = cm_read_mod_reg(module, fclk_off);
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_ICLKEN); while (wkst) {
cm_set_mod_reg_bits(wkst, WKUP_MOD, CM_FCLKEN); clken = wkst;
prm_write_mod_reg(wkst, WKUP_MOD, PM_WKST); cm_set_mod_reg_bits(clken, module, iclk_off);
while (prm_read_mod_reg(WKUP_MOD, PM_WKST)) /*
cpu_relax(); * For USBHOST, we don't know whether HOST1 or
cm_write_mod_reg(iclk, WKUP_MOD, CM_ICLKEN); * HOST2 woke us up, so enable both f-clocks
cm_write_mod_reg(fclk, WKUP_MOD, CM_FCLKEN); */
} if (module == OMAP3430ES2_USBHOST_MOD)
clken |= 1 << OMAP3430ES2_EN_USBHOST2_SHIFT;
/* CORE */ cm_set_mod_reg_bits(clken, module, fclk_off);
wkst = prm_read_mod_reg(CORE_MOD, PM_WKST1); prm_write_mod_reg(wkst, module, wkst_off);
if (wkst) { wkst = prm_read_mod_reg(module, wkst_off);
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN1); c++;
fclk = cm_read_mod_reg(CORE_MOD, CM_FCLKEN1);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN1);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_FCLKEN1);
prm_write_mod_reg(wkst, CORE_MOD, PM_WKST1);
while (prm_read_mod_reg(CORE_MOD, PM_WKST1))
cpu_relax();
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN1);
cm_write_mod_reg(fclk, CORE_MOD, CM_FCLKEN1);
} }
wkst = prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3); cm_write_mod_reg(iclk, module, iclk_off);
if (wkst) { cm_write_mod_reg(fclk, module, fclk_off);
iclk = cm_read_mod_reg(CORE_MOD, CM_ICLKEN3);
fclk = cm_read_mod_reg(CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
cm_set_mod_reg_bits(wkst, CORE_MOD, CM_ICLKEN3);
cm_set_mod_reg_bits(wkst, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
prm_write_mod_reg(wkst, CORE_MOD, OMAP3430ES2_PM_WKST3);
while (prm_read_mod_reg(CORE_MOD, OMAP3430ES2_PM_WKST3))
cpu_relax();
cm_write_mod_reg(iclk, CORE_MOD, CM_ICLKEN3);
cm_write_mod_reg(fclk, CORE_MOD, OMAP3430ES2_CM_FCLKEN3);
} }
/* PER */ return c;
wkst = prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST); }
if (wkst) {
iclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_ICLKEN);
fclk = cm_read_mod_reg(OMAP3430_PER_MOD, CM_FCLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_ICLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430_PER_MOD, CM_FCLKEN);
prm_write_mod_reg(wkst, OMAP3430_PER_MOD, PM_WKST);
while (prm_read_mod_reg(OMAP3430_PER_MOD, PM_WKST))
cpu_relax();
cm_write_mod_reg(iclk, OMAP3430_PER_MOD, CM_ICLKEN);
cm_write_mod_reg(fclk, OMAP3430_PER_MOD, CM_FCLKEN);
}
static int _prcm_int_handle_wakeup(void)
{
int c;
c = prcm_clear_mod_irqs(WKUP_MOD, 1);
c += prcm_clear_mod_irqs(CORE_MOD, 1);
c += prcm_clear_mod_irqs(OMAP3430_PER_MOD, 1);
if (omap_rev() > OMAP3430_REV_ES1_0) { if (omap_rev() > OMAP3430_REV_ES1_0) {
/* USBHOST */ c += prcm_clear_mod_irqs(CORE_MOD, 3);
wkst = prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD, PM_WKST); c += prcm_clear_mod_irqs(OMAP3430ES2_USBHOST_MOD, 1);
if (wkst) {
iclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
fclk = cm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
cm_set_mod_reg_bits(wkst, OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
prm_write_mod_reg(wkst, OMAP3430ES2_USBHOST_MOD,
PM_WKST);
while (prm_read_mod_reg(OMAP3430ES2_USBHOST_MOD,
PM_WKST))
cpu_relax();
cm_write_mod_reg(iclk, OMAP3430ES2_USBHOST_MOD,
CM_ICLKEN);
cm_write_mod_reg(fclk, OMAP3430ES2_USBHOST_MOD,
CM_FCLKEN);
}
} }
return c;
}
/*
* PRCM Interrupt Handler
*
* The PRM_IRQSTATUS_MPU register indicates if there are any pending
* interrupts from the PRCM for the MPU. These bits must be cleared in
* order to clear the PRCM interrupt. The PRCM interrupt handler is
* implemented to simply clear the PRM_IRQSTATUS_MPU in order to clear
* the PRCM interrupt. Please note that bit 0 of the PRM_IRQSTATUS_MPU
* register indicates that a wake-up event is pending for the MPU and
* this bit can only be cleared if the all the wake-up events latched
* in the various PM_WKST_x registers have been cleared. The interrupt
* handler is implemented using a do-while loop so that if a wake-up
* event occurred during the processing of the prcm interrupt handler
* (setting a bit in the corresponding PM_WKST_x register and thus
* preventing us from clearing bit 0 of the PRM_IRQSTATUS_MPU register)
* this would be handled.
*/
static irqreturn_t prcm_interrupt_handler (int irq, void *dev_id)
{
u32 irqstatus_mpu;
int c = 0;
do {
irqstatus_mpu = prm_read_mod_reg(OCP_MOD, irqstatus_mpu = prm_read_mod_reg(OCP_MOD,
OMAP3_PRM_IRQSTATUS_MPU_OFFSET); OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
if (irqstatus_mpu & (OMAP3430_WKUP_ST | OMAP3430_IO_ST)) {
c = _prcm_int_handle_wakeup();
/*
* Is the MPU PRCM interrupt handler racing with the
* IVA2 PRCM interrupt handler ?
*/
WARN(c == 0, "prcm: WARNING: PRCM indicated MPU wakeup "
"but no wakeup sources are marked\n");
} else {
/* XXX we need to expand our PRCM interrupt handler */
WARN(1, "prcm: WARNING: PRCM interrupt received, but "
"no code to handle it (%08x)\n", irqstatus_mpu);
}
prm_write_mod_reg(irqstatus_mpu, OCP_MOD, prm_write_mod_reg(irqstatus_mpu, OCP_MOD,
OMAP3_PRM_IRQSTATUS_MPU_OFFSET); OMAP3_PRM_IRQSTATUS_MPU_OFFSET);
while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET)) } while (prm_read_mod_reg(OCP_MOD, OMAP3_PRM_IRQSTATUS_MPU_OFFSET));
cpu_relax();
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -624,6 +639,16 @@ static void __init prcm_setup_regs(void) ...@@ -624,6 +639,16 @@ static void __init prcm_setup_regs(void)
prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN, prm_write_mod_reg(OMAP3430_IO_EN | OMAP3430_WKUP_EN,
OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET); OCP_MOD, OMAP3_PRM_IRQENABLE_MPU_OFFSET);
/* Enable GPIO wakeups in PER */
prm_write_mod_reg(OMAP3430_EN_GPIO2 | OMAP3430_EN_GPIO3 |
OMAP3430_EN_GPIO4 | OMAP3430_EN_GPIO5 |
OMAP3430_EN_GPIO6, OMAP3430_PER_MOD, PM_WKEN);
/* and allow them to wake up MPU */
prm_write_mod_reg(OMAP3430_GRPSEL_GPIO2 | OMAP3430_EN_GPIO3 |
OMAP3430_GRPSEL_GPIO4 | OMAP3430_EN_GPIO5 |
OMAP3430_GRPSEL_GPIO6,
OMAP3430_PER_MOD, OMAP3430_PM_MPUGRPSEL);
/* Don't attach IVA interrupts */ /* Don't attach IVA interrupts */
prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL); prm_write_mod_reg(0, WKUP_MOD, OMAP3430_PM_IVAGRPSEL);
prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1); prm_write_mod_reg(0, CORE_MOD, OMAP3430_PM_IVAGRPSEL1);
......
...@@ -273,35 +273,50 @@ struct powerdomain *pwrdm_lookup(const char *name) ...@@ -273,35 +273,50 @@ struct powerdomain *pwrdm_lookup(const char *name)
} }
/** /**
* pwrdm_for_each - call function on each registered clockdomain * pwrdm_for_each_nolock - call function on each registered clockdomain
* @fn: callback function * * @fn: callback function *
* *
* Call the supplied function for each registered powerdomain. The * Call the supplied function for each registered powerdomain. The
* callback function can return anything but 0 to bail out early from * callback function can return anything but 0 to bail out early from
* the iterator. The callback function is called with the pwrdm_rwlock * the iterator. Returns the last return value of the callback function, which
* held for reading, so no powerdomain structure manipulation * should be 0 for success or anything else to indicate failure; or -EINVAL if
* functions should be called from the callback, although hardware * the function pointer is null.
* powerdomain control functions are fine. Returns the last return
* value of the callback function, which should be 0 for success or
* anything else to indicate failure; or -EINVAL if the function
* pointer is null.
*/ */
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user) void *user)
{ {
struct powerdomain *temp_pwrdm; struct powerdomain *temp_pwrdm;
unsigned long flags;
int ret = 0; int ret = 0;
if (!fn) if (!fn)
return -EINVAL; return -EINVAL;
read_lock_irqsave(&pwrdm_rwlock, flags);
list_for_each_entry(temp_pwrdm, &pwrdm_list, node) { list_for_each_entry(temp_pwrdm, &pwrdm_list, node) {
ret = (*fn)(temp_pwrdm, user); ret = (*fn)(temp_pwrdm, user);
if (ret) if (ret)
break; break;
} }
return ret;
}
/**
* pwrdm_for_each - call function on each registered clockdomain
* @fn: callback function *
*
* This function is the same as 'pwrdm_for_each_nolock()', but keeps the
* &pwrdm_rwlock locked for reading, so no powerdomain structure manipulation
* functions should be called from the callback, although hardware powerdomain
* control functions are fine.
*/
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user)
{
unsigned long flags;
int ret;
read_lock_irqsave(&pwrdm_rwlock, flags);
ret = pwrdm_for_each_nolock(fn, user);
read_unlock_irqrestore(&pwrdm_rwlock, flags); read_unlock_irqrestore(&pwrdm_rwlock, flags);
return ret; return ret;
......
...@@ -303,32 +303,21 @@ IS_OMAP_TYPE(3430, 0x3430) ...@@ -303,32 +303,21 @@ IS_OMAP_TYPE(3430, 0x3430)
#define cpu_is_omap2430() 0 #define cpu_is_omap2430() 0
#define cpu_is_omap3430() 0 #define cpu_is_omap3430() 0
#if defined(MULTI_OMAP1) /*
# if defined(CONFIG_ARCH_OMAP730) * Whether we have MULTI_OMAP1 or not, we still need to distinguish
* between 730 vs 850, 330 vs. 1510 and 1611B/5912 vs. 1710.
*/
#if defined(CONFIG_ARCH_OMAP730)
# undef cpu_is_omap730 # undef cpu_is_omap730
# define cpu_is_omap730() is_omap730() # define cpu_is_omap730() is_omap730()
# endif
# if defined(CONFIG_ARCH_OMAP850)
# undef cpu_is_omap850
# define cpu_is_omap850() is_omap850()
# endif
#else
# if defined(CONFIG_ARCH_OMAP730)
# undef cpu_is_omap730
# define cpu_is_omap730() 1
# endif
#endif #endif
#else
# if defined(CONFIG_ARCH_OMAP850) #if defined(CONFIG_ARCH_OMAP850)
# undef cpu_is_omap850 # undef cpu_is_omap850
# define cpu_is_omap850() 1 # define cpu_is_omap850() is_omap850()
# endif
#endif #endif
/*
* Whether we have MULTI_OMAP1 or not, we still need to distinguish
* between 330 vs. 1510 and 1611B/5912 vs. 1710.
*/
#if defined(CONFIG_ARCH_OMAP15XX) #if defined(CONFIG_ARCH_OMAP15XX)
# undef cpu_is_omap310 # undef cpu_is_omap310
# undef cpu_is_omap1510 # undef cpu_is_omap1510
...@@ -433,3 +422,5 @@ IS_OMAP_TYPE(3430, 0x3430) ...@@ -433,3 +422,5 @@ IS_OMAP_TYPE(3430, 0x3430)
int omap_chip_is(struct omap_chip_id oci); int omap_chip_is(struct omap_chip_id oci);
void omap2_check_revision(void); void omap2_check_revision(void);
#endif
...@@ -135,6 +135,8 @@ struct powerdomain *pwrdm_lookup(const char *name); ...@@ -135,6 +135,8 @@ struct powerdomain *pwrdm_lookup(const char *name);
int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user), int pwrdm_for_each(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user); void *user);
int pwrdm_for_each_nolock(int (*fn)(struct powerdomain *pwrdm, void *user),
void *user);
int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); int pwrdm_add_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm); int pwrdm_del_clkdm(struct powerdomain *pwrdm, struct clockdomain *clkdm);
......
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
* 'va': mpu virtual address * 'va': mpu virtual address
* *
* 'c': contiguous memory area * 'c': contiguous memory area
* 'd': dicontiguous memory area * 'd': discontiguous memory area
* 'a': anonymous memory allocation * 'a': anonymous memory allocation
* '()': optional feature * '()': optional feature
* *
...@@ -363,8 +363,9 @@ void *da_to_va(struct iommu *obj, u32 da) ...@@ -363,8 +363,9 @@ void *da_to_va(struct iommu *obj, u32 da)
goto out; goto out;
} }
va = area->va; va = area->va;
mutex_unlock(&obj->mmap_lock);
out: out:
mutex_unlock(&obj->mmap_lock);
return va; return va;
} }
EXPORT_SYMBOL_GPL(da_to_va); EXPORT_SYMBOL_GPL(da_to_va);
...@@ -398,7 +399,7 @@ static inline void sgtable_drain_vmalloc(struct sg_table *sgt) ...@@ -398,7 +399,7 @@ static inline void sgtable_drain_vmalloc(struct sg_table *sgt)
{ {
/* /*
* Actually this is not necessary at all, just exists for * Actually this is not necessary at all, just exists for
* consistency of the code readibility. * consistency of the code readability.
*/ */
BUG_ON(!sgt); BUG_ON(!sgt);
} }
...@@ -434,7 +435,7 @@ static inline void sgtable_drain_kmalloc(struct sg_table *sgt) ...@@ -434,7 +435,7 @@ static inline void sgtable_drain_kmalloc(struct sg_table *sgt)
{ {
/* /*
* Actually this is not necessary at all, just exists for * Actually this is not necessary at all, just exists for
* consistency of the code readibility * consistency of the code readability
*/ */
BUG_ON(!sgt); BUG_ON(!sgt);
} }
......
...@@ -270,7 +270,8 @@ void * omap_sram_push(void * start, unsigned long size) ...@@ -270,7 +270,8 @@ void * omap_sram_push(void * start, unsigned long size)
omap_sram_ceil -= size; omap_sram_ceil -= size;
omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *)); omap_sram_ceil = ROUND_DOWN(omap_sram_ceil, sizeof(void *));
memcpy((void *)omap_sram_ceil, start, size); memcpy((void *)omap_sram_ceil, start, size);
flush_icache_range((unsigned long)start, (unsigned long)(start + size)); flush_icache_range((unsigned long)omap_sram_ceil,
(unsigned long)(omap_sram_ceil + size));
return (void *)omap_sram_ceil; return (void *)omap_sram_ceil;
} }
......
...@@ -93,7 +93,7 @@ struct blizzard_reg_list { ...@@ -93,7 +93,7 @@ struct blizzard_reg_list {
}; };
/* These need to be saved / restored separately from the rest. */ /* These need to be saved / restored separately from the rest. */
static struct blizzard_reg_list blizzard_pll_regs[] = { static const struct blizzard_reg_list blizzard_pll_regs[] = {
{ {
.start = 0x04, /* Don't save PLL ctrl (0x0C) */ .start = 0x04, /* Don't save PLL ctrl (0x0C) */
.end = 0x0a, .end = 0x0a,
...@@ -104,7 +104,7 @@ static struct blizzard_reg_list blizzard_pll_regs[] = { ...@@ -104,7 +104,7 @@ static struct blizzard_reg_list blizzard_pll_regs[] = {
}, },
}; };
static struct blizzard_reg_list blizzard_gen_regs[] = { static const struct blizzard_reg_list blizzard_gen_regs[] = {
{ {
.start = 0x18, /* SDRAM control */ .start = 0x18, /* SDRAM control */
.end = 0x20, .end = 0x20,
...@@ -191,7 +191,7 @@ struct blizzard_struct { ...@@ -191,7 +191,7 @@ struct blizzard_struct {
struct omapfb_device *fbdev; struct omapfb_device *fbdev;
struct lcd_ctrl_extif *extif; struct lcd_ctrl_extif *extif;
struct lcd_ctrl *int_ctrl; const struct lcd_ctrl *int_ctrl;
void (*power_up)(struct device *dev); void (*power_up)(struct device *dev);
void (*power_down)(struct device *dev); void (*power_down)(struct device *dev);
...@@ -1372,7 +1372,7 @@ static void blizzard_get_caps(int plane, struct omapfb_caps *caps) ...@@ -1372,7 +1372,7 @@ static void blizzard_get_caps(int plane, struct omapfb_caps *caps)
(1 << OMAPFB_COLOR_YUV420); (1 << OMAPFB_COLOR_YUV420);
} }
static void _save_regs(struct blizzard_reg_list *list, int cnt) static void _save_regs(const struct blizzard_reg_list *list, int cnt)
{ {
int i; int i;
...@@ -1383,7 +1383,7 @@ static void _save_regs(struct blizzard_reg_list *list, int cnt) ...@@ -1383,7 +1383,7 @@ static void _save_regs(struct blizzard_reg_list *list, int cnt)
} }
} }
static void _restore_regs(struct blizzard_reg_list *list, int cnt) static void _restore_regs(const struct blizzard_reg_list *list, int cnt)
{ {
int i; int i;
......
...@@ -393,7 +393,7 @@ static void omapfb_sync(struct fb_info *fbi) ...@@ -393,7 +393,7 @@ static void omapfb_sync(struct fb_info *fbi)
* Set fb_info.fix fields and also updates fbdev. * Set fb_info.fix fields and also updates fbdev.
* When calling this fb_info.var must be set up already. * When calling this fb_info.var must be set up already.
*/ */
static void set_fb_fix(struct fb_info *fbi) static void set_fb_fix(struct fb_info *fbi, int from_init)
{ {
struct fb_fix_screeninfo *fix = &fbi->fix; struct fb_fix_screeninfo *fix = &fbi->fix;
struct fb_var_screeninfo *var = &fbi->var; struct fb_var_screeninfo *var = &fbi->var;
...@@ -403,10 +403,16 @@ static void set_fb_fix(struct fb_info *fbi) ...@@ -403,10 +403,16 @@ static void set_fb_fix(struct fb_info *fbi)
rg = &plane->fbdev->mem_desc.region[plane->idx]; rg = &plane->fbdev->mem_desc.region[plane->idx];
fbi->screen_base = rg->vaddr; fbi->screen_base = rg->vaddr;
if (!from_init) {
mutex_lock(&fbi->mm_lock); mutex_lock(&fbi->mm_lock);
fix->smem_start = rg->paddr; fix->smem_start = rg->paddr;
fix->smem_len = rg->size; fix->smem_len = rg->size;
mutex_unlock(&fbi->mm_lock); mutex_unlock(&fbi->mm_lock);
} else {
fix->smem_start = rg->paddr;
fix->smem_len = rg->size;
}
fix->type = FB_TYPE_PACKED_PIXELS; fix->type = FB_TYPE_PACKED_PIXELS;
bpp = var->bits_per_pixel; bpp = var->bits_per_pixel;
...@@ -704,7 +710,7 @@ static int omapfb_set_par(struct fb_info *fbi) ...@@ -704,7 +710,7 @@ static int omapfb_set_par(struct fb_info *fbi)
int r = 0; int r = 0;
omapfb_rqueue_lock(fbdev); omapfb_rqueue_lock(fbdev);
set_fb_fix(fbi); set_fb_fix(fbi, 0);
r = ctrl_change_mode(fbi); r = ctrl_change_mode(fbi);
omapfb_rqueue_unlock(fbdev); omapfb_rqueue_unlock(fbdev);
...@@ -904,7 +910,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) ...@@ -904,7 +910,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi)
if (old_size != size) { if (old_size != size) {
if (size) { if (size) {
memcpy(&fbi->var, new_var, sizeof(fbi->var)); memcpy(&fbi->var, new_var, sizeof(fbi->var));
set_fb_fix(fbi); set_fb_fix(fbi, 0);
} else { } else {
/* /*
* Set these explicitly to indicate that the * Set these explicitly to indicate that the
...@@ -1504,7 +1510,7 @@ static int fbinfo_init(struct omapfb_device *fbdev, struct fb_info *info) ...@@ -1504,7 +1510,7 @@ static int fbinfo_init(struct omapfb_device *fbdev, struct fb_info *info)
var->bits_per_pixel = fbdev->panel->bpp; var->bits_per_pixel = fbdev->panel->bpp;
set_fb_var(info, var); set_fb_var(info, var);
set_fb_fix(info); set_fb_fix(info, 1);
r = fb_alloc_cmap(&info->cmap, 16, 0); r = fb_alloc_cmap(&info->cmap, 16, 0);
if (r != 0) if (r != 0)
......
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