Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 086b3999 authored by Yoshihiro Shimoda's avatar Yoshihiro Shimoda Committed by Simon Horman
Browse files

soc: renesas: r8a77990-sysc: Add workaround for 3DG-{A,B}



This patch adds workaround for 3DG-{A,B} of R-Car E3 ES1.0 because
the SoC has a restriction about the order.

Signed-off-by: default avatarYoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Signed-off-by: default avatarSimon Horman <horms+renesas@verge.net.au>
parent 44b12d43
Loading
Loading
Loading
Loading
+36 −1
Original line number Diff line number Diff line
@@ -7,12 +7,13 @@

#include <linux/bug.h>
#include <linux/kernel.h>
#include <linux/sys_soc.h>

#include <dt-bindings/power/r8a77990-sysc.h>

#include "rcar-sysc.h"

static const struct rcar_sysc_area r8a77990_areas[] __initconst = {
static struct rcar_sysc_area r8a77990_areas[] __initdata = {
	{ "always-on",	    0, 0, R8A77990_PD_ALWAYS_ON, -1, PD_ALWAYS_ON },
	{ "ca53-scu",	0x140, 0, R8A77990_PD_CA53_SCU,  R8A77990_PD_ALWAYS_ON,
	  PD_SCU },
@@ -27,7 +28,41 @@ static const struct rcar_sysc_area r8a77990_areas[] __initconst = {
	{ "3dg-b",	0x100, 1, R8A77990_PD_3DG_B,	R8A77990_PD_3DG_A },
};

static void __init rcar_sysc_fix_parent(struct rcar_sysc_area *areas,
					unsigned int num_areas, u8 id,
					int new_parent)
{
	unsigned int i;

	for (i = 0; i < num_areas; i++)
		if (areas[i].isr_bit == id) {
			areas[i].parent = new_parent;
			return;
		}
}

/* Fixups for R-Car E3 ES1.0 revision */
static const struct soc_device_attribute r8a77990[] __initconst = {
	{ .soc_id = "r8a77990", .revision = "ES1.0" },
	{ /* sentinel */ }
};

static int __init r8a77990_sysc_init(void)
{
	if (soc_device_match(r8a77990)) {
		rcar_sysc_fix_parent(r8a77990_areas,
				     ARRAY_SIZE(r8a77990_areas),
				     R8A77990_PD_3DG_A, R8A77990_PD_3DG_B);
		rcar_sysc_fix_parent(r8a77990_areas,
				     ARRAY_SIZE(r8a77990_areas),
				     R8A77990_PD_3DG_B, R8A77990_PD_ALWAYS_ON);
	}

	return 0;
}

const struct rcar_sysc_info r8a77990_sysc_info __initconst = {
	.init = r8a77990_sysc_init,
	.areas = r8a77990_areas,
	.num_areas = ARRAY_SIZE(r8a77990_areas),
};