root/arch/mips/pic32/pic32mzda/init.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. get_system_type
  2. get_fdtaddr
  3. plat_mem_setup
  4. pic32_init_cmdline
  5. prom_init
  6. prom_free_prom_memory
  7. device_tree_init
  8. pic32_of_prepare_platform_data
  9. plat_of_setup

   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 prom_free_prom_memory(void)
  95 {
  96 }
  97 
  98 void __init device_tree_init(void)
  99 {
 100         if (!initial_boot_params)
 101                 return;
 102 
 103         unflatten_and_copy_device_tree();
 104 }
 105 
 106 static struct pic32_sdhci_platform_data sdhci_data = {
 107         .setup_dma = pic32_set_sdhci_adma_fifo_threshold,
 108 };
 109 
 110 static struct of_dev_auxdata pic32_auxdata_lookup[] __initdata = {
 111         OF_DEV_AUXDATA("microchip,pic32mzda-sdhci", 0, "sdhci", &sdhci_data),
 112         { /* sentinel */}
 113 };
 114 
 115 static int __init pic32_of_prepare_platform_data(struct of_dev_auxdata *lookup)
 116 {
 117         struct device_node *root, *np;
 118         struct resource res;
 119 
 120         root = of_find_node_by_path("/");
 121 
 122         for (; lookup->compatible; lookup++) {
 123                 np = of_find_compatible_node(NULL, NULL, lookup->compatible);
 124                 if (np) {
 125                         lookup->name = (char *)np->name;
 126                         if (lookup->phys_addr)
 127                                 continue;
 128                         if (!of_address_to_resource(np, 0, &res))
 129                                 lookup->phys_addr = res.start;
 130                 }
 131         }
 132 
 133         return 0;
 134 }
 135 
 136 static int __init plat_of_setup(void)
 137 {
 138         if (!of_have_populated_dt())
 139                 panic("Device tree not present");
 140 
 141         pic32_of_prepare_platform_data(pic32_auxdata_lookup);
 142         if (of_platform_default_populate(NULL, pic32_auxdata_lookup, NULL))
 143                 panic("Failed to populate DT");
 144 
 145         return 0;
 146 }
 147 arch_initcall(plat_of_setup);

/* [<][>][^][v][top][bottom][index][help] */