1209906Sraj/*- 2209906Sraj * Copyright (c) 2009-2010 The FreeBSD Foundation 3209906Sraj * All rights reserved. 4209906Sraj * 5209906Sraj * This software was developed by Semihalf under sponsorship from 6209906Sraj * the FreeBSD Foundation. 7209906Sraj * 8209906Sraj * Redistribution and use in source and binary forms, with or without 9209906Sraj * modification, are permitted provided that the following conditions 10209906Sraj * are met: 11209906Sraj * 1. Redistributions of source code must retain the above copyright 12209906Sraj * notice, this list of conditions and the following disclaimer. 13209906Sraj * 2. Redistributions in binary form must reproduce the above copyright 14209906Sraj * notice, this list of conditions and the following disclaimer in the 15209906Sraj * documentation and/or other materials provided with the distribution. 16209906Sraj * 17209906Sraj * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18209906Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19209906Sraj * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20209906Sraj * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21209906Sraj * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22209906Sraj * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23209906Sraj * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24209906Sraj * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25209906Sraj * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26209906Sraj * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27209906Sraj * SUCH DAMAGE. 28209906Sraj */ 29209906Sraj 30209906Sraj#include <sys/cdefs.h> 31209906Sraj__FBSDID("$FreeBSD$"); 32209906Sraj 33209906Sraj#include <sys/param.h> 34209906Sraj#include <sys/systm.h> 35209906Sraj#include <sys/kernel.h> 36209906Sraj#include <sys/module.h> 37209906Sraj#include <sys/bus.h> 38209906Sraj 39209906Sraj#include <machine/intr_machdep.h> 40209906Sraj 41209906Sraj#include <dev/ofw/ofw_bus.h> 42209906Sraj#include <dev/ofw/ofw_bus_subr.h> 43209906Sraj#include <dev/ofw/openfirm.h> 44209906Sraj 45209906Sraj#include "ofw_bus_if.h" 46209906Sraj#include "fdt_common.h" 47209906Sraj 48209906Srajstatic void 49209906Srajfdt_fixup_busfreq(phandle_t root) 50209906Sraj{ 51209906Sraj phandle_t sb, cpus, child; 52209906Sraj pcell_t freq; 53209906Sraj 54209906Sraj /* 55209906Sraj * Do a strict check so as to skip non-SOC nodes, which also claim 56209906Sraj * simple-bus compatibility such as eLBC etc. 57209906Sraj */ 58209906Sraj if ((sb = fdt_find_compatible(root, "simple-bus", 1)) == 0) 59209906Sraj return; 60209906Sraj 61209906Sraj /* 62209906Sraj * This fixup uses /cpus/ bus-frequency prop value to set simple-bus 63209906Sraj * bus-frequency property. 64209906Sraj */ 65228201Sjchandra if ((cpus = OF_finddevice("/cpus")) == -1) 66209906Sraj return; 67209906Sraj 68209906Sraj if ((child = OF_child(cpus)) == 0) 69209906Sraj return; 70209906Sraj 71209906Sraj if (OF_getprop(child, "bus-frequency", (void *)&freq, 72209906Sraj sizeof(freq)) <= 0) 73209906Sraj return; 74209906Sraj 75209906Sraj OF_setprop(sb, "bus-frequency", (void *)&freq, sizeof(freq)); 76209906Sraj} 77209906Sraj 78209906Srajstruct fdt_fixup_entry fdt_fixup_table[] = { 79209906Sraj { "fsl,MPC8572DS", &fdt_fixup_busfreq }, 80209906Sraj { "MPC8555CDS", &fdt_fixup_busfreq }, 81209906Sraj { NULL, NULL } 82209906Sraj}; 83209906Sraj 84