oleavr-rgl-a500-mini-linux-.../drivers/soc/allwinner/pm/mem_ccu-sun8iw11.c
Ole André Vadla Ravnås 169c65d57e Initial commit
2022-05-07 01:01:45 +02:00

260 lines
13 KiB
C

/*
* Copyright (c) 2011-2020 yanggq.young@allwinnertech.com
*
* 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.
*/
#include "pm_types.h"
#include "pm_i.h"
/*
*********************************************************************************************************
* MEM CCU INITIALISE
*
* Description: mem interrupt initialise.
*
* Arguments : none.
*
* Returns : 0/-1;
*********************************************************************************************************
*/
__s32 mem_ccu_save(struct ccm_state *ccm_reg)
{
ccm_reg->ccm_reg = (__ccmu_reg_list_t *) IO_ADDRESS(AW_CCM_BASE);
#if 0
/*bias: */
ccm_reg->ccm_reg_backup.PllAudioBias = ccm_reg->ccm_reg->PllAudioBias;
ccm_reg->ccm_reg_backup.PllDeBias = ccm_reg->ccm_reg->PllDeBias;
ccm_reg->ccm_reg_backup.PllVideo0Bias = ccm_reg->ccm_reg->PllVideo0Bias;
ccm_reg->ccm_reg_backup.PllVideo1Bias = ccm_reg->ccm_reg->PllVideo1Bias;
/*tune & pattern: */
ccm_reg->ccm_reg_backup.PllAudioPattern =
ccm_reg->ccm_reg->PllAudioPattern;
/*cfg: */
ccm_reg->ccm_reg_backup.Pll1Ctl = ccm_reg->ccm_reg->Pll1Ctl;
ccm_reg->ccm_reg_backup.Pll2Ctl = ccm_reg->ccm_reg->Pll2Ctl;
ccm_reg->ccm_reg_backup.Pll7Ctl = ccm_reg->ccm_reg->Pll7Ctl;
ccm_reg->ccm_reg_backup.Pll10Ctl = ccm_reg->ccm_reg->Pll10Ctl;
/*notice: be care to cpu, axi restore sequence!. */
ccm_reg->ccm_reg_backup.SysClkDiv = ccm_reg->ccm_reg->SysClkDiv;
ccm_reg->ccm_reg_backup.Ahb1Div = ccm_reg->ccm_reg->Ahb1Div;
ccm_reg->ccm_reg_backup.Apb2Div = ccm_reg->ccm_reg->Apb2Div;
/*actually, the gating & reset ctrl reg
** should not affect corresponding module's recovery.
*/
ccm_reg->ccm_reg_backup.AhbGate0 = ccm_reg->ccm_reg->AhbGate0;
ccm_reg->ccm_reg_backup.AhbGate1 = ccm_reg->ccm_reg->AhbGate1;
ccm_reg->ccm_reg_backup.Apb1Gate = ccm_reg->ccm_reg->Apb1Gate;
ccm_reg->ccm_reg_backup.Apb2Gate0 = ccm_reg->ccm_reg->Apb2Gate0;
ccm_reg->ccm_reg_backup.Apb2Gate1 = ccm_reg->ccm_reg->Apb2Gate1;
ccm_reg->ccm_reg_backup.Nand0 = ccm_reg->ccm_reg->Nand0;
ccm_reg->ccm_reg_backup.Sd0 = ccm_reg->ccm_reg->Sd0;
ccm_reg->ccm_reg_backup.Sd1 = ccm_reg->ccm_reg->Sd1;
ccm_reg->ccm_reg_backup.Sd2 = ccm_reg->ccm_reg->Sd2;
ccm_reg->ccm_reg_backup.Sd3 = ccm_reg->ccm_reg->Sd3;
ccm_reg->ccm_reg_backup.Spi0 = ccm_reg->ccm_reg->Spi0;
ccm_reg->ccm_reg_backup.Spi1 = ccm_reg->ccm_reg->Spi1;
ccm_reg->ccm_reg_backup.Spi2 = ccm_reg->ccm_reg->Spi2;
ccm_reg->ccm_reg_backup.Spi3 = ccm_reg->ccm_reg->Spi2;
ccm_reg->ccm_reg_backup.I2s0 = ccm_reg->ccm_reg->I2s0;
ccm_reg->ccm_reg_backup.I2s1 = ccm_reg->ccm_reg->I2s1;
ccm_reg->ccm_reg_backup.I2s2 = ccm_reg->ccm_reg->I2s2;
ccm_reg->ccm_reg_backup.SpdifClk = ccm_reg->ccm_reg->SpdifClk;
ccm_reg->ccm_reg_backup.UsbClk = ccm_reg->ccm_reg->UsbClk;
/* do not touch dram related config. */
/* ccm_reg->ccm_reg_backup.PllDdrCfg = ccm_reg->ccm_reg->PllDdrCfg; */
/* ccm_reg->ccm_reg_backup.MbusResetReg = ccm_reg->ccm_reg->MbusResetReg; */
/* ccm_reg->ccm_reg_backup.DramCfg = ccm_reg->ccm_reg->DramCfg; */
/* ccm_reg->ccm_reg_backup.DramGate = ccm_reg->ccm_reg->DramGate; */
ccm_reg->ccm_reg_backup.DeClk = ccm_reg->ccm_reg->DeClk;
ccm_reg->ccm_reg_backup.DeMpClk = ccm_reg->ccm_reg->DeMpClk;
ccm_reg->ccm_reg_backup.Lcd0Ch0 = ccm_reg->ccm_reg->Lcd0Ch0;
ccm_reg->ccm_reg_backup.CsiMisc = ccm_reg->ccm_reg->CsiMisc;
ccm_reg->ccm_reg_backup.Csi0 = ccm_reg->ccm_reg->Csi0;
/*mbus? function? */
/*ccm_reg->ccm_reg_backup.MBus0 = ccm_reg->ccm_reg->MBus0; */
ccm_reg->ccm_reg_backup.AhbReset0 = ccm_reg->ccm_reg->AhbReset0;
ccm_reg->ccm_reg_backup.AhbReset1 = ccm_reg->ccm_reg->AhbReset1;
ccm_reg->ccm_reg_backup.AhbReset2 = ccm_reg->ccm_reg->AhbReset2;
ccm_reg->ccm_reg_backup.Apb1Reset = ccm_reg->ccm_reg->Apb1Reset;
ccm_reg->ccm_reg_backup.Apb2Reset = ccm_reg->ccm_reg->Apb2Reset;
ccm_reg->ccm_reg_backup.PsCtrl = ccm_reg->ccm_reg->PsCtrl;
ccm_reg->ccm_reg_backup.PsCnt = ccm_reg->ccm_reg->PsCnt;
ccm_reg->ccm_reg_backup.PllLockCtrl = ccm_reg->ccm_reg->PllLockCtrl;
#else
/*save all the ccmu reg*/
memcpy(&(ccm_reg->ccm_reg_backup), ccm_reg->ccm_reg, sizeof(__ccmu_reg_list_t));
#endif
return 0;
}
__s32 mem_ccu_restore(struct ccm_state *ccm_reg)
{
/*restore some ccmu reg when need*/
/*bias: */
ccm_reg->ccm_reg->PllSataBias = ccm_reg->ccm_reg_backup.PllSataBias; /*0x218*/
/*ccm_reg->ccm_reg->PllPeriph1Bias = ccm_reg->ccm_reg_backup.PllPeriph1Bias;*/ /*0x21c, periph1 hsic bias reg */
/*ccm_reg->ccm_reg->PllxBias[0] = ccm_reg->ccm_reg_backup.PllxBias[0];*/ /*0x220, pll cpux bias reg */
ccm_reg->ccm_reg->PllAudioBias = ccm_reg->ccm_reg_backup.PllAudioBias; /*0x224, pll audio bias reg */
ccm_reg->ccm_reg->PllVideo0Bias = ccm_reg->ccm_reg_backup.PllVideo0Bias; /*0x228, pll vedio bias reg */
ccm_reg->ccm_reg->PllVeBias = ccm_reg->ccm_reg_backup.PllVeBias; /*0x22c, pll ve bias reg */
/*ccm_reg->ccm_reg->PllDram0Bias = ccm_reg->ccm_reg_backup.PllDram0Bias;*/ /*0x230, pll dram0 bias reg */
/*ccm_reg->ccm_reg->PllPeriph0Bias = ccm_reg->ccm_reg_backup.PllPeriph0Bias;*/ /*0x234, pll periph0 bias reg */
ccm_reg->ccm_reg->PllVideo1Bias = ccm_reg->ccm_reg_backup.PllVideo1Bias; /*0x238, pll video1 bias reg */
ccm_reg->ccm_reg->PllGpuBias = ccm_reg->ccm_reg_backup.PllGpuBias; /*0x23c, pll gpu bias reg */
ccm_reg->ccm_reg->PllDeBias = ccm_reg->ccm_reg_backup.PllDeBias; /*0x248, pll de bias reg */
/*ccm_reg->ccm_reg->PllDram1BiasReg = ccm_reg->ccm_reg_backup.PllDram1BiasReg;*/ /*0x24c, pll dram1 bias */
/*tune & pattern: */
ccm_reg->ccm_reg->Pll1Tun = ccm_reg->ccm_reg_backup.Pll1Tun; /*0x250, pll1 tun,cpux tuning reg */
/*ccm_reg->ccm_reg->PllDdr0Tun = ccm_reg->ccm_reg_backup.PllDdr0Tun;*/ /*0x260, pll ddr0 tuning */
ccm_reg->ccm_reg->pllMipiTun = ccm_reg->ccm_reg_backup.pllMipiTun; /*0x70, mipi tuning reg*/
/*ccm_reg->ccm_reg->PllPeriph1Pattern = ccm_reg->ccm_reg_backup.PllPeriph1Pattern;*/ /*0x27c, pll pre1ph1 pattern control reg */
/*ccm_reg->ccm_reg->Pll1Pattern = ccm_reg->ccm_reg_backup.Pll1Pattern;*/ /*0x280, pll cpux pattern reg */
ccm_reg->ccm_reg->PllAudioPattern = ccm_reg->ccm_reg_backup.PllAudioPattern; /*0x284, pll audio pattern reg */
ccm_reg->ccm_reg->PllVedio0Pattern = ccm_reg->ccm_reg_backup.PllVedio0Pattern; /*0x288, pll vedio pattern reg */
ccm_reg->ccm_reg->PllVePattern = ccm_reg->ccm_reg_backup.PllVePattern; /*0x28c, pll ve pattern reg */
/*ccm_reg->ccm_reg->PllDdr0Pattern = ccm_reg->ccm_reg_backup.PllDdr0Pattern;*/ /*0x290, pll ddr0 pattern reg */
ccm_reg->ccm_reg->PllVedio1Pattern = ccm_reg->ccm_reg_backup.PllVedio1Pattern; /*0x298, pll video1 pattern reg */
ccm_reg->ccm_reg->PllGpuPattern = ccm_reg->ccm_reg_backup.PllGpuPattern; /*0x29c, pll gpu pattern reg */
ccm_reg->ccm_reg->PllDePattern = ccm_reg->ccm_reg_backup.PllDePattern; /*0x2a8, pll de pattern reg */
/* ccm_reg->ccm_reg->PllDram1PatternReg0 = ccm_reg->ccm_reg_backup.PllDram1PatternReg0;*/
/* ccm_reg->ccm_reg->PllDram1PatternReg1 = ccm_reg->ccm_reg_backup.PllDram1PatternReg1;*/
/*cfg all moudules pll must close befor enter standby*/
ccm_reg->ccm_reg->Pll2Ctl = ccm_reg->ccm_reg_backup.Pll2Ctl; /*0x008, audio*/
ccm_reg->ccm_reg->Pll3Ctl = ccm_reg->ccm_reg_backup.Pll3Ctl; /*0x010, video0*/
ccm_reg->ccm_reg->Pll4Ctl = ccm_reg->ccm_reg_backup.Pll4Ctl; /*0x018, ve*/
/*ccm_reg->ccm_reg->Pll5Ctl = ccm_reg->ccm_reg_backup.Pll5Ctl;*/ /*0x020, ddr0*/
ccm_reg->ccm_reg->Pll6Ctl = ccm_reg->ccm_reg_backup.Pll6Ctl; /*0x028, periph0*/
ccm_reg->ccm_reg->Pll7Ctl = ccm_reg->ccm_reg_backup.Pll7Ctl; /*0x02c, periph1*/
ccm_reg->ccm_reg->PllVideo1 = ccm_reg->ccm_reg_backup.PllVideo1; /*0x0030, Pll videio1 reg */
ccm_reg->ccm_reg->PllSata = ccm_reg->ccm_reg_backup.PllSata; /*0x0034, sata ctrl reg */
ccm_reg->ccm_reg->Pll8Ctl = ccm_reg->ccm_reg_backup.Pll8Ctl; /*0x0038, PLL8 control, gpu */
ccm_reg->ccm_reg->PllMipi = ccm_reg->ccm_reg_backup.PllMipi; /*0x0040, MIPI PLL control */
ccm_reg->ccm_reg->Pll10Ctl = ccm_reg->ccm_reg_backup.Pll10Ctl; /*0x048, de*/
/*ccm_reg->ccm_reg->PllDdr1Ctl = ccm_reg->ccm_reg_backup.PllDdr1Ctl;*/ /*0x004c, pll ddr1 ctrl reg */
change_runtime_env();
delay_us(10);
ccm_reg->ccm_reg->Pll1Ctl = ccm_reg->ccm_reg_backup.Pll1Ctl;
change_runtime_env();
delay_us(1000);
/*notice: be care to cpu, axi restore sequence!. */
ccm_reg->ccm_reg->SysClkDiv = ccm_reg->ccm_reg_backup.SysClkDiv; /*0x0050, cpux/axi clock divide ratio */
ccm_reg->ccm_reg->Ahb1Div = ccm_reg->ccm_reg_backup.Ahb1Div; /*0x0054, ahb1/apb1 clock divide ratio */
delay_us(1);
ccm_reg->ccm_reg->Apb2Div = ccm_reg->ccm_reg_backup.Apb2Div; /*0x0058, apb2 clock divide ratio */
/*actually, the gating & reset ctrl reg
** should not affect corresponding module's recovery.
*/
/*first, reset, then, gating. */
ccm_reg->ccm_reg->AhbReset0 = ccm_reg->ccm_reg_backup.AhbReset0;
ccm_reg->ccm_reg->AhbReset1 = ccm_reg->ccm_reg_backup.AhbReset1;
ccm_reg->ccm_reg->AhbReset2 = ccm_reg->ccm_reg_backup.AhbReset2;
ccm_reg->ccm_reg->Apb1Reset = ccm_reg->ccm_reg_backup.Apb1Reset;
ccm_reg->ccm_reg->Apb2Reset = ccm_reg->ccm_reg_backup.Apb2Reset;
ccm_reg->ccm_reg->Ths = ccm_reg->ccm_reg_backup.Ths;
ccm_reg->ccm_reg->Nand0 = ccm_reg->ccm_reg_backup.Nand0;
ccm_reg->ccm_reg->Sd0 = ccm_reg->ccm_reg_backup.Sd0;
ccm_reg->ccm_reg->Sd1 = ccm_reg->ccm_reg_backup.Sd1;
ccm_reg->ccm_reg->Sd2 = ccm_reg->ccm_reg_backup.Sd2;
ccm_reg->ccm_reg->Sd3 = ccm_reg->ccm_reg_backup.Sd3;
ccm_reg->ccm_reg->Ts = ccm_reg->ccm_reg_backup.Ts;
ccm_reg->ccm_reg->Ce = ccm_reg->ccm_reg_backup.Ce;
ccm_reg->ccm_reg->Spi0 = ccm_reg->ccm_reg_backup.Spi0;
ccm_reg->ccm_reg->Spi1 = ccm_reg->ccm_reg_backup.Spi1;
ccm_reg->ccm_reg->Spi2 = ccm_reg->ccm_reg_backup.Spi2;
ccm_reg->ccm_reg->Spi2 = ccm_reg->ccm_reg_backup.Spi3;
ccm_reg->ccm_reg->I2s0 = ccm_reg->ccm_reg_backup.I2s0;
ccm_reg->ccm_reg->I2s1 = ccm_reg->ccm_reg_backup.I2s1;
ccm_reg->ccm_reg->I2s2 = ccm_reg->ccm_reg_backup.I2s2;
ccm_reg->ccm_reg->Ac97 = ccm_reg->ccm_reg_backup.Ac97;
ccm_reg->ccm_reg->SpdifClk = ccm_reg->ccm_reg_backup.SpdifClk;
ccm_reg->ccm_reg->KeyPadClk = ccm_reg->ccm_reg_backup.KeyPadClk;
ccm_reg->ccm_reg->Sata0Clk = ccm_reg->ccm_reg_backup.Sata0Clk;
ccm_reg->ccm_reg->UsbClk = ccm_reg->ccm_reg_backup.UsbClk;
ccm_reg->ccm_reg->Ir0Clk = ccm_reg->ccm_reg_backup.Ir0Clk;
ccm_reg->ccm_reg->Ir1Clk = ccm_reg->ccm_reg_backup.Ir1Clk;
/* do not touch dram related config. */
/* ccm_reg->ccm_reg->PllDdrAuxiliary = ccm_reg->ccm_reg_backup.PllDdrAuxiliary;*/
/* ccm_reg->ccm_reg->DramCfg = ccm_reg->ccm_reg_backup.DramCfg;*/
/* ccm_reg->ccm_reg_backup.PllDdrCfg = ccm_reg->ccm_reg->PllDdrCfg;*/
/* ccm_reg->ccm_reg_backup.MbusResetReg = ccm_reg->ccm_reg->MbusResetReg;*/
/* ccm_reg->ccm_reg->DramGate = ccm_reg->ccm_reg_backup.DramGate;*/
ccm_reg->ccm_reg->DeClk = ccm_reg->ccm_reg_backup.DeClk;
ccm_reg->ccm_reg->DeMpClk = ccm_reg->ccm_reg_backup.DeMpClk;
ccm_reg->ccm_reg->Lcd0Ch0 = ccm_reg->ccm_reg_backup.Lcd0Ch0;
ccm_reg->ccm_reg->Lcd1Ch0 = ccm_reg->ccm_reg_backup.Lcd1Ch0;
ccm_reg->ccm_reg->Tv0Ch0 = ccm_reg->ccm_reg_backup.Tv0Ch0;
ccm_reg->ccm_reg->Tv1Ch0 = ccm_reg->ccm_reg_backup.Tv1Ch0;
ccm_reg->ccm_reg->DeinterlaceClk = ccm_reg->ccm_reg_backup.DeinterlaceClk;
ccm_reg->ccm_reg->CsiMisc = ccm_reg->ccm_reg_backup.CsiMisc;
ccm_reg->ccm_reg->Csi0 = ccm_reg->ccm_reg_backup.Csi0;
ccm_reg->ccm_reg->Ve = ccm_reg->ccm_reg_backup.Ve;
ccm_reg->ccm_reg->Avs = ccm_reg->ccm_reg_backup.Avs;
ccm_reg->ccm_reg->HdmiClk = ccm_reg->ccm_reg_backup.HdmiClk;
ccm_reg->ccm_reg->HdmiSlowClk = ccm_reg->ccm_reg_backup.HdmiSlowClk;
/*ccm_reg->ccm_reg->MBus0 = ccm_reg->ccm_reg_backup.MBus0; */
ccm_reg->ccm_reg->Gmac = ccm_reg->ccm_reg_backup.Gmac;
ccm_reg->ccm_reg->MipiDsiClk = ccm_reg->ccm_reg_backup.MipiDsiClk;
ccm_reg->ccm_reg->TvE0Clk = ccm_reg->ccm_reg_backup.TvE0Clk;
ccm_reg->ccm_reg->TvE1Clk = ccm_reg->ccm_reg_backup.TvE1Clk;
ccm_reg->ccm_reg->TvD0Clk = ccm_reg->ccm_reg_backup.TvD0Clk;
ccm_reg->ccm_reg->TvD1Clk = ccm_reg->ccm_reg_backup.TvD1Clk;
ccm_reg->ccm_reg->TvD2Clk = ccm_reg->ccm_reg_backup.TvD2Clk;
ccm_reg->ccm_reg->TvD3Clk = ccm_reg->ccm_reg_backup.TvD3Clk;
ccm_reg->ccm_reg->GpuClk = ccm_reg->ccm_reg_backup.GpuClk;
ccm_reg->ccm_reg->OutAClk = ccm_reg->ccm_reg_backup.OutAClk;
ccm_reg->ccm_reg->OutBClk = ccm_reg->ccm_reg_backup.OutBClk;
ccm_reg->ccm_reg->PsCtrl = ccm_reg->ccm_reg_backup.PsCtrl;
ccm_reg->ccm_reg->PsCnt = ccm_reg->ccm_reg_backup.PsCnt;
ccm_reg->ccm_reg->Sys32kClk = ccm_reg->ccm_reg_backup.Sys32kClk | (0x16aa << 16);
change_runtime_env();
delay_us(10);
ccm_reg->ccm_reg->PllLockCtrl = ccm_reg->ccm_reg_backup.PllLockCtrl;
change_runtime_env();
delay_us(1);
ccm_reg->ccm_reg->AhbGate0 = ccm_reg->ccm_reg_backup.AhbGate0;
ccm_reg->ccm_reg->AhbGate1 = ccm_reg->ccm_reg_backup.AhbGate1;
ccm_reg->ccm_reg->Apb1Gate = ccm_reg->ccm_reg_backup.Apb1Gate;
ccm_reg->ccm_reg->Apb2Gate0 = ccm_reg->ccm_reg_backup.Apb2Gate0;
ccm_reg->ccm_reg->Apb2Gate1 = ccm_reg->ccm_reg_backup.Apb2Gate1;
delay_us(10);
return 0;
}