1
0

soc: microchip: add mfd drivers for two syscon regions on PolarFire SoC

The control-scb and mss-top-sysreg regions on PolarFire SoC both fulfill
multiple purposes. The former is used for mailbox functions in addition
to the temperature & voltage sensor while the latter is used for clocks,
resets, interrupt muxing and pinctrl.

Signed-off-by: Conor Dooley <conor.dooley@microchip.com>
This commit is contained in:
Conor Dooley
2025-10-13 18:45:34 +01:00
parent feaa716adc
commit 4aac11c9a6
4 changed files with 95 additions and 0 deletions

View File

@@ -9,3 +9,15 @@ config POLARFIRE_SOC_SYS_CTRL
module will be called mpfs_system_controller.
If unsure, say N.
config POLARFIRE_SOC_SYSCONS
bool "PolarFire SoC (MPFS) syscon drivers"
default y
depends on ARCH_MICROCHIP
select MFD_CORE
help
These drivers add support for the syscons on PolarFire SoC (MPFS).
Without these drivers core parts of the kernel such as clocks
and resets will not function correctly.
If unsure, and on a PolarFire SoC, say y.

View File

@@ -1 +1,2 @@
obj-$(CONFIG_POLARFIRE_SOC_SYS_CTRL) += mpfs-sys-controller.o
obj-$(CONFIG_POLARFIRE_SOC_SYSCONS) += mpfs-control-scb.o mpfs-mss-top-sysreg.o

View File

@@ -0,0 +1,38 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/array_size.h>
#include <linux/of.h>
#include <linux/mfd/core.h>
#include <linux/mfd/syscon.h>
#include <linux/platform_device.h>
static const struct mfd_cell mpfs_control_scb_devs[] = {
MFD_CELL_NAME("mpfs-tvs"),
};
static int mpfs_control_scb_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
return mfd_add_devices(dev, PLATFORM_DEVID_NONE, mpfs_control_scb_devs,
ARRAY_SIZE(mpfs_control_scb_devs), NULL, 0, NULL);
}
static const struct of_device_id mpfs_control_scb_of_match[] = {
{ .compatible = "microchip,mpfs-control-scb", },
{},
};
MODULE_DEVICE_TABLE(of, mpfs_control_scb_of_match);
static struct platform_driver mpfs_control_scb_driver = {
.driver = {
.name = "mpfs-control-scb",
.of_match_table = mpfs_control_scb_of_match,
},
.probe = mpfs_control_scb_probe,
};
module_platform_driver(mpfs_control_scb_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>");
MODULE_DESCRIPTION("PolarFire SoC control scb driver");

View File

@@ -0,0 +1,44 @@
// SPDX-License-Identifier: GPL-2.0
#include <linux/array_size.h>
#include <linux/of.h>
#include <linux/mfd/core.h>
#include <linux/mfd/syscon.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>
static const struct mfd_cell mpfs_mss_top_sysreg_devs[] = {
MFD_CELL_NAME("mpfs-reset"),
};
static int mpfs_mss_top_sysreg_probe(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
int ret;
ret = mfd_add_devices(dev, PLATFORM_DEVID_NONE, mpfs_mss_top_sysreg_devs,
ARRAY_SIZE(mpfs_mss_top_sysreg_devs) , NULL, 0, NULL);
if (ret)
return ret;
return devm_of_platform_populate(dev);
}
static const struct of_device_id mpfs_mss_top_sysreg_of_match[] = {
{ .compatible = "microchip,mpfs-mss-top-sysreg", },
{},
};
MODULE_DEVICE_TABLE(of, mpfs_mss_top_sysreg_of_match);
static struct platform_driver mpfs_mss_top_sysreg_driver = {
.driver = {
.name = "mpfs-mss-top-sysreg",
.of_match_table = mpfs_mss_top_sysreg_of_match,
},
.probe = mpfs_mss_top_sysreg_probe,
};
module_platform_driver(mpfs_mss_top_sysreg_driver);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Conor Dooley <conor.dooley@microchip.com>");
MODULE_DESCRIPTION("PolarFire SoC mss top sysreg driver");