#include <mach/rk29_iomap.h>
#include <mach/cru.h>
#include <mach/pmu.h>
+#include <mach/sram.h>
/* Clock flags */
#define CONFIG_PARTICIPANT (1 << 10) /* Fundamental clock */
#define IS_PD (1 << 2) /* Power Domain */
-#define cru_readl(offset) readl(RK29_CRU_BASE + offset)
-#define cru_writel(v, offset) writel(v, RK29_CRU_BASE + offset)
-
#define regfile_readl(offset) readl(RK29_GRF_BASE + offset)
#define pmu_readl(offset) readl(RK29_PMU_BASE + offset)
GATE_CLK(hclk_emmc, hclk_periph, HCLK_EMMC);
+static void __sramfunc pmu_set_power_domain_sram(enum pmu_power_domain pd, bool on)
+{
+ if (on)
+ writel(readl(RK29_PMU_BASE + PMU_PD_CON) & ~(1 << pd), RK29_PMU_BASE + PMU_PD_CON);
+ else
+ writel(readl(RK29_PMU_BASE + PMU_PD_CON) | (1 << pd), RK29_PMU_BASE + PMU_PD_CON);
+ dsb();
+
+ while (pmu_power_domain_is_on(pd) != on)
+ ;
+}
+
+static noinline void do_pmu_set_power_domain(enum pmu_power_domain pd, bool on)
+{
+ static unsigned long save_sp;
+
+ DDR_SAVE_SP(save_sp);
+ pmu_set_power_domain_sram(pd, on);
+ DDR_RESTORE_SP(save_sp);
+}
+
+void pmu_set_power_domain(enum pmu_power_domain pd, bool on)
+{
+ unsigned long flags;
+
+ local_irq_save(flags);
+ mdelay(10);
+ do_pmu_set_power_domain(pd, on);
+ mdelay(10);
+ local_irq_restore(flags);
+}
+
static int pd_vcodec_mode(struct clk *clk, int on)
{
if (on) {
pmu_set_power_domain(PD_VCODEC, true);
- udelay(10);
-
cru_writel(cru_clkgate3_con_mirror, CRU_CLKGATE3_CON);
} else {
pmu_set_power_domain(PD_VCODEC, false);
pmu_set_power_domain(PD_DISPLAY, true);
- udelay(10);
-
cru_writel(gate2, CRU_CLKGATE2_CON);
cru_writel(cru_clkgate3_con_mirror, CRU_CLKGATE3_CON);
} else {
#define CRU_SOFTRST1_CON 0x70
#define CRU_SOFTRST2_CON 0x74
+#define cru_readl(offset) readl(RK29_CRU_BASE + offset)
+#define cru_writel(v, offset) do { writel(v, RK29_CRU_BASE + offset); dsb(); } while (0)
+
extern volatile u32 cru_clkgate3_con_mirror;
void cru_set_soft_reset(enum cru_soft_reset idx, bool on);
return !(readl(RK29_PMU_BASE + PMU_PD_ST) & (1 << pd));
}
-static inline void pmu_set_power_domain(enum pmu_power_domain pd, bool on)
-{
- unsigned long flags;
-
- local_irq_save(flags);
- if (on)
- writel(readl(RK29_PMU_BASE + PMU_PD_CON) & ~(1 << pd), RK29_PMU_BASE + PMU_PD_CON);
- else
- writel(readl(RK29_PMU_BASE + PMU_PD_CON) | (1 << pd), RK29_PMU_BASE + PMU_PD_CON);
- local_irq_restore(flags);
-
- while (pmu_power_domain_is_on(pd) != on)
- ;
-}
+void pmu_set_power_domain(enum pmu_power_domain pd, bool on);
#endif
#include <mach/ddr.h>
#include <mach/memtester.h>
-#define cru_readl(offset) readl(RK29_CRU_BASE + offset)
-#define cru_writel(v, offset) do { writel(v, RK29_CRU_BASE + offset); readl(RK29_CRU_BASE + offset); } while (0)
-#define pmu_readl(offset) readl(RK29_PMU_BASE + offset)
-#define pmu_writel(v, offset) do { writel(v, RK29_PMU_BASE + offset); readl(RK29_PMU_BASE + offset); } while (0)
static unsigned long save_sp;
#define LOOPS_PER_USEC 13