xref: /openbmc/linux/arch/arm/mach-pxa/pxa2xx.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1d2912cb1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2918dbcbaSDmitry Baryshkov /*
3918dbcbaSDmitry Baryshkov  * linux/arch/arm/mach-pxa/pxa2xx.c
4918dbcbaSDmitry Baryshkov  *
5918dbcbaSDmitry Baryshkov  * code specific to pxa2xx
6918dbcbaSDmitry Baryshkov  *
7918dbcbaSDmitry Baryshkov  * Copyright (C) 2008 Dmitry Baryshkov
8918dbcbaSDmitry Baryshkov  */
9918dbcbaSDmitry Baryshkov 
10918dbcbaSDmitry Baryshkov #include <linux/module.h>
11918dbcbaSDmitry Baryshkov #include <linux/kernel.h>
12918dbcbaSDmitry Baryshkov #include <linux/device.h>
1323019a73SRob Herring #include <linux/io.h>
14918dbcbaSDmitry Baryshkov 
15*e6acc406SArnd Bergmann #include "pxa2xx-regs.h"
164c25c5d2SArnd Bergmann #include "mfp-pxa25x.h"
17fd13f811SArnd Bergmann #include "generic.h"
18*e6acc406SArnd Bergmann #include "reset.h"
19*e6acc406SArnd Bergmann #include "smemc.h"
20fd13f811SArnd Bergmann #include <linux/soc/pxa/smemc.h>
21918dbcbaSDmitry Baryshkov 
pxa2xx_clear_reset_status(unsigned int mask)2204fef228SEric Miao void pxa2xx_clear_reset_status(unsigned int mask)
2304fef228SEric Miao {
2404fef228SEric Miao 	/* RESET_STATUS_* has a 1:1 mapping with RCSR */
2504fef228SEric Miao 	RCSR = mask;
2604fef228SEric Miao }
2704fef228SEric Miao 
28fd13f811SArnd Bergmann #define MDCNFG_DRAC2(mdcnfg)	(((mdcnfg) >> 21) & 0x3)
29fd13f811SArnd Bergmann #define MDCNFG_DRAC0(mdcnfg)	(((mdcnfg) >> 5) & 0x3)
30fd13f811SArnd Bergmann 
pxa2xx_smemc_get_sdram_rows(void)31fd13f811SArnd Bergmann int pxa2xx_smemc_get_sdram_rows(void)
32fd13f811SArnd Bergmann {
33fd13f811SArnd Bergmann 	static int sdram_rows;
34fd13f811SArnd Bergmann 	unsigned int drac2 = 0, drac0 = 0;
35fd13f811SArnd Bergmann 	u32 mdcnfg;
36fd13f811SArnd Bergmann 
37fd13f811SArnd Bergmann 	if (sdram_rows)
38fd13f811SArnd Bergmann 		return sdram_rows;
39fd13f811SArnd Bergmann 
40fd13f811SArnd Bergmann 	mdcnfg = readl_relaxed(MDCNFG);
41fd13f811SArnd Bergmann 
42fd13f811SArnd Bergmann 	if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3))
43fd13f811SArnd Bergmann 		drac2 = MDCNFG_DRAC2(mdcnfg);
44fd13f811SArnd Bergmann 
45fd13f811SArnd Bergmann 	if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1))
46fd13f811SArnd Bergmann 		drac0 = MDCNFG_DRAC0(mdcnfg);
47fd13f811SArnd Bergmann 
48fd13f811SArnd Bergmann 	sdram_rows = 1 << (11 + max(drac0, drac2));
49fd13f811SArnd Bergmann 	return sdram_rows;
50fd13f811SArnd Bergmann }
51