From patchwork Fri Sep 21 13:40:19 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinivas Kandagatla X-Patchwork-Id: 147268 Delivered-To: patch@linaro.org Received: by 2002:a2e:1648:0:0:0:0:0 with SMTP id 8-v6csp837512ljw; Fri, 21 Sep 2018 06:41:02 -0700 (PDT) X-Google-Smtp-Source: ANB0VdYYUVWIE7fRTJS3Zb02IVXQ+/irwJg14kexqN4HQPpMH9Ckgac44u5oEJwgdOe9iD5SB5fT X-Received: by 2002:a63:7f55:: with SMTP id p21-v6mr41678797pgn.285.1537537261875; Fri, 21 Sep 2018 06:41:01 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1537537261; cv=none; d=google.com; s=arc-20160816; b=sbwzmvmMIbcfrFUan7wol0T1eHGGAans4iqanugX+PHmrWehWtanUlAk8AavUCRgG4 /onoXFtp9iXhgl0lPGkfYN3s37Rybwpkf/OLA94cnR4mEzc9kfhn+1WZBwkG2a+5g627 B1dyk5My887crEEc7y7tFeCCUeushEb6/+9oYtj9vi2kqXDzloDBASR/ybjY+k+wbfW7 PVj5/MBo1pt5wfqcJg5EUUzgdbJh+72q11nl7G86SJ/hR4x3bKCaRe0/mPJ+PVgpO/7x MAlV6P7leNZyvX0hSupepNABRe9Q5e44bO8NwiXlHNwMb479/dGK0dIpVzR6mTWA/uDx oimg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature; bh=Y6AQFtCxDMBe/+LC3WwqONRwK0sR7JzE1ciKHcTzQ+E=; b=k1trvpOD0A3Efj7ufcF9B/FF0oxRNFQTJXEjyPjbAyQMSnoCmvDSG6GP4y25FQQ61q 5s4P2U9iQD5wbMEvmBIxf73p8eujj+Liqx2c9w76ha80ct+nYuTpfCzkg+PT1iAfg9jR vOjTW8vQ5pDzooam9BKJLbnUroYbsVXOBdwKrIbz7OzWPBIaxCv5iwIpV9+g5SYRlVTM er/CIKq2Kg71njnYv0iv4bIFOcKtPUrLxHhrjgTohG1Vlk27k9A+nisW3uZn0xkxFfiK qbtFnkfNvEo8d/SwudkHXbW/srWRqhvIxZWwUA2W1TtJkFcwDnmnJ2ki5jgdJZvlTab+ FidQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=fw3vQk++; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h86-v6si28585312pfj.120.2018.09.21.06.41.01; Fri, 21 Sep 2018 06:41:01 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=fw3vQk++; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2390345AbeIUT3x (ORCPT + 32 others); Fri, 21 Sep 2018 15:29:53 -0400 Received: from mail-io1-f67.google.com ([209.85.166.67]:35666 "EHLO mail-io1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727392AbeIUT3w (ORCPT ); Fri, 21 Sep 2018 15:29:52 -0400 Received: by mail-io1-f67.google.com with SMTP id w11-v6so12244868iob.2 for ; Fri, 21 Sep 2018 06:40:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=Y6AQFtCxDMBe/+LC3WwqONRwK0sR7JzE1ciKHcTzQ+E=; b=fw3vQk++17y/nADSmLry/AWNZiC+yrOMXdyRvGVIgah6wufj6EP3wue6BZjQ9rWj46 HJYcY/N9oNYom+j1vBZ0t+uEBmqt1n8yxgjt+T8+x9wYtlD1Ct2k/3iLUbBFqzK1t1S+ e4PeXHkZlEOBfTTE5dcEmQQFlD+oRXec6KNIo= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=Y6AQFtCxDMBe/+LC3WwqONRwK0sR7JzE1ciKHcTzQ+E=; b=oYFnwKIJEuvDmhU+0Hjkt6ZlDHa4F72YejURTNfdqFAgryrdoleAZfxLGn+2BAapcH vu5wGbi5ZprhD2r3uXKXxtDXOwNMvP9COvZxoXdGSqd2NTlDn50t5t/5Nq1iKPC9pvtR zITaGaj2959l/7TxRVKg2+9vwC/hCkAoY/ubTHU8vxKd0SlNlaWegKSRfG1RPHYVGE6s suykT8OWqWves0s2rkkCSKWOgCeu1HYpMl3c4xqwpQ/kYx2/1kEZSPoxr5xYla13QvDn j89LSASV/6qOtc8R1ykjn3jCGimdBUzmx08WIk+a+/hgnQuUBRC/aEFWUwsaYPyxtPzY KC+Q== X-Gm-Message-State: APzg51A1vBhiwWQUUo0WO5mvBbubxlDnovoEpKJaq6Eg46OYQ4swLEBB jQPwShAKpOifmmebVLziC7MeXapSTxc= X-Received: by 2002:a02:85a3:: with SMTP id d32-v6mr39043206jai.119.1537537256136; Fri, 21 Sep 2018 06:40:56 -0700 (PDT) Received: from localhost.localdomain ([209.82.80.116]) by smtp.gmail.com with ESMTPSA id c12-v6sm9896298ioq.81.2018.09.21.06.40.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Sep 2018 06:40:55 -0700 (PDT) From: srinivas.kandagatla@linaro.org To: gregkh@linuxfoundation.org Cc: linux-kernel@vger.kernel.org, Bartosz Golaszewski , Srinivas Kandagatla Subject: [PATCH 19/26] nvmem: add a notifier chain Date: Fri, 21 Sep 2018 06:40:19 -0700 Message-Id: <20180921134026.4596-20-srinivas.kandagatla@linaro.org> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20180921134026.4596-1-srinivas.kandagatla@linaro.org> References: <20180921134026.4596-1-srinivas.kandagatla@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Bartosz Golaszewski Add a blocking notifier chain with four events (add and remove for both devices and cells) so that users can get notified about the addition of nvmem resources they're waiting for. We'll use this instead of the at24 setup callback in the mityomapl138 board file. Signed-off-by: Bartosz Golaszewski Signed-off-by: Srinivas Kandagatla --- drivers/nvmem/core.c | 36 ++++++++++++++++++++++++++++++++++ include/linux/nvmem-consumer.h | 21 ++++++++++++++++++++ 2 files changed, 57 insertions(+) -- 2.19.0 diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 9cc86d131e1e..da441019b609 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -65,6 +65,8 @@ static LIST_HEAD(nvmem_cell_tables); static DEFINE_MUTEX(nvmem_lookup_mutex); static LIST_HEAD(nvmem_lookup_list); +static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); + #ifdef CONFIG_DEBUG_LOCK_ALLOC static struct lock_class_key eeprom_lock_key; #endif @@ -300,6 +302,7 @@ static struct nvmem_device *nvmem_find(const char *name) static void nvmem_cell_drop(struct nvmem_cell *cell) { + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell); mutex_lock(&nvmem_mutex); list_del(&cell->node); mutex_unlock(&nvmem_mutex); @@ -319,6 +322,7 @@ static void nvmem_cell_add(struct nvmem_cell *cell) mutex_lock(&nvmem_mutex); list_add_tail(&cell->node, &cell->nvmem->cells); mutex_unlock(&nvmem_mutex); + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_ADD, cell); } static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem, @@ -434,6 +438,32 @@ static int nvmem_setup_compat(struct nvmem_device *nvmem, return 0; } +/** + * nvmem_register_notifier() - Register a notifier block for nvmem events. + * + * @nb: notifier block to be called on nvmem events. + * + * Return: 0 on success, negative error number on failure. + */ +int nvmem_register_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_register(&nvmem_notifier, nb); +} +EXPORT_SYMBOL_GPL(nvmem_register_notifier); + +/** + * nvmem_unregister_notifier() - Unregister a notifier block for nvmem events. + * + * @nb: notifier block to be unregistered. + * + * Return: 0 on success, negative error number on failure. + */ +int nvmem_unregister_notifier(struct notifier_block *nb) +{ + return blocking_notifier_chain_unregister(&nvmem_notifier, nb); +} +EXPORT_SYMBOL_GPL(nvmem_unregister_notifier); + static int nvmem_add_cells_from_table(struct nvmem_device *nvmem) { const struct nvmem_cell_info *info; @@ -647,6 +677,10 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) if (rval) goto err_remove_cells; + rval = blocking_notifier_call_chain(&nvmem_notifier, NVMEM_ADD, nvmem); + if (rval) + goto err_remove_cells; + return nvmem; err_remove_cells: @@ -669,6 +703,8 @@ static void nvmem_device_release(struct kref *kref) nvmem = container_of(kref, struct nvmem_device, refcnt); + blocking_notifier_call_chain(&nvmem_notifier, NVMEM_REMOVE, nvmem); + if (nvmem->flags & FLAG_COMPAT) device_remove_bin_file(nvmem->base_dev, &nvmem->eeprom); diff --git a/include/linux/nvmem-consumer.h b/include/linux/nvmem-consumer.h index 27eee3945405..0326b52e906b 100644 --- a/include/linux/nvmem-consumer.h +++ b/include/linux/nvmem-consumer.h @@ -14,6 +14,7 @@ #include #include +#include struct device; struct device_node; @@ -47,6 +48,13 @@ struct nvmem_cell_lookup { struct list_head node; }; +enum { + NVMEM_ADD = 1, + NVMEM_REMOVE, + NVMEM_CELL_ADD, + NVMEM_CELL_REMOVE, +}; + #if IS_ENABLED(CONFIG_NVMEM) /* Cell based interface */ @@ -80,6 +88,9 @@ void nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries); +int nvmem_register_notifier(struct notifier_block *nb); +int nvmem_unregister_notifier(struct notifier_block *nb); + #else static inline struct nvmem_cell *nvmem_cell_get(struct device *dev, @@ -179,6 +190,16 @@ nvmem_add_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {} static inline void nvmem_del_cell_lookups(struct nvmem_cell_lookup *entries, size_t nentries) {} +static inline int nvmem_register_notifier(struct notifier_block *nb) +{ + return -ENOSYS; +} + +static inline int nvmem_unregister_notifier(struct notifier_block *nb) +{ + return -ENOSYS; +} + #endif /* CONFIG_NVMEM */ #if IS_ENABLED(CONFIG_NVMEM) && IS_ENABLED(CONFIG_OF)