psc.c 1.3 KB
Newer Older
W
weety 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

#include "dm36x.h"


/* ------------------------------------------------------------------------ *
 *  psc_change_state( id, state )                                           *
 *      id    = Domain #ID                                                  *
 *      state = ( ENABLE, DISABLE, SYNCRESET, RESET )                       *
 *              (   =3  ,   =2   ,    =1    ,   =0  )                       *
 * ------------------------------------------------------------------------ */
void psc_change_state(int id, int state)
{
	rt_uint32_t mdstat, mdctl;

	if (id > DAVINCI_DM365_LPSC_KALEIDO)
		return;

	mdstat = PSC_MDSTAT_BASE + (id * 4);
	mdctl = PSC_MDCTL_BASE + (id * 4);

    /*
     *  Step 0 - Ignore request if the state is already set as is
     */
    if ((readl(mdstat) & 0x1f) == state)
        return;

    /*
     *  Step 1 - Wait for PTSTAT.GOSTAT to clear
     */
    while (readl(PSC_PTSTAT) & 1) ;

    /*
     *  Step 2 - Set MDCTLx.NEXT to new state
     */
    writel(readl(mdctl) & (~0x1f), mdctl);
    writel(readl(mdctl) | state, mdctl);

    /*
     *  Step 3 - Start power transition ( set PTCMD.GO to 1 )
     */
    writel(readl(PSC_PTCMD) | 1, PSC_PTCMD);

    /*
     *  Step 4 - Wait for PTSTAT.GOSTAT to clear
     */
    while (readl(PSC_PTSTAT) & 1) ;
}