Home | History | Annotate | Download | only in mach-keystone
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  * Keystone: PSC configuration module
      4  *
      5  * (C) Copyright 2012-2014
      6  *     Texas Instruments Incorporated, <www.ti.com>
      7  */
      8 
      9 #include <common.h>
     10 #include <linux/errno.h>
     11 #include <asm/io.h>
     12 #include <asm/processor.h>
     13 #include <asm/arch/psc_defs.h>
     14 
     15 /**
     16  * psc_delay() - delay for psc
     17  *
     18  * Return: 10
     19  */
     20 int psc_delay(void)
     21 {
     22 	udelay(10);
     23 	return 10;
     24 }
     25 
     26 /**
     27  * psc_wait() - Wait for end of transitional state
     28  * @domain_num: GPSC domain number
     29  *
     30  * Polls pstat for the selected domain and waits for transitions to be complete.
     31  * Since this is boot loader code it is *ASSUMED* that interrupts are disabled
     32  * and no other core is mucking around with the psc at the same time.
     33  *
     34  * Return: 0 when the domain is free. Returns -1 if a timeout occurred waiting
     35  * for the completion.
     36  */
     37 int psc_wait(u32 domain_num)
     38 {
     39 	u32 retry;
     40 	u32 ptstat;
     41 
     42 	/*
     43 	 * Do nothing if the power domain is in transition. This should never
     44 	 * happen since the boot code is the only software accesses psc.
     45 	 * It's still remotely possible that the hardware state machines
     46 	 * initiate transitions.
     47 	 * Don't trap if the domain (or a module in this domain) is
     48 	 * stuck in transition.
     49 	 */
     50 	retry = 0;
     51 
     52 	do {
     53 		ptstat = __raw_readl(KS2_PSC_BASE + PSC_REG_PSTAT);
     54 		ptstat = ptstat & (1 << domain_num);
     55 	} while ((ptstat != 0) && ((retry += psc_delay()) <
     56 		 PSC_PTSTAT_TIMEOUT_LIMIT));
     57 
     58 	if (retry >= PSC_PTSTAT_TIMEOUT_LIMIT)
     59 		return -1;
     60 
     61 	return 0;
     62 }
     63 
     64 /**
     65  * psc_get_domain_num() - Get the domain number
     66  * @mod_num:	LPSC module number
     67  */
     68 u32 psc_get_domain_num(u32 mod_num)
     69 {
     70 	u32 domain_num;
     71 
     72 	/* Get the power domain associated with the module number */
     73 	domain_num = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCFG(mod_num));
     74 	domain_num = PSC_REG_MDCFG_GET_PD(domain_num);
     75 
     76 	return domain_num;
     77 }
     78 
     79 /**
     80  * psc_set_state() - powers up/down a module
     81  * @mod_num:	LPSC module number
     82  * @state:	1 to enable, 0 to disable.
     83  *
     84  * Powers up/down the requested module and the associated power domain if
     85  * required. No action is taken it the module is already powered up/down.
     86  * This only controls modules. The domain in which the module resides will
     87  * be left in the power on state. Multiple modules can exist in a power
     88  * domain, so powering down the domain based on a single module is not done.
     89  *
     90  * Return: 0 on success, -1 if the module can't be powered up, or if there is a
     91  * timeout waiting for the transition.
     92  */
     93 int psc_set_state(u32 mod_num, u32 state)
     94 {
     95 	u32 domain_num;
     96 	u32 pdctl;
     97 	u32 mdctl;
     98 	u32 ptcmd;
     99 	u32 reset_iso;
    100 	u32 v;
    101 
    102 	/*
    103 	 * Get the power domain associated with the module number, and reset
    104 	 * isolation functionality
    105 	 */
    106 	v = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCFG(mod_num));
    107 	domain_num = PSC_REG_MDCFG_GET_PD(v);
    108 	reset_iso  = PSC_REG_MDCFG_GET_RESET_ISO(v);
    109 
    110 	/* Wait for the status of the domain/module to be non-transitional */
    111 	if (psc_wait(domain_num) != 0)
    112 		return -1;
    113 
    114 	/*
    115 	 * Perform configuration even if the current status matches the
    116 	 * existing state
    117 	 *
    118 	 * Set the next state of the power domain to on. It's OK if the domain
    119 	 * is always on. This code will not ever power down a domain, so no
    120 	 * change is made if the new state is power down.
    121 	 */
    122 	if (state == PSC_REG_VAL_MDCTL_NEXT_ON) {
    123 		pdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_PDCTL(domain_num));
    124 		pdctl = PSC_REG_PDCTL_SET_NEXT(pdctl,
    125 					       PSC_REG_VAL_PDCTL_NEXT_ON);
    126 		__raw_writel(pdctl, KS2_PSC_BASE + PSC_REG_PDCTL(domain_num));
    127 	}
    128 
    129 	/* Set the next state for the module to enabled/disabled */
    130 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    131 	mdctl = PSC_REG_MDCTL_SET_NEXT(mdctl, state);
    132 	mdctl = PSC_REG_MDCTL_SET_RESET_ISO(mdctl, reset_iso);
    133 	__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    134 
    135 	/* Trigger the enable */
    136 	ptcmd = __raw_readl(KS2_PSC_BASE + PSC_REG_PTCMD);
    137 	ptcmd |= (u32)(1<<domain_num);
    138 	__raw_writel(ptcmd, KS2_PSC_BASE + PSC_REG_PTCMD);
    139 
    140 	/* Wait on the complete */
    141 	return psc_wait(domain_num);
    142 }
    143 
    144 /**
    145  * psc_enable_module() - power up a module
    146  * @mod_num:	LPSC module number
    147  *
    148  * Powers up the requested module and the associated power domain
    149  * if required. No action is taken it the module is already powered up.
    150  *
    151  * Return: 0 on success, -1 if the module can't be powered up, or
    152  * if there is a timeout waiting for the transition.
    153  *
    154  */
    155 int psc_enable_module(u32 mod_num)
    156 {
    157 	u32 mdctl;
    158 
    159 	/* Set the bit to apply reset */
    160 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    161 	if ((mdctl & 0x3f) == PSC_REG_VAL_MDSTAT_STATE_ON)
    162 		return 0;
    163 
    164 	return psc_set_state(mod_num, PSC_REG_VAL_MDCTL_NEXT_ON);
    165 }
    166 
    167 /**
    168  * psc_disable_module() - Power down a module
    169  * @mod_num:	LPSC module number
    170  *
    171  * Return: 0 on success, -1 on failure or timeout.
    172  */
    173 int psc_disable_module(u32 mod_num)
    174 {
    175 	u32 mdctl;
    176 
    177 	/* Set the bit to apply reset */
    178 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    179 	if ((mdctl & 0x3f) == 0)
    180 		return 0;
    181 	mdctl = PSC_REG_MDCTL_SET_LRSTZ(mdctl, 0);
    182 	__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    183 
    184 	return psc_set_state(mod_num, PSC_REG_VAL_MDCTL_NEXT_SWRSTDISABLE);
    185 }
    186 
    187 /**
    188  * psc_set_reset_iso() - Set the reset isolation bit in mdctl
    189  * @mod_num:	LPSC module number
    190  *
    191  * The reset isolation enable bit is set. The state of the module is not
    192  * changed.
    193  *
    194  * Return: 0 if the module config showed that reset isolation is supported.
    195  * Returns 1 otherwise. This is not an error, but setting the bit in mdctl
    196  * has no effect.
    197  */
    198 int psc_set_reset_iso(u32 mod_num)
    199 {
    200 	u32 v;
    201 	u32 mdctl;
    202 
    203 	/* Set the reset isolation bit */
    204 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    205 	mdctl = PSC_REG_MDCTL_SET_RESET_ISO(mdctl, 1);
    206 	__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    207 
    208 	v = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCFG(mod_num));
    209 	if (PSC_REG_MDCFG_GET_RESET_ISO(v) == 1)
    210 		return 0;
    211 
    212 	return 1;
    213 }
    214 
    215 /**
    216  * psc_disable_domain() - Disable a power domain
    217  * @domain_num: GPSC domain number
    218  */
    219 int psc_disable_domain(u32 domain_num)
    220 {
    221 	u32 pdctl;
    222 	u32 ptcmd;
    223 
    224 	pdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_PDCTL(domain_num));
    225 	pdctl = PSC_REG_PDCTL_SET_NEXT(pdctl, PSC_REG_VAL_PDCTL_NEXT_OFF);
    226 	pdctl = PSC_REG_PDCTL_SET_PDMODE(pdctl, PSC_REG_VAL_PDCTL_PDMODE_SLEEP);
    227 	__raw_writel(pdctl, KS2_PSC_BASE + PSC_REG_PDCTL(domain_num));
    228 
    229 	ptcmd = __raw_readl(KS2_PSC_BASE + PSC_REG_PTCMD);
    230 	ptcmd |= (u32)(1 << domain_num);
    231 	__raw_writel(ptcmd, KS2_PSC_BASE + PSC_REG_PTCMD);
    232 
    233 	return psc_wait(domain_num);
    234 }
    235 
    236 /**
    237  * psc_module_keep_in_reset_enabled() - Keep module in enabled,in-reset state
    238  * @mod_num:	LPSC module number
    239  * @gate_clocks: Can the clocks be gated on this module?
    240  *
    241  * Enable the module, but do not release the module from local reset. This is
    242  * necessary for many processor systems on keystone SoCs to allow for system
    243  * initialization from a master processor prior to releasing the processor
    244  * from reset.
    245  */
    246 int psc_module_keep_in_reset_enabled(u32 mod_num, bool gate_clocks)
    247 {
    248 	u32 mdctl, ptcmd, mdstat;
    249 	u32 next_state;
    250 	int domain_num = psc_get_domain_num(mod_num);
    251 	int timeout = 100000;
    252 
    253 	/* Wait for any previous transitions to complete */
    254 	psc_wait(domain_num);
    255 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    256 	/* Should be set 0 to assert Local reset */
    257 	if ((mdctl & PSC_REG_MDCTL_SET_LRSTZ(mdctl, 1))) {
    258 		mdctl = PSC_REG_MDCTL_SET_LRSTZ(mdctl, 0);
    259 		__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    260 		/* Wait for transition to take place */
    261 		psc_wait(domain_num);
    262 	}
    263 
    264 	/* Clear Module reset */
    265 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    266 	next_state = gate_clocks ? PSC_REG_VAL_MDCTL_NEXT_OFF :
    267 			PSC_REG_VAL_MDCTL_NEXT_ON;
    268 	mdctl = PSC_REG_MDCTL_SET_NEXT(mdctl, next_state);
    269 	__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    270 	/* Trigger PD transition */
    271 	ptcmd = __raw_readl(KS2_PSC_BASE + PSC_REG_PTCMD);
    272 	ptcmd |= (u32)(1 << domain_num);
    273 	__raw_writel(ptcmd, KS2_PSC_BASE + PSC_REG_PTCMD);
    274 	psc_wait(domain_num);
    275 
    276 	mdstat = __raw_readl(KS2_PSC_BASE + PSC_REG_MDSTAT(mod_num));
    277 	while (timeout) {
    278 		mdstat = __raw_readl(KS2_PSC_BASE + PSC_REG_MDSTAT(mod_num));
    279 
    280 		if (!(PSC_REG_MDSTAT_GET_STATUS(mdstat) & 0x30) &&
    281 		    PSC_REG_MDSTAT_GET_MRSTDONE(mdstat) &&
    282 		    PSC_REG_MDSTAT_GET_LRSTDONE(mdstat))
    283 			break;
    284 		timeout--;
    285 	}
    286 
    287 	if (!timeout) {
    288 		printf("%s: Timedout waiting for mdstat(0x%08x) to change\n",
    289 		       __func__, mdstat);
    290 		return -ETIMEDOUT;
    291 	}
    292 	return 0;
    293 }
    294 
    295 /**
    296  * psc_module_release_from_reset() - Release the module from reset
    297  * @mod_num:	LPSC module number
    298  *
    299  * This is the follow through for the command 'psc_module_keep_in_reset_enabled'
    300  * Allowing the module to be released from reset once all required inits are
    301  * complete for the module. Typically, this allows the processor module to start
    302  * execution.
    303  */
    304 int psc_module_release_from_reset(u32 mod_num)
    305 {
    306 	u32 mdctl, mdstat;
    307 	int domain_num = psc_get_domain_num(mod_num);
    308 	int timeout = 100000;
    309 
    310 	/* Wait for any previous transitions to complete */
    311 	psc_wait(domain_num);
    312 	mdctl = __raw_readl(KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    313 	/* Should be set to 1 to de-assert Local reset */
    314 	if ((mdctl & PSC_REG_MDCTL_SET_LRSTZ(mdctl, 0))) {
    315 		mdctl = PSC_REG_MDCTL_SET_LRSTZ(mdctl, 1);
    316 		__raw_writel(mdctl, KS2_PSC_BASE + PSC_REG_MDCTL(mod_num));
    317 		/* Wait for transition to take place */
    318 		psc_wait(domain_num);
    319 	}
    320 	mdstat = __raw_readl(KS2_PSC_BASE + PSC_REG_MDSTAT(mod_num));
    321 	while (timeout) {
    322 		mdstat = __raw_readl(KS2_PSC_BASE + PSC_REG_MDSTAT(mod_num));
    323 
    324 		if (!(PSC_REG_MDSTAT_GET_STATUS(mdstat) & 0x30) &&
    325 		    PSC_REG_MDSTAT_GET_MRSTDONE(mdstat) &&
    326 		    PSC_REG_MDSTAT_GET_LRSTDONE(mdstat))
    327 			break;
    328 		timeout--;
    329 	}
    330 
    331 	if (!timeout) {
    332 		printf("%s: Timedout waiting for mdstat(0x%08x) to change\n",
    333 		       __func__, mdstat);
    334 		return -ETIMEDOUT;
    335 	}
    336 
    337 	return 0;
    338 }
    339