From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 364E6C433FE for ; Sat, 12 Nov 2022 12:04:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234911AbiKLMEz (ORCPT ); Sat, 12 Nov 2022 07:04:55 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47094 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233962AbiKLMEx (ORCPT ); Sat, 12 Nov 2022 07:04:53 -0500 Received: from out5-smtp.messagingengine.com (out5-smtp.messagingengine.com [66.111.4.29]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 23F1A17895 for ; Sat, 12 Nov 2022 04:04:53 -0800 (PST) Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailout.nyi.internal (Postfix) with ESMTP id B04E65C00D7; Sat, 12 Nov 2022 07:04:50 -0500 (EST) Received: from mailfrontend2 ([10.202.2.163]) by compute2.internal (MEProxy); Sat, 12 Nov 2022 07:04:50 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=svenpeter.dev; h=cc:cc:content-transfer-encoding:date:date:from:from :in-reply-to:message-id:mime-version:reply-to:sender:subject :subject:to:to; s=fm1; t=1668254690; x=1668341090; bh=x9FizG+eL/ 8/EI7i81TIdmOdCun6VmkRyznqPByhDis=; b=XoJPG62A97EKGbYvKLrn2BxEfc /e1ug9nk80w5t0KyhMnUyameiIsYSIrwpdLZkuDnQaEZgBDP6njcMR5SYjIh8HzT BcgCvKrgsv82CpZh+1WY5xaAR6VJEljFPIXVnCaiFEpvEe3xrbGEz4uDYNjMXjSF oUtmb/p2IUsaNAoAYSDUsitHMYvKfKiglDrJ2wXW9mptibPaPZt+gRM6E3HM0J8E TviFyiKShLo6eJ08gm6X2GYXtQ6dFqf6JBv+6SDxU3Pa4RPkZ3x1c8WlWxgeXkLX hoNFE5Nb2WwVGzTiUK1z9TA9cOTaOZ5y/3LJiFTfMecCXfQGJVYiZfpTxoaA== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-transfer-encoding:date:date :feedback-id:feedback-id:from:from:in-reply-to:message-id :mime-version:reply-to:sender:subject:subject:to:to:x-me-proxy :x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s=fm1; t= 1668254690; x=1668341090; bh=x9FizG+eL/8/EI7i81TIdmOdCun6VmkRyzn qPByhDis=; b=C12n0toL5UY1BE0ooeeFIycg0oKY8VmiQyhHJ92+E+DZLWWKVB0 YfMPX30G4blpX0nQPB+Nz589wFlVM0ybC4K6DKTUEwcAnX+HxreUQqqN1bMXOfSz nl2Mb+cAgQFno+ySIbrEHsKCRTomb+sMxUPvldwLYJghzgqq0cmcgr3T/Oo/CKW1 D9pbYCMMOEm/ElFK0rBig/qUHg8iWEJ15qkfDNUGLWLjjozLZ9ep9aQBztCp5TBI Vj3H38w+1h2dKZdVcwMcCx8Cv8E/MraD93C8A+8yCQ1Ex9kIgP1hjP8PttTwGA+k ZlFOPjvOnMcLPyNAO1q2EQlUpA6JjgyifbA== X-ME-Sender: X-ME-Received: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvgedrfeekgdefjecutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefhvfevufffkffoggfgsedtkeertdertddtnecuhfhrohhmpefuvhgvnhcurfgv thgvrhcuoehsvhgvnhesshhvvghnphgvthgvrhdruggvvheqnecuggftrfgrthhtvghrnh epleduffeiheeuvedtffevtdeuleeljeduudfgtedtvefhfeffvdfghfejhefgleelnecu vehluhhsthgvrhfuihiivgeptdenucfrrghrrghmpehmrghilhhfrhhomhepshhvvghnse hsvhgvnhhpvghtvghrrdguvghv X-ME-Proxy: Feedback-ID: i51094778:Fastmail Received: by mail.messagingengine.com (Postfix) with ESMTPA; Sat, 12 Nov 2022 07:04:49 -0500 (EST) From: Sven Peter To: Srinivas Kandagatla Cc: Sven Peter , linux-kernel@vger.kernel.org Subject: [PATCH 1/2] nvmem: Handle reading cells with bit offset > 8 Date: Sat, 12 Nov 2022 13:04:46 +0100 Message-Id: <20221112120447.36877-1-sven@svenpeter.dev> X-Mailer: git-send-email 2.30.1 (Apple Git-130) MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Some nvmem controllers like Apple's eFuses or Nintendo's OTP have a cell size that's larger than one byte. Consumers may however still need access to a subset of bits that start after the first byte. Handle this inside nvmem_shift_read_buffer_in_place(). Signed-off-by: Sven Peter --- drivers/nvmem/core.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/drivers/nvmem/core.c b/drivers/nvmem/core.c index 321d7d63e068..a5b8d6989f8e 100644 --- a/drivers/nvmem/core.c +++ b/drivers/nvmem/core.c @@ -1379,15 +1379,23 @@ EXPORT_SYMBOL_GPL(nvmem_cell_put); static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void *buf) { u8 *p, *b; - int i, extra, bit_offset = cell->bit_offset; + int i, padding, extra, bit_offset = cell->bit_offset; + int bytes = cell->bytes; p = b = buf; if (bit_offset) { + padding = bit_offset/8; + if (padding) { + memmove(buf, buf + padding, bytes - padding); + bit_offset -= BITS_PER_BYTE * padding; + bytes -= padding; + } + /* First shift */ *b++ >>= bit_offset; /* setup rest of the bytes if any */ - for (i = 1; i < cell->bytes; i++) { + for (i = 1; i < bytes; i++) { /* Get bits from next byte and shift them towards msb */ *p |= *b << (BITS_PER_BYTE - bit_offset); @@ -1400,7 +1408,7 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell_entry *cell, void } /* result fits in less bytes */ - extra = cell->bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE); + extra = bytes - DIV_ROUND_UP(cell->nbits, BITS_PER_BYTE); while (--extra >= 0) *p-- = 0; -- 2.25.1