162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#include <linux/kernel.h>
462306a36Sopenharmony_ci#include <linux/export.h>
562306a36Sopenharmony_ci#include <linux/property.h>
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <asm/mpc5xxx.h>
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci/**
1062306a36Sopenharmony_ci * mpc5xxx_fwnode_get_bus_frequency - Find the bus frequency for a firmware node
1162306a36Sopenharmony_ci * @fwnode:	firmware node
1262306a36Sopenharmony_ci *
1362306a36Sopenharmony_ci * Returns bus frequency (IPS on MPC512x, IPB on MPC52xx),
1462306a36Sopenharmony_ci * or 0 if the bus frequency cannot be found.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ciunsigned long mpc5xxx_fwnode_get_bus_frequency(struct fwnode_handle *fwnode)
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci	struct fwnode_handle *parent;
1962306a36Sopenharmony_ci	u32 bus_freq;
2062306a36Sopenharmony_ci	int ret;
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	ret = fwnode_property_read_u32(fwnode, "bus-frequency", &bus_freq);
2362306a36Sopenharmony_ci	if (!ret)
2462306a36Sopenharmony_ci		return bus_freq;
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci	fwnode_for_each_parent_node(fwnode, parent) {
2762306a36Sopenharmony_ci		ret = fwnode_property_read_u32(parent, "bus-frequency", &bus_freq);
2862306a36Sopenharmony_ci		if (!ret) {
2962306a36Sopenharmony_ci			fwnode_handle_put(parent);
3062306a36Sopenharmony_ci			return bus_freq;
3162306a36Sopenharmony_ci		}
3262306a36Sopenharmony_ci	}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	return 0;
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ciEXPORT_SYMBOL(mpc5xxx_fwnode_get_bus_frequency);
37