From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4FBD252B1D6 for ; Mon, 7 Sep 2026 20:34:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813247; cv=none; b=LWwINsNdLNSu1fwfQA712H6siXg3XYS6XLrZ7EJd9h1NUnW2iLPW1cDGitB0eLWHWpccFV8WrlxeBUzwKRuwDxWW69e13paqLloqWrdAQXOtogUoxOfKKDMRa668DmQQU2l4thfV0/OxWwrUn4/JGcUtsCG3yj9RcP5Ft0n71bA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813247; c=relaxed/simple; bh=JzPmVao8FK9SYW6EqLoAZ+WBysafs2v13tUyYWLjmGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SmKTbkPbep7u3P9q8bPxizSVWQnT6oH7mEo4QH21b88tZxXf8qwVKza2Nxp0q/ht5+5C8EWZ552yKEaf4iHAY2ulArI5mIxxpg4najWK4nZuL3LpR75aUrK1asLWBOprrcqfvFue3h0G20BD0KY2QH1JjATQLk2j4D9FPtFmzAs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=oH1tnbS0; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oH1tnbS0" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-48584dc164fso3690483f8f.0 for ; Mon, 07 Sep 2026 13:34:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813243; x=1789418043; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=uWcBC68WNKLZwVwv+eWu33G6o/TkwBMc1Uo2TtiwMQM=; b=oH1tnbS0pmS7TygoqeIXnZgTb7nDPjYUTq7b0zBF7vKcgwlJVh/Sgq2SuFp3hBMleb wqEm5jAiwqr0vwoCNBy7bgDZYt+GhCMakf+2BCwY37Y2XBxrA28339RYnFqkO8rU70+j odYakp8JvFE8/azT5VYvlghlXF5n5++1ZBKvnI0bN3axtzYf8XuXWfvHyDgAaYwGVeH/ 38sR24sdrkCIdji3VZkvCpSK4f1gFyD4SVoGZuf/HEUJOYN9wDWc6HbjeGy7R2Ma3aJi hUfFU6at1r+eUWoROa6LwPqsqb99BD/QWYQqrK6JRbi2JHM/NNo9gCXUIT6EKI9me2tq pc4w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813243; x=1789418043; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=uWcBC68WNKLZwVwv+eWu33G6o/TkwBMc1Uo2TtiwMQM=; b=YcY5WNfw65BciQfZHVAvMEdmFRvxBmA9YiHnDmYaT4j0dEw8y7gkggu4d2hJFVLFDg r1/kEbCqYROniIEoajUMS6/TGQq9LGInF4nWLNhku+b5YW5N3biD2M4XxaumoRVQCPVo wJGjRslg4lRypqqaKFcb61hjzRyGkeXJ3doSn/ERAh8EX4JqJOINA3d39YYpthCgRziN EgrkUCxjnKLm2WWmLXFz0nDv6Srg7R15z+aBD+juNf6icrUKkvFFDVEwYDKolXO8phSu M6NmSfhReqJ7y8Wd5IUWXpKaTGVuPC+u83GOK+ZSceLGvWerHUFKeif73kWmlPv/cDmq nLZQ== X-Forwarded-Encrypted: i=1; AKwUvByA5imOmTWYhmE6vgrTSDvguItMuXOca0uB+CLnEfSu39VQMcN3Fj2RtadeJUmhgR7ENvzY2m6Ewqiv6oI=@vger.kernel.org X-Gm-Message-State: AFuF++lbbfI8ik5ZqFfvTvqcOF3A5FsLyEbzUBoOkyFFBCYUqdCugC3Y bua83nPXx3Hktqs4uWE9lckeZkGLdzlfW7edEeFS3E8O2VE3yLfdMHiq X-Gm-Gg: AYBFou0wTXF68q+0KRBxejFbWuRZbQwgLpRl0/xPp/0uBrxYQqqvXdLP9ygTECjWyhx 5Kagx7x/XJFQrgoI0SHaFqftWwrQCZhU2SNH9RcM+Rg2isOccA8LBUU/fQCwYzJ4+R66IeVSv7G W9cTd2kkjGOjjJN4u5ZP821VDbdsLf65kG3OsZ6GTNaq+eTWQ0HXRzeqyeu2f9ydeJv7J/Bb1XM 6NEzzrws7TeiYqxhcWC+v91NJq5MMTym06M0KdRQq3XhfDkzEKNLL0JCnlu0wPi+oxbLq6r7Qch 1PowiVU1fWzbLIjcZ3CAhiYje6PBLIp5QHUxtfVPDpMqvQN4QjPFyhJFluWG3MP+C7GJrWe16Vo xABkjeOR8znv3XrfpFluzvHZMWgya09lEgiHZSTZboO9S54cXMEa7o5uuMJ6+yjO9s4Uc3Zph5O Rub3XWEgW8EBK5S5FmespRqx2HuTPeZ20a0XuKr34NTXOi66yhbZ+XHkCB2gTnvA== X-Received: by 2002:a05:6000:18a9:b0:485:9249:6a10 with SMTP id ffacd0b85a97d-48592496b7cmr18450345f8f.7.1788813243394; Mon, 07 Sep 2026 13:34:03 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.02 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:02 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski , Krzysztof Kozlowski Subject: [PATCH v6 1/9] dt-bindings: rtc: abx80x: document ABX81X RTCs Date: Mon, 7 Sep 2026 22:32:08 +0200 Message-ID: <20260907203216.53192-2-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Abracon AB0815 and AB1815 are RTC modules with SPI interface. Reviewed-by: Krzysztof Kozlowski Signed-off-by: Antoni Pokusinski --- .../bindings/rtc/abracon,abx80x.yaml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/Documentation/devicetree/bindings/rtc/abracon,abx80x.yaml b/Do= cumentation/devicetree/bindings/rtc/abracon,abx80x.yaml index 355b0598411a..d105570bcd5a 100644 --- a/Documentation/devicetree/bindings/rtc/abracon,abx80x.yaml +++ b/Documentation/devicetree/bindings/rtc/abracon,abx80x.yaml @@ -4,7 +4,7 @@ $id: http://devicetree.org/schemas/rtc/abracon,abx80x.yaml# $schema: http://devicetree.org/meta-schemas/core.yaml# =20 -title: Abracon ABX80X I2C ultra low power RTC/Alarm chip +title: Abracon ABX80X (I2C) and ABX81X (SPI) ultra low power RTC/Alarm chi= ps =20 maintainers: - linux-rtc@vger.kernel.org @@ -21,10 +21,12 @@ properties: - abracon,ab0803 - abracon,ab0804 - abracon,ab0805 + - abracon,ab0815 - abracon,ab1801 - abracon,ab1803 - abracon,ab1804 - abracon,ab1805 + - abracon,ab1815 - microcrystal,rv1805 =20 reg: @@ -61,6 +63,7 @@ required: - reg =20 allOf: + - $ref: /schemas/spi/spi-peripheral-props.yaml# - $ref: rtc.yaml# - if: properties: @@ -73,6 +76,8 @@ allOf: - abracon,ab1804 - abracon,ab0805 - abracon,ab1805 + - abracon,ab0815 + - abracon,ab1815 then: properties: abracon,tc-diode: false @@ -96,3 +101,14 @@ examples: interrupts =3D <44 IRQ_TYPE_EDGE_FALLING>; }; }; + + - | + spi { + #address-cells =3D <1>; + #size-cells =3D <0>; + + rtc@0 { + compatible =3D "abracon,ab1815"; + reg =3D <0>; + }; + }; --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f53.google.com (mail-wr1-f53.google.com [209.85.221.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D30A85221FB for ; Mon, 7 Sep 2026 20:34:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813248; cv=none; b=QM8wE197tI8PdlbBaKvMVELvz4SpHSMa2s3wGOqDpT3skP1kYnTSqnGrkhzH05ucqsVaGkX/7F74gA7Ax5ciY4NE5v5pOpG4zCVOapVjh1SkKF0CT2aAmYhIZtEcjjduvUjf9lU0A7pwGjxOXjsWkuKtOHXEOVjZhdlDtHn/QIM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813248; c=relaxed/simple; bh=wLiYwM+a21eAKdI02nzoDqFbngX9L4TUdt0arxClA84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=KNyzkC84ryNm+YXCwrKJxgeGvgR1aUmyuTY7nG9/DlSgj3epLeMp16W45J4JTaLZQQViV155vCF+171SdIkg5NEv+dzIpgDN44qIzIa5z7TtN3Wt5BQ52NBKc4lbnMydXct7qHuNTVsopU0AQz4HD/43NBvP7eJexGMdFZMOnME= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=GZYJljz9; arc=none smtp.client-ip=209.85.221.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GZYJljz9" Received: by mail-wr1-f53.google.com with SMTP id ffacd0b85a97d-4858303de5dso4849689f8f.2 for ; Mon, 07 Sep 2026 13:34:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813245; x=1789418045; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=P8/pS3dA9RAh1ZIge2uQ9oYLHFPgMwkJbXpjt7KmlD8=; b=GZYJljz9Lalr9kwp4tkAOT0PWopOXh0Gci2bmvOskIloC4X01qBhW3/Z2dX+HMSqgB GU/1bnTk8I0ifa6YZS2LDky/XRcmNHdhiedIWzEQgn4jlkVSNcoGkI4I0JKkCmoJGKCQ 3mAlU/kEp8NOc/0xMb5c6dS00jtKWtTRKkL7ANpjxaR/mepj/QMQSdE2Sx7//Q01hD57 H+5Udsb65nH9W+E5+95LuO+jeG4+HWU6mqOnNOrPx9A5JMapu2FTZUGWzcwajvnDQOOr fReG8g8nxHuNLSowyGG/jdz9AKhRJMk/86ENxk+nOvNbp1jRwt25RjsrnwMeDgCu+vGK uDvg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813245; x=1789418045; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=P8/pS3dA9RAh1ZIge2uQ9oYLHFPgMwkJbXpjt7KmlD8=; b=L3RRWUDtYWdiAm748+G7Ry42flj75YDZ70gyGwu4jwxVmztplxXcn2wAu0q77+eTY9 3SGeLEY5u+SNCSkxcu3GeFS57oxU0F8TAXOr7hUz9VttRpOFg5LpKOABLM5zw49NQ8dA /OCcof4X6/DnwhQ7a3SrLsx8HJ7KARtY4FVyYUYN7tUXZaqOaV9FnBl30tkbFc/9crTg bJZX93lw/aaFw7zXtfA1yqWEMLkdQV561fDpKzpkl2EGXmwajS5EwQlVkjuXyHMVl5Bj 2VIwiqPyPMIA+TzUHZjfkXaV8+dlobQpGvH2dhm3l8TvDQsaiMtO9vpz7+ZgcUoHmpda meuQ== X-Forwarded-Encrypted: i=1; AKwUvBzpnUquHe5sQX83fX+qEdpRVHDapa9ANZmdxbIBv052XCfD4Nly5lZdWB5KSU52EsUP2e2S/B9RcHM8hjI=@vger.kernel.org X-Gm-Message-State: AFuF++kYj1KE/Nvt+oG+lPRPjkCNYDm6dRmv8C0Vk5So3Zg8D7u105fN zZoZ5ncTt/tMn/10qYliQIEsy27Lyw+A9uB3m2GWy2CWl6Y2+E6qSePn X-Gm-Gg: AYBFou3JhrctP86M/bG+lq4cdDi1y9F14LVgcskaKf7T07/Z/fYlBPJWxbTgA3wG11B VDUweQdPNUrP2Vhs5Uitrr62GYIz0J2ZwxZZGC/r9fqS/pNG69qIgyMGGtyC8/V1LAtj4Nh7HoB CMdl1Yp53FicIts6gcijFWM9YkSlztnCZTyDiCPyZXzLddcFgn/OE5oIdyDrh8sMRHcjXOrHgcU w0YwyuiAWn312Gq80V+AW59FobjsBg0Mh314oAl3QgCaFyC3ooFpAOOADokb90GSsgjggcZfAWI 9IWzKeREe4wAcipi9avoLjclNX9Sxh8Z3wW7R0oMrM+g29u0Pd06SpZYF2Dx7sl1CPuOC0LCRL2 bmrPYpoJUyLbwSAJFT2qj2RYRq7sOa9/4bVtnr25to4O0/bYuMioOjq2S3x7k7UO1ooLOZ6Pnye Jeo9wttFNaA82xf8tluxu1m2rxLS0VCjer7AXzn+eHsMryOlCWM2ppO7B6Fbg0MA== X-Received: by 2002:a05:6000:2c11:b0:485:8c16:a33a with SMTP id ffacd0b85a97d-4858c16a608mr23291913f8f.47.1788813244843; Mon, 07 Sep 2026 13:34:04 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:04 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 2/9] rtc: abx80x: fix error check after i2c_smbus_read in read_alarm() Date: Mon, 7 Sep 2026 22:32:09 +0200 Message-ID: <20260907203216.53192-3-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" i2c_smbus_read_i2c_block_data() returns the number of bytes read on success and a negative error code on failure. The existing code treated any non-zero return value as an error. Fix the error handling by checking only for negative return values. Fixes: 718a820a303c ("rtc: abx80x: add alarm support") Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 5486d9d0b1e5..e4fd7b5d4b11 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -294,8 +294,10 @@ static int abx80x_read_alarm(struct device *dev, struc= t rtc_wkalrm *t) =20 err =3D i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_ASC, sizeof(buf), buf); - if (err) + if (err < 0) return err; + if (err < ARRAY_SIZE(buf)) + return -EIO; =20 irq_mask =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); if (irq_mask < 0) @@ -311,7 +313,7 @@ static int abx80x_read_alarm(struct device *dev, struct= rtc_wkalrm *t) t->enabled =3D !!(irq_mask & ABX8XX_IRQ_AIE); t->pending =3D (buf[6] & ABX8XX_STATUS_AF) && t->enabled; =20 - return err; + return 0; } =20 static int abx80x_set_alarm(struct device *dev, struct rtc_wkalrm *t) --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A87A052B1FE for ; Mon, 7 Sep 2026 20:34:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813250; cv=none; b=niERYK5DJ9D6ZyGOcqZc1p8GvliBpwil0As1uuyDwPPcBxP9tyexP/Vm7oUHTfXOkekyy/WJ9L04phh+eBEIcFA6tCk6GXZdX8cAaaW9lg3J0gShQ8YJsCwr1Ivv0b3XcrXXjRIkj24yf6iYmV7utasXQZUKozntW5bTJyeW/bA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813250; c=relaxed/simple; bh=mIOAFf4/mkVnKyy9Pr2ub9EN7il/hC4uxGNZV5cUVr0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NFBz/JbrI0EattB9GV38IW2BXcmnkiO5oPiPxZjcZEOieW/UE3yrNrvgZQZ8tzDs5HgsnFEAXf2vOpt2GOAvgzHiH/rxrK185iG2WbNs0BR7R7yUJFik66eKU/kkd7vuQqYdQ7Sdf3mP0HSW5q1bgbZUZ45BVNQrRRMExBo0lEs= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=qs7iy5lw; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qs7iy5lw" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-48441fa5c37so2899068f8f.3 for ; Mon, 07 Sep 2026 13:34:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813247; x=1789418047; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Dxoel9GdpZ6JK+POFcZ8n3vlkVi/jnVPwLg6Nkmyd+g=; b=qs7iy5lwGkF553T4Xbt2ymedf/ASwK1aHXyGXzIlBYh9YaRob6pV75J9sahPPn4bFb bOqT7R5GPbf77N3ejFVdjU5smcR+edDcaxcYvkVXmjmbNWMVsmiCO/G0Bw7bEYqP+LKA Yrx/jB88PRmDhZAJ7xMBJpYPN7B4zF4BO0n2AxoeTr3+xDHuvEFCS/27SZYd3nZu6DXd DnGMTgvH7SjHbi8D9cXxQKLGRk1XIHssGumr5K+KU5i+8p8UTp4EuTnMzL9kJW0TUsGa +KcEI6oC6hmSuoVWYP+CMl13DfZnCRwU7zBkdKrJySl5nJ6/aTGk+B1cXMFzP1gt3kfU CtLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813247; x=1789418047; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Dxoel9GdpZ6JK+POFcZ8n3vlkVi/jnVPwLg6Nkmyd+g=; b=p/chE5h7Uby+KovFKPPRPk/d+WkNyOBMHvXeKqQfHvkl0bvd/THnCCTYH307wu5RKZ /CLJsomkVO/O0qfYBAq6bWiAaiCczALTV1L2Cf9wfDj4iSsIUCOh5jIZn2DZWUdzBQJr zKM2X1+ditdSxXZ3wswBh5mbqiIKr2rddKZFogmJKmfW2cvJ+4BhcGbqMu4E3X3ALnaV 8CWkCOML8j4/AoVTYC8R0xxN8EqC2fUYdrODht9XHMjrRoPYYkqgUZ2aIkc7BYDaSYI5 UtSJZrKpJBFS5tjJS/vg2Fvb3Jkldk7PdE63N9gqjtuArFZP4BTPEaa52rs+loBN7/rK vHQA== X-Forwarded-Encrypted: i=1; AKwUvByQjEfO8Syd8N6PZsysFJNWHXBuX0o5ceed1eXxLKCSMqQt3IZ6QtkpIILc66WruBYMkIZHuoYJaLUXLg0=@vger.kernel.org X-Gm-Message-State: AFuF++kXBZyrK7N9CD2dTksoT6B11Aw7ANl/6/NFL7osJhWTgtgrntxy zudTpO+Gvvxh7QVSAQE8MlyB3vPZv9st2+vbvWdvCkiSP0w8m3sSlvZY X-Gm-Gg: AYBFou2mhnQrv7t5OLzo9nlMIQNJj5NE8JTMEh1NZ0gcb7ZhFAzHwrFlqukUYUolezA wLyT+w4PcedgIPxBiVeUW2RV+48oxeeZ77/7AqnA7RVE4Kl/MBTf8JbLNgkOcsrSvTNt/uhGw4p 9u/j7ZIfHznleO9ht/vqT+H1l01tqGQbKf2PBpNAF7aU5zCK+7QSJizU/hBNRHudAghVhzXQSfz v82XskpY4IGo+7bzpoTFzY+m8DHLVQKbgwTnubBuEVk7k0u2LuxFjpr4liA6id8zHQdHn8KG9TI LbeJRNdaymS7Io3G/5wDiDQWoA4uGvozdv/ik6ItNul6UPwUezlp8nyayWmFsUttQl3+lAMdF72 AJ9Hw0SC8qZC5Kw0AMxjhCegjcgQz7lEfKxFX8rhjsR25KTqkyFYxgMSLOxE7WfiRT7K5LFd8gY 7JgtJSZuJFIIeLyHn5aa0A2v05xRt5eXEAs4h66bbS45dg8jrmE6ZG+b9ULy9hgQ== X-Received: by 2002:adf:e19b:0:b0:485:a410:63fd with SMTP id ffacd0b85a97d-485a410656cmr1433024f8f.35.1788813246552; Mon, 07 Sep 2026 13:34:06 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:05 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 3/9] rtc: abx80x: add mutex protection for register writes Date: Mon, 7 Sep 2026 22:32:10 +0200 Message-ID: <20260907203216.53192-4-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The ABX80X RTC driver performs multi-step register operations such as NVMEM transfers or register writes preceded by a configuration key write. Add a mutex to serialize all the register writes to protect these sequences against race conditions. Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 45 +++++++++++++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 8 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index e4fd7b5d4b11..44de234efecf 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -127,6 +128,7 @@ struct abx80x_priv { struct rtc_device *rtc; struct i2c_client *client; struct watchdog_device wdog; + struct mutex lock; }; =20 static int abx80x_write_config_key(struct i2c_client *client, u8 key) @@ -219,6 +221,7 @@ static int abx80x_rtc_read_time(struct device *dev, str= uct rtc_time *tm) static int abx80x_rtc_set_time(struct device *dev, struct rtc_time *tm) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); unsigned char buf[8]; int err, flags; =20 @@ -234,6 +237,8 @@ static int abx80x_rtc_set_time(struct device *dev, stru= ct rtc_time *tm) buf[ABX8XX_REG_YR] =3D bin2bcd(tm->tm_year - 100); buf[ABX8XX_REG_WD] =3D tm->tm_wday; =20 + guard(mutex)(&priv->lock); + err =3D i2c_smbus_write_i2c_block_data(client, ABX8XX_REG_HTH, sizeof(buf), buf); if (err < 0) { @@ -263,6 +268,8 @@ static irqreturn_t abx80x_handle_irq(int irq, void *dev= _id) struct rtc_device *rtc =3D priv->rtc; int status; =20 + guard(mutex)(&priv->lock); + status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); if (status < 0) return IRQ_NONE; @@ -319,6 +326,7 @@ static int abx80x_read_alarm(struct device *dev, struct= rtc_wkalrm *t) static int abx80x_set_alarm(struct device *dev, struct rtc_wkalrm *t) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); u8 alarm[6]; int err; =20 @@ -332,6 +340,8 @@ static int abx80x_set_alarm(struct device *dev, struct = rtc_wkalrm *t) alarm[4] =3D bin2bcd(t->time.tm_mday); alarm[5] =3D bin2bcd(t->time.tm_mon + 1); =20 + guard(mutex)(&priv->lock); + err =3D i2c_smbus_write_i2c_block_data(client, ABX8XX_REG_AHTH, sizeof(alarm), alarm); if (err < 0) { @@ -354,6 +364,7 @@ static int abx80x_rtc_set_autocalibration(struct device= *dev, int autocalibration) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); int retval, flags =3D 0; =20 if ((autocalibration !=3D 0) && (autocalibration !=3D 1024) && @@ -362,6 +373,8 @@ static int abx80x_rtc_set_autocalibration(struct device= *dev, return -EINVAL; } =20 + guard(mutex)(&priv->lock); + flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); if (flags < 0) return flags; @@ -445,6 +458,7 @@ static ssize_t oscillator_store(struct device *dev, const char *buf, size_t count) { struct i2c_client *client =3D to_i2c_client(dev->parent); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); int retval, flags, rc_mode =3D 0; =20 if (strncmp(buf, "rc", 2) =3D=3D 0) { @@ -456,6 +470,8 @@ static ssize_t oscillator_store(struct device *dev, return -EINVAL; } =20 + guard(mutex)(&priv->lock); + flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); if (flags < 0) return flags; @@ -513,8 +529,11 @@ static const struct attribute_group rtc_calib_attr_gro= up =3D { static int abx80x_alarm_irq_enable(struct device *dev, unsigned int enable= d) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); int err; =20 + guard(mutex)(&priv->lock); + if (enabled) err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, (ABX8XX_IRQ_IM_1_4 | @@ -528,6 +547,7 @@ static int abx80x_alarm_irq_enable(struct device *dev, = unsigned int enabled) static int abx80x_ioctl(struct device *dev, unsigned int cmd, unsigned lon= g arg) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); int status, tmp; =20 switch (cmd) { @@ -541,16 +561,18 @@ static int abx80x_ioctl(struct device *dev, unsigned = int cmd, unsigned long arg) return put_user(tmp, (unsigned int __user *)arg); =20 case RTC_VL_CLR: - status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); - if (status < 0) - return status; + scoped_guard(mutex, &priv->lock) { + status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); + if (status < 0) + return status; =20 - status &=3D ~ABX8XX_STATUS_BLF; + status &=3D ~ABX8XX_STATUS_BLF; =20 - tmp =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, - status); - if (tmp < 0) - return tmp; + tmp =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, + status); + if (tmp < 0) + return tmp; + } =20 return 0; =20 @@ -619,6 +641,8 @@ static int __abx80x_wdog_set_timeout(struct watchdog_de= vice *wdog, struct abx80x_priv *priv =3D watchdog_get_drvdata(wdog); u8 val =3D ABX8XX_WDT_WDS | timeout_bits(timeout); =20 + guard(mutex)(&priv->lock); + /* * Writing any timeout to the WDT register resets the watchdog timer. * Writing 0 disables it. @@ -703,6 +727,8 @@ static int abx80x_nvmem_xfer(struct abx80x_priv *priv, = unsigned int offset, len =3D min(lower + bytes, (size_t)ABX8XX_SRAM_WIN_SIZE) - lower; len =3D min_t(u8, len, I2C_SMBUS_BLOCK_MAX); =20 + guard(mutex)(&priv->lock); + ret =3D i2c_smbus_write_byte_data(priv->client, ABX8XX_REG_EXTRAM, extram); if (ret) @@ -910,6 +936,9 @@ static int abx80x_probe(struct i2c_client *client) =20 priv->rtc->ops =3D &abx80x_rtc_ops; priv->client =3D client; + err =3D devm_mutex_init(&client->dev, &priv->lock); + if (err) + return err; =20 i2c_set_clientdata(client, priv); =20 --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1794D52BE4F for ; Mon, 7 Sep 2026 20:34:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813252; cv=none; b=g/e5/ogYaVtDGvPUzaGYEuI4jEluiu85Xs5lXcO12HtgxStjAr6jygmOPki2CKzEbn6Ai30U+G/jWdZEqMTBBeUGbgF3xxxGMj7TQbo5RbkWSmr/z6coQFcWjxz0ODoDGLyXE508ecyynhBNlxj3SHNVG9vYkgaofG1zhKq9ZY4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813252; c=relaxed/simple; bh=Pc8AByMjSEUPU4qRRamFAyp8fdzecA/x0gsS3IoUfSg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CwR6BEomXYzlp5VwfUJzh780j09Q3oPRjKfR55eg1WJrnEXvz0IARBXGj8bxpEQiLmH/coUqd8mEUb9B4n5FZs78xzb7W1yarBl2aY1YdAOTwAT2ECKVXerQs/ZGj6ZPnmauNU499AjvFd0K0NJty2YrSmXPqPbJcORnOCTKglw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=tL+WdLvl; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="tL+WdLvl" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-4858595f997so2348965f8f.1 for ; Mon, 07 Sep 2026 13:34:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813248; x=1789418048; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=AOxWsNxGR4Xn24fPORPxPNrQIFRGPR6rV/CUVrW8Whs=; b=tL+WdLvlVHeacyG7pNXCz+LBbWgzuCMfI8IL4/84KgpQPEZHpQTQW+JOwfObuzGhPE hD6HIBHNLfEfZgbpIRnaO2uhmred33RkG53ZoL0rZGqWdjvftK5xFclH3mFHO3W4P4hS XT7SJE8rLR5atiMNhuyy6kcfoc9TculGzrHFxGAn3HouzczRTU/m/IkP1LwsRV6dhokz YBuaxCy+R+A5MizNJKXmro0ag2xEyKzDhqDywe8d+oez72Cl+hzR2P1apSVhFahS2jXL cu4TBJZDNFG1Qk7z8i3gzKMEzEOzfvq0auL4n3IJqK7D0GLgRZbsGn9MR9bPiCXvek/0 tQxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813248; x=1789418048; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=AOxWsNxGR4Xn24fPORPxPNrQIFRGPR6rV/CUVrW8Whs=; b=ms5ArfDluiHDsCpnhq68jkDz60fzhr2txZ7cr/yZ86pv56TvvxQZwI3P3eXJjR8my2 /TyWldHWLUb6WzEHS2gSWC17R6yRJ3LRutk+UWy2y2p22zb0OAv+54eZ8N5csWN+F4t3 il1xLGahHwPFFLq+JPJl4aTwJtsxxKG3/E4VLVVhG16P31xmwl2UYW7gAohLFzVxBFa3 e0NVtPRbGVG7TwAKgjxo1eOLyagb+zGeYz0XYZ2OFgkbmutXYdQv+BYRTtNLGGxTGLGS S1P60BqA4oiCoo2vkDQBaSe/eii3SX+T3ZTmwAs36h3ie6KVcVXvI7KBaZc/VHPNQ7zw H3bA== X-Forwarded-Encrypted: i=1; AKwUvBwL7G48SBAhs1Bi9yPa3cJs3iXrfL6HOUzghbBIkXa93kA7/iR3SYNY7q9Y5pWWsxIRooEt7NbVLcLhhmo=@vger.kernel.org X-Gm-Message-State: AFuF++l+TIrmFkf8U8my/Nzv8rMIFrz6Vo9qFcx5x4PB2ANCBEh9sAjV /L2cfaxqeoSVK1Wuf19MCvDx56DCJ1wk7UHU4tE419cw9fL2zXUhuAnov8YuiA== X-Gm-Gg: AYBFou0Fi4aAX5lcOO0/u/jhmVZ9l2kfWI9G2oeTAZ4YgZeWuyX9NtFwqsK9zkiSmuD 8/B/3Gc8sl8eo/wNymhGcH33IQfbxebxh4dFvKwsJquJNNpk2IoqPcH5HaqwxQS2z9qrilWIJbF tU63pEN29aIMJqR83B/GMDORKhKlBnlXikro29wu7IF0MhTY9CjBhV536EI9Epg9Pnvr8ItSVfG n8EtjO3yGpbmrfiZ0/10ao7vagUkS8syOfpl5CSTQTzgphkeq5nXpDfniF/5HaUYlSpVTnWVoxx QSlhI2O6on8EjtREEJKmtVuM8BoAyS8wuD0/tOXssoRc4QJi7zjwfxs1sgioNNzznJ1BCyYiGXq ooUJytBne69xL70ym9KM2Gu8u8L0L+9ajXwYtXwL6ZT0shvYf4D1kiUPXEq6Ko4BHqxHUOBeogT e+MiuYhG399NIECezN2j0td5endfkYoHgxQeUg2FjT8veEmDhdphYMdx/ckMGlcw== X-Received: by 2002:a05:6000:420d:b0:485:8ebb:be1a with SMTP id ffacd0b85a97d-4858ebbbee4mr40491144f8f.4.1788813248126; Mon, 07 Sep 2026 13:34:08 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:07 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 4/9] rtc: abx80x: properly handle shared IRQs Date: Mon, 7 Sep 2026 22:32:11 +0200 Message-ID: <20260907203216.53192-5-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The abx80x RTC driver registers its interrupt handler with IRQF_SHARED, but the handler always returned IRQ_HANDLED and cleared the status register even when no interrupt source from the RTC was active. This could cause the driver to claim interrupts belonging to other devices sharing the same IRQ line and could also clear unrelated status bits in the RTC status register. Only handle the interrupt when the alarm or watchdog flags are set, and clear only those interrupt status bits that were handled. Return IRQ_NONE when the interrupt was not generated by the RTC. Fixes: 718a820a303c ("rtc: abx80x: add alarm support") Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 52 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 50 insertions(+), 2 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 44de234efecf..8f9211bfb7e2 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -51,12 +51,18 @@ #define ABX8XX_CTRL2_RSVD BIT(5) =20 #define ABX8XX_REG_IRQ 0x12 +#define ABX8XX_IRQ_EX1E BIT(0) +#define ABX8XX_IRQ_EX2E BIT(1) #define ABX8XX_IRQ_AIE BIT(2) +#define ABX8XX_IRQ_TIE BIT(3) +#define ABX8XX_IRQ_BLIE BIT(4) #define ABX8XX_IRQ_IM_1_4 (0x3 << 5) =20 #define ABX8XX_REG_CD_TIMER_CTL 0x18 =20 #define ABX8XX_REG_OSC 0x1c +#define ABX8XX_OSC_ACIE BIT(0) +#define ABX8XX_OSC_OFIE BIT(1) #define ABX8XX_OSC_FOS BIT(3) #define ABX8XX_OSC_BOS BIT(4) #define ABX8XX_OSC_ACAL_512 BIT(5) @@ -266,6 +272,7 @@ static irqreturn_t abx80x_handle_irq(int irq, void *dev= _id) struct i2c_client *client =3D dev_id; struct abx80x_priv *priv =3D i2c_get_clientdata(client); struct rtc_device *rtc =3D priv->rtc; + unsigned int status_flags_clear; int status; =20 guard(mutex)(&priv->lock); @@ -284,9 +291,15 @@ static irqreturn_t abx80x_handle_irq(int irq, void *de= v_id) if (status & ABX8XX_STATUS_WDT) dev_alert(&client->dev, "watchdog timeout interrupt.\n"); =20 - i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, 0); + status_flags_clear =3D status & (ABX8XX_STATUS_AF | ABX8XX_STATUS_WDT); =20 - return IRQ_HANDLED; + if (status_flags_clear) { + i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, + ~status_flags_clear); + return IRQ_HANDLED; + } + + return IRQ_NONE; } =20 static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) @@ -952,6 +965,41 @@ static int abx80x_probe(struct i2c_client *client) if (err) return err; =20 + /* Disable unused interrupts */ + data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); + if (data < 0) { + dev_err(&client->dev, "Unable to read irq register\n"); + return -EIO; + } + + err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, + data & ~(ABX8XX_IRQ_EX1E | + ABX8XX_IRQ_EX2E | + ABX8XX_IRQ_TIE | + ABX8XX_IRQ_BLIE)); + if (err < 0) { + dev_err(&client->dev, "Unable to write irq register\n"); + return -EIO; + } + + data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); + if (data < 0) { + dev_err(&client->dev, "Unable to read Oscillator Control register\n"); + return -EIO; + } + + /* Unlock write access to Oscillator Control Register */ + if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) + return -EIO; + + err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSC, + data & ~(ABX8XX_OSC_ACIE | + ABX8XX_OSC_OFIE)); + if (err < 0) { + dev_err(&client->dev, "Unable to write Oscillator Control register\n"); + return -EIO; + } + if (client->irq > 0) { dev_info(&client->dev, "IRQ %d supplied\n", client->irq); err =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f50.google.com (mail-wr1-f50.google.com [209.85.221.50]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9D2CB52D2A9 for ; Mon, 7 Sep 2026 20:34:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813253; cv=none; b=a3vv3JMlya96BbHmBKDDsAOFQQdW02hpWlH2bqwD29e3PMMWAtrMKAOZ9L+JoUfkmQQCEy/p+5oc5lWtQmjT8GHnnfWR3zf9Yr/WUB7rjSaAdsSMw1zZ4+FOg6iu5k+Dagq+w5Cd03SOTnvpMONsF7SwdUji0MAAeQZMmAWuh8o= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813253; c=relaxed/simple; bh=h/d4lg5ZYxoEb/eMlkOvsuPSaUhSgZ4AwspfCz0TKr0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BwcAkh6Rgdy1lmRqwiFp2D6l8mnOeVgV98G9Gr+niMHJSbrSdH2deltzmQPeWhzIZ9ZtXbKBeRheAfsRgTm3Hux0hqAl0VzQROQc2y5gAjK1y/fZMkAmTxDX6otSNTNp8OMmIJSIQ0z/jDsZrD8iiNc+JkpYdMW/x+gCd7JOJ88= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=pruSq4uD; arc=none smtp.client-ip=209.85.221.50 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pruSq4uD" Received: by mail-wr1-f50.google.com with SMTP id ffacd0b85a97d-47fe89fb333so2528966f8f.3 for ; Mon, 07 Sep 2026 13:34:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813250; x=1789418050; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=wT2cQFs+SDhHO7xry69vOp9pKFSTK+W30fCT/siNbCw=; b=pruSq4uDV2rEv6eLC8hugiWfl39SUns4y/BuMozfJszlljaglX/Taw0y9gfYYnq0Em 5wUxCfdUvCZksWI1Av3tNEXKNvSezSjbuIY+aWt8u8f8RwYxtGe7HblWydiWsQ0q65FH FatK3ppwObVKIHGCa7+vWEoT1d4tSKgUEy8WPMCDuZevxrDdRzf6EvObrR4Pb2EClgiu zL3ppTF5qWYlLzfOgAJwZzUIOPBijA4nNnB907gVuSzWh+lA65+IUK1FN49oGe0899xl 4+lZSbz5EYuJsossVGsI+MdrQhEeLLHApZl1SQO+oPMmRpOczynb3bcqxhQAzSJCQ8zb tHXw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813250; x=1789418050; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=wT2cQFs+SDhHO7xry69vOp9pKFSTK+W30fCT/siNbCw=; b=cYJFugWxewjOAypNAUyaXTUXuOdIXLU+3ywrLU8lLIHj3QntQsyqvttZg44UHE23n6 e1lFww0Qh5vybONAiGMXU3YTGi+GamG2ZZxn7zxKJeQ9jIpBzXw+CBPVSdboXDErG1CE 6+dqmFfTkTuOB9ShzWhkosNEROXtuoQztxdLCBGr0i/MspkpXyyVXaN/a3EAyItsqU8i HXgOocup7lzN7fGfVRNnhnyae0acquWkboSr8M+bDpI+Di7POw1bE1YAX9Ozi3ItXS8t PtNA6hXui5wkl420mZ3AV8MVxVoTJ19txmqushac5K8tETePsbdE49m0KGHOmEAmmHjf R86g== X-Forwarded-Encrypted: i=1; AKwUvByIAcbZF8Teb2ZUCKEvnmErpHS8x1m9IM4RSN4InzRA1eAMnkNxjpRKucsVYKXguyPVdKyJeL1qaz1+sW4=@vger.kernel.org X-Gm-Message-State: AFuF++kra9fqC9vITyDoljd8jMah8bI9ja9CT/YI7xVq/3a/XKebRXe/ th9mRqwzSGKg2ErmgjqCRPrfzhkD9F5KzvYYFmCt1jmdG3H2jEFzvEp4 X-Gm-Gg: AYBFou2deKM5rCCMw6RjgRJnKvZP6dvNPUruCHhgsNaadZecpAvUjZmDqXkJlAqyI6/ qHt0lfNnt2yNe06NrxWsR9ycB55utZVZ+2HqyvwQb/oyZichH7hp9UBWILrIAiblTAIHyJs5csa lwjQSWPhAaa9FqlleAcFceXqMYQAn2oLUFJme9Kadx/8D8Rigg5qU62CDEmrO2Uwv7coRbkaQ9D t3YUclhW3Ksatd0uomQDTRPOY301kQoWxwg6knlaZBMrO7PWldYkMebMypy2UjKo091wdHtRq0A 30dCergKg+N4R3IuTPtXsxwCtCpFzEQSNwQzj/WxED9LgvvMyqVXn+RDoGq5dtNtx3K4OSbK+R2 8Y4+7EMdOVB4fW01Q9/tkQWBnXaqQ6TZzKSWZlOVQGiJltEkrx3jlsnu6ix+No02iIrabLKKNl6 12M/PcdxqhDI0DAbpynrcf2Ud4yasIVpJ0fW9J4uZxXygKXkxmJvmCyiHKqx8wFw== X-Received: by 2002:a05:6000:4010:b0:485:96e3:3ede with SMTP id ffacd0b85a97d-48596e33fe0mr10881483f8f.14.1788813249786; Mon, 07 Sep 2026 13:34:09 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:09 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 5/9] rtc: abx80x: add irq to struct abx80x_priv Date: Mon, 7 Sep 2026 22:32:12 +0200 Message-ID: <20260907203216.53192-6-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" This way the irq number is not tied to the i2c_client and can be easily accessed also in the case of ABX81X SPI clocks. Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 8f9211bfb7e2..529f63e024f8 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -135,6 +135,7 @@ struct abx80x_priv { struct i2c_client *client; struct watchdog_device wdog; struct mutex lock; + int irq; }; =20 static int abx80x_write_config_key(struct i2c_client *client, u8 key) @@ -305,11 +306,12 @@ static irqreturn_t abx80x_handle_irq(int irq, void *d= ev_id) static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) { struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D i2c_get_clientdata(client); unsigned char buf[7]; =20 int irq_mask, err; =20 - if (client->irq <=3D 0) + if (priv->irq <=3D 0) return -EINVAL; =20 err =3D i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_ASC, @@ -343,7 +345,7 @@ static int abx80x_set_alarm(struct device *dev, struct = rtc_wkalrm *t) u8 alarm[6]; int err; =20 - if (client->irq <=3D 0) + if (priv->irq <=3D 0) return -EINVAL; =20 alarm[0] =3D 0x0; @@ -949,6 +951,7 @@ static int abx80x_probe(struct i2c_client *client) =20 priv->rtc->ops =3D &abx80x_rtc_ops; priv->client =3D client; + priv->irq =3D client->irq; err =3D devm_mutex_init(&client->dev, &priv->lock); if (err) return err; @@ -1000,19 +1003,19 @@ static int abx80x_probe(struct i2c_client *client) return -EIO; } =20 - if (client->irq > 0) { - dev_info(&client->dev, "IRQ %d supplied\n", client->irq); - err =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, + if (priv->irq > 0) { + dev_info(&client->dev, "IRQ %d supplied\n", priv->irq); + err =3D devm_request_threaded_irq(&client->dev, priv->irq, NULL, abx80x_handle_irq, IRQF_SHARED | IRQF_ONESHOT, "abx8xx", client); if (err) { dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); - client->irq =3D 0; + priv->irq =3D 0; } } - if (client->irq <=3D 0) + if (priv->irq <=3D 0) clear_bit(RTC_FEATURE_ALARM, priv->rtc->features); =20 err =3D rtc_add_group(priv->rtc, &rtc_calib_attr_group); --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 637845237B5 for ; Mon, 7 Sep 2026 20:34:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; cv=none; b=Kx6ca0LoIuczoloAICTN2b8kc/Nn3QcxL0qeXu7LtmKS4F20zZbE/J64BzQqy5re3XfevqSdUUK6uhv35WQaLX/4ofC1nb8+z1liFbvlIjptj7WnOC1q6jAt6Gvk/5wX8LkAGTaa3abVI6X9mhoXkh9CqNs5SJPbFssr7/TCqrU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; c=relaxed/simple; bh=MnJEj0B8CcYBACLAw3JsCqugpkGMobiamsNHgKngBxQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=dkFX+yZG+H+JtyVGjqi6UQ2mcUJpr1iy2woLdMHkb6CJhI25uIwK82oOZiX7s+y+KdrXUvEzab6u0TP6aoQLQVxc4+9LfNYVKBU1bQUZZUdf9CdDC3zFa2SOE79b/WRFQVjkD+zj0RdkRUJTv+BnsHhU2ej0bElkPWOkjk8mNrg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=KtyStryj; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="KtyStryj" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-48436251906so4454163f8f.0 for ; Mon, 07 Sep 2026 13:34:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813251; x=1789418051; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=mWk40ktaGFYc0a5WN0YPWh/YYHzjM0DGHQ579TPtQxI=; b=KtyStryjRXlIXpAUMfjwHjPp6sO9faozSCVYX96SmGPRfRyCkqWsnv+xe+V0I27F6q o0TG3SyBb8YrBZjpZBEmIWQjL4USJoAFCmQVMipfmdTo1tjOsdPmFBTDHhmGt4c+4RXn 1V8Ya5Hr/euVgiaqXre7Yyf6Wbcmye1gz8HiC5+iyFMVSRmCNsjAeB95GXSMgZ8bEVAc Gf0AaBMwOE8dvQKsmwHX7IF9bj4w1VOrUewl+6Qp0qohU3siMsZmmV5WflWjuRrXx4Pu TBnL3y31Iptc68JJcr4kEaQ+DBKCvydWxWCC2vqSGHjJq8xH95uzTxIpr+D4z0waSNGK t+uQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813251; x=1789418051; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=mWk40ktaGFYc0a5WN0YPWh/YYHzjM0DGHQ579TPtQxI=; b=fRI7TAx8hfWH63LXxsQBOWCalhBAEPC2Rq+w74K4Z0MnLK6A7yhZ2H6RFdPvveFlql DN3rdIHXwSGwzdvstGdSiKt1YlgBJ8V4EFbDsM+pIPkA97XCIKKpL7JLWNTReiOGjOPD 1wBtA3nkb6/10RTTyvdkNd1EDIQLCrjW8LbLVLKMJEkTnslKTUQ4SQKEGoRBe5PbNC38 A4b0UJ7SL9vnOulYMXItYzOfnGaxfdokoYC0aasR4t4QpPAHqGk7VbcRlLUpbRI1d+g1 Jc4vJFIRdOaW1MprSFI2NjLQRlsA/Zz6HsHzChtQZp2jpiAqPJ9P750LYxlUjB6w6kaV +KZw== X-Forwarded-Encrypted: i=1; AKwUvByO5nxvCIZMUHK7dxhca0a6ewZmivU1pipi6aRifIkGPWTy891y9yLwSUIV+bkHvpAqbj2YCo1LroBRxKs=@vger.kernel.org X-Gm-Message-State: AFuF++k0LfyN9UhbYcmT4h8rQp2su2w6NlYteB0DqnTWTecBH8aNaHVJ r+r8Ut+QAmWFeUP/BgBnXkkILkYCInVgwcMx9oWssuWp7gRAyezZavre X-Gm-Gg: AYBFou0DVirz1JTzrkgXp7HiFR2J7918wXxPHVNeZtFWlHyYwnM7D2ZptMX1g9IhasE a3vaY7ouQK/r8P7ga+lczhGQ7/iL2dM2LW9ZqOBv4K7f+oydgcdXbfqDZoPxiagrXjTsPqJEa6I 3qWVblMTsktRcW/SBfHeAxJWP6TQQPrQHNDS7R8jtBJ4e5rtBqOAzmkFTmJjDsVMTBolP+Pq/1o TD4GJ6v1ctRDCSPbu98RFYDyJBGAB4CyFEjeNR/zU2Ee0A/E5UK/Od0iVKwQWLIrz9qvjn1rk3c G0BrlP1bj1n0RuI+Duv3jVfKhmv+tuDSdxWl+MxEtWxN6yVC4rP/DfImZNrDaM94l/voBDIutqI GwRgHSptnLkR6jw44hVTdtmt360v56mJ6XVQ1sVC5gTegTrHgEfrnDQSGEHzAxnJ0tTIDQX8RJG z5u5MWJb/HtDBSFZe022rOudOPyj0aT9v0BhI0vnuhTFvv0mKXDwJkcNNrRyczdKppuBUHz3iM X-Received: by 2002:a05:6000:4b11:b0:485:8313:9f47 with SMTP id ffacd0b85a97d-48587055d09mr53237162f8f.10.1788813251455; Mon, 07 Sep 2026 13:34:11 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:10 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 6/9] rtc: abx80x: use regmap instead of I2C specific API Date: Mon, 7 Sep 2026 22:32:13 +0200 Message-ID: <20260907203216.53192-7-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rework the driver so that it uses regmap_* functions for communication with the device instead of the i2c_smbus_* API. This way the support for ABX81X RTCs which use SPI can be added later. Signed-off-by: Antoni Pokusinski --- drivers/rtc/Kconfig | 1 + drivers/rtc/rtc-abx80x.c | 393 +++++++++++++++++++++------------------ 2 files changed, 213 insertions(+), 181 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 01def8231873..4d14bcba616e 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -215,6 +215,7 @@ config RTC_DRV_ABEOZ9 config RTC_DRV_ABX80X tristate "Abracon ABx80x" select WATCHDOG_CORE if WATCHDOG + select REGMAP_I2C help If you say yes here you get support for Abracon AB080X and AB180X families of ultra-low-power battery- and capacitor-backed real-time diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 529f63e024f8..7b8e6546ccff 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include =20 @@ -132,53 +133,55 @@ static struct abx80x_cap abx80x_caps[] =3D { =20 struct abx80x_priv { struct rtc_device *rtc; - struct i2c_client *client; + struct regmap *regmap; struct watchdog_device wdog; struct mutex lock; int irq; }; =20 -static int abx80x_write_config_key(struct i2c_client *client, u8 key) +static int abx80x_write_config_key(struct device *dev, u8 key) { - if (i2c_smbus_write_byte_data(client, ABX8XX_REG_CFG_KEY, key) < 0) { - dev_err(&client->dev, "Unable to write configuration key\n"); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + + if (regmap_write(priv->regmap, ABX8XX_REG_CFG_KEY, key) < 0) { + dev_err(dev, "Unable to write configuration key\n"); return -EIO; } =20 return 0; } =20 -static int abx80x_is_rc_mode(struct i2c_client *client) +static int abx80x_is_rc_mode(struct device *dev) { - int flags =3D 0; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + unsigned int flags =3D 0; + int err; =20 - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSS); - if (flags < 0) { - dev_err(&client->dev, - "Failed to read autocalibration attribute\n"); - return flags; + err =3D regmap_read(priv->regmap, ABX8XX_REG_OSS, &flags); + if (err < 0) { + dev_err(dev, "Failed to read autocalibration attribute\n"); + return err; } =20 return (flags & ABX8XX_OSS_OMODE) ? 1 : 0; } =20 -static int abx80x_enable_trickle_charger(struct i2c_client *client, - u8 trickle_cfg) +static int abx80x_enable_trickle_charger(struct device *dev, u8 trickle_cf= g) { + struct abx80x_priv *priv =3D dev_get_drvdata(dev); int err; =20 /* * Write the configuration key register to enable access to the Trickle * register */ - if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_MISC) < 0) + if (abx80x_write_config_key(dev, ABX8XX_CFG_KEY_MISC) < 0) return -EIO; =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_TRICKLE, - ABX8XX_TRICKLE_CHARGE_ENABLE | - trickle_cfg); + err =3D regmap_write(priv->regmap, ABX8XX_REG_TRICKLE, + ABX8XX_TRICKLE_CHARGE_ENABLE | trickle_cfg); if (err < 0) { - dev_err(&client->dev, "Unable to write trickle register\n"); + dev_err(dev, "Unable to write trickle register\n"); return -EIO; } =20 @@ -187,19 +190,20 @@ static int abx80x_enable_trickle_charger(struct i2c_c= lient *client, =20 static int abx80x_rtc_read_time(struct device *dev, struct rtc_time *tm) { - struct i2c_client *client =3D to_i2c_client(dev); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); unsigned char buf[8]; - int err, flags, rc_mode =3D 0; + unsigned int flags; + int err, rc_mode =3D 0; =20 /* Read the Oscillator Failure only in XT mode */ - rc_mode =3D abx80x_is_rc_mode(client); + rc_mode =3D abx80x_is_rc_mode(dev); if (rc_mode < 0) return rc_mode; =20 if (!rc_mode) { - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSS); - if (flags < 0) - return flags; + err =3D regmap_read(priv->regmap, ABX8XX_REG_OSS, &flags); + if (err < 0) + return err; =20 if (flags & ABX8XX_OSS_OF) { dev_err(dev, "Oscillator failure, data is invalid.\n"); @@ -207,10 +211,9 @@ static int abx80x_rtc_read_time(struct device *dev, st= ruct rtc_time *tm) } } =20 - err =3D i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_HTH, - sizeof(buf), buf); + err =3D regmap_bulk_read(priv->regmap, ABX8XX_REG_HTH, buf, sizeof(buf)); if (err < 0) { - dev_err(&client->dev, "Unable to read date\n"); + dev_err(dev, "Unable to read date\n"); return -EIO; } =20 @@ -227,10 +230,10 @@ static int abx80x_rtc_read_time(struct device *dev, s= truct rtc_time *tm) =20 static int abx80x_rtc_set_time(struct device *dev, struct rtc_time *tm) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); unsigned char buf[8]; - int err, flags; + unsigned int flags; + int err; =20 if (tm->tm_year < 100) return -EINVAL; @@ -246,22 +249,22 @@ static int abx80x_rtc_set_time(struct device *dev, st= ruct rtc_time *tm) =20 guard(mutex)(&priv->lock); =20 - err =3D i2c_smbus_write_i2c_block_data(client, ABX8XX_REG_HTH, - sizeof(buf), buf); + err =3D regmap_bulk_write(priv->regmap, ABX8XX_REG_HTH, buf, + sizeof(buf)); if (err < 0) { - dev_err(&client->dev, "Unable to write to date registers\n"); + dev_err(dev, "Unable to write to date registers\n"); return -EIO; } =20 /* Clear the OF bit of Oscillator Status Register */ - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSS); - if (flags < 0) - return flags; + err =3D regmap_read(priv->regmap, ABX8XX_REG_OSS, &flags); + if (err < 0) + return err; =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSS, - flags & ~ABX8XX_OSS_OF); + err =3D regmap_write(priv->regmap, ABX8XX_REG_OSS, + flags & ~ABX8XX_OSS_OF); if (err < 0) { - dev_err(&client->dev, "Unable to write oscillator status register\n"); + dev_err(dev, "Unable to write oscillator status register\n"); return err; } =20 @@ -270,16 +273,16 @@ static int abx80x_rtc_set_time(struct device *dev, st= ruct rtc_time *tm) =20 static irqreturn_t abx80x_handle_irq(int irq, void *dev_id) { - struct i2c_client *client =3D dev_id; - struct abx80x_priv *priv =3D i2c_get_clientdata(client); + struct device *dev =3D dev_id; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); struct rtc_device *rtc =3D priv->rtc; - unsigned int status_flags_clear; - int status; + unsigned int status, status_flags_clear; + int err; =20 guard(mutex)(&priv->lock); =20 - status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); - if (status < 0) + err =3D regmap_read(priv->regmap, ABX8XX_REG_STATUS, &status); + if (err < 0) return IRQ_NONE; =20 if (status & ABX8XX_STATUS_AF) @@ -290,13 +293,13 @@ static irqreturn_t abx80x_handle_irq(int irq, void *d= ev_id) * reset kicks in. */ if (status & ABX8XX_STATUS_WDT) - dev_alert(&client->dev, "watchdog timeout interrupt.\n"); + dev_alert(dev, "watchdog timeout interrupt.\n"); =20 status_flags_clear =3D status & (ABX8XX_STATUS_AF | ABX8XX_STATUS_WDT); =20 if (status_flags_clear) { - i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, - ~status_flags_clear); + regmap_write(priv->regmap, ABX8XX_REG_STATUS, + ~status_flags_clear); return IRQ_HANDLED; } =20 @@ -305,25 +308,24 @@ static irqreturn_t abx80x_handle_irq(int irq, void *d= ev_id) =20 static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); unsigned char buf[7]; =20 - int irq_mask, err; + unsigned int irq_mask; + int err; =20 if (priv->irq <=3D 0) return -EINVAL; =20 - err =3D i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_ASC, - sizeof(buf), buf); - if (err < 0) + err =3D regmap_bulk_read(priv->regmap, ABX8XX_REG_ASC, buf, sizeof(buf)); + if (err) return err; if (err < ARRAY_SIZE(buf)) return -EIO; =20 - irq_mask =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); - if (irq_mask < 0) - return irq_mask; + err =3D regmap_read(priv->regmap, ABX8XX_REG_IRQ, &irq_mask); + if (err < 0) + return err; =20 t->time.tm_sec =3D bcd2bin(buf[0] & 0x7F); t->time.tm_min =3D bcd2bin(buf[1] & 0x7F); @@ -340,8 +342,7 @@ static int abx80x_read_alarm(struct device *dev, struct= rtc_wkalrm *t) =20 static int abx80x_set_alarm(struct device *dev, struct rtc_wkalrm *t) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); u8 alarm[6]; int err; =20 @@ -357,17 +358,16 @@ static int abx80x_set_alarm(struct device *dev, struc= t rtc_wkalrm *t) =20 guard(mutex)(&priv->lock); =20 - err =3D i2c_smbus_write_i2c_block_data(client, ABX8XX_REG_AHTH, - sizeof(alarm), alarm); + err =3D regmap_bulk_write(priv->regmap, ABX8XX_REG_AHTH, + alarm, sizeof(alarm)); if (err < 0) { - dev_err(&client->dev, "Unable to write alarm registers\n"); + dev_err(dev, "Unable to write alarm registers\n"); return -EIO; } =20 if (t->enabled) { - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, - (ABX8XX_IRQ_IM_1_4 | - ABX8XX_IRQ_AIE)); + err =3D regmap_write(priv->regmap, ABX8XX_REG_IRQ, + ABX8XX_IRQ_IM_1_4 | ABX8XX_IRQ_AIE); if (err) return err; } @@ -378,9 +378,9 @@ static int abx80x_set_alarm(struct device *dev, struct = rtc_wkalrm *t) static int abx80x_rtc_set_autocalibration(struct device *dev, int autocalibration) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); - int retval, flags =3D 0; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + unsigned int flags =3D 0; + int retval; =20 if ((autocalibration !=3D 0) && (autocalibration !=3D 1024) && (autocalibration !=3D 512)) { @@ -390,9 +390,9 @@ static int abx80x_rtc_set_autocalibration(struct device= *dev, =20 guard(mutex)(&priv->lock); =20 - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); - if (flags < 0) - return flags; + retval =3D regmap_read(priv->regmap, ABX8XX_REG_OSC, &flags); + if (retval < 0) + return retval; =20 if (autocalibration =3D=3D 0) { flags &=3D ~(ABX8XX_OSC_ACAL_512 | ABX8XX_OSC_ACAL_1024); @@ -406,22 +406,23 @@ static int abx80x_rtc_set_autocalibration(struct devi= ce *dev, } =20 /* Unlock write access to Oscillator Control Register */ - if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) + if (abx80x_write_config_key(dev, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - retval =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSC, flags); + retval =3D regmap_write(priv->regmap, ABX8XX_REG_OSC, flags); =20 return retval; } =20 static int abx80x_rtc_get_autocalibration(struct device *dev) { - struct i2c_client *client =3D to_i2c_client(dev); - int flags =3D 0, autocalibration; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + unsigned int flags =3D 0; + int autocalibration, err; =20 - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); - if (flags < 0) - return flags; + err =3D regmap_read(priv->regmap, ABX8XX_REG_OSC, &flags); + if (err < 0) + return err; =20 if (flags & ABX8XX_OSC_ACAL_512) autocalibration =3D 512; @@ -472,9 +473,9 @@ static ssize_t oscillator_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { - struct i2c_client *client =3D to_i2c_client(dev->parent); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); - int retval, flags, rc_mode =3D 0; + struct abx80x_priv *priv =3D dev_get_drvdata(dev->parent); + int retval, rc_mode =3D 0; + unsigned int flags; =20 if (strncmp(buf, "rc", 2) =3D=3D 0) { rc_mode =3D 1; @@ -487,9 +488,9 @@ static ssize_t oscillator_store(struct device *dev, =20 guard(mutex)(&priv->lock); =20 - flags =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); - if (flags < 0) - return flags; + retval =3D regmap_read(priv->regmap, ABX8XX_REG_OSC, &flags); + if (retval < 0) + return retval; =20 if (rc_mode =3D=3D 0) flags &=3D ~(ABX8XX_OSC_OSEL); @@ -497,10 +498,10 @@ static ssize_t oscillator_store(struct device *dev, flags |=3D (ABX8XX_OSC_OSEL); =20 /* Unlock write access on Oscillator Control register */ - if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) + if (abx80x_write_config_key(dev->parent, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - retval =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSC, flags); + retval =3D regmap_write(priv->regmap, ABX8XX_REG_OSC, flags); if (retval < 0) { dev_err(dev, "Failed to write Oscillator Control register\n"); return retval; @@ -513,9 +514,8 @@ static ssize_t oscillator_show(struct device *dev, struct device_attribute *attr, char *buf) { int rc_mode =3D 0; - struct i2c_client *client =3D to_i2c_client(dev->parent); =20 - rc_mode =3D abx80x_is_rc_mode(client); + rc_mode =3D abx80x_is_rc_mode(dev->parent); =20 if (rc_mode < 0) { dev_err(dev, "Failed to read RTC oscillator selection\n"); @@ -543,33 +543,31 @@ static const struct attribute_group rtc_calib_attr_gr= oup =3D { =20 static int abx80x_alarm_irq_enable(struct device *dev, unsigned int enable= d) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); + struct abx80x_priv *priv =3D dev_get_drvdata(dev); int err; =20 guard(mutex)(&priv->lock); =20 if (enabled) - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, - (ABX8XX_IRQ_IM_1_4 | - ABX8XX_IRQ_AIE)); + err =3D regmap_write(priv->regmap, ABX8XX_REG_IRQ, + ABX8XX_IRQ_IM_1_4 | ABX8XX_IRQ_AIE); else - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, - ABX8XX_IRQ_IM_1_4); + err =3D regmap_write(priv->regmap, ABX8XX_REG_IRQ, + ABX8XX_IRQ_IM_1_4); return err; } =20 static int abx80x_ioctl(struct device *dev, unsigned int cmd, unsigned lon= g arg) { - struct i2c_client *client =3D to_i2c_client(dev); - struct abx80x_priv *priv =3D i2c_get_clientdata(client); - int status, tmp; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + unsigned int status; + int err, tmp; =20 switch (cmd) { case RTC_VL_READ: - status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); - if (status < 0) - return status; + err =3D regmap_read(priv->regmap, ABX8XX_REG_STATUS, &status); + if (err < 0) + return err; =20 tmp =3D status & ABX8XX_STATUS_BLF ? RTC_VL_BACKUP_LOW : 0; =20 @@ -577,16 +575,15 @@ static int abx80x_ioctl(struct device *dev, unsigned = int cmd, unsigned long arg) =20 case RTC_VL_CLR: scoped_guard(mutex, &priv->lock) { - status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); - if (status < 0) - return status; + err =3D regmap_read(priv->regmap, ABX8XX_REG_STATUS, &status); + if (err < 0) + return err; =20 status &=3D ~ABX8XX_STATUS_BLF; =20 - tmp =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, - status); - if (tmp < 0) - return tmp; + err =3D regmap_write(priv->regmap, ABX8XX_REG_STATUS, status); + if (err < 0) + return err; } =20 return 0; @@ -605,9 +602,9 @@ static const struct rtc_class_ops abx80x_rtc_ops =3D { .ioctl =3D abx80x_ioctl, }; =20 -static int abx80x_dt_trickle_cfg(struct i2c_client *client) +static int abx80x_dt_trickle_cfg(struct device *dev) { - struct device_node *np =3D client->dev.of_node; + struct device_node *np =3D dev->of_node; const char *diode; int trickle_cfg =3D 0; int i, ret; @@ -622,7 +619,7 @@ static int abx80x_dt_trickle_cfg(struct i2c_client *cli= ent) } else if (!strcmp(diode, "schottky")) { trickle_cfg |=3D ABX8XX_TRICKLE_SCHOTTKY_DIODE; } else { - dev_dbg(&client->dev, "Invalid tc-diode value: %s\n", diode); + dev_dbg(dev, "Invalid tc-diode value: %s\n", diode); return -EINVAL; } =20 @@ -635,7 +632,7 @@ static int abx80x_dt_trickle_cfg(struct i2c_client *cli= ent) break; =20 if (i =3D=3D sizeof(trickle_resistors)) { - dev_dbg(&client->dev, "Invalid tc-resistor value: %u\n", tmp); + dev_dbg(dev, "Invalid tc-resistor value: %u\n", tmp); return -EINVAL; } =20 @@ -662,7 +659,7 @@ static int __abx80x_wdog_set_timeout(struct watchdog_de= vice *wdog, * Writing any timeout to the WDT register resets the watchdog timer. * Writing 0 disables it. */ - return i2c_smbus_write_byte_data(priv->client, ABX8XX_REG_WDT, val); + return regmap_write(priv->regmap, ABX8XX_REG_WDT, val); } =20 static int abx80x_wdog_set_timeout(struct watchdog_device *wdog, @@ -707,9 +704,11 @@ static const struct watchdog_ops abx80x_wdog_ops =3D { .set_timeout =3D abx80x_wdog_set_timeout, }; =20 -static int abx80x_setup_watchdog(struct abx80x_priv *priv) +static int abx80x_setup_watchdog(struct device *dev) { - priv->wdog.parent =3D &priv->client->dev; + struct abx80x_priv *priv =3D dev_get_drvdata(dev); + + priv->wdog.parent =3D dev; priv->wdog.ops =3D &abx80x_wdog_ops; priv->wdog.info =3D &abx80x_wdog_info; priv->wdog.min_timeout =3D 1; @@ -718,10 +717,10 @@ static int abx80x_setup_watchdog(struct abx80x_priv *= priv) =20 watchdog_set_drvdata(&priv->wdog, priv); =20 - return devm_watchdog_register_device(&priv->client->dev, &priv->wdog); + return devm_watchdog_register_device(dev, &priv->wdog); } #else -static int abx80x_setup_watchdog(struct abx80x_priv *priv) +static int abx80x_setup_watchdog(struct device *dev) { return 0; } @@ -733,33 +732,29 @@ static int abx80x_nvmem_xfer(struct abx80x_priv *priv= , unsigned int offset, int ret; =20 while (bytes) { - u8 extram, reg, len, lower, upper; + u8 reg, len, lower, upper; =20 lower =3D FIELD_GET(NVMEM_ADDR_LOWER, offset); upper =3D FIELD_GET(NVMEM_ADDR_UPPER, offset); - extram =3D FIELD_PREP(ABX8XX_EXTRAM_XADS, upper); reg =3D ABX8XX_SRAM_BASE + lower; len =3D min(lower + bytes, (size_t)ABX8XX_SRAM_WIN_SIZE) - lower; len =3D min_t(u8, len, I2C_SMBUS_BLOCK_MAX); =20 guard(mutex)(&priv->lock); =20 - ret =3D i2c_smbus_write_byte_data(priv->client, ABX8XX_REG_EXTRAM, - extram); + ret =3D regmap_update_bits(priv->regmap, ABX8XX_REG_EXTRAM, + ABX8XX_EXTRAM_XADS, upper); if (ret) return ret; =20 if (write) { - ret =3D i2c_smbus_write_i2c_block_data(priv->client, reg, - len, val); + ret =3D regmap_bulk_write(priv->regmap, reg, val, len); if (ret) return ret; } else { - ret =3D i2c_smbus_read_i2c_block_data(priv->client, reg, - len, val); - if (ret <=3D 0) - return ret ? ret : -EIO; - len =3D ret; + ret =3D regmap_bulk_read(priv->regmap, reg, val, len); + if (ret) + return ret; } =20 offset +=3D len; @@ -795,6 +790,38 @@ static int abx80x_setup_nvmem(struct abx80x_priv *priv) return devm_rtc_nvmem_register(priv->rtc, &config); } =20 +static const struct regmap_range abx80x_no_read_ranges[] =3D { + regmap_reg_range(0x1e, 0x1e), + regmap_reg_range(0x22, 0x25), + regmap_reg_range(0x31, 0x3e), +}; + +static const struct regmap_range abx80x_no_write_ranges[] =3D { + regmap_reg_range(0x1e, 0x1e), + regmap_reg_range(0x22, 0x25), + regmap_reg_range(ABX8XX_REG_ID0, ABX8XX_REG_ID0 + 6), + regmap_reg_range(0x31, 0x3e), +}; + +static const struct regmap_access_table abx80x_read_table =3D { + .no_ranges =3D abx80x_no_read_ranges, + .n_no_ranges =3D ARRAY_SIZE(abx80x_no_read_ranges), +}; + +static const struct regmap_access_table abx80x_write_table =3D { + .no_ranges =3D abx80x_no_write_ranges, + .n_no_ranges =3D ARRAY_SIZE(abx80x_no_write_ranges), +}; + +static const struct regmap_config abx80x_regmap_config_i2c =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, + + .rd_table =3D &abx80x_read_table, + .wr_table =3D &abx80x_write_table, +}; + static const struct i2c_device_id abx80x_id[] =3D { { .name =3D "abx80x", .driver_data =3D ABX80X }, { .name =3D "ab0801", .driver_data =3D AB0801 }, @@ -812,9 +839,11 @@ MODULE_DEVICE_TABLE(i2c, abx80x_id); =20 static int abx80x_probe(struct i2c_client *client) { + struct regmap *regmap; struct device_node *np =3D client->dev.of_node; struct abx80x_priv *priv; - int i, data, err, trickle_cfg =3D -EINVAL; + int i, err, trickle_cfg =3D -EINVAL; + unsigned int data; char buf[7]; unsigned int part =3D (uintptr_t)i2c_get_match_data(client); unsigned int partnumber; @@ -826,8 +855,30 @@ static int abx80x_probe(struct i2c_client *client) if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) return -ENODEV; =20 - err =3D i2c_smbus_read_i2c_block_data(client, ABX8XX_REG_ID0, - sizeof(buf), buf); + regmap =3D devm_regmap_init_i2c(client, &abx80x_regmap_config_i2c); + if (IS_ERR(regmap)) { + dev_err(&client->dev, "Unable to allocate regmap\n"); + return PTR_ERR(regmap); + } + + priv =3D devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); + if (priv =3D=3D NULL) + return -ENOMEM; + + priv->rtc =3D devm_rtc_allocate_device(&client->dev); + if (IS_ERR(priv->rtc)) + return PTR_ERR(priv->rtc); + + priv->rtc->ops =3D &abx80x_rtc_ops; + priv->irq =3D client->irq; + priv->regmap =3D regmap; + err =3D devm_mutex_init(&client->dev, &priv->lock); + if (err) + return err; + + dev_set_drvdata(&client->dev, priv); + + err =3D regmap_bulk_read(regmap, ABX8XX_REG_ID0, buf, sizeof(buf)); if (err < 0) { dev_err(&client->dev, "Unable to read partnumber\n"); return -EIO; @@ -842,16 +893,14 @@ static int abx80x_probe(struct i2c_client *client) dev_info(&client->dev, "model %04x, revision %u.%u, lot %x, wafer %x, uid= %x\n", partnumber, majrev, minrev, lot, wafer, uid); =20 - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_CTRL1); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_CTRL1, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read control register\n"); return -EIO; } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_CTRL1, - ((data & ~(ABX8XX_CTRL_12_24 | - ABX8XX_CTRL_ARST)) | - ABX8XX_CTRL_WRITE)); + err =3D regmap_write(regmap, ABX8XX_REG_CTRL1, + (data & ~(ABX8XX_CTRL_12_24 | ABX8XX_CTRL_ARST)) | ABX8XX_CTRL_WRITE= ); if (err < 0) { dev_err(&client->dev, "Unable to write control register\n"); return -EIO; @@ -865,15 +914,15 @@ static int abx80x_probe(struct i2c_client *client) * register is set. RV-1805-C3 datasheet indicates that * the bit should be cleared in section 11h - Control2. */ - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_CTRL2); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_CTRL2, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read control2 register\n"); return -EIO; } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_CTRL2, - data & ~ABX8XX_CTRL2_RSVD); + err =3D regmap_write(regmap, ABX8XX_REG_CTRL2, + data & ~ABX8XX_CTRL2_RSVD); if (err < 0) { dev_err(&client->dev, "Unable to write control2 register\n"); @@ -885,8 +934,8 @@ static int abx80x_probe(struct i2c_client *client) * 10pin package and the EXTI input is not present. * Disable it to avoid leakage. */ - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OUT_CTRL); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_OUT_CTRL, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read output control register\n"); return -EIO; @@ -896,11 +945,11 @@ static int abx80x_probe(struct i2c_client *client) * Write the configuration key register to enable access to * the config2 register */ - if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_MISC) < 0) + if (abx80x_write_config_key(&client->dev, ABX8XX_CFG_KEY_MISC) < 0) return -EIO; =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OUT_CTRL, - data | ABX8XX_OUT_CTRL_EXDS); + err =3D regmap_write(regmap, ABX8XX_REG_OUT_CTRL, + data | ABX8XX_OUT_CTRL_EXDS); if (err < 0) { dev_err(&client->dev, "Unable to write output control register\n"); @@ -928,38 +977,20 @@ static int abx80x_probe(struct i2c_client *client) } =20 if (np && abx80x_caps[part].has_tc) - trickle_cfg =3D abx80x_dt_trickle_cfg(client); + trickle_cfg =3D abx80x_dt_trickle_cfg(&client->dev); =20 if (trickle_cfg > 0) { dev_info(&client->dev, "Enabling trickle charger: %02x\n", trickle_cfg); - abx80x_enable_trickle_charger(client, trickle_cfg); + abx80x_enable_trickle_charger(&client->dev, trickle_cfg); } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_CD_TIMER_CTL, - BIT(2)); - if (err) - return err; - - priv =3D devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); - if (priv =3D=3D NULL) - return -ENOMEM; - - priv->rtc =3D devm_rtc_allocate_device(&client->dev); - if (IS_ERR(priv->rtc)) - return PTR_ERR(priv->rtc); - - priv->rtc->ops =3D &abx80x_rtc_ops; - priv->client =3D client; - priv->irq =3D client->irq; - err =3D devm_mutex_init(&client->dev, &priv->lock); + err =3D regmap_write(regmap, ABX8XX_REG_CD_TIMER_CTL, BIT(2)); if (err) return err; =20 - i2c_set_clientdata(client, priv); - if (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(priv); + err =3D abx80x_setup_watchdog(&client->dev); if (err) return err; } @@ -969,24 +1000,24 @@ static int abx80x_probe(struct i2c_client *client) return err; =20 /* Disable unused interrupts */ - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_IRQ, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read irq register\n"); return -EIO; } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, - data & ~(ABX8XX_IRQ_EX1E | - ABX8XX_IRQ_EX2E | - ABX8XX_IRQ_TIE | - ABX8XX_IRQ_BLIE)); + err =3D regmap_write(regmap, ABX8XX_REG_IRQ, + data & ~(ABX8XX_IRQ_EX1E | + ABX8XX_IRQ_EX2E | + ABX8XX_IRQ_TIE | + ABX8XX_IRQ_BLIE)); if (err < 0) { dev_err(&client->dev, "Unable to write irq register\n"); return -EIO; } =20 - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_OSC, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read Oscillator Control register\n"); return -EIO; } @@ -995,9 +1026,9 @@ static int abx80x_probe(struct i2c_client *client) if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSC, - data & ~(ABX8XX_OSC_ACIE | - ABX8XX_OSC_OFIE)); + err =3D regmap_write(regmap, ABX8XX_REG_OSC, + data & ~(ABX8XX_OSC_ACIE | + ABX8XX_OSC_OFIE)); if (err < 0) { dev_err(&client->dev, "Unable to write Oscillator Control register\n"); return -EIO; @@ -1009,7 +1040,7 @@ static int abx80x_probe(struct i2c_client *client) abx80x_handle_irq, IRQF_SHARED | IRQF_ONESHOT, "abx8xx", - client); + &client->dev); if (err) { dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); priv->irq =3D 0; --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f46.google.com (mail-wr1-f46.google.com [209.85.221.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 9E03D52E05C for ; Mon, 7 Sep 2026 20:34:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; cv=none; b=SK95DDtamw23w+Vip8oGaZfJB6RljcGbFH+4slhXKHff69M2viv6sFpAqVQzJWD8fHg9AXBnX1fwnV+fxhWO6rgepNHGxIpshsQCpRBQMbtcAMSC4Xz8N1oI8B/wVoFCrmYch1LE5Bh7UNGDOFnt+g7Q4xmgzpW9VoPTuGcEWlY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; c=relaxed/simple; bh=JZEmXowo7mfUOL+CnzAnogoZn2/XPy4YsiLFUq8ifEU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=sM6YB3rL8bwBL5Hm3wLdLILqLfWLh/9gsa0P78hDPhz43Mo7FroUgbTVhTUsC5GefWW2W6H7AXqfCdD8WWx0b7AhgpYLA0cCFQ+6OTazhpsPfzV7Bm/rcXKjWW+VorFAMB1jxpxRHRmYiI8MnZorbz4OmioVfQUL6F8eCa7864E= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=nuHraoQ4; arc=none smtp.client-ip=209.85.221.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="nuHraoQ4" Received: by mail-wr1-f46.google.com with SMTP id ffacd0b85a97d-482e4998d28so3125166f8f.2 for ; Mon, 07 Sep 2026 13:34:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813253; x=1789418053; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=aiiGHwZbZuUKXZE7eoiXYRpECDB5XUxWTkzTLV8BBq0=; b=nuHraoQ4JzFu4fjXkL9KK4Ls29VEF3TpPCWdAzfP5ClXTezx0g1VojjvS+V2MZXBaK NeaNsdu7B6oypn+1Cu6mDxLUmY6ytHi7/p/526X5iur5yvIAjE2L+yOzn8nAPtMc9iwq aq7kROtmscr6bz6U75XQTGf/M08ltZ+c1O2WSx5SQzUAgSavm6rWXmCZpmSO1BLT/oKs VhJDKEfewhZk0Xqp7nMeo14En0OW+krWTZhXb2URJ0ZBGp5j6iGCNWSETRPv0BKT9Ztr kqPZKkpVNg2fgxjBLREsVDQpRA6DfdCpIsbWvsB/qXPa3Cng32aRj9S1EXCeLQ29lXA0 0MHQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813253; x=1789418053; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=aiiGHwZbZuUKXZE7eoiXYRpECDB5XUxWTkzTLV8BBq0=; b=gk/3+Bac51GAqqxaGqLtzYUqGYBX+kjY6T+hD3wPUKSA723YHOSZdj/5bOmJvRbSYU QzYIi6F62lof4Zl4zaw/rIOJ7OeJxqXkvqWyVv1eOpwEe+Um31RyI2cVuLidjPAmO0Rp iY+AsyDr8mzvqE2j540+gcd1XGzHW2QWVDDYQmXPfDTFPnVKneVQ3+xEX8NJFCl05ids orIj+gR20CBFbfQdNdJJSWENI9prAw2qG1xR1ywo8HLOOLgSlk1gRG2bAwhLhqYSjkvo npAk4rf02mRXNQAIm5UOB+gRFmLFPmpO+8aEDFH6BWc46b4XnQRIrjREnitC/ZI1v6fk XtRg== X-Forwarded-Encrypted: i=1; AKwUvBwqR7hGwufMeg19Ai9uIougfinigBM9FIJaNS/Tp+qJMvgRa8H1Kw4+CMcfqqMz8ZJ7GGahW1O2up8T/j8=@vger.kernel.org X-Gm-Message-State: AFuF++k355QxOhl71LEcRNKAm8Y8WNyps1dMl5YKvVi8J44eJHVFyFS6 mrMVj03w6JRDUTBw+pxXx7iBqJ6iR3vxISDC/fpOyNyZBtfyU71JHFza X-Gm-Gg: AYBFou0k43Br9tTmc4s5bvoSFHLT061skxCu/xhQc17DnLGHDEd2zDKZrhrvlBXUj61 vcP3xCaA3y/POQ9GDYa5zz8aWibLRsktUE3SRv8sWxgL3Ac7Svcg1xoD9dtLX0Ek4QNefbz2WqK CuCqn5UdSknes2NqJCOtWGyFhyWccBVV93vjveXKGYuYTVd5nm0jaWy/AL8zjNoswBM+YxqFt4+ ZEWFG8kLVQ04v0Ghsqx4Zxthz3futoy+iO0hkJJ6YsQ+JQCI+R7Kyk4UDo+Ux9Jnsdtvr/u2pva oPqxd5GH8gymdX07NX7IWB4e68mxKZ0EQqF68K4qIG1rEpembpBAbmd5yD0PS+RHwpGN/ry8lkL v7s41eRJfNpBavaTieHjchKHtFxTkypN+oyj3ICwRejyNpTDzrMWqv754NKE7m/zDPKGM8wxSsf pPl4ZLlfbug8xOBFyIFa9aZd0rMUKEYDsSnoOga8PbObiA+xm2gCZZlwFFlovcKVk= X-Received: by 2002:a05:6000:186a:b0:485:8fe2:eda1 with SMTP id ffacd0b85a97d-4858fe2eedcmr17410130f8f.17.1788813252893; Mon, 07 Sep 2026 13:34:12 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:12 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 7/9] rtc: abx80x: replace read-modify-write pattern with regmap helpers Date: Mon, 7 Sep 2026 22:32:14 +0200 Message-ID: <20260907203216.53192-8-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Before introducing the regmap usage in the driver, updating specific bits of a register was performed using the read-modify-write pattern. Now, the functions regmap_update_bits() and regmap_write_bits() can be used to simplify the code. Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 134 ++++++++++----------------------------- 1 file changed, 34 insertions(+), 100 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 7b8e6546ccff..b1d8d5a5ddcf 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -232,7 +232,6 @@ static int abx80x_rtc_set_time(struct device *dev, stru= ct rtc_time *tm) { struct abx80x_priv *priv =3D dev_get_drvdata(dev); unsigned char buf[8]; - unsigned int flags; int err; =20 if (tm->tm_year < 100) @@ -257,18 +256,11 @@ static int abx80x_rtc_set_time(struct device *dev, st= ruct rtc_time *tm) } =20 /* Clear the OF bit of Oscillator Status Register */ - err =3D regmap_read(priv->regmap, ABX8XX_REG_OSS, &flags); + err =3D regmap_update_bits(priv->regmap, ABX8XX_REG_OSS, ABX8XX_OSS_OF, 0= ); if (err < 0) - return err; - - err =3D regmap_write(priv->regmap, ABX8XX_REG_OSS, - flags & ~ABX8XX_OSS_OF); - if (err < 0) { dev_err(dev, "Unable to write oscillator status register\n"); - return err; - } =20 - return 0; + return err; } =20 static irqreturn_t abx80x_handle_irq(int irq, void *dev_id) @@ -380,7 +372,6 @@ static int abx80x_rtc_set_autocalibration(struct device= *dev, { struct abx80x_priv *priv =3D dev_get_drvdata(dev); unsigned int flags =3D 0; - int retval; =20 if ((autocalibration !=3D 0) && (autocalibration !=3D 1024) && (autocalibration !=3D 512)) { @@ -388,12 +379,6 @@ static int abx80x_rtc_set_autocalibration(struct devic= e *dev, return -EINVAL; } =20 - guard(mutex)(&priv->lock); - - retval =3D regmap_read(priv->regmap, ABX8XX_REG_OSC, &flags); - if (retval < 0) - return retval; - if (autocalibration =3D=3D 0) { flags &=3D ~(ABX8XX_OSC_ACAL_512 | ABX8XX_OSC_ACAL_1024); } else if (autocalibration =3D=3D 1024) { @@ -405,13 +390,15 @@ static int abx80x_rtc_set_autocalibration(struct devi= ce *dev, flags |=3D (ABX8XX_OSC_ACAL_1024 | ABX8XX_OSC_ACAL_512); } =20 + guard(mutex)(&priv->lock); + /* Unlock write access to Oscillator Control Register */ if (abx80x_write_config_key(dev, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - retval =3D regmap_write(priv->regmap, ABX8XX_REG_OSC, flags); - - return retval; + return regmap_write_bits(priv->regmap, ABX8XX_REG_OSC, + ABX8XX_OSC_ACAL_1024 | ABX8XX_OSC_ACAL_512, + flags); } =20 static int abx80x_rtc_get_autocalibration(struct device *dev) @@ -475,7 +462,6 @@ static ssize_t oscillator_store(struct device *dev, { struct abx80x_priv *priv =3D dev_get_drvdata(dev->parent); int retval, rc_mode =3D 0; - unsigned int flags; =20 if (strncmp(buf, "rc", 2) =3D=3D 0) { rc_mode =3D 1; @@ -488,24 +474,14 @@ static ssize_t oscillator_store(struct device *dev, =20 guard(mutex)(&priv->lock); =20 - retval =3D regmap_read(priv->regmap, ABX8XX_REG_OSC, &flags); - if (retval < 0) - return retval; - - if (rc_mode =3D=3D 0) - flags &=3D ~(ABX8XX_OSC_OSEL); - else - flags |=3D (ABX8XX_OSC_OSEL); - /* Unlock write access on Oscillator Control register */ if (abx80x_write_config_key(dev->parent, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - retval =3D regmap_write(priv->regmap, ABX8XX_REG_OSC, flags); - if (retval < 0) { + retval =3D regmap_write_bits(priv->regmap, ABX8XX_REG_OSC, ABX8XX_OSC_OSE= L, + rc_mode =3D=3D 0 ? 0 : (ABX8XX_OSC_OSEL)); + if (retval < 0) dev_err(dev, "Failed to write Oscillator Control register\n"); - return retval; - } =20 return retval ? retval : count; } @@ -575,18 +551,11 @@ static int abx80x_ioctl(struct device *dev, unsigned = int cmd, unsigned long arg) =20 case RTC_VL_CLR: scoped_guard(mutex, &priv->lock) { - err =3D regmap_read(priv->regmap, ABX8XX_REG_STATUS, &status); - if (err < 0) - return err; - - status &=3D ~ABX8XX_STATUS_BLF; - - err =3D regmap_write(priv->regmap, ABX8XX_REG_STATUS, status); - if (err < 0) - return err; + err =3D regmap_update_bits(priv->regmap, ABX8XX_REG_STATUS, + ABX8XX_STATUS_BLF, 0); } =20 - return 0; + return err; =20 default: return -ENOIOCTLCMD; @@ -843,7 +812,6 @@ static int abx80x_probe(struct i2c_client *client) struct device_node *np =3D client->dev.of_node; struct abx80x_priv *priv; int i, err, trickle_cfg =3D -EINVAL; - unsigned int data; char buf[7]; unsigned int part =3D (uintptr_t)i2c_get_match_data(client); unsigned int partnumber; @@ -893,14 +861,9 @@ static int abx80x_probe(struct i2c_client *client) dev_info(&client->dev, "model %04x, revision %u.%u, lot %x, wafer %x, uid= %x\n", partnumber, majrev, minrev, lot, wafer, uid); =20 - err =3D regmap_read(regmap, ABX8XX_REG_CTRL1, &data); - if (err < 0) { - dev_err(&client->dev, "Unable to read control register\n"); - return -EIO; - } - - err =3D regmap_write(regmap, ABX8XX_REG_CTRL1, - (data & ~(ABX8XX_CTRL_12_24 | ABX8XX_CTRL_ARST)) | ABX8XX_CTRL_WRITE= ); + err =3D regmap_update_bits(regmap, ABX8XX_REG_CTRL1, + ABX8XX_CTRL_12_24 | ABX8XX_CTRL_ARST | ABX8XX_CTRL_WRITE, + ABX8XX_CTRL_WRITE); if (err < 0) { dev_err(&client->dev, "Unable to write control register\n"); return -EIO; @@ -914,30 +877,10 @@ static int abx80x_probe(struct i2c_client *client) * register is set. RV-1805-C3 datasheet indicates that * the bit should be cleared in section 11h - Control2. */ - err =3D regmap_read(regmap, ABX8XX_REG_CTRL2, &data); - if (err < 0) { - dev_err(&client->dev, - "Unable to read control2 register\n"); - return -EIO; - } - - err =3D regmap_write(regmap, ABX8XX_REG_CTRL2, - data & ~ABX8XX_CTRL2_RSVD); - if (err < 0) { - dev_err(&client->dev, - "Unable to write control2 register\n"); - return -EIO; - } - - /* - * Avoid extra power leakage. The RV1805 uses smaller - * 10pin package and the EXTI input is not present. - * Disable it to avoid leakage. - */ - err =3D regmap_read(regmap, ABX8XX_REG_OUT_CTRL, &data); + err =3D regmap_update_bits(regmap, ABX8XX_REG_CTRL2, + ABX8XX_CTRL2_RSVD, 0); if (err < 0) { - dev_err(&client->dev, - "Unable to read output control register\n"); + dev_err(&client->dev, "Unable to write control2 register\n"); return -EIO; } =20 @@ -948,8 +891,14 @@ static int abx80x_probe(struct i2c_client *client) if (abx80x_write_config_key(&client->dev, ABX8XX_CFG_KEY_MISC) < 0) return -EIO; =20 - err =3D regmap_write(regmap, ABX8XX_REG_OUT_CTRL, - data | ABX8XX_OUT_CTRL_EXDS); + /* + * Avoid extra power leakage. The RV1805 uses smaller + * 10pin package and the EXTI input is not present. + * Disable it to avoid leakage. + */ + err =3D regmap_write_bits(regmap, ABX8XX_REG_OUT_CTRL, + ABX8XX_OUT_CTRL_EXDS, + ABX8XX_OUT_CTRL_EXDS); if (err < 0) { dev_err(&client->dev, "Unable to write output control register\n"); @@ -1000,25 +949,11 @@ static int abx80x_probe(struct i2c_client *client) return err; =20 /* Disable unused interrupts */ - err =3D regmap_read(regmap, ABX8XX_REG_IRQ, &data); - if (err < 0) { - dev_err(&client->dev, "Unable to read irq register\n"); - return -EIO; - } - - err =3D regmap_write(regmap, ABX8XX_REG_IRQ, - data & ~(ABX8XX_IRQ_EX1E | - ABX8XX_IRQ_EX2E | - ABX8XX_IRQ_TIE | - ABX8XX_IRQ_BLIE)); - if (err < 0) { - dev_err(&client->dev, "Unable to write irq register\n"); - return -EIO; - } - - err =3D regmap_read(regmap, ABX8XX_REG_OSC, &data); + err =3D regmap_update_bits(regmap, ABX8XX_REG_IRQ, + ABX8XX_IRQ_EX1E | ABX8XX_IRQ_EX2E | + ABX8XX_IRQ_TIE | ABX8XX_IRQ_BLIE, 0); if (err < 0) { - dev_err(&client->dev, "Unable to read Oscillator Control register\n"); + dev_err(&client->dev, "Unable to update irq register\n"); return -EIO; } =20 @@ -1026,11 +961,10 @@ static int abx80x_probe(struct i2c_client *client) if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 - err =3D regmap_write(regmap, ABX8XX_REG_OSC, - data & ~(ABX8XX_OSC_ACIE | - ABX8XX_OSC_OFIE)); + err =3D regmap_write_bits(regmap, ABX8XX_REG_OSC, + ABX8XX_OSC_ACIE | ABX8XX_OSC_OFIE, 0); if (err < 0) { - dev_err(&client->dev, "Unable to write Oscillator Control register\n"); + dev_err(&client->dev, "Unable to update Oscillator Control register\n"); return -EIO; } =20 --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 6341952ED23 for ; Mon, 7 Sep 2026 20:34:16 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; cv=none; b=hXvb77/9uBW5TPJT1/7ylD66qNelf7e5JyX2RMS//41OsdC+ffnC6beoRH25u8jB5nDwR9LY+dlWTDEJmIi9+YdHujoy74sY4EEE7WBXI01J2TdiXlmFBdr5h6yJPNr2szhySBTc9nuQ5Vne22o7m0Wk12dZbK8J/L17Zh0jwGs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813258; c=relaxed/simple; bh=u6W3uQqF5WC0l814vqgtpr19+91xoqe57+O0xG04yJE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HiCTyVEBL+A/Nqx/XAZAu1PlsFBl4e7Xy9o5siyZxpJqdzkLTV5wiLZCJCACzG+manrmf0D2lFtxBZBSbGATJa5LGVlNSYalBR0RSjuNHajchvry7mzwNEvxGdmZs9NNHfnoiLsvbmjlXjZY7Iz4SMyn7Mhb8WKgBfCvNBhc3mA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=I2dbpTvN; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="I2dbpTvN" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-47ddf7b09e5so4447375f8f.1 for ; Mon, 07 Sep 2026 13:34:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813254; x=1789418054; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=HqcKjV4zD80YFZLKABhggbODsHGhhWgZ8BP7yh3DqWw=; b=I2dbpTvNoJH8oZdQeYNIZ4QK9SNAIJWaAxxOqC7xxNeBhYERmZQcqNWeXtab/cwy+9 dewnQcDHYGFDnpcsIYpbsG3qBmspkg0QoHedgK54nvf3Y+2C8SecWg4KBfoH5mRLtvI8 j1zL7fEr3Po1dLYktXoBzxjgjFr6KJRpuW/nmNM2YWtQBcGZv9pzreE//Z7re6mxjFaP IzJEqSCcSUc3mVGTAQ94AMbKcSTmx+RgkDvkdJdlZ6zLVUfMvld259zkatLyEhi7S2+C W+f4HIEXUTjJU62Tj04hiIccWFzQOMZypDp/akchm8koe74oZZcwKj226hk8uCYwkVK8 I3Xg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813254; x=1789418054; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=HqcKjV4zD80YFZLKABhggbODsHGhhWgZ8BP7yh3DqWw=; b=SHPttI82kyAG0Y5RUzNaWbYosi4/d5N1VM+Odk7Ks+J1xK3ystuvtvlAmYonBbKisN rsXI1YsjtRShz6INjC2B748tiar9OnTu8PYnyEIQ6oZfAPx2GdgJl8sCBJ+C4qcjLrvx Y2InzX7BVr9GbczsXhNrIr6hguyX9uTC/z7M5WYa4TZUt977vK8d7cQxxS5XgR0nJNQE wlYxpg//mm9YE5K+0cqlyThYM8XHzUgmB9jenQXo/Yiw6VgYj5s8ZJK9c3gbiRGwUSTt VzNxx52O6xaDBMl4D7NrSq9KsKxjnFJRQXJMXqNZVFJplIb989QKwt6cElupfiQcp7GP ZzgA== X-Forwarded-Encrypted: i=1; AKwUvBxN+iByIwhZThfhsWPXNrtncU14aZI5TiYuPMR9uIk+n9KoAZCrcNnVvXmvilS3L4oKw2nDkiwTy02Q/o8=@vger.kernel.org X-Gm-Message-State: AFuF++lkv7jAgVQF8IEGPDIS6j1R2Y41yl9Vv7cVyhh59kBqI8tcttAm BHk5NFHFVF5Vop9GAP5nPSGiPPIJyFrcGm3TwOeWmNCAZxk1pEwa5raQ X-Gm-Gg: AYBFou3FqajMZ9xEcCPBhIVDeMRi0zHQRqKPVD+byWd+ZIJp1ifcwEUA/myBVO4LQxO UJws6Tvc6FRgiibnNcN43V1Rdxgua8njkkuHfIMV9AuKcRQRdYJ/AbMkefll9BDZIc7b1kD2emo JJy96nFYdEqXM3/+9mAcBgH/YTXCNCoMMlmZwtOhuCt4crEMV6sQtO/4OP2stmv3LpsK3540k7U RbO992XlJm8mJ+PrVXuCRhdnOJletyeHD5SY4b8UjH25SuSVAK+3JbEx808s+3bI51uMfuqNB+L PnSUUhyOA6oTE+kyLO+rYmIlSWPIBLV+Mq7Q1o6LBtbWbSAFwKYeLUn+Gi51hBTXGRcnnxFGYJE 8cKq3a24k+PY3kKX95DCFDej2xxuLtCv+neVZlJS5lHRCElNMIrvCAmqFkj9R1H06luL1fS6hsC Y3njOIINtGU7xAI+VMrDRniYeHe5AOAs12YA65HXwVV7bt2z5j/FLAFzSB1XQx2g== X-Received: by 2002:a05:6000:2085:b0:484:3313:9475 with SMTP id ffacd0b85a97d-4858729a271mr26780978f8f.28.1788813254331; Mon, 07 Sep 2026 13:34:14 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:13 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 8/9] rtc: abx80x: create abx80x_i2c_probe() Date: Mon, 7 Sep 2026 22:32:15 +0200 Message-ID: <20260907203216.53192-9-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Move the I2C-specific code from abx80x_probe() to the newly created function. This is a preparation for introducing the support for ABX81X RTCs which use SPI interface. Signed-off-by: Antoni Pokusinski --- drivers/rtc/rtc-abx80x.c | 173 ++++++++++++++++++++++++--------------- 1 file changed, 106 insertions(+), 67 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index b1d8d5a5ddcf..c90407a023fe 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -782,73 +782,38 @@ static const struct regmap_access_table abx80x_write_= table =3D { .n_no_ranges =3D ARRAY_SIZE(abx80x_no_write_ranges), }; =20 -static const struct regmap_config abx80x_regmap_config_i2c =3D { - .reg_bits =3D 8, - .val_bits =3D 8, - .max_register =3D ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, - - .rd_table =3D &abx80x_read_table, - .wr_table =3D &abx80x_write_table, -}; - -static const struct i2c_device_id abx80x_id[] =3D { - { .name =3D "abx80x", .driver_data =3D ABX80X }, - { .name =3D "ab0801", .driver_data =3D AB0801 }, - { .name =3D "ab0803", .driver_data =3D AB0803 }, - { .name =3D "ab0804", .driver_data =3D AB0804 }, - { .name =3D "ab0805", .driver_data =3D AB0805 }, - { .name =3D "ab1801", .driver_data =3D AB1801 }, - { .name =3D "ab1803", .driver_data =3D AB1803 }, - { .name =3D "ab1804", .driver_data =3D AB1804 }, - { .name =3D "ab1805", .driver_data =3D AB1805 }, - { .name =3D "rv1805", .driver_data =3D RV1805 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, abx80x_id); - -static int abx80x_probe(struct i2c_client *client) +static int abx80x_probe(struct device *dev, struct regmap *regmap, int irq, + struct device_node *np, unsigned int part) { - struct regmap *regmap; - struct device_node *np =3D client->dev.of_node; struct abx80x_priv *priv; int i, err, trickle_cfg =3D -EINVAL; char buf[7]; - unsigned int part =3D (uintptr_t)i2c_get_match_data(client); unsigned int partnumber; unsigned int majrev, minrev; unsigned int lot; unsigned int wafer; unsigned int uid; =20 - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) - return -ENODEV; - - regmap =3D devm_regmap_init_i2c(client, &abx80x_regmap_config_i2c); - if (IS_ERR(regmap)) { - dev_err(&client->dev, "Unable to allocate regmap\n"); - return PTR_ERR(regmap); - } - - priv =3D devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); + priv =3D devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (priv =3D=3D NULL) return -ENOMEM; =20 - priv->rtc =3D devm_rtc_allocate_device(&client->dev); + priv->rtc =3D devm_rtc_allocate_device(dev); if (IS_ERR(priv->rtc)) return PTR_ERR(priv->rtc); =20 priv->rtc->ops =3D &abx80x_rtc_ops; - priv->irq =3D client->irq; + priv->irq =3D irq; priv->regmap =3D regmap; - err =3D devm_mutex_init(&client->dev, &priv->lock); + err =3D devm_mutex_init(dev, &priv->lock); if (err) return err; =20 - dev_set_drvdata(&client->dev, priv); + dev_set_drvdata(dev, priv); =20 err =3D regmap_bulk_read(regmap, ABX8XX_REG_ID0, buf, sizeof(buf)); if (err < 0) { - dev_err(&client->dev, "Unable to read partnumber\n"); + dev_err(dev, "Unable to read partnumber\n"); return -EIO; } =20 @@ -858,14 +823,14 @@ static int abx80x_probe(struct i2c_client *client) lot =3D ((buf[4] & 0x80) << 2) | ((buf[6] & 0x80) << 1) | buf[3]; uid =3D ((buf[4] & 0x7f) << 8) | buf[5]; wafer =3D (buf[6] & 0x7c) >> 2; - dev_info(&client->dev, "model %04x, revision %u.%u, lot %x, wafer %x, uid= %x\n", + dev_info(dev, "model %04x, revision %u.%u, lot %x, wafer %x, uid %x\n", partnumber, majrev, minrev, lot, wafer, uid); =20 err =3D regmap_update_bits(regmap, ABX8XX_REG_CTRL1, ABX8XX_CTRL_12_24 | ABX8XX_CTRL_ARST | ABX8XX_CTRL_WRITE, ABX8XX_CTRL_WRITE); if (err < 0) { - dev_err(&client->dev, "Unable to write control register\n"); + dev_err(dev, "Unable to write control register\n"); return -EIO; } =20 @@ -880,7 +845,7 @@ static int abx80x_probe(struct i2c_client *client) err =3D regmap_update_bits(regmap, ABX8XX_REG_CTRL2, ABX8XX_CTRL2_RSVD, 0); if (err < 0) { - dev_err(&client->dev, "Unable to write control2 register\n"); + dev_err(dev, "Unable to write control2 register\n"); return -EIO; } =20 @@ -888,7 +853,7 @@ static int abx80x_probe(struct i2c_client *client) * Write the configuration key register to enable access to * the config2 register */ - if (abx80x_write_config_key(&client->dev, ABX8XX_CFG_KEY_MISC) < 0) + if (abx80x_write_config_key(dev, ABX8XX_CFG_KEY_MISC) < 0) return -EIO; =20 /* @@ -900,7 +865,7 @@ static int abx80x_probe(struct i2c_client *client) ABX8XX_OUT_CTRL_EXDS, ABX8XX_OUT_CTRL_EXDS); if (err < 0) { - dev_err(&client->dev, + dev_err(dev, "Unable to write output control register\n"); return -EIO; } @@ -912,26 +877,24 @@ static int abx80x_probe(struct i2c_client *client) if (partnumber =3D=3D abx80x_caps[i].pn) break; if (abx80x_caps[i].pn =3D=3D 0) { - dev_err(&client->dev, "Unknown part: %04x\n", - partnumber); + dev_err(dev, "Unknown part: %04x\n", partnumber); return -EINVAL; } part =3D i; } =20 if (partnumber !=3D abx80x_caps[part].pn) { - dev_err(&client->dev, "partnumber mismatch %04x !=3D %04x\n", + dev_err(dev, "partnumber mismatch %04x !=3D %04x\n", partnumber, abx80x_caps[part].pn); return -EINVAL; } =20 if (np && abx80x_caps[part].has_tc) - trickle_cfg =3D abx80x_dt_trickle_cfg(&client->dev); + trickle_cfg =3D abx80x_dt_trickle_cfg(dev); =20 if (trickle_cfg > 0) { - dev_info(&client->dev, "Enabling trickle charger: %02x\n", - trickle_cfg); - abx80x_enable_trickle_charger(&client->dev, trickle_cfg); + dev_info(dev, "Enabling trickle charger: %02x\n", trickle_cfg); + abx80x_enable_trickle_charger(dev, trickle_cfg); } =20 err =3D regmap_write(regmap, ABX8XX_REG_CD_TIMER_CTL, BIT(2)); @@ -939,7 +902,7 @@ static int abx80x_probe(struct i2c_client *client) return err; =20 if (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(&client->dev); + err =3D abx80x_setup_watchdog(dev); if (err) return err; } @@ -953,30 +916,30 @@ static int abx80x_probe(struct i2c_client *client) ABX8XX_IRQ_EX1E | ABX8XX_IRQ_EX2E | ABX8XX_IRQ_TIE | ABX8XX_IRQ_BLIE, 0); if (err < 0) { - dev_err(&client->dev, "Unable to update irq register\n"); + dev_err(dev, "Unable to update irq register\n"); return -EIO; } =20 /* Unlock write access to Oscillator Control Register */ - if (abx80x_write_config_key(client, ABX8XX_CFG_KEY_OSC) < 0) + if (abx80x_write_config_key(dev, ABX8XX_CFG_KEY_OSC) < 0) return -EIO; =20 err =3D regmap_write_bits(regmap, ABX8XX_REG_OSC, ABX8XX_OSC_ACIE | ABX8XX_OSC_OFIE, 0); if (err < 0) { - dev_err(&client->dev, "Unable to update Oscillator Control register\n"); + dev_err(dev, "Unable to update Oscillator Control register\n"); return -EIO; } =20 if (priv->irq > 0) { - dev_info(&client->dev, "IRQ %d supplied\n", priv->irq); - err =3D devm_request_threaded_irq(&client->dev, priv->irq, NULL, + dev_info(dev, "IRQ %d supplied\n", priv->irq); + err =3D devm_request_threaded_irq(dev, priv->irq, NULL, abx80x_handle_irq, IRQF_SHARED | IRQF_ONESHOT, "abx8xx", - &client->dev); + dev); if (err) { - dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); + dev_err(dev, "unable to request IRQ, alarms disabled\n"); priv->irq =3D 0; } } @@ -985,14 +948,39 @@ static int abx80x_probe(struct i2c_client *client) =20 err =3D rtc_add_group(priv->rtc, &rtc_calib_attr_group); if (err) { - dev_err(&client->dev, "Failed to create sysfs group: %d\n", - err); + dev_err(dev, "Failed to create sysfs group: %d\n", err); return err; } =20 return devm_rtc_register_device(priv->rtc); } =20 +#if IS_ENABLED(CONFIG_I2C) + +static const struct regmap_config abx80x_regmap_config_i2c =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, + + .rd_table =3D &abx80x_read_table, + .wr_table =3D &abx80x_write_table, +}; + +static const struct i2c_device_id abx80x_id[] =3D { + { .name =3D "abx80x", .driver_data =3D ABX80X }, + { .name =3D "ab0801", .driver_data =3D AB0801 }, + { .name =3D "ab0803", .driver_data =3D AB0803 }, + { .name =3D "ab0804", .driver_data =3D AB0804 }, + { .name =3D "ab0805", .driver_data =3D AB0805 }, + { .name =3D "ab1801", .driver_data =3D AB1801 }, + { .name =3D "ab1803", .driver_data =3D AB1803 }, + { .name =3D "ab1804", .driver_data =3D AB1804 }, + { .name =3D "ab1805", .driver_data =3D AB1805 }, + { .name =3D "rv1805", .driver_data =3D RV1805 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, abx80x_id); + #ifdef CONFIG_OF static const struct of_device_id abx80x_of_match[] =3D { { @@ -1040,16 +1028,67 @@ static const struct of_device_id abx80x_of_match[] = =3D { MODULE_DEVICE_TABLE(of, abx80x_of_match); #endif =20 +static int abx80x_i2c_probe(struct i2c_client *client) +{ + unsigned int part =3D (uintptr_t)i2c_get_match_data(client); + struct regmap *regmap; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + return -ENODEV; + + regmap =3D devm_regmap_init_i2c(client, &abx80x_regmap_config_i2c); + if (IS_ERR(regmap)) { + dev_err(&client->dev, "Unable to allocate regmap\n"); + return PTR_ERR(regmap); + } + + return abx80x_probe(&client->dev, regmap, client->irq, + client->dev.of_node, part); +} + static struct i2c_driver abx80x_driver =3D { .driver =3D { .name =3D "rtc-abx80x", .of_match_table =3D of_match_ptr(abx80x_of_match), }, - .probe =3D abx80x_probe, + .probe =3D abx80x_i2c_probe, .id_table =3D abx80x_id, }; =20 -module_i2c_driver(abx80x_driver); +static int abx80x_register_driver(void) +{ + return i2c_add_driver(&abx80x_driver); +} + +static void abx80x_unregister_driver(void) +{ + i2c_del_driver(&abx80x_driver); +} + +#else + +static int abx80x_register_driver(void) +{ + return 0; +} + +static void abx80x_unregister_driver(void) +{ +} + +#endif /* IS_ENABLED(CONFIG_I2C) */ + +static int __init abx80x_init(void) +{ + return abx80x_register_driver(); +} +module_init(abx80x_init); + +static void __exit abx80x_exit(void) +{ + abx80x_unregister_driver(); +} +module_exit(abx80x_exit); =20 MODULE_AUTHOR("Philippe De Muyter "); MODULE_AUTHOR("Alexandre Belloni "); --=20 2.55.0 From nobody Fri Sep 25 23:09:12 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C62DF3B7B66 for ; Mon, 7 Sep 2026 20:34:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813260; cv=none; b=pMD2yxGRmWJX2E2EOIqz8YUnlt7hNNFWwUNfK0pha6BK4/N2o37I/Fv6yJ8Ocn9hdl8hsQ1nz0mZyJmKXwVSoh11hw+SmzUZy4uvh7JX08Au1NTzvbCDheP5SD/nfVoz51GDWY3rMWnjNea+PEo6q5y/um5K1WBePdTGliD1NLI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1788813260; c=relaxed/simple; bh=PG2uHUEbkCrEzYXipxjXZRMZBQvnmVaucGzN7IM7zZA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=B1oRa+Wnar5N5eBvH8TT97CfLktI8JDFbbMNXWQ/O+dedZxbGiPDWtFjlP7UWv3XJdYaNxXHbIu+PfjHZXsjK9nmtv7YDkOcDO5oXTq52RufyDkGndOXzbBdOqTmDyocwrq4N57FyW63AhTfve88pIlH9eqp1olnaJwJuelDyeY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=q3DFGxlJ; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="q3DFGxlJ" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4980fe6b3beso35293615e9.0 for ; Mon, 07 Sep 2026 13:34:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788813256; x=1789418056; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=7E1qEp5el0vMy4z578Uuf+/aSLygb8nTGKBm40Vll7E=; b=q3DFGxlJo05mK7li1bO16cZ/KeRXxWuFrg86TdIxlJi2VnEv6pCMQmjnrV8/ukuxq0 +ESF2iyiWqbdOwGliYoHcWeEwcEI4bI8qLMIp0ZR/XvZsfeNHqseUMDNu9DnzhCF71iu LDAb5JDnCge6kf2TiLO5wxF2rqKLsIERwQH5BvTenf+4LaR46ko+4XwKk+NPpezI90H8 Q+wPkLxWKFJVWfPm/3mq4lRBDZLdPxFggQxNG3gMcwCjM+PKCq9BLsq+aiKPoePLCAX6 MpDq8dF2atSpT3ZnwOS/eO2ugYPU+js2zN7hEJpQeezq8CUy+DtmTD7qN3FB5yBJc5Y8 xfgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788813256; x=1789418056; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=7E1qEp5el0vMy4z578Uuf+/aSLygb8nTGKBm40Vll7E=; b=bTXNYqbQZulgqgCTB73hTpxPVWSccd1OZdiSPmM5Di2sT4clQ+6MQxUX4NXLLR483z JKQChO4HFH0kjgTh1pMMGvvHKOfvGnZVhPvB9hWfwVEH1H0NV/GFK0zylekoelgIbBi3 aeQ4PcB526x/1gOdy1PqDEH4zKy141QgS1s9W0AdqT3QadzpUf/DfWvNH5YT4dgOkpQ5 HjTDPlxdmAROXyBaCeNuD+R+cqYjaRDDA/O9Nn4L9tB7aP1jNrvZv2jOWsr1/DhBm0nj 1L9e+fKPyVX1c7OysviVTwlX9ykqooZsrpkGPWCSuoghG3UVbxfpkyI6ABlVyqsEUA24 WT2g== X-Forwarded-Encrypted: i=1; AKwUvBzWqqYXJe4Fc9lgIohjTSbFDboFanty9HaCjW6/g/BKZr04rzzzXI1V0YmQJSzDlEkXg+GIgOXHKfPI29E=@vger.kernel.org X-Gm-Message-State: AFuF++kIybRo2xPWn9Af8muCZ3RZbSE8W7+wEbaY0QEczp5ZsHnSvKu8 D+apkgg6OvW/j5f2pv/KXcphv1U2fKmx62PLMT84Oup7iytAwRer3yna X-Gm-Gg: AYBFou0s/nQhK/ZsWmDcCYI4228qpvb2GDVJo2ABwNWelR7HeaLwXo2kV8sU9r1vAfB ev/3VpaMKdXmpmdG6UGEC8bfQz4K2UDTxgMNLuhZ6ox0GdNLMVdeAFDJ/HnE4Mhfis+MpDtYX1j 2qjBeyoczNyTXlrB1R9IACZYTQJoEz+MzLF1Klhw82nHsPvx46xuoxd6Q7Y/wxAU4BoUtymLt+M zEtShTzm7ysa40IDzSn7NSrqGsmvaDT3vd7bZEjOmZHdskWZmCTIqakIIkVu2XV/XBSOOfYuGX6 /n7G8/TIg0ySyuxu5W4Aio750eXhpvSWG5ENhUoWMLfDeruh1F3U3nNZMAfEgZ3lKs3uYptPaqs mpaQw6TCxYbA2/yyxpJHW9J0U08c0FdMHOAHJGX/WMGuf2H+q9/N4U7QPExzKYSX2x73nRuD9UY NvK6UQnPNgTyEvs/mh0oXwkIBXCIDjB8JG1CsYYu5QeiFzg6wCIcqltFVsTdqeCA== X-Received: by 2002:a05:600c:e556:10b0:49d:e27:d381 with SMTP id 5b1f17b1804b1-49d0e27d56cmr71117815e9.6.1788813255885; Mon, 07 Sep 2026 13:34:15 -0700 (PDT) Received: from antoniarch ([78.212.37.227]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4858e239862sm25959116f8f.9.2026.09.07.13.34.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 07 Sep 2026 13:34:15 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v6 9/9] rtc: abx80x: add support for ABX81X Date: Mon, 7 Sep 2026 22:32:16 +0200 Message-ID: <20260907203216.53192-10-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260907203216.53192-1-apokusinski01@gmail.com> References: <20260907203216.53192-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Abracon ABX81X is a family of RTCs with SPI interface featuring the same functionalities as the ABX80X I2C clocks. Signed-off-by: Antoni Pokusinski --- drivers/rtc/Kconfig | 26 +++++----- drivers/rtc/rtc-abx80x.c | 106 +++++++++++++++++++++++++++++++++++++-- 2 files changed, 115 insertions(+), 17 deletions(-) diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 4d14bcba616e..d35221f81024 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -212,18 +212,6 @@ config RTC_DRV_ABEOZ9 This driver can also be built as a module. If so, the module will be called rtc-ab-e0z9. =20 -config RTC_DRV_ABX80X - tristate "Abracon ABx80x" - select WATCHDOG_CORE if WATCHDOG - select REGMAP_I2C - help - If you say yes here you get support for Abracon AB080X and AB180X - families of ultra-low-power battery- and capacitor-backed real-time - clock chips. - - This driver can also be built as a module. If so, the module - will be called rtc-abx80x. - config RTC_DRV_AC100 tristate "X-Powers AC100" depends on MFD_AC100 @@ -955,6 +943,20 @@ config RTC_I2C_AND_SPI =20 comment "SPI and I2C RTC drivers" =20 +config RTC_DRV_ABX80X + tristate "Abracon ABx80x" + depends on RTC_I2C_AND_SPI + select WATCHDOG_CORE if WATCHDOG + select REGMAP_I2C if I2C + select REGMAP_SPI if SPI_MASTER + help + If you say yes here you get support for Abracon AB080X, AB180X, + AB081X and AB181X families of ultra-low-power battery- and + capacitor-backed real-time clock chips. + + This driver can also be built as a module. If so, the module + will be called rtc-abx80x. + config RTC_DRV_DS3232 tristate "Dallas/Maxim DS3232/DS3234" depends on RTC_I2C_AND_SPI diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index c90407a023fe..c3bf6f0ae48b 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -1,7 +1,7 @@ // SPDX-License-Identifier: GPL-2.0 /* - * A driver for the I2C members of the Abracon AB x8xx RTC family, - * and compatible: AB 1805 and AB 0805 + * A driver for the I2C and SPI members of the Abracon AB x8xx RTC family, + * and compatible: AB 1805, AB 0805, AB 1815 and AB 0815 * * Copyright 2014-2015 Macq S.A. * @@ -19,6 +19,7 @@ #include #include #include +#include #include =20 #define ABX8XX_REG_HTH 0x00 @@ -109,8 +110,8 @@ =20 static u8 trickle_resistors[] =3D {0, 3, 6, 11}; =20 -enum abx80x_chip {AB0801, AB0803, AB0804, AB0805, - AB1801, AB1803, AB1804, AB1805, RV1805, ABX80X}; +enum abx80x_chip {AB0801, AB0803, AB0804, AB0805, AB0815, + AB1801, AB1803, AB1804, AB1805, AB1815, RV1805, ABX80X}; =20 struct abx80x_cap { u16 pn; @@ -123,10 +124,12 @@ static struct abx80x_cap abx80x_caps[] =3D { [AB0803] =3D {.pn =3D 0x0803}, [AB0804] =3D {.pn =3D 0x0804, .has_tc =3D true, .has_wdog =3D true}, [AB0805] =3D {.pn =3D 0x0805, .has_tc =3D true, .has_wdog =3D true}, + [AB0815] =3D {.pn =3D 0x0815, .has_tc =3D true, .has_wdog =3D true}, [AB1801] =3D {.pn =3D 0x1801}, [AB1803] =3D {.pn =3D 0x1803}, [AB1804] =3D {.pn =3D 0x1804, .has_tc =3D true, .has_wdog =3D true}, [AB1805] =3D {.pn =3D 0x1805, .has_tc =3D true, .has_wdog =3D true}, + [AB1815] =3D {.pn =3D 0x1815, .has_tc =3D true, .has_wdog =3D true}, [RV1805] =3D {.pn =3D 0x1805, .has_tc =3D true, .has_wdog =3D true}, [ABX80X] =3D {.pn =3D 0} }; @@ -1078,14 +1081,107 @@ static void abx80x_unregister_driver(void) =20 #endif /* IS_ENABLED(CONFIG_I2C) */ =20 +#if IS_ENABLED(CONFIG_SPI_MASTER) + +static const struct regmap_config abx80x_regmap_config_spi =3D { + .reg_bits =3D 8, + .val_bits =3D 8, + .max_register =3D ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, + + .rd_table =3D &abx80x_read_table, + .wr_table =3D &abx80x_write_table, + + .write_flag_mask =3D BIT(7), +}; + +static const struct spi_device_id abx81x_id[] =3D { + { "ab0815", AB0815 }, + { "ab1815", AB1815 }, + { } +}; +MODULE_DEVICE_TABLE(spi, abx81x_id); + +#ifdef CONFIG_OF +static const struct of_device_id abx81x_of_match[] =3D { + { + .compatible =3D "abracon,ab0815", + .data =3D (void *)AB0815 + }, + { + .compatible =3D "abracon,ab1815", + .data =3D (void *)AB1815 + }, + { } +}; +MODULE_DEVICE_TABLE(of, abx81x_of_match); +#endif + +static int abx81x_spi_probe(struct spi_device *spi) +{ + unsigned int part =3D (uintptr_t)spi_get_device_match_data(spi); + struct regmap *regmap; + + regmap =3D devm_regmap_init_spi(spi, &abx80x_regmap_config_spi); + if (IS_ERR(regmap)) { + dev_err(&spi->dev, "Unable to allocate regmap\n"); + return PTR_ERR(regmap); + } + + return abx80x_probe(&spi->dev, regmap, spi->irq, + spi->dev.of_node, part); +} + +static struct spi_driver abx81x_driver =3D { + .driver =3D { + .name =3D "rtc-abx81x", + .of_match_table =3D of_match_ptr(abx81x_of_match), + }, + .probe =3D abx81x_spi_probe, + .id_table =3D abx81x_id, +}; + +static int abx81x_register_driver(void) +{ + return spi_register_driver(&abx81x_driver); +} + +static void abx81x_unregister_driver(void) +{ + spi_unregister_driver(&abx81x_driver); +} + +#else + +static int abx81x_register_driver(void) +{ + return 0; +} + +static void abx81x_unregister_driver(void) +{ +} + +#endif /* IS_ENABLED(CONFIG_SPI_MASTER) */ + static int __init abx80x_init(void) { - return abx80x_register_driver(); + int ret; + + ret =3D abx80x_register_driver(); + if (ret) + return ret; + + ret =3D abx81x_register_driver(); + if (ret) + abx80x_unregister_driver(); + + return ret; } module_init(abx80x_init); =20 static void __exit abx80x_exit(void) { + abx81x_unregister_driver(); abx80x_unregister_driver(); } module_exit(abx80x_exit); --=20 2.55.0