You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
90 lines
3.2 KiB
90 lines
3.2 KiB
From 93b6bd1bf81cffd3e5739478c4434bf25458ec7d Mon Sep 17 00:00:00 2001
|
|
From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
Date: Fri, 5 Jul 2013 14:54:16 +0200
|
|
Subject: [PATCH 038/203] bus: mvebu-mbus: Add new API for window creation
|
|
|
|
We add an API to create MBus address decoding windows from the target
|
|
ID and attribute. This function will be used later and deprecate the
|
|
current name based scheme.
|
|
|
|
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
Tested-by: Andrew Lunn <andrew@lunn.ch>
|
|
Tested-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
|
---
|
|
drivers/bus/mvebu-mbus.c | 33 +++++++++++++++++++++++++--------
|
|
include/linux/mbus.h | 6 ++++++
|
|
2 files changed, 31 insertions(+), 8 deletions(-)
|
|
|
|
--- a/drivers/bus/mvebu-mbus.c
|
|
+++ b/drivers/bus/mvebu-mbus.c
|
|
@@ -748,6 +748,22 @@ static const struct of_device_id of_mveb
|
|
/*
|
|
* Public API of the driver
|
|
*/
|
|
+int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
|
+ unsigned int attribute,
|
|
+ phys_addr_t base, size_t size,
|
|
+ phys_addr_t remap)
|
|
+{
|
|
+ struct mvebu_mbus_state *s = &mbus_state;
|
|
+
|
|
+ if (!mvebu_mbus_window_conflicts(s, base, size, target, attribute)) {
|
|
+ pr_err("cannot add window '%x:%x', conflicts with another window\n",
|
|
+ target, attribute);
|
|
+ return -EINVAL;
|
|
+ }
|
|
+
|
|
+ return mvebu_mbus_alloc_window(s, base, size, remap, target, attribute);
|
|
+}
|
|
+
|
|
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
|
size_t size, phys_addr_t remap,
|
|
unsigned int flags)
|
|
@@ -776,14 +792,8 @@ int mvebu_mbus_add_window_remap_flags(co
|
|
else if (flags == MVEBU_MBUS_PCI_WA)
|
|
attr |= 0x28;
|
|
|
|
- if (!mvebu_mbus_window_conflicts(s, base, size, target, attr)) {
|
|
- pr_err("cannot add window '%s', conflicts with another window\n",
|
|
- devname);
|
|
- return -EINVAL;
|
|
- }
|
|
-
|
|
- return mvebu_mbus_alloc_window(s, base, size, remap, target, attr);
|
|
-
|
|
+ return mvebu_mbus_add_window_remap_by_id(target, attr, base,
|
|
+ size, remap);
|
|
}
|
|
|
|
int mvebu_mbus_add_window(const char *devname, phys_addr_t base, size_t size)
|
|
@@ -792,6 +802,13 @@ int mvebu_mbus_add_window(const char *de
|
|
MVEBU_MBUS_NO_REMAP, 0);
|
|
}
|
|
|
|
+int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
|
+ phys_addr_t base, size_t size)
|
|
+{
|
|
+ return mvebu_mbus_add_window_remap_by_id(target, attribute, base,
|
|
+ size, MVEBU_MBUS_NO_REMAP);
|
|
+}
|
|
+
|
|
int mvebu_mbus_del_window(phys_addr_t base, size_t size)
|
|
{
|
|
int win;
|
|
--- a/include/linux/mbus.h
|
|
+++ b/include/linux/mbus.h
|
|
@@ -62,8 +62,14 @@ static inline const struct mbus_dram_tar
|
|
int mvebu_mbus_add_window_remap_flags(const char *devname, phys_addr_t base,
|
|
size_t size, phys_addr_t remap,
|
|
unsigned int flags);
|
|
+int mvebu_mbus_add_window_remap_by_id(unsigned int target,
|
|
+ unsigned int attribute,
|
|
+ phys_addr_t base, size_t size,
|
|
+ phys_addr_t remap);
|
|
int mvebu_mbus_add_window(const char *devname, phys_addr_t base,
|
|
size_t size);
|
|
+int mvebu_mbus_add_window_by_id(unsigned int target, unsigned int attribute,
|
|
+ phys_addr_t base, size_t size);
|
|
int mvebu_mbus_del_window(phys_addr_t base, size_t size);
|
|
int mvebu_mbus_init(const char *soc, phys_addr_t mbus_phys_base,
|
|
size_t mbus_size, phys_addr_t sdram_phys_base,
|
|
|