| /* |
| * Copyright (C) 2018 Synaptics Incorporated. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 as |
| * published by the Free Software Foundation. |
| * |
| * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND |
| * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES, |
| * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY |
| * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE |
| * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR |
| * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE |
| * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND |
| * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
| * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS |
| * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF |
| * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT |
| * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY |
| * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS. |
| */ |
| |
| #include "lgpl_printf.h" |
| #include "io.h" |
| #include "global.h" |
| #include "util.h" |
| #include "Galois_memmap.h" |
| #include "avio_memmap.h" |
| #include "hdmiRxPipe.h" |
| #include "hdrx.h" |
| #include "avioGbl.h" |
| #include "pcie.h" |
| #include "apbRegBase.h" |
| #include "SysMgr.h" |
| #include "sm_memmap.h" |
| #include "power_tuning.h" |
| #include "board_config.h" |
| #include "pcie.h" |
| #include "power_ctrl.h" |
| |
| #define SET_BIT_FIELD(u32_type, u32_var, bitfield, value) \ |
| do { \ |
| volatile u32_type temp_341asd; \ |
| BFM_HOST_Bus_Read32(&(u32_var), &temp_341asd.u32); \ |
| temp_341asd.bitfield = value; \ |
| BFM_HOST_Bus_Write32(&(u32_var), temp_341asd.u32); \ |
| } while(0) |
| |
| int power_ctrl_emmc(enum POWER_ACT act, enum POWER_SEL sel) |
| { |
| SIE_Gbl* ptGlobal = (SIE_Gbl*)MEMMAP_CHIP_CTRL_REG_BASE; |
| //unsigned int addr,val; |
| if (act == POWER_ON) { |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_emmcSysClkEn, 1); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_emmcClk.u32clkD4_ctrl, uctrl_ClkEn, 1); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_SRAM) { |
| |
| } |
| } else if (act == POWER_OFF) { |
| if (sel & POWER_SEL_SRAM) { |
| |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_emmcSysClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_emmcClk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| } |
| } else { |
| lgpl_printf("%s, invalid power control option:%d\n", __func__, act); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int powerdown_emmc(int powerdown) |
| { |
| if(powerdown) { |
| power_ctrl_emmc(POWER_OFF, POWER_SEL_ALL); |
| } else { |
| power_ctrl_emmc(POWER_ON, POWER_SEL_ALL); |
| } |
| |
| return 0; |
| } |
| |
| int powerdown_spi(int powerdown, int id) |
| { |
| unsigned int temp; |
| if (powerdown) |
| { |
| if (id == 0) |
| { |
| // disable |
| BFM_HOST_Bus_Read32(APB_SSI1_BASE+0x08, &temp); |
| _BFSET_(temp, 0, 0, 0); |
| BFM_HOST_Bus_Write32(APB_SSI1_BASE+0x08, temp); |
| } |
| } |
| else |
| { |
| if (id == 0) |
| { |
| // enable |
| BFM_HOST_Bus_Read32(APB_SSI1_BASE+0x08, &temp); |
| _BFSET_(temp, 0, 0, 1); |
| BFM_HOST_Bus_Write32(APB_SSI1_BASE+0x08, temp); |
| } |
| } |
| |
| return 0; |
| } |
| |
| int power_ctrl_nna(enum POWER_ACT act, enum POWER_SEL sel) |
| { |
| SIE_Gbl* ptGlobal = (SIE_Gbl*)MEMMAP_CHIP_CTRL_REG_BASE; |
| unsigned int data; |
| |
| if (act == POWER_ON) { |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32clkD2_ctrl, ptGlobal->ie_nnaSysClk.u32clkD2_ctrl, uctrl_ClkEn, 1); |
| SET_BIT_FIELD(T32clkD2_ctrl, ptGlobal->ie_nnaCoreClk.u32clkD2_ctrl, uctrl_ClkEn, 1); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_NNA, &data); |
| data &= ~3; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_NNA, data); |
| } |
| } else if (act == POWER_OFF) { |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_NNA, &data); |
| data &= ~3; |
| data |= 1; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_NNA, data); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32clkD2_ctrl, ptGlobal->ie_nnaSysClk.u32clkD2_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD2_ctrl, ptGlobal->ie_nnaCoreClk.u32clkD2_ctrl, uctrl_ClkEn, 0); |
| } |
| } else { |
| lgpl_printf("%s, invalid power control option:%d\n", __func__, act); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int powerdown_nna(int powerdown) |
| { |
| if(powerdown) |
| return power_ctrl_nna(POWER_OFF, POWER_SEL_ALL); |
| else |
| return power_ctrl_nna(POWER_ON, POWER_SEL_ALL); |
| } |
| |
| void power_on_pcie_phy(unsigned int mac_base, unsigned int phy_base) |
| { |
| unsigned int data; |
| BFM_HOST_Bus_Read32(mac_base + RA_PCIE_REFCLK, &data); |
| data &= ~MSK32REFCLK_CTRL_PD; |
| BFM_HOST_Bus_Write32(mac_base + RA_PCIE_REFCLK, data); |
| |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 8, &data); |
| data &= ~(1 << 0); |
| data &= ~(1 << 4); |
| data |= (1 << 12); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 8, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x18, &data); |
| data |= (1 << 8); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x18, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x1c, &data); |
| data &= ~(1 << 8); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x1c, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x28, &data); |
| data &= ~(1 << 0); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x28, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x2c, &data); |
| data &= ~(1 << 5); |
| data &= ~(1 << 8); |
| data &= ~(1 << 12); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x2c, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x0, &data); |
| data |= (1 << 0); |
| data &= ~(1 << 3); |
| data &= ~(1 << 4); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x0, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x4, &data); |
| data &= ~(1 << 15); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x4, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x24, &data); |
| data &= ~(1 << 0); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x24, data); |
| } |
| |
| static void power_off_pcie_phy(unsigned int mac_base, unsigned int phy_base) |
| { |
| unsigned int data; |
| BFM_HOST_Bus_Read32(mac_base + RA_PCIE_REFCLK, &data); |
| data |= MSK32REFCLK_CTRL_PD; |
| BFM_HOST_Bus_Write32(mac_base + RA_PCIE_REFCLK, data); |
| |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 8, &data); |
| data |= (1 << 0); |
| data |= (1 << 4); |
| data &= ~(1 << 12); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 8, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x18, &data); |
| data &= ~(1 << 8); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x18, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x1c, &data); |
| data |= (1 << 8); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x1c, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x28, &data); |
| data |= (1 << 0); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x28, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10800 + 0x2c, &data); |
| data |= (1 << 5); |
| data |= (1 << 8); |
| data |= (1 << 12); |
| BFM_HOST_Bus_Write32(phy_base + 0x10800 + 0x2c, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x0, &data); |
| data &= ~(1 << 0); |
| data |= (1 << 3); |
| data |= (1 << 4); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x0, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x4, &data); |
| data |= (1 << 15); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x4, data); |
| |
| BFM_HOST_Bus_Read32(phy_base + 0x10000 + 0x24, &data); |
| data |= (1 << 0); |
| BFM_HOST_Bus_Write32(phy_base + 0x10000 + 0x24, data); |
| } |
| |
| int power_ctrl_pcie0(enum POWER_ACT act, enum POWER_SEL sel) |
| { |
| SIE_Gbl* ptGlobal = (SIE_Gbl*)MEMMAP_CHIP_CTRL_REG_BASE; |
| unsigned int data; |
| unsigned int mac_base = MEMMAP_PCIE_REG_BASE; |
| unsigned int phy_base = MEMMAP_PCIE_PHY_REG_BASE; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_perifStickyResetN), &data); |
| data |= MSK32Gbl_perifStickyResetN_pcie0Rstn; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_perifStickyResetN), data); |
| |
| if (act == POWER_ON) { |
| if (sel & POWER_SEL_CLOCK) { |
| // clock enable |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_pcie0SysClkEn, 1); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| power_on_pcie_phy(mac_base, phy_base); |
| } |
| |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE0, &data); |
| data &= ~3; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE0, data); |
| } |
| } else if (act == POWER_OFF) { |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE0, &data); |
| data &= ~3; |
| data |= 1; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE0, data); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| power_off_pcie_phy(mac_base, phy_base); |
| } |
| |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_pcie0SysClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_pcie_500M_TxTestClk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_pcie_500M_RxTestClk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_250M_pipeTestClk1.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_250M_pipeTestClk2.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_serdesTestClk.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| } |
| } else { |
| lgpl_printf("%s, invalid power control option:%d\n", __func__, act); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int power_ctrl_pcie1(enum POWER_ACT act, enum POWER_SEL sel) |
| { |
| SIE_Gbl* ptGlobal = (SIE_Gbl*)MEMMAP_CHIP_CTRL_REG_BASE; |
| unsigned int data; |
| unsigned int mac_base = MEMMAP_PCIE1_REG_BASE; |
| unsigned int phy_base = MEMMAP_PCIE1_PHY_REG_BASE; |
| |
| BFM_HOST_Bus_Read32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_perifStickyResetN), &data); |
| data |= MSK32Gbl_perifStickyResetN_pcie1Rstn; |
| BFM_HOST_Bus_Write32((MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_perifStickyResetN), data); |
| |
| if (act == POWER_ON) { |
| if (sel & POWER_SEL_CLOCK) { |
| // clock enable |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_pcie1SysClkEn, 1); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| power_on_pcie_phy(mac_base, phy_base); |
| } |
| |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE1, &data); |
| data &= ~3; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE1, data); |
| } |
| } else if (act == POWER_OFF) { |
| if (sel & POWER_SEL_SRAM) { |
| BFM_HOST_Bus_Read32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE1, &data); |
| data &= ~3; |
| data |= 1; |
| BFM_HOST_Bus_Write32(MEMMAP_CHIP_CTRL_REG_BASE + RA_Gbl_SRAM_PWR_CTRL_PCIE1, data); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| power_off_pcie_phy(mac_base, phy_base); |
| } |
| |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_pcie1SysClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_pcie_500M_TxTestClk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_pcie_500M_RxTestClk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_250M_pipeTestClk1.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_250M_pipeTestClk2.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| SET_BIT_FIELD(T32clkD8_ctrl, ptGlobal->ie_pcie_serdesTestClk.u32clkD8_ctrl, uctrl_ClkEn, 0); |
| } |
| } else { |
| lgpl_printf("%s, invalid power control option:%d\n", __func__, act); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int powerdown_pcie(int powerdown) |
| { |
| if(powerdown) { |
| power_ctrl_pcie0(POWER_OFF, POWER_SEL_ALL); |
| power_ctrl_pcie1(POWER_OFF, POWER_SEL_ALL); |
| } else { |
| power_ctrl_pcie0(POWER_ON, POWER_SEL_ALL); |
| power_ctrl_pcie1(POWER_ON, POWER_SEL_ALL); |
| } |
| return 0; |
| } |
| |
| int power_ctrl_sdio(enum POWER_ACT act, enum POWER_SEL sel) |
| { |
| SIE_Gbl* ptGlobal = (SIE_Gbl*)MEMMAP_CHIP_CTRL_REG_BASE; |
| //unsigned int addr,val; |
| |
| if (act == POWER_ON) { |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_sdioSysClkEn, 1); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_sd0Clk.u32clkD4_ctrl, uctrl_ClkEn, 1); |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_SRAM) { |
| |
| } |
| } else if (act == POWER_OFF) { |
| if (sel & POWER_SEL_SRAM) { |
| |
| } |
| |
| if (sel & POWER_SEL_PHY) { |
| |
| } |
| |
| if (sel & POWER_SEL_CLOCK) { |
| SET_BIT_FIELD(T32Gbl_clkEnable, ptGlobal->u32Gbl_clkEnable, uclkEnable_sdioSysClkEn, 0); |
| SET_BIT_FIELD(T32clkD4_ctrl, ptGlobal->ie_sd0Clk.u32clkD4_ctrl, uctrl_ClkEn, 0); |
| } |
| |
| } else { |
| lgpl_printf("%s, invalid power control option:%d\n", __func__, act); |
| return -1; |
| } |
| |
| return 0; |
| } |
| |
| int powerdown_sdio(int powerdown) |
| { |
| if(powerdown) { |
| power_ctrl_sdio(POWER_OFF, POWER_SEL_ALL); |
| } else { |
| power_ctrl_sdio(POWER_ON, POWER_SEL_ALL); |
| } |
| return 0; |
| } |