Modularizing Versatile Express
Subsystems (9)
cover Modularizing Versatile Express
This series enables building various Versatile Express platform drivers as modules. The primary target is the Fast Model FVP which is supported in Android. As Android is moving towards their GKI, or generic kernel, the hardware support has to be in modules. Currently ARCH_VEXPRESS enables several built-in only drivers. Some of these are needed, but some are only needed for older 32-bit VExpress platforms and can just be disabled. For FVP, the pl111 display driver is needed. The pl111 driver depends on vexpress-osc clocks which had a dependency chain of vexpress-config --> vexpress-syscfg --> vexpress-sysreg. These components relied on fixed initcall ordering and didn't support deferred probe which would have complicated making them modules. All these levels of abstraction are needlessly complicated, so this series simplifies things a bit by merging the vexpress-config and vexpress-syscfg functionality.
There's a couple of other pieces to this which I've sent out separately as they don't have dependencies with this series. The cross subsystem dependencies in this series are mainly the ordering of enabling drivers as modules.
A complete git branch is here[1]. Tested on Fast Model FVP Rev C.
Rob
[1] git://git.kernel.org/pub/scm/linux/kernel/git/robh/linux.git vexpress-modules-v3
Rob Herring (17):
ARM: vexpress: Move vexpress_flags_set() into arch code
arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS
arm64: vexpress: Don't select CONFIG_VEXPRESS_CONFIG power/reset: vexpress: Support building as a module
clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
clk: versatile: Only enable SP810 on 32-bit by default
clk: vexpress-osc: Use the devres clock API variants
clk: vexpress-osc: Support building as a module
mfd: vexpress-sysreg: Drop selecting CONFIG_CLKSRC_MMIO
mfd: vexpress-sysreg: Drop unused syscon child devices
mfd: vexpress-sysreg: Use devres API variants
mfd: vexpress-sysreg: Support building as a module
bus: vexpress-config: Merge vexpress-syscfg into vexpress-config
bus: vexpress-config: simplify config bus probing
vexpress: Move site master init to vexpress-config bus
bus: vexpress-config: Support building as module
ARM: vexpress: Don't select VEXPRESS_CONFIG
arch/arm/mach-integrator/Kconfig | 1 - arch/arm/mach-realview/Kconfig | 1 - arch/arm/mach-versatile/Kconfig | 1 - arch/arm/mach-vexpress/Kconfig | 4 - arch/arm/mach-vexpress/core.h | 1 + arch/arm/mach-vexpress/dcscb.c | 1 + arch/arm/mach-vexpress/v2m.c | 23 ++ arch/arm64/Kconfig.platforms | 3 - drivers/bus/Kconfig | 2 +- drivers/bus/vexpress-config.c | 354 ++++++++++++++++++----- drivers/clk/Makefile | 2 +- drivers/clk/versatile/Kconfig | 15 +- drivers/clk/versatile/clk-vexpress-osc.c | 20 +- drivers/mfd/Kconfig | 5 +- drivers/mfd/vexpress-sysreg.c | 99 +------ drivers/misc/Kconfig | 9 - drivers/misc/Makefile | 1 - drivers/misc/vexpress-syscfg.c | 280 ------------------ drivers/power/reset/Kconfig | 2 +- drivers/power/reset/vexpress-poweroff.c | 10 +- include/linux/vexpress.h | 30 -- 21 files changed, 338 insertions(+), 526 deletions(-) delete mode 100644 drivers/misc/vexpress-syscfg.c
--
2.20.1
PATCH 1/17 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.
--- arch/arm/mach-vexpress/Kconfig | 1 - arch/arm/mach-vexpress/core.h | 1 + arch/arm/mach-vexpress/dcscb.c | 1 + arch/arm/mach-vexpress/v2m.c | 23 +++++++++++++++++++++++ drivers/mfd/vexpress-sysreg.c | 19 ------------------- include/linux/vexpress.h | 4 ---- 6 files changed, 25 insertions(+), 24 deletions(-)
arch/arm/mach-vexpress/Kconfig +0 -1
@@ -22,7 +22,6 @@ menuconfig ARCH_VEXPRESS select REGULATOR_FIXED_VOLTAGE if REGULATOR select VEXPRESS_CONFIG select VEXPRESS_SYSCFG - select MFD_VEXPRESS_SYSREG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,
arch/arm/mach-vexpress/core.h +1 -0
@@ -1,3 +1,4 @@bool vexpress_smp_init_ops (void ); +void vexpress_flags_set (u32 data);extern const struct smp_operations vexpress_smp_dt_ops;
arch/arm/mach-vexpress/dcscb.c +1 -0
@@ -20,6 +20,7 @@#include <asm/cputype.h> #include <asm/cp15.h> +#include "core.h" #define RST_HOLD0 0x0#define RST_HOLD1 0x4
arch/arm/mach-vexpress/v2m.c +23 -0
@@ -1,8 +1,31 @@// SPDX-License-Identifier: GPL-2.0 +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/mach/arch.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 = {"arm,vexpress" ,NULL ,
drivers/mfd/vexpress-sysreg.c +0 -19
@@ -8,7 +8,6 @@#include <linux/err.h> #include <linux/io.h> #include <linux/mfd/core.h> -#include <linux/of_address.h> #include <linux/of_platform.h> #include <linux/platform_data/syscon.h> #include <linux/platform_device.h>
@@ -42,24 +41,6 @@#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... */ static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = {
include/linux/vexpress.h +0 -4
@@ -40,8 +40,4 @@ struct device *vexpress_config_bridge_register(struct device *parent,struct regmap *devm_regmap_init_vexpress_config (struct device *dev); -/* Platform control */ - -void vexpress_flags_set (u32 data); -#endif
Signature · 1 line
2.20.1
PATCH 2/17 arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS
In reply to Rob HerringThe VExpress power-off/reset driver is not needed on 64-bit platforms as PSCI power-off and reset can be used instead. Stop selecting it so it can be disabled and not always built-in.
--- arch/arm64/Kconfig.platforms | 1 - 1 file changed, 1 deletion(-)
arch/arm64/Kconfig.platforms +0 -1
@@ -278,7 +278,6 @@ config ARCH_VEXPRESS select GPIOLIB select PM select PM_GENERIC_DOMAINS - select POWER_RESET_VEXPRESS select VEXPRESS_CONFIG help This enables support for the ARMv8 software model (Versatile
Signature · 1 line
2.20.1
PATCH 3/17 arm64: vexpress: Don't select CONFIG_VEXPRESS_CONFIG
In reply to Rob HerringCONFIG_VEXPRESS_CONFIG has 'default y if ARCH_VEXPRESS', so selecting is unnecessary. It also prevents setting CONFIG_VEXPRESS_CONFIG to a module.
--- arch/arm64/Kconfig.platforms | 1 - 1 file changed, 1 deletion(-)
arch/arm64/Kconfig.platforms +0 -1
@@ -278,7 +278,6 @@ config ARCH_VEXPRESS select GPIOLIB select PM select PM_GENERIC_DOMAINS - select VEXPRESS_CONFIG help This enables support for the ARMv8 software model (Versatile Express).
Signature · 1 line
2.20.1
PATCH 4/17 power/reset: vexpress: Support building as a module
In reply to Rob HerringEnable building the VExpress power-off/reset driver as a module.
--- drivers/power/reset/Kconfig | 2 +- drivers/power/reset/vexpress-poweroff.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-)
drivers/power/reset/Kconfig +1 -1
@@ -182,7 +182,7 @@ config POWER_RESET_VERSATILE reference boards. config POWER_RESET_VEXPRESS - bool "ARM Versatile Express power-off and reset driver" + tristate "ARM Versatile Express power-off and reset driver" depends on ARM || ARM64 depends on VEXPRESS_CONFIG help
drivers/power/reset/vexpress-poweroff.c +4 -6
@@ -5,6 +5,7 @@*/ #include <linux/delay.h> +#include <linux/module.h> #include <linux/notifier.h> #include <linux/of.h> #include <linux/of_device.h>
@@ -87,6 +88,7 @@ static const struct of_device_id vexpress_reset_of_match[] = { }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_reset_of_match);static int _vexpress_register_restart_handler (struct device *dev) {
@@ -145,9 +147,5 @@ static struct platform_driver vexpress_reset_driver = { .of_match_table = vexpress_reset_of_match, }, }; - -static int __init vexpress_reset_init (void ) -{ -return platform_driver_register (&vexpress_reset_driver); -} -device_initcall (vexpress_reset_init); +module_platform_driver (vexpress_reset_driver); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.20.1
PATCH 5/17 clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
In reply to Rob HerringCONFIG_COMMON_CLK_VERSATILE doesn't really do anything other than hiding Arm Ltd reference platform clock drivers. It is both selected by the platforms that need it and has a 'depends on' for those platforms. It selects REGMAP_MMIO, but really CONFIG_ICST should do that. Also, CONFIG_ICST can't be enabled for COMPILE_TEST unless something else selected it.
--- arch/arm/mach-integrator/Kconfig | 1 - arch/arm/mach-realview/Kconfig | 1 - arch/arm/mach-versatile/Kconfig | 1 - arch/arm/mach-vexpress/Kconfig | 1 - arch/arm64/Kconfig.platforms | 1 - drivers/clk/Makefile | 2 +- drivers/clk/versatile/Kconfig | 13 ++----------- 7 files changed, 3 insertions(+), 17 deletions(-)
arch/arm/mach-integrator/Kconfig +0 -1
@@ -3,7 +3,6 @@ menuconfig ARCH_INTEGRATOR bool "ARM Ltd. Integrator family" depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V6 select ARM_AMBA - select COMMON_CLK_VERSATILE select HAVE_TCM select ICST select MFD_SYSCON
arch/arm/mach-realview/Kconfig +0 -1
@@ -6,7 +6,6 @@ menuconfig ARCH_REALVIEW select ARM_GIC select ARM_TIMER_SP804 select CLK_SP810 - select COMMON_CLK_VERSATILE select GPIO_PL061 if GPIOLIB select HAVE_ARM_SCU if SMP select HAVE_ARM_TWD if SMP
arch/arm/mach-versatile/Kconfig +0 -1
@@ -6,7 +6,6 @@ config ARCH_VERSATILE select ARM_TIMER_SP804 select ARM_VIC select CLKSRC_VERSATILE - select COMMON_CLK_VERSATILE select CPU_ARM926T select ICST select MFD_SYSCON
arch/arm/mach-vexpress/Kconfig +0 -1
@@ -7,7 +7,6 @@ menuconfig ARCH_VEXPRESS select ARM_GIC select ARM_GLOBAL_TIMER select ARM_TIMER_SP804 - select COMMON_CLK_VERSATILE select GPIOLIB select HAVE_ARM_SCU if SMP select HAVE_ARM_TWD if SMP
arch/arm64/Kconfig.platforms +0 -1
@@ -274,7 +274,6 @@ config ARCH_UNIPHIER config ARCH_VEXPRESS bool "ARMv8 software model (Versatile Express)" - select COMMON_CLK_VERSATILE select GPIOLIB select PM select PM_GENERIC_DOMAINS
drivers/clk/Makefile +1 -1
@@ -114,7 +114,7 @@ obj-$(CONFIG_ARCH_TEGRA) += tegra/ obj-y += ti/ obj-$(CONFIG_CLK_UNIPHIER) += uniphier/ obj-$(CONFIG_ARCH_U8500) += ux500/ -obj-$(CONFIG_COMMON_CLK_VERSATILE) += versatile/ +obj-y += versatile/ ifeq ($(CONFIG_COMMON_CLK), y) obj-$(CONFIG_X86) += x86/ endif
drivers/clk/versatile/Kconfig +2 -11
@@ -1,22 +1,14 @@ # SPDX-License-Identifier: GPL-2.0-only config ICST - bool - -config COMMON_CLK_VERSATILE - bool "Clock driver for ARM Reference designs" - depends on ARCH_INTEGRATOR || ARCH_REALVIEW || \ - ARCH_VERSATILE || ARCH_VEXPRESS || ARM64 || \ - COMPILE_TEST + bool "Clock driver for ARM Reference designs ICST" if COMPILE_TEST select REGMAP_MMIO ---help--- Supports clocking on ARM Reference designs: - Integrator/AP and Integrator/CP - RealView PB1176, EB, PB11MP and PBX - - Versatile Express config CLK_SP810 bool "Clock driver for ARM SP810 System Controller" - depends on COMMON_CLK_VERSATILE default y if ARCH_VEXPRESS ---help--- Supports clock muxing (REFCLK/TIMCLK to TIMERCLKEN0-3) capabilities
@@ -24,8 +16,7 @@ config CLK_SP810 config CLK_VEXPRESS_OSC bool "Clock driver for Versatile Express OSC clock generators" - depends on COMMON_CLK_VERSATILE - depends on VEXPRESS_CONFIG + depends on VEXPRESS_CONFIG || COMPILE_TEST default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatile
Signature · 1 line
2.20.1
PATCH 6/17 clk: versatile: Only enable SP810 on 32-bit by default
In reply to Rob HerringWhile 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
--- drivers/clk/versatile/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/versatile/Kconfig +1 -1
@@ -9,7 +9,7 @@ config ICST config CLK_SP810 bool "Clock driver for ARM SP810 System Controller" - default y if ARCH_VEXPRESS + default y if (ARCH_VEXPRESS && ARM) ---help--- Supports clock muxing (REFCLK/TIMCLK to TIMERCLKEN0-3) capabilities of the ARM SP810 System Controller cell.
Signature · 1 line
2.20.1
PATCH 7/17 clk: vexpress-osc: Use the devres clock API variants
In reply to Rob HerringIn preparation to enable the vexpress-osc clock driver as a module, convert the driver to use the managed devres clock API variants. With this, a driver .remove() hook is not needed.
--- drivers/clk/versatile/clk-vexpress-osc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/clk/versatile/clk-vexpress-osc.c +5 -5
@@ -65,8 +65,8 @@ static int vexpress_osc_probe(struct platform_device *pdev) {struct clk_init_data init;struct vexpress_osc *osc; -struct clk *clk;u32 range[2 ]; +int ret; osc =devm_kzalloc (&pdev->dev,sizeof (*osc),GFP_KERNEL );if (!osc)
@@ -92,11 +92,11 @@ static int vexpress_osc_probe(struct platform_device *pdev) osc->hw.init = &init; - clk =clk_register (NULL , &osc->hw); -if (IS_ERR (clk)) -return PTR_ERR (clk); + ret =devm_clk_hw_register (&pdev->dev, &osc->hw); +if (ret <0 ) +return ret; -of_clk_add_provider (pdev->dev.of_node, of_clk_src_simple_get, clk); +devm_of_clk_add_hw_provider (&pdev->dev, of_clk_hw_simple_get, &osc->hw);clk_hw_set_rate_range (&osc->hw, osc->rate_min, osc->rate_max);dev_dbg (&pdev->dev,"Registered clock '%s'\n" , init.name);
Signature · 1 line
2.20.1
PATCH 8/17 clk: vexpress-osc: Support building as a module
In reply to Rob HerringEnable building the vexpress-osc clock driver as a module.
--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)
drivers/clk/versatile/Kconfig +2 -2
@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatile
drivers/clk/versatile/clk-vexpress-osc.c +4 -6
@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h>
@@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {
@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init); +module_platform_driver (vexpress_osc_driver); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.20.1
PATCH 9/17 mfd: vexpress-sysreg: Drop selecting CONFIG_CLKSRC_MMIO
In reply to Rob HerringNothing in the VExpress sysregs nor the MFD child drivers use CONFIG_CLKSRC_MMIO. There's the 24MHz counter, but that's handled by drivers/clocksource/timer-versatile.c which doesn't use CONFIG_CLKSRC_MMIO either. So let's just drop CONFIG_CLKSRC_MMIO.
As the !ARCH_USES_GETTIMEOFFSET dependency was added for CONFIG_CLKSRC_MMIO, that can be dropped, too.
--- drivers/mfd/Kconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/mfd/Kconfig +1 -2
@@ -2029,9 +2029,8 @@ endmenu config MFD_VEXPRESS_SYSREG bool "Versatile Express System Registers" - depends on VEXPRESS_CONFIG && GPIOLIB && !ARCH_USES_GETTIMEOFFSET + depends on VEXPRESS_CONFIG && GPIOLIB default y - select CLKSRC_MMIO select GPIO_GENERIC_PLATFORM select MFD_CORE select MFD_SYSCON
Signature · 1 line
2.20.1
PATCH 10/17 mfd: vexpress-sysreg: Drop unused syscon child devices
In reply to Rob Herring--- drivers/mfd/vexpress-sysreg.c | 36 ----------------------------------- 1 file changed, 36 deletions(-)
drivers/mfd/vexpress-sysreg.c +0 -36
@@ -43,10 +43,6 @@/* The sysreg block is just a random collection of various functions... */ -static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = { - .label ="sys_id" , -}; -static struct bgpio_pdata vexpress_sysreg_sys_led_pdata = { .label ="sys_led" , .base =-1 ,
@@ -65,24 +61,8 @@ static struct bgpio_pdata vexpress_sysreg_sys_flash_pdata = { .ngpio = 1, }; -static struct syscon_platform_data vexpress_sysreg_sys_misc_pdata = { - .label ="sys_misc" , -}; - -static struct syscon_platform_data vexpress_sysreg_sys_procid_pdata = { - .label ="sys_procid" , -}; -static struct mfd_cell vexpress_sysreg_cells[] = { { - .name ="syscon" , - .num_resources =1 , - .resources = (struct resource []) { -DEFINE_RES_MEM (SYS_ID ,0x4 ), - }, - .platform_data = &vexpress_sysreg_sys_id_pdata, - .pdata_size =sizeof (vexpress_sysreg_sys_id_pdata), - }, { .name ="basic-mmio-gpio" , .of_compatible ="arm,vexpress-sysreg,sys_led" , .num_resources =1 ,
@@ -109,22 +89,6 @@ static struct mfd_cell vexpress_sysreg_cells[] = { }, .platform_data = &vexpress_sysreg_sys_flash_pdata, .pdata_size = sizeof(vexpress_sysreg_sys_flash_pdata), - }, { - .name = "syscon", - .num_resources = 1, - .resources = (struct resource []) { -DEFINE_RES_MEM (SYS_MISC ,0x4 ), - }, - .platform_data = &vexpress_sysreg_sys_misc_pdata, - .pdata_size = sizeof(vexpress_sysreg_sys_misc_pdata), - }, { - .name = "syscon", - .num_resources = 1, - .resources = (struct resource []) { -DEFINE_RES_MEM (SYS_PROCID0 ,0x8 ), - }, - .platform_data = &vexpress_sysreg_sys_procid_pdata, - .pdata_size = sizeof(vexpress_sysreg_sys_procid_pdata), }, { .name = "vexpress-syscfg", .num_resources = 1,
Signature · 1 line
2.20.1
PATCH 11/17 mfd: vexpress-sysreg: Use devres API variants
In reply to Rob HerringUse the managed devm_gpiochip_add_data() and devm_mfd_add_devices() instead of their unmanaged counterparts. With this, no .remove() hook is needed for driver unbind.
--- drivers/mfd/vexpress-sysreg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mfd/vexpress-sysreg.c +2 -2
@@ -140,9 +140,9 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)bgpio_init (mmc_gpio_chip, &pdev->dev,0x4 , base +SYS_MCI ,NULL ,NULL ,NULL ,NULL ,0 ); mmc_gpio_chip->ngpio =2 ; -gpiochip_add_data (mmc_gpio_chip,NULL ); +devm_gpiochip_add_data (&pdev->dev, mmc_gpio_chip,NULL ); -return mfd_add_devices (&pdev->dev,PLATFORM_DEVID_AUTO , +return devm_mfd_add_devices (&pdev->dev,PLATFORM_DEVID_AUTO , vexpress_sysreg_cells,ARRAY_SIZE (vexpress_sysreg_cells), mem,0 ,NULL ); }
Signature · 1 line
2.20.1
PATCH 12/17 mfd: vexpress-sysreg: Support building as a module
In reply to Rob HerringEnable building the vexpress-sysreg driver as a module.
--- drivers/mfd/Kconfig | 2 +- drivers/mfd/vexpress-sysreg.c | 15 ++++----------- 2 files changed, 5 insertions(+), 12 deletions(-)
drivers/mfd/Kconfig +1 -1
@@ -2028,7 +2028,7 @@ config MCP_UCB1200_TS endmenu config MFD_VEXPRESS_SYSREG - bool "Versatile Express System Registers" + tristate "Versatile Express System Registers" depends on VEXPRESS_CONFIG && GPIOLIB default y select GPIO_GENERIC_PLATFORM
drivers/mfd/vexpress-sysreg.c +4 -11
@@ -8,6 +8,7 @@#include <linux/err.h> #include <linux/io.h> #include <linux/mfd/core.h> +#include <linux/module.h> #include <linux/of_platform.h> #include <linux/platform_data/syscon.h> #include <linux/platform_device.h>
@@ -151,6 +152,7 @@ static const struct of_device_id vexpress_sysreg_match[] = { { .compatible = "arm,vexpress-sysreg", }, {}, }; +MODULE_DEVICE_TABLE (of, vexpress_sysreg_match);static struct platform_driver vexpress_sysreg_driver = { .driver = {
@@ -160,14 +162,5 @@ static struct platform_driver vexpress_sysreg_driver = { .probe = vexpress_sysreg_probe, }; -static int __init vexpress_sysreg_init (void ) -{ -struct device_node *node; - -/* Need the sysreg early, before any other device... */ -for_each_matching_node (node, vexpress_sysreg_match) -of_platform_device_create (node,NULL ,NULL ); - -return platform_driver_register (&vexpress_sysreg_driver); -} -core_initcall (vexpress_sysreg_init); +module_platform_driver (vexpress_sysreg_driver); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.20.1
PATCH 13/17 bus: vexpress-config: Merge vexpress-syscfg into vexpress-config
In reply to Rob HerringThe only thing that vexpress-syscfg does is provide a regmap to vexpress-config bus child devices. There's little reason to have 2 components for this. The current structure with initcall ordering requirements makes turning these components into modules more difficult.
So let's start to simplify things and merge vexpress-syscfg into vexpress-config. There's no functional change in this commit and it's still separate components until subsequent commits.
--- arch/arm/mach-vexpress/Kconfig | 1 - drivers/bus/vexpress-config.c | 283 +++++++++++++++++++++++++++++++-- drivers/misc/Kconfig | 9 -- drivers/misc/Makefile | 1 - drivers/misc/vexpress-syscfg.c | 280 -------------------------------- include/linux/vexpress.h | 17 -- 6 files changed, 274 insertions(+), 317 deletions(-) delete mode 100644 drivers/misc/vexpress-syscfg.c
arch/arm/mach-vexpress/Kconfig +0 -1
@@ -20,7 +20,6 @@ menuconfig ARCH_VEXPRESS select REGULATOR if MMC_ARMMMCI select REGULATOR_FIXED_VOLTAGE if REGULATOR select VEXPRESS_CONFIG - select VEXPRESS_SYSCFG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,
drivers/bus/vexpress-config.c +274 -9
318 lines not on this page · raw message
drivers/misc/Kconfig +0 -9
@@ -423,15 +423,6 @@ config SRAM config SRAM_EXEC bool -config VEXPRESS_SYSCFG - bool "Versatile Express System Configuration driver" - depends on VEXPRESS_CONFIG - default y - help - ARM Ltd. Versatile Express uses specialised platform configuration - bus. System Configuration interface is one of the possible means - of generating transactions on this bus. - config PCI_ENDPOINT_TEST depends on PCI select CRC32
drivers/misc/Makefile +0 -1
@@ -49,7 +49,6 @@ obj-$(CONFIG_SRAM_EXEC) += sram-exec.o obj-y += mic/ obj-$(CONFIG_GENWQE) += genwqe/ obj-$(CONFIG_ECHO) += echo/ -obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/
drivers/misc/vexpress-syscfg.c deleted +0 -280
280 lines not on this page · raw message
include/linux/vexpress.h +0 -17
@@ -18,23 +18,6 @@/* Config infrastructure */ void vexpress_config_set_master (u32 site); -u32 vexpress_config_get_master (void ); - -void vexpress_config_lock (void *arg); -void vexpress_config_unlock (void *arg); - -int vexpress_config_get_topo (struct device_node *node,u32 *site, -u32 *position,u32 *dcc); - -/* Config bridge API */ - -struct vexpress_config_bridge_ops { -struct regmap * (*regmap_init)(struct device *dev,void *context); -void (*regmap_exit)(struct regmap *regmap,void *context); -}; - -struct device *vexpress_config_bridge_register (struct device *parent, -struct vexpress_config_bridge_ops *ops,void *context);/* Config regmap API */
Signature · 1 line
2.20.1
PATCH 14/17 bus: vexpress-config: simplify config bus probing
In reply to Rob HerringThe vexpress-config initialization is dependent on the vexpress-syscfg driver probing. As vexpress-config was not a driver, deferred probe could not be used and instead initcall ordering was relied upon. This is fragile and doesn't work for modules.
Let's move the config bus init into the vexpress-syscfg probe. This eliminates the initcall ordering requirement and the need to create a struct device and the "vexpress-config" class.
--- drivers/bus/vexpress-config.c | 118 ++++++---------------------------- 1 file changed, 21 insertions(+), 97 deletions(-)
drivers/bus/vexpress-config.c +21 -97
@@ -56,7 +56,6 @@ struct vexpress_config_bridge {static DEFINE_MUTEX (vexpress_config_mutex); -static struct class *vexpress_config_class;static u32 vexpress_config_site_master =VEXPRESS_SITE_MASTER ;
@@ -121,9 +120,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)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 );
@@ -146,94 +142,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev) }EXPORT_SYMBOL_GPL (devm_regmap_init_vexpress_config); -static 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; -int ret; - - 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); -of_node_put (bridge); -if (WARN_ON (!parent)) -return -ENODEV ; - - ret =of_platform_populate (node,NULL ,NULL , parent); - -put_device (parent); - -return ret; -} - -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) { -of_node_put (node); -break ; - } - } - -return err; -} -postcore_initcall (vexpress_config_init); -static int vexpress_syscfg_exec (struct vexpress_syscfg_func *func,int index,bool write,u32 *data) {
@@ -430,7 +338,8 @@ static int vexpress_syscfg_probe(struct platform_device *pdev) {struct vexpress_syscfg *syscfg;struct resource *res; -struct device *bridge; +struct vexpress_config_bridge *bridge; +struct device_node *node; syscfg =devm_kzalloc (&pdev->dev,sizeof (*syscfg),GFP_KERNEL );if (!syscfg)
@@ -443,11 +352,26 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)if (IS_ERR (syscfg->base))return PTR_ERR (syscfg->base); -/* Must use dev.parent (MFD), as that's where DT phandle points at... */ - bridge =vexpress_config_bridge_register (pdev->dev.parent, - &vexpress_syscfg_bridge_ops, syscfg); + bridge =devm_kmalloc (&pdev->dev,sizeof (*bridge),GFP_KERNEL ); +if (!bridge) +return -ENOMEM ; + + bridge->ops = &vexpress_syscfg_bridge_ops; + bridge->context = syscfg; + +dev_set_drvdata (&pdev->dev, bridge); -return PTR_ERR_OR_ZERO (bridge); +for_each_compatible_node (node,NULL ,"arm,vexpress,config-bus" ) { +struct device_node *bridge_np; + + bridge_np =of_parse_phandle (node,"arm,vexpress,config-bridge" ,0 ); +if (bridge_np != pdev->dev.parent->of_node) +continue ; + +of_platform_populate (node,NULL ,NULL , &pdev->dev); + } + +return 0 ; }static const struct platform_device_id vexpress_syscfg_id_table[] = {
Signature · 1 line
2.20.1
PATCH 15/17 vexpress: Move site master init to vexpress-config bus
In reply to Rob HerringThere's only a single caller of vexpress_config_set_master() from vexpress-sysreg.c. Let's just make the registers needed available to vexpress-config and move all the code there. The registers needed aren't used anywhere else either. With this, we can get rid of the private API between these 2 drivers.
--- drivers/bus/vexpress-config.c | 37 +++++++++++++++++++++++++++++++---- drivers/mfd/vexpress-sysreg.c | 25 +---------------------- include/linux/vexpress.h | 9 --------- 3 files changed, 34 insertions(+), 37 deletions(-)
drivers/bus/vexpress-config.c +33 -4
@@ -14,9 +14,17 @@#include <linux/slab.h> #include <linux/vexpress.h> -#define SYS_CFGDATA 0x0 +#define SYS_MISC 0x0 +#define SYS_MISC_MASTERSITE (1 << 14) -#define SYS_CFGCTRL 0x4 +#define SYS_PROCID0 0x24 +#define SYS_PROCID1 0x28 +#define SYS_HBI_MASK 0xfff +#define SYS_PROCIDx_HBI_SHIFT 0 + +#define SYS_CFGDATA 0x40 + +#define SYS_CFGCTRL 0x44#define SYS_CFGCTRL_START (1 << 31)#define SYS_CFGCTRL_WRITE (1 << 30)#define SYS_CFGCTRL_DCC (n) (((n) & 0xf) << 26)
@@ -25,10 +33,14 @@#define SYS_CFGCTRL_POSITION (n) (((n) & 0xf) << 12)#define SYS_CFGCTRL_DEVICE (n) (((n) & 0xfff) << 0) -#define SYS_CFGSTAT 0x8 +#define SYS_CFGSTAT 0x48#define SYS_CFGSTAT_ERR (1 << 1)#define SYS_CFGSTAT_COMPLETE (1 << 0) +#define VEXPRESS_SITE_MB 0 +#define VEXPRESS_SITE_DB1 1 +#define VEXPRESS_SITE_DB2 2 +#define VEXPRESS_SITE_MASTER 0xfstruct vexpress_syscfg {struct device *dev;
@@ -59,7 +71,7 @@ static DEFINE_MUTEX(vexpress_config_mutex);static u32 vexpress_config_site_master =VEXPRESS_SITE_MASTER ; -void vexpress_config_set_master (u32 site) +static void vexpress_config_set_master (u32 site) { vexpress_config_site_master = site; }
@@ -340,6 +352,8 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)struct resource *res;struct vexpress_config_bridge *bridge;struct device_node *node; +int master; +u32 dt_hbi; syscfg =devm_kzalloc (&pdev->dev,sizeof (*syscfg),GFP_KERNEL );if (!syscfg)
@@ -361,6 +375,21 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, bridge); + master =readl (syscfg->base +SYS_MISC ) &SYS_MISC_MASTERSITE ? +VEXPRESS_SITE_DB2 :VEXPRESS_SITE_DB1 ; +vexpress_config_set_master (master); + +/* Confirm board type against DT property, if available */ +if (of_property_read_u32 (of_root,"arm,hbi" , &dt_hbi) ==0 ) { +u32 id =readl (syscfg->base + (master ==VEXPRESS_SITE_DB1 ? +SYS_PROCID0 :SYS_PROCID1 )); +u32 hbi = (id >> SYS_PROCIDx_HBI_SHIFT) &SYS_HBI_MASK ; + +if (WARN_ON (dt_hbi != hbi)) +dev_warn (&pdev->dev,"DT HBI (%x) is not matching hardware (%x)!\n" , + dt_hbi, hbi); + } +for_each_compatible_node (node,NULL ,"arm,vexpress,config-bus" ) {struct device_node *bridge_np;
drivers/mfd/vexpress-sysreg.c +1 -24
@@ -14,7 +14,6 @@#include <linux/platform_device.h> #include <linux/slab.h> #include <linux/stat.h> -#include <linux/vexpress.h> #define SYS_ID 0x000#define SYS_SW 0x004
@@ -37,11 +36,6 @@#define SYS_CFGCTRL 0x0a4#define SYS_CFGSTAT 0x0a8 -#define SYS_HBI_MASK 0xfff -#define SYS_PROCIDx_HBI_SHIFT 0 - -#define SYS_MISC_MASTERSITE (1 << 14) -/* The sysreg block is just a random collection of various functions... */ static struct bgpio_pdata vexpress_sysreg_sys_led_pdata = {
@@ -94,7 +88,7 @@ static struct mfd_cell vexpress_sysreg_cells[] = { .name = "vexpress-syscfg", .num_resources = 1, .resources = (struct resource []) { - DEFINE_RES_MEM(SYS_CFGDATA, 0xc), + DEFINE_RES_MEM(SYS_MISC, 0x4c), }, } };
@@ -104,8 +98,6 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)struct resource *mem;void __iomem *base;struct gpio_chip *mmc_gpio_chip; -int master; -u32 dt_hbi; mem =platform_get_resource (pdev,IORESOURCE_MEM ,0 );if (!mem)
@@ -115,21 +107,6 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)if (!base)return -ENOMEM ; - master =readl (base +SYS_MISC ) &SYS_MISC_MASTERSITE ? -VEXPRESS_SITE_DB2 :VEXPRESS_SITE_DB1 ; -vexpress_config_set_master (master); - -/* Confirm board type against DT property, if available */ -if (of_property_read_u32 (of_root,"arm,hbi" , &dt_hbi) ==0 ) { -u32 id =readl (base + (master ==VEXPRESS_SITE_DB1 ? -SYS_PROCID0 :SYS_PROCID1 )); -u32 hbi = (id >> SYS_PROCIDx_HBI_SHIFT) &SYS_HBI_MASK ; - -if (WARN_ON (dt_hbi != hbi)) -dev_warn (&pdev->dev,"DT HBI (%x) is not matching hardware (%x)!\n" , - dt_hbi, hbi); - } -/* * Duplicated SYS_MCI pseudo-GPIO controller for compatibility with * older trees using sysreg node for MMC control lines.
include/linux/vexpress.h +0 -9
@@ -10,15 +10,6 @@#include <linux/device.h> #include <linux/regmap.h> -#define VEXPRESS_SITE_MB 0 -#define VEXPRESS_SITE_DB1 1 -#define VEXPRESS_SITE_DB2 2 -#define VEXPRESS_SITE_MASTER 0xf - -/* Config infrastructure */ - -void vexpress_config_set_master (u32 site); -/* Config regmap API */ struct regmap *devm_regmap_init_vexpress_config (struct device *dev);
Signature · 1 line
2.20.1
PATCH 16/17 bus: vexpress-config: Support building as module
In reply to Rob HerringEnable building vexpress-config driver as a module.
--- drivers/bus/Kconfig | 2 +- drivers/bus/vexpress-config.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-)
drivers/bus/Kconfig +1 -1
@@ -183,7 +183,7 @@ config UNIPHIER_SYSTEM_BUS needed to use on-board devices connected to UniPhier SoCs. config VEXPRESS_CONFIG - bool "Versatile Express configuration bus" + tristate "Versatile Express configuration bus" default y if ARCH_VEXPRESS depends on ARM || ARM64 depends on OF
drivers/bus/vexpress-config.c +4 -6
@@ -7,6 +7,7 @@#include <linux/err.h> #include <linux/init.h> #include <linux/io.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/of_device.h>
@@ -407,15 +408,12 @@ static const struct platform_device_id vexpress_syscfg_id_table[] = { { "vexpress-syscfg", }, {}, }; +MODULE_DEVICE_TABLE (platform, vexpress_syscfg_id_table);static struct platform_driver vexpress_syscfg_driver = { .driver.name ="vexpress-syscfg" , .id_table = vexpress_syscfg_id_table, .probe = vexpress_syscfg_probe, }; - -static int __init vexpress_syscfg_init (void ) -{ -return platform_driver_register (&vexpress_syscfg_driver); -} -core_initcall (vexpress_syscfg_init); +module_platform_driver (vexpress_syscfg_driver); +MODULE_LICENSE ("GPL v2" );
Signature · 1 line
2.20.1
PATCH 17/17 ARM: vexpress: Don't select VEXPRESS_CONFIG
In reply to Rob HerringCONFIG_VEXPRESS_CONFIG has 'default y if ARCH_VEXPRESS', so selecting is unnecessary. Selecting it also prevents setting CONFIG_VEXPRESS_CONFIG to a module.
--- arch/arm/mach-vexpress/Kconfig | 1 - 1 file changed, 1 deletion(-)
arch/arm/mach-vexpress/Kconfig +0 -1
@@ -19,7 +19,6 @@ menuconfig ARCH_VEXPRESS select POWER_SUPPLY select REGULATOR if MMC_ARMMMCI select REGULATOR_FIXED_VOLTAGE if REGULATOR - select VEXPRESS_CONFIG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,
Signature · 1 line
2.20.1
Re: [PATCH 05/17] clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
In reply to Rob HerringQuoted 7 lines · Rob Herring
CONFIG_COMMON_CLK_VERSATILEdoesn't really do anything other than hiding Arm Ltd reference platform clock drivers. It is both selected by the platforms that need it and has a 'depends on' for those platforms. It selectsREGMAP_MMIO, but reallyCONFIG_ICSTshould do that. Also,CONFIG_ICSTcan't be enabled forCOMPILE_TESTunless something else selected it.
Quoted 9 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>
Good catch!
Since this conflicts a bit with other Kconfig patches I have pending for mach:s in arch/arm it'd be great if I can get an ACK from the clk maintainers and merge it with the rest in a pull request to the SoC tree.
Yours,
Linus Walleij
Re: [PATCH 13/17] bus: vexpress-config: Merge vexpress-syscfg into vexpress-config
In reply to Rob HerringQuoted 16 lines · Rob Herring
The only thing that vexpress-syscfg does is provide a regmap to vexpress-config bus child devices. There's little reason to have 2 components for this. The current structure with initcall ordering requirements makes turning these components into modules more difficult.
So let's start to simplify things and merge vexpress-syscfg into vexpress-config. There's no functional change in this commit and it's still separate components until subsequent commits.
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Arnd Bergmann <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 9 lines
--- arch/arm/mach-vexpress/Kconfig | 1 - drivers/bus/vexpress-config.c | 283 +++++++++++++++++++++++++++++++-- drivers/misc/Kconfig | 9 -- drivers/misc/Makefile | 1 - drivers/misc/vexpress-syscfg.c | 280 -------------------------------- include/linux/vexpress.h | 17 -- 6 files changed, 274 insertions(+), 317 deletions(-) delete mode 100644 drivers/misc/vexpress-syscfg.c
Re: [PATCH 01/17] ARM: vexpress: Move vexpress_flags_set() into arch code
In reply to Rob HerringQuoted 8 lines · Rob Herring
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 movevexpress_flags_set()closer to where it is being used. This will allow for vexpress-sysreg to be built as a module.
Quoted 6 lines
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>
Re: [PATCH 02/17] arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS
In reply to Rob HerringQuoted 5 lines · Rob Herring
The VExpress power-off/reset driver is not needed on 64-bit platforms as PSCI power-off and reset can be used instead. Stop selecting it so it can be disabled and not always built-in.
Quoted 7 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Rob Herring <[email protected]>
Arnd Bergmann
maintainerRe: [PATCH 03/17] arm64: vexpress: Don't select CONFIG_VEXPRESS_CONFIG
In reply to Rob HerringQuoted 20 lines · Rob Herring
CONFIG_VEXPRESS_CONFIGhas 'default y ifARCH_VEXPRESS', so selecting is unnecessary. It also prevents settingCONFIG_VEXPRESS_CONFIGto a module.Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Rob Herring <[email protected]>--- arch/arm64/Kconfig.platforms | 1 - 1 file changed, 1 deletion(-)arch/arm64/Kconfig.platforms +0
-0
arch/arm64/Kconfig.platforms config ARCH_VEXPRESS · line 283
Quoted 7 lines
arch/arm64/Kconfig.platforms +0
-1@@ -278,7 +278,6 @@ config ARCH_VEXPRESS select GPIOLIB select PM select PM_GENERIC_DOMAINS - select VEXPRESS_CONFIG help This enables support for the ARMv8 software model (Versatile Express).
Nothing wrong with this change, but I'd fold it into the previous patch, as this 'select' was clearly meant to avoid a build failure on the previous one.
Arnd
Arnd Bergmann
maintainerRe: [PATCH 04/17] power/reset: vexpress: Support building as a module
In reply to Rob HerringQuoted 2 lines · Rob Herring
Enable building the VExpress power-off/reset driver as a module.
Your change allows loading and unloading the driver, but actually unloading is a bug with the current implementation, as there is no 'release' handler to undo the _vexpress_register_restart_handler() function.
It should not be hard to add a release handler, or you could just mark the function as non-unloadable by only having a module_init() but no module_exit() function.
I suppose if you do the latter, there should also be a suppress_bind_attrs flag in the device_driver. This is a preexisting bug.
Arnd
Re: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Rob HerringQuoted 4 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Quoted 9 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>
drivers/clk/versatile/Kconfig config ICST · line 12
Quoted 5 lines
config
CLK_SP810
bool "Clock driver for ARM SP810 System Controller"drivers/clk/versatile/Kconfig +1
-1- default y if ARCH_VEXPRESS + default y if (ARCH_VEXPRESS && ARM)
But maybe add "|| (COMPILE_TEST && OF)" for extra points.
Arnd
Re: [PATCH 07/17] clk: vexpress-osc: Use the devres clock API variants
In reply to Rob HerringQuoted 5 lines · Rob Herring
In preparation to enable the vexpress-osc clock driver as a module, convert the driver to use the managed devres clock API variants. With this, a driver .remove() hook is not needed.
Quoted 7 lines
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>
Arnd Bergmann
maintainerRe: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Rob Herringdrivers/clk/versatile/Kconfig config CLK_SP810 · line 19
Quoted 9 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
config
CLK_VEXPRESS_OSCdrivers/clk/versatile/Kconfig +2
-2- bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG
Why do you remove the "|| COMPILE_TEST" here?
Arnd
Re: [PATCH 09/17] mfd: vexpress-sysreg: Drop selecting CONFIG_CLKSRC_MMIO
In reply to Rob HerringQuoted 9 lines · Rob Herring
Nothing in the VExpress sysregs nor the MFD child drivers use
CONFIG_CLKSRC_MMIO. There's the 24MHz counter, but that's handled bydrivers/clocksource/timer-versatile.cwhich doesn't useCONFIG_CLKSRC_MMIOeither. So let's just dropCONFIG_CLKSRC_MMIO.As the !ARCH_USES_GETTIMEOFFSET dependency was added for
CONFIG_CLKSRC_MMIO, that can be dropped, too.
Quoted 6 lines
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>
Arnd Bergmann
maintainerRe: [PATCH 10/17] mfd: vexpress-sysreg: Drop unused syscon child devices
In reply to Rob HerringQuoted 7 lines · Rob Herring
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>
No description? It would be nice to know why it was added in the first place, or at least that you were unsuccessful in finding out why.
Arnd
Re: [PATCH 11/17] mfd: vexpress-sysreg: Use devres API variants
In reply to Rob HerringQuoted 11 lines · Rob Herring
Use the managed
devm_gpiochip_add_data()anddevm_mfd_add_devices()instead of their unmanaged counterparts. With this, no .remove() hook is needed for driver unbind.Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>
Arnd Bergmann
maintainerRe: [PATCH 12/17] mfd: vexpress-sysreg: Support building as a module
In reply to Rob Herringdrivers/mfd/vexpress-sysreg.c static struct platform_driver vexpress_sysreg_driver = { · line 169
Quoted 7 lines · Rob Herring
Enable building the vexpress-sysreg driver as a module.
drivers/mfd/vexpress-sysreg.c +0
-4- -/* Need the sysreg early, before any other device... */ -for_each_matching_node (node, vexpress_sysreg_match) -of_platform_device_create (node,NULL ,NULL );
Is this safe to remove? If yes, please mention it in the changelog.
Arnd
Re: [PATCH 12/17] mfd: vexpress-sysreg: Support building as a module
Quoted 11 lines · Arnd Bergmann
drivers/mfd/vexpress-sysreg.c static struct platform_driver vexpress_sysreg_driver = { · line 169
Quoted 7 lines · Rob Herring
Enable building the vexpress-sysreg driver as a module.
drivers/mfd/vexpress-sysreg.c +0
-4- -/* Need the sysreg early, before any other device... */ -for_each_matching_node (node, vexpress_sysreg_match) -of_platform_device_create (node,NULL ,NULL );Is this safe to remove? If yes, please mention it in the changelog.
Well, yes and no (I think). This was purely to instantiate the device early before the default DT probing would do it (as all the parents are 'simple-bus' the default would descend to these nodes). It's fine after patch 14 for sure, but before that I think it is changing the initcall/probe order. So I'll stick this between patch 15 and 16.
Rob
Re: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Arnd BergmannQuoted 6 lines · Arnd Bergmann
Quoted 4 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Quoted 7 lines
drivers/clk/versatile/Kconfig config CLK_SP810 · line 19
Quoted 5 lines
config
CLK_VEXPRESS_OSCdrivers/clk/versatile/Kconfig +2
-2- bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIGWhy do you remove the "||
COMPILE_TEST" here?
Looks like a rebasing error. I only added it in patch 5.
It has to depend on VEXPRESS_CONFIG because devm_regmap_init_vexpress_config doesn't have an empty function.
Rob
Re: [PATCH 04/17] power/reset: vexpress: Support building as a module
In reply to Arnd BergmannQuoted 9 lines · Arnd Bergmann
Quoted 2 lines · Rob Herring
Enable building the VExpress power-off/reset driver as a module.
Your change allows loading and unloading the driver, but actually unloading is a bug with the current implementation, as there is no 'release' handler to undo the
_vexpress_register_restart_handler()function.
And also to save and restore pm_power_off...
Quoted 6 lines
It should not be hard to add a release handler, or you could just mark the function as non-unloadable by only having a
module_init()but nomodule_exit()function.I suppose if you do the latter, there should also be a
suppress_bind_attrsflag in thedevice_driver. This is a preexisting bug.
I may just drop this patch. I wrote it and then realized I don't need it as PSCI can be used instead.
Rob
Re: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Arnd BergmannQuoted 19 lines · Arnd Bergmann
Quoted 4 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Quoted 9 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>Acked-by Arnd Bergmann <[email protected]>Quoted 1 line
Quoted 6 lines
drivers/clk/versatile/Kconfig config ICST · line 12
Quoted 4 lines
config
CLK_SP810
bool "Clock driver for ARM SP810 System Controller"drivers/clk/versatile/Kconfig +1
-1- default y if ARCH_VEXPRESS + default y if (ARCH_VEXPRESS && ARM)But maybe add "|| (
COMPILE_TEST&& OF)" for extra points.
On a 'default y'? Not necessary.
Rob
Arnd Bergmann
maintainerRe: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
Quoted 21 lines · Rob Herring
Quoted 19 lines · Arnd Bergmann
Quoted 4 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Quoted 9 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>Acked-by Arnd Bergmann <[email protected]>Quoted 1 line
Quoted 8 lines
Quoted 6 lines
drivers/clk/versatile/Kconfig config ICST · line 12
Quoted 4 lines
config
CLK_SP810
bool "Clock driver for ARM SP810 System Controller"drivers/clk/versatile/Kconfig +1
-1- default y if ARCH_VEXPRESS + default y if (ARCH_VEXPRESS && ARM)But maybe add "|| (
COMPILE_TEST&& OF)" for extra points.On a 'default y'? Not necessary.
Ah right, that would indeed result in negative points.
Arnd
Stephen Boyd
maintainerRe: [PATCH 05/17] clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
In reply to Rob HerringQuoting Rob Herring (2020-04-19 10:07:58)
Quoted 15 lines
drivers/clk/versatile/Kconfig +1
-7@@ -1,22 +1,14 @@ # SPDX-License-Identifier: GPL-2.0-only config ICST - bool - -config COMMON_CLK_VERSATILE - bool "Clock driver for ARM Reference designs" - depends on ARCH_INTEGRATOR || ARCH_REALVIEW || \ - ARCH_VERSATILE || ARCH_VEXPRESS || ARM64 || \ - COMPILE_TEST + bool "Clock driver for ARM Reference designs ICST" if COMPILE_TEST
drivers/clk/versatile/Kconfig line 19
Quoted 10 lines
drivers/clk/versatile/Kconfig +0
-2select REGMAP_MMIO ---help--- Supports clocking on ARM Reference designs: - Integrator/AP and Integrator/CP - RealView PB1176, EB, PB11MP and PBX - - Versatile Express config CLK_SP810 bool "Clock driver for ARM SP810 System Controller" - depends on COMMON_CLK_VERSATILE
Shouldn't this get the depends from COMMON_CLK_VERSATILE so that this option isn't exposed unless someone is compile testing or using that platform?
Quoted 13 lines
drivers/clk/versatile/Kconfig +1
-2default y if ARCH_VEXPRESS ---help--- Supports clock muxing (REFCLK/TIMCLK to TIMERCLKEN0-3) capabilities@@ -24,8 +16,7 @@ config CLK_SP810 config CLK_VEXPRESS_OSC bool "Clock driver for Versatile Express OSC clock generators" - depends on COMMON_CLK_VERSATILE - depends on VEXPRESS_CONFIG + depends on VEXPRESS_CONFIG || COMPILE_TEST default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatile
Re: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Rob HerringQuoting Rob Herring (2020-04-19 10:07:59)
Quoted 12 lines
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>
Quoted 1 line
---
Stephen Boyd
maintainerRe: [PATCH 15/17] vexpress: Move site master init to vexpress-config bus
In reply to Rob HerringIs the subject supposed to say 'set master' vs. 'site master'?
Quoting Rob Herring (2020-04-19 10:08:08)
Quoted 13 lines
There's only a single caller of
vexpress_config_set_master()fromvexpress-sysreg.c. Let's just make the registers needed available to vexpress-config and move all the code there. The registers needed aren't used anywhere else either. With this, we can get rid of the private API between these 2 drivers.Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>
Re: [PATCH 07/17] clk: vexpress-osc: Use the devres clock API variants
In reply to Rob HerringQuoting Rob Herring (2020-04-19 10:08:00)
Quoted 4 lines
In preparation to enable the vexpress-osc clock driver as a module, convert the driver to use the managed devres clock API variants. With this, a driver .remove() hook is not needed.
Quoted 8 lines
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>---
Re: [PATCH 02/17] arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS
In reply to Rob HerringQuoted 7 lines · Rob Herring
The VExpress power-off/reset driver is not needed on 64-bit platforms as PSCI power-off and reset can be used instead. Stop selecting it so it can be disabled and not always built-in.
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>
Quoted 23 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Rob Herring <[email protected]>--- arch/arm64/Kconfig.platforms | 1 - 1 file changed, 1 deletion(-)arch/arm64/Kconfig.platforms +0
-1@@ -278,7 +278,6 @@ config ARCH_VEXPRESS select GPIOLIB select PM select PM_GENERIC_DOMAINS - select POWER_RESET_VEXPRESS select VEXPRESS_CONFIG help This enables support for the ARMv8 software model (VersatileSignature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 01/17] ARM: vexpress: Move vexpress_flags_set() into arch code
In reply to Rob HerringQuoted 8 lines · Rob Herring
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 movevexpress_flags_set()closer to where it is being used. This will allow for vexpress-sysreg to be built as a module.Cc Liviu Dudau <[email protected]>
Unfortunately I did not had the forethought to leave my Versatile Express board plugged in before our office lockdown, so I will not have a chance to test the series.
Best regards,
Liviu
Quoted 136 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>--- arch/arm/mach-vexpress/Kconfig | 1 - arch/arm/mach-vexpress/core.h | 1 + arch/arm/mach-vexpress/dcscb.c | 1 + arch/arm/mach-vexpress/v2m.c | 23 +++++++++++++++++++++++ drivers/mfd/vexpress-sysreg.c | 19 ------------------- include/linux/vexpress.h | 4 ---- 6 files changed, 25 insertions(+), 24 deletions(-)arch/arm/mach-vexpress/Kconfig +0
-1@@ -22,7 +22,6 @@ menuconfig ARCH_VEXPRESS select REGULATOR_FIXED_VOLTAGE if REGULATOR select VEXPRESS_CONFIG select VEXPRESS_SYSCFG - select MFD_VEXPRESS_SYSREG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,arch/arm/mach-vexpress/core.h +1
-0@@ -1,3 +1,4 @@bool vexpress_smp_init_ops (void ); +void vexpress_flags_set (u32 data);extern const struct smp_operations vexpress_smp_dt_ops;arch/arm/mach-vexpress/dcscb.c +1
-0@@ -20,6 +20,7 @@#include <asm/cputype.h> #include <asm/cp15.h> +#include "core.h" #define RST_HOLD0 0x0#define RST_HOLD1 0x4arch/arm/mach-vexpress/v2m.c +23
-0@@ -1,8 +1,31 @@// SPDX-License-Identifier: GPL-2.0 +#include <linux/of.h> +#include <linux/of_address.h> #include <asm/mach/arch.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 = {"arm,vexpress" ,NULL ,drivers/mfd/vexpress-sysreg.c +0
-19@@ -8,7 +8,6 @@#include <linux/err.h> #include <linux/io.h> #include <linux/mfd/core.h> -#include <linux/of_address.h> #include <linux/of_platform.h> #include <linux/platform_data/syscon.h> #include <linux/platform_device.h> @@ -42,24 +41,6 @@#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... */ static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = {include/linux/vexpress.h +0
-4@@ -40,8 +40,4 @@ struct device *vexpress_config_bridge_register(struct device *parent,struct regmap *devm_regmap_init_vexpress_config (struct device *dev); -/* Platform control */ - -void vexpress_flags_set (u32 data); -#endif Signature · 1 line
2.20.1
Signature · 13 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernelRe: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Rob HerringQuoted 6 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>
Quoted 26 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)drivers/clk/versatile/Kconfig +1
-1@@ -9,7 +9,7 @@ config ICST config CLK_SP810 bool "Clock driver for ARM SP810 System Controller" - default y if ARCH_VEXPRESS + default y if (ARCH_VEXPRESS && ARM) ---help--- Supports clock muxing (REFCLK/TIMCLK to TIMERCLKEN0-3) capabilities of the ARM SP810 System Controller cell.Signature · 1 line
2.20.1
Signature · 13 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernelRe: [PATCH 07/17] clk: vexpress-osc: Use the devres clock API variants
In reply to Rob HerringQuoted 5 lines · Rob Herring
In preparation to enable the vexpress-osc clock driver as a module, convert the driver to use the managed devres clock API variants. With this, a driver .remove() hook is not needed.
Cc Liviu Dudau <[email protected]>
Quoted 43 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/clk-vexpress-osc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)drivers/clk/versatile/clk-vexpress-osc.c +5
-5@@ -65,8 +65,8 @@ static int vexpress_osc_probe(struct platform_device *pdev) {struct clk_init_data init;struct vexpress_osc *osc; -struct clk *clk;u32 range[2 ]; +int ret; osc =devm_kzalloc (&pdev->dev,sizeof (*osc),GFP_KERNEL );if (!osc)@@ -92,11 +92,11 @@ static int vexpress_osc_probe(struct platform_device *pdev) osc->hw.init = &init; - clk =clk_register (NULL , &osc->hw); -if (IS_ERR (clk)) -return PTR_ERR (clk); + ret =devm_clk_hw_register (&pdev->dev, &osc->hw); +if (ret <0 ) +return ret; -of_clk_add_provider (pdev->dev.of_node, of_clk_src_simple_get, clk); +devm_of_clk_add_hw_provider (&pdev->dev, of_clk_hw_simple_get, &osc->hw);clk_hw_set_rate_range (&osc->hw, osc->rate_min, osc->rate_max);dev_dbg (&pdev->dev,"Registered clock '%s'\n" , init.name);Signature · 1 line
2.20.1
Signature · 13 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernelLiviu Dudau
maintainerRe: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Rob HerringQuoted 20 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Cc Linus Walleij <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Michael Turquette <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)drivers/clk/versatile/Kconfig +0
-0
drivers/clk/versatile/Kconfig config CLK_SP810 · line 19
Quoted 7 lines
drivers/clk/versatile/Kconfig +2
-2@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG
Looks good to me with the exception of COMPILE_TEST appearing in patch 5 and disappearing here. Which one should be the one to survive?
Best regards,
Liviu
Quoted 38 lines
drivers/clk/versatile/Kconfig +0
-0default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatiledrivers/clk/versatile/clk-vexpress-osc.c +4
-6@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init); +module_platform_driver (vexpress_osc_driver); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.20.1
Signature · 13 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernelRe: [PATCH 09/17] mfd: vexpress-sysreg: Drop selecting CONFIG_CLKSRC_MMIO
In reply to Rob HerringQuoted 9 lines · Rob Herring
Nothing in the VExpress sysregs nor the MFD child drivers use
CONFIG_CLKSRC_MMIO. There's the 24MHz counter, but that's handled bydrivers/clocksource/timer-versatile.cwhich doesn't useCONFIG_CLKSRC_MMIOeither. So let's just dropCONFIG_CLKSRC_MMIO.As the !ARCH_USES_GETTIMEOFFSET dependency was added for
CONFIG_CLKSRC_MMIO, that can be dropped, too.Cc Liviu Dudau <[email protected]>
Quoted 27 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/mfd/Kconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)drivers/mfd/Kconfig +1
-2@@ -2029,9 +2029,8 @@ endmenu config MFD_VEXPRESS_SYSREG bool "Versatile Express System Registers" - depends on VEXPRESS_CONFIG && GPIOLIB && !ARCH_USES_GETTIMEOFFSET + depends on VEXPRESS_CONFIG && GPIOLIB default y - select CLKSRC_MMIO select GPIO_GENERIC_PLATFORM select MFD_CORE select MFD_SYSCONSignature · 1 line
2.20.1
Signature · 13 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯
_______________________________________________
linux-arm-kernel mailing list
[email protected]
http://lists.infradead.org/mailman/listinfo/linux-arm-kernelRe: [PATCH 10/17] mfd: vexpress-sysreg: Drop unused syscon child devices
In reply to Rob HerringHi Rob,
Missing commit message?
Quoted 60 lines · Rob Herring
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/mfd/vexpress-sysreg.c | 36 ----------------------------------- 1 file changed, 36 deletions(-)drivers/mfd/vexpress-sysreg.c +0
-26@@ -43,10 +43,6 @@/* The sysreg block is just a random collection of various functions... */ -static struct syscon_platform_data vexpress_sysreg_sys_id_pdata = { - .label ="sys_id" , -}; -static struct bgpio_pdata vexpress_sysreg_sys_led_pdata = { .label ="sys_led" , .base =-1 ,@@ -65,24 +61,8 @@ static struct bgpio_pdata vexpress_sysreg_sys_flash_pdata = { .ngpio = 1, }; -static struct syscon_platform_data vexpress_sysreg_sys_misc_pdata = { - .label ="sys_misc" , -}; - -static struct syscon_platform_data vexpress_sysreg_sys_procid_pdata = { - .label ="sys_procid" , -}; -static struct mfd_cell vexpress_sysreg_cells[] = { { - .name ="syscon" , - .num_resources =1 , - .resources = (struct resource []) { -DEFINE_RES_MEM (SYS_ID ,0x4 ), - }, - .platform_data = &vexpress_sysreg_sys_id_pdata, - .pdata_size =sizeof (vexpress_sysreg_sys_id_pdata), - }, { .name ="basic-mmio-gpio" , .of_compatible ="arm,vexpress-sysreg,sys_led" , .num_resources =1 ,@@ -109,22 +89,6 @@ static struct mfd_cell vexpress_sysreg_cells[] = { }, .platform_data = &vexpress_sysreg_sys_flash_pdata, .pdata_size = sizeof(vexpress_sysreg_sys_flash_pdata), - }, { - .name = "syscon", - .num_resources = 1, - .resources = (struct resource []) { - DEFINE_RES_MEM(SYS_MISC, 0x4), - },
drivers/mfd/vexpress-sysreg.c static struct mfd_cell vexpress_sysreg_cells[] = { · line 127
Quoted 10 lines
drivers/mfd/vexpress-sysreg.c +0
-10- .platform_data = &vexpress_sysreg_sys_misc_pdata, - .pdata_size = sizeof(vexpress_sysreg_sys_misc_pdata), - }, { - .name = "syscon", - .num_resources = 1, - .resources = (struct resource []) { -DEFINE_RES_MEM (SYS_PROCID0 ,0x8 ), - }, - .platform_data = &vexpress_sysreg_sys_procid_pdata, - .pdata_size = sizeof(vexpress_sysreg_sys_procid_pdata),
These were used for communication with the daughterboards. AFAIK there is no upstream support for that in the kernel and even inside Arm I am almost sure there are no users left.
With the commit message added:
Best regards,
Liviu
Quoted 6 lines
drivers/mfd/vexpress-sysreg.c +0
-0}, { .name = "vexpress-syscfg", .num_resources = 1,Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 11/17] mfd: vexpress-sysreg: Use devres API variants
In reply to Rob HerringQuoted 5 lines · Rob Herring
Use the managed
devm_gpiochip_add_data()anddevm_mfd_add_devices()instead of their unmanaged counterparts. With this, no .remove() hook is needed for driver unbind.Cc Liviu Dudau <[email protected]>
Quoted 28 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/mfd/vexpress-sysreg.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)drivers/mfd/vexpress-sysreg.c +2
-2@@ -140,9 +140,9 @@ static int vexpress_sysreg_probe(struct platform_device *pdev)bgpio_init (mmc_gpio_chip, &pdev->dev,0x4 , base +SYS_MCI ,NULL ,NULL ,NULL ,NULL ,0 ); mmc_gpio_chip->ngpio =2 ; -gpiochip_add_data (mmc_gpio_chip,NULL ); +devm_gpiochip_add_data (&pdev->dev, mmc_gpio_chip,NULL ); -return mfd_add_devices (&pdev->dev,PLATFORM_DEVID_AUTO , +return devm_mfd_add_devices (&pdev->dev,PLATFORM_DEVID_AUTO , vexpress_sysreg_cells,ARRAY_SIZE (vexpress_sysreg_cells), mem,0 ,NULL ); }Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 13/17] bus: vexpress-config: Merge vexpress-syscfg into vexpress-config
In reply to Rob HerringQuoted 10 lines · Rob Herring
The only thing that vexpress-syscfg does is provide a regmap to vexpress-config bus child devices. There's little reason to have 2 components for this. The current structure with initcall ordering requirements makes turning these components into modules more difficult.
So let's start to simplify things and merge vexpress-syscfg into vexpress-config. There's no functional change in this commit and it's still separate components until subsequent commits.
Cc Liviu Dudau <[email protected]>
Quoted 704 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Arnd Bergmann <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>--- arch/arm/mach-vexpress/Kconfig | 1 - drivers/bus/vexpress-config.c | 283 +++++++++++++++++++++++++++++++-- drivers/misc/Kconfig | 9 -- drivers/misc/Makefile | 1 - drivers/misc/vexpress-syscfg.c | 280 -------------------------------- include/linux/vexpress.h | 17 -- 6 files changed, 274 insertions(+), 317 deletions(-) delete mode 100644 drivers/misc/vexpress-syscfg.carch/arm/mach-vexpress/Kconfig +0
-1@@ -20,7 +20,6 @@ menuconfig ARCH_VEXPRESS select REGULATOR if MMC_ARMMMCI select REGULATOR_FIXED_VOLTAGE if REGULATOR select VEXPRESS_CONFIG - select VEXPRESS_SYSCFG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,drivers/bus/vexpress-config.c +274
-9@@ -6,10 +6,48 @@#include <linux/err.h> #include <linux/init.h> +#include <linux/io.h> #include <linux/of.h> +#include <linux/platform_device.h> #include <linux/of_device.h> +#include <linux/sched/signal.h> +#include <linux/slab.h> #include <linux/vexpress.h> +#define SYS_CFGDATA 0x0 + +#define SYS_CFGCTRL 0x4 +#define SYS_CFGCTRL_START (1 << 31) +#define SYS_CFGCTRL_WRITE (1 << 30) +#define SYS_CFGCTRL_DCC (n) (((n) & 0xf) << 26) +#define SYS_CFGCTRL_FUNC (n) (((n) & 0x3f) << 20) +#define SYS_CFGCTRL_SITE (n) (((n) & 0x3) << 16) +#define SYS_CFGCTRL_POSITION (n) (((n) & 0xf) << 12) +#define SYS_CFGCTRL_DEVICE (n) (((n) & 0xfff) << 0) + +#define SYS_CFGSTAT 0x8 +#define SYS_CFGSTAT_ERR (1 << 1) +#define SYS_CFGSTAT_COMPLETE (1 << 0) + + +struct vexpress_syscfg { +struct device *dev; +void __iomem *base; +struct list_head funcs; +}; + +struct vexpress_syscfg_func { +struct list_head list; +struct vexpress_syscfg *syscfg; +struct regmap *regmap; +int num_templates; +u32 template[];/* Keep it last! */ +}; + +struct vexpress_config_bridge_ops { +struct regmap * (*regmap_init)(struct device *dev,void *context); +void (*regmap_exit)(struct regmap *regmap,void *context); +};struct vexpress_config_bridge {struct vexpress_config_bridge_ops *ops;@@ -27,17 +65,12 @@ 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) +static void vexpress_config_lock (void *arg) {mutex_lock (&vexpress_config_mutex); } -void vexpress_config_unlock (void *arg) +static void vexpress_config_unlock (void *arg) {mutex_unlock (&vexpress_config_mutex); }@@ -59,7 +92,7 @@ static void vexpress_config_find_prop(struct device_node *node, } } -int vexpress_config_get_topo (struct device_node *node,u32 *site, +static int vexpress_config_get_topo (struct device_node *node,u32 *site,u32 *position,u32 *dcc) {vexpress_config_find_prop (node,"arm,vexpress,site" , site);@@ -113,7 +146,7 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev) }EXPORT_SYMBOL_GPL (devm_regmap_init_vexpress_config); -struct device *vexpress_config_bridge_register (struct device *parent, +static struct device *vexpress_config_bridge_register (struct device *parent,struct vexpress_config_bridge_ops *ops,void *context) {struct device *dev;@@ -201,3 +234,235 @@ static int __init vexpress_config_init(void) }postcore_initcall (vexpress_config_init); +static int vexpress_syscfg_exec (struct vexpress_syscfg_func *func, +int index,bool write,u32 *data) +{ +struct vexpress_syscfg *syscfg = func->syscfg; +u32 command, status; +int tries; +long timeout; + +if (WARN_ON (index >= func->num_templates)) +return -EINVAL ; + + command =readl (syscfg->base +SYS_CFGCTRL ); +if (WARN_ON (command &SYS_CFGCTRL_START )) +return -EBUSY ; + + command = func->template[index]; + command |=SYS_CFGCTRL_START ; + command |= write ?SYS_CFGCTRL_WRITE :0 ; + +/* Use a canary for reads */ +if (!write) + *data =0xdeadbeef ; + +dev_dbg (syscfg->dev,"func %p, command %x, data %x\n" , + func, command, *data); +writel (*data, syscfg->base +SYS_CFGDATA ); +writel (0 , syscfg->base +SYS_CFGSTAT ); +writel (command, syscfg->base +SYS_CFGCTRL ); +mb (); + +/* The operation can take ages... Go to sleep, 100us initially */ + tries =100 ; + timeout =100 ; +do { +if (!irqs_disabled ()) { +set_current_state (TASK_INTERRUPTIBLE ); +schedule_timeout (usecs_to_jiffies (timeout)); +if (signal_pending (current)) +return -EINTR ; + }else { +udelay (timeout); + } + + status =readl (syscfg->base +SYS_CFGSTAT ); +if (status &SYS_CFGSTAT_ERR ) +return -EFAULT ; + +if (timeout >20 ) + timeout -=20 ; + }while (--tries && !(status &SYS_CFGSTAT_COMPLETE )); +if (WARN_ON_ONCE (!tries)) +return -ETIMEDOUT ; + +if (!write) { + *data =readl (syscfg->base +SYS_CFGDATA ); +dev_dbg (syscfg->dev,"func %p, read data %x\n" , func, *data); + } + +return 0 ; +} + +static int vexpress_syscfg_read (void *context,unsigned int index, +unsigned int *val) +{ +struct vexpress_syscfg_func *func = context; + +return vexpress_syscfg_exec (func, index, false, val); +} + +static int vexpress_syscfg_write (void *context,unsigned int index, +unsigned int val) +{ +struct vexpress_syscfg_func *func = context; + +return vexpress_syscfg_exec (func, index, true, &val); +} + +static struct regmap_config vexpress_syscfg_regmap_config = { + .lock = vexpress_config_lock, + .unlock = vexpress_config_unlock, + .reg_bits =32 , + .val_bits =32 , + .reg_read = vexpress_syscfg_read, + .reg_write = vexpress_syscfg_write, + .reg_format_endian =REGMAP_ENDIAN_LITTLE , + .val_format_endian =REGMAP_ENDIAN_LITTLE , +}; + + +static struct regmap *vexpress_syscfg_regmap_init (struct device *dev, +void *context) +{ +int err; +struct vexpress_syscfg *syscfg = context; +struct vexpress_syscfg_func *func; +struct property *prop; +const __be32 *val =NULL ; +__be32 energy_quirk[4 ]; +int num; +u32 site, position, dcc; +int i; + + err =vexpress_config_get_topo (dev->of_node, &site, + &position, &dcc); +if (err) +return ERR_PTR (err); + + prop =of_find_property (dev->of_node, +"arm,vexpress-sysreg,func" ,NULL ); +if (!prop) +return ERR_PTR (-EINVAL ); + + num = prop->length /sizeof (u32) /2 ; + val = prop->value; + +/* +* "arm,vexpress-energy" function used to be described +* by its first device only, now it requires both +*/ +if (num ==1 &&of_device_is_compatible (dev->of_node, +"arm,vexpress-energy" )) { + num =2 ; + energy_quirk[0 ] = *val; + energy_quirk[2 ] = *val++; + energy_quirk[1 ] = *val; + energy_quirk[3 ] =cpu_to_be32 (be32_to_cpup (val) +1 ); + val = energy_quirk; + } + + func =kzalloc (struct_size (func, template, num),GFP_KERNEL ); +if (!func) +return ERR_PTR (-ENOMEM ); + + func->syscfg = syscfg; + func->num_templates = num; + +for (i =0 ; i < num; i++) { +u32 function, device; + + function =be32_to_cpup (val++); + device =be32_to_cpup (val++); + +dev_dbg (dev,"func %p: %u/%u/%u/%u/%u\n" , + func, site, position, dcc, + function, device); + + func->template[i] =SYS_CFGCTRL_DCC (dcc); + func->template[i] |=SYS_CFGCTRL_SITE (site); + func->template[i] |=SYS_CFGCTRL_POSITION (position); + func->template[i] |=SYS_CFGCTRL_FUNC (function); + func->template[i] |=SYS_CFGCTRL_DEVICE (device); + } + + vexpress_syscfg_regmap_config.max_register = num -1 ; + + func->regmap =regmap_init (dev,NULL , func, + &vexpress_syscfg_regmap_config); + +if (IS_ERR (func->regmap)) { +void *err = func->regmap; + +kfree (func); +return err; + } + +list_add (&func->list, &syscfg->funcs); + +return func->regmap; +} + +static void vexpress_syscfg_regmap_exit (struct regmap *regmap,void *context) +{ +struct vexpress_syscfg *syscfg = context; +struct vexpress_syscfg_func *func, *tmp; + +regmap_exit (regmap); + +list_for_each_entry_safe (func, tmp, &syscfg->funcs, list) { +if (func->regmap == regmap) { +list_del (&syscfg->funcs); +kfree (func); +break ; + } + } +} + +static struct vexpress_config_bridge_ops vexpress_syscfg_bridge_ops = { + .regmap_init = vexpress_syscfg_regmap_init, + .regmap_exit = vexpress_syscfg_regmap_exit, +}; + + +static int vexpress_syscfg_probe (struct platform_device *pdev) +{ +struct vexpress_syscfg *syscfg; +struct resource *res; +struct device *bridge; + + syscfg =devm_kzalloc (&pdev->dev,sizeof (*syscfg),GFP_KERNEL ); +if (!syscfg) +return -ENOMEM ; + syscfg->dev = &pdev->dev; +INIT_LIST_HEAD (&syscfg->funcs); + + res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); + syscfg->base =devm_ioremap_resource (&pdev->dev, res); +if (IS_ERR (syscfg->base)) +return PTR_ERR (syscfg->base); + +/* Must use dev.parent (MFD), as that's where DT phandle points at... */ + bridge =vexpress_config_bridge_register (pdev->dev.parent, + &vexpress_syscfg_bridge_ops, syscfg); + +return PTR_ERR_OR_ZERO (bridge); +} + +static const struct platform_device_id vexpress_syscfg_id_table[] = { + {"vexpress-syscfg" , }, + {}, +}; + +static struct platform_driver vexpress_syscfg_driver = { + .driver.name ="vexpress-syscfg" , + .id_table = vexpress_syscfg_id_table, + .probe = vexpress_syscfg_probe, +}; + +static int __init vexpress_syscfg_init (void ) +{ +return platform_driver_register (&vexpress_syscfg_driver); +} +core_initcall (vexpress_syscfg_init);drivers/misc/Kconfig +0
-9@@ -423,15 +423,6 @@ config SRAM config SRAM_EXEC bool -config VEXPRESS_SYSCFG - bool "Versatile Express System Configuration driver" - depends on VEXPRESS_CONFIG - default y - help - ARM Ltd. Versatile Express uses specialised platform configuration - bus. System Configuration interface is one of the possible means - of generating transactions on this bus. - config PCI_ENDPOINT_TEST depends on PCI select CRC32drivers/misc/Makefile +0
-1@@ -49,7 +49,6 @@ obj-$(CONFIG_SRAM_EXEC) += sram-exec.o obj-y += mic/ obj-$(CONFIG_GENWQE) += genwqe/ obj-$(CONFIG_ECHO) += echo/ -obj-$(CONFIG_VEXPRESS_SYSCFG) += vexpress-syscfg.o obj-$(CONFIG_CXL_BASE) += cxl/ obj-$(CONFIG_PCI_ENDPOINT_TEST) += pci_endpoint_test.o obj-$(CONFIG_OCXL) += ocxl/drivers/misc/vexpress-syscfg.c deleted +0
-280@@ -1,280 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0-only -/* -* -* Copyright (C) 2014 ARM Limited -*/ - -#include <linux/delay.h> -#include <linux/err.h> -#include <linux/io.h> -#include <linux/of.h> -#include <linux/platform_device.h> -#include <linux/sched/signal.h> -#include <linux/slab.h> -#include <linux/syscore_ops.h> -#include <linux/vexpress.h> - - -#define SYS_CFGDATA 0x0 - -#define SYS_CFGCTRL 0x4 -#define SYS_CFGCTRL_START (1 << 31) -#define SYS_CFGCTRL_WRITE (1 << 30) -#define SYS_CFGCTRL_DCC (n) (((n) & 0xf) << 26) -#define SYS_CFGCTRL_FUNC (n) (((n) & 0x3f) << 20) -#define SYS_CFGCTRL_SITE (n) (((n) & 0x3) << 16) -#define SYS_CFGCTRL_POSITION (n) (((n) & 0xf) << 12) -#define SYS_CFGCTRL_DEVICE (n) (((n) & 0xfff) << 0) - -#define SYS_CFGSTAT 0x8 -#define SYS_CFGSTAT_ERR (1 << 1) -#define SYS_CFGSTAT_COMPLETE (1 << 0) - - -struct vexpress_syscfg { -struct device *dev; -void __iomem *base; -struct list_head funcs; -}; - -struct vexpress_syscfg_func { -struct list_head list; -struct vexpress_syscfg *syscfg; -struct regmap *regmap; -int num_templates; -u32 template[];/* Keep it last! */ -}; - - -static int vexpress_syscfg_exec (struct vexpress_syscfg_func *func, -int index,bool write,u32 *data) -{ -struct vexpress_syscfg *syscfg = func->syscfg; -u32 command, status; -int tries; -long timeout; - -if (WARN_ON (index >= func->num_templates)) -return -EINVAL ; - - command =readl (syscfg->base +SYS_CFGCTRL ); -if (WARN_ON (command &SYS_CFGCTRL_START )) -return -EBUSY ; - - command = func->template[index]; - command |=SYS_CFGCTRL_START ; - command |= write ?SYS_CFGCTRL_WRITE :0 ; - -/* Use a canary for reads */ -if (!write) - *data =0xdeadbeef ; - -dev_dbg (syscfg->dev,"func %p, command %x, data %x\n" , - func, command, *data); -writel (*data, syscfg->base +SYS_CFGDATA ); -writel (0 , syscfg->base +SYS_CFGSTAT ); -writel (command, syscfg->base +SYS_CFGCTRL ); -mb (); - -/* The operation can take ages... Go to sleep, 100us initially */ - tries =100 ; - timeout =100 ; -do { -if (!irqs_disabled ()) { -set_current_state (TASK_INTERRUPTIBLE ); -schedule_timeout (usecs_to_jiffies (timeout)); -if (signal_pending (current)) -return -EINTR ; - }else { -udelay (timeout); - } - - status =readl (syscfg->base +SYS_CFGSTAT ); -if (status &SYS_CFGSTAT_ERR ) -return -EFAULT ; - -if (timeout >20 ) - timeout -=20 ; - }while (--tries && !(status &SYS_CFGSTAT_COMPLETE )); -if (WARN_ON_ONCE (!tries)) -return -ETIMEDOUT ; - -if (!write) { - *data =readl (syscfg->base +SYS_CFGDATA ); -dev_dbg (syscfg->dev,"func %p, read data %x\n" , func, *data); - } - -return 0 ; -} - -static int vexpress_syscfg_read (void *context,unsigned int index, -unsigned int *val) -{ -struct vexpress_syscfg_func *func = context; - -return vexpress_syscfg_exec (func, index, false, val); -} - -static int vexpress_syscfg_write (void *context,unsigned int index, -unsigned int val) -{ -struct vexpress_syscfg_func *func = context; - -return vexpress_syscfg_exec (func, index, true, &val); -} - -static struct regmap_config vexpress_syscfg_regmap_config = { - .lock = vexpress_config_lock, - .unlock = vexpress_config_unlock, - .reg_bits =32 , - .val_bits =32 , - .reg_read = vexpress_syscfg_read, - .reg_write = vexpress_syscfg_write, - .reg_format_endian =REGMAP_ENDIAN_LITTLE , - .val_format_endian =REGMAP_ENDIAN_LITTLE , -}; - - -static struct regmap *vexpress_syscfg_regmap_init (struct device *dev, -void *context) -{ -int err; -struct vexpress_syscfg *syscfg = context; -struct vexpress_syscfg_func *func; -struct property *prop; -const __be32 *val =NULL ; -__be32 energy_quirk[4 ]; -int num; -u32 site, position, dcc; -int i; - - err =vexpress_config_get_topo (dev->of_node, &site, - &position, &dcc); -if (err) -return ERR_PTR (err); - - prop =of_find_property (dev->of_node, -"arm,vexpress-sysreg,func" ,NULL ); -if (!prop) -return ERR_PTR (-EINVAL ); - - num = prop->length /sizeof (u32) /2 ; - val = prop->value; - -/* -* "arm,vexpress-energy" function used to be described -* by its first device only, now it requires both -*/ -if (num ==1 &&of_device_is_compatible (dev->of_node, -"arm,vexpress-energy" )) { - num =2 ; - energy_quirk[0 ] = *val; - energy_quirk[2 ] = *val++; - energy_quirk[1 ] = *val; - energy_quirk[3 ] =cpu_to_be32 (be32_to_cpup (val) +1 ); - val = energy_quirk; - } - - func =kzalloc (struct_size (func, template, num),GFP_KERNEL ); -if (!func) -return ERR_PTR (-ENOMEM ); - - func->syscfg = syscfg; - func->num_templates = num; - -for (i =0 ; i < num; i++) { -u32 function, device; - - function =be32_to_cpup (val++); - device =be32_to_cpup (val++); - -dev_dbg (dev,"func %p: %u/%u/%u/%u/%u\n" , - func, site, position, dcc, - function, device); - - func->template[i] =SYS_CFGCTRL_DCC (dcc); - func->template[i] |=SYS_CFGCTRL_SITE (site); - func->template[i] |=SYS_CFGCTRL_POSITION (position); - func->template[i] |=SYS_CFGCTRL_FUNC (function); - func->template[i] |=SYS_CFGCTRL_DEVICE (device); - } - - vexpress_syscfg_regmap_config.max_register = num -1 ; - - func->regmap =regmap_init (dev,NULL , func, - &vexpress_syscfg_regmap_config); - -if (IS_ERR (func->regmap)) { -void *err = func->regmap; - -kfree (func); -return err; - } - -list_add (&func->list, &syscfg->funcs); - -return func->regmap; -} - -static void vexpress_syscfg_regmap_exit (struct regmap *regmap,void *context) -{ -struct vexpress_syscfg *syscfg = context; -struct vexpress_syscfg_func *func, *tmp; - -regmap_exit (regmap); - -list_for_each_entry_safe (func, tmp, &syscfg->funcs, list) { -if (func->regmap == regmap) { -list_del (&syscfg->funcs); -kfree (func); -break ; - } - } -} - -static struct vexpress_config_bridge_ops vexpress_syscfg_bridge_ops = { - .regmap_init = vexpress_syscfg_regmap_init, - .regmap_exit = vexpress_syscfg_regmap_exit, -}; - - -static int vexpress_syscfg_probe (struct platform_device *pdev) -{ -struct vexpress_syscfg *syscfg; -struct resource *res; -struct device *bridge; - - syscfg =devm_kzalloc (&pdev->dev,sizeof (*syscfg),GFP_KERNEL ); -if (!syscfg) -return -ENOMEM ; - syscfg->dev = &pdev->dev; -INIT_LIST_HEAD (&syscfg->funcs); - - res =platform_get_resource (pdev,IORESOURCE_MEM ,0 ); - syscfg->base =devm_ioremap_resource (&pdev->dev, res); -if (IS_ERR (syscfg->base)) -return PTR_ERR (syscfg->base); - -/* Must use dev.parent (MFD), as that's where DT phandle points at... */ - bridge =vexpress_config_bridge_register (pdev->dev.parent, - &vexpress_syscfg_bridge_ops, syscfg); - -return PTR_ERR_OR_ZERO (bridge); -} - -static const struct platform_device_id vexpress_syscfg_id_table[] = { - {"vexpress-syscfg" , }, - {}, -}; - -static struct platform_driver vexpress_syscfg_driver = { - .driver.name ="vexpress-syscfg" , - .id_table = vexpress_syscfg_id_table, - .probe = vexpress_syscfg_probe, -}; - -static int __init vexpress_syscfg_init (void ) -{ -return platform_driver_register (&vexpress_syscfg_driver); -} -core_initcall (vexpress_syscfg_init);include/linux/vexpress.h +0
-17@@ -18,23 +18,6 @@/* Config infrastructure */ void vexpress_config_set_master (u32 site); -u32 vexpress_config_get_master (void ); - -void vexpress_config_lock (void *arg); -void vexpress_config_unlock (void *arg); - -int vexpress_config_get_topo (struct device_node *node,u32 *site, -u32 *position,u32 *dcc); - -/* Config bridge API */ - -struct vexpress_config_bridge_ops { -struct regmap * (*regmap_init)(struct device *dev,void *context); -void (*regmap_exit)(struct regmap *regmap,void *context); -}; - -struct device *vexpress_config_bridge_register (struct device *parent, -struct vexpress_config_bridge_ops *ops,void *context);/* Config regmap API */ Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 14/17] bus: vexpress-config: simplify config bus probing
In reply to Rob HerringQuoted 10 lines · Rob Herring
The vexpress-config initialization is dependent on the vexpress-syscfg driver probing. As vexpress-config was not a driver, deferred probe could not be used and instead initcall ordering was relied upon. This is fragile and doesn't work for modules.
Let's move the config bus init into the vexpress-syscfg probe. This eliminates the initcall ordering requirement and the need to create a struct device and the "vexpress-config" class.
Cc Liviu Dudau <[email protected]>
Quoted 171 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Arnd Bergmann <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/bus/vexpress-config.c | 118 ++++++---------------------------- 1 file changed, 21 insertions(+), 97 deletions(-)drivers/bus/vexpress-config.c +21
-97@@ -56,7 +56,6 @@ struct vexpress_config_bridge {static DEFINE_MUTEX (vexpress_config_mutex); -static struct class *vexpress_config_class;static u32 vexpress_config_site_master =VEXPRESS_SITE_MASTER ;@@ -121,9 +120,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev)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 );@@ -146,94 +142,6 @@ struct regmap *devm_regmap_init_vexpress_config(struct device *dev) }EXPORT_SYMBOL_GPL (devm_regmap_init_vexpress_config); -static 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; -int ret; - - 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); -of_node_put (bridge); -if (WARN_ON (!parent)) -return -ENODEV ; - - ret =of_platform_populate (node,NULL ,NULL , parent); - -put_device (parent); - -return ret; -} - -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) { -of_node_put (node); -break ; - } - } - -return err; -} -postcore_initcall (vexpress_config_init); -static int vexpress_syscfg_exec (struct vexpress_syscfg_func *func,int index,bool write,u32 *data) {@@ -430,7 +338,8 @@ static int vexpress_syscfg_probe(struct platform_device *pdev) {struct vexpress_syscfg *syscfg;struct resource *res; -struct device *bridge; +struct vexpress_config_bridge *bridge; +struct device_node *node; syscfg =devm_kzalloc (&pdev->dev,sizeof (*syscfg),GFP_KERNEL );if (!syscfg)@@ -443,11 +352,26 @@ static int vexpress_syscfg_probe(struct platform_device *pdev)if (IS_ERR (syscfg->base))return PTR_ERR (syscfg->base); -/* Must use dev.parent (MFD), as that's where DT phandle points at... */ - bridge =vexpress_config_bridge_register (pdev->dev.parent, - &vexpress_syscfg_bridge_ops, syscfg); + bridge =devm_kmalloc (&pdev->dev,sizeof (*bridge),GFP_KERNEL ); +if (!bridge) +return -ENOMEM ; + + bridge->ops = &vexpress_syscfg_bridge_ops; + bridge->context = syscfg; + +dev_set_drvdata (&pdev->dev, bridge); -return PTR_ERR_OR_ZERO (bridge); +for_each_compatible_node (node,NULL ,"arm,vexpress,config-bus" ) { +struct device_node *bridge_np; + + bridge_np =of_parse_phandle (node,"arm,vexpress,config-bridge" ,0 ); +if (bridge_np != pdev->dev.parent->of_node) +continue ; + +of_platform_populate (node,NULL ,NULL , &pdev->dev); + } + +return 0 ; }static const struct platform_device_id vexpress_syscfg_id_table[] = {Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 15/17] vexpress: Move site master init to vexpress-config bus
In reply to Stephen BoydQuoted 1 line · Stephen Boyd
Is the subject supposed to say 'set master' vs. 'site master'?
Funnily enough, the VExpress has two "sites" (daughterboard sockets) and this was used to set which one was the master. Didn't realised the subject mismatch until you pointed out. :)
Quoted 15 lines
Quoting Rob Herring (2020-04-19 10:08:08)
Quoted 13 lines
There's only a single caller of
vexpress_config_set_master()fromvexpress-sysreg.c. Let's just make the registers needed available to vexpress-config and move all the code there. The registers needed aren't used anywhere else either. With this, we can get rid of the private API between these 2 drivers.Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 16/17] bus: vexpress-config: Support building as module
In reply to Rob HerringQuoted 3 lines · Rob Herring
Enable building vexpress-config driver as a module.
Cc Liviu Dudau <[email protected]>
Quoted 57 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/bus/Kconfig | 2 +- drivers/bus/vexpress-config.c | 10 ++++------ 2 files changed, 5 insertions(+), 7 deletions(-)drivers/bus/Kconfig +1
-1@@ -183,7 +183,7 @@ config UNIPHIER_SYSTEM_BUS needed to use on-board devices connected to UniPhier SoCs. config VEXPRESS_CONFIG - bool "Versatile Express configuration bus" + tristate "Versatile Express configuration bus" default y if ARCH_VEXPRESS depends on ARM || ARM64 depends on OFdrivers/bus/vexpress-config.c +4
-6@@ -7,6 +7,7 @@#include <linux/err.h> #include <linux/init.h> #include <linux/io.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/of_device.h> @@ -407,15 +408,12 @@ static const struct platform_device_id vexpress_syscfg_id_table[] = { { "vexpress-syscfg", }, {}, }; +MODULE_DEVICE_TABLE (platform, vexpress_syscfg_id_table);static struct platform_driver vexpress_syscfg_driver = { .driver.name ="vexpress-syscfg" , .id_table = vexpress_syscfg_id_table, .probe = vexpress_syscfg_probe, }; - -static int __init vexpress_syscfg_init (void ) -{ -return platform_driver_register (&vexpress_syscfg_driver); -} -core_initcall (vexpress_syscfg_init); +module_platform_driver (vexpress_syscfg_driver); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 17/17] ARM: vexpress: Don't select VEXPRESS_CONFIG
In reply to Rob HerringQuoted 5 lines · Rob Herring
CONFIG_VEXPRESS_CONFIGhas 'default y ifARCH_VEXPRESS', so selecting is unnecessary. Selecting it also prevents settingCONFIG_VEXPRESS_CONFIGto a module.Cc Liviu Dudau <[email protected]>
Quoted 23 lines
Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Signed-off-by Rob Herring <[email protected]>--- arch/arm/mach-vexpress/Kconfig | 1 - 1 file changed, 1 deletion(-)arch/arm/mach-vexpress/Kconfig +0
-1@@ -19,7 +19,6 @@ menuconfig ARCH_VEXPRESS select POWER_SUPPLY select REGULATOR if MMC_ARMMMCI select REGULATOR_FIXED_VOLTAGE if REGULATOR - select VEXPRESS_CONFIG help This option enables support for systems using Cortex processor based ARM core and logic (FPGA) tiles on the Versatile Express motherboard,Signature · 1 line
2.20.1
Signature · 8 lines
====================
| I would like to |
| fix the world, |
| but they're not |
| giving me the |
\ source code! /
---------------
¯\_(ツ)_/¯Re: [PATCH 01/17] ARM: vexpress: Move vexpress_flags_set() into arch code
In reply to Rob HerringQuoted 9 lines · Rob Herring
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 movevexpress_flags_set()closer to where it is being used. This will allow for vexpress-sysreg to be built as a module.Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
Signature · 2 lines
Regards, Sudeep
Re: [PATCH 02/17] arm64: vexpress: Don't select CONFIG_POWER_RESET_VEXPRESS
In reply to Rob HerringQuoted 4 lines · Rob Herring
The VExpress power-off/reset driver is not needed on 64-bit platforms as PSCI power-off and reset can be used instead. Stop selecting it so it can be disabled and not always built-in.
Indeed, doesn't set good example when we are shouting at people doing non-PSCI system poweroff/reset. I guess just remnants from initial arm64 port before PSCI days 😄
Quoted 4 lines
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
Signature · 2 lines
Regards, Sudeep
Re: [PATCH 03/17] arm64: vexpress: Don't select CONFIG_VEXPRESS_CONFIG
In reply to Rob HerringQuoted 7 lines · Rob Herring
CONFIG_VEXPRESS_CONFIGhas 'default y ifARCH_VEXPRESS', so selecting is unnecessary. It also prevents settingCONFIG_VEXPRESS_CONFIGto a module.Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
Signature · 2 lines
Regards, Sudeep
Re: [PATCH 04/17] power/reset: vexpress: Support building as a module
In reply to Rob HerringQuoted 6 lines · Rob Herring
Enable building the VExpress power-off/reset driver as a module.
Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
--
Regards,
Sudeep
Re: [PATCH 05/17] clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
In reply to Rob HerringQuoted 11 lines · Rob Herring
CONFIG_COMMON_CLK_VERSATILEdoesn't really do anything other than hiding Arm Ltd reference platform clock drivers. It is both selected by the platforms that need it and has a 'depends on' for those platforms. It selectsREGMAP_MMIO, but reallyCONFIG_ICSTshould do that. Also,CONFIG_ICSTcan't be enabled forCOMPILE_TESTunless something else selected it.Cc Catalin Marinas <[email protected]>Cc Will Deacon <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
Signature · 2 lines
Regards, Sudeep
Re: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Rob HerringQuoted 3 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Shouldn't we disable selection of SP804 for arm64 at the same time ?
Signature · 2 lines
Regards, Sudeep
Re: [PATCH 07/17] clk: vexpress-osc: Use the devres clock API variants
In reply to Rob HerringQuoted 6 lines · Rob Herring
In preparation to enable the vexpress-osc clock driver as a module, convert the driver to use the managed devres clock API variants. With this, a driver .remove() hook is not needed.
Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>
--
Regards,
Sudeep
Re: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Rob HerringQuoted 51 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Cc Linus Walleij <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Michael Turquette <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)drivers/clk/versatile/Kconfig +2
-2@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatiledrivers/clk/versatile/clk-vexpress-osc.c +2
-0@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {
drivers/clk/versatile/clk-vexpress-osc.c static struct platform_driver vexpress_osc_driver = { · line 121
Quoted 10 lines
drivers/clk/versatile/clk-vexpress-osc.c +1
-6@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init); +module_platform_driver (vexpress_osc_driver);
I am not 100% sure of this. This might break the boot on CA9 and TC2 at-least. There are loads of MB peripherals that need this. This will break the boot. We need to check if all the dependent modules are also at module_initcall level and if they deal with deferred probe correctly. Lot of them are legacy and may happen to be working by carefully initcall level adjustments.
I will take a look at it again. I must be able to run and check on TC2 though I seem to have removed the network cable on my TC2 or office n/w is acting crazy. I will check tomorrow again or run w/o network.
--
Regards,
Sudeep
Re: [PATCH 05/17] clk: versatile: Kill CONFIG_COMMON_CLK_VERSATILE
In reply to Stephen BoydQuoted 24 lines · Stephen Boyd
Quoting Rob Herring (2020-04-19 10:07:58)
Quoted 22 lines
drivers/clk/versatile/Kconfig +1
-8@@ -1,22 +1,14 @@ # SPDX-License-Identifier: GPL-2.0-only config ICST - bool - -config COMMON_CLK_VERSATILE - bool "Clock driver for ARM Reference designs" - depends on ARCH_INTEGRATOR || ARCH_REALVIEW || \ - ARCH_VERSATILE || ARCH_VEXPRESS || ARM64 || \ - COMPILE_TEST + bool "Clock driver for ARM Reference designs ICST" if COMPILE_TEST select REGMAP_MMIO ---help--- Supports clocking on ARM Reference designs: - Integrator/AP and Integrator/CP - RealView PB1176, EB, PB11MP and PBX - - Versatile Express
Quoted 7 lines
drivers/clk/versatile/Kconfig line 19
Quoted 3 lines
drivers/clk/versatile/Kconfig +0
-1config CLK_SP810 bool "Clock driver for ARM SP810 System Controller" - depends on COMMON_CLK_VERSATILEShouldn't this get the depends from
COMMON_CLK_VERSATILEso that this option isn't exposed unless someone is compile testing or using that platform?
IMO, once the dependencies get complicated enough, it's better to just expose the option. But I could drop just the select and keep the depends. It's primarily having both that we didn't need.
Rob
Re: [PATCH 15/17] vexpress: Move site master init to vexpress-config bus
In reply to Stephen BoydQuoted 2 lines · Stephen Boyd
Is the subject supposed to say 'set master' vs. 'site master'?
Humm, maybe 'master site' instead.
Quoted 15 lines
Quoting Rob Herring (2020-04-19 10:08:08)
Quoted 13 lines
There's only a single caller of
vexpress_config_set_master()fromvexpress-sysreg.c. Let's just make the registers needed available to vexpress-config and move all the code there. The registers needed aren't used anywhere else either. With this, we can get rid of the private API between these 2 drivers.Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Linus Walleij <[email protected]>Cc Lee Jones <[email protected]>Cc Greg Kroah-Hartman <[email protected]>Signed-off-by Rob Herring <[email protected]>
Re: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Sudeep HollaQuoted 61 lines · Sudeep Holla
Quoted 60 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Cc Linus Walleij <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Michael Turquette <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)drivers/clk/versatile/Kconfig +2
-2@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatiledrivers/clk/versatile/clk-vexpress-osc.c +2
-6@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init);
Quoted 9 lines
drivers/clk/versatile/clk-vexpress-osc.c static struct platform_driver vexpress_osc_driver = { · line 121
Quoted 1 line
drivers/clk/versatile/clk-vexpress-osc.c +1
-0+module_platform_driver (vexpress_osc_driver);I am not 100% sure of this. This might break the boot on CA9 and TC2 at-least. There are loads of MB peripherals that need this. This will break the boot. We need to check if all the dependent modules are also at
module_initcalllevel and if they deal with deferred probe correctly. Lot of them are legacy and may happen to be working by carefully initcall level adjustments.
OK I managed to try this on my TC2 and it fails to boot. However when I enable earlyprintk as I see no log without it, it boots just fine.
I also checked adding initcall_debug and I may be wrong on the dependency part. The modules dependent on vexpress-osc are probed later correctly.
This make it more difficult to debug as I don't have any debugger attached at the moment to look at the logbuf when it hangs without earlyprintk.
--
Regards,
Sudeep
Re: [PATCH 06/17] clk: versatile: Only enable SP810 on 32-bit by default
In reply to Sudeep HollaQuoted 7 lines · Sudeep Holla
Quoted 3 lines · Rob Herring
While 64-bit Arm reference platforms have SP810 for clocks for SP804 timers, they are not needed since the arch timers are used instead.
Shouldn't we disable selection of SP804 for arm64 at the same time ?
SP804 is already not selected for VEXPRESS. Only RPi and HiSilicon enable it on arm64. Though it makes me wonder why they require it as they should have arch timer too.
Rob
Re: [PATCH 08/17] clk: vexpress-osc: Support building as a module
In reply to Sudeep HollaQuoted 73 lines · Sudeep Holla
Quoted 61 lines · Sudeep Holla
Quoted 60 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Cc Linus Walleij <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Michael Turquette <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)drivers/clk/versatile/Kconfig +2
-2@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatiledrivers/clk/versatile/clk-vexpress-osc.c +2
-6@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init);Quoted 9 lines
drivers/clk/versatile/clk-vexpress-osc.c static struct platform_driver vexpress_osc_driver = { · line 121
Quoted 1 line
drivers/clk/versatile/clk-vexpress-osc.c +1
-0+module_platform_driver (vexpress_osc_driver);I am not 100% sure of this. This might break the boot on CA9 and TC2 at-least. There are loads of MB peripherals that need this. This will break the boot. We need to check if all the dependent modules are also at
module_initcalllevel and if they deal with deferred probe correctly. Lot of them are legacy and may happen to be working by carefully initcall level adjustments.
Quoted 2 lines
OK I managed to try this on my TC2 and it fails to boot. However when I enable earlyprintk as I see no log without it, it boots just fine.
Well, the uart clocks for TC2 are all dependent on vexpress-osc. The console setup is going to fail to get the clocks and just fail as there's no deferred probe for consoles. We need some way to retrigger the console matching.
Quoted 9 lines
I also checked adding
initcall_debugand I may be wrong on the dependency part. The modules dependent on vexpress-osc are probed later correctly.This make it more difficult to debug as I don't have any debugger attached at the moment to look at the logbuf when it hangs without earlyprintk.
--
Regards,
Sudeep
Re: [PATCH 08/17] clk: vexpress-osc: Support building as a module
Quoted 74 lines · Rob Herring
Quoted 73 lines · Sudeep Holla
Quoted 70 lines · Sudeep Holla
Quoted 51 lines · Rob Herring
Enable building the vexpress-osc clock driver as a module.
Cc Linus Walleij <[email protected]>Cc Liviu Dudau <[email protected]>Cc Sudeep Holla <[email protected]>Cc Lorenzo Pieralisi <[email protected]>Cc Michael Turquette <[email protected]>Cc Stephen Boyd <[email protected]>Signed-off-by Rob Herring <[email protected]>--- drivers/clk/versatile/Kconfig | 4 ++-- drivers/clk/versatile/clk-vexpress-osc.c | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-)drivers/clk/versatile/Kconfig +2
-2@@ -15,8 +15,8 @@ config CLK_SP810 of the ARM SP810 System Controller cell. config CLK_VEXPRESS_OSC - bool "Clock driver for Versatile Express OSC clock generators" - depends on VEXPRESS_CONFIG || COMPILE_TEST + tristate "Clock driver for Versatile Express OSC clock generators" + depends on VEXPRESS_CONFIG default y if ARCH_VEXPRESS ---help--- Simple regmap-based driver driving clock generators on Versatiledrivers/clk/versatile/clk-vexpress-osc.c +2
-0@@ -7,6 +7,7 @@#include <linux/clkdev.h> #include <linux/clk-provider.h> #include <linux/err.h> +#include <linux/module.h> #include <linux/of.h> #include <linux/platform_device.h> #include <linux/slab.h> @@ -108,6 +109,7 @@ static const struct of_device_id vexpress_osc_of_match[] = { { .compatible = "arm,vexpress-osc", }, {} }; +MODULE_DEVICE_TABLE (of, vexpress_osc_of_match);static struct platform_driver vexpress_osc_driver = { .driver = {drivers/clk/versatile/clk-vexpress-osc.c static struct platform_driver vexpress_osc_driver = { · line 121
Quoted 10 lines
drivers/clk/versatile/clk-vexpress-osc.c +1
-6@@ -116,9 +118,5 @@ static struct platform_driver vexpress_osc_driver = { }, .probe = vexpress_osc_probe, }; - -static int __init vexpress_osc_init (void ) -{ -return platform_driver_register (&vexpress_osc_driver); -} -core_initcall (vexpress_osc_init); +module_platform_driver (vexpress_osc_driver);I am not 100% sure of this. This might break the boot on CA9 and TC2 at-least. There are loads of MB peripherals that need this. This will break the boot. We need to check if all the dependent modules are also at
module_initcalllevel and if they deal with deferred probe correctly. Lot of them are legacy and may happen to be working by carefully initcall level adjustments.
Quoted 8 lines
Quoted 2 lines
OK I managed to try this on my TC2 and it fails to boot. However when I enable earlyprintk as I see no log without it, it boots just fine.
Well, the uart clocks for TC2 are all dependent on vexpress-osc. The console setup is going to fail to get the clocks and just fail as there's no deferred probe for consoles. We need some way to retrigger the console matching.
Ah right, I didn't bother to look at pl011 as I got it confused with Juno which has on-chip pl011.
Sorry I don't know details of how early console hands over to the console. Just wondering how is the dependency resolved when earlyprintk is enabled. The partial log from
$ dmesg | grep -i -E "("pl0"|"vexpress"|"console")"below when it boots earlyprintk. I see that console is enabled after vexpress_osc_driver_init is called.
--->8
calling vexpress_syscfg_init+0x1/0xe @ 1
initcall vexpress_syscfg_init+0x1/0xe returned 0 after 0 usecs
calling vexpress_sysreg_init+0x1/0x48 @ 1
probe of vexpress-syscfg.6.auto returned 1 after 0 usecs
initcall vexpress_sysreg_init+0x1/0x48 returned 0 after 0 usecs calling vexpress_config_init+0x1/0xae @ 1
initcall vexpress_config_init+0x1/0xae returned 0 after 0 usecs calling pl011_init+0x1/0x38 @ 1
Serial: AMBA PL011 UART driver
initcall pl011_init+0x1/0x38 returned 0 after 9765 usecs
calling pl022_init+0x1/0xc @ 1
initcall pl022_init+0x1/0xc returned 0 after 0 usecs
calling pl061_gpio_init+0x1/0xc @ 1
initcall pl061_gpio_init+0x1/0xc returned 0 after 31 usecs
calling vexpress_osc_driver_init+0x1/0x10 @ 1
initcall vexpress_osc_driver_init+0x1/0x10 returned 0 after 231119 usecs calling vexpress_regulator_driver_init+0x1/0xe @ 1
initcall vexpress_regulator_driver_init+0x1/0xe returned 0 after 114764 usecs calling pl031_driver_init+0x1/0xc @ 1
initcall pl031_driver_init+0x1/0xc returned 0 after 25 usecs
calling vexpress_reset_driver_init+0x1/0xe @ 1
initcall vexpress_reset_driver_init+0x1/0xe returned 0 after 594 usecs 1c090000.uart: ttyAMA0 at MMIO 0x1c090000 (irq = 30, base_baud = 0) is a PL011 rev2
printk: console [ttyAMA0] enabled
printk: bootconsole [earlycon0] disabled
1c0a0000.uart: ttyAMA1 at MMIO 0x1c0a0000 (irq = 31, base_baud = 0) is a PL011 rev2 1c0b0000.uart: ttyAMA2 at MMIO 0x1c0b0000 (irq = 32, base_baud = 0) is a PL011 rev2 1c0c0000.uart: ttyAMA3 at MMIO 0x1c0c0000 (irq = 33, base_baud = 0) is a PL011 rev2 rtc-pl031 1c170000.rtc: registered as rtc0
rtc-pl031 1c170000.rtc: setting system clock to 2020-04-23T16:54:46 UTC (1587660886) --->8
Signature · 2 lines
Regards, Sudeep
Sebastian Reichel
maintainerRe: [PATCH 04/17] power/reset: vexpress: Support building as a module
In reply to Rob HerringHi,
Quoted 4 lines · Rob Herring
Quoted 3 lines · Arnd Bergmann
Quoted 1 line · Rob Herring
Quoted 8 lines
Quoted 6 lines
Quoted 1 line
Enable building the VExpress power-off/reset driver as a module.
Your change allows loading and unloading the driver, but actually unloading is a bug with the current implementation, as there is no 'release' handler to undo the
_vexpress_register_restart_handler()function.And also to save and restore
pm_power_off...
I'm fine with providing Acked-by for this for merging through a different tree or taking it through my tree.
Quoted 9 lines
Quoted 6 lines
It should not be hard to add a release handler, or you could just mark the function as non-unloadable by only having a
module_init()but nomodule_exit()function.I suppose if you do the latter, there should also be a
suppress_bind_attrsflag in thedevice_driver. This is a preexisting bug.I may just drop this patch. I wrote it and then realized I don't need it as PSCI can be used instead.
So is the driver useless on arm64 and depends can be reduced to arm32?
-- Sebastian