All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nikita Shubin via B4 Relay  <devnull+nikita.shubin.maquefel.me@kernel.org>
To: "Conor Dooley" <conor.dooley@microchip.com>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Joel Stanley" <joel@jms.id.au>,
	"Walker Chen" <walker.chen@starfivetech.com>,
	"Jonathan Neuschäfer" <j.neuschaefer@gmx.net>,
	"Nikita Shubin" <nikita.shubin@maquefel.me>,
	"Huisong Li" <lihuisong@huawei.com>,
	"Arnd Bergmann" <arnd@arndb.de>, "Wei Xu" <xuwei5@hisilicon.com>,
	"Emil Renner Berthing" <kernel@esmil.dk>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Alexander Sverdlin" <alexander.sverdlin@gmail.com>
Cc: Hal Feng <hal.feng@starfivetech.com>,
	linux-kernel@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>
Subject: [PATCH v6 08/40] soc: Add SoC driver for Cirrus ep93xx
Date: Tue, 12 Dec 2023 11:20:25 +0300	[thread overview]
Message-ID: <20231212-ep93xx-v6-8-c307b8ac9aa8@maquefel.me> (raw)
In-Reply-To: <20231212-ep93xx-v6-0-c307b8ac9aa8@maquefel.me>

From: Nikita Shubin <nikita.shubin@maquefel.me>

Add an SoC driver for the ep93xx. Currently there is only one thing
not fitting into any other framework, and that is the swlock setting.

Used for clock settings, pinctrl and restart.

Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Acked-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/soc/Kconfig             |   1 +
 drivers/soc/Makefile            |   1 +
 drivers/soc/cirrus/Kconfig      |  13 +++
 drivers/soc/cirrus/Makefile     |   2 +
 drivers/soc/cirrus/soc-ep93xx.c | 247 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 264 insertions(+)

diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 10a9ff84ff41..47692deb68e4 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -7,6 +7,7 @@ source "drivers/soc/aspeed/Kconfig"
 source "drivers/soc/atmel/Kconfig"
 source "drivers/soc/bcm/Kconfig"
 source "drivers/soc/canaan/Kconfig"
+source "drivers/soc/cirrus/Kconfig"
 source "drivers/soc/fsl/Kconfig"
 source "drivers/soc/fujitsu/Kconfig"
 source "drivers/soc/hisilicon/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 0706a27d13be..6bfd520c325a 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -8,6 +8,7 @@ obj-y				+= aspeed/
 obj-$(CONFIG_ARCH_AT91)		+= atmel/
 obj-y				+= bcm/
 obj-$(CONFIG_SOC_CANAAN)	+= canaan/
+obj-$(CONFIG_EP93XX_SOC)        += cirrus/
 obj-$(CONFIG_ARCH_DOVE)		+= dove/
 obj-$(CONFIG_MACH_DOVE)		+= dove/
 obj-y				+= fsl/
diff --git a/drivers/soc/cirrus/Kconfig b/drivers/soc/cirrus/Kconfig
new file mode 100644
index 000000000000..306499692e8c
--- /dev/null
+++ b/drivers/soc/cirrus/Kconfig
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+if ARCH_EP93XX
+
+config EP93XX_SOC
+	bool "Cirrus EP93xx chips SoC"
+	select SOC_BUS
+	select AUXILIARY_BUS
+	default y if !EP93XX_SOC_COMMON
+	help
+	  Support SoC for Cirrus EP93xx chips.
+
+endif
diff --git a/drivers/soc/cirrus/Makefile b/drivers/soc/cirrus/Makefile
new file mode 100644
index 000000000000..9e6608b67f76
--- /dev/null
+++ b/drivers/soc/cirrus/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+obj-y	+= soc-ep93xx.o
diff --git a/drivers/soc/cirrus/soc-ep93xx.c b/drivers/soc/cirrus/soc-ep93xx.c
new file mode 100644
index 000000000000..82c176e288cc
--- /dev/null
+++ b/drivers/soc/cirrus/soc-ep93xx.c
@@ -0,0 +1,247 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * SoC driver for Cirrus EP93xx chips.
+ * Copyright (C) 2022 Nikita Shubin <nikita.shubin@maquefel.me>
+ *
+ * Based on a rewrite of arch/arm/mach-ep93xx/core.c
+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
+ *
+ * Thanks go to Michael Burian and Ray Lehtiniemi for their key
+ * role in the ep93xx Linux community
+ */
+
+#include <linux/bits.h>
+#include <linux/init.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+
+#include <linux/soc/cirrus/ep93xx.h>
+
+#define EP93XX_SYSCON_DEVCFG		0x80
+
+#define EP93XX_SWLOCK_MAGICK		0xaa
+#define EP93XX_SYSCON_SWLOCK		0xc0
+#define EP93XX_SYSCON_SYSCFG		0x9c
+#define EP93XX_SYSCON_SYSCFG_REV_MASK	GENMASK(31, 28)
+#define EP93XX_SYSCON_SYSCFG_REV_SHIFT	28
+
+struct ep93xx_map_info {
+	spinlock_t lock;
+	void __iomem *base;
+	struct regmap *map;
+};
+
+/*
+ * EP93xx System Controller software locked register write
+ *
+ * Logic safeguards are included to condition the control signals for
+ * power connection to the matrix to prevent part damage. In addition, a
+ * software lock register is included that must be written with 0xAA
+ * before each register write to change the values of the four switch
+ * matrix control registers.
+ */
+static void ep93xx_regmap_write(struct regmap *map, spinlock_t *lock,
+				 unsigned int reg, unsigned int val)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(lock, flags);
+
+	regmap_write(map, EP93XX_SYSCON_SWLOCK, EP93XX_SWLOCK_MAGICK);
+	regmap_write(map, reg, val);
+
+	spin_unlock_irqrestore(lock, flags);
+}
+
+static void ep93xx_regmap_update_bits(struct regmap *map, spinlock_t *lock,
+				      unsigned int reg, unsigned int mask,
+				      unsigned int val)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(lock, flags);
+
+	regmap_write(map, EP93XX_SYSCON_SWLOCK, EP93XX_SWLOCK_MAGICK);
+	/* force write is required to clear swlock if is no changes are made */
+	regmap_update_bits_base(map, reg, mask, val, NULL, false, true);
+
+	spin_unlock_irqrestore(lock, flags);
+}
+
+static void ep93xx_unregister_adev(void *_adev)
+{
+	struct auxiliary_device *adev = _adev;
+
+	auxiliary_device_delete(adev);
+	auxiliary_device_uninit(adev);
+}
+
+static void ep93xx_adev_release(struct device *dev)
+{
+	struct auxiliary_device *adev = to_auxiliary_dev(dev);
+
+	kfree(adev);
+}
+
+static struct auxiliary_device *ep93xx_adev_alloc(struct device *parent, const char *name,
+						  struct ep93xx_map_info *info)
+{
+	struct ep93xx_regmap_adev *rdev;
+	struct auxiliary_device *adev;
+	int ret;
+
+	rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
+	if (!rdev)
+		return ERR_PTR(-ENOMEM);
+
+	rdev->map = info->map;
+	rdev->base = info->base;
+	rdev->lock = &info->lock;
+	rdev->write = ep93xx_regmap_write;
+	rdev->update_bits = ep93xx_regmap_update_bits;
+
+	adev = &rdev->adev;
+	adev->name = name;
+	adev->dev.parent = parent;
+	adev->dev.release = ep93xx_adev_release;
+
+	ret = auxiliary_device_init(adev);
+	if (ret) {
+		kfree(adev);
+		return ERR_PTR(ret);
+	}
+
+	return adev;
+}
+
+static int ep93xx_controller_register(struct device *parent, const char *name,
+				      struct ep93xx_map_info *info)
+{
+	struct auxiliary_device *adev;
+	int ret;
+
+	adev = ep93xx_adev_alloc(parent, name, info);
+	if (IS_ERR(adev))
+		return PTR_ERR(adev);
+
+	ret = auxiliary_device_add(adev);
+	if (ret) {
+		auxiliary_device_uninit(adev);
+		return ret;
+	}
+
+	return devm_add_action_or_reset(parent, ep93xx_unregister_adev, adev);
+}
+
+static unsigned int __init ep93xx_soc_revision(struct regmap *map)
+{
+	unsigned int val;
+
+	regmap_read(map, EP93XX_SYSCON_SYSCFG, &val);
+	val &= EP93XX_SYSCON_SYSCFG_REV_MASK;
+	val >>= EP93XX_SYSCON_SYSCFG_REV_SHIFT;
+	return val;
+}
+
+static const char __init *ep93xx_get_soc_rev(struct regmap *map)
+{
+	switch (ep93xx_soc_revision(map)) {
+	case EP93XX_CHIP_REV_D0:
+		return "D0";
+	case EP93XX_CHIP_REV_D1:
+		return "D1";
+	case EP93XX_CHIP_REV_E0:
+		return "E0";
+	case EP93XX_CHIP_REV_E1:
+		return "E1";
+	case EP93XX_CHIP_REV_E2:
+		return "E2";
+	default:
+		return "unknown";
+	}
+}
+
+const char *pinctrl_names[] = {
+	"pinctrl-ep9301",	/* EP93XX_9301_SOC */
+	"pinctrl-ep9307",	/* EP93XX_9307_SOC */
+	"pinctrl-ep9312",	/* EP93XX_9312_SOC */
+};
+
+static int __init ep93xx_syscon_probe(struct platform_device *pdev)
+{
+	enum ep93xx_soc_model model = (int)(uintptr_t)of_device_get_match_data(&pdev->dev);
+	struct ep93xx_map_info *map_info;
+	struct soc_device_attribute *attrs;
+	struct soc_device *soc_dev;
+	struct device *dev = &pdev->dev;
+	struct regmap *map;
+	void __iomem *base;
+	int ret;
+
+	map = device_node_to_regmap(dev->of_node);
+	if (IS_ERR(map))
+		return PTR_ERR(map);
+
+	base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(base))
+		return PTR_ERR(base);
+
+	attrs = devm_kzalloc(dev, sizeof(*attrs), GFP_KERNEL);
+	if (!attrs)
+		return -ENOMEM;
+
+	attrs->machine = of_flat_dt_get_machine_name();
+	attrs->family = "Cirrus Logic EP93xx";
+	attrs->revision = ep93xx_get_soc_rev(map);
+
+	soc_dev = soc_device_register(attrs);
+	if (IS_ERR(soc_dev))
+		return PTR_ERR(soc_dev);
+
+	map_info = devm_kzalloc(dev, sizeof(*map_info), GFP_KERNEL);
+	if (!map_info)
+		return -ENOMEM;
+
+	spin_lock_init(&map_info->lock);
+	map_info->map = map;
+	map_info->base = base;
+
+	ret = ep93xx_controller_register(dev, pinctrl_names[model], map_info);
+	if (ret)
+		dev_err(dev, "registering pinctrl controller failed\n");
+
+	ret = ep93xx_controller_register(dev, "clk-ep93xx", map_info);
+	if (ret)
+		dev_err(dev, "registering clock controller failed\n");
+
+	ret = ep93xx_controller_register(dev, "reset-ep93xx", map_info);
+	if (ret)
+		dev_err(dev, "registering reset controller failed\n");
+
+	dev_info(dev, "EP93xx SoC revision %s\n", attrs->revision);
+
+	return 0;
+}
+
+static const struct of_device_id ep9301_syscon_of_device_ids[] = {
+	{ .compatible	= "cirrus,ep9301-syscon", .data = (void *)EP93XX_9301_SOC },
+	{ .compatible	= "cirrus,ep9302-syscon", .data = (void *)EP93XX_9301_SOC },
+	{ .compatible	= "cirrus,ep9307-syscon", .data = (void *)EP93XX_9307_SOC },
+	{ .compatible	= "cirrus,ep9312-syscon", .data = (void *)EP93XX_9312_SOC },
+	{ .compatible	= "cirrus,ep9315-syscon", .data = (void *)EP93XX_9312_SOC },
+	{ /* sentinel */ }
+};
+
+static struct platform_driver ep9301_syscon_driver = {
+	.driver = {
+		.name = "ep9301-syscon",
+		.of_match_table = ep9301_syscon_of_device_ids,
+	},
+};
+builtin_platform_driver_probe(ep9301_syscon_driver, ep93xx_syscon_probe);

-- 
2.41.0


WARNING: multiple messages have this Message-ID (diff)
From: Nikita Shubin <nikita.shubin@maquefel.me>
To: "Conor Dooley" <conor.dooley@microchip.com>,
	"Ulf Hansson" <ulf.hansson@linaro.org>,
	"Joel Stanley" <joel@jms.id.au>,
	"Walker Chen" <walker.chen@starfivetech.com>,
	"Jonathan Neuschäfer" <j.neuschaefer@gmx.net>,
	"Nikita Shubin" <nikita.shubin@maquefel.me>,
	"Huisong Li" <lihuisong@huawei.com>,
	"Arnd Bergmann" <arnd@arndb.de>, "Wei Xu" <xuwei5@hisilicon.com>,
	"Emil Renner Berthing" <kernel@esmil.dk>,
	"Linus Walleij" <linus.walleij@linaro.org>,
	"Alexander Sverdlin" <alexander.sverdlin@gmail.com>
Cc: Hal Feng <hal.feng@starfivetech.com>,
	linux-kernel@vger.kernel.org,  Arnd Bergmann <arnd@arndb.de>
Subject: [PATCH v6 08/40] soc: Add SoC driver for Cirrus ep93xx
Date: Tue, 12 Dec 2023 11:20:25 +0300	[thread overview]
Message-ID: <20231212-ep93xx-v6-8-c307b8ac9aa8@maquefel.me> (raw)
In-Reply-To: <20231212-ep93xx-v6-0-c307b8ac9aa8@maquefel.me>

Add an SoC driver for the ep93xx. Currently there is only one thing
not fitting into any other framework, and that is the swlock setting.

Used for clock settings, pinctrl and restart.

Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
Tested-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Acked-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
---
 drivers/soc/Kconfig             |   1 +
 drivers/soc/Makefile            |   1 +
 drivers/soc/cirrus/Kconfig      |  13 +++
 drivers/soc/cirrus/Makefile     |   2 +
 drivers/soc/cirrus/soc-ep93xx.c | 247 ++++++++++++++++++++++++++++++++++++++++
 5 files changed, 264 insertions(+)

diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index 10a9ff84ff41..47692deb68e4 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -7,6 +7,7 @@ source "drivers/soc/aspeed/Kconfig"
 source "drivers/soc/atmel/Kconfig"
 source "drivers/soc/bcm/Kconfig"
 source "drivers/soc/canaan/Kconfig"
+source "drivers/soc/cirrus/Kconfig"
 source "drivers/soc/fsl/Kconfig"
 source "drivers/soc/fujitsu/Kconfig"
 source "drivers/soc/hisilicon/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 0706a27d13be..6bfd520c325a 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -8,6 +8,7 @@ obj-y				+= aspeed/
 obj-$(CONFIG_ARCH_AT91)		+= atmel/
 obj-y				+= bcm/
 obj-$(CONFIG_SOC_CANAAN)	+= canaan/
+obj-$(CONFIG_EP93XX_SOC)        += cirrus/
 obj-$(CONFIG_ARCH_DOVE)		+= dove/
 obj-$(CONFIG_MACH_DOVE)		+= dove/
 obj-y				+= fsl/
diff --git a/drivers/soc/cirrus/Kconfig b/drivers/soc/cirrus/Kconfig
new file mode 100644
index 000000000000..306499692e8c
--- /dev/null
+++ b/drivers/soc/cirrus/Kconfig
@@ -0,0 +1,13 @@
+# SPDX-License-Identifier: GPL-2.0-only
+
+if ARCH_EP93XX
+
+config EP93XX_SOC
+	bool "Cirrus EP93xx chips SoC"
+	select SOC_BUS
+	select AUXILIARY_BUS
+	default y if !EP93XX_SOC_COMMON
+	help
+	  Support SoC for Cirrus EP93xx chips.
+
+endif
diff --git a/drivers/soc/cirrus/Makefile b/drivers/soc/cirrus/Makefile
new file mode 100644
index 000000000000..9e6608b67f76
--- /dev/null
+++ b/drivers/soc/cirrus/Makefile
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+obj-y	+= soc-ep93xx.o
diff --git a/drivers/soc/cirrus/soc-ep93xx.c b/drivers/soc/cirrus/soc-ep93xx.c
new file mode 100644
index 000000000000..82c176e288cc
--- /dev/null
+++ b/drivers/soc/cirrus/soc-ep93xx.c
@@ -0,0 +1,247 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * SoC driver for Cirrus EP93xx chips.
+ * Copyright (C) 2022 Nikita Shubin <nikita.shubin@maquefel.me>
+ *
+ * Based on a rewrite of arch/arm/mach-ep93xx/core.c
+ * Copyright (C) 2006 Lennert Buytenhek <buytenh@wantstofly.org>
+ * Copyright (C) 2007 Herbert Valerio Riedel <hvr@gnu.org>
+ *
+ * Thanks go to Michael Burian and Ray Lehtiniemi for their key
+ * role in the ep93xx Linux community
+ */
+
+#include <linux/bits.h>
+#include <linux/init.h>
+#include <linux/mfd/syscon.h>
+#include <linux/of.h>
+#include <linux/of_fdt.h>
+#include <linux/platform_device.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+#include <linux/sys_soc.h>
+
+#include <linux/soc/cirrus/ep93xx.h>
+
+#define EP93XX_SYSCON_DEVCFG		0x80
+
+#define EP93XX_SWLOCK_MAGICK		0xaa
+#define EP93XX_SYSCON_SWLOCK		0xc0
+#define EP93XX_SYSCON_SYSCFG		0x9c
+#define EP93XX_SYSCON_SYSCFG_REV_MASK	GENMASK(31, 28)
+#define EP93XX_SYSCON_SYSCFG_REV_SHIFT	28
+
+struct ep93xx_map_info {
+	spinlock_t lock;
+	void __iomem *base;
+	struct regmap *map;
+};
+
+/*
+ * EP93xx System Controller software locked register write
+ *
+ * Logic safeguards are included to condition the control signals for
+ * power connection to the matrix to prevent part damage. In addition, a
+ * software lock register is included that must be written with 0xAA
+ * before each register write to change the values of the four switch
+ * matrix control registers.
+ */
+static void ep93xx_regmap_write(struct regmap *map, spinlock_t *lock,
+				 unsigned int reg, unsigned int val)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(lock, flags);
+
+	regmap_write(map, EP93XX_SYSCON_SWLOCK, EP93XX_SWLOCK_MAGICK);
+	regmap_write(map, reg, val);
+
+	spin_unlock_irqrestore(lock, flags);
+}
+
+static void ep93xx_regmap_update_bits(struct regmap *map, spinlock_t *lock,
+				      unsigned int reg, unsigned int mask,
+				      unsigned int val)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(lock, flags);
+
+	regmap_write(map, EP93XX_SYSCON_SWLOCK, EP93XX_SWLOCK_MAGICK);
+	/* force write is required to clear swlock if is no changes are made */
+	regmap_update_bits_base(map, reg, mask, val, NULL, false, true);
+
+	spin_unlock_irqrestore(lock, flags);
+}
+
+static void ep93xx_unregister_adev(void *_adev)
+{
+	struct auxiliary_device *adev = _adev;
+
+	auxiliary_device_delete(adev);
+	auxiliary_device_uninit(adev);
+}
+
+static void ep93xx_adev_release(struct device *dev)
+{
+	struct auxiliary_device *adev = to_auxiliary_dev(dev);
+
+	kfree(adev);
+}
+
+static struct auxiliary_device *ep93xx_adev_alloc(struct device *parent, const char *name,
+						  struct ep93xx_map_info *info)
+{
+	struct ep93xx_regmap_adev *rdev;
+	struct auxiliary_device *adev;
+	int ret;
+
+	rdev = kzalloc(sizeof(*rdev), GFP_KERNEL);
+	if (!rdev)
+		return ERR_PTR(-ENOMEM);
+
+	rdev->map = info->map;
+	rdev->base = info->base;
+	rdev->lock = &info->lock;
+	rdev->write = ep93xx_regmap_write;
+	rdev->update_bits = ep93xx_regmap_update_bits;
+
+	adev = &rdev->adev;
+	adev->name = name;
+	adev->dev.parent = parent;
+	adev->dev.release = ep93xx_adev_release;
+
+	ret = auxiliary_device_init(adev);
+	if (ret) {
+		kfree(adev);
+		return ERR_PTR(ret);
+	}
+
+	return adev;
+}
+
+static int ep93xx_controller_register(struct device *parent, const char *name,
+				      struct ep93xx_map_info *info)
+{
+	struct auxiliary_device *adev;
+	int ret;
+
+	adev = ep93xx_adev_alloc(parent, name, info);
+	if (IS_ERR(adev))
+		return PTR_ERR(adev);
+
+	ret = auxiliary_device_add(adev);
+	if (ret) {
+		auxiliary_device_uninit(adev);
+		return ret;
+	}
+
+	return devm_add_action_or_reset(parent, ep93xx_unregister_adev, adev);
+}
+
+static unsigned int __init ep93xx_soc_revision(struct regmap *map)
+{
+	unsigned int val;
+
+	regmap_read(map, EP93XX_SYSCON_SYSCFG, &val);
+	val &= EP93XX_SYSCON_SYSCFG_REV_MASK;
+	val >>= EP93XX_SYSCON_SYSCFG_REV_SHIFT;
+	return val;
+}
+
+static const char __init *ep93xx_get_soc_rev(struct regmap *map)
+{
+	switch (ep93xx_soc_revision(map)) {
+	case EP93XX_CHIP_REV_D0:
+		return "D0";
+	case EP93XX_CHIP_REV_D1:
+		return "D1";
+	case EP93XX_CHIP_REV_E0:
+		return "E0";
+	case EP93XX_CHIP_REV_E1:
+		return "E1";
+	case EP93XX_CHIP_REV_E2:
+		return "E2";
+	default:
+		return "unknown";
+	}
+}
+
+const char *pinctrl_names[] = {
+	"pinctrl-ep9301",	/* EP93XX_9301_SOC */
+	"pinctrl-ep9307",	/* EP93XX_9307_SOC */
+	"pinctrl-ep9312",	/* EP93XX_9312_SOC */
+};
+
+static int __init ep93xx_syscon_probe(struct platform_device *pdev)
+{
+	enum ep93xx_soc_model model = (int)(uintptr_t)of_device_get_match_data(&pdev->dev);
+	struct ep93xx_map_info *map_info;
+	struct soc_device_attribute *attrs;
+	struct soc_device *soc_dev;
+	struct device *dev = &pdev->dev;
+	struct regmap *map;
+	void __iomem *base;
+	int ret;
+
+	map = device_node_to_regmap(dev->of_node);
+	if (IS_ERR(map))
+		return PTR_ERR(map);
+
+	base = devm_platform_ioremap_resource(pdev, 0);
+	if (IS_ERR(base))
+		return PTR_ERR(base);
+
+	attrs = devm_kzalloc(dev, sizeof(*attrs), GFP_KERNEL);
+	if (!attrs)
+		return -ENOMEM;
+
+	attrs->machine = of_flat_dt_get_machine_name();
+	attrs->family = "Cirrus Logic EP93xx";
+	attrs->revision = ep93xx_get_soc_rev(map);
+
+	soc_dev = soc_device_register(attrs);
+	if (IS_ERR(soc_dev))
+		return PTR_ERR(soc_dev);
+
+	map_info = devm_kzalloc(dev, sizeof(*map_info), GFP_KERNEL);
+	if (!map_info)
+		return -ENOMEM;
+
+	spin_lock_init(&map_info->lock);
+	map_info->map = map;
+	map_info->base = base;
+
+	ret = ep93xx_controller_register(dev, pinctrl_names[model], map_info);
+	if (ret)
+		dev_err(dev, "registering pinctrl controller failed\n");
+
+	ret = ep93xx_controller_register(dev, "clk-ep93xx", map_info);
+	if (ret)
+		dev_err(dev, "registering clock controller failed\n");
+
+	ret = ep93xx_controller_register(dev, "reset-ep93xx", map_info);
+	if (ret)
+		dev_err(dev, "registering reset controller failed\n");
+
+	dev_info(dev, "EP93xx SoC revision %s\n", attrs->revision);
+
+	return 0;
+}
+
+static const struct of_device_id ep9301_syscon_of_device_ids[] = {
+	{ .compatible	= "cirrus,ep9301-syscon", .data = (void *)EP93XX_9301_SOC },
+	{ .compatible	= "cirrus,ep9302-syscon", .data = (void *)EP93XX_9301_SOC },
+	{ .compatible	= "cirrus,ep9307-syscon", .data = (void *)EP93XX_9307_SOC },
+	{ .compatible	= "cirrus,ep9312-syscon", .data = (void *)EP93XX_9312_SOC },
+	{ .compatible	= "cirrus,ep9315-syscon", .data = (void *)EP93XX_9312_SOC },
+	{ /* sentinel */ }
+};
+
+static struct platform_driver ep9301_syscon_driver = {
+	.driver = {
+		.name = "ep9301-syscon",
+		.of_match_table = ep9301_syscon_of_device_ids,
+	},
+};
+builtin_platform_driver_probe(ep9301_syscon_driver, ep93xx_syscon_probe);

-- 
2.41.0


  parent reply	other threads:[~2023-12-12  8:22 UTC|newest]

Thread overview: 146+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-12-12  8:20 [PATCH v6 00/40] ep93xx device tree conversion Nikita Shubin via B4 Relay
2023-12-12  8:20 ` Nikita Shubin
2023-12-12  8:20 ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 01/40] ARM: ep93xx: Add terminator to gpiod_lookup_table Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-13 17:24   ` Andy Shevchenko
2023-12-13 17:24     ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 02/40] gpio: ep93xx: split device in multiple Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 03/40] ARM: ep93xx: add regmap aux_dev Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:28   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 04/40] clk: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:42   ` Andy Shevchenko
2023-12-23  8:35     ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 05/40] pinctrl: add a Cirrus ep93xx SoC pin controller Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:51   ` Andy Shevchenko
2023-12-23  8:55     ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 06/40] power: reset: Add a driver for the ep93xx reset Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:54   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 07/40] dt-bindings: soc: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13  6:53   ` Krzysztof Kozlowski
2023-12-12  8:20 ` Nikita Shubin via B4 Relay [this message]
2023-12-12  8:20   ` [PATCH v6 08/40] soc: Add SoC driver for Cirrus ep93xx Nikita Shubin
2023-12-13 18:37   ` Andy Shevchenko
2023-12-23 10:06     ` Nikita Shubin
2023-12-23 11:32       ` Arnd Bergmann
2023-12-12  8:20 ` [PATCH v6 09/40] dt-bindings: dma: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 10/40] dma: cirrus: Convert to DT for " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:28   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 11/40] dt-bindings: watchdog: Add Cirrus EP93x Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 12/40] watchdog: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:56   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 13/40] dt-bindings: pwm: Add " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 14/40] pwm: ep93xx: add DT support for " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 17:56   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 15/40] dt-bindings: spi: Add " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 16/40] spi: ep93xx: add DT support for " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:13   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 17/40] dt-bindings: net: Add " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 18/40] net: cirrus: add DT support for " Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:39   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 19/40] dt-bindings: mtd: Add ts7200 nand-controller Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 20/40] mtd: rawnand: add support for ts72xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:30   ` Greg Kroah-Hartman
2023-12-12  8:30     ` Greg Kroah-Hartman
2023-12-12  8:35     ` Nikita Shubin
2023-12-12  8:35       ` Nikita Shubin
2023-12-12 14:05       ` Miquel Raynal
2023-12-12 14:05         ` Miquel Raynal
2023-12-15 10:16   ` Miquel Raynal
2023-12-15 10:16     ` Miquel Raynal
2023-12-15 12:11     ` Nikita Shubin
2023-12-15 12:11       ` Nikita Shubin
2023-12-15 12:27       ` Miquel Raynal
2023-12-15 12:27         ` Miquel Raynal
2023-12-12  8:20 ` [PATCH v6 21/40] dt-bindings: ata: Add Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 22/40] ata: pata_ep93xx: add device tree support Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:19   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 23/40] dt-bindings: input: Add Cirrus EP93xx keypad Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 24/40] input: keypad: ep93xx: add DT support for Cirrus EP93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-13 18:41   ` Andy Shevchenko
2023-12-13 18:41     ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 25/40] dt-bindings: wdt: Add ts72xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12 15:03   ` Guenter Roeck
2023-12-12  8:20 ` [PATCH v6 26/40] wdt: ts72xx: add DT support for ts72xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:10   ` Andy Shevchenko
2023-12-12  8:20 ` [PATCH v6 27/40] gpio: ep93xx: add DT support for gpio-ep93xx Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 28/40] ASoC: dt-bindings: ep93xx: Document DMA support Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 29/40] ASoC: dt-bindings: ep93xx: Document Audio Port support Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 30/40] ASoC: ep93xx: Drop legacy DMA support Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 31/40] ARM: dts: add Cirrus EP93XX SoC .dtsi Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 32/40] ARM: dts: ep93xx: add ts7250 board Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 33/40] ARM: dts: ep93xx: Add EDB9302 DT Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 34/40] ARM: ep93xx: DT for the Cirrus ep93xx SoC platforms Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 35/40] pwm: ep93xx: drop legacy pinctrl Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 36/40] ata: pata_ep93xx: remove legacy pinctrl use Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-13 18:16   ` Andy Shevchenko
2023-12-13 18:16     ` Andy Shevchenko
2023-12-13 18:33     ` Uwe Kleine-König
2023-12-13 18:33       ` Uwe Kleine-König
2023-12-13 18:48       ` Andy Shevchenko
2023-12-13 18:48         ` Andy Shevchenko
2023-12-14 10:26         ` Uwe Kleine-König
2023-12-14 10:26           ` Uwe Kleine-König
2023-12-12  8:20 ` [PATCH v6 37/40] ARM: ep93xx: delete all boardfiles Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 38/40] ARM: ep93xx: soc: drop defines Nikita Shubin
2023-12-12  8:20   ` Nikita Shubin via B4 Relay
2023-12-12  8:20 ` [PATCH v6 39/40] ASoC: cirrus: edb93xx: Delete driver Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-12  8:20 ` [PATCH v6 40/40] dma: cirrus: remove platform code Nikita Shubin via B4 Relay
2023-12-12  8:20   ` Nikita Shubin
2023-12-13 18:30   ` Andy Shevchenko
2023-12-23  9:49     ` Nikita Shubin
2023-12-12 11:53 ` [PATCH v6 00/40] ep93xx device tree conversion Uwe Kleine-König
2023-12-12 11:53   ` Uwe Kleine-König
2023-12-13 17:59 ` Andy Shevchenko
2023-12-13 17:59   ` Andy Shevchenko
2023-12-23  9:12   ` Nikita Shubin
2023-12-23  9:12     ` Nikita Shubin
2023-12-25 19:55     ` Andy Shevchenko
2023-12-25 19:55       ` Andy Shevchenko
2023-12-27 17:40 [PATCH v6 08/40] soc: Add SoC driver for Cirrus ep93xx Andy Shevchenko

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20231212-ep93xx-v6-8-c307b8ac9aa8@maquefel.me \
    --to=devnull+nikita.shubin.maquefel.me@kernel.org \
    --cc=alexander.sverdlin@gmail.com \
    --cc=arnd@arndb.de \
    --cc=conor.dooley@microchip.com \
    --cc=hal.feng@starfivetech.com \
    --cc=j.neuschaefer@gmx.net \
    --cc=joel@jms.id.au \
    --cc=kernel@esmil.dk \
    --cc=lihuisong@huawei.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nikita.shubin@maquefel.me \
    --cc=ulf.hansson@linaro.org \
    --cc=walker.chen@starfivetech.com \
    --cc=xuwei5@hisilicon.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.