1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2de06fba6SAndy Shevchenko 
3de06fba6SAndy Shevchenko #include <linux/kernel.h>
4de06fba6SAndy Shevchenko #include <linux/export.h>
5de06fba6SAndy Shevchenko #include <linux/property.h>
6de06fba6SAndy Shevchenko 
7de06fba6SAndy Shevchenko #include <asm/mpc5xxx.h>
8de06fba6SAndy Shevchenko 
987c441e5SWolfgang Denk /**
10de06fba6SAndy Shevchenko  * mpc5xxx_fwnode_get_bus_frequency - Find the bus frequency for a firmware node
11de06fba6SAndy Shevchenko  * @fwnode:	firmware node
1287c441e5SWolfgang Denk  *
1387c441e5SWolfgang Denk  * Returns bus frequency (IPS on MPC512x, IPB on MPC52xx),
1487c441e5SWolfgang Denk  * or 0 if the bus frequency cannot be found.
1587c441e5SWolfgang Denk  */
mpc5xxx_fwnode_get_bus_frequency(struct fwnode_handle * fwnode)16de06fba6SAndy Shevchenko unsigned long mpc5xxx_fwnode_get_bus_frequency(struct fwnode_handle *fwnode)
1787c441e5SWolfgang Denk {
18de06fba6SAndy Shevchenko 	struct fwnode_handle *parent;
19de06fba6SAndy Shevchenko 	u32 bus_freq;
20de06fba6SAndy Shevchenko 	int ret;
2187c441e5SWolfgang Denk 
22de06fba6SAndy Shevchenko 	ret = fwnode_property_read_u32(fwnode, "bus-frequency", &bus_freq);
23de06fba6SAndy Shevchenko 	if (!ret)
24de06fba6SAndy Shevchenko 		return bus_freq;
2587c441e5SWolfgang Denk 
26de06fba6SAndy Shevchenko 	fwnode_for_each_parent_node(fwnode, parent) {
27de06fba6SAndy Shevchenko 		ret = fwnode_property_read_u32(parent, "bus-frequency", &bus_freq);
28*b9bbbf49SLiang He 		if (!ret) {
29*b9bbbf49SLiang He 			fwnode_handle_put(parent);
30de06fba6SAndy Shevchenko 			return bus_freq;
3187c441e5SWolfgang Denk 		}
32*b9bbbf49SLiang He 	}
3387c441e5SWolfgang Denk 
34de06fba6SAndy Shevchenko 	return 0;
3587c441e5SWolfgang Denk }
36de06fba6SAndy Shevchenko EXPORT_SYMBOL(mpc5xxx_fwnode_get_bus_frequency);
37