nvmem: sunxi_sid: Dynamically allocate nvmem_config structure
authorChen-Yu Tsai <wens@csie.org>
Sat, 13 Apr 2019 10:32:51 +0000 (11:32 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 25 Apr 2019 17:43:11 +0000 (19:43 +0200)
The sunxi_sid driver currently uses a statically allocated nvmem_config
structure that is updated at probe time. This is sub-optimal as it
limits the driver to one instance, and also takes up space even if the
device is not present.

Modify the driver to allocate the nvmem_config structure at probe time,
plugging in the desired parameters along the way.

Signed-off-by: Chen-Yu Tsai <wens@csie.org>
Acked-by: Maxime Ripard <maxime.ripard@bootlin.com>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/nvmem/sunxi_sid.c

index 15fbfab..75c1f48 100644 (file)
 #define SUN8I_SID_OP_LOCK      (0xAC << 8)
 #define SUN8I_SID_READ         BIT(1)
 
-static struct nvmem_config econfig = {
-       .name = "sunxi-sid",
-       .read_only = true,
-       .stride = 4,
-       .word_size = 1,
-};
-
 struct sunxi_sid_cfg {
        u32     value_offset;
        u32     size;
@@ -150,6 +143,7 @@ static int sunxi_sid_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        struct resource *res;
+       struct nvmem_config *nvmem_cfg;
        struct nvmem_device *nvmem;
        struct sunxi_sid *sid;
        int size;
@@ -172,14 +166,23 @@ static int sunxi_sid_probe(struct platform_device *pdev)
 
        size = cfg->size;
 
-       econfig.size = size;
-       econfig.dev = dev;
+       nvmem_cfg = devm_kzalloc(dev, sizeof(*nvmem_cfg), GFP_KERNEL);
+       if (!nvmem_cfg)
+               return -ENOMEM;
+
+       nvmem_cfg->dev = dev;
+       nvmem_cfg->name = "sunxi-sid";
+       nvmem_cfg->read_only = true;
+       nvmem_cfg->size = cfg->size;
+       nvmem_cfg->word_size = 1;
+       nvmem_cfg->stride = 4;
+       nvmem_cfg->priv = sid;
        if (cfg->need_register_readout)
-               econfig.reg_read = sun8i_sid_read_by_reg;
+               nvmem_cfg->reg_read = sun8i_sid_read_by_reg;
        else
-               econfig.reg_read = sunxi_sid_read;
-       econfig.priv = sid;
-       nvmem = devm_nvmem_register(dev, &econfig);
+               nvmem_cfg->reg_read = sunxi_sid_read;
+
+       nvmem = devm_nvmem_register(dev, nvmem_cfg);
        if (IS_ERR(nvmem))
                return PTR_ERR(nvmem);
 
@@ -187,8 +190,7 @@ static int sunxi_sid_probe(struct platform_device *pdev)
        if (!randomness)
                return -ENOMEM;
 
-       econfig.reg_read(sid, 0, randomness, size);
-
+       nvmem_cfg->reg_read(sid, 0, randomness, size);
        add_device_randomness(randomness, size);
        kfree(randomness);