162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * linux/arch/arm/mach-pxa/pxa2xx.c
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * code specific to pxa2xx
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2008 Dmitry Baryshkov
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/kernel.h>
1262306a36Sopenharmony_ci#include <linux/device.h>
1362306a36Sopenharmony_ci#include <linux/io.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "pxa2xx-regs.h"
1662306a36Sopenharmony_ci#include "mfp-pxa25x.h"
1762306a36Sopenharmony_ci#include "generic.h"
1862306a36Sopenharmony_ci#include "reset.h"
1962306a36Sopenharmony_ci#include "smemc.h"
2062306a36Sopenharmony_ci#include <linux/soc/pxa/smemc.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid pxa2xx_clear_reset_status(unsigned int mask)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	/* RESET_STATUS_* has a 1:1 mapping with RCSR */
2562306a36Sopenharmony_ci	RCSR = mask;
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define MDCNFG_DRAC2(mdcnfg)	(((mdcnfg) >> 21) & 0x3)
2962306a36Sopenharmony_ci#define MDCNFG_DRAC0(mdcnfg)	(((mdcnfg) >> 5) & 0x3)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ciint pxa2xx_smemc_get_sdram_rows(void)
3262306a36Sopenharmony_ci{
3362306a36Sopenharmony_ci	static int sdram_rows;
3462306a36Sopenharmony_ci	unsigned int drac2 = 0, drac0 = 0;
3562306a36Sopenharmony_ci	u32 mdcnfg;
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	if (sdram_rows)
3862306a36Sopenharmony_ci		return sdram_rows;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	mdcnfg = readl_relaxed(MDCNFG);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if (mdcnfg & (MDCNFG_DE2 | MDCNFG_DE3))
4362306a36Sopenharmony_ci		drac2 = MDCNFG_DRAC2(mdcnfg);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	if (mdcnfg & (MDCNFG_DE0 | MDCNFG_DE1))
4662306a36Sopenharmony_ci		drac0 = MDCNFG_DRAC0(mdcnfg);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	sdram_rows = 1 << (11 + max(drac0, drac2));
4962306a36Sopenharmony_ci	return sdram_rows;
5062306a36Sopenharmony_ci}
51