From patchwork Fri Jul 10 09:45:21 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 51017 Return-Path: X-Original-To: linaro@patches.linaro.org Delivered-To: linaro@patches.linaro.org Received: from mail-la0-f70.google.com (mail-la0-f70.google.com [209.85.215.70]) by ip-10-151-82-157.ec2.internal (Postfix) with ESMTPS id 6642E2290A for ; Fri, 10 Jul 2015 09:45:53 +0000 (UTC) Received: by laar3 with SMTP id r3sf81571471laa.1 for ; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:delivered-to:from:to:cc:subject :date:message-id:in-reply-to:references:sender:precedence:list-id :x-original-sender:x-original-authentication-results:mailing-list :list-post:list-help:list-archive:list-unsubscribe; bh=5A3Ci8LqZi8+ZO0ivB7cLAhsCEdEiFy3egj77cjUIM8=; b=hdqe+AJLIjWzd6O8pjkmCoacTicXOBUi87e0Y/8hQFdTu6m0vGL82q7uwFny67ZYBr hmp0NczXe5HqFamNGKS4E93TzqyukEewcqe8tpC3aE8vjIPJruv8y5ZoeK2mnQt//wBW 5i/jdFinyaOQ3/dhHNev0a7ZDKyv1/TafYTfA2ucCbC2YGrRA7kacocOzNZlHdTIel6p wz3Lcm+xpht9ai+it4KFRh6JXXSjNLZ3DRdJWIPHW1qNRIcmgxMcgOc/kiyIdKPvexcf wgn7VSWAjhdEmPP3pKh2rZDUPme55fvGSkmebAiFtp1LFKyDv29BeFIqHz78y8W2AZNT B92Q== X-Gm-Message-State: ALoCoQllAZNX3H/ZJ9qJ9eo3QAKrruUSU9I8P9iPS32MdHqyT4huuRnXJlZ+RH5ovFyy87ian879 X-Received: by 10.112.42.236 with SMTP id r12mr10485933lbl.2.1436521552344; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) MIME-Version: 1.0 X-BeenThere: patchwork-forward@linaro.org Received: by 10.152.10.74 with SMTP id g10ls162238lab.92.gmail; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) X-Received: by 10.112.50.230 with SMTP id f6mr18974680lbo.17.1436521552141; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) Received: from mail-la0-f45.google.com (mail-la0-f45.google.com. [209.85.215.45]) by mx.google.com with ESMTPS id z3si7193789lbp.168.2015.07.10.02.45.52 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 10 Jul 2015 02:45:52 -0700 (PDT) Received-SPF: pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.45 as permitted sender) client-ip=209.85.215.45; Received: by lagc2 with SMTP id c2so259118593lag.3 for ; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) X-Received: by 10.112.55.207 with SMTP id u15mr19038151lbp.88.1436521552031; Fri, 10 Jul 2015 02:45:52 -0700 (PDT) X-Forwarded-To: patchwork-forward@linaro.org X-Forwarded-For: patch@linaro.org patchwork-forward@linaro.org Delivered-To: patch@linaro.org Received: by 10.112.108.230 with SMTP id hn6csp1250793lbb; Fri, 10 Jul 2015 02:45:50 -0700 (PDT) X-Received: by 10.69.31.171 with SMTP id kn11mr39698909pbd.119.1436521549946; Fri, 10 Jul 2015 02:45:49 -0700 (PDT) Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id iu9si13114967pbc.77.2015.07.10.02.45.49; Fri, 10 Jul 2015 02:45:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754510AbbGJJpr (ORCPT + 8 others); Fri, 10 Jul 2015 05:45:47 -0400 Received: from mail-wi0-f182.google.com ([209.85.212.182]:37095 "EHLO mail-wi0-f182.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754359AbbGJJp0 (ORCPT ); Fri, 10 Jul 2015 05:45:26 -0400 Received: by wicmz13 with SMTP id mz13so9222353wic.0 for ; Fri, 10 Jul 2015 02:45:25 -0700 (PDT) X-Received: by 10.194.176.68 with SMTP id cg4mr38532310wjc.106.1436521525317; Fri, 10 Jul 2015 02:45:25 -0700 (PDT) Received: from srini-ThinkPad-X1-Carbon-2nd.dlink.com (host-89-242-231-79.as13285.net. [89.242.231.79]) by smtp.gmail.com with ESMTPSA id i6sm12768983wjf.29.2015.07.10.02.45.23 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 10 Jul 2015 02:45:24 -0700 (PDT) From: Srinivas Kandagatla To: linux-arm-kernel@lists.infradead.org, Greg Kroah-Hartman Cc: Rob Herring , Kumar Gala , Mark Brown , 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, sboyd@codeaurora.org, pantelis.antoniou@konsulko.com, mporter@konsulko.com, stefan.wahren@i2se.com, wxt@rock-chips.com, Srinivas Kandagatla Subject: [PATCH v7 5/9] Documentation: nvmem: add nvmem api level and how-to doc Date: Fri, 10 Jul 2015 10:45:21 +0100 Message-Id: <1436521521-10889-1-git-send-email-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1436521427-10568-1-git-send-email-srinivas.kandagatla@linaro.org> References: <1436521427-10568-1-git-send-email-srinivas.kandagatla@linaro.org> Sender: devicetree-owner@vger.kernel.org Precedence: list List-ID: X-Mailing-List: devicetree@vger.kernel.org X-Removed-Original-Auth: Dkim didn't pass. X-Original-Sender: srinivas.kandagatla@linaro.org X-Original-Authentication-Results: mx.google.com; spf=pass (google.com: domain of patch+caf_=patchwork-forward=linaro.org@linaro.org designates 209.85.215.45 as permitted sender) smtp.mail=patch+caf_=patchwork-forward=linaro.org@linaro.org Mailing-list: list patchwork-forward@linaro.org; contact patchwork-forward+owners@linaro.org X-Google-Group-Id: 836684582541 List-Post: , List-Help: , List-Archive: List-Unsubscribe: , This patch add basic how-to and api summary documentation for simple NVMEM framework. Signed-off-by: Srinivas Kandagatla --- Documentation/nvmem/nvmem.txt | 152 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 152 insertions(+) create mode 100644 Documentation/nvmem/nvmem.txt diff --git a/Documentation/nvmem/nvmem.txt b/Documentation/nvmem/nvmem.txt new file mode 100644 index 0000000..b074b71 --- /dev/null +++ b/Documentation/nvmem/nvmem.txt @@ -0,0 +1,152 @@ + NVMEM SUBSYSTEM + Srinivas Kandagatla + +This document explains the Simple NVMEM Framework along with the APIs provided, +and how-to-use. + +1. Introduction +=============== +*NVMEM* is the abbreviation for Non Volatile Memory layer. It is used to +retrieve configuration or SOC or Device specific data from a non volatile memories +like eeprom, efuses and so on. + +Up until now, NVMEM drivers like eeprom were stored in drivers/misc, where they +all had to duplicate pretty much the same code to register a sysfs file, allow +in-kernel users to access the content of the devices they were driving, etc. + +This was also a problem as far as other in-kernel users were involved, since +the solutions used were pretty much different from on driver to another, there +was a rather big abstraction leak. + +Introduction of this framework aims at solving this. It also introduces DT +representation for consumer devices to go get the data they require (MAC +Addresses, SoC/Revision ID, part numbers, and so on) from the NVMEMs. +This framework is based on regmap, so that most of the abstraction +available in regmap can be reused, across multiple types of buses. + +NVMEM Providers ++++++++++++++++ + +NVMEM provider refers to an entity that implements methods to initialize, read +and write the non-volatile memory. + +2. Registering/Unregistering the NVMEM provider +=============================================== + +A NVMEM provider can register with NVMEM core by suppling relevant +nvmem configuration to nvmem_register(), on success core would return a valid +nvmem_device pointer. + +nvmem_unregister(nvmem) is used to unregister the already registered provider. + +For example for simple qfprom case: + +static struct nvmem_config econfig = { + .name = "qfprom", + .owner = THIS_MODULE, +}; + +static int qfprom_probe(struct platform_device *pdev) +{ + ... + econfig.dev = &pdev->dev; + nvmem = nvmem_register(&econfig); + ... +} + +It is mandatory that the NVMEM provider has a regmap associated with its +struct device. + +NVMEM Consumers ++++++++++++++++ + +NVMEM consumers are the entities which make use of the NVMEM provider to +read/write into NVMEM. + +3. NVMEM cell based consumer APIs. +================================= + +NVMEM cells are the data entries/fields in the NVMEM. +The NVMEM framework provides 3 APIs to read/write NVMEM cells. + +struct nvmem_cell *nvmem_cell_get(struct device *dev, const char *name); +struct nvmem_cell *devm_nvmem_cell_get(struct device *dev, const char *name); + +void nvmem_cell_put(struct nvmem_cell *cell); +void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell); + +void *nvmem_cell_read(struct nvmem_cell *cell, ssize_t *len); +int nvmem_cell_write(struct nvmem_cell *cell, void *buf, ssize_t len); + +*nvmem_cell_get() apis will get a reference to nvmem cell for a given id, +and nvmem_cell_read/write() can then directly read or write to the cell. +Once the usage of the cell is finished the consumer should call *nvmem_cell_put() +to free all the allocation memory for the cell. + +4. Direct NVMEM device based consumer APIs. +========================================== + +In some instances it is necessary to directly read/write the NVMEM. +To facilitate such consumers NVMEM framework provides below apis. + +struct nvmem_device *nvmem_device_get(struct device *dev, const char *name); +struct nvmem_device *devm_nvmem_device_get(struct device *dev, + const char *name); +void nvmem_device_put(struct nvmem_device *nvmem); +int nvmem_device_read(struct nvmem_device *nvmem, unsigned int offset, + size_t bytes, void *buf); +int nvmem_device_write(struct nvmem_device *nvmem, unsigned int offset, + size_t bytes, void *buf); +int nvmem_device_cell_read(struct nvmem_device *nvmem, + struct nvmem_cell_info *info, void *buf); +int nvmem_device_cell_write(struct nvmem_device *nvmem, + struct nvmem_cell_info *info, void *buf); + +Before the consumers can read/write NVMEM directly, it should get hold +of nvmem_controller from one of the *nvmem_device_get() api. + +Difference between these apis and cell based apis is that these apis +always take nvmem_device as parameter. + +5. Releasing a reference to the NVMEM +===================================== + +When the consumers no longer needs the NVMEM, it has to release the reference +to the NVMEM it has obtained using the APIs mentioned in the above section. +NVMEM framework provides 2 APIs to release a reference to the NVMEM. + +void nvmem_cell_put(struct nvmem_cell *cell); +void devm_nvmem_cell_put(struct device *dev, struct nvmem_cell *cell); +void nvmem_device_put(struct nvmem_device *nvmem); +void devm_nvmem_device_put(struct device *dev, struct nvmem_device *nvmem); + +Both these APIs are used to release a reference to the NVMEM and +devm_nvmem_cell_put and devm_nvmem_device_put destroys the devres associated +with this NVMEM. + +Userspace ++++++++++ + +6. Userspace binary interface. +============================== + +Userspace can read/write the raw NVMEM file located at +/sys/bus/nvmem/devices/*/nvmem + +ex: + +hexdump /sys/bus/nvmem/devices/qfprom0/nvmem + +0000000 0000 0000 0000 0000 0000 0000 0000 0000 +* +00000a0 db10 2240 0000 e000 0c00 0c00 0000 0c00 +0000000 0000 0000 0000 0000 0000 0000 0000 0000 +... +* +0001000 + +7. DeviceTree Binding +===================== + +The documentation for NVMEM dt binding can be found @ +Documentation/devicetree/bindings/nvmem/nvmem.txt