aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEzequiel Garcia <ezequiel.garcia@free-electrons.com>2013-07-26 09:17:45 -0400
committerJason Cooper <jason@lakedaemon.net>2013-08-06 10:10:26 -0400
commit6839cfa82f99fd098ea486e7f9df78344c8e091f (patch)
tree1975095eab735d39984d7e9e9e345fc6f2f30d91
parent6bd6b3cb82d55e3b9f3080b6d2c648ceffc7b08a (diff)
bus: mvebu-mbus: Introduce device tree binding
This patch adds the most fundamental device-tree initialization. We only introduce what's required to be able to probe the mvebu-mbus driver from the DT. Follow-up patches will extend the device tree binding, allowing to describe static address decoding windows. Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> Signed-off-by: Ezequiel Garcia <ezequiel.garcia@free-electrons.com> Tested-by: Andrew Lunn <andrew@lunn.ch> Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> Signed-off-by: Jason Cooper <jason@lakedaemon.net>
-rw-r--r--drivers/bus/mvebu-mbus.c49
-rw-r--r--include/linux/mbus.h1
2 files changed, 50 insertions, 0 deletions
diff --git a/drivers/bus/mvebu-mbus.c b/drivers/bus/mvebu-mbus.c
index 1b17954600aa..44a07c4ee4ea 100644
--- a/drivers/bus/mvebu-mbus.c
+++ b/drivers/bus/mvebu-mbus.c
@@ -900,3 +900,52 @@ int __init mvebu_mbus_init(const char *soc, phys_addr_t mbuswins_phys_base,
900 sdramwins_phys_base, 900 sdramwins_phys_base,
901 sdramwins_size); 901 sdramwins_size);
902} 902}
903
904#ifdef CONFIG_OF
905int __init mvebu_mbus_dt_init(void)
906{
907 struct resource mbuswins_res, sdramwins_res;
908 struct device_node *np, *controller;
909 const struct of_device_id *of_id;
910 const __be32 *prop;
911 int ret;
912
913 np = of_find_matching_node(NULL, of_mvebu_mbus_ids);
914 if (!np) {
915 pr_err("could not find a matching SoC family\n");
916 return -ENODEV;
917 }
918
919 of_id = of_match_node(of_mvebu_mbus_ids, np);
920 mbus_state.soc = of_id->data;
921
922 prop = of_get_property(np, "controller", NULL);
923 if (!prop) {
924 pr_err("required 'controller' property missing\n");
925 return -EINVAL;
926 }
927
928 controller = of_find_node_by_phandle(be32_to_cpup(prop));
929 if (!controller) {
930 pr_err("could not find an 'mbus-controller' node\n");
931 return -ENODEV;
932 }
933
934 if (of_address_to_resource(controller, 0, &mbuswins_res)) {
935 pr_err("cannot get MBUS register address\n");
936 return -EINVAL;
937 }
938
939 if (of_address_to_resource(controller, 1, &sdramwins_res)) {
940 pr_err("cannot get SDRAM register address\n");
941 return -EINVAL;
942 }
943
944 ret = mvebu_mbus_common_init(&mbus_state,
945 mbuswins_res.start,
946 resource_size(&mbuswins_res),
947 sdramwins_res.start,
948 resource_size(&sdramwins_res));
949 return ret;
950}
951#endif
diff --git a/include/linux/mbus.h b/include/linux/mbus.h
index 9245b663e720..eadefd687a0b 100644
--- a/include/linux/mbus.h
+++ b/include/linux/mbus.h
@@ -74,5 +74,6 @@ int mvebu_mbus_del_window(phys_addr_t base, size_t size);
74int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base, 74int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
75 size_t mbus_size, phys_addr_t sdram_phys_base, 75 size_t mbus_size, phys_addr_t sdram_phys_base,
76 size_t sdram_size); 76 size_t sdram_size);
77int mvebu_mbus_dt_init(void);
77 78
78#endif /* __LINUX_MBUS_H */ 79#endif /* __LINUX_MBUS_H */