1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Joshua Henderson, joshua.henderson@microchip.com 4 * Copyright (C) 2015 Microchip Technology Inc. All rights reserved. 5 */ 6 #include <linux/init.h> 7 #include <linux/kernel.h> 8 #include <linux/of_address.h> 9 #include <linux/of_fdt.h> 10 #include <linux/of_platform.h> 11 #include <linux/platform_data/sdhci-pic32.h> 12 13 #include <asm/fw/fw.h> 14 #include <asm/mips-boards/generic.h> 15 #include <asm/prom.h> 16 17 #include "pic32mzda.h" 18 19 const char *get_system_type(void) 20 { 21 return "PIC32MZDA"; 22 } 23 24 static ulong get_fdtaddr(void) 25 { 26 ulong ftaddr = 0; 27 28 if (fw_passed_dtb && !fw_arg2 && !fw_arg3) 29 return (ulong)fw_passed_dtb; 30 31 if (&__dtb_start < &__dtb_end) 32 ftaddr = (ulong)__dtb_start; 33 34 return ftaddr; 35 } 36 37 void __init plat_mem_setup(void) 38 { 39 void *dtb; 40 41 dtb = (void *)get_fdtaddr(); 42 if (!dtb) { 43 pr_err("pic32: no DTB found.\n"); 44 return; 45 } 46 47 /* 48 * Load the builtin device tree. This causes the chosen node to be 49 * parsed resulting in our memory appearing. 50 */ 51 __dt_setup_arch(dtb); 52 53 pr_info("Found following command lines\n"); 54 pr_info(" boot_command_line: %s\n", boot_command_line); 55 pr_info(" arcs_cmdline : %s\n", arcs_cmdline); 56 #ifdef CONFIG_CMDLINE_BOOL 57 pr_info(" builtin_cmdline : %s\n", CONFIG_CMDLINE); 58 #endif 59 if (dtb != __dtb_start) 60 strlcpy(arcs_cmdline, boot_command_line, COMMAND_LINE_SIZE); 61 62 #ifdef CONFIG_EARLY_PRINTK 63 fw_init_early_console(-1); 64 #endif 65 pic32_config_init(); 66 } 67 68 static __init void pic32_init_cmdline(int argc, char *argv[]) 69 { 70 unsigned int count = COMMAND_LINE_SIZE - 1; 71 int i; 72 char *dst = &(arcs_cmdline[0]); 73 char *src; 74 75 for (i = 1; i < argc && count; ++i) { 76 src = argv[i]; 77 while (*src && count) { 78 *dst++ = *src++; 79 --count; 80 } 81 *dst++ = ' '; 82 } 83 if (i > 1) 84 --dst; 85 86 *dst = 0; 87 } 88 89 void __init prom_init(void) 90 { 91 pic32_init_cmdline((int)fw_arg0, (char **)fw_arg1); 92 } 93 94 void __init device_tree_init(void) 95 { 96 if (!initial_boot_params) 97 return; 98 99 unflatten_and_copy_device_tree(); 100 } 101 102 static struct pic32_sdhci_platform_data sdhci_data = { 103 .setup_dma = pic32_set_sdhci_adma_fifo_threshold, 104 }; 105 106 static struct of_dev_auxdata pic32_auxdata_lookup[] __initdata = { 107 OF_DEV_AUXDATA("microchip,pic32mzda-sdhci", 0, "sdhci", &sdhci_data), 108 { /* sentinel */} 109 }; 110 111 static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup) 112 { 113 struct device_node *root, *np; 114 struct resource res; 115 116 root = of_find_node_by_path("/"); 117 118 for (; lookup->compatible; lookup++) { 119 np = of_find_compatible_node(NULL, NULL, lookup->compatible); 120 if (np) { 121 lookup->name = (char *)np->name; 122 if (lookup->phys_addr) 123 continue; 124 if (!of_address_to_resource(np, 0, &res)) 125 lookup->phys_addr = res.start; 126 } 127 } 128 129 return 0; 130 } 131 132 static int __init plat_of_setup(void) 133 { 134 if (!of_have_populated_dt()) 135 panic("Device tree not present"); 136 137 pic32_of_prepare_platform_data(pic32_auxdata_lookup); 138 if (of_platform_default_populate(NULL, pic32_auxdata_lookup, NULL)) 139 panic("Failed to populate DT"); 140 141 return 0; 142 } 143 arch_initcall(plat_of_setup); 144