mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
ARM: SoC cleanups for 3.16
Cleanups for 3.16. Among these are:
- A bunch of misc cleanups for Broadcom platforms, mostly housekeeping
- Enabling Common Clock Framework on the older s3c24xx Samsung chipsets
- Cleanup of the Versatile Express system controller code, moving it to syscon
- Power management cleanups for OMAP platforms
+ a handful of other cleanups across the place
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.14 (GNU/Linux)
iQIcBAABAgAGBQJTjMwHAAoJEIwa5zzehBx3MjMP/iELgDsqbNE2wxF9Fb5EEnoe
S11q1QIvVrMVdMcKFN5HfW7f+xNso6+4SwXW0cRrJokGvaqRE758WZWuZq0QBUeS
RYMhfpqmI6pTTJUyy6i6OyXhuRqu8rQ1NPEAatYrKzmtwFX1H4t25f1YtZWhBcK8
ONi45FHeH1OKGGpjpT63uhWEzLk+LZI2MtgxmWoFcemf7guX6vEPJVuVRi8eqLoS
9vl1cAkweYgGhjvQFcSXENaguV50dZlLc9C41dJk9KVvJfRt7o+/cRbG5YpGvnp5
Liu+OWM72w0BkgNk6wDN4kaPX5UGLF8QX11JlvDRCJ2FcPtM4NBG/C9TqLMfkKDR
Ze+ITiXh6NjefdTZWJaM4vzsd6vFws8EYAP24IWFlZ451bNLVN1lzlgqluPNoKmj
CAsFPZhY/x5X9a8VLZ72ohx3N17T/iMsOlbiWtnlfqDcL6N0IoLG1YkFFeQIKEAH
mpobWus8Myq1miWqSaeXh5wOqUVQmYR0I8jNoTfte1nBYSaIGhtMixoQhM6Zw50C
dgSh4p7qhrZUOnYmkPqFXr7NCJ9n3RD10Xu8d/3IIp0u9RJ5Kx6NCEg9adq22jZQ
XGrr/vH0sM8MzpKmfTMi5t2Cx5kP2G+O3enq0hQi4x3Cb4o8vwWQlMgydTd+xBjj
aLo3WTTw0h6nTuKkZL2p
=wuX4
-----END PGP SIGNATURE-----
Merge tag 'cleanup-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc into next
Pull ARM SoC cleanups from Olof Johansson:
"Cleanups for 3.16. Among these are:
- a bunch of misc cleanups for Broadcom platforms, mostly
housekeeping
- enabling Common Clock Framework on the older s3c24xx Samsung
chipsets
- cleanup of the Versatile Express system controller code, moving it
to syscon
- power management cleanups for OMAP platforms
plus a handful of other cleanups across the place"
* tag 'cleanup-for-3.16' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (87 commits)
ARM: kconfig: allow PCI support to be selected with ARCH_MULTIPLATFORM
clk: samsung: fix build error
ARM: vexpress: refine dependencies for new code
clk: samsung: clk-s3c2410-dlck: do not use PNAME macro as it declares __initdata
cpufreq: exynos: Fix the compile error
ARM: S3C24XX: move debug-macro.S into the common space
ARM: S3C24XX: use generic DEBUG_UART_PHY/_VIRT in debug macro
ARM: S3C24XX: trim down debug uart handling
ARM: compressed/head.S: remove s3c24xx special case
ARM: EXYNOS: Remove unnecessary inclusion of cpu.h
ARM: EXYNOS: Migrate Exynos specific macros from plat to mach
ARM: EXYNOS: Remove exynos_subsys registration
ARM: EXYNOS: Remove duplicate lines in Makefile
ARM: EXYNOS: use v7_exit_coherency_flush macro for cache disabling
ARM: OMAP4: PRCM: remove references to cm-regbits-44xx.h from PRCM core files
ARM: OMAP3/4: PRM: add support of late_init call to prm_ll_ops
ARM: OMAP3/OMAP4: PRM: add prm_features flags and add IO wakeup under it
ARM: OMAP3/4: PRM: provide io chain reconfig function through irq setup
ARM: OMAP2+: PRM: remove unnecessary cpu_is_XXX calls from prm_init / exit
ARM: OMAP2+: PRCM: cleanup some header includes
...
This commit is contained in:
commit
0a58471541
211 changed files with 4666 additions and 5172 deletions
|
|
@ -41,4 +41,14 @@ config ARM_CCI
|
|||
help
|
||||
Driver supporting the CCI cache coherent interconnect for ARM
|
||||
platforms.
|
||||
|
||||
config VEXPRESS_CONFIG
|
||||
bool "Versatile Express configuration bus"
|
||||
default y if ARCH_VEXPRESS
|
||||
depends on ARM || ARM64
|
||||
depends on OF
|
||||
select REGMAP
|
||||
help
|
||||
Platform configuration infrastructure for the ARM Ltd.
|
||||
Versatile Express.
|
||||
endmenu
|
||||
|
|
|
|||
|
|
@ -10,3 +10,5 @@ obj-$(CONFIG_OMAP_OCP2SCP) += omap-ocp2scp.o
|
|||
obj-$(CONFIG_OMAP_INTERCONNECT) += omap_l3_smx.o omap_l3_noc.o
|
||||
# CCI cache coherent interconnect for ARM platforms
|
||||
obj-$(CONFIG_ARM_CCI) += arm-cci.o
|
||||
|
||||
obj-$(CONFIG_VEXPRESS_CONFIG) += vexpress-config.o
|
||||
|
|
|
|||
202
drivers/bus/vexpress-config.c
Normal file
202
drivers/bus/vexpress-config.c
Normal file
|
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* Copyright (C) 2014 ARM Limited
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/vexpress.h>
|
||||
|
||||
|
||||
struct vexpress_config_bridge {
|
||||
struct vexpress_config_bridge_ops *ops;
|
||||
void *context;
|
||||
};
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
/* Default value */
|
||||
*val = 0;
|
||||
|
||||
of_node_get(node);
|
||||
while (node) {
|
||||
if (of_property_read_u32(node, name, val) == 0) {
|
||||
of_node_put(node);
|
||||
return;
|
||||
}
|
||||
node = of_get_next_parent(node);
|
||||
}
|
||||
}
|
||||
|
||||
int vexpress_config_get_topo(struct device_node *node, u32 *site,
|
||||
u32 *position, u32 *dcc)
|
||||
{
|
||||
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))
|
||||
return -EINVAL;
|
||||
vexpress_config_find_prop(node, "arm,vexpress,position", position);
|
||||
vexpress_config_find_prop(node, "arm,vexpress,dcc", dcc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
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)
|
||||
{
|
||||
struct vexpress_config_bridge *bridge;
|
||||
struct regmap *regmap;
|
||||
struct regmap **res;
|
||||
|
||||
if (WARN_ON(dev->parent->class != vexpress_config_class))
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
bridge = dev_get_drvdata(dev->parent);
|
||||
if (WARN_ON(!bridge))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
res = devres_alloc(vexpress_config_devres_release, sizeof(*res),
|
||||
GFP_KERNEL);
|
||||
if (!res)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
regmap = bridge->ops->regmap_init(dev, bridge->context);
|
||||
if (IS_ERR(regmap)) {
|
||||
devres_free(res);
|
||||
return regmap;
|
||||
}
|
||||
|
||||
*res = regmap;
|
||||
devres_add(dev, res);
|
||||
|
||||
return regmap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_regmap_init_vexpress_config);
|
||||
|
||||
struct device *vexpress_config_bridge_register(struct device *parent,
|
||||
struct vexpress_config_bridge_ops *ops, void *context)
|
||||
{
|
||||
struct device *dev;
|
||||
struct vexpress_config_bridge *bridge;
|
||||
|
||||
if (!vexpress_config_class) {
|
||||
vexpress_config_class = class_create(THIS_MODULE,
|
||||
"vexpress-config");
|
||||
if (IS_ERR(vexpress_config_class))
|
||||
return (void *)vexpress_config_class;
|
||||
}
|
||||
|
||||
dev = device_create(vexpress_config_class, parent, 0,
|
||||
NULL, "%s.bridge", dev_name(parent));
|
||||
|
||||
if (IS_ERR(dev))
|
||||
return dev;
|
||||
|
||||
bridge = devm_kmalloc(dev, sizeof(*bridge), GFP_KERNEL);
|
||||
if (!bridge) {
|
||||
put_device(dev);
|
||||
device_unregister(dev);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
bridge->ops = ops;
|
||||
bridge->context = context;
|
||||
|
||||
dev_set_drvdata(dev, bridge);
|
||||
|
||||
dev_dbg(parent, "Registered bridge '%s', parent node %p\n",
|
||||
dev_name(dev), parent->of_node);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
||||
|
||||
static int vexpress_config_node_match(struct device *dev, const void *data)
|
||||
{
|
||||
const struct device_node *node = data;
|
||||
|
||||
dev_dbg(dev, "Parent node %p, looking for %p\n",
|
||||
dev->parent->of_node, node);
|
||||
|
||||
return dev->parent->of_node == node;
|
||||
}
|
||||
|
||||
static int vexpress_config_populate(struct device_node *node)
|
||||
{
|
||||
struct device_node *bridge;
|
||||
struct device *parent;
|
||||
|
||||
bridge = of_parse_phandle(node, "arm,vexpress,config-bridge", 0);
|
||||
if (!bridge)
|
||||
return -EINVAL;
|
||||
|
||||
parent = class_find_device(vexpress_config_class, NULL, bridge,
|
||||
vexpress_config_node_match);
|
||||
if (WARN_ON(!parent))
|
||||
return -ENODEV;
|
||||
|
||||
return of_platform_populate(node, NULL, NULL, parent);
|
||||
}
|
||||
|
||||
static int __init vexpress_config_init(void)
|
||||
{
|
||||
int err = 0;
|
||||
struct device_node *node;
|
||||
|
||||
/* Need the config devices early, before the "normal" devices... */
|
||||
for_each_compatible_node(node, NULL, "arm,vexpress,config-bus") {
|
||||
err = vexpress_config_populate(node);
|
||||
if (err)
|
||||
break;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
postcore_initcall(vexpress_config_init);
|
||||
|
||||
Loading…
Reference in a new issue