* [PATCH v2 0/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP @ 2025-08-26 16:37 Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter ` (2 more replies) 0 siblings, 3 replies; 9+ messages in thread From: Dan Carpenter @ 2025-08-26 16:37 UTC (permalink / raw) To: Chester Lin Cc: Ciprian Costea, Conor Dooley, devicetree, Fabio Estevam, Ghennadi Procopciuc, imx, Krzysztof Kozlowski, linux-arm-kernel, linux-kernel, Matthias Brugger, NXP S32 Linux Team, Pengutronix Kernel Team, Rob Herring, Sascha Hauer, Shawn Guo, Srinivas Kandagatla, linaro-s32 This driver provides a way to access the On Chip One-Time Programmable Controller (OCOTP) on the s32g chipset. There are three versions of this chip but they're compatible. v2: I have fixed everything that people pointed out about version 1. Sorry, Rob and Krzysztof, for the problems with the device tree YAML file. I had an issue with my dtschema installation and it's fixed now. I also screwed up the From headers in v1. I called git format-patch without passing the --from argument. I've fixed my scripts so that won't happen again. I also messed up the Signed-off by lines in patch 1 and 2. Sorry! My other mistakes were from not being a familiar enough with the subsystem and those are addressed as well. Especially re-writing the driver using keepouts cut down a lot of lines of code. I've tested it and the results are the same before and after. Ciprian Costea (2): dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter (1): arm64: dts: s32g: Add device tree information for the OCOTP driver .../bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml | 45 ++++++++ arch/arm64/boot/dts/freescale/s32g2.dtsi | 7 ++ arch/arm64/boot/dts/freescale/s32g3.dtsi | 7 ++ drivers/nvmem/Kconfig | 10 ++ drivers/nvmem/Makefile | 2 + drivers/nvmem/s32g-ocotp-nvmem.c | 101 ++++++++++++++++++ 6 files changed, 172 insertions(+) create mode 100644 Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml create mode 100644 drivers/nvmem/s32g-ocotp-nvmem.c -- 2.47.2 ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file 2025-08-26 16:37 [PATCH v2 0/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter @ 2025-08-26 16:38 ` Dan Carpenter 2025-08-27 16:27 ` Frank Li 2025-08-27 17:26 ` Conor Dooley 2025-08-26 16:38 ` [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver Dan Carpenter 2 siblings, 2 replies; 9+ messages in thread From: Dan Carpenter @ 2025-08-26 16:38 UTC (permalink / raw) To: Srinivas Kandagatla Cc: Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ciprian Costea, devicetree, linux-kernel, NXP S32 Linux Team, linaro-s32 From: Ciprian Costea <ciprianmarian.costea@nxp.com> Add bindings to expose the On Chip One-Time Programmable Controller (OCOTP) for the NXP s32g chipset. There are three versions of this chip but they're compatible so we can fall back to the nxp,s32g2-ocotp compatible. Signed-off-by: Ciprian Costea <ciprianmarian.costea@nxp.com> Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> --- v2: dt_binding_check DT_SCHEMA_FILES=nxp,s32g-ocotp-nvmem.yaml is clean make CHECK_DTBS=y freescale/*.dtb is clean. Particularly the freescale/s32g274a-evb.dtb file which Rob mentioned. remove bogus include file remove redundant "reg" description remove #address-cells and #size-cells since they are already in nvmem.yaml Fix email From header .../bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml diff --git a/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml new file mode 100644 index 000000000000..01adc6093c68 --- /dev/null +++ b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/nvmem/nxp,s32g-ocotp-nvmem.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: NXP S32G OCOTP NVMEM driver + +maintainers: + - Ciprian Costea <ciprianmarian.costea@nxp.com> + +description: | + The drivers provides an interface to access One Time + Programmable memory pages, such as TMU fuse values. + +allOf: + - $ref: nvmem.yaml# + +properties: + compatible: + oneOf: + - enum: + - nxp,s32g2-ocotp + - items: + - enum: + - nxp,s32r45-ocotp + - nxp,s32g3-ocotp + - const: nxp,s32g2-ocotp + reg: + maxItems: 1 + +required: + - compatible + - reg + +unevaluatedProperties: false + +examples: + - | + ocotp: nvmem@400a4000 { + compatible = "nxp,s32g2-ocotp"; + reg = <0x400a4000 0x400>; + #address-cells = <1>; + #size-cells = <1>; + }; -- 2.47.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter @ 2025-08-27 16:27 ` Frank Li 2025-08-27 17:26 ` Conor Dooley 1 sibling, 0 replies; 9+ messages in thread From: Frank Li @ 2025-08-27 16:27 UTC (permalink / raw) To: Dan Carpenter Cc: Srinivas Kandagatla, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ciprian Costea, devicetree, linux-kernel, NXP S32 Linux Team, linaro-s32 On Tue, Aug 26, 2025 at 07:38:03PM +0300, Dan Carpenter wrote: > From: Ciprian Costea <ciprianmarian.costea@nxp.com> > > Add bindings to expose the On Chip One-Time Programmable Controller > (OCOTP) for the NXP s32g chipset. There are three versions of this > chip but they're compatible so we can fall back to the nxp,s32g2-ocotp > compatible. > > Signed-off-by: Ciprian Costea <ciprianmarian.costea@nxp.com> > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > v2: dt_binding_check DT_SCHEMA_FILES=nxp,s32g-ocotp-nvmem.yaml is clean > make CHECK_DTBS=y freescale/*.dtb is clean. Particularly the > freescale/s32g274a-evb.dtb file which Rob mentioned. > remove bogus include file > remove redundant "reg" description > remove #address-cells and #size-cells since they are already in > nvmem.yaml > Fix email From header > > .../bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml | 45 +++++++++++++++++++ > 1 file changed, 45 insertions(+) > create mode 100644 Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > > diff --git a/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > new file mode 100644 > index 000000000000..01adc6093c68 > --- /dev/null > +++ b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > @@ -0,0 +1,45 @@ > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/nvmem/nxp,s32g-ocotp-nvmem.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: NXP S32G OCOTP NVMEM driver > + > +maintainers: > + - Ciprian Costea <ciprianmarian.costea@nxp.com> > + > +description: | Needn't | https://yaml.org/spec/1.2.2/#scalars show "|" ">" "" 's difference. > + The drivers provides an interface to access One Time > + Programmable memory pages, such as TMU fuse values. > + > +allOf: > + - $ref: nvmem.yaml# Move just before examples in case need if-else later. > + > +properties: > + compatible: > + oneOf: > + - enum: > + - nxp,s32g2-ocotp > + - items: > + - enum: > + - nxp,s32r45-ocotp > + - nxp,s32g3-ocotp Keep alphabet order for enum Frank > + - const: nxp,s32g2-ocotp > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +unevaluatedProperties: false > + > +examples: > + - | > + ocotp: nvmem@400a4000 { > + compatible = "nxp,s32g2-ocotp"; > + reg = <0x400a4000 0x400>; > + #address-cells = <1>; > + #size-cells = <1>; > + }; > -- > 2.47.2 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter 2025-08-27 16:27 ` Frank Li @ 2025-08-27 17:26 ` Conor Dooley 1 sibling, 0 replies; 9+ messages in thread From: Conor Dooley @ 2025-08-27 17:26 UTC (permalink / raw) To: Dan Carpenter Cc: Srinivas Kandagatla, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Ciprian Costea, devicetree, linux-kernel, NXP S32 Linux Team, linaro-s32 [-- Attachment #1: Type: text/plain, Size: 2500 bytes --] On Tue, Aug 26, 2025 at 07:38:03PM +0300, Dan Carpenter wrote: > From: Ciprian Costea <ciprianmarian.costea@nxp.com> > > Add bindings to expose the On Chip One-Time Programmable Controller > (OCOTP) for the NXP s32g chipset. There are three versions of this > chip but they're compatible so we can fall back to the nxp,s32g2-ocotp > compatible. > > Signed-off-by: Ciprian Costea <ciprianmarian.costea@nxp.com> > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > v2: dt_binding_check DT_SCHEMA_FILES=nxp,s32g-ocotp-nvmem.yaml is clean > make CHECK_DTBS=y freescale/*.dtb is clean. Particularly the > freescale/s32g274a-evb.dtb file which Rob mentioned. > remove bogus include file > remove redundant "reg" description > remove #address-cells and #size-cells since they are already in > nvmem.yaml > Fix email From header > > .../bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml | 45 +++++++++++++++++++ > 1 file changed, 45 insertions(+) > create mode 100644 Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > > diff --git a/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > new file mode 100644 > index 000000000000..01adc6093c68 > --- /dev/null > +++ b/Documentation/devicetree/bindings/nvmem/nxp,s32g-ocotp-nvmem.yaml > @@ -0,0 +1,45 @@ > +# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause) > +%YAML 1.2 > +--- > +$id: http://devicetree.org/schemas/nvmem/nxp,s32g-ocotp-nvmem.yaml# > +$schema: http://devicetree.org/meta-schemas/core.yaml# > + > +title: NXP S32G OCOTP NVMEM driver > + > +maintainers: > + - Ciprian Costea <ciprianmarian.costea@nxp.com> > + > +description: | > + The drivers provides an interface to access One Time > + Programmable memory pages, such as TMU fuse values. > + > +allOf: > + - $ref: nvmem.yaml# > + > +properties: > + compatible: > + oneOf: > + - enum: > + - nxp,s32g2-ocotp > + - items: > + - enum: > + - nxp,s32r45-ocotp > + - nxp,s32g3-ocotp > + - const: nxp,s32g2-ocotp > + reg: > + maxItems: 1 > + > +required: > + - compatible > + - reg > + > +unevaluatedProperties: false > + > +examples: > + - | > + ocotp: nvmem@400a4000 { If you respin, drop the "ocotp" label, since the example doesn't use it. Reviewed-by: Conor Dooley <conor.dooley@microchip.com> [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 228 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP 2025-08-26 16:37 [PATCH v2 0/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter @ 2025-08-26 16:38 ` Dan Carpenter 2025-08-27 16:34 ` Frank Li 2025-08-26 16:38 ` [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver Dan Carpenter 2 siblings, 1 reply; 9+ messages in thread From: Dan Carpenter @ 2025-08-26 16:38 UTC (permalink / raw) To: Srinivas Kandagatla Cc: NXP S32 Linux Team, linaro-s32, linux-kernel, Krzysztof Kozlowski From: Ciprian Costea <ciprianmarian.costea@nxp.com> Provide access to the On Chip One-Time Programmable Controller (OCOTP) pages on the NXP S32G platform. Signed-off-by: Ciprian Costea <ciprianmarian.costea@nxp.com> Co-developed-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com> Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com> Co-developed-by: Larisa Grigore <larisa.grigore@nxp.com> Signed-off-by: Larisa Grigore <larisa.grigore@nxp.com> Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> --- v2: Add S-o-b tags for Ghennadi and Larisa. Use keepouts instead of the s32g_map[] table. This allows a bunch of code to be deleted. Version 1 only let one word (S32G_OCOTP_WORD_SIZE or 4) to be read at a time, but now the driver allows larger reads. Set the .word_size in s32g_ocotp_nvmem_config to be 4 instead. Krzysztof asked for some changes in the probe() function but that code was deleted instead. drivers/nvmem/Kconfig | 10 +++ drivers/nvmem/Makefile | 2 + drivers/nvmem/s32g-ocotp-nvmem.c | 101 +++++++++++++++++++++++++++++++ 3 files changed, 113 insertions(+) create mode 100644 drivers/nvmem/s32g-ocotp-nvmem.c diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig index 0bdd86d74f62..55016f803492 100644 --- a/drivers/nvmem/Kconfig +++ b/drivers/nvmem/Kconfig @@ -240,6 +240,16 @@ config NVMEM_NINTENDO_OTP This driver can also be built as a module. If so, the module will be called nvmem-nintendo-otp. +config NVMEM_S32G_OCOTP + tristate "S32G SoC OCOTP support" + depends on ARCH_S32 + help + This is a driver for the 'OCOTP' peripheral available on S32G + platforms. + + If you say Y here, you will get support for the One Time + Programmable memory pages. + config NVMEM_QCOM_QFPROM tristate "QCOM QFPROM Support" depends on ARCH_QCOM || COMPILE_TEST diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile index 84fef48b7ff6..e01bb4ad612a 100644 --- a/drivers/nvmem/Makefile +++ b/drivers/nvmem/Makefile @@ -79,6 +79,8 @@ obj-$(CONFIG_NVMEM_SUNPLUS_OCOTP) += nvmem_sunplus_ocotp.o nvmem_sunplus_ocotp-y := sunplus-ocotp.o obj-$(CONFIG_NVMEM_SUNXI_SID) += nvmem_sunxi_sid.o nvmem_sunxi_sid-y := sunxi_sid.o +obj-$(CONFIG_NVMEM_S32G_OCOTP) += nvmem-s32g-ocotp-nvmem.o +nvmem-s32g-ocotp-nvmem-y := s32g-ocotp-nvmem.o obj-$(CONFIG_NVMEM_U_BOOT_ENV) += nvmem_u-boot-env.o nvmem_u-boot-env-y := u-boot-env.o obj-$(CONFIG_NVMEM_UNIPHIER_EFUSE) += nvmem-uniphier-efuse.o diff --git a/drivers/nvmem/s32g-ocotp-nvmem.c b/drivers/nvmem/s32g-ocotp-nvmem.c new file mode 100644 index 000000000000..dce092c0fc52 --- /dev/null +++ b/drivers/nvmem/s32g-ocotp-nvmem.c @@ -0,0 +1,101 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright 2023-2025 NXP + */ + +#include <linux/device.h> +#include <linux/io.h> +#include <linux/module.h> +#include <linux/nvmem-provider.h> +#include <linux/of.h> +#include <linux/of_device.h> +#include <linux/platform_device.h> + +struct s32g_ocotp_priv { + struct device *dev; + void __iomem *base; +}; + +static int s32g_ocotp_read(void *context, unsigned int offset, + void *val, size_t bytes) +{ + struct s32g_ocotp_priv *s32g_data = context; + u32 *dst = val; + + while (bytes >= sizeof(u32)) { + *dst++ = ioread32(s32g_data->base + offset); + + bytes -= sizeof(u32); + offset += sizeof(u32); + } + + return 0; +} + +static struct nvmem_keepout s32g_keepouts[] = { + { .start = 0, .end = 520 }, + { .start = 540, .end = 564 }, + { .start = 596, .end = 664 }, + { .start = 668, .end = 676 }, + { .start = 684, .end = 732 }, + { .start = 744, .end = 864 }, + { .start = 908, .end = 924 }, + { .start = 928, .end = 936 }, + { .start = 948, .end = 964 }, + { .start = 968, .end = 976 }, + { .start = 984, .end = 1012 }, +}; + +static struct nvmem_config s32g_ocotp_nvmem_config = { + .name = "s32g-ocotp", + .add_legacy_fixed_of_cells = true, + .read_only = true, + .word_size = 4, + .reg_read = s32g_ocotp_read, + .keepout = s32g_keepouts, + .nkeepout = ARRAY_SIZE(s32g_keepouts), +}; + +static const struct of_device_id ocotp_of_match[] = { + { .compatible = "nxp,s32g2-ocotp" }, + { /* sentinel */ } +}; + +static int s32g_ocotp_probe(struct platform_device *pdev) +{ + struct s32g_ocotp_priv *s32g_data; + struct device *dev = &pdev->dev; + struct nvmem_device *nvmem; + struct resource *res; + + s32g_data = devm_kzalloc(dev, sizeof(*s32g_data), GFP_KERNEL); + if (!s32g_data) + return -ENOMEM; + + s32g_data->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); + if (IS_ERR(s32g_data->base)) { + dev_err(dev, "Cannot map OCOTP device.\n"); + return PTR_ERR(s32g_data->base); + } + + s32g_data->dev = dev; + s32g_ocotp_nvmem_config.dev = dev; + s32g_ocotp_nvmem_config.priv = s32g_data; + s32g_ocotp_nvmem_config.size = resource_size(res); + + nvmem = devm_nvmem_register(dev, &s32g_ocotp_nvmem_config); + + return PTR_ERR_OR_ZERO(nvmem); +} + +static struct platform_driver s32g_ocotp_driver = { + .probe = s32g_ocotp_probe, + .driver = { + .name = "s32g-ocotp", + .of_match_table = ocotp_of_match, + }, +}; +module_platform_driver(s32g_ocotp_driver); +MODULE_AUTHOR("NXP"); +MODULE_DESCRIPTION("S32G OCOTP driver"); +MODULE_LICENSE("GPL"); -- 2.47.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP 2025-08-26 16:38 ` [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter @ 2025-08-27 16:34 ` Frank Li 2025-09-01 20:35 ` Dan Carpenter 0 siblings, 1 reply; 9+ messages in thread From: Frank Li @ 2025-08-27 16:34 UTC (permalink / raw) To: Dan Carpenter Cc: Srinivas Kandagatla, NXP S32 Linux Team, linaro-s32, linux-kernel, Krzysztof Kozlowski On Tue, Aug 26, 2025 at 07:38:10PM +0300, Dan Carpenter wrote: > From: Ciprian Costea <ciprianmarian.costea@nxp.com> > > Provide access to the On Chip One-Time Programmable Controller (OCOTP) > pages on the NXP S32G platform. > > Signed-off-by: Ciprian Costea <ciprianmarian.costea@nxp.com> > Co-developed-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com> > Signed-off-by: Ghennadi Procopciuc <ghennadi.procopciuc@nxp.com> > Co-developed-by: Larisa Grigore <larisa.grigore@nxp.com> > Signed-off-by: Larisa Grigore <larisa.grigore@nxp.com> > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > v2: Add S-o-b tags for Ghennadi and Larisa. > > Use keepouts instead of the s32g_map[] table. This allows a bunch > of code to be deleted. > > Version 1 only let one word (S32G_OCOTP_WORD_SIZE or 4) to be read > at a time, but now the driver allows larger reads. Set the > .word_size in s32g_ocotp_nvmem_config to be 4 instead. > > Krzysztof asked for some changes in the probe() function but that > code was deleted instead. > > drivers/nvmem/Kconfig | 10 +++ > drivers/nvmem/Makefile | 2 + > drivers/nvmem/s32g-ocotp-nvmem.c | 101 +++++++++++++++++++++++++++++++ > 3 files changed, 113 insertions(+) > create mode 100644 drivers/nvmem/s32g-ocotp-nvmem.c > > diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig > index 0bdd86d74f62..55016f803492 100644 > --- a/drivers/nvmem/Kconfig > +++ b/drivers/nvmem/Kconfig > @@ -240,6 +240,16 @@ config NVMEM_NINTENDO_OTP > This driver can also be built as a module. If so, the module > will be called nvmem-nintendo-otp. > ... > + > +static int s32g_ocotp_read(void *context, unsigned int offset, > + void *val, size_t bytes) > +{ > + struct s32g_ocotp_priv *s32g_data = context; > + u32 *dst = val; > + > + while (bytes >= sizeof(u32)) { > + *dst++ = ioread32(s32g_data->base + offset); > + > + bytes -= sizeof(u32); > + offset += sizeof(u32); > + } readsw() ? > + > + return 0; > +} > + > +static struct nvmem_keepout s32g_keepouts[] = { > + { .start = 0, .end = 520 }, > + { .start = 540, .end = 564 }, > + { .start = 596, .end = 664 }, > + { .start = 668, .end = 676 }, > + { .start = 684, .end = 732 }, > + { .start = 744, .end = 864 }, > + { .start = 908, .end = 924 }, > + { .start = 928, .end = 936 }, > + { .start = 948, .end = 964 }, > + { .start = 968, .end = 976 }, > + { .start = 984, .end = 1012 }, > +}; > + > +static struct nvmem_config s32g_ocotp_nvmem_config = { > + .name = "s32g-ocotp", > + .add_legacy_fixed_of_cells = true, > + .read_only = true, > + .word_size = 4, > + .reg_read = s32g_ocotp_read, > + .keepout = s32g_keepouts, > + .nkeepout = ARRAY_SIZE(s32g_keepouts), > +}; > + > +static const struct of_device_id ocotp_of_match[] = { > + { .compatible = "nxp,s32g2-ocotp" }, > + { /* sentinel */ } > +}; > + > +static int s32g_ocotp_probe(struct platform_device *pdev) > +{ > + struct s32g_ocotp_priv *s32g_data; > + struct device *dev = &pdev->dev; > + struct nvmem_device *nvmem; > + struct resource *res; > + > + s32g_data = devm_kzalloc(dev, sizeof(*s32g_data), GFP_KERNEL); > + if (!s32g_data) > + return -ENOMEM; > + > + s32g_data->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); > + if (IS_ERR(s32g_data->base)) { > + dev_err(dev, "Cannot map OCOTP device.\n"); > + return PTR_ERR(s32g_data->base); return dev_err_probe(dev, PTR_ERR(s32g_data->base), ...) Frank > + } > + > + s32g_data->dev = dev; > + s32g_ocotp_nvmem_config.dev = dev; > + s32g_ocotp_nvmem_config.priv = s32g_data; > + s32g_ocotp_nvmem_config.size = resource_size(res); > + > + nvmem = devm_nvmem_register(dev, &s32g_ocotp_nvmem_config); > + > + return PTR_ERR_OR_ZERO(nvmem); > +} > + > +static struct platform_driver s32g_ocotp_driver = { > + .probe = s32g_ocotp_probe, > + .driver = { > + .name = "s32g-ocotp", > + .of_match_table = ocotp_of_match, > + }, > +}; > +module_platform_driver(s32g_ocotp_driver); > +MODULE_AUTHOR("NXP"); > +MODULE_DESCRIPTION("S32G OCOTP driver"); > +MODULE_LICENSE("GPL"); > -- > 2.47.2 > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP 2025-08-27 16:34 ` Frank Li @ 2025-09-01 20:35 ` Dan Carpenter 0 siblings, 0 replies; 9+ messages in thread From: Dan Carpenter @ 2025-09-01 20:35 UTC (permalink / raw) To: Frank Li Cc: Srinivas Kandagatla, NXP S32 Linux Team, linaro-s32, linux-kernel, Krzysztof Kozlowski On Wed, Aug 27, 2025 at 12:34:11PM -0400, Frank Li wrote: > > +static int s32g_ocotp_read(void *context, unsigned int offset, > > + void *val, size_t bytes) > > +{ > > + struct s32g_ocotp_priv *s32g_data = context; > > + u32 *dst = val; > > + > > + while (bytes >= sizeof(u32)) { > > + *dst++ = ioread32(s32g_data->base + offset); > > + > > + bytes -= sizeof(u32); > > + offset += sizeof(u32); > > + } > > readsw() ? > Hi Frank, I've learned a lot from your reviews. Thanks. :) It would be readsl() since it's a u32. But readsl() doesn't increment the offset, it just reads from the same memory address over and over. I've made all the other changes. regards, dan carpenter ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver 2025-08-26 16:37 [PATCH v2 0/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter @ 2025-08-26 16:38 ` Dan Carpenter 2025-08-26 16:46 ` Frank Li 2 siblings, 1 reply; 9+ messages in thread From: Dan Carpenter @ 2025-08-26 16:38 UTC (permalink / raw) To: Chester Lin Cc: Matthias Brugger, Ghennadi Procopciuc, NXP S32 Linux Team, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-arm-kernel, imx, devicetree, linux-kernel, linaro-s32 Add the device tree information for the S32G On Chip One-Time Programmable Controller (OCOTP) chip. Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> --- v2: change "ocotp: ocotp@400a4000 {" to "ocotp: nvmem@400a4000 {" arch/arm64/boot/dts/freescale/s32g2.dtsi | 7 +++++++ arch/arm64/boot/dts/freescale/s32g3.dtsi | 7 +++++++ 2 files changed, 14 insertions(+) diff --git a/arch/arm64/boot/dts/freescale/s32g2.dtsi b/arch/arm64/boot/dts/freescale/s32g2.dtsi index 6a7cc7b33754..e8cfddabfc24 100644 --- a/arch/arm64/boot/dts/freescale/s32g2.dtsi +++ b/arch/arm64/boot/dts/freescale/s32g2.dtsi @@ -701,5 +701,12 @@ gic: interrupt-controller@50800000 { interrupt-controller; #interrupt-cells = <3>; }; + + ocotp: nvmem@400a4000 { + compatible = "nxp,s32g2-ocotp"; + reg = <0x400a4000 0x400>; + #address-cells = <1>; + #size-cells = <1>; + }; }; }; diff --git a/arch/arm64/boot/dts/freescale/s32g3.dtsi b/arch/arm64/boot/dts/freescale/s32g3.dtsi index 61ee08f0cfdc..8fe1fa35e9ac 100644 --- a/arch/arm64/boot/dts/freescale/s32g3.dtsi +++ b/arch/arm64/boot/dts/freescale/s32g3.dtsi @@ -765,6 +765,13 @@ gic: interrupt-controller@50800000 { <0x50420000 0x2000>; interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; }; + + ocotp: nvmem@400a4000 { + compatible = "nxp,s32g3-ocotp", "nxp,s32g2-ocotp"; + reg = <0x400a4000 0x400>; + #address-cells = <1>; + #size-cells = <1>; + }; }; timer { -- 2.47.2 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver 2025-08-26 16:38 ` [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver Dan Carpenter @ 2025-08-26 16:46 ` Frank Li 0 siblings, 0 replies; 9+ messages in thread From: Frank Li @ 2025-08-26 16:46 UTC (permalink / raw) To: Dan Carpenter Cc: Chester Lin, Matthias Brugger, Ghennadi Procopciuc, NXP S32 Linux Team, Shawn Guo, Sascha Hauer, Pengutronix Kernel Team, Fabio Estevam, Rob Herring, Krzysztof Kozlowski, Conor Dooley, linux-arm-kernel, imx, devicetree, linux-kernel, linaro-s32 On Tue, Aug 26, 2025 at 07:38:15PM +0300, Dan Carpenter wrote: > Add the device tree information for the S32G On Chip One-Time > Programmable Controller (OCOTP) chip. > > Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org> > --- > v2: change "ocotp: ocotp@400a4000 {" to "ocotp: nvmem@400a4000 {" > > arch/arm64/boot/dts/freescale/s32g2.dtsi | 7 +++++++ > arch/arm64/boot/dts/freescale/s32g3.dtsi | 7 +++++++ > 2 files changed, 14 insertions(+) > > diff --git a/arch/arm64/boot/dts/freescale/s32g2.dtsi b/arch/arm64/boot/dts/freescale/s32g2.dtsi > index 6a7cc7b33754..e8cfddabfc24 100644 > --- a/arch/arm64/boot/dts/freescale/s32g2.dtsi > +++ b/arch/arm64/boot/dts/freescale/s32g2.dtsi > @@ -701,5 +701,12 @@ gic: interrupt-controller@50800000 { > interrupt-controller; > #interrupt-cells = <3>; > }; > + > + ocotp: nvmem@400a4000 { > + compatible = "nxp,s32g2-ocotp"; > + reg = <0x400a4000 0x400>; > + #address-cells = <1>; > + #size-cells = <1>; > + }; Please keep order according to address, 0x400a4000 < 0x50800000 Frank Li > }; > }; > diff --git a/arch/arm64/boot/dts/freescale/s32g3.dtsi b/arch/arm64/boot/dts/freescale/s32g3.dtsi > index 61ee08f0cfdc..8fe1fa35e9ac 100644 > --- a/arch/arm64/boot/dts/freescale/s32g3.dtsi > +++ b/arch/arm64/boot/dts/freescale/s32g3.dtsi > @@ -765,6 +765,13 @@ gic: interrupt-controller@50800000 { > <0x50420000 0x2000>; > interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>; > }; > + > + ocotp: nvmem@400a4000 { > + compatible = "nxp,s32g3-ocotp", "nxp,s32g2-ocotp"; > + reg = <0x400a4000 0x400>; > + #address-cells = <1>; > + #size-cells = <1>; > + }; > }; > > timer { > -- > 2.47.2 > ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2025-09-01 20:35 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2025-08-26 16:37 [PATCH v2 0/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 1/3] dt-bindings: nvmem: Add the nxp,s32g-ocotp yaml file Dan Carpenter 2025-08-27 16:27 ` Frank Li 2025-08-27 17:26 ` Conor Dooley 2025-08-26 16:38 ` [PATCH V2 2/3] nvmem: s32g-ocotp: Add driver for S32G OCOTP Dan Carpenter 2025-08-27 16:34 ` Frank Li 2025-09-01 20:35 ` Dan Carpenter 2025-08-26 16:38 ` [PATCH V2 3/3] arm64: dts: s32g: Add device tree information for the OCOTP driver Dan Carpenter 2025-08-26 16:46 ` Frank Li
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).