devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
To: Stephen Boyd <sboyd@codeaurora.org>
Cc: linux-arm-kernel@lists.infradead.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Rob Herring <robh+dt@kernel.org>, Mark Brown <broonie@kernel.org>,
	s.hauer@pengutronix.de, linux-api@vger.kernel.org,
	linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
	linux-arm-msm@vger.kernel.org, arnd@arndb.de,
	pantelis.antoniou@konsulko.com, mporter@konsulko.com,
	stefan.wahren@i2se.com, wxt@rock-chips.com,
	Maxime Ripard <maxime.ripard@free-electrons.com>
Subject: Re: [PATCH v8 1/9] nvmem: Add a simple NVMEM framework for nvmem providers
Date: Tue, 21 Jul 2015 10:41:44 +0100	[thread overview]
Message-ID: <55AE13D8.6020301@linaro.org> (raw)
In-Reply-To: <55AD6412.9070205@codeaurora.org>

Thanks Stephen for review,

On 20/07/15 22:11, Stephen Boyd wrote:
> On 07/20/2015 07:43 AM, Srinivas Kandagatla wrote:
>> diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c
>> new file mode 100644
>> index 0000000..bde5528
>> --- /dev/null
>> +++ b/drivers/nvmem/core.c
>> @@ -0,0 +1,384 @@
>>
>> +
>> +static int nvmem_add_cells(struct nvmem_device *nvmem,
>> +               const struct nvmem_config *cfg)
>> +{
>> +    struct nvmem_cell **cells;
>> +    const struct nvmem_cell_info *info = cfg->cells;
>> +    int i, rval;
>> +
>> +    cells = kzalloc(sizeof(*cells) * cfg->ncells, GFP_KERNEL);
>
> kcalloc?

Only reason for using kzalloc is to give the code more flexibility to 
free any pointer in the array in case of errors.

>
>> +    if (!cells)
>> +        return -ENOMEM;
>> +
>> +    for (i = 0; i < cfg->ncells; i++) {
>> +        cells[i] = kzalloc(sizeof(**cells), GFP_KERNEL);
>> +        if (!cells[i]) {
>> +            rval = -ENOMEM;
>> +            goto err;
>> +        }
>> +
>> +        rval = nvmem_cell_info_to_nvmem_cell(nvmem, &info[i], cells[i]);
>> +        if (IS_ERR_VALUE(rval)) {
>> +            kfree(cells[i]);
>> +            goto err;
>> +        }
>> +
>> +        nvmem_cell_add(cells[i]);
>> +    }
>> +
>> +    nvmem->ncells = cfg->ncells;
>> +    /* remove tmp array */
>> +    kfree(cells);
>> +
>> +    return 0;
>> +err:
>> +    while (--i)
>> +        nvmem_cell_drop(cells[i]);
>> +
>> +    return rval;
>> +}
>> +
>> +/**
>> + * nvmem_register() - Register a nvmem device for given nvmem_config.
>> + * Also creates an binary entry in /sys/bus/nvmem/devices/dev-name/nvmem
>> + *
>> + * @config: nvmem device configuration with which nvmem device is
>> created.
>> + *
>> + * Return: Will be an ERR_PTR() on error or a valid pointer to
>> nvmem_device
>> + * on success.
>> + */
>> +
>
> Why the newline?
Yep, fixed it now.

>
>> +struct nvmem_device *nvmem_register(const struct nvmem_config *config)
>> +{
>> +    struct nvmem_device *nvmem;
>> +    struct device_node *np;
>> +    struct regmap *rm;
>> +    int rval;
>> +
>> +    if (!config->dev)
>> +        return ERR_PTR(-EINVAL);
>> +
>> +    rm = dev_get_regmap(config->dev, NULL);
>> +    if (!rm) {
>> +        dev_err(config->dev, "Regmap not found\n");
>> +        return ERR_PTR(-EINVAL);
>> +    }
>> +
>> +    nvmem = kzalloc(sizeof(*nvmem), GFP_KERNEL);
>> +    if (!nvmem)
>> +        return ERR_PTR(-ENOMEM);
>> +
>> +    nvmem->id = ida_simple_get(&nvmem_ida, 0, 0, GFP_KERNEL);
>> +    if (nvmem->id < 0) {
>> +        kfree(nvmem);
>> +        return ERR_PTR(nvmem->id);
>
> Oops, we already freed nvmem.
>
Oops, Fixed this one too.

>> +    }
>> +
>> +    nvmem->regmap = rm;
>> +    nvmem->owner = config->owner;
>> +    nvmem->stride = regmap_get_reg_stride(rm);
>> +    nvmem->word_size = regmap_get_val_bytes(rm);
>> +    nvmem->size = regmap_get_max_register(rm) + nvmem->stride;
>> +    nvmem->dev.type = &nvmem_provider_type;
>> +    nvmem->dev.bus = &nvmem_bus_type;
>> +    nvmem->dev.parent = config->dev;
>> +    np = config->dev->of_node;
>> +    nvmem->dev.of_node = np;
>> +    dev_set_name(&nvmem->dev, "%s%d",
>> +             config->name ? : "nvmem", config->id);
>> +
>> +    nvmem->read_only = np ? of_property_read_bool(np, "read-only") : 0;
>
> of_property_read_bool(NULL, ..) "does the right thing" and returns false
> already.
thanks, that should make this more simple.
>
>> +
>> +    nvmem->read_only |= config->read_only;
>> +
>> +    device_initialize(&nvmem->dev);
>> +
>> +    dev_dbg(&nvmem->dev, "Registering nvmem device %s\n", config->name);
>> +
>> +    rval = device_add(&nvmem->dev);
>> +    if (rval) {
>> +        ida_simple_remove(&nvmem_ida, nvmem->id);
>> +        kfree(nvmem);
>> +        return ERR_PTR(rval);
>> +    }
>> +
>> +    if (device_create_bin_file(&nvmem->dev,
>> +                nvmem->read_only ? &bin_attr_ro_nvmem :
>> +                &bin_attr_rw_nvmem))
>> +        dev_warn(&nvmem->dev, "Failed to create sysfs binary file\n");
>
> Why can't we have device_add() add the binary file attribute too?
>
Yes we can set dev.groups directly before device_add, I did this change too.
>> +
>> +    if (config->cells)
>> +        nvmem_add_cells(nvmem, config);
>> +
>> +    return nvmem;
>> +}
>> +EXPORT_SYMBOL_GPL(nvmem_register);
>> +
>> +/**
>> + * nvmem_unregister() - Unregister previously registered nvmem device
>> + *
>> + * @nvmem: Pointer to previously registered nvmem device.
>> + *
>> + * Return: Will be an negative on error or a zero on success.
>> + */
>> +int nvmem_unregister(struct nvmem_device *nvmem)
>> +{
>> +    mutex_lock(&nvmem_mutex);
>> +    if (nvmem->users) {
>> +        mutex_unlock(&nvmem_mutex);
>> +        return -EBUSY;
>> +    }
>> +    mutex_unlock(&nvmem_mutex);
>
> This lock doesn't seem to be doing anything in this patch? Perhaps it
> should be added in the second patch where consumers start making it useful?
Ok, make sense. I moved this too.
I have v9 ready will send it.

--srini
>

  reply	other threads:[~2015-07-21  9:41 UTC|newest]

Thread overview: 27+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-07-20 14:42 [PATCH v8 0/9] Add simple NVMEM Framework via regmap Srinivas Kandagatla
2015-07-20 14:43 ` [PATCH v8 2/9] nvmem: Add a simple NVMEM framework for consumers Srinivas Kandagatla
2015-07-21 16:25   ` Stefan Wahren
     [not found]     ` <1590184041.70825.1437495942088.JavaMail.open-xchange-0SF9iQWekqLc2Cnrm9MUdsgmgJlYmuWJ@public.gmane.org>
2015-07-22  7:26       ` Srinivas Kandagatla
2015-07-20 14:43 ` [PATCH v8 3/9] nvmem: Add nvmem_device based consumer apis Srinivas Kandagatla
     [not found] ` <1437403352-4091-1-git-send-email-srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-07-20 14:43   ` [PATCH v8 1/9] nvmem: Add a simple NVMEM framework for nvmem providers Srinivas Kandagatla
     [not found]     ` <1437403392-4136-1-git-send-email-srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-07-20 21:11       ` Stephen Boyd
2015-07-21  9:41         ` Srinivas Kandagatla [this message]
     [not found]           ` <55AE13D8.6020301-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-07-21  9:54             ` Stefan Wahren
     [not found]               ` <55AE16BB.9090201-eS4NqCHxEME@public.gmane.org>
2015-07-21 10:31                 ` Srinivas Kandagatla
2015-07-21 17:59           ` Stephen Boyd
     [not found]             ` <55AE8864.6020608-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2015-07-21 18:40               ` Srinivas Kandagatla
2015-07-21 18:51             ` Srinivas Kandagatla
2015-07-23 15:26     ` Stefan Wahren
2015-07-23 15:50       ` Srinivas Kandagatla
2015-07-20 14:43   ` [PATCH v8 4/9] nvmem: Add bindings for simple nvmem framework Srinivas Kandagatla
2015-07-20 14:44   ` [PATCH v8 8/9] nvmem: sunxi: Move the SID driver to the " Srinivas Kandagatla
     [not found]     ` <1437403462-4432-1-git-send-email-srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-07-21 16:38       ` Stefan Wahren
     [not found]         ` <2114639619.71276.1437496724946.JavaMail.open-xchange-0SF9iQWekqLc2Cnrm9MUdsgmgJlYmuWJ@public.gmane.org>
2015-07-23 15:48           ` Srinivas Kandagatla
2015-07-23 15:18       ` Stefan Wahren
     [not found]         ` <55B105B6.7000502-eS4NqCHxEME@public.gmane.org>
2015-07-23 15:48           ` Srinivas Kandagatla
2015-07-20 14:43 ` [PATCH v8 5/9] Documentation: nvmem: add nvmem api level and how-to doc Srinivas Kandagatla
2015-07-20 14:44 ` [PATCH v8 6/9] nvmem: qfprom: Add Qualcomm QFPROM support Srinivas Kandagatla
     [not found]   ` <1437403445-4348-1-git-send-email-srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org>
2015-07-20 21:20     ` Stephen Boyd
2015-07-21  9:42       ` Srinivas Kandagatla
2015-07-20 14:44 ` [PATCH v8 7/9] nvmem: qfprom: Add bindings for qfprom Srinivas Kandagatla
2015-07-20 14:44 ` [PATCH v8 9/9] nvmem: Add to MAINTAINERS for nvmem framework Srinivas Kandagatla

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=55AE13D8.6020301@linaro.org \
    --to=srinivas.kandagatla@linaro.org \
    --cc=arnd@arndb.de \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-arm-msm@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maxime.ripard@free-electrons.com \
    --cc=mporter@konsulko.com \
    --cc=pantelis.antoniou@konsulko.com \
    --cc=robh+dt@kernel.org \
    --cc=s.hauer@pengutronix.de \
    --cc=sboyd@codeaurora.org \
    --cc=stefan.wahren@i2se.com \
    --cc=wxt@rock-chips.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 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).