Re: [PATCH v5 03/10] reset: Add Realtek basic reset support
From: Philipp Zabel <p.zabel@pengutronix.de>
Date: 2026-03-25 17:21:57
Also in:
linux-arm-kernel, linux-clk, lkml
On Di, 2026-03-24 at 10:53 +0800, Yu-Chun Lin wrote:
quoted hunk ↗ jump to hunk
From: Cheng-Yu Lee <redacted> Define the reset operations backed by a regmap-based register interface and prepare the reset controller to be registered through the reset framework. Signed-off-by: Cheng-Yu Lee <redacted> Co-developed-by: Yu-Chun Lin <eleanor.lin@realtek.com> Signed-off-by: Yu-Chun Lin <eleanor.lin@realtek.com> --- Changes in v5: - Created drivers/reset/realtek/ directory and include/linux/reset/realtek.h. - Extracted the common reset helpers: - Moved the source code to drivers/reset/realtek/common.c and - the header to include/linux/reset/realtek.h - Renamed rtk_reset_bank to rtk_reset_desc. - Added 'bits' member to rtk_reset_desc structure. - Removed rtk_reset_get_id() and rtk_reset_get_bank() helper. - Introduced rtk_reset_get_desc(). --- MAINTAINERS | 1 + drivers/reset/Kconfig | 1 + drivers/reset/Makefile | 1 + drivers/reset/realtek/Kconfig | 3 ++ drivers/reset/realtek/Makefile | 2 + drivers/reset/realtek/common.c | 91 ++++++++++++++++++++++++++++++++++ include/linux/reset/realtek.h | 25 ++++++++++ 7 files changed, 124 insertions(+) create mode 100644 drivers/reset/realtek/Kconfig create mode 100644 drivers/reset/realtek/Makefile create mode 100644 drivers/reset/realtek/common.c create mode 100644 include/linux/reset/realtek.hdiff --git a/MAINTAINERS b/MAINTAINERS index 721356d4c02c..9419b0497e0b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS@@ -22229,6 +22229,7 @@ L: devicetree@vger.kernel.org L: linux-clk@vger.kernel.org S: Supported F: Documentation/devicetree/bindings/clock/realtek* +F: drivers/reset/realtek/* F: include/dt-bindings/clock/realtek* REALTEK SPI-NANDdiff --git a/drivers/reset/Kconfig b/drivers/reset/Kconfig index 7ce151f6a7e4..03be1931f264 100644 --- a/drivers/reset/Kconfig +++ b/drivers/reset/Kconfig@@ -398,6 +398,7 @@ config RESET_ZYNQMP source "drivers/reset/amlogic/Kconfig" source "drivers/reset/hisilicon/Kconfig" +source "drivers/reset/realtek/Kconfig" source "drivers/reset/spacemit/Kconfig" source "drivers/reset/starfive/Kconfig" source "drivers/reset/sti/Kconfig"diff --git a/drivers/reset/Makefile b/drivers/reset/Makefile index fc0cc99f8514..4407d1630070 100644 --- a/drivers/reset/Makefile +++ b/drivers/reset/Makefile@@ -2,6 +2,7 @@ obj-y += core.o obj-y += amlogic/ obj-y += hisilicon/ +obj-y += realtek/ obj-y += spacemit/ obj-y += starfive/ obj-y += sti/diff --git a/drivers/reset/realtek/Kconfig b/drivers/reset/realtek/Kconfig new file mode 100644 index 000000000000..99a14d355803 --- /dev/null +++ b/drivers/reset/realtek/Kconfig@@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only +config RESET_RTK_COMMON + booldiff --git a/drivers/reset/realtek/Makefile b/drivers/reset/realtek/Makefile new file mode 100644 index 000000000000..b59a3f7f2453 --- /dev/null +++ b/drivers/reset/realtek/Makefile@@ -0,0 +1,2 @@ +# SPDX-License-Identifier: GPL-2.0-only +obj-$(CONFIG_RESET_RTK_COMMON) += common.odiff --git a/drivers/reset/realtek/common.c b/drivers/reset/realtek/common.c new file mode 100644 index 000000000000..b9e3219dc8f7 --- /dev/null +++ b/drivers/reset/realtek/common.c@@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2019 Realtek Semiconductor Corporation + */ + +#include <linux/device.h> +#include <linux/of.h> +#include <linux/regmap.h> +#include <linux/reset-controller.h> +#include <linux/reset/realtek.h> + +struct rtk_reset_data { + struct reset_controller_dev rcdev; + struct rtk_reset_desc *descs; + struct regmap *regmap; +}; + +static inline struct rtk_reset_data *to_rtk_reset_controller(struct reset_controller_dev *r) +{ + return container_of(r, struct rtk_reset_data, rcdev); +} + +static inline struct rtk_reset_desc *rtk_reset_get_desc(struct rtk_reset_data *data, + unsigned long idx) +{ + return &data->descs[idx]; +} + +static int rtk_reset_assert(struct reset_controller_dev *rcdev, + unsigned long idx) +{ + struct rtk_reset_data *data = to_rtk_reset_controller(rcdev); + struct rtk_reset_desc *desc = rtk_reset_get_desc(data, idx); + u32 mask = desc->write_en ? (0x3 << desc->bit) : BIT(desc->bit); + u32 val = desc->write_en ? (0x2 << desc->bit) : 0; + + return regmap_update_bits(data->regmap, desc->ofs, mask, val); +} + +static int rtk_reset_deassert(struct reset_controller_dev *rcdev, + unsigned long idx) +{ + struct rtk_reset_data *data = to_rtk_reset_controller(rcdev); + struct rtk_reset_desc *desc = rtk_reset_get_desc(data, idx); + u32 mask = desc->write_en ? (0x3 << desc->bit) : BIT(desc->bit); + u32 val = mask; + + return regmap_update_bits(data->regmap, desc->ofs, mask, val); +} + +static int rtk_reset_status(struct reset_controller_dev *rcdev, + unsigned long idx) +{ + struct rtk_reset_data *data = to_rtk_reset_controller(rcdev); + struct rtk_reset_desc *desc = rtk_reset_get_desc(data, idx); + u32 val; + int ret; + + ret = regmap_read(data->regmap, desc->ofs, &val); + if (ret) + return ret; + + return !((val >> desc->bit) & 1); +} + +static const struct reset_control_ops rtk_reset_ops = { + .assert = rtk_reset_assert, + .deassert = rtk_reset_deassert, + .status = rtk_reset_status, +}; + +int rtk_reset_controller_add(struct device *dev, + struct rtk_reset_initdata *initdata) +{ + struct rtk_reset_data *data; + + data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL); + if (!data) + return -ENOMEM; + + data->regmap = initdata->regmap; + data->descs = initdata->descs; + data->rcdev.owner = THIS_MODULE; + data->rcdev.ops = &rtk_reset_ops; + data->rcdev.dev = dev; + data->rcdev.of_node = dev->of_node; + data->rcdev.nr_resets = initdata->num_descs; + + return devm_reset_controller_register(dev, &data->rcdev); +} +EXPORT_SYMBOL_GPL(rtk_reset_controller_add);
Please implement this as an auxiliary device driver. Move the rtk_reset_initdata definitions in here and select them based on either auxiliary_device_id (see imx8mp-audiomix or spacemit) or of_device_id (see eyeq). The regmap can be retrieved from the parent (clk device) via dev_get_regmap (see imx8mp-audiomix).
quoted hunk ↗ jump to hunk
diff --git a/include/linux/reset/realtek.h b/include/linux/reset/realtek.h new file mode 100644 index 000000000000..3c2226e3ed26 --- /dev/null +++ b/include/linux/reset/realtek.h@@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#ifndef __LINUX_RESET_REALTEK_H__ +#define __LINUX_RESET_REALTEK_H__ + +#include <linux/types.h> + +struct device; +struct regmap; + +struct rtk_reset_desc { + u32 ofs; + u32 bit; + u32 write_en; +}; + +struct rtk_reset_initdata { + struct rtk_reset_desc *descs; + u32 num_descs; + struct regmap *regmap; +}; + +int rtk_reset_controller_add(struct device *dev, + struct rtk_reset_initdata *initdata); + +#endif /* __LINUX_RESET_REALTEK_H__ */
With the above suggested changes, this header is not necessary. regards Philipp