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

Commit 88fd2a9d authored by Sylvain Munaut's avatar Sylvain Munaut Committed by Paul Mackerras
Browse files

[POWERPC] Add device tree fixups for the EFIKA



We make the efika device tree compliant with the defined bindings
(at least compliant enough). This is mostly done by mangling
the device_type and compatible properties, but also adding
some missing bits.

Signed-off-by: default avatarSylvain Munaut <tnt@246tNt.com>
Acked-by: default avatarGrant Likely <grant.likely@secretlab.ca>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 05cbbc69
Loading
Loading
Loading
Loading
+81 −0
Original line number Diff line number Diff line
@@ -2117,11 +2117,92 @@ static void __init fixup_device_tree_pmac(void)
#define fixup_device_tree_pmac()
#endif

#ifdef CONFIG_PPC_EFIKA
/* The current fw of the Efika has a device tree needs quite a few
 * fixups to be compliant with the mpc52xx bindings. It's currently
 * unknown if it will ever be compliant (come on bPlan ...) so we do fixups.
 * NOTE that we (barely) tolerate it because the EFIKA was out before
 * the bindings were finished, for any new boards -> RTFM ! */

struct subst_entry {
	char *path;
	char *property;
	void *value;
	int value_len;
};

static void __init fixup_device_tree_efika(void)
{
	/* Substitution table */
	#define prop_cstr(x) x, sizeof(x)
	int prop_sound_irq[3] = { 2, 2, 0 };
	int prop_bcomm_irq[3*16] = { 3,0,0, 3,1,0, 3,2,0, 3,3,0,
	                             3,4,0, 3,5,0, 3,6,0, 3,7,0,
	                             3,8,0, 3,9,0, 3,10,0, 3,11,0,
	                             3,12,0, 3,13,0, 3,14,0, 3,15,0 };
	struct subst_entry efika_subst_table[] = {
		{ "/",			"device_type",	prop_cstr("efika") },
		{ "/builtin",		"compatible",	prop_cstr("soc") },
		{ "/builtin/ata",	"compatible",	prop_cstr("mpc5200b-ata\0mpc5200-ata"), },
		{ "/builtin/bestcomm",	"compatible",	prop_cstr("mpc5200b-bestcomm\0mpc5200-bestcomm") },
		{ "/builtin/bestcomm",	"interrupts",	prop_bcomm_irq, sizeof(prop_bcomm_irq) },
		{ "/builtin/ethernet",	"compatible",	prop_cstr("mpc5200b-fec\0mpc5200-fec") },
		{ "/builtin/pic",	"compatible",	prop_cstr("mpc5200b-pic\0mpc5200-pic") },
		{ "/builtin/serial",	"compatible",	prop_cstr("mpc5200b-psc-uart\0mpc5200-psc-uart") },
		{ "/builtin/sound",	"compatible",	prop_cstr("mpc5200b-psc-ac97\0mpc5200-psc-ac97") },
		{ "/builtin/sound",	"interrupts",	prop_sound_irq, sizeof(prop_sound_irq) },
		{ "/builtin/sram",	"compatible",	prop_cstr("mpc5200b-sram\0mpc5200-sram") },
		{ "/builtin/sram",	"device_type",	prop_cstr("sram") },
		{}
	};
	#undef prop_cstr

	/* Vars */
	u32 node;
	char prop[64];
	int rv, i;

	/* Check if we're really running on a EFIKA */
	node = call_prom("finddevice", 1, 1, ADDR("/"));
	if (!PHANDLE_VALID(node))
		return;

	rv = prom_getprop(node, "model", prop, sizeof(prop));
	if (rv == PROM_ERROR)
		return;
	if (strcmp(prop, "EFIKA5K2"))
		return;

	prom_printf("Applying EFIKA device tree fixups\n");

	/* Process substitution table */
	for (i=0; efika_subst_table[i].path; i++) {
		struct subst_entry *se = &efika_subst_table[i];

		node = call_prom("finddevice", 1, 1, ADDR(se->path));
		if (!PHANDLE_VALID(node)) {
			prom_printf("fixup_device_tree_efika: ",
				"skipped entry %x - not found\n", i);
			continue;
		}

		rv = prom_setprop(node, se->path, se->property,
					se->value, se->value_len );
		if (rv == PROM_ERROR)
			prom_printf("fixup_device_tree_efika: ",
				"skipped entry %x - setprop error\n", i);
	}
}
#else
#define fixup_device_tree_efika()
#endif

static void __init fixup_device_tree(void)
{
	fixup_device_tree_maple();
	fixup_device_tree_chrp();
	fixup_device_tree_pmac();
	fixup_device_tree_efika();
}

static void __init prom_find_boot_cpu(void)