Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

nvmem: add explicit config option to read old syntax fixed OF cells

Binding for fixed NVMEM cells defined directly as NVMEM device subnodes
has been deprecated. It has been replaced by the "fixed-layout" NVMEM
layout binding.

New syntax is meant to be clearer and should help avoiding imprecise
bindings.

NVMEM subsystem already supports the new binding. It should be a good
idea to limit support for old syntax to existing drivers that actually
support & use it (we can't break backward compatibility!). That way we
additionally encourage new bindings & drivers to ignore deprecated
binding.

It wasn't clear (to me) if rtc and w1 code actually uses old syntax
fixed cells. I enabled them to don't risk any breakage.

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
[for meson-{efuse,mx-efuse}.c]
Acked-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
[for mtk-efuse.c, nvmem/core.c, nvmem-provider.h]
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
[MT8192, MT8195 Chromebooks]
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
[for microchip-otpc.c]
Reviewed-by: Claudiu Beznea <claudiu.beznea@microchip.com>
[SAMA7G5-EK]
Tested-by: Claudiu Beznea <claudiu.beznea@microchip.com>
Acked-by: Jernej Skrabec <jernej.skrabec@gmail.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20231020105545.216052-3-srinivas.kandagatla@linaro.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Rafał Miłecki and committed by
Greg Kroah-Hartman
2cc3b37f 16724d6e

+30 -3
+2
drivers/mtd/mtdcore.c
··· 552 552 config.dev = &mtd->dev; 553 553 config.name = dev_name(&mtd->dev); 554 554 config.owner = THIS_MODULE; 555 + config.add_legacy_fixed_of_cells = of_device_is_compatible(node, "nvmem-cells"); 555 556 config.reg_read = mtd_nvmem_reg_read; 556 557 config.size = mtd->size; 557 558 config.word_size = 1; ··· 899 898 config.name = compatible; 900 899 config.id = NVMEM_DEVID_AUTO; 901 900 config.owner = THIS_MODULE; 901 + config.add_legacy_fixed_of_cells = true; 902 902 config.type = NVMEM_TYPE_OTP; 903 903 config.root_only = true; 904 904 config.ignore_wp = true;
+1
drivers/nvmem/apple-efuses.c
··· 36 36 struct resource *res; 37 37 struct nvmem_config config = { 38 38 .dev = &pdev->dev, 39 + .add_legacy_fixed_of_cells = true, 39 40 .read_only = true, 40 41 .reg_read = apple_efuses_read, 41 42 .stride = sizeof(u32),
+5 -3
drivers/nvmem/core.c
··· 997 997 if (rval) 998 998 goto err_remove_cells; 999 999 1000 - rval = nvmem_add_cells_from_legacy_of(nvmem); 1001 - if (rval) 1002 - goto err_remove_cells; 1000 + if (config->add_legacy_fixed_of_cells) { 1001 + rval = nvmem_add_cells_from_legacy_of(nvmem); 1002 + if (rval) 1003 + goto err_remove_cells; 1004 + } 1003 1005 1004 1006 rval = nvmem_add_cells_from_fixed_layout(nvmem); 1005 1007 if (rval)
+1
drivers/nvmem/imx-ocotp-scu.c
··· 220 220 221 221 static struct nvmem_config imx_scu_ocotp_nvmem_config = { 222 222 .name = "imx-scu-ocotp", 223 + .add_legacy_fixed_of_cells = true, 223 224 .read_only = false, 224 225 .word_size = 4, 225 226 .stride = 1,
+1
drivers/nvmem/imx-ocotp.c
··· 615 615 return PTR_ERR(priv->clk); 616 616 617 617 priv->params = of_device_get_match_data(&pdev->dev); 618 + imx_ocotp_nvmem_config.add_legacy_fixed_of_cells = true; 618 619 imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; 619 620 imx_ocotp_nvmem_config.dev = dev; 620 621 imx_ocotp_nvmem_config.priv = priv;
+1
drivers/nvmem/meson-efuse.c
··· 93 93 94 94 econfig->dev = dev; 95 95 econfig->name = dev_name(dev); 96 + econfig->add_legacy_fixed_of_cells = true; 96 97 econfig->stride = 1; 97 98 econfig->word_size = 1; 98 99 econfig->reg_read = meson_efuse_read;
+1
drivers/nvmem/meson-mx-efuse.c
··· 210 210 efuse->config.owner = THIS_MODULE; 211 211 efuse->config.dev = &pdev->dev; 212 212 efuse->config.priv = efuse; 213 + efuse->config.add_legacy_fixed_of_cells = true; 213 214 efuse->config.stride = drvdata->word_size; 214 215 efuse->config.word_size = drvdata->word_size; 215 216 efuse->config.size = SZ_512;
+1
drivers/nvmem/microchip-otpc.c
··· 261 261 return ret; 262 262 263 263 mchp_nvmem_config.dev = otpc->dev; 264 + mchp_nvmem_config.add_legacy_fixed_of_cells = true; 264 265 mchp_nvmem_config.size = size; 265 266 mchp_nvmem_config.priv = otpc; 266 267 nvmem = devm_nvmem_register(&pdev->dev, &mchp_nvmem_config);
+1
drivers/nvmem/mtk-efuse.c
··· 83 83 return PTR_ERR(priv->base); 84 84 85 85 pdata = device_get_match_data(dev); 86 + econfig.add_legacy_fixed_of_cells = true; 86 87 econfig.stride = 1; 87 88 econfig.word_size = 1; 88 89 econfig.reg_read = mtk_reg_read;
+1
drivers/nvmem/qcom-spmi-sdam.c
··· 142 142 sdam->sdam_config.name = "spmi_sdam"; 143 143 sdam->sdam_config.id = NVMEM_DEVID_AUTO; 144 144 sdam->sdam_config.owner = THIS_MODULE; 145 + sdam->sdam_config.add_legacy_fixed_of_cells = true; 145 146 sdam->sdam_config.stride = 1; 146 147 sdam->sdam_config.word_size = 1; 147 148 sdam->sdam_config.reg_read = sdam_read;
+1
drivers/nvmem/qfprom.c
··· 357 357 { 358 358 struct nvmem_config econfig = { 359 359 .name = "qfprom", 360 + .add_legacy_fixed_of_cells = true, 360 361 .stride = 1, 361 362 .word_size = 1, 362 363 .id = NVMEM_DEVID_AUTO,
+1
drivers/nvmem/rave-sp-eeprom.c
··· 328 328 of_property_read_string(np, "zii,eeprom-name", &config.name); 329 329 config.priv = eeprom; 330 330 config.dev = dev; 331 + config.add_legacy_fixed_of_cells = true; 331 332 config.size = size; 332 333 config.reg_read = rave_sp_eeprom_reg_read; 333 334 config.reg_write = rave_sp_eeprom_reg_write;
+1
drivers/nvmem/rockchip-efuse.c
··· 205 205 206 206 static struct nvmem_config econfig = { 207 207 .name = "rockchip-efuse", 208 + .add_legacy_fixed_of_cells = true, 208 209 .stride = 1, 209 210 .word_size = 1, 210 211 .read_only = true,
+1
drivers/nvmem/sc27xx-efuse.c
··· 247 247 econfig.reg_read = sc27xx_efuse_read; 248 248 econfig.priv = efuse; 249 249 econfig.dev = &pdev->dev; 250 + econfig.add_legacy_fixed_of_cells = true; 250 251 nvmem = devm_nvmem_register(&pdev->dev, &econfig); 251 252 if (IS_ERR(nvmem)) { 252 253 dev_err(&pdev->dev, "failed to register nvmem config\n");
+1
drivers/nvmem/sec-qfprom.c
··· 47 47 { 48 48 struct nvmem_config econfig = { 49 49 .name = "sec-qfprom", 50 + .add_legacy_fixed_of_cells = true, 50 51 .stride = 1, 51 52 .word_size = 1, 52 53 .id = NVMEM_DEVID_AUTO,
+1
drivers/nvmem/sprd-efuse.c
··· 408 408 econfig.read_only = false; 409 409 econfig.name = "sprd-efuse"; 410 410 econfig.size = efuse->data->blk_nums * SPRD_EFUSE_BLOCK_WIDTH; 411 + econfig.add_legacy_fixed_of_cells = true; 411 412 econfig.reg_read = sprd_efuse_read; 412 413 econfig.reg_write = sprd_efuse_write; 413 414 econfig.priv = efuse;
+1
drivers/nvmem/stm32-romem.c
··· 207 207 priv->cfg.priv = priv; 208 208 priv->cfg.owner = THIS_MODULE; 209 209 priv->cfg.type = NVMEM_TYPE_OTP; 210 + priv->cfg.add_legacy_fixed_of_cells = true; 210 211 211 212 priv->lower = 0; 212 213
+1
drivers/nvmem/sunplus-ocotp.c
··· 145 145 146 146 static struct nvmem_config sp_ocotp_nvmem_config = { 147 147 .name = "sp-ocotp", 148 + .add_legacy_fixed_of_cells = true, 148 149 .read_only = true, 149 150 .word_size = 1, 150 151 .size = QAC628_OTP_SIZE,
+1
drivers/nvmem/sunxi_sid.c
··· 153 153 nvmem_cfg->dev = dev; 154 154 nvmem_cfg->name = "sunxi-sid"; 155 155 nvmem_cfg->type = NVMEM_TYPE_OTP; 156 + nvmem_cfg->add_legacy_fixed_of_cells = true; 156 157 nvmem_cfg->read_only = true; 157 158 nvmem_cfg->size = cfg->size; 158 159 nvmem_cfg->word_size = 1;
+1
drivers/nvmem/uniphier-efuse.c
··· 52 52 econfig.size = resource_size(res); 53 53 econfig.priv = priv; 54 54 econfig.dev = dev; 55 + econfig.add_legacy_fixed_of_cells = true; 55 56 nvmem = devm_nvmem_register(dev, &econfig); 56 57 57 58 return PTR_ERR_OR_ZERO(nvmem);
+1
drivers/nvmem/zynqmp_nvmem.c
··· 58 58 59 59 priv->dev = dev; 60 60 econfig.dev = dev; 61 + econfig.add_legacy_fixed_of_cells = true; 61 62 econfig.reg_read = zynqmp_nvmem_read; 62 63 econfig.priv = priv; 63 64
+1
drivers/rtc/nvmem.c
··· 21 21 22 22 nvmem_config->dev = dev; 23 23 nvmem_config->owner = rtc->owner; 24 + nvmem_config->add_legacy_fixed_of_cells = true; 24 25 nvmem = devm_nvmem_register(dev, nvmem_config); 25 26 if (IS_ERR(nvmem)) 26 27 dev_err(dev, "failed to register nvmem device for RTC\n");
+1
drivers/w1/slaves/w1_ds250x.c
··· 168 168 struct nvmem_device *nvmem; 169 169 struct nvmem_config nvmem_cfg = { 170 170 .dev = &sl->dev, 171 + .add_legacy_fixed_of_cells = true, 171 172 .reg_read = w1_nvmem_read, 172 173 .type = NVMEM_TYPE_OTP, 173 174 .read_only = true,
+2
include/linux/nvmem-provider.h
··· 82 82 * @owner: Pointer to exporter module. Used for refcounting. 83 83 * @cells: Optional array of pre-defined NVMEM cells. 84 84 * @ncells: Number of elements in cells. 85 + * @add_legacy_fixed_of_cells: Read fixed NVMEM cells from old OF syntax. 85 86 * @keepout: Optional array of keepout ranges (sorted ascending by start). 86 87 * @nkeepout: Number of elements in the keepout array. 87 88 * @type: Type of the nvmem storage ··· 113 112 struct module *owner; 114 113 const struct nvmem_cell_info *cells; 115 114 int ncells; 115 + bool add_legacy_fixed_of_cells; 116 116 const struct nvmem_keepout *keepout; 117 117 unsigned int nkeepout; 118 118 enum nvmem_type type;