diff options
author | Ezequiel Garcia <ezequiel.garcia@free-electrons.com> | 2013-07-26 09:17:45 -0400 |
---|---|---|
committer | Jason Cooper <jason@lakedaemon.net> | 2013-08-06 10:10:26 -0400 |
commit | 6839cfa82f99fd098ea486e7f9df78344c8e091f (patch) | |
tree | 1975095eab735d39984d7e9e9e345fc6f2f30d91 | |
parent | 6bd6b3cb82d55e3b9f3080b6d2c648ceffc7b08a (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.c | 49 | ||||
-rw-r--r-- | include/linux/mbus.h | 1 |
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 | ||
905 | int __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); | |||
74 | int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base, | 74 | int 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); |
77 | int mvebu_mbus_dt_init(void); | ||
77 | 78 | ||
78 | #endif /* __LINUX_MBUS_H */ | 79 | #endif /* __LINUX_MBUS_H */ |