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