static int stx7111_suspend_core(suspend_state_t state, int suspending) { static unsigned char *clka_pll0_div; static unsigned char *clka_pll1_div; static unsigned long *clka_switch_cfg; int i; long pwr = 0x3; /* PLL_0/PLL_1 both OFF */ long cfg_0, cfg_1; if (suspending) goto on_suspending; if (!clka_pll0_div) /* there was an error on suspending */ return 0; /* Resuming... */ iowrite32(0, cga + CKGA_POWER_CFG); while (!(ioread32(cga + CKGA_PLL(0)) & CKGA_PLL_LOCK)) ; while (!(ioread32(cga + CKGA_PLL(1)) & CKGA_PLL_LOCK)) ; /* applay the original parents */ iowrite32(clka_switch_cfg[0], cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(clka_switch_cfg[1], cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); /* restore all the clocks settings */ for (i = 0; i < 18; ++i) { iowrite32(clka_pll0_div[i], cga + ((i < 4) ? CKGA_PLL0HS_DIV_CFG(i) : CKGA_PLL0LS_DIV_CFG(i))); iowrite32(clka_pll1_div[i], cga + CKGA_PLL1_DIV_CFG(i)); } mdelay(10); pr_devel("[STM][PM] ClockGen A: restored\n"); kfree(clka_pll0_div); kfree(clka_pll1_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; stx7111_suspend_wake(); return 0; on_suspending: clka_pll0_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_pll1_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_switch_cfg = kmalloc(sizeof(long) * 2, GFP_ATOMIC); if (!clka_pll0_div || !clka_pll1_div || !clka_switch_cfg) goto error; /* save the original settings */ clka_switch_cfg[0] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); clka_switch_cfg[1] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); for (i = 0; i < 18; ++i) { clka_pll0_div[i] = ioread32(cga + ((i < 4) ? CKGA_PLL0HS_DIV_CFG(i) : CKGA_PLL0LS_DIV_CFG(i))); clka_pll1_div[i] = ioread32(cga + CKGA_PLL1_DIV_CFG(i)); } pr_devel("[STM][PM] ClockGen A: saved\n"); mdelay(10); /* to avoid the system is to much slow all * the clocks are scaled @ 30 MHz * the final setting is done in the tables */ for (i = 0; i < 18; ++i) iowrite32(0, cga + CKGA_OSC_DIV_CFG(i)); /* almost all the clocks off, except some critical ones */ cfg_0 = 0xffffffff; cfg_0 &= ~(0x3 << (2 * CLKA_ST40_ICK_ID)); cfg_0 &= ~(0x3 << (2 * CLKA_IC_IF_100_ID)); cfg_1 = 0xf; cfg_1 &= ~(0x3 << (2 * (CLKA_IC_IF_200_ID - 16))); if (wkd.stm_mac0_can_wakeup) { unsigned long pll_id; /* identify the eth_phy_clk */ pll_id = (clk_get_parent(ca_eth_phy_clk) == ca_pll1_clk) ? 2 : 1; pwr &= ~pll_id; cfg_0 &= ~(0x3 << (2 * CLKA_ETH_PHY_ID)); cfg_0 |= (pll_id << (2 * CLKA_ETH_PHY_ID)); } if (wkd.hdmi_can_wakeup) { /* Pll_1 on */ pwr &= ~2; /* ic_if_100 under pll1 */ cfg_0 &= ~(0x3 << (2 * CLKA_IC_IF_100_ID)); cfg_0 |= (0x2 << (2 * CLKA_IC_IF_100_ID)); } else { if (!wkd.lirc_can_wakeup) clk_set_rate(ca_ic_if_100_clk, clk_get_rate(ca_ref_clk)/32); } iowrite32(cfg_0, cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(cfg_1, cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); iowrite32(pwr, cga + CKGA_POWER_CFG); return 0; error: kfree(clka_pll1_div); kfree(clka_pll0_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; return -ENOMEM; }
static int fli7510_suspend_core(suspend_state_t state, int suspending) { static unsigned char *clka_pll0_div; static unsigned char *clka_pll1_div; static unsigned long *clka_switch_cfg; int i; long pwr = 0x3; /* PLL_0/PLL_1 both OFF */ long cfg_0, cfg_1; if (state == PM_SUSPEND_STANDBY) return 0; if (suspending) goto on_suspending; if (!clka_pll0_div) /* there was an error on suspending */ return 0; /* Resuming... */ iowrite32(0, cga + CKGA_POWER_CFG); while (!(ioread32(cga + CKGA_PLL(0)) & CKGA_PLL_LOCK)) ; while (!(ioread32(cga + CKGA_PLL(1)) & CKGA_PLL_LOCK)) ; /* applay the original parents */ iowrite32(clka_switch_cfg[0], cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(clka_switch_cfg[1], cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); /* restore all the clocks settings */ for (i = 0; i < 18; ++i) { iowrite32(clka_pll0_div[i], cga + ((i < 4) ? CKGA_PLL0HS_DIV_CFG(i) : CKGA_PLL0LS_DIV_CFG(i))); iowrite32(clka_pll1_div[i], cga + CKGA_PLL1_DIV_CFG(i)); } mdelay(10); pr_devel("[STM][PM] ClockGen A: restored\n"); kfree(clka_pll0_div); kfree(clka_pll1_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; /* Restore ic_if_100 to previous rate */ clk_set_parent(ca_ic_100_clk, ca_pll_clk); clk_set_rate(ca_ic_100_clk, ca_ic_100_clk_rate); return 0; on_suspending: clka_pll0_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_pll1_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_switch_cfg = kmalloc(sizeof(long) * 2, GFP_ATOMIC); if (!clka_pll0_div || !clka_pll1_div || !clka_switch_cfg) goto error; /* save the original settings */ clka_switch_cfg[0] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); clka_switch_cfg[1] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); for (i = 0; i < 18; ++i) { clka_pll0_div[i] = ioread32(cga + ((i < 4) ? CKGA_PLL0HS_DIV_CFG(i) : CKGA_PLL0LS_DIV_CFG(i))); clka_pll1_div[i] = ioread32(cga + CKGA_PLL1_DIV_CFG(i)); } pr_devel("[STM][PM] ClockGen A: saved\n"); mdelay(10); /* to avoid the system is to much slow all * the clocks are scaled @ 30 MHz * the final setting is done in the tables */ for (i = 0; i < 18; ++i) iowrite32(0, cga + CKGA_OSC_DIV_CFG(i)); /* almost all the clocks off, except some critical ones */ cfg_0 = 0xffffff3f; /* * Not clear why: * - the Audio Dec. Clock can not disabled */ cfg_0 &= ~(0x3 << (2 * CLKA_ST40_HOST_ID)); cfg_0 &= ~(0x3 << (2 * CLKA_IC_100_ID)); cfg_0 &= ~(0x3 << (2 * CLKA_IC_150_ID)); cfg_1 = 0xff; cfg_1 &= ~(0x3 << (2 * CLKA_IC_200_ID)); #if 0 if (wkd.eth_phy_can_wakeup) { /* Pll_0 on */ pwr &= ~1; /* eth_phy_clk under pll0 */ cfg_0 &= ~(0x3 << (2 * CLKA_ETH_PHY_ID)); cfg_0 |= (0x1 << (2 * CLKA_ETH_PHY_ID)); } if (wkd.hdmi_can_wakeup) { /* Pll_1 on */ pwr &= ~2; /* ic_if_100 under pll1 */ cfg_0 &= ~(0x3 << (2 * CLKA_IC_IF_100_ID)); cfg_0 |= (0x2 << (2 * CLKA_IC_IF_100_ID)); } else { if (!wkd.lirc_can_wakeup) clk_set_rate(ca_ic_100_clk, clk_get_rate(ca_ref_clk)/32); } #endif iowrite32(cfg_0, cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(cfg_1, cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); iowrite32(pwr, cga + CKGA_POWER_CFG); return 0; error: kfree(clka_pll1_div); kfree(clka_pll0_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; return -ENOMEM; }
static int stx7105_suspend_core(suspend_state_t state, int suspending) { static unsigned char *clka_pll0_div; static unsigned char *clka_pll1_div; static unsigned long *clka_switch_cfg; static unsigned long saved_gplmi_appd; int i; if (suspending) goto on_suspending; if (!clka_pll0_div) /* there was an error on suspending */ return 0; /* Resuming... */ iowrite32(0, cga + CKGA_POWER_CFG); while (!(ioread32(cga + CKGA_PLL(0)) & CKGA_PLL_LOCK)) ; while (!(ioread32(cga + CKGA_PLL(1)) & CKGA_PLL_LOCK)) ; /* applay the original parents */ iowrite32(clka_switch_cfg[0], cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(clka_switch_cfg[1], cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); /* restore all the clocks settings */ for (i = 0; i < 18; ++i) { iowrite32(clka_pll0_div[i], ((i < 4) ? cga + CKGA_PLL0HS_DIV_CFG(i) : cga + CKGA_PLL0LS_DIV_CFG(i))); iowrite32(clka_pll1_div[i], cga + CKGA_PLL1_DIV_CFG(i)); } mdelay(10); pr_devel("[STM][PM] ClockGen A: restored\n"); /* restore the APPD */ iowrite32(saved_gplmi_appd, LMI_APPD(0)); kfree(clka_pll0_div); kfree(clka_pll1_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; stx7105_suspend_wake(); return 0; on_suspending: clka_pll0_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_pll1_div = kmalloc(sizeof(char) * 18, GFP_ATOMIC); clka_switch_cfg = kmalloc(sizeof(long) * 2, GFP_ATOMIC); if (!clka_pll0_div || !clka_pll1_div || !clka_switch_cfg) goto error; /* save the current APPD setting*/ saved_gplmi_appd = ioread32(LMI_APPD(0)); /* disable the APPD */ iowrite32(0x0, LMI_APPD(0)); /* save the original settings */ clka_switch_cfg[0] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); clka_switch_cfg[1] = ioread32(cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); for (i = 0; i < 18; ++i) { clka_pll0_div[i] = ioread32(((i < 4) ? cga + CKGA_PLL0HS_DIV_CFG(i) : cga + CKGA_PLL0LS_DIV_CFG(i))); clka_pll1_div[i] = ioread32(cga + CKGA_PLL1_DIV_CFG(i)); } pr_devel("[STM][PM] ClockGen A: saved\n"); mdelay(10); /* to avoid the system is to much slow all * the clocks are scaled @ 30 MHz * the final setting is done in the tables */ for (i = 0; i < 18; ++i) iowrite32(0, cga + CKGA_OSC_DIV_CFG(i)); /* almost all the clocks off */ iowrite32(0xfffff0ff, cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(0x3, cga + CKGA_CLKOPSRC_SWITCH_CFG(1)); if (wkd.hdmi_can_wakeup || wkd.eth_phy_can_wakeup) { unsigned long pwr = 0x3; /* Plls Off */ unsigned long cfg = 0xfffff0ff; #define CLKA_IC_IF_100_ID 5 #define CLKA_ETH0_PHY_ID 13 if (wkd.hdmi_can_wakeup) { /* needs PLL1 on */ pwr &= ~2; cfg &= ~(0x3 << (2 * CLKA_IC_IF_100_ID)); cfg |= (0x2 << (2 * CLKA_IC_IF_100_ID)); } if (wkd.eth_phy_can_wakeup) { /* needs PLL1 on */ pwr &= ~2; cfg &= ~(0x3 << (2 * CLKA_ETH0_PHY_ID)); cfg |= (0x2 << (2 * CLKA_ETH0_PHY_ID)); } iowrite32(cfg, cga + CKGA_CLKOPSRC_SWITCH_CFG(0)); iowrite32(pwr, cga + CKGA_POWER_CFG); } else { iowrite32(3, cga + CKGA_POWER_CFG); if (!wkd.lirc_can_wakeup) clk_set_rate(ca_ic_if_100_clk, clk_get_rate(ca_ref_clk)/32); } return 0; error: kfree(clka_pll1_div); kfree(clka_pll0_div); kfree(clka_switch_cfg); clka_switch_cfg = NULL; clka_pll0_div = clka_pll1_div = NULL; return -ENOMEM; }