ARM: vexpress: Move vexpress_flags_set() into arch code

vexpress_flags_set() is only used by the platform SMP related code and
has nothing to do with the vexpress-sysreg MFD driver other than both
access the same h/w block. It's also only needed for 32-bit systems and
must be built-in for them. Let's move vexpress_flags_set() closer to
where it is being used. This will allow for vexpress-sysreg to be built
as a module.

Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Cc: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Sudeep Holla <sudeep.holla@arm.com>
Acked-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Liviu Dudau <liviu.dudau@arm.com>
Acked-by: Lee Jones <lee.jones@linaro.org>
Signed-off-by: Rob Herring <robh@kernel.org>
This commit is contained in:
Rob Herring 2020-04-29 15:58:10 -05:00
parent ae83d0b416
commit 9b06fc3908
6 changed files with 25 additions and 24 deletions

View file

@ -22,7 +22,6 @@ menuconfig ARCH_VEXPRESS
select REGULATOR_FIXED_VOLTAGE if REGULATOR select REGULATOR_FIXED_VOLTAGE if REGULATOR
select VEXPRESS_CONFIG select VEXPRESS_CONFIG
select VEXPRESS_SYSCFG select VEXPRESS_SYSCFG
select MFD_VEXPRESS_SYSREG
help help
This option enables support for systems using Cortex processor based This option enables support for systems using Cortex processor based
ARM core and logic (FPGA) tiles on the Versatile Express motherboard, ARM core and logic (FPGA) tiles on the Versatile Express motherboard,

View file

@ -1,3 +1,4 @@
bool vexpress_smp_init_ops(void); bool vexpress_smp_init_ops(void);
void vexpress_flags_set(u32 data);
extern const struct smp_operations vexpress_smp_dt_ops; extern const struct smp_operations vexpress_smp_dt_ops;

View file

@ -20,6 +20,7 @@
#include <asm/cputype.h> #include <asm/cputype.h>
#include <asm/cp15.h> #include <asm/cp15.h>
#include "core.h"
#define RST_HOLD0 0x0 #define RST_HOLD0 0x0
#define RST_HOLD1 0x4 #define RST_HOLD1 0x4

View file

@ -1,8 +1,31 @@
// SPDX-License-Identifier: GPL-2.0 // SPDX-License-Identifier: GPL-2.0
#include <linux/of.h>
#include <linux/of_address.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include "core.h" #include "core.h"
#define SYS_FLAGSSET 0x030
#define SYS_FLAGSCLR 0x034
void vexpress_flags_set(u32 data)
{
static void __iomem *base;
if (!base) {
struct device_node *node = of_find_compatible_node(NULL, NULL,
"arm,vexpress-sysreg");
base = of_iomap(node, 0);
}
if (WARN_ON(!base))
return;
writel(~0, base + SYS_FLAGSCLR);
writel(data, base + SYS_FLAGSSET);
}
static const char * const v2m_dt_match[] __initconst = { static const char * const v2m_dt_match[] __initconst = {
"arm,vexpress", "arm,vexpress",
NULL, NULL,

View file

@ -8,7 +8,6 @@
#include <linux/err.h> #include <linux/err.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/mfd/core.h> #include <linux/mfd/core.h>
#include <linux/of_address.h>
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/platform_data/syscon.h> #include <linux/platform_data/syscon.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
@ -42,24 +41,6 @@
#define SYS_MISC_MASTERSITE (1 << 14) #define SYS_MISC_MASTERSITE (1 << 14)
void vexpress_flags_set(u32 data)
{
static void __iomem *base;
if (!base) {
struct device_node *node = of_find_compatible_node(NULL, NULL,
"arm,vexpress-sysreg");
base = of_iomap(node, 0);
}
if (WARN_ON(!base))
return;
writel(~0, base + SYS_FLAGSCLR);
writel(data, base + SYS_FLAGSSET);
}
/* The sysreg block is just a random collection of various functions... */ /* The sysreg block is just a random collection of various functions... */
static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = { static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = {

View file

@ -40,8 +40,4 @@ struct device *vexpress_config_bridge_register(struct device *parent,
struct regmap *devm_regmap_init_vexpress_config(struct device *dev); struct regmap *devm_regmap_init_vexpress_config(struct device *dev);
/* Platform control */
void vexpress_flags_set(u32 data);
#endif #endif