xref: /openbmc/linux/arch/mips/pic32/pic32mzda/init.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
104dc82e1SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
22572f00dSJoshua Henderson /*
32572f00dSJoshua Henderson  * Joshua Henderson, joshua.henderson@microchip.com
42572f00dSJoshua Henderson  * Copyright (C) 2015 Microchip Technology Inc.  All rights reserved.
52572f00dSJoshua Henderson  */
62572f00dSJoshua Henderson #include <linux/init.h>
72572f00dSJoshua Henderson #include <linux/kernel.h>
82572f00dSJoshua Henderson #include <linux/of_address.h>
92572f00dSJoshua Henderson #include <linux/of_fdt.h>
102572f00dSJoshua Henderson #include <linux/of_platform.h>
112572f00dSJoshua Henderson #include <linux/platform_data/sdhci-pic32.h>
122572f00dSJoshua Henderson 
132572f00dSJoshua Henderson #include <asm/fw/fw.h>
142572f00dSJoshua Henderson #include <asm/mips-boards/generic.h>
152572f00dSJoshua Henderson #include <asm/prom.h>
162572f00dSJoshua Henderson 
172572f00dSJoshua Henderson #include "pic32mzda.h"
182572f00dSJoshua Henderson 
get_system_type(void)192572f00dSJoshua Henderson const char *get_system_type(void)
202572f00dSJoshua Henderson {
212572f00dSJoshua Henderson 	return "PIC32MZDA";
222572f00dSJoshua Henderson }
232572f00dSJoshua Henderson 
plat_mem_setup(void)242572f00dSJoshua Henderson void __init plat_mem_setup(void)
252572f00dSJoshua Henderson {
262572f00dSJoshua Henderson 	void *dtb;
272572f00dSJoshua Henderson 
28b83ba0b9SThomas Bogendoerfer 	dtb = get_fdt();
292572f00dSJoshua Henderson 	if (!dtb) {
302572f00dSJoshua Henderson 		pr_err("pic32: no DTB found.\n");
312572f00dSJoshua Henderson 		return;
322572f00dSJoshua Henderson 	}
332572f00dSJoshua Henderson 
342572f00dSJoshua Henderson 	/*
352572f00dSJoshua Henderson 	 * Load the builtin device tree. This causes the chosen node to be
362572f00dSJoshua Henderson 	 * parsed resulting in our memory appearing.
372572f00dSJoshua Henderson 	 */
382572f00dSJoshua Henderson 	__dt_setup_arch(dtb);
392572f00dSJoshua Henderson 
402572f00dSJoshua Henderson 	pr_info("Found following command lines\n");
412572f00dSJoshua Henderson 	pr_info(" boot_command_line: %s\n", boot_command_line);
422572f00dSJoshua Henderson 	pr_info(" arcs_cmdline     : %s\n", arcs_cmdline);
432572f00dSJoshua Henderson #ifdef CONFIG_CMDLINE_BOOL
442572f00dSJoshua Henderson 	pr_info(" builtin_cmdline  : %s\n", CONFIG_CMDLINE);
452572f00dSJoshua Henderson #endif
462572f00dSJoshua Henderson 	if (dtb != __dtb_start)
47877336c1SWolfram Sang 		strscpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE);
482572f00dSJoshua Henderson 
492572f00dSJoshua Henderson #ifdef CONFIG_EARLY_PRINTK
50*64806090SJason A. Donenfeld 	fw_init_early_console();
512572f00dSJoshua Henderson #endif
522572f00dSJoshua Henderson 	pic32_config_init();
532572f00dSJoshua Henderson }
542572f00dSJoshua Henderson 
pic32_init_cmdline(int argc,char * argv[])552572f00dSJoshua Henderson static __init void pic32_init_cmdline(int argc, char *argv[])
562572f00dSJoshua Henderson {
572572f00dSJoshua Henderson 	unsigned int count = COMMAND_LINE_SIZE - 1;
582572f00dSJoshua Henderson 	int i;
592572f00dSJoshua Henderson 	char *dst = &(arcs_cmdline[0]);
602572f00dSJoshua Henderson 	char *src;
612572f00dSJoshua Henderson 
622572f00dSJoshua Henderson 	for (i = 1; i < argc && count; ++i) {
632572f00dSJoshua Henderson 		src = argv[i];
642572f00dSJoshua Henderson 		while (*src && count) {
652572f00dSJoshua Henderson 			*dst++ = *src++;
662572f00dSJoshua Henderson 			--count;
672572f00dSJoshua Henderson 		}
682572f00dSJoshua Henderson 		*dst++ = ' ';
692572f00dSJoshua Henderson 	}
702572f00dSJoshua Henderson 	if (i > 1)
712572f00dSJoshua Henderson 		--dst;
722572f00dSJoshua Henderson 
732572f00dSJoshua Henderson 	*dst = 0;
742572f00dSJoshua Henderson }
752572f00dSJoshua Henderson 
prom_init(void)762572f00dSJoshua Henderson void __init prom_init(void)
772572f00dSJoshua Henderson {
782572f00dSJoshua Henderson 	pic32_init_cmdline((int)fw_arg0, (char **)fw_arg1);
792572f00dSJoshua Henderson }
802572f00dSJoshua Henderson 
812572f00dSJoshua Henderson static struct pic32_sdhci_platform_data sdhci_data = {
822572f00dSJoshua Henderson 	.setup_dma = pic32_set_sdhci_adma_fifo_threshold,
832572f00dSJoshua Henderson };
842572f00dSJoshua Henderson 
852572f00dSJoshua Henderson static struct of_dev_auxdata pic32_auxdata_lookup[] __initdata = {
862572f00dSJoshua Henderson 	OF_DEV_AUXDATA("microchip,pic32mzda-sdhci", 0, "sdhci", &sdhci_data),
872572f00dSJoshua Henderson 	{ /* sentinel */}
882572f00dSJoshua Henderson };
892572f00dSJoshua Henderson 
pic32_of_prepare_platform_data(struct of_dev_auxdata * lookup)902572f00dSJoshua Henderson static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup)
912572f00dSJoshua Henderson {
922572f00dSJoshua Henderson 	struct device_node *root, *np;
932572f00dSJoshua Henderson 	struct resource res;
942572f00dSJoshua Henderson 
952572f00dSJoshua Henderson 	root = of_find_node_by_path("/");
962572f00dSJoshua Henderson 
972572f00dSJoshua Henderson 	for (; lookup->compatible; lookup++) {
982572f00dSJoshua Henderson 		np = of_find_compatible_node(NULL, NULL, lookup->compatible);
992572f00dSJoshua Henderson 		if (np) {
1002572f00dSJoshua Henderson 			lookup->name = (char *)np->name;
101eb9e9bc4SLiang He 			if (lookup->phys_addr) {
102eb9e9bc4SLiang He 				of_node_put(np);
1032572f00dSJoshua Henderson 				continue;
104eb9e9bc4SLiang He 			}
1052572f00dSJoshua Henderson 			if (!of_address_to_resource(np, 0, &res))
1062572f00dSJoshua Henderson 				lookup->phys_addr = res.start;
107eb9e9bc4SLiang He 			of_node_put(np);
1082572f00dSJoshua Henderson 		}
1092572f00dSJoshua Henderson 	}
1102572f00dSJoshua Henderson 
111eb9e9bc4SLiang He 	of_node_put(root);
112eb9e9bc4SLiang He 
1132572f00dSJoshua Henderson 	return 0;
1142572f00dSJoshua Henderson }
1152572f00dSJoshua Henderson 
plat_of_setup(void)1162572f00dSJoshua Henderson static int __init plat_of_setup(void)
1172572f00dSJoshua Henderson {
1182572f00dSJoshua Henderson 	if (!of_have_populated_dt())
1192572f00dSJoshua Henderson 		panic("Device tree not present");
1202572f00dSJoshua Henderson 
1212572f00dSJoshua Henderson 	pic32_of_prepare_platform_data(pic32_auxdata_lookup);
1221a1d2f99SKefeng Wang 	if (of_platform_default_populate(NULL, pic32_auxdata_lookup, NULL))
1232572f00dSJoshua Henderson 		panic("Failed to populate DT");
1242572f00dSJoshua Henderson 
1252572f00dSJoshua Henderson 	return 0;
1262572f00dSJoshua Henderson }
1272572f00dSJoshua Henderson arch_initcall(plat_of_setup);
128