static int __init u300_clock_init(void) { u16 val; val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & U300_SYSCON_CSR_PLL208_LOCK_IND)); val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR); val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE; writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR); clk_register(); syscon_block_reset_enable(&timer_clk); timer_clk.disable(&timer_clk); syscon_block_reset_disable(&semi_clk); syscon_block_reset_disable(&emif_clk); semi_clk.enable(&semi_clk); emif_clk.enable(&emif_clk); return 0; }
int clk_enable(struct clk *clk) { int ret = 0; unsigned long iflags; spin_lock_irqsave(&clk->lock, iflags); if (clk->usecount++ == 0) { if (likely((u32)clk->parent)) ret = clk_enable(clk->parent); if (unlikely(ret != 0)) clk->usecount--; else { syscon_block_reset_disable(clk); if (clk->enable) clk->enable(clk); #ifdef CONFIG_MACH_U300_USE_I2S_AS_MASTER if (unlikely(!strcmp(clk->name, "I2S0"))) enable_i2s0_vcxo(); if (unlikely(!strcmp(clk->name, "I2S1"))) enable_i2s1_vcxo(); #endif } } spin_unlock_irqrestore(&clk->lock, iflags); return ret; }
static int syscon_clk_prepare(struct clk_hw *hw) { struct clk_syscon *sclk = to_syscon(hw); /* If the block is in reset, bring it out */ if (sclk->reset) syscon_block_reset_disable(sclk); return 0; }
int __init u300_clock_init(void) { u16 val; /* * FIXME: shall all this powermanagement stuff really live here??? */ /* Set system to run at PLL208, max performance, a known state. */ val = readw(U300_SYSCON_VBASE + U300_SYSCON_CCR); val &= ~U300_SYSCON_CCR_CLKING_PERFORMANCE_MASK; writew(val, U300_SYSCON_VBASE + U300_SYSCON_CCR); /* Wait for the PLL208 to lock if not locked in yet */ while (!(readw(U300_SYSCON_VBASE + U300_SYSCON_CSR) & U300_SYSCON_CSR_PLL208_LOCK_IND)); /* Power management enable */ val = readw(U300_SYSCON_VBASE + U300_SYSCON_PMCR); val |= U300_SYSCON_PMCR_PWR_MGNT_ENABLE; writew(val, U300_SYSCON_VBASE + U300_SYSCON_PMCR); clk_register(); /* * Some of these may be on when we boot the system so make sure they * are turned OFF. */ syscon_block_reset_enable(&timer_clk); timer_clk.disable(&timer_clk); /* * These shall be turned on by default when we boot the system * so make sure they are ON. (Adding CPU here is a bit too much.) * These clocks will be claimed by drivers later. */ syscon_block_reset_disable(&semi_clk); syscon_block_reset_disable(&emif_clk); clk_enable(&semi_clk); clk_enable(&emif_clk); return 0; }