From nobody Fri Sep 25 04:07:25 2026 Received: from mail-wr1-f52.google.com (mail-wr1-f52.google.com [209.85.221.52]) (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 06D46126C02 for ; Wed, 16 Sep 2026 20:53:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592039; cv=none; b=MMHuCa+fNPTvXfRPN1srO1B1FgrngagAhKlyBaaZIfLitV6CXSMpfDOlNQXAsqO1aw9rmNBFQMQsPlffjBOnzTOR8PGd+wMrLVE+dmnPvDEjcbyFfqnVNUT3YSBTbHFt3IQ2A0Zp1hnaij7jCtMBSOjYMQ6jZG4Idu/4xfrUkJE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592039; c=relaxed/simple; bh=JzPmVao8FK9SYW6EqLoAZ+WBysafs2v13tUyYWLjmGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iZL9CTtorO489k/PGMJ5lqPbb6qcoj8jLeWfVHGRD7YeWNaNDLJz4DkUykCVKgDqVahRvIMbnGedpahOyeYeXOOMcjL1DJoWp2bZ8PcXgugHNU9P275i1b+KSl4KxYMRDIC5G6jAo2ZtD1RpQThocxrh/wUK4Zt05gHlQV02uQA= 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=McOHYnrV; arc=none smtp.client-ip=209.85.221.52 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="McOHYnrV" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-48442ea8f59so30895f8f.1 for ; Wed, 16 Sep 2026 13:53:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592009; x=1790196809; 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=McOHYnrVZSHoRbI7jUEh4KuKYRzELH6uFkRR1CmiXqeV22lEWGnqxopJNtidgjNW54 iku27ARGI+xcXGJqXjzz/T0s/0+7wi/p5z73zHuwU2d+Vu1aNSagm/oKYmLiby2dRaMW aHDTKIDwk8Htt2G6bfq4VHElO5SRHcdDqz2ADTHjSzfNdoAEyi3iQ1GNG32EwSF9YxcU 25W9Ecv2CnEPqK36upzazTX5hn0xi95EDKpWfYuEZGoBkY9A/PpnjoRrp1jJDAJ2WhP7 eM1qXd8seIbjrBw5Kee/cp4EO2Fc0B9feju3L1bqiAEqvnEiwvN/oehQL6gGyr/NqZzS 9yTQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592009; x=1790196809; 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=kganKeTSfz7N8I0bxoXXLch2XvOEul3D19sLzWN2kc0lXllsHElzUokWmE7AdyPHoQ lAzsQX1qucMox6d/+HlFFqyd6mZE/Ys6Ch6IE6br54tKT17yr5i8xR9XC9cVsH3Wozb4 p0cecjwTu432NGaB3DFezB0RBcUmoyKE4iFQet967CevSHw88q0pxpz0chSW5af2hEIM G8Mgir23qzYaBWWYSxJiaEE+yu86FznVtzKRE8cccDzjhjXmiNdRmMKjkdBMP0v9Tgzr xoNNWDK7Y23PlsLHTjXkzPVSeTu5X4tgWPPnHcsoTa9VQJmiA9XJxqCe9Rd5IoJpyNhr 693A== X-Forwarded-Encrypted: i=1; AKwUvByXrPpwqdlVmjGT60sdVs4VzE7zMSOINPPvL7XLX8IyghM35aWSqmzSCZB0C7TsvFd5GDRkrqB/VJUHt6w=@vger.kernel.org X-Gm-Message-State: AFuF++mPy6PM21YwoggfBxs6ngSheAQu9UpeZFp2d6DPHSAZf/tB+vek qOAQ3/e/z0z/7nbA/tvrJXbNEqi8UVAOJCp4vda/iYj+2Rq3drVAkERL X-Gm-Gg: AYBFou3dv3tin47QIMQXpaN0fPU1Onq9OnT4SDtDHZgWptuKKTqD06XRb5LMGACBRts yKso7j8/G/i77W/NR4SsBMRLnTyXV1rwuqo3b8kH1QLq5KgVRYvUxK/GOIRjZIdLihQmxd9CDGN pcPtv/fm4MYHU8ADccVUQm6uI788+AxNuia+hhGMrjifBUefcV0flCkEFiP6Ag364+tyNietpBc f+uqa9LLVzQzEtZ4YFjbE6fSw2+kJZHQRULWxCjniIVP8TebaRRG81iVwq6B5xHCX8oxbQsZ9vq GKx2izGfYBi2dn0X+OunE1GT+MLuu1WKBxv+nIeWAlruijb8lyMpXHzCCUc1Y2fKfJQVsdhcVSh fKvyYE8XmGQ9OakSB2pOYnGco0HNU7U8hbJ8HOB2L/S6M4PGhhIQKxZ+akzEQqX/WO1L/eVR3a/ 6j8SF2zVYLwu0tnXOSodQL1+yz7LY6WGudtdN3ZllkRdywIH7SVfcAim9MfEUkEZN+cC89pg== X-Received: by 2002:a05:6000:2612:b0:485:8226:c696 with SMTP id ffacd0b85a97d-48713c59e2bmr1379935f8f.21.1789592008945; Wed, 16 Sep 2026 13:53:28 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:28 -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 v7 1/9] dt-bindings: rtc: abx80x: document ABX81X RTCs Date: Wed, 16 Sep 2026 22:51:30 +0200 Message-ID: <20260916205138.16771-2-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 04:07:25 2026 Received: from mail-wr2-f26.google.com (mail-wr2-f26.google.com [74.125.225.90]) (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 7D6492D7DE7 for ; Wed, 16 Sep 2026 20:53:37 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.90 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592033; cv=none; b=u76D5am9kQW50djPNgnZIuvv1egi3lyV8TGFt+jVPVb8kVYJKwHHfU84gnuyBLwF0wIDm5qna8jiujiOIQQGVhOoh6bUkx+CbShtZuQD3P9w0kG7tRSZSikyLQAJJ8xS+fFsD/VHWSyYL62P87YuVV7GJVi75rRtSuZL50OEyo8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592033; c=relaxed/simple; bh=wLiYwM+a21eAKdI02nzoDqFbngX9L4TUdt0arxClA84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o1sJZGQaIv1zW0An6lCzYCt1WxRZDUBLcIxzLeAwt01a0GjUAZLnqQVNFqKQQGl9J2Z7GO1kkAB8ljBKYaxX+UzhZpjJqfosYZzkupHEJ6U9ELZI+I6PH8dyBi7AaaFW8NtpUimsuWvylMWf2qVRy0MoQiFZeWkzAvFyEqQLP9U= 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=iNIH8132; arc=none smtp.client-ip=74.125.225.90 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="iNIH8132" Received: by mail-wr2-f26.google.com with SMTP id ffacd0b85a97d-4843f22dc83so132052f8f.1 for ; Wed, 16 Sep 2026 13:53:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592010; x=1790196810; 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=iNIH81326Q0t8HOiXH+0vL8q4DaJwaeIwZZ0qRLPYimjJy1jV8ln5iAu87wvLxZhGP 6sbvssjMmYFe4BKz1hC6fmFtx4OpEX/NCzmtYsY+6dxMG7HYRBv3Ns7v8IW0TAIL6l9j 1GNK6I6a+mQGBKsCHMami2ylXZe9fvc491zZh9dVGmyo0tGGODSQLL23PusCB3EhuwvQ zB1ZzarP9NC5Emn/HNYqSHEBXEQPYiekGmFJznjBX+f2bdF36PkYoovrHqXWhW96NCz/ y1U+BHj1GN+Ri2mvEIYDWTvNj8G/lLj6O1ZPrdzpNdE/4gg8jWWIpS3L+0Ea2/28wKjB 72Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592010; x=1790196810; 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=k11o9F/FCBloP7ciiYQVnJLo7SM7osrOrcr05FQWFzHInziBDQyRUtqLS6Qo3xQwHA sYNpyBgDEyYnXXk10csyvQWAfUCw1q136vab5llBzxGo7sz7+m7pt0Xc4hkZCDFq1z/a YBO7auK1F2uC0X+oeUAnAVpuXTS4BztnJEoceyw0GJEO89Z8P6XXkzXpcyrJzhlG9L2n EBFNwXc6gbIpM2gm+X4gu35OYQPSuTJFxud6TnwlVo4l9+dFRwVJXUMYAotp38qpunes uqeXWG+y3+HwCBtpzdYN5jsscz7A9143UGv5wAfU0d5VXpRel4irArIFXKx/cMxuZdY4 Fw6g== X-Forwarded-Encrypted: i=1; AKwUvBwmCDHUOoSWaRQPjNra2FvatdOvmGpQwLGhe1O00tu0i2ro0JDrpVzRkSze+IBlpy+EI+CIaTw4RxhKCAs=@vger.kernel.org X-Gm-Message-State: AFuF++kV4nHMBOyY0b3xhb8w9Z61PZKCDsUVizmYCwhdlD22BqnVjXDU cthy6/rqhgoS8vMrLRNSQxGScsf7EpsP6sx0RRz3FWw/FGO4/hTa0CC2 X-Gm-Gg: AYBFou1QB3K2OASPBhWlishOC8CL9BEu35X55YCzYWkrzVGpT9qcLtTUpV+HWlYLj3M Zz9csCfFSaGn/U+tovMLFR+9iVvn/NKFxhuQQtVtnSazSz3ZjMKwoX2jFbquTFI6suN0DXUdRKE bHqPZAqiSRaKQyLawbJh2Awrq52Kd1WvMf989x4oCqQkmjZAMIFeUdjFxQhaMI9EVi8zQ7Bdauq nsJS3jly/RN7WJXaGWMz3PP+5I5ulPgBo7ef7Je+TeQcoyTEbhj1aQU/Fa/VVrAfw9pYFKWZ9O5 NTZqTK2UGjgx1IKODZcgBBOobLdEZZ76MTy/VwlKzBjmCqprHuvjUTfLdsXHWxguoL3r/dvwOn8 D4AjH0tNVKDUk/WD3eMrYS68SV/b+svOvaMEaWuellsVUZWG73Socr7OPtyR6c780AcI0KD2ndN tEKGRuENpDDUhfSNV8oowAsmTherKMriwMMM4qI8UxDHDfodB1ShxSYoWtNfolC61QTUo2x3BVj kPY+Trx X-Received: by 2002:a05:6000:2c0f:b0:487:342:d148 with SMTP id ffacd0b85a97d-4870d04800emr5622202f8f.38.1789592010254; Wed, 16 Sep 2026 13:53:30 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:30 -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 v7 2/9] rtc: abx80x: fix error check after i2c_smbus_read in read_alarm() Date: Wed, 16 Sep 2026 22:51:31 +0200 Message-ID: <20260916205138.16771-3-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 04:07:25 2026 Received: from mail-wr2-f42.google.com (mail-wr2-f42.google.com [74.125.225.106]) (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 52F3C2931D5 for ; Wed, 16 Sep 2026 20:53:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.106 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592042; cv=none; b=DGatUoZhMGmsl6yUSr8K1aa0WZH2/KgQqRGilxOKQVwFOBjy3+GT22kgvuXZM/BU5gE2hew08FXG1ZypLxUvU958qmUlOQID7VDY+u3UBieUXdWkxASfeEJEpA5MjEa97xZqnEuI3IiB3Ic1aTwL70BYEN38iNmmMRDKpszQHyg= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592042; c=relaxed/simple; bh=mIOAFf4/mkVnKyy9Pr2ub9EN7il/hC4uxGNZV5cUVr0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jjy5jd0PUH09EuYcdAEgP/cCPaQz6M4TnGT2jE6Bw8fOWdWlSB/KWLHZlTUHJfq0faKhePmYQ6YorA7LXv5nRoKjCsECAcH3TD0TUK+wrYoOswkaoA9mITX8gEMoM0j4FiFnbQNHZhp2mR5ZIlUAEkWS/i/zxGMKU7FVSBpIYCw= 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=H3h0h6Lc; arc=none smtp.client-ip=74.125.225.106 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="H3h0h6Lc" Received: by mail-wr2-f42.google.com with SMTP id ffacd0b85a97d-482f6351832so100130f8f.3 for ; Wed, 16 Sep 2026 13:53:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592012; x=1790196812; 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=H3h0h6Lc63jiNBevHaISkPTVX92bnMBJSyRn13yOkBXkzVtU0FEqUI8m3G7g/4MG5/ NUvHvqexcjibBKse6wWRZym4JCqo+B2JY5b2/PLbpMZG21I5EpHKuo76Fa7X/qCqESZ6 dcILIt3xZN4xvHwRfMR8mPfVd/sCKf3QyI8GIUhLKF04mNu6nhh1ohERBvgehKzXc9ot zt6da4JNvH0oH4vU4liqHwYetvSSs0h9Ss2bFH9WPKS3mV9fbYJ+CW8Pa26qsQu3XTt8 pgeGC+10/VVJLZ1GIXsepy40zFdPtWB9wr6RPeN/tziraiRRvU7OpUZKf3OS+Uijy/ni fZeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592012; x=1790196812; 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=sHQy0QDHEs48Yg2HufRnuLeMdlkPgiBoSD4DsTp881p53vAxVWLpvf9jlo13I7Lhq0 ZOSNHLJDGWahfHJjqu776OA30JxBGlePUcZdhaJmN/0o2bU7eftDK/7LEnHHEdh5D+Fg 1XBSPpiu+9/ab+SvoOscZMvon9Q3whpnGOQiKZKjmtVqcPlVWgLU7N0vf9QEs1+MdBBv 6nrQcx7bHEaDCS1yDBp0qw7RYuKpT33cOMsn8BixvNycJJJozoSHDEi/JIjjyeU8UUWm n7lzp1ciF0UWJYrF/M89vzwzcCeqcJE+2xZ8Sce8+tTEjsBwkCCSMR7wK8JnYBN2FZ1+ ZUYw== X-Forwarded-Encrypted: i=1; AKwUvBw0m23iHVdgzsIhmBK98Jw/xLzFT38ZlrXuQiFntwkfYFXRyCrFdj0arC215HvqjdLkUwYfeeeY5VljSHk=@vger.kernel.org X-Gm-Message-State: AFuF++mnxr60y8LcIjUMcnw8/AxQUGPETYYCxy3jR+30i5T9Q5oBJD46 YX0yPXtWu9agd6DsoIbQZqQ6KqFV2kDwkC7Aj5MHqUESIT8lY3321qrs X-Gm-Gg: AYBFou1iJwrD8v3JF0dt3+DjP5k8LpjcuPZB9KT40UGtx4HWH1UwJkgxtDhOjDKJ2SK SrFZxiRpM/EktSdkwcd5pITKO3jpgHNgEedIdNFcdSAz5KujwVqVThKynlg0RYPyDpQzykezk6W LjdRWojA6fU4AHRittR3PsbwXfV1LVI5oTfg5iRTTtBmvtfVhrbdMsRMZZ6Moih/AYbFjdj9klb ndqveAZtjJUZN9napEklMQYzEBGNehHDiheJV7lz36PNc+xUDxxm46TcilA5j8JQMpnxf4wZDDy U0rJygF7lq2zYdMNXQv31yilKjjiUWF5et0OGRo8C4cp0jyl+g8wvvmCjc4/AGmetm+BbC5pWg6 DOqCEfqjxVexXSfelPMPk7mIeX4IG5dADpZ64jHV8pIlvPxV+SZauL4BUDexfXuoIsS9lE2g7l+ iki2rcUPVvVhs8Saxhnp5wHu/F+FIbeXRRwcSd9ZQz8AY3BYHXwRFFimlh3DmxiJcC1+jzmvqw9 peGzb9G X-Received: by 2002:a5d:5f96:0:b0:484:3647:d977 with SMTP id ffacd0b85a97d-4870d05a4b1mr5667003f8f.27.1789592011657; Wed, 16 Sep 2026 13:53:31 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.30 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:31 -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 v7 3/9] rtc: abx80x: add mutex protection for register writes Date: Wed, 16 Sep 2026 22:51:32 +0200 Message-ID: <20260916205138.16771-4-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 3814E4E1C8B for ; Wed, 16 Sep 2026 20:53:39 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592050; cv=none; b=L3SFDTA/ckzT1IWKkdBbSYEEFdRr+vmqJ99m66ZI3grZOmulGYa8H1BE5SniL7SVKZUxd1Xs4fAYhPK8FW1rIbVHFotzLSsDkhLujLoWLR6o5YoQjsZ6BMA1CLvlDl5UQW1rJNXAVemQxITyMPJsVcVgE+notAFXhv/vSA3nt0g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592050; c=relaxed/simple; bh=pI6wT2AVh5yAvV66BledWhgr6biNtXsQP6dV0Cf2EOo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Oqh2bIglbEbcYdLccrXXju8ZyP6gDLZdQoKWVQGhmtOvvi1CW5dQqC7xwtOnT9xJ6Gro5b2Ns3jYtMbqlTQ48Q9g404BH5m5ERCKN9DUPj0P3OHigbEGd+AfWmukKZJwH8xBxvyHKA90evxN1YPDxBEQ2bwB0sHUUawTdR5ZtaI= 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=qWCLFauk; arc=none smtp.client-ip=74.125.225.76 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="qWCLFauk" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-482f633ece3so108793f8f.3 for ; Wed, 16 Sep 2026 13:53:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592013; x=1790196813; 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=vQCQCsXRyOMK2lxbcg+U/XVY1PZxvpDAiiCFQ6+e0aY=; b=qWCLFauku+QrSmjWXbodOKbkW7XrPKG5pYD61LeUZK9V8LLDFhCYpaboZO3hnIbCw9 WdqPMlnpEC4v6PsRBm+MDwlmde7K4rpki7vmjKsW27IxNaL+RkSpplZeCemt3Kr9PiyA QYoXDLpgutSonA/1rdhMonvWl1XsZY1iZsd2Bt0bARNULBonTUEG4MoQTDosNkqKYnNS jFaDnUraHYWQ71nqUa/ZM2+QvspnLec37/qfmcE2lGP9j4SkxiHqHJaemRYwstJ7fdM5 3kE9IFl1IK8qETf6cWrAqv/5zBexGW5O/MLOXpbwbKMWr5GEiagpX4BupcO929luz7cA lw5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592013; x=1790196813; 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=vQCQCsXRyOMK2lxbcg+U/XVY1PZxvpDAiiCFQ6+e0aY=; b=DB1FOJo9sQmIJTwE9G4Z9zhHCGvkGP+BAy0eUV+cBY0qJXGdzf6j3E/rbvbU4KeGik 9V3q2DNCveA99DKNqKKOezy7X0pT/EOmfivTnafPlvV+ZKMxbppNzrOVcEjnnXde6N1h FGQqJggpauzCK54pYvIocp2tsxSIpX0UCzoVaBoh2UIZNe4UAMVJ57y/xGnNpMoloxX2 fOIa4lvA2O1pDafdizWB7I1Yr32RpfLSMNPiPZfSLvBGQBaYsErD6pzhe/33L6bU4qj3 q6//3MEIQbYkrz+u23n8teE8MgsgRhSgsEGbp14T+KspNCzNPyUcuz7LJga3o3Q20wwm M0lg== X-Forwarded-Encrypted: i=1; AKwUvBxgzpAO644uw0D7oKbLwdePgQM1DgDNcgqISfthr/utdtvHGpfbd/eKxorfLHf1xWCsoMcoh62kD2ljPnU=@vger.kernel.org X-Gm-Message-State: AFuF++mNJps2IxRZLaFlBbPH/zruvJoh77m8BwwmovT+Q957xbL1x5mf qhL4JkSHJBlTFQ/QQRVFPB3fN2WHpY+QHgANQsm28r//Yflz30qLTgFZ X-Gm-Gg: AYBFou1U2WY10nAE1Ep8k8a0mRq+enQOvrV3+GXtd6FfThbk+BLHYfoEFZuTB/4Sm1I vepLapwdGa3m0KkMEBBfx1BFcE0hZWy9B5yJ03w0w8BZrukwGKUDLhAntIFDcT3euM49w2sEeBz p9+4LOlawByu5EdYVzhFzQv54L/rrCyix0emHrqH9ob0OIvUQJuKCQRz9eZw8GdzQ1/5zkq5ZjA faKSTmjP04c3WU1l71/WpS/P/IOViOoaifvP/deYFHSFu80qJ6nApSfJn/7qY1YiNytM+/9Ymhv lELDsP7N49EL/USB1EGQYSODXYGNPGjoBVMAWyaVm8NR4a3XBYbemhZf6JOu5oa0Ht7f45zlDqL JL/G2VfKzl4sfyLl7IvJyr8x0QXHJ/TgoJwdOlyH+lDaPNImXRi3ro8atYiwtWELZblRWSY4DnL RUpbMCldaqYmxcdXyLNHHtrHtcdWVGCKR8ibJo6foA3qOXw67DyP9jp/xX2apqkf0xkKwu6Q== X-Received: by 2002:a05:6000:1a8b:b0:486:fed8:8710 with SMTP id ffacd0b85a97d-4870d16b67fmr5230115f8f.38.1789592013464; Wed, 16 Sep 2026 13:53:33 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:33 -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 v7 4/9] rtc: abx80x: properly handle shared IRQs Date: Wed, 16 Sep 2026 22:51:33 +0200 Message-ID: <20260916205138.16771-5-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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..2fd0079b7c51 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 & ~status_flags_clear); + return IRQ_HANDLED; + } + + return IRQ_NONE; } =20 static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) @@ -942,6 +955,41 @@ static int abx80x_probe(struct i2c_client *client) =20 i2c_set_clientdata(client, priv); =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 (abx80x_caps[part].has_wdog) { err =3D abx80x_setup_watchdog(priv); if (err) --=20 2.55.0 From nobody Fri Sep 25 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 ACB604E1C9A for ; Wed, 16 Sep 2026 20:53:41 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592037; cv=none; b=pZgyK5Gq+RwCUuV6n1Oe1cuFWaehqjJjrAtlK0X+rbErYe1M18ODkKxgRYK98vZuujrmKsqXF0PIRccKv+9vXrTRk7ZUUCuorgGwPuIQgHhAThEPh69EaUR+LzFUfbThxKSjdxKWKwwwzIwAgK/8tjRaC0Learwy9DMN8t9HkLY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592037; c=relaxed/simple; bh=+fuIrmtzR6ldoVb6Om5t2rG3lzQj67cX476aa8hApRA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=AqCB6sF2bn9XlkzhDCYF1V54XcW+Pof5NFwCd6ar8Kz00jRp8tfJxDjCfWPDy343DhVOVtOJuo8RRxft8L8+ZPkr5Lr+aKH1HgTmWr+RWWsdF38wsxTa1WpiqCwXZqDqQ1cmIZaArx+XetnKhcvtQBrFZyslZjDCNeT0KT4RfPM= 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=RRJFK68V; arc=none smtp.client-ip=74.125.225.76 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="RRJFK68V" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-4843f22dcb8so119712f8f.0 for ; Wed, 16 Sep 2026 13:53:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592015; x=1790196815; 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=AAunmvXAHLcWGYzBYZe3R5JhEjHYwRPNQssUB8ElOec=; b=RRJFK68Vp8klJ2CEhgJrtL07qPCAYF9YreqpUN+pBri0kSI+s5uY1HB9MBSFsUvvMW oYjMupJNZnoh+FVCrBnhZw8GRCzxr6Qf94BZ/PF998CHOKPYJOH/D1S16YYfst8S4cl+ IT72tbW9OwMcZ9Fmy9y/LZGHpOOOm+EP1yhmZgI5haI2Wbqj+SD+fI99i5+r1ZNhrZ5C ycAHw4AiSoI6I9Xx4fzQzpaj7yobMrNk2ViUZqN31azBpKYhrYa/JLmZRNoIipvDO3BS fo90WN6Jw0yNXb6E8JqxKjdi3wkC6g+9nw/syiOOEv1UsZ31+iIoXq4LLh+5Uc5k79Yk 9ZpQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592015; x=1790196815; 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=AAunmvXAHLcWGYzBYZe3R5JhEjHYwRPNQssUB8ElOec=; b=XsnKJJdmxAEwrczaetgsamN1TtWEsYgt+YQw5pXS+DEHj6eOxRH4ah419Xw38d1mlX +5tY1Q3JlDSMUE2+9VftD58s98NR2WWoIXJrzHhNMA8VvrWx+09nSTCGlQZU2EkegSSt tESnaRQ+MZpvkhSWe0WImQYO40p/qzzMGp2IICl5u3AmyOdQZghB0VbaTvdmdw0Qf/gh tVV9Ay/w6lOULO49FuDyJlObYkzBrWWlugoKQ+EMAmqd55edAtTOTs4pNOYCacCJnqwT NnES0Oa0Y6/hGxUPFu7lLnwBTdFaElCMN9EVEVTI0Qmyqnk1i/eFf1Zyi2CUYMXo7R3B cwrw== X-Forwarded-Encrypted: i=1; AKwUvBwEPgxo2ILImM8w7Se68IDO+9h8tEs8ltL3ie7bNaLTn79lvWft/V5skQ92m69C3uo+6Re26/tVR8brN1c=@vger.kernel.org X-Gm-Message-State: AFuF++ltqJis5boyNGJfj4QZu+OhUoYR11qLOVobGg6olLvsgWKgLmo/ Oj2t23egDOBRHYo6rRcrkBxVr+XrDC2IRw9o8qYxgOniYHNaD500Zcz4 X-Gm-Gg: AYBFou1MVoHm/M9nItYlXUPP7TKeqX9OcP4uiyFVg9Ih32YFkSOYce5ShRoRUGH0crT 9YxcZr6sILxx0qnXoSYZh5ulhVx7M5X/JOVLMx9QLwQAyO5hOORoRhV/lljYVYmnxwzrMQjXrUm rk4d1TdXDGbAoJHDcDPQRTEWCq+3SR8SLnsYjHYt/h+g0j+3lHCW/GZ9by5dm2/LZfswSbV8uTM s/Qfxozco1d2Ay/x8xPyhq0sSvHb4WOg/d8LbgnHAoxwxVdwiX8oKrrxQoVXLH/KobPv0TLawgx 9FbGLipAYtPhWMhocKLwWFbaEJjPUiz08UGquGwbzCdXjyA8hdHTZr8u+6fKvTedEeCk4kVmPq4 Pw34l/DFEuU2h3M9QJlGwnpt3BAjD/pSyWuo4y8GegFoRk0BoRcJJ9gAdoh3YEXL0bEYoMPk+ch CxyTC7mkJhCcz908G1LNnVfWFdusjTwagTjkL3VxUkB67wVY/zxEfn1ED68YPYldF1hzeuBQ== X-Received: by 2002:a05:6000:41cc:b0:487:b4a:3f54 with SMTP id ffacd0b85a97d-4870d16b4fbmr5439006f8f.29.1789592014822; Wed, 16 Sep 2026 13:53:34 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:34 -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 v7 5/9] rtc: abx80x: add irq to struct abx80x_priv Date: Wed, 16 Sep 2026 22:51:34 +0200 Message-ID: <20260916205138.16771-6-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 2fd0079b7c51..91844c0d9063 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) if (err) return err; =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 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 D4E993C0603 for ; Wed, 16 Sep 2026 20:53:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592037; cv=none; b=lIjtOaxHJ1B8IVM8wZh2K1rEhRtj8CzRUFJsKVkirqxw0OLQ7tL9e0C93XSAOpl9PS5FvEE51JzBkYFUQyjTOCi7ISJiY7UybDmJKemg+r2fQbe8CCbjHdnJCbSzTTuzjd/aFBuFOy3AwKPQTQX4ZSC7iFspo0dO/zNVeSkwob8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592037; c=relaxed/simple; bh=1SNfDHMsz6aA22KJ2k3+hGC3C8AmhFB+SUbaeOO4WZ4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GtjvbJGymgO9HMgzMitwHIcQEPcNkOytX8ktxlP0koc8hplzVPEYxXkvrRjK5hQI9JcmblM+e3yuS7hotmIKzKDEWnWGRaniZBmPBzMe+iFjRNeZc6w7K+0XHFNobROCnogLhaP4L8mGZu5fYtv2ck6FeJ4u/n//dq8BzaDwgiA= 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=S9chrbpS; arc=none smtp.client-ip=74.125.225.76 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="S9chrbpS" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-482f633cd80so75173f8f.2 for ; Wed, 16 Sep 2026 13:53:40 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592017; x=1790196817; 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=Yi5CCoHmGrYmkDOVSDaAc0UmbnKq9uIrfT4OwCZDOHY=; b=S9chrbpSmUo0LR7nBVCRidJFl89Sj9d8HqhmaIVrYU53m8QUUJZbYaJpPmAbh1UDRq 4L00aRRBVPMwUbEWpuhQyEuKrWT5A/WfWdynwSCbyHqeJGcRQTekVMruNLHwT2fOAMQV Ub75Ao1lBEj+c9IBdoZHRGQp0gAbnV7yMxsoYrRENWR9m39LJUUKBCYsnKnB6NdrglZ0 KMNX9MWi1y8cpfZlVNfiZW1Qzjfs94pUSlU8y3AdADFXMUOU0DlnZNbDqsTfmDatJwSp blBkmQAXIb2k1MNNM13WX3IvBzcSCNG0CrIO0N+c/9l65F0GCgyUCTLFueTq9Ygc+zEN 0QjQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592017; x=1790196817; 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=Yi5CCoHmGrYmkDOVSDaAc0UmbnKq9uIrfT4OwCZDOHY=; b=aYgBy/U12H5SdoZ3P7RgcDIx1hqo6s6fpvJp/v1hXfrURD6paACSPOPNuicq+EsE9G Fc7Mdzgwfmbm1vqSejlwN2tzCNJhQ2TkF4Yy+0UU6o+D9e1VsXyJMWP2V7K+UTJPzFL/ 6Z3Z6VqV9l7idCf8GMgrBXsSuBzmtB3sZAv6KigB4tTco8WHj8voteVRxCGXMx05mpiv 4yY/Z3YODjC3jn9Nc60rW3TvyDJO5HIqTQ4NDo4vOBMrgei1wVqcXCiU4/xn5pn0jyAR 6hVPohf4Y3HtaeW5hp/AaupbQxRf7j9E81BqnjgmWBwJ4PTxdTYeJ4cfJH2o4ZqUJ5V8 bIVg== X-Forwarded-Encrypted: i=1; AKwUvBzHQNQXMMWWUjvMODQgtBXlLzC6afk7Tbh5vsSKsuEMC5ZU9dQUgXU0hGsM9cnGOdODvOInC2nnn8afG1I=@vger.kernel.org X-Gm-Message-State: AFuF++nTNy5R4jhxaBDcJHIdtD4yzJYiyl34sP2eHJpZMHi8iUmkx6/I 8Jxs3CtmXDzapYTPSLzW7V9gDWq30qTRncgMX+5HrgwuZe+DdlKJttbP X-Gm-Gg: AYBFou0bqoRqV3poR8kE1q2uB9Saie+X5+0YfGeVwBS8GSxhubaWTByx9mSQri39r/T 6r+vXVlLYH4ebubQ6VZeUFl5DH3/MwiZYecALZICF33GUptIOWrTbHIXGAjWMoivbcxu35rPU59 audXMJ9rK11wptnnXBSOVMz5iNlgKF8QVJyRu4X9vv6im8NqSCsSXnh1Y4RhCYUB9D9oMZQgg5e O/E5mpIeIK/LdKm1dCzVocZ6vsIYWn1oGT+a3DMKsHeTV3WrHdifIAYYS6vLON/7FeZQ1BN9uyB y0Tm5F1usyqEv7/18AZHBw1L9b5pTzpYoqCU8O5l4b/xInMwaQAiUluGDnJ+c167GsKLnB635d3 QaDUQlVFCA9naQs/mwGFYSTX+Rf6vvA7elDPLTxKXRb7sRJ9tDNjysmxfk/Yp4kpEHlHQw+h4D7 8Xkg24X/qqf4pp5rzDBAeXeV4u+PzmZdk+agYYdB/nmNow3g2iKEZv44VSBY+W2++yOj5MKA== X-Received: by 2002:a5d:5d0a:0:b0:487:ff1:c540 with SMTP id ffacd0b85a97d-4870ff1c628mr3992338f8f.3.1789592016479; Wed, 16 Sep 2026 13:53:36 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:36 -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 v7 6/9] rtc: abx80x: use regmap instead of I2C specific API Date: Wed, 16 Sep 2026 22:51:35 +0200 Message-ID: <20260916205138.16771-7-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 | 395 +++++++++++++++++++++------------------ 2 files changed, 213 insertions(+), 183 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 91844c0d9063..d41656a4d518 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 & ~status_flags_clear); + regmap_write(priv->regmap, ABX8XX_REG_STATUS, + status & ~status_flags_clear); return IRQ_HANDLED; } =20 @@ -305,25 +308,22 @@ 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 +340,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 +356,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 +376,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 +388,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 +404,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 +471,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 +486,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 +496,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 +512,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 +541,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 +573,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 +600,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 +617,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 +630,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 +657,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 +702,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 +715,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 +730,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 +788,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 +837,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 +853,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 +891,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 +912,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 +932,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 +943,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,55 +975,37 @@ 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)); + err =3D regmap_write(regmap, ABX8XX_REG_CD_TIMER_CTL, BIT(2)); if (err) return err; =20 - 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); - if (err) - return err; - - i2c_set_clientdata(client, priv); - /* 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; } @@ -985,16 +1014,16 @@ 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; } =20 if (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(priv); + err =3D abx80x_setup_watchdog(&client->dev); if (err) return err; } @@ -1009,7 +1038,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 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 1FF6B4E2F06 for ; Wed, 16 Sep 2026 20:53:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592040; cv=none; b=EUyD/uy61s690YREWAMEoN6raqu5LEnQlvozdqlzzPT0khMZ0n156ADsBg62xiYUdTJUGqnXM4d5zwvlRnD4fJHQJDfdL3lr3oc7pdJYobjOOfj4ihaCEqkAjTfzUBxq3MWzoB5iYyi7N0jH/Dk+FSlXSz2WOFf+b1BQ2+lmyTM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592040; c=relaxed/simple; bh=gEm5kNIUAVODvt1ngQh4yFfp++uRUhaIQalJ2281BLU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kPbOWqn02pJynoxROLU8YffFBX1VForKYu97uuUs23bBRCfqlnFgUjertOJzj2qRFzcHku3twyzIysD/FV99VjpjkoOV6siZBdcW+isMQj6aRUpnWUxrqIVYYClfZJ3iE5pCWbzJ5AY1b8gK+dXObYiTxKeHkC6xi69UL+Qbl+s= 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=PvWKTXZ7; arc=none smtp.client-ip=74.125.225.76 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="PvWKTXZ7" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-48434392b02so143293f8f.3 for ; Wed, 16 Sep 2026 13:53:41 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592018; x=1790196818; 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=HY9de3s2a2HQ6JLLTz8+XgwKcZHke3p8zXjlyHlDwyU=; b=PvWKTXZ7lRGu1xylgyR8lbBl5TyhYfpyshc74jJ+jRoZB6EA5+RiiqmGVYrUk6wsjY lHjD/DofXWa9EIYYlK2mn0+v//6Q0Mn/A0wBUZhsRDv/tCKJOxaIQQrqMxcTtON5p51N QHeWsdWvT3MEeLqGWWcJLQVrqycimto0WHfQn+tmzQCQYOXYMhi+KHlDtQUwzu/X7O+c Xgw0/Ti+hiHfwD7DwrweVAJeTIgP6KmZtffL8I0b32zuieecmNPS7U0ZE3ENrZo9yjld UNSzXJlM0GKgZQIDhre9DrHBwkRJOd0Q0b+AzZAWsvJxBVn5bIS+ATJ8vwRbRCrzyW7V bHsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592018; x=1790196818; 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=HY9de3s2a2HQ6JLLTz8+XgwKcZHke3p8zXjlyHlDwyU=; b=SL4Z2AmEP5t9V9WA809brbSxJUuogITNlwyvnfI4u4NHip7stqyKw4EKrjXaEKt2L6 4f6DbXrXvdbPPwFrvuUmlNWLtieuqNpBF9tewCy+3jZRNUxG5SZ50OOd/iFEPNYKOF/p 34yWG80D2ZC+hq949UOWdDFXutL+cTIgP46Fpn9s8JGlGIYxDAWu1fg9cPQd8sn4SHXf PVayVAC3BUKO+DVd4jvV1nDMOlnx4q0V02wJEchSAmQtzUpCIeGEB4F/jfWfYJ3Etc8d BkQ/3FpSHncrgctI25b2OnRMQuwQvhTPZw98Cct6o39/ATdoYHKdJikrosCbAo2MLeuc nmLg== X-Forwarded-Encrypted: i=1; AKwUvBxFTEj90uWxw064MO9d2nYTgGqIzxFAcgOuSYg341cCaRL2xX8Do4EhNQuwp/0/hZp1oEwApkFFF45NWIE=@vger.kernel.org X-Gm-Message-State: AFuF++mDjWHOFe2H4H1IgJgEYwME7qxbrEECFCseYE5+t5PCgU5HEi1L BvHbhtPn1B0RcRKZpkajY++4DoNIfAJdjjXuNk8K7C/TD8SS+U4+QgDO X-Gm-Gg: AYBFou3ghxxTRc3W0h9PDwnqIIudmA0I4nckhTwFxCydtNuncVc52ZlNZmSd0yj/ETq /GzAUHeEqzfWm5NDZTJ9M7x1yoxOLfIOAOP24y71YX1KfjdgpvpvGXCE1GSVHurYG84sXSVMnzu XTx8Bih2nyD1/QqqaKWBq9WZRQoESP5lHZRLWINcSWeqn+kRquoYi8ULFXrxKqPkG/Yrvz+9/5K fOsvwIhB9LhsBqFj17dZALWuiMWzmTKrMkyXJBvLGsDIzoxvumgNcG83+wqzYGoBxXblyTcjBUs vZ2ontA7J67Ey6OHiLXECRvP2UdWSUirXrpGPlY9lR3+SdhUuUOQGk9HurCd42+UeGt2bIkUOhr OACSF+h2Ho9x7qdP5I9go6rXYjwhv71kHrCn7CULfjOBhOFxjpUi0nI7XO9NXn7angfLgYnYY/H KhSHHeIGGBKzPw2rFP4P/aOttTBw9JM9N8nii7NuPlXq9RHmv7Kr1TY2+kdtUBm//9Zt24HQ== X-Received: by 2002:a05:6000:410a:b0:485:ac96:7251 with SMTP id ffacd0b85a97d-4870d05876cmr10637772f8f.21.1789592017846; Wed, 16 Sep 2026 13:53:37 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.36 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:37 -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 v7 7/9] rtc: abx80x: replace read-modify-write pattern with regmap helpers Date: Wed, 16 Sep 2026 22:51:36 +0200 Message-ID: <20260916205138.16771-8-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 d41656a4d518..53fc788cbf96 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) @@ -378,7 +370,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)) { @@ -386,12 +377,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) { @@ -403,13 +388,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) @@ -473,7 +460,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; @@ -486,24 +472,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; } @@ -573,18 +549,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; @@ -841,7 +810,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; @@ -891,14 +859,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; @@ -912,30 +875,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 @@ -946,8 +889,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"); @@ -988,25 +937,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 @@ -1014,11 +949,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 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 42EBA4E2F12 for ; Wed, 16 Sep 2026 20:53:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592039; cv=none; b=V1WZkGQ6xPHaaZg4xYwmHBSTOsn8WCv618iklMsch8+PZT0baGg97m54QFeU1DvFIkHDGVZK+71acxl1XHoDwsyxqSCe9T2UBwCJMbUmr/0LnA0yV3PNHTS3Cp5CzkMfgGAax1BggLH5Lh5jlJURSrvpLdK5DGo49ntz3y4dmhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592039; c=relaxed/simple; bh=WUkEehPfF2jpZwug+w5ko9fR06pm4zUBXZPmUw/p31w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GaYrAeeL9z8D4uijErAKM/wr2OfgMxKFkrdw1+ZePaBp+KP/jnlC30pdrqXdYXVlIcC5uEAsRkNXg7RHCW74dEJ7Vyz/+lO0PQAjKl9lDjPbNUyuos2b40lehpySk7KYiksEvbuL8VWsxcchrKLwcwbxIZpHS0iQ+HLJqzmx+sE= 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=qwJ2iJFs; arc=none smtp.client-ip=74.125.225.76 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="qwJ2iJFs" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-482f6350f88so111245f8f.2 for ; Wed, 16 Sep 2026 13:53:42 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592019; x=1790196819; 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=aPjnpaPjtKc/aLzxIuaEfCFqOlX9GGn5Y8DyBKtmH/Y=; b=qwJ2iJFsKGIHYGen29fMlKHgrKRg1cObBVoSzI4hhbBtDW9FeISnD02xb72xQU8qj4 k3wAfoEymeT8AdStSBbGCbMHPeCJgPIWcBL/MNVAVTtcbHiisRX+OnL6iWrPDma3fxES VAYLQbD4kaqt0obSoPpoxw8Kp8+7OJPKgfNVMQMowA1kWtrc17LPEOL6tr9B+FmS44Id UI6UuOsDu9RFJsPWOvoTIBgXhYzh87Q/08W3ZoP8PrVdTJAR4OzBUNjwkpURM+VJVg5Q DDpxQ4E+2j3jHPeWbSvdRLnIC5M+/3hjOIy2IbKMQwdO6VFWCLjgrBqUPbtAGhNpoRyw KRHA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592019; x=1790196819; 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=aPjnpaPjtKc/aLzxIuaEfCFqOlX9GGn5Y8DyBKtmH/Y=; b=QdnWksodY28iZtiYG87TF/1/S9kTRWk/oVOuLLcO9KbpXC4RHmgKnJhYQCjIUyosEP Pf+JRFG7yQG+jXYei+MU4QVXCMSmYjdub5OkRUqJOUbm2soooH2vyTlIxmSjblj1O8LK m3RsR41v/jtdlkFUyL2I9uXrnXkjyBkXGo197bjwTYryi4KDsRQeL+Cwh/xf1KfCLSmJ 30vWHq6PIwAzQwJIb/8fc3h1KCGjp1DhwHwWNAXHRTNcG1pwhVeThIeasj4HAOt8IZOq RoQ1PVaFNNO8ILRSJ8oYkP79GZCOdrAMz8TPtZfv25o67Lv7IOJ4eplXMAYlb7YniToT UtlQ== X-Forwarded-Encrypted: i=1; AKwUvBxOZK7UECP5WBjyKWtngCdwrWBD9a+HOVfGC7Sw2d5yg4TI2StON6wqVqlTVVF+ctH23RFyRqiUvvBEjaI=@vger.kernel.org X-Gm-Message-State: AFuF++mpHYjuCQljFWfrRX7XVIUvgHiK+MBxMpcfXuSsQGnZL2R6lhiH HQW2kVfaL9P65Z1j74StP7ZnoJRcjK6oEi1TaJJsfLtwkDETG+DGlnxt X-Gm-Gg: AYBFou3W4z3tewxJ2nPfAh7TtbSfexi34jJ3EsN8cIkalTdELIIzPp1hZ1lkQ85NA6K eDppv7XLaU8yyN8M2TvAW4GRKOh7xV3ggUBpDZqeTPS8dZWOZbpiPWO+TRCzVOrd/dp1aoXU+A2 Dj0l98wo+Bn5BjMopxJNOx3al/iQVM6+aXVlRyJAaostfSa46C8o8A1FdIrPHcH6f2249EFKTMz aLbooqtgYLwiTs65nbnqXUVpPUuHuBFuCaHHukahdddvjN8dZd9mYyeOdEF5pYLJIbggdTmsLpl VqpClHAs8HwvnkPIjX4NgUWWFQeHtU2IUs/zB/QRvNqpGcD5pkxxv6OOOGkuqPPd5QFOmLaY2kq rTnsmOIvfwmd1OSmBP1WwPBMiEpUoWb+T9iJ0Nujehxc3Fqg5uX4PMuyGApQBJRdm5QA9qp00cd pSWBs9I6JmfROwovbxuJ4hhNnY4OengF0OI2JgKDgU2YM1tE4gxFCz5QhD4ERFcef1BOqkfes= X-Received: by 2002:a05:6000:4383:b0:487:8ec:1fc with SMTP id ffacd0b85a97d-4870cf09c40mr5052451f8f.12.1789592019334; Wed, 16 Sep 2026 13:53:39 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:39 -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 v7 8/9] rtc: abx80x: create abx80x_i2c_probe() Date: Wed, 16 Sep 2026 22:51:37 +0200 Message-ID: <20260916205138.16771-9-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 53fc788cbf96..3f0f8d7f8761 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -780,73 +780,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 @@ -856,14 +821,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 @@ -878,7 +843,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 @@ -886,7 +851,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 /* @@ -898,7 +863,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; } @@ -910,26 +875,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)); @@ -941,23 +904,23 @@ 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 (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(&client->dev); + err =3D abx80x_setup_watchdog(dev); if (err) return err; } @@ -967,14 +930,14 @@ static int abx80x_probe(struct i2c_client *client) return err; =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; } } @@ -983,14 +946,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 { { @@ -1038,16 +1026,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 04:07:25 2026 Received: from mail-wr2-f12.google.com (mail-wr2-f12.google.com [74.125.225.76]) (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 ABD49457E47 for ; Wed, 16 Sep 2026 20:53:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=74.125.225.76 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592040; cv=none; b=VYqL+MLmvZAshfXaX55WKCAVKtJ7+qIiHHsSLuUbIsFnkJtvMvw5dsF0Y0eO7yUt9D929iWJQqNYUxKF6oPdntv2kdlAUFLfG7+9iavBYUDJileh4li2DGWJbCK9ztsXqlkJ2AN6I/IQ1h1Bf/Z+oxy0DBgquXTAH56gl/DZfYM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1789592040; c=relaxed/simple; bh=QHKmi4S892gGqNg6pBl9u9FP37yr1KqOqVmUXFSF6Zg=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qHlsq3Zim/Ac2Ym9Wcvp3MaNs+TLCEG5w5Xo0Z213tnroHjaXZJ7l+q83SvcwbI8xxK/ffGfiE4EFZ78IL5u7hZ/9+gRiD/LX/av0HOrppN87erY5SY3WJsfrmDUGfkotSRvBMwavom+hbWMF4w3kpAsQBtfgOopeEcYDioqKsQ= 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=Rl6vbCZx; arc=none smtp.client-ip=74.125.225.76 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="Rl6vbCZx" Received: by mail-wr2-f12.google.com with SMTP id ffacd0b85a97d-485984ebf5cso122282f8f.0 for ; Wed, 16 Sep 2026 13:53:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1789592021; x=1790196821; 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=vA3yGa/rngc4Mu+qB0qMb9WEK6nF8DEqyJ8hSv4vu7s=; b=Rl6vbCZxwmYNksiZzLqjiO1GUjyHDXIVclrU4aVyrXcq4RNDdT46In947egTloVO24 WbJsb9of+9H2nNL+/5FgoyEYg3M8pFNQCRseu7iwnScV6XXilGsM1gOZRgahtCEePU46 zDTPZHIZxzeDOPNsx5m0wwdxjTZYTOt79hw6YMEXlgt5LFojgUhB+EDJswCTdySWmIqQ G9th+KMvkRTC5lFYedtExOexrsFyfT/y2Yo8LuRIxPlCZUq52axwjwOl26Cn8ttNymFA CFs49sSVr5/RG5q2UPNN65JsV0XIUFFLFgSOr/q9r4ZETRNPd9xVFznLYf9uqdZEkatu cCSw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20260707; t=1789592021; x=1790196821; 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=vA3yGa/rngc4Mu+qB0qMb9WEK6nF8DEqyJ8hSv4vu7s=; b=IuHgUI/uByZYtpcav3EFKqsFGO5CmLpSK2L/2q/q9ng8te7VX4GEUZFHeEPgmzZkrk L0YT46JhFDDP6nlWyADloH2QvC3Be7HI52fWUa0jKUnVoRhvByUWlgJ9BUMeJnV+XDtT QkT/JzNVfcnH+kDdBrBqHzrrcbG9ISfRJkXgCP/ksOt0CnYLtS2abX8Ox1rfTZWMQgze MuL4Go8R5rX8lB60CIdJEOGvRf+BS6zdUf95L96q+ZRl4sG8NClxNfAOAYOOzrsyj6Ho 37lmNLaqTMhcRUELYas4hvzX+XdwGFL5RuOD3w19K5soP82nweqwMKEEkvG3A6U/Xf+F A5eg== X-Forwarded-Encrypted: i=1; AKwUvBxJzjVRAXsH91FVMDdqDIyphup1ChowLIm8KXJD3yt3Vfk7/2+0WJjmbwzt8NQlGb/50lMFq0PiDSBRQoU=@vger.kernel.org X-Gm-Message-State: AFuF++lytFK8g4LjfogN9SYl3Yyw9+Lf+NKMR26eV3KNMB+m0ZoGHUFx U0+6aj927exAFJA5FppsYwVGcpbxFW7G/UMKVfpHOKk9WUeA79zLT4B6 X-Gm-Gg: AYBFou0qBuh8pAGQ8IeAKYW9FFsQqPJ2UCwqe2Zp+PLqCbS5JWc0Nq9QQGvnkkISjEw KWuKBwOZ3aP/4wWY9zDHxSmtMI0dxJ4QtOypZT4i/+2NvqPSO2TKb6B2pxoqnRYYvpi/pXYGKUh LoTNzLxbXMGCtufR++w9J/DPjLJfWMvDmEhacu3Ypd94VH1a8bUvmeookQI3VpPR2NyYtMxEmmo Z/BRpecHQ6DnoISC7I73zK2oZzBLmqpBuIPOKxHbYKBFp0VITl36LusAc7TuDinioDNag/H2Pxt brQOtcYxBkGKI3wVM29xNbd6XKUKorN5++6iH6DM6QtMbvubaSY7CIVQ8BEzFylgf4hi1XS/Bj6 8bFEIkh63F8tSE4SihX6Jm2V2Ef7U2bQPqeucqcbGckktkPHRQC2rswKTEYNPrjR7jgRql04rQl zryoE11iKd1rbqbOSaH4Xc65TB9nCQly5NhpUYAAgeVh/ZGhN5rIj2r5yN2pp8K37QeTnZPgs= X-Received: by 2002:a05:6000:60e:b0:487:6d9:dbe5 with SMTP id ffacd0b85a97d-4870cee4914mr5784145f8f.9.1789592020628; Wed, 16 Sep 2026 13:53:40 -0700 (PDT) Received: from antoniarch ([78.210.41.3]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-4870bef7678sm11086166f8f.2.2026.09.16.13.53.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Sep 2026 13:53:40 -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 v7 9/9] rtc: abx80x: add support for ABX81X Date: Wed, 16 Sep 2026 22:51:38 +0200 Message-ID: <20260916205138.16771-10-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260916205138.16771-1-apokusinski01@gmail.com> References: <20260916205138.16771-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 3f0f8d7f8761..718e6b8555f5 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} }; @@ -1076,14 +1079,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