18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * R8A7740 processor support
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2011  Renesas Solutions Corp.
68c2ecf20Sopenharmony_ci * Copyright (C) 2011  Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci#include <linux/kernel.h>
98c2ecf20Sopenharmony_ci#include <linux/init.h>
108c2ecf20Sopenharmony_ci#include <linux/io.h>
118c2ecf20Sopenharmony_ci#include <linux/irqchip.h>
128c2ecf20Sopenharmony_ci#include <linux/irqchip/arm-gic.h>
138c2ecf20Sopenharmony_ci
148c2ecf20Sopenharmony_ci#include <asm/mach/map.h>
158c2ecf20Sopenharmony_ci#include <asm/mach/arch.h>
168c2ecf20Sopenharmony_ci#include <asm/mach/time.h>
178c2ecf20Sopenharmony_ci
188c2ecf20Sopenharmony_ci#include "common.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/*
218c2ecf20Sopenharmony_ci * r8a7740 chip has lasting errata on MERAM buffer.
228c2ecf20Sopenharmony_ci * this is work-around for it.
238c2ecf20Sopenharmony_ci * see
248c2ecf20Sopenharmony_ci *	"Media RAM (MERAM)" on r8a7740 documentation
258c2ecf20Sopenharmony_ci */
268c2ecf20Sopenharmony_ci#define MEBUFCNTR	0xFE950098
278c2ecf20Sopenharmony_cistatic void __init r8a7740_meram_workaround(void)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	void __iomem *reg;
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_ci	reg = ioremap(MEBUFCNTR, 4);
328c2ecf20Sopenharmony_ci	if (reg) {
338c2ecf20Sopenharmony_ci		iowrite32(0x01600164, reg);
348c2ecf20Sopenharmony_ci		iounmap(reg);
358c2ecf20Sopenharmony_ci	}
368c2ecf20Sopenharmony_ci}
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cistatic void __init r8a7740_init_irq_of(void)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	void __iomem *intc_prio_base = ioremap(0xe6900010, 0x10);
418c2ecf20Sopenharmony_ci	void __iomem *intc_msk_base = ioremap(0xe6900040, 0x10);
428c2ecf20Sopenharmony_ci	void __iomem *pfc_inta_ctrl = ioremap(0xe605807c, 0x4);
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	irqchip_init();
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_ci	/* route signals to GIC */
478c2ecf20Sopenharmony_ci	iowrite32(0x0, pfc_inta_ctrl);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	/*
508c2ecf20Sopenharmony_ci	 * To mask the shared interrupt to SPI 149 we must ensure to set
518c2ecf20Sopenharmony_ci	 * PRIO *and* MASK. Else we run into IRQ floods when registering
528c2ecf20Sopenharmony_ci	 * the intc_irqpin devices
538c2ecf20Sopenharmony_ci	 */
548c2ecf20Sopenharmony_ci	iowrite32(0x0, intc_prio_base + 0x0);
558c2ecf20Sopenharmony_ci	iowrite32(0x0, intc_prio_base + 0x4);
568c2ecf20Sopenharmony_ci	iowrite32(0x0, intc_prio_base + 0x8);
578c2ecf20Sopenharmony_ci	iowrite32(0x0, intc_prio_base + 0xc);
588c2ecf20Sopenharmony_ci	iowrite8(0xff, intc_msk_base + 0x0);
598c2ecf20Sopenharmony_ci	iowrite8(0xff, intc_msk_base + 0x4);
608c2ecf20Sopenharmony_ci	iowrite8(0xff, intc_msk_base + 0x8);
618c2ecf20Sopenharmony_ci	iowrite8(0xff, intc_msk_base + 0xc);
628c2ecf20Sopenharmony_ci
638c2ecf20Sopenharmony_ci	iounmap(intc_prio_base);
648c2ecf20Sopenharmony_ci	iounmap(intc_msk_base);
658c2ecf20Sopenharmony_ci	iounmap(pfc_inta_ctrl);
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_cistatic void __init r8a7740_generic_init(void)
698c2ecf20Sopenharmony_ci{
708c2ecf20Sopenharmony_ci	r8a7740_meram_workaround();
718c2ecf20Sopenharmony_ci}
728c2ecf20Sopenharmony_ci
738c2ecf20Sopenharmony_cistatic const char *const r8a7740_boards_compat_dt[] __initconst = {
748c2ecf20Sopenharmony_ci	"renesas,r8a7740",
758c2ecf20Sopenharmony_ci	NULL,
768c2ecf20Sopenharmony_ci};
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_ciDT_MACHINE_START(R8A7740_DT, "Generic R8A7740 (Flattened Device Tree)")
798c2ecf20Sopenharmony_ci	.l2c_aux_val	= 0,
808c2ecf20Sopenharmony_ci	.l2c_aux_mask	= ~0,
818c2ecf20Sopenharmony_ci	.init_early	= shmobile_init_delay,
828c2ecf20Sopenharmony_ci	.init_irq	= r8a7740_init_irq_of,
838c2ecf20Sopenharmony_ci	.init_machine	= r8a7740_generic_init,
848c2ecf20Sopenharmony_ci	.init_late	= shmobile_init_late,
858c2ecf20Sopenharmony_ci	.dt_compat	= r8a7740_boards_compat_dt,
868c2ecf20Sopenharmony_ciMACHINE_END
87