17480e0aaSRich Felker /* 27480e0aaSRich Felker * SH generic board support, using device tree 37480e0aaSRich Felker * 47480e0aaSRich Felker * Copyright (C) 2015-2016 Smart Energy Instruments, Inc. 57480e0aaSRich Felker * 67480e0aaSRich Felker * This file is subject to the terms and conditions of the GNU General Public 77480e0aaSRich Felker * License. See the file "COPYING" in the main directory of this archive 87480e0aaSRich Felker * for more details. 97480e0aaSRich Felker */ 107480e0aaSRich Felker 117480e0aaSRich Felker #include <linux/of.h> 127480e0aaSRich Felker #include <linux/of_platform.h> 137480e0aaSRich Felker #include <linux/of_fdt.h> 147480e0aaSRich Felker #include <linux/of_iommu.h> 157480e0aaSRich Felker #include <linux/clocksource.h> 167480e0aaSRich Felker #include <linux/irqchip.h> 177480e0aaSRich Felker #include <linux/clk-provider.h> 187480e0aaSRich Felker #include <asm/machvec.h> 197480e0aaSRich Felker #include <asm/rtc.h> 207480e0aaSRich Felker 217480e0aaSRich Felker static void noop(void) 227480e0aaSRich Felker { 237480e0aaSRich Felker } 247480e0aaSRich Felker 257480e0aaSRich Felker static int noopi(void) 267480e0aaSRich Felker { 277480e0aaSRich Felker return 0; 287480e0aaSRich Felker } 297480e0aaSRich Felker 307480e0aaSRich Felker static void __init sh_of_mem_reserve(void) 317480e0aaSRich Felker { 327480e0aaSRich Felker early_init_fdt_reserve_self(); 337480e0aaSRich Felker early_init_fdt_scan_reserved_mem(); 347480e0aaSRich Felker } 357480e0aaSRich Felker 367480e0aaSRich Felker static void __init sh_of_time_init(void) 377480e0aaSRich Felker { 387480e0aaSRich Felker pr_info("SH generic board support: scanning for clocksource devices\n"); 397480e0aaSRich Felker clocksource_probe(); 407480e0aaSRich Felker } 417480e0aaSRich Felker 427480e0aaSRich Felker static void __init sh_of_setup(char **cmdline_p) 437480e0aaSRich Felker { 447480e0aaSRich Felker unflatten_device_tree(); 457480e0aaSRich Felker 467480e0aaSRich Felker board_time_init = sh_of_time_init; 477480e0aaSRich Felker 487480e0aaSRich Felker sh_mv.mv_name = of_flat_dt_get_machine_name(); 497480e0aaSRich Felker if (!sh_mv.mv_name) 507480e0aaSRich Felker sh_mv.mv_name = "Unknown SH model"; 517480e0aaSRich Felker 527480e0aaSRich Felker /* FIXME: register smp ops to use dt to find cpus, use 537480e0aaSRich Felker * cpu enable-method, and use irq controller's ipi 547480e0aaSRich Felker * functions. */ 557480e0aaSRich Felker } 567480e0aaSRich Felker 577480e0aaSRich Felker static int sh_of_irq_demux(int irq) 587480e0aaSRich Felker { 597480e0aaSRich Felker /* FIXME: eventually this should not be used at all; 607480e0aaSRich Felker * the interrupt controller should set_handle_irq(). */ 617480e0aaSRich Felker return irq; 627480e0aaSRich Felker } 637480e0aaSRich Felker 647480e0aaSRich Felker static void __init sh_of_init_irq(void) 657480e0aaSRich Felker { 667480e0aaSRich Felker pr_info("SH generic board support: scanning for interrupt controllers\n"); 677480e0aaSRich Felker irqchip_init(); 687480e0aaSRich Felker } 697480e0aaSRich Felker 707480e0aaSRich Felker static int __init sh_of_clk_init(void) 717480e0aaSRich Felker { 727480e0aaSRich Felker #ifdef CONFIG_COMMON_CLK 737480e0aaSRich Felker /* Disabled pending move to COMMON_CLK framework. */ 747480e0aaSRich Felker pr_info("SH generic board support: scanning for clk providers\n"); 757480e0aaSRich Felker of_clk_init(NULL); 767480e0aaSRich Felker #endif 777480e0aaSRich Felker return 0; 787480e0aaSRich Felker } 797480e0aaSRich Felker 807480e0aaSRich Felker static struct sh_machine_vector __initmv sh_of_generic_mv = { 817480e0aaSRich Felker .mv_setup = sh_of_setup, 827480e0aaSRich Felker .mv_name = "devicetree", /* replaced by DT root's model */ 837480e0aaSRich Felker .mv_irq_demux = sh_of_irq_demux, 847480e0aaSRich Felker .mv_init_irq = sh_of_init_irq, 857480e0aaSRich Felker .mv_clk_init = sh_of_clk_init, 867480e0aaSRich Felker .mv_mode_pins = noopi, 877480e0aaSRich Felker .mv_mem_init = noop, 887480e0aaSRich Felker .mv_mem_reserve = sh_of_mem_reserve, 897480e0aaSRich Felker }; 907480e0aaSRich Felker 917480e0aaSRich Felker struct sh_clk_ops; 927480e0aaSRich Felker 937480e0aaSRich Felker void __init arch_init_clk_ops(struct sh_clk_ops **ops, int idx) 947480e0aaSRich Felker { 957480e0aaSRich Felker } 967480e0aaSRich Felker 977480e0aaSRich Felker void __init plat_irq_setup(void) 987480e0aaSRich Felker { 997480e0aaSRich Felker } 1007480e0aaSRich Felker 1017480e0aaSRich Felker static int __init sh_of_device_init(void) 1027480e0aaSRich Felker { 1037480e0aaSRich Felker pr_info("SH generic board support: populating platform devices\n"); 1047480e0aaSRich Felker if (of_have_populated_dt()) { 1057480e0aaSRich Felker of_iommu_init(); 1067480e0aaSRich Felker of_platform_populate(NULL, of_default_bus_match_table, 1077480e0aaSRich Felker NULL, NULL); 1087480e0aaSRich Felker } else { 1097480e0aaSRich Felker pr_crit("Device tree not populated\n"); 1107480e0aaSRich Felker } 1117480e0aaSRich Felker return 0; 1127480e0aaSRich Felker } 1137480e0aaSRich Felker arch_initcall_sync(sh_of_device_init); 114