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