1 /* 2 * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. 3 * 4 * Author: John Rigby, <jrigby@freescale.com>, Thur Mar 29 2007 5 * 6 * Description: 7 * MPC5121 ADS board setup 8 * 9 * This is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 */ 15 16 #include <linux/kernel.h> 17 #include <linux/io.h> 18 #include <linux/irq.h> 19 #include <linux/of_platform.h> 20 21 #include <asm/machdep.h> 22 #include <asm/ipic.h> 23 #include <asm/prom.h> 24 #include <asm/time.h> 25 26 /** 27 * mpc512x_find_ips_freq - Find the IPS bus frequency for a device 28 * @node: device node 29 * 30 * Returns IPS bus frequency, or 0 if the bus frequency cannot be found. 31 */ 32 unsigned long 33 mpc512x_find_ips_freq(struct device_node *node) 34 { 35 struct device_node *np; 36 const unsigned int *p_ips_freq = NULL; 37 38 of_node_get(node); 39 while (node) { 40 p_ips_freq = of_get_property(node, "bus-frequency", NULL); 41 if (p_ips_freq) 42 break; 43 44 np = of_get_parent(node); 45 of_node_put(node); 46 node = np; 47 } 48 if (node) 49 of_node_put(node); 50 51 return p_ips_freq ? *p_ips_freq : 0; 52 } 53 EXPORT_SYMBOL(mpc512x_find_ips_freq); 54 55 static struct of_device_id __initdata of_bus_ids[] = { 56 { .name = "soc", }, 57 { .name = "localbus", }, 58 {}, 59 }; 60 61 static void __init mpc5121_ads_declare_of_platform_devices(void) 62 { 63 /* Find every child of the SOC node and add it to of_platform */ 64 if (of_platform_bus_probe(NULL, of_bus_ids, NULL)) 65 printk(KERN_ERR __FILE__ ": " 66 "Error while probing of_platform bus\n"); 67 } 68 69 static void __init mpc5121_ads_init_IRQ(void) 70 { 71 struct device_node *np; 72 73 np = of_find_compatible_node(NULL, NULL, "fsl,ipic"); 74 if (!np) 75 return; 76 77 ipic_init(np, 0); 78 of_node_put(np); 79 80 /* 81 * Initialize the default interrupt mapping priorities, 82 * in case the boot rom changed something on us. 83 */ 84 ipic_set_default_priority(); 85 } 86 87 /* 88 * Called very early, MMU is off, device-tree isn't unflattened 89 */ 90 static int __init mpc5121_ads_probe(void) 91 { 92 unsigned long root = of_get_flat_dt_root(); 93 94 return of_flat_dt_is_compatible(root, "fsl,mpc5121ads"); 95 } 96 97 define_machine(mpc5121_ads) { 98 .name = "MPC5121 ADS", 99 .probe = mpc5121_ads_probe, 100 .init = mpc5121_ads_declare_of_platform_devices, 101 .init_IRQ = mpc5121_ads_init_IRQ, 102 .get_irq = ipic_get_irq, 103 .calibrate_decr = generic_calibrate_decr, 104 }; 105