From patchwork Tue Jun 8 19:03:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Kochan X-Patchwork-Id: 457098 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 13436C4743D for ; Tue, 8 Jun 2021 19:09:26 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 006EA610A1 for ; Tue, 8 Jun 2021 19:09:25 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236672AbhFHTLP (ORCPT ); Tue, 8 Jun 2021 15:11:15 -0400 Received: from mail-vi1eur05on2124.outbound.protection.outlook.com ([40.107.21.124]:22624 "EHLO EUR05-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S236743AbhFHTHy (ORCPT ); Tue, 8 Jun 2021 15:07:54 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=EMCudsTjOXibqF+60MYBKBrFdkY7Ku3quYX4D8vPnJfjBm/tRx6h1v38hDEBrgs2uQDflVPHbYsezb9ArKuro+bUybLaBZFj4YCSyREs4k3/bl8LgBL/g1jb/Ikjy1xwocBnsRDkiB22VUodz1ZhcUQVISxr1bJujcbwGCeFVy8Jr6wy0GLOM/sBVN9FQNlZHf0Vve4e7v9DCS5rGNAv1cK/MrnCYDEKhyw6lQqsNFiW7yT9yxlTfrtThEb9aGBbSbZt4Bj8Sd7JzvLYW6jFsF+tuNHH8Pn8ZW+GAYAO/7RQZtf2Nt/vkDFfyasvMX1E/0DUBTjZY5K4l5LrOIOtuQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xKXinOGFTestUNe4t7IgMUYMHGOo5qwpXnr1orl8q84=; b=h2TlYVryXhfu3So9nyJAlTx1gAQ783vW49cfLcxB/yXC39KF5tpYeaBSq0SgcwSfhWkJK38wnIDj38JFsDMaATnpnnE3XXMUW1IRKE2BtYfeYhmkWJbbc19Gv5NBOhwlt6syPxXcZiQ6MZEqibpIhnWvohrPihYxQS2zoU63zYSm/LxCLfH85jMSdKys/tJEp0Ufywl1G/jDXLSew8NJWHe67WiDO7XAWquxkfrGFLJXQyztB4ru50K5sMdGgFv8TfA/vI0Ae82w8/MALmbjPgIfmzSScKWNCIgRTQDdsi7msgJsFTTlGPMnWWYLb7P6yuXnFyTHXIcaZl10gpvJyg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=plvision.eu; dmarc=pass action=none header.from=plvision.eu; dkim=pass header.d=plvision.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xKXinOGFTestUNe4t7IgMUYMHGOo5qwpXnr1orl8q84=; b=d1c2CZaK1y2RcJCU2tiECpuHbEB5c0+iCBURHYV7R2c9oXG9IvHOyNeTovieCPZ+A8wMDr29INjIX923mEzIKm7mCxbRzCCERZPJ0HEQIN+XH0tBeYeRVSCRkLAf1t+pllLKmHaPZDrxy7vHjOyaVi87l6dQIlrXBY2LXvb2+5Y= Authentication-Results: linaro.org; dkim=none (message not signed) header.d=none; linaro.org; dmarc=none action=none header.from=plvision.eu; Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) by HE1P190MB0331.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:5b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.29; Tue, 8 Jun 2021 19:04:25 +0000 Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a]) by HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a%4]) with mapi id 15.20.4195.030; Tue, 8 Jun 2021 19:04:25 +0000 From: Vadym Kochan To: Srinivas Kandagatla , Rob Herring , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Cc: Robert Marko , Vadym Kochan Subject: [PATCH v2 1/3] nvmem: core: introduce cells parser Date: Tue, 8 Jun 2021 22:03:25 +0300 Message-Id: <20210608190327.22071-2-vadym.kochan@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210608190327.22071-1-vadym.kochan@plvision.eu> References: <20210608190327.22071-1-vadym.kochan@plvision.eu> X-Originating-IP: [217.20.186.93] X-ClientProxiedBy: AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) To HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc60716vkochan.x.ow.s (217.20.186.93) by AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.23 via Frontend Transport; Tue, 8 Jun 2021 19:04:24 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a3396a1a-87ad-40cc-2c45-08d92ab03b59 X-MS-TrafficTypeDiagnostic: HE1P190MB0331: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:6108; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4+Ll6mwoNK1CtQAvXde7AW5fU9MtGuphkiUvEMIhpJgiw8/n2JNOSvm7vxJ+jymklWEQkkoSemH7OOgZ9j7Er8vova49X3KkdoNaHlPD/QKR1/6/bDz+SrHlx8aHIZKWaaSZ7oL6SLZQiA+l03kPAK3IbghwFsqCQ3Ww+MxuFw5WZ0cUBlUOcq+rWVMXD8Y5BpMOsdoP4sUxzg6qqcL/UJjY8T5KEgNjpPzIkfSQo2FeomSMfFUJaqmL+uvMphOrI97thWOhfwID/ZiBNMcXQ/G+uwE0OUeFtE1/bUAZnh6MAPpRodJhaRX+KxmtC03nMh6ebUi96tGEwaFZMxZYnsXluzPtt9BHQbSVXfQqvgTKCv4RWorL9OnmcdASFP5lznVxlfqbM/w0TELVe8G9doZijYAi6JQS0Srxnkt7rEDUkf4wNtU1ofUV/FnpxyHyJjYLgrVFLlskN+mmJlQRJdSFzD/icb94PGaZh86xppy/Uk5I6cMMGwOjz7zCCr5KO+Y8vN+sDiN/FCOFTWmz9a0Yve4oHPPg8ztGF6NN3ch/K2pDL+v3+pZlnosMmAAn+Qad7CFUEBbG7MHzvXk/uvGfqYvgzkH4NZKT6WX8frqQBO4Xiemm30GiK63aJOImYHwWfHKxIIvsvf62U9QbNA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1P190MB0539.EURP190.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(376002)(39830400003)(346002)(136003)(366004)(396003)(16526019)(52116002)(44832011)(1076003)(86362001)(26005)(38100700002)(66946007)(38350700002)(5660300002)(36756003)(8936002)(316002)(2616005)(6486002)(2906002)(186003)(107886003)(54906003)(478600001)(6512007)(83380400001)(8676002)(110136005)(66556008)(66476007)(4326008)(956004)(6506007); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: WtFte24duWGeM8T3dLBXZybejdxZOUGvyb1iNig63ZPjR3AvuPXqr+G76wNVJwmgdJgw9Vq6K9gnyB9lzC7pbkYdDJwCUl5g4elK91AraOyXV58uFqlEYyCpc2jhoTCo9aA1mRIBSCB1dhLK5P9ffO+57wVqTAKWHlzsMqT66p/TsfrbaukGQGxMcuGqosInb3/8lwyPvSJkXoGP3gHGBe8dz6trScooi6vJNjjUlK9THwVPmPjwK4fYGZ7ez5KWq40aWjJfAoeAiqW3dXvu2IdCCgWDpg4sCprroF9raFVBU6U08Ov7idmN7xH+T5MrKcTbttFUs2e3U6b0jLTqxNjhTOlhm/dUdQyRwrYDuCJbcUbdIxwZd7KX1RtkcR5LxnUguwO09vtN3O8sjRECcYqSilc7sARheJvYPwgqYRg3lN0gnCH5JZcDdm+mQ53xmah8SFN+PwmFE+owihxbCwSE14YeRiBj4gfkxmuCyVG3P0k4oklMCj0BAEiEHHvQZgzfUfQNlbq5v+gBdsSgV51QV1PsADN6hnUfumv/PYjX63TXBK6g+i+OiH9Un9Z8evMS/D+DxW9oBDCp7vD26Mp4jJUsbayFOhgCkOADC2Vq+MJUnxPHwCbxuL58H7n72N9sxO0NuFfJz2UtA97/IyPkRuPhMBIMjdphSZmacs+P55/WnqvwRk89U9w1hET6gkjGbKACy6t9TxJfjyxPbPVpCxYsMPdFA1xK5TtgtGXhz4wA2qwKyqkUgg3MCaj7B4jVcZPidQof0nNn0QTDi18QE+52tJcdzZ8bWYnLrft3OyVtypFU9Ik0AV+XZpbAAwXwAUvIyPbTmGkGDTQH0+zZV/rrWTaodtou5jFPXXsDzqKjRbu5jAYd3Opo2GyE71Ni3+CzM/AlFTq9cJnCHwGB7woBSw7LFeQYLO0lmIL2GUwtTkU4cD+KtX1bYhRNULm0+kfLU4npWxa7VvxZpKK2c5K0UwB3xTi0dwBnSJJ0mGhikgm72GGC0CKe7U3gQphrWJBs9cAzO41cJmY7h6s7pKwRFPL8Y3E8Ca9+T/aB372dw0MxTXaT2fyO97E1Unxh4LRo4ETCd0f5lhQlYlVhTTm3uMGhdOkxPnbV1LTBNTV1qXOZKBPVgNUtsUsrfHWjcupc1FhoRNBhl1rhvTew4R0OA4tf6ihmXrjPozMaarocKgrIlbrWZ3C4y/BnUp4q1K21SkhADj/Lc5Re/WdYELI/NXTrO9vUahXX1idv0t7adP7HVgy4VLIdEJ/BogMFshYWJkBbrBwCiYTqhdDO86HHRDwNfxQ2vVtUzpAf0va+Y1IITTWwK/ZJ1QfW X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: a3396a1a-87ad-40cc-2c45-08d92ab03b59 X-MS-Exchange-CrossTenant-AuthSource: HE1P190MB0539.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jun 2021 19:04:24.9785 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: xCT0QLmMutUq8zJglSNRijwVWT66AKPSdOKvFziSQ4hbLKl7xwo1L7q86f6hEkY7QgdqE99dZiBLXEg4p2GCIjocDejcXIJAe5OWdHlrP+I= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1P190MB0331 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Current implementation does not allow to register cells for already registered nvmem device and requires that this should be done before. But there might a driver which needs to parse the nvmem device and after register a cells table. Introduce nvmem_parser API which allows to register cells parser which is called during nvmem device registration. During this stage the parser can read the nvmem device and register the cells table. Signed-off-by: Vadym Kochan --- v2: 1) Added nvmem_parser_data so parser implementation should fill it with cells table and lookups which will be registered by core.c after cells_parse was succeed. 2) Removed cells_remove callback from nvmem_parser_config which is not needed because cells table & lookups are registered/unregistered automatically by core. 3) Use new device property to read cells parser name during nvmem registration. Removed of_node usage. 4) parser's module refcount is incremented/decremented on each parser bind/unbind to nvmem device. drivers/nvmem/core.c | 178 +++++++++++++++++++++++++++++++++ include/linux/nvmem-provider.h | 31 ++++++ 2 files changed, 209 insertions(+) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index bca671ff4e54..648373ced6d4 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -39,6 +39,7 @@ struct nvmem_device { nvmem_reg_read_t reg_read; nvmem_reg_write_t reg_write; struct gpio_desc *wp_gpio; + struct nvmem_parser_data *parser_data; void *priv; }; @@ -57,6 +58,13 @@ struct nvmem_cell { struct list_head node; }; +struct nvmem_parser { + struct list_head head; + nvmem_parse_t cells_parse; + const char *name; + struct module *owner; +}; + static DEFINE_MUTEX(nvmem_mutex); static DEFINE_IDA(nvmem_ida); @@ -66,6 +74,9 @@ static LIST_HEAD(nvmem_cell_tables); static DEFINE_MUTEX(nvmem_lookup_mutex); static LIST_HEAD(nvmem_lookup_list); +static DEFINE_MUTEX(nvmem_parser_mutex); +static LIST_HEAD(nvmem_parser_list); + static BLOCKING_NOTIFIER_HEAD(nvmem_notifier); static int __nvmem_reg_read(struct nvmem_device *nvmem, unsigned int offset, @@ -418,6 +429,118 @@ static struct bus_type nvmem_bus_type = { .name = "nvmem", }; +static struct nvmem_parser *__nvmem_parser_get(const char *name) +{ + struct nvmem_parser *tmp, *parser = NULL; + + list_for_each_entry(tmp, &nvmem_parser_list, head) { + if (strcmp(name, tmp->name) == 0) { + parser = tmp; + break; + } + } + + if (!parser) + return ERR_PTR(-EPROBE_DEFER); + + if (!try_module_get(parser->owner)) { + pr_err("could not increase module refcount for parser %s\n", + parser->name); + return ERR_PTR(-EINVAL); + + } + + return parser; +} + +static void nvmem_parser_put(const struct nvmem_parser *parser) +{ + module_put(parser->owner); +} + +static int nvmem_parser_bind(struct nvmem_device *nvmem, const char *name) +{ + struct nvmem_parser_data *data; + struct nvmem_parser *parser; + int err; + + mutex_lock(&nvmem_parser_mutex); + + parser = __nvmem_parser_get(name); + err = PTR_ERR_OR_ZERO(parser); + if (!err) { + data = kzalloc(sizeof(*data), GFP_KERNEL); + if (data) { + data->parser = parser; + nvmem->parser_data = data; + } else { + nvmem_parser_put(parser); + err = -ENOMEM; + } + } + + mutex_unlock(&nvmem_parser_mutex); + + return err; +} + +static void nvmem_parser_unbind(const struct nvmem_device *nvmem) +{ + struct nvmem_parser_data *data = nvmem->parser_data; + + if (data->table.cells) { + nvmem_del_cell_table(&data->table); + kfree(data->table.cells); + } + if (data->lookup) { + nvmem_del_cell_lookups(data->lookup, data->nlookups); + kfree(data->lookup); + } + + nvmem_parser_put(data->parser); +} + +static void nvmem_parser_data_register(struct nvmem_device *nvmem, + struct nvmem_parser_data *data) +{ + if (data->table.cells) { + if (!data->table.nvmem_name) + data->table.nvmem_name = nvmem_dev_name(nvmem); + + nvmem_add_cell_table(&data->table); + } + + if (data->lookup) { + struct nvmem_cell_lookup *lookup = &data->lookup[0]; + int i = 0; + + for (i = 0; i < data->nlookups; i++, lookup++) { + if (!lookup->nvmem_name) + lookup->nvmem_name = nvmem_dev_name(nvmem); + + if (!lookup->dev_id) + lookup->dev_id = data->parser->name; + } + + nvmem_add_cell_lookups(data->lookup, data->nlookups); + } +} + +static void nvmem_cells_parse(struct nvmem_device *nvmem) +{ + struct nvmem_parser_data *data = nvmem->parser_data; + struct nvmem_parser *parser = data->parser; + int err; + + mutex_lock(&nvmem_parser_mutex); + + err = parser->cells_parse(nvmem, data); + if (!err) + nvmem_parser_data_register(nvmem, data); + + mutex_unlock(&nvmem_parser_mutex); +} + static void nvmem_cell_drop(struct nvmem_cell *cell) { blocking_notifier_call_chain(&nvmem_notifier, NVMEM_CELL_REMOVE, cell); @@ -435,6 +558,9 @@ static void nvmem_device_remove_all_cells(const struct nvmem_device *nvmem) list_for_each_entry_safe(cell, p, &nvmem->cells, node) nvmem_cell_drop(cell); + + if (nvmem->parser_data) + nvmem_parser_unbind(nvmem); } static void nvmem_cell_add(struct nvmem_cell *cell) @@ -739,6 +865,7 @@ static int nvmem_add_cells_from_of(struct nvmem_device *nvmem) struct nvmem_device *nvmem_register(const struct nvmem_config *config) { struct nvmem_device *nvmem; + const char *parser_name; int rval; if (!config->dev) @@ -809,6 +936,16 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) nvmem->read_only = device_property_present(config->dev, "read-only") || config->read_only || !nvmem->reg_write; + if (!device_property_read_string(config->dev, "nvmem-cell-parser-name", + &parser_name)) { + rval = nvmem_parser_bind(nvmem, parser_name); + if (rval) { + ida_free(&nvmem_ida, nvmem->id); + kfree(nvmem); + return ERR_PTR(rval); + } + } + #ifdef CONFIG_NVMEM_SYSFS nvmem->dev.groups = nvmem_dev_groups; #endif @@ -837,6 +974,9 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) goto err_teardown_compat; } + if (nvmem->parser_data) + nvmem_cells_parse(nvmem); + rval = nvmem_add_cells_from_table(nvmem); if (rval) goto err_remove_cells; @@ -857,6 +997,8 @@ struct nvmem_device *nvmem_register(const struct nvmem_config *config) err_device_del: device_del(&nvmem->dev); err_put_device: + if (nvmem->parser_data) + nvmem_parser_unbind(nvmem); put_device(&nvmem->dev); return ERR_PTR(rval); @@ -1891,6 +2033,42 @@ const char *nvmem_dev_name(struct nvmem_device *nvmem) } EXPORT_SYMBOL_GPL(nvmem_dev_name); +struct nvmem_parser * +nvmem_parser_register(const struct nvmem_parser_config *config) +{ + struct nvmem_parser *parser; + + if (!config->cells_parse) + return ERR_PTR(-EINVAL); + + if (!config->name) + return ERR_PTR(-EINVAL); + + parser = kzalloc(sizeof(*parser), GFP_KERNEL); + if (!parser) + return ERR_PTR(-ENOMEM); + + parser->cells_parse = config->cells_parse; + parser->owner = config->owner; + parser->name = config->name; + + mutex_lock(&nvmem_parser_mutex); + list_add(&parser->head, &nvmem_parser_list); + mutex_unlock(&nvmem_parser_mutex); + + return parser; +} +EXPORT_SYMBOL(nvmem_parser_register); + +void nvmem_parser_unregister(struct nvmem_parser *parser) +{ + mutex_lock(&nvmem_parser_mutex); + list_del(&parser->head); + kfree(parser); + mutex_unlock(&nvmem_parser_mutex); +} +EXPORT_SYMBOL(nvmem_parser_unregister); + static int __init nvmem_init(void) { return bus_register(&nvmem_bus_type); diff --git a/include/linux/nvmem-provider.h b/include/linux/nvmem-provider.h index e162b757b6d5..447241706554 100644 --- a/include/linux/nvmem-provider.h +++ b/include/linux/nvmem-provider.h @@ -15,10 +15,15 @@ struct nvmem_device; struct nvmem_cell_info; +struct nvmem_cell_table; +struct nvmem_parser_data; + typedef int (*nvmem_reg_read_t)(void *priv, unsigned int offset, void *val, size_t bytes); typedef int (*nvmem_reg_write_t)(void *priv, unsigned int offset, void *val, size_t bytes); +typedef int (*nvmem_parse_t)(struct nvmem_device *nvmem, + struct nvmem_parser_data *data); enum nvmem_type { NVMEM_TYPE_UNKNOWN = 0, @@ -117,6 +122,19 @@ struct nvmem_cell_table { struct list_head node; }; +struct nvmem_parser_config { + const char *name; + nvmem_parse_t cells_parse; + struct module *owner; +}; + +struct nvmem_parser_data { + struct nvmem_cell_table table; + struct nvmem_cell_lookup *lookup; + int nlookups; + struct nvmem_parser *parser; +}; + #if IS_ENABLED(CONFIG_NVMEM) struct nvmem_device *nvmem_register(const struct nvmem_config *cfg); @@ -130,6 +148,11 @@ int devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem); void nvmem_add_cell_table(struct nvmem_cell_table *table); void nvmem_del_cell_table(struct nvmem_cell_table *table); +struct nvmem_parser * +nvmem_parser_register(const struct nvmem_parser_config *config); + +void nvmem_parser_unregister(struct nvmem_parser *parser); + #else static inline struct nvmem_device *nvmem_register(const struct nvmem_config *c) @@ -154,5 +177,13 @@ devm_nvmem_unregister(struct device *dev, struct nvmem_device *nvmem) static inline void nvmem_add_cell_table(struct nvmem_cell_table *table) {} static inline void nvmem_del_cell_table(struct nvmem_cell_table *table) {} +static inline struct nvmem_parser * +nvmem_parser_register(const struct nvmem_parser_config *config) +{ + return -EOPNOTSUPP; +} + +static inline void nvmem_parser_unregister(struct nvmem_parser *parser) {} + #endif /* CONFIG_NVMEM */ #endif /* ifndef _LINUX_NVMEM_PROVIDER_H */ From patchwork Tue Jun 8 19:03:26 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Kochan X-Patchwork-Id: 457099 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 79288C47082 for ; Tue, 8 Jun 2021 19:07:04 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 64D7361183 for ; Tue, 8 Jun 2021 19:07:04 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236072AbhFHTIz (ORCPT ); Tue, 8 Jun 2021 15:08:55 -0400 Received: from mail-am6eur05on2115.outbound.protection.outlook.com ([40.107.22.115]:2401 "EHLO EUR05-AM6-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S236388AbhFHTGy (ORCPT ); Tue, 8 Jun 2021 15:06:54 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Q9uHUSERyJj8/NRuLhtOTla0TVxodqtTkNiHy730Z3QtXKBYSLUCBFMzXCEItzRRue2rAZaPkNy0Bl+IZ6BpyAms0KAZalCM1Ppv6t6QCIMRvhZYpxbaT+DvM1ridjx+/asyEwappVcloV7wsn5bddFqT2Eft8bSuinAs4sgfK3W0uNzBf/gpPzawQ7gK2pj2ug7pFqc+E/jypXsFxTxeJwGUMrgYicH46tEx25CZjIDT32e0iBxDF6YlCeHrLd/V10MTZOPL0hUumu+3dbOKDy5EPA6rzitPlqqwZVEibAfKgQtGitL5MNY5LcrhqBJXcsbpCBsZ/6VdaJN8+1/2w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nkuH+OjUDjUTunDkFK1Plu+1tD7UR2Gty2ymoGNWtgE=; b=OPyYzKoXBKoLoOxntTWKTAOUkC+3v7GaXWUc3GJd1IMjt9BtcR40+CpVhYoqxTvL1D/IAcVTUC1avJTwPXAA4e6QXaI/y3KL6ZYRkxknyDU1dWYks4SpjkEub0m2HjQG36sYLnu2Z1yulsSiux8afOSVViN4VT2Re6bqR+WJtNT2UwZNzMkvMSk1kEc2tnQS8qQnRsgfJjyGf0Ex8A3jtvJjm5wUigQ4TvLRsEwzymadY0vl4u2IK+mCMl1ozIqeG3MfZtjsg7Jidqi406tvkccWnEnmgXimhI6ErtSNG2yMpJHTcjNn8IcIZul54A4QVIEazKQoaTjSeUKU4IhupQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=plvision.eu; dmarc=pass action=none header.from=plvision.eu; dkim=pass header.d=plvision.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nkuH+OjUDjUTunDkFK1Plu+1tD7UR2Gty2ymoGNWtgE=; b=c6iv1lYV8dr3kyPYartL2TErUQXtvGFqrmM3K4FZLcx8orU7byiapIt8atfuv0JBqck+pz/j0AkkfJ9FsCYXQpVkW9/Glm1QUFqcUQOo67Ytvi0sl0b9DARb4o+JzaS4grTpiM6SjaxrhkGubwidnNo5jPgNYttoqpyFpjCx88w= Authentication-Results: linaro.org; dkim=none (message not signed) header.d=none; linaro.org; dmarc=none action=none header.from=plvision.eu; Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) by HE1P190MB0331.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:5b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.29; Tue, 8 Jun 2021 19:04:26 +0000 Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a]) by HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a%4]) with mapi id 15.20.4195.030; Tue, 8 Jun 2021 19:04:26 +0000 From: Vadym Kochan To: Srinivas Kandagatla , Rob Herring , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Cc: Robert Marko , Vadym Kochan Subject: [PATCH v2 2/3] dt-bindings: nvmem: document nvmem-cells-parser-name property Date: Tue, 8 Jun 2021 22:03:26 +0300 Message-Id: <20210608190327.22071-3-vadym.kochan@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210608190327.22071-1-vadym.kochan@plvision.eu> References: <20210608190327.22071-1-vadym.kochan@plvision.eu> X-Originating-IP: [217.20.186.93] X-ClientProxiedBy: AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) To HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc60716vkochan.x.ow.s (217.20.186.93) by AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.23 via Frontend Transport; Tue, 8 Jun 2021 19:04:25 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 26f10b5b-d8f0-4bda-9ce1-08d92ab03be7 X-MS-TrafficTypeDiagnostic: HE1P190MB0331: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:1443; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4HU6yspRzriC2nhZ0N1VmZzTY9FwFA1eSjmV2F16SO+fnUX9FSk75t+hk6Ld91c57K8FZwLkKL1fqHIqTZrU8Z0yHjS/2ypgXNLoTiR+V51b82G1U8ZOzQouimDxn84Fry2yZiqDBYyE/djAD/aoryvASMup79m5r/y0SNyDgnjcnd5XDqfniSpDUmBeVh/Z7TwP9YLrWS6RMURzq8Vs8FKHbUf2XiAEdjVmbvOrBzURPvPfE+amg7gXlyM5kXRhSR4xsSMK72tT0btci4aGs5fwyRjw1sUk02I34EZGkMrfAJNgLoTyHLXJKBQ1V7s+SSK5tuZUTTHUYQr2QffIuZanLGO1FiKVo+IL3BwW+h+3Dfl5aksGSDBV+oVmCU45IDm+6NswbKfttaQe/BJyUmaT8fVJPYKqWM3xCuQlQKrH6t4GOnjpAa13SPfRYnMZybRLbvqd1Edzx/v0b7ASf9snPhxTjj0wPpu28r2A8/AkR7kIOxHcDB/nGs+xb8rjDXNgB/9T0udAMRd308LnhJhVUb5fri6Lku/v900sdLFWzCIe1NyWCI6kcZDm+W+UcT5cmUIviS/X4Hv39+SsIYcItf38FLf9E9dlObQsFW86j86TT6QeTes1ot5GWHE9GQiUg1SRGowf0oIwAfd6UA== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1P190MB0539.EURP190.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(376002)(39830400003)(346002)(136003)(366004)(396003)(16526019)(52116002)(44832011)(1076003)(86362001)(26005)(38100700002)(66946007)(38350700002)(5660300002)(36756003)(8936002)(316002)(2616005)(6486002)(4744005)(2906002)(186003)(107886003)(54906003)(478600001)(6512007)(8676002)(110136005)(66556008)(66476007)(4326008)(956004)(6506007); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: 5a8XD1jzxmAxm6ARQiWgj429WyKyR0MiMyGGBic5juquc1BPRwTGHcviiICotl9xZEneAJaVyaB0QhiddlXbxicXqQShK0nwQEacdyAF39DYZZRGIefrGxbjMwAUxWOxfVz6ZkKG2HYGUM/UDIGSY7ffTd+aHV5KXfZWIDKfQYoMpPZ05xDQbuXUFWLliQc5TtHhrVPBOtjUcWqAn7XDbuJGF/5UD6BBJ5i1biVtpafGkxJytvJ7Rx6DMYZodDLeYmhr09UrTrmrfPjCf1gQQK918964MWMjCouihqWUB0SJ8fvrgMsq0FmWW5pxvb3M0ddm7DnwUMSmZ1xrLv5RB+shfo47lJ23BrKEYZ2tCOHfLIfggHhrkbyzHO4tNVD3fEuGjauKo4DLz+9cJpR4elGhzH0GcAaZWZ+neGIZ02IrxXmTPHs7a0R2m8jgdZ2wVoLH4tpioScqk9K5eIWRMA3SWs02leicpdpNYbJD/Gt8hCNqU7B4vIM17vGWzu6mz22KAvh4VMfHhO8h7rOjsUj9uiqBOwPfSHHc5jkVSpVAzrmF+BpOd38HlP2lnTM+hs4xFZiHYVg/2zPNMS0oGGL9UHqXoQ7lE5WypRKQJpNfW/trYLHc3aYIeSFI0+5Zp+ADCehjSgaA10SGQomamESWl69jRKR4aL0mQUV+O3uZ4jnvmw4/Wcrt/lixDKwYgXtDR3t7S/RKmz/IOpLAWV3ALHQWaniXnF4fLGxY9z0m1gHdmaB2qDoWi0VhVRZzFC6jjyc1vwzPYR5z3Fz1VsAmF58a9jQDeGRv5Rn0IGEmFBvnqN1oXizL73owvtBegl49pVeuV3rD4UD6KDR73+92vnweJ8rKTYq5057LITz84VXWsM7huVZ6d1rSWAhe5NgGQUyd153u5R0NAqQkxLrThq7khuTqC1ubImgRQ/dZFnz/4Q4GqXim6lBxhnVXUm1zdn0XVjadpFBD7FRyjhCxqxTcMS1lhbV/wBneI6w8ZjqBbAEmXA05HwTbEUAaDjY3diSaY0j1EpmSgBmL/5QMFN0X+haiznV/51ydRLE0yGyWFPwPBxU0Itft9sNVLzNMTuA2A4Gr/4693jRP7uyUD9qOKIkh76OMfqNzpfdf3jdP343RxDPsj4IJOysEM1pD2A/OUW8NNAPPeJNUjSZk1QT+sqiDhqZatI7D5OpD3JWcK9W7KQ1q5jtqSa3e+vCsj5cTD2bThbwER4sGbURUaPPRiiYP4kscb4MFUMFJYiNMqMvMtI3iMzfve4iWgVsh9FFp2crHeA1dPFSKCgs5HxLmtEJQiD2RmBVEjaJwV4Xyo+NgZp3Co2F/nxUE X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: 26f10b5b-d8f0-4bda-9ce1-08d92ab03be7 X-MS-Exchange-CrossTenant-AuthSource: HE1P190MB0539.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jun 2021 19:04:25.8959 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: tOFYTcoFR3qoYsegTocfpX6BEkotlQ3w9R9oSS1eGbhRYzMxkB++epxS7DbSbxw/x2VH+Hh18r9mTwhOA0dCd+2g4+DqrHUoWsrX738Ighw= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1P190MB0331 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Describe new "nvmem-cells-parser-name" which is used to bind registered parser with nvmem device. Signed-off-by: Vadym Kochan --- Documentation/devicetree/bindings/nvmem/nvmem.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Documentation/devicetree/bindings/nvmem/nvmem.yaml b/Documentation/devicetree/bindings/nvmem/nvmem.yaml index b8dc3d2b6e92..36c6361d0605 100644 --- a/Documentation/devicetree/bindings/nvmem/nvmem.yaml +++ b/Documentation/devicetree/bindings/nvmem/nvmem.yaml @@ -39,6 +39,11 @@ properties: when it's driven low (logical '0') to allow writing. maxItems: 1 + nvmem-cells-parser-name: + description: + Name of the registered parser to parse and register the cells. + maxItems: 1 + patternProperties: "^.*@[0-9a-f]+$": type: object From patchwork Tue Jun 8 19:03:27 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Vadym Kochan X-Patchwork-Id: 456030 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-18.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER, INCLUDES_PATCH, MAILING_LIST_MULTI, MSGID_FROM_MTA_HEADER, SPF_HELO_NONE, SPF_PASS, URIBL_BLOCKED, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D395BC47082 for ; Tue, 8 Jun 2021 19:06:25 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id C29B960FF0 for ; Tue, 8 Jun 2021 19:06:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234060AbhFHTIM (ORCPT ); Tue, 8 Jun 2021 15:08:12 -0400 Received: from mail-vi1eur05on2121.outbound.protection.outlook.com ([40.107.21.121]:19169 "EHLO EUR05-VI1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S235662AbhFHTG2 (ORCPT ); Tue, 8 Jun 2021 15:06:28 -0400 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZSz/PgLLl8f40Tcy+n3cNWaRPnneDBH4qc3ys3mG7ikkbjrpPSztQBONDS74iAc7awcFEH3Hwu6mxUmKlWeTBNj/8Afduv//cQSm4Ai91SLU8GqodVgL0oUiQfzn1s66xNDHo37PyAUHHMFHe+A6I5rVHDNMJz+NGQVb04whrB4KRK+JPSOXVLoVypIs9JnoKXL/WJbmS41a+sa6mUf8qMeLTDBWM5tAbT2tjUN49IxaF8/vcSk+fe/E/b/mIUM4x0G8NAMxL03lE0LZe5igVE4asWCTPgItNzmXSZq4vn5i4MYpXcnwX1SvunJ+E2WCtwfON0YRb8Dx7KP3XPJO2Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZRc2y//4XF07krqjdC4jXc8SMY8cBUzbDLaIYVquW1Y=; b=d7V7tx4fKAt/+ONkVcqPFeC3Qg07ZUucXM7rN/vjwspwnD+JRhiU6b9DZFJK49zkpAciSTm4Ms7wkoS+PnFkN80886Fvr2voUbH1DdBDukOnEYsi1IDCrsm5fBjoqcgyYQ62+rnfguBCQX0bv2BnBAIG16Yvul0Mfejo1mWZrkxQA/IpOVKvEc4TlSvRQMHmlr87JczItcfYcDwE6xacPLh8JnQFfvNREWlE8WBRuX6l2MMBaJeUfQh6U8Mfw5BkX7UYEGlU5a9PQ2gh365RlhRasHEVlSZiUcU2KF5juzzH/EPfyeY9f8iPj6tcdjIuLOx9kHQMJmiakTR58IW6Sg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=plvision.eu; dmarc=pass action=none header.from=plvision.eu; dkim=pass header.d=plvision.eu; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=plvision.eu; s=selector2; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ZRc2y//4XF07krqjdC4jXc8SMY8cBUzbDLaIYVquW1Y=; b=lOPy7NK1h5esJ7guEqMkq6yHJQxV7eESQlE6csc0vIAoJHMyK9JpSGrPP7OIlKD8LZmsrboU8ddZjtTF89R56UCT6zqcr18cdjpB96PjEZJpB/EiAegwJBKO3vjSaaVPjkwOanZiNxRXTjPVskNKK8nqQyoDinzQ7JgTS5OpA98= Authentication-Results: linaro.org; dkim=none (message not signed) header.d=none; linaro.org; dmarc=none action=none header.from=plvision.eu; Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) by HE1P190MB0331.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:5b::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.29; Tue, 8 Jun 2021 19:04:26 +0000 Received: from HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a]) by HE1P190MB0539.EURP190.PROD.OUTLOOK.COM ([fe80::edb4:ae92:2efe:8c8a%4]) with mapi id 15.20.4195.030; Tue, 8 Jun 2021 19:04:26 +0000 From: Vadym Kochan To: Srinivas Kandagatla , Rob Herring , linux-kernel@vger.kernel.org, devicetree@vger.kernel.org Cc: Robert Marko , Vadym Kochan Subject: [PATCH v2 3/3] nvmem: add ONIE nvmem cells parser Date: Tue, 8 Jun 2021 22:03:27 +0300 Message-Id: <20210608190327.22071-4-vadym.kochan@plvision.eu> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210608190327.22071-1-vadym.kochan@plvision.eu> References: <20210608190327.22071-1-vadym.kochan@plvision.eu> X-Originating-IP: [217.20.186.93] X-ClientProxiedBy: AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) To HE1P190MB0539.EURP190.PROD.OUTLOOK.COM (2603:10a6:7:56::28) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from pc60716vkochan.x.ow.s (217.20.186.93) by AM0PR06CA0107.eurprd06.prod.outlook.com (2603:10a6:208:fa::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4195.23 via Frontend Transport; Tue, 8 Jun 2021 19:04:26 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: bcf78756-faf9-4eb4-8eb2-08d92ab03c70 X-MS-TrafficTypeDiagnostic: HE1P190MB0331: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: X-MS-Oob-TLC-OOBClassifiers: OLM:2150; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /psZFIYKdlsDWrljUuyMIXCx6kaiBD5qr9c+q7p/ialU+wpOBkS5bdGWtKBerQyMkYLh6+NuVDRkgWVS9hHN4L+Xz3IUVmOV7scSyf1gnHm3MrpleJ0oXj4aHgoJqMFttTU0X+5BOF+uKhOGnL6gNbeMwCBg1KNjKzLuwMmXI13audL4XR5GotQJs9ridiZ7WujQWWYlkEIHhlMF8A5yJyCCejAxrK06LfrQwhYQh5FnaoWHXxi1bFpBpnYu1OH4D59lMJrWggGaBjbYeay4QSS8g10HsudTvXQvz7k376fSoUydUORYUS/6o8BYIoSI2z+tBF1WBjR2CeN5LgN1KOlZKUXzo9YnKFRsAGPTCXZxFtwy3EDtv0uAqEu7Hw8Xkjao8vF9GfeHw9nkC0/6GRnanRJMJAzMYYQZO6mvofjFfukjW38rMvY/5mFNbTeu4jhjOFUwtJmlHWplo9p5AE/FMUj4LnhvhjMFn5laJZdWY3+XkjIcQYuq2NQDyuexZBrbDdT+eThDRc9IHXe9yw7AYtNosCJ6FLyWynPpffIEAv3PU6rmWCqUAFcjjRLaJ/U8L2uDdxH+Ywwtn/QYN9FP4KC4qZPIjSZhsFqVIrMn6VdqnHaZPiXykZZb7lHmM+KnmxbN0AaSw8Z+vDjybw== X-Forefront-Antispam-Report: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:HE1P190MB0539.EURP190.PROD.OUTLOOK.COM; PTR:; CAT:NONE; SFS:(376002)(39830400003)(346002)(136003)(366004)(396003)(16526019)(52116002)(44832011)(1076003)(86362001)(26005)(38100700002)(66946007)(38350700002)(5660300002)(36756003)(8936002)(316002)(2616005)(6486002)(2906002)(186003)(107886003)(54906003)(478600001)(6512007)(83380400001)(8676002)(110136005)(66556008)(66476007)(4326008)(956004)(6506007); DIR:OUT; SFP:1102; X-MS-Exchange-AntiSpam-MessageData: 6X6gjh5FeL43cw412ocUXzl9dtBJYIEKMiDo9IMrtHhf4vwVbPhdWTe2QuPvr9V0EjYlNYPXvTH9ZbgI4epmQNw02a/pPuopSmLynVZIhEhKulr7Uwncs0S5UsXCX9P/vNrZ/7CQ0Xh3qZg0Hk1fjNcN8tLWljJF40gp3aspwaXuNECN5dXrG3DO47wpZiVTCjPjLyOtS17kozxbaf+lj2VsFEzmRLItBJ/lPqieI6Jv1C4y4g51OhoWY0nD/G5FO0+NCbstnA1KnLVs8eXG+sQriFd5EA62LT0ZAJql8KQ+nzK7YRWywD0J7Tazbdnb1b+LpSFopBO9OKH9laYN3gCE+zOz4+yF+jluJ/Zo2xYxI5fxOSsxbkHliwd0JBa6SvKjNkL7rlLqmnKtCktv1+rPc74d3xNFbD++bpRi5HArDn2DiDt9Y8f8CQVPKO4pKAkS1bffpdUt0x9ASg7u/mSPWa6L1DJeWEXx90N5bH9rYAGhDrDN+ZuJ3/R1pMuY0xmfFLx5us2jKjw5E5Ic8+BcMCLgU8DKVW/h32Q5QmL2zqNybCuEINhr8NJFGD0gml8LR5ruR8ug2HbC7zzu7qOF6hL4oX5MxhJMOocN1JbMn5MaO7ev2EBMWgWjxNVyJbvYLBGivkgMcQifbkFPyYWy38jIWMxe8XmckoLJ9TMs7uQJO+o0FEVCl1hIXyZPnI6KgQwCPtJDaM5qBkC6mQ2yDRZD88l6PjxWbkeSsDD5He8tEeEzU2P1tYzP7jAClnMmScaGcsqrQvzRUNdvePP+hVsukYkVWXRGB/B83Nap9MVXWyXALSADVnUdqq8MVEv/2uH1gcSB5l9oWE4uY9YEm06fV7yrHLJrZQjloTtsDxZbI563BycvpAJRpFd+nmkOlIP74Ux4u9+PNq+vGTWqZnRJm06KWZkYEuaBmHwhbXYjfNF/SSqWI68RwCUT1mer9Jb1D/UxlNfKR8toXlr92+5PoTil6o2zLzj1yqtqHUJDSQierlFt40NVz1efBJPIphVtogsLWSKh6XBfRxsHV0qyn8vMydWsPu4rIy78CXvBPWwn0ixBC+PTFc4Z61bhFm9E4jCMYrgUfMOWIKJHJqSkXuUmhNvYziRloEdvES9uAAGYlSd95adPSlWU6DcU4S3/rg8LUEbwEEc4FifhA7QzYRDn5kNyXhhpGhiDHCuKaP0xhDiyI8miTFhOWebZSGBa/mwP3ofudP/HHPtEWvexrxsN2Pln3u0B81GwqWddqm7fk0Tw1YUMeSuCkKoKqsYMT0Tce7H8hFX+TS8W+MI1huWD0MGoL/faznfJrycwRWTw/k9OaP5pQ2yw X-OriginatorOrg: plvision.eu X-MS-Exchange-CrossTenant-Network-Message-Id: bcf78756-faf9-4eb4-8eb2-08d92ab03c70 X-MS-Exchange-CrossTenant-AuthSource: HE1P190MB0539.EURP190.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Jun 2021 19:04:26.7654 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 03707b74-30f3-46b6-a0e0-ff0a7438c9c4 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: S/suCWHHI8imvb2fvxOU98ltJw7M8qnR4aLDVJKPBARkzCyk2H63n+YOAg2cgTbdo+s45AGm27RKLOmHtk/aKtlTxFoCuGKmNNnM5vujGNQ= X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1P190MB0331 Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org ONIE is a small operating system, pre-installed on bare metal network switches, that provides an environment for automated provisioning. This system requires that NVMEM (EEPROM) device holds various system information (mac address, platform name, etc) in a special TLV layout. The driver registers ONIE TLV attributes as NVMEM cells which can be accessed by other platform driver. Also it allows to use of_get_mac_address() to retrieve mac address for the netdev. Signed-off-by: Vadym Kochan --- v2: 1) onie-cells.c renamed to onie-tlv-cells.c 2) Do not register onie cells parser via platform driver, but via module_init(). 3) Simplified cells table & lookups registration by just filling all this in nvmem_parser_data. drivers/nvmem/Kconfig | 9 + drivers/nvmem/Makefile | 2 + drivers/nvmem/onie-tlv-cells.c | 302 +++++++++++++++++++++++++++++++++ 3 files changed, 313 insertions(+) create mode 100644 drivers/nvmem/onie-tlv-cells.c diff --git a/drivers/nvmem/Kconfig b/drivers/nvmem/Kconfig index dd2019006838..a08ff087361b 100644 --- a/drivers/nvmem/Kconfig +++ b/drivers/nvmem/Kconfig @@ -288,4 +288,13 @@ config NVMEM_BRCM_NVRAM This driver provides support for Broadcom's NVRAM that can be accessed using I/O mapping. +config NVMEM_ONIE_TLV_CELLS + tristate "ONIE TLV cells support" + help + This is a driver to provide cells from ONIE TLV structure stored + on NVME device. + + This driver can also be built as a module. If so, the module + will be called nvmem-onie-tlv-cells. + endif diff --git a/drivers/nvmem/Makefile b/drivers/nvmem/Makefile index bbea1410240a..f70d7b817377 100644 --- a/drivers/nvmem/Makefile +++ b/drivers/nvmem/Makefile @@ -59,3 +59,5 @@ obj-$(CONFIG_NVMEM_RMEM) += nvmem-rmem.o nvmem-rmem-y := rmem.o obj-$(CONFIG_NVMEM_BRCM_NVRAM) += nvmem_brcm_nvram.o nvmem_brcm_nvram-y := brcm_nvram.o +obj-$(CONFIG_NVMEM_ONIE_TLV_CELLS) += nvmem-onie-tlv-cells.o +nvmem-onie-tlv-cells-y := onie-tlv-cells.o diff --git a/drivers/nvmem/onie-tlv-cells.c b/drivers/nvmem/onie-tlv-cells.c new file mode 100644 index 000000000000..85b1c92da0c5 --- /dev/null +++ b/drivers/nvmem/onie-tlv-cells.c @@ -0,0 +1,302 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * ONIE NVMEM cells provider + * + * Author: Vadym Kochan + */ + +#include +#include +#include +#include +#include +#include +#include + +#define ONIE_NVMEM_TLV_MAX_LEN 2048 + +#define ONIE_NVMEM_HDR_ID "TlvInfo" + +struct onie_tlv_hdr { + u8 id[8]; + u8 version; + __be16 data_len; +} __packed; + +struct onie_tlv { + u8 type; + u8 len; + u8 val[0]; +} __packed; + +struct onie_nvmem_attr { + struct list_head head; + const char *name; + unsigned int offset; + unsigned int len; +}; + +struct onie_tlv_parser { + unsigned int attr_count; + struct list_head attrs; + struct device *dev; + + struct nvmem_cell_lookup *lookup; + int nlookups; +}; + +static struct nvmem_parser *nvmem_parser; + +static bool onie_nvmem_hdr_is_valid(struct onie_tlv_hdr *hdr) +{ + if (memcmp(hdr->id, ONIE_NVMEM_HDR_ID, sizeof(hdr->id)) != 0) + return false; + if (hdr->version != 0x1) + return false; + + return true; +} + +static void onie_nvmem_attrs_free(struct onie_tlv_parser *parser) +{ + struct onie_nvmem_attr *attr, *tmp; + + list_for_each_entry_safe(attr, tmp, &parser->attrs, head) { + list_del(&attr->head); + kfree(attr); + } +} + +static const char *onie_nvmem_attr_name(u8 type) +{ + switch (type) { + case 0x21: return "product-name"; + case 0x22: return "part-number"; + case 0x23: return "serial-number"; + case 0x24: return "mac-address"; + case 0x25: return "manufacture-date"; + case 0x26: return "device-version"; + case 0x27: return "label-revision"; + case 0x28: return "platforn-name"; + case 0x29: return "onie-version"; + case 0x2A: return "num-macs"; + case 0x2B: return "manufacturer"; + case 0x2C: return "country-code"; + case 0x2D: return "vendor"; + case 0x2E: return "diag-version"; + case 0x2F: return "service-tag"; + case 0xFD: return "vendor-extension"; + case 0xFE: return "crc32"; + + default: return "unknown"; + } +} + +static int onie_nvmem_tlv_parse(struct onie_tlv_parser *parser, u8 *data, u16 len) +{ + unsigned int hlen = sizeof(struct onie_tlv_hdr); + unsigned int offset = 0; + int err; + + parser->attr_count = 0; + + while (offset < len) { + struct onie_nvmem_attr *attr; + struct onie_tlv *tlv; + + tlv = (struct onie_tlv *)(data + offset); + + if (offset + tlv->len >= len) { + pr_err("TLV len is too big(0x%x) at 0x%x\n", + tlv->len, hlen + offset); + + /* return success in case something was parsed */ + return 0; + } + + attr = kmalloc(sizeof(*attr), GFP_KERNEL); + if (!attr) { + err = -ENOMEM; + goto err_attr_alloc; + } + + attr->name = onie_nvmem_attr_name(tlv->type); + /* skip 'type' and 'len' */ + attr->offset = hlen + offset + 2; + attr->len = tlv->len; + + list_add(&attr->head, &parser->attrs); + parser->attr_count++; + + offset += sizeof(*tlv) + tlv->len; + } + + if (!parser->attr_count) + return -EINVAL; + + return 0; + +err_attr_alloc: + onie_nvmem_attrs_free(parser); + return err; +} + +static int onie_nvmem_decode(struct onie_tlv_parser *parser, struct nvmem_device *nvmem) +{ + struct onie_tlv_hdr hdr; + u8 *data; + u16 len; + int ret; + + ret = nvmem_device_read(nvmem, 0, sizeof(hdr), &hdr); + if (ret < 0) + return ret; + + if (!onie_nvmem_hdr_is_valid(&hdr)) { + pr_err("invalid ONIE TLV header\n"); + return -EINVAL; + } + + len = be16_to_cpu(hdr.data_len); + + if (len > ONIE_NVMEM_TLV_MAX_LEN) + len = ONIE_NVMEM_TLV_MAX_LEN; + + data = kmalloc(len, GFP_KERNEL); + if (!data) + return -ENOMEM; + + ret = nvmem_device_read(nvmem, sizeof(hdr), len, data); + if (ret < 0) + goto err_data_read; + + ret = onie_nvmem_tlv_parse(parser, data, len); + if (ret) + goto err_info_parse; + + kfree(data); + + return 0; + +err_info_parse: +err_data_read: + kfree(data); + return ret; +} + +static int onie_nvmem_cells_parse(struct onie_tlv_parser *parser, + struct nvmem_device *nvmem, + struct nvmem_cell_table *table) +{ + struct nvmem_cell_info *cells; + struct onie_nvmem_attr *attr; + unsigned int ncells = 0; + int err; + + INIT_LIST_HEAD(&parser->attrs); + parser->attr_count = 0; + + err = onie_nvmem_decode(parser, nvmem); + if (err) + return err; + + cells = kmalloc_array(parser->attr_count, sizeof(*cells), GFP_KERNEL); + if (!cells) { + err = -ENOMEM; + goto err_cells_alloc; + } + + parser->lookup = kmalloc_array(parser->attr_count, + sizeof(struct nvmem_cell_lookup), + GFP_KERNEL); + if (!parser->lookup) { + err = -ENOMEM; + goto err_lookup_alloc; + } + + list_for_each_entry(attr, &parser->attrs, head) { + struct nvmem_cell_lookup *lookup; + struct nvmem_cell_info *cell; + + cell = &cells[ncells]; + + lookup = &parser->lookup[ncells]; + lookup->con_id = NULL; + + cell->offset = attr->offset; + cell->name = attr->name; + cell->bytes = attr->len; + cell->bit_offset = 0; + cell->nbits = 0; + + lookup->cell_name = cell->name; + lookup->con_id = cell->name; + + ncells++; + } + + table->ncells = ncells; + table->cells = cells; + + parser->nlookups = ncells; + + onie_nvmem_attrs_free(parser); + + return 0; + +err_lookup_alloc: + kfree(cells); +err_cells_alloc: + onie_nvmem_attrs_free(parser); + + return err; +} + +static int onie_cells_parse(struct nvmem_device *nvmem, + struct nvmem_parser_data *data) +{ + struct onie_tlv_parser parser; + int err; + + err = onie_nvmem_cells_parse(&parser, nvmem, &data->table); + if (err) { + pr_err("failed to parse ONIE attributes\n"); + return err; + } + + data->nlookups = parser.nlookups; + data->lookup = parser.lookup; + + return 0; +} + +static int __init onie_tlv_init(void) +{ + struct nvmem_parser_config parser_config = { }; + + parser_config.cells_parse = onie_cells_parse; + parser_config.owner = THIS_MODULE; + parser_config.name = "onie-tlv-cells"; + + nvmem_parser = nvmem_parser_register(&parser_config); + if (IS_ERR(nvmem_parser)) { + pr_err("failed to register %s parser\n", parser_config.name); + return PTR_ERR(nvmem_parser); + } + + pr_info("registered %s parser\n", parser_config.name); + + return 0; +} + +static void __exit onie_tlv_exit(void) +{ + nvmem_parser_unregister(nvmem_parser); +} + +module_init(onie_tlv_init); +module_exit(onie_tlv_exit); + +MODULE_AUTHOR("Vadym Kochan "); +MODULE_DESCRIPTION("ONIE TLV NVMEM cells parser"); +MODULE_LICENSE("GPL");