#include <linux/of_device.h>
#include <linux/vexpress.h>
struct vexpress_config_bridge {
struct vexpress_config_bridge_ops *ops;
static DEFINE_MUTEX(vexpress_config_mutex);
static struct class *vexpress_config_class;
static u32 vexpress_config_site_master = VEXPRESS_SITE_MASTER;
void vexpress_config_set_master(u32 site)
vexpress_config_site_master = site;
u32 vexpress_config_get_master(void)
return vexpress_config_site_master;
void vexpress_config_lock(void *arg)
mutex_lock(&vexpress_config_mutex);
void vexpress_config_unlock(void *arg)
mutex_unlock(&vexpress_config_mutex);
static void vexpress_config_find_prop(struct device_node *node,
const char *name, u32 *val)
if (of_property_read_u32(node, name, val) == 0) {
node = of_get_next_parent(node);
int vexpress_config_get_topo(struct device_node *node, u32 *site,
vexpress_config_find_prop(node, "arm,vexpress,site", site);
if (*site == VEXPRESS_SITE_MASTER)
*site = vexpress_config_site_master;
if (WARN_ON(vexpress_config_site_master == VEXPRESS_SITE_MASTER))
vexpress_config_find_prop(node, "arm,vexpress,position", position);
vexpress_config_find_prop(node, "arm,vexpress,dcc", dcc);
static void vexpress_config_devres_release(struct device *dev, void *res)
struct vexpress_config_bridge *bridge = dev_get_drvdata(dev->parent);
struct regmap *regmap = res;
bridge->ops->regmap_exit(regmap, bridge->context);
struct regmap *devm_regmap_init_vexpress_config(struct device *dev)