From nobody Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8447744211F for ; Mon, 10 Aug 2026 19:40:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390808; cv=none; b=mzH5kYpqh9lsVbKTgQzT8I4+DZGlO5e6NocklW6FXbyso5hNpaFG61P4NjHszAH7O0zdb6C6s0IaxKjc7fZVucFF+I+8DWsAStO/6Bwlo6Ril3eFwQzKw8Xy3iCulvwYdGFl/SX2RE3J3pUt/roI8JHX7zTBFMcFPpl90t5ci10= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390808; c=relaxed/simple; bh=JzPmVao8FK9SYW6EqLoAZ+WBysafs2v13tUyYWLjmGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jh2TsnePmSdjaawRqo1PTeQNUUZfgVGorEx9wgoG8k1xVyDwjOgCiuZ45mwccjtXp3PHcKcRzsGd66kL1B8uZpOD48OchCAuWF1mllpiu4ZwEB3ocAK8k9B+B277FCOkfLkJPnc5IhTkn1napXam/HBS7AqmGnN6fM7bB5qm4dw= 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=oRiqn32k; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="oRiqn32k" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-47fecbb7000so1128185f8f.2 for ; Mon, 10 Aug 2026 12:40:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390803; x=1786995603; 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=oRiqn32k6oLtpfvasTlQQ94vOJYKgcPdhfEYrxUlQUEQXwDOUW1CD7dSjEppgzm6AE sMrMbymsS7WkWZwNer0MMKpdvW0mOfuoMUXNHL59uBDw8jYB5Aqk7vcuMoVUB01p880f GGAJNKu5SkEAxr0QpNOWyWnImU8sWbA8viLdRlGvN5zlPB/hE7wJBNO3qOADh6N0SF54 ZrHkTnacQ3RgOCABQfthwuDD5qDeNNTupGbxouP537tTYNoiu6p1nSBTs1eyZSCnSmUg iMRZ55UJBAjqyofDRVz6/hdiEFWxf6UUNgmcLdjb7Xc9VRB6AD8htbrynT2amj/+SYdL yvOA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390803; x=1786995603; 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=OUkuKX5D2SjarOLQxD5HTC9j80SqF4qLEjLcxrBhMbMYgmmId8Wk/+1a0jztbtz2Zo hcKtIGKAvnQAvcYwXDLK7wX1wizA4rIBYvANqevmUReYiJ7zv1Or4R77y+kkwdUuXjAs PAX74R57lZnWusJgpAeGYYeqBsNEEetfbKI6nJmc9PP/16p93IOHUBZkPS36NyKeeYI5 P9UWfVyT/Blf9wDKrcJFJ029Er/O+94SG7T5xCRewPy4xSuyiyLfgDjsJOFCLMbPY4zn keyBSzU62YJ8QW4vKo4UCkwPBonD8Bca2/XQt2mxDDZYGJDeq3lNqoXDLiYOFalyU6wt JcTw== X-Forwarded-Encrypted: i=1; AHgh+RroCVE7D0bNySCavckKFQGlvUrhSQg/kayiuaXxCB+qWiV71exUxLg98NVjBzO/6I6cWbDWqwkhicke0Ek=@vger.kernel.org X-Gm-Message-State: AOJu0Yx5EnJeFOgHsRTiw2GmHoIW58vqouujmqUgduMRSYcVFfHsoH9S GEimxd/exnxgPyW+ijRFtsUGTzyFAt8gsw25MUFYTTHt9ig5znICpwDZI91OyNt+ X-Gm-Gg: AR+sD10f4gboF8oKyzb9qY4+zZnxpbMdyBs4+bEzhiVs3vlfk7/cmVd4/Sb4472oa7O JXqVcyvn7o4HUR0NZoXxQGeQT+Ig3HbSM45GNYiYk/q+C60rAeyCQs+CcX8tCsJUG/qNNaxthlh p7XyqXChmEvBvqnHZAVN1vIIvyIlT0zo4wYlm11FNe2MrhCBLmJHfBIHAEMwQxvkqDHyaxxTAYJ qqz0ZwSlBBTIY+7x1TlhesIA34N7UhLmSysgElqM1B+k/rU9qo/8EXDnupefB9qTNXUZToCNhfw XRj2wxJoSVKJ0GBR0IgHb1N+Kuhx/VffYGUYDpf/jheDj9nnLKbHk9LfAFBnDENmcbxuVnXG9se +/WV+38rHbFWHvEOkOOXjp0ri4goiBcMj8iQp9hQ7hhzTrmlZ3Eqvt7GoAX+Gm9+RJ76igZRgFk kez2vDd5UMj7A04ZeINj3gP4pdgsm0sXg0avt9GWbQ0K2mLFUW0wsKCZz6fOjUpK0= X-Received: by 2002:a5d:5985:0:b0:47f:b452:49f1 with SMTP id ffacd0b85a97d-48130e7e7dbmr33227089f8f.2.1786390803210; Mon, 10 Aug 2026 12:40:03 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:02 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski , Krzysztof Kozlowski Subject: [PATCH v4 1/9] dt-bindings: rtc: abx80x: document ABX81X RTCs Date: Mon, 10 Aug 2026 21:38:18 +0200 Message-ID: <20260810193826.210683-2-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 Tue Sep 29 07:39:18 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.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 1BA73442119 for ; Mon, 10 Aug 2026 19:40:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390810; cv=none; b=PCrVIDHeUMT6MPWeZw7SfQoMTxvAWmiO/SEPZo5zukDPgVLHazpUXEdHROvdU/e7cEgk3JFqUR06/G0hDiCh3JDjpMQpS3xSfpQtUgvSUugUk7fWyhxIeJBoEeuP5h7/DzFSFR4HFjq4TfgqGvywzE3TwX8Yzew3Oan2XQB+d04= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390810; c=relaxed/simple; bh=iymtdZbAVDC4szK+VL2vsDv4Um3gp/9GnkovC0TOf7E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GV5X0K7hdPtAlly+Z/0wRVX5sPKCO55AsZn88Wo2LG6lCmAfWfCQYxTk4mS9qouwVMbF6LMAO0ueOLShPInbKJlb2jFvxeE83N3IGl64o0Mg6e3JrlpUKtfvN3MEORg2Inih+7IDHrS3qYDRaHmu88K5KNSEkZac3eRDkTXf8o4= 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=FEM3ErQZ; arc=none smtp.client-ip=209.85.128.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="FEM3ErQZ" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-4954a9e8490so1323045e9.1 for ; Mon, 10 Aug 2026 12:40:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390805; x=1786995605; 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=+Lv+zt/h7dKa8TuGsaFOLj9Yjn5OU7W3HW8p5oLwNPc=; b=FEM3ErQZv/iFI2wk3UMNOzwUqmp69J7Ox/rfTj46W83fpT8fRiJSr5CPXXVhOSWLWK DuF/CS3bm/ADH0rajbZcuexCYPDTwCWNo2iPU1FBav7fvUEtaZ1cwVC2LiTDeLdPnMFo Ar2k2r+WoH0W9nXjUBbscIenAzy7AmEwAxCTxBRgfI/G8OzIZQPYBydsLQz6M92RQEq5 6ezcSYVsv0W1dk9GNBZgUK1za6DlT0gdZSmBn7L5rdP97u38q58KIDUvGLWTmylf/QGK WrXxHmIniK48Cmk90p+7A9uTP6MZdtJCwr3ZNYk0IBuq458QHBUM0JojxKEo7pj/2kOP gN/w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390805; x=1786995605; 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=+Lv+zt/h7dKa8TuGsaFOLj9Yjn5OU7W3HW8p5oLwNPc=; b=XXwcKnRVFOpp4nwM0OPv37Mi9/4jLIaK1M0V9FiJQZsokW765w/6iFPWxBJizi4GMC g9+nAzd6e3NrWt7NPtiKw6IpK6PMQckcguIt1Efibryb8o+KyvWMi2BkjDgZsq2Btbn9 b98x/ZurbiTKE0/iy41a80hHn8e6JytBTKUgTUmb5JDDk7RTtc9xdiGv6hlpOyToy1WI 8D47sm/xiJ8I5ZeJqqaKn5H7VoqQk8PQXlPQcnHHMfky2pGBr875dT056U85YecN1Art rdcGdKXg/aq03vRa/0Sdpju46hle0rPo+91vJe9Jz1yHa6MSjRol0u0sPrE4ZXTmY7So R/4Q== X-Forwarded-Encrypted: i=1; AHgh+RqKmJ8w4lJvXF3ZlnlAakQMY7vYECCpcz09hUKW8sn8d4sQp5Z5DKJxx8r8QItyO3AcRnso3yImhZUsB2U=@vger.kernel.org X-Gm-Message-State: AOJu0YyVEI8xfL6vpfuM1pKx3NyCC3g/9YPQAi/OZvXqrReUY68j7BHg 2tA6C9wOFvPzD51oUBs28x9b24N2kyzLRc3OoNWepYvnPf8QWWv0W7Ch X-Gm-Gg: AR+sD13o8duey2DguAnsfNCeWZ51ZdxsScXciqi+0lyo5i07CMG5Ly90UUQrlhaLLEP zruWUrwHhmDVz1eFZ9r2dI57CcGkru0iMlEsvwjKlE8xBBYsdTS8PH/K6QO3i5L7WB+Elo19nCQ Z18yQu4hX2Loq6GVrYJGgSnid0tz/Gn+HT7bScpaRw+bVlaQc+rcnyOwtByzp11AmWz4St49xgQ ICm7qqmlJTam2Ca/dDrD1CVNGZSzLiGahiBOmIph72YhGR1Qf8CvIfgOL6AOJjdgNSOimSfnz7C u+8gmQNy5u1HFN8djJS5O83OAXhymXEbWwGN6INdaftTieavzFwkApn/ExRjET2qwrs/aCc83Li uI0tgJFe2Z6VmIt1tHERdzZwreKvvV4BopJITCzd/JEEJpBQL8FAgc825egvvwDid9ie0BgvIR4 +2yZzwRbe+7ErmoduhW9n20Z6ALdbv83u0WuC4PhA1UCTGF8SlQ7PW/4UhpDo3alogr5LJP88PV EU= X-Received: by 2002:a05:600c:8287:b0:499:5f81:8ca1 with SMTP id 5b1f17b1804b1-49974667332mr8638055e9.6.1786390804533; Mon, 10 Aug 2026 12:40:04 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:04 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 2/9] rtc: abx80x: fix error check after i2c_smbus_read in read_alarm() Date: Mon, 10 Aug 2026 21:38:19 +0200 Message-ID: <20260810193826.210683-3-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 5486d9d0b1e5..fdf9664ebb6f 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -294,7 +294,7 @@ static int abx80x_read_alarm(struct device *dev, struct= 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; =20 irq_mask =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); --=20 2.55.0 From nobody Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (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 A9636440A37 for ; Mon, 10 Aug 2026 19:40:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390812; cv=none; b=TGY95Fd6npVnCiuQVOjiIAMZMXrwtRP1odEDNhn5x09I5fLqmVpdkkvtrRvuflrzB9lRS1MPmK3crvA2GH4u3eD0UQssd5bUA5xTpftKsDdCvUTjCg7PxxsfAe4mWBCnAZg/NLCU/GEsnvx+64wb6mhePNkjHl6RaPFOyLsutqE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390812; c=relaxed/simple; bh=p25ogiM2Sa8dkypvVtSH6kxWkficJn5eIY7C0S2Bxg4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=p9NuKwxr9IXvHSEq2zULSFhWEpdwFxpusXRHxQmRtX7FLBobJOmX5+wF/4fQ1lXoOP8lqDz04gTlsZ7EP4PEEro3t8aH9O5Z+8m3KEnreFYzILrU/NTXbfhl1reXu/V3ZjYBU/eefaf0jzMy8hUUrXE0xnSkqkaFkQnzdKlHojI= 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=YaAbUBiJ; arc=none smtp.client-ip=209.85.221.42 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="YaAbUBiJ" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-47f703a9d05so1685412f8f.0 for ; Mon, 10 Aug 2026 12:40:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390806; x=1786995606; 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=cJn7ePOsurTlt5ccE+gZ6P4uZZ4odFFp/lRiM7gv8dM=; b=YaAbUBiJ2QwKZR0xUqPtjo9HB3fSEIgI6VIU6yCbjFNGnx5Z056rB3Jdvnil8eZayN 0yhqTfxhw51P5iescM/68oaDgrEE9YT9dN/GySm9mstKBRxkoQzeSsj+5Xfyy6zicPLG J1MbYcGn+sIP9veBhQVFlOznjkjqPu7qyRaju9C7ReDNzbdidAWoXPZQogy/OoksCpPb JRsy8LtdtPSOfvrEgKvbYK8kd2vxFLx1Bgf+ix2dbhwsK81dKKGGzPRrIjrnZ/KFmRRW ZLYz8WtFI9VwKO81tBLYRUoRbKD33XttOHnUCPI6145WUjr4AeLay4sr3R6F+dDoE7mB UEwg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390806; x=1786995606; 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=cJn7ePOsurTlt5ccE+gZ6P4uZZ4odFFp/lRiM7gv8dM=; b=jKNOD/FTp7E8a7j+VavXiWPmOWdQ2iypmoyLCz9Mr3DJFljSZrZXNYFFCwgwlB70ll vgK/4IF8umvlKaeW6flJi3CbqDPPRE6xhzMRlRNKeomnRRIe+bsTtuUhatFp+aQ0TaEs +HF2mlD/O/MNO4aQZkjaE4MgDVY2BBgRuvvWk1aSdW7XmWk79lzS2qsoGC6rfeNPdJGW X6kMB01On4eM792aZZa43bManS8Pqpt+L2g1cOC72nHKGlIPxgfK8ofK5PoT/SkloW42 kPo8wDGfoWrXrm8gF00dH75DhhE20EWN7CduNtS8BSQB4Is0nhhdW1h09U1if2eXFbeZ VV3w== X-Forwarded-Encrypted: i=1; AHgh+RoJO1uVfnbpt/kZNYR+jPbWEfJLU9Kt1Si1ieQC+DYwVqzwgI1ZNDOgzBb3DKBbNGWCrP4N0uxXf1vvNbI=@vger.kernel.org X-Gm-Message-State: AOJu0YzjJ1nKRyeg3Ah/AxhTG9wyfrTfU3Txab+LCCkaM9PgkMR52QyA xwkz0xNTOaKZG7s9p9cvmqKb2fuRBql0tBwB0424Kl/ZoIWL3w1q9ps9Sq6o79lR X-Gm-Gg: AR+sD10n3Z6Dm/fIxJilSIyMzhmrLUP4IkgPSoe3xzKqYVhMa5cbL33/k8k0Z+QLov/ tOVp1kkBdGN67XTWC7NtQYzKsj1Uj9bt85BlDGGJ9GnOZKYex6czuELU5qWDy62+dg9WToqg/+Q 66kz8bm+Fs+f6Ha3Zp62Pq/GnZSQHCDHfhz2eZaF+3pvVJ5LCRWqYfo1lcjGuRlKMY4Tv5Ku0Sp F5j2VJN/P7jx1Ml0WCpDT/sa6UaJxCQcAlRGZMqnGOyTdxpUJxzOYsp2pk27bjn04p6dpcmD+wI VA2G7IFe0sZKtGc/UO4TRi+VyAvu5r6/5vqirneeaYekHRE+URQiYS7UR4D1ebx6ddFY9O1T2Yy LP+LUFzBQB659J/lf8LDCgxUcHPJyf1J34W61CUsJm5HmLGyfG4AdSkt/Z0oz4+btGKceOJ6S7B UDyF6Xe1meSI+xJxDk2zLxpB0dAlsdduCevEsn88PoXTvkMdmF0dNdkmJ/PwBzFeg= X-Received: by 2002:a05:6000:608:b0:47f:9662:85fe with SMTP id ffacd0b85a97d-480026c8757mr35222263f8f.16.1786390806060; Mon, 10 Aug 2026 12:40:06 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:05 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 3/9] rtc: abx80x: add mutex protection for register writes Date: Mon, 10 Aug 2026 21:38:20 +0200 Message-ID: <20260810193826.210683-4-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 fdf9664ebb6f..0c8d3416fd5a 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; @@ -317,6 +324,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 @@ -330,6 +338,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) { @@ -352,6 +362,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) && @@ -360,6 +371,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; @@ -443,6 +456,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) { @@ -454,6 +468,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; @@ -511,8 +527,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 | @@ -526,6 +545,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) { @@ -539,16 +559,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 @@ -617,6 +639,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. @@ -701,6 +725,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) @@ -908,6 +934,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 Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f49.google.com (mail-wr1-f49.google.com [209.85.221.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 531B7442B03 for ; Mon, 10 Aug 2026 19:40:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390812; cv=none; b=fJ5KK3eXopF9WRAflvztu+oHTq3ad1HDK1UDWX2skyKK4GYscHPk0KD/+hL4jrNooSWLGq89TkmAX/LODjD46sn8FHrD72JxyXV1YrIKmBAu8AallMpX688lOHPePJ5VuSdv4nAspcrIRf+Bd2xdjiMLpqGxcFVTZWizeQQKmJc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390812; c=relaxed/simple; bh=s1E975qyDx/aoC3utss4boTjVjGr6XZHFUjkKJJOiyw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GEl5y4le/n4TI8KnXlJ/+oh/Wag9xVFvWVGURwHl1GXpekQsYKoQBrXe0Y+zw6TcL9yEMFaIyHknX3aVoGKLk387TFIdnA8GOVux002xX1gqGRiZ4YjYq/fsBUtMjN8NaROqZjopHdDI6m+GgUxZAyhx8sLXB4s2/prEhopVBIA= 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=kui1bmqn; arc=none smtp.client-ip=209.85.221.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="kui1bmqn" Received: by mail-wr1-f49.google.com with SMTP id ffacd0b85a97d-47f84023916so1997209f8f.3 for ; Mon, 10 Aug 2026 12:40:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390808; x=1786995608; 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=VJQY9PyWbhU7AG4wbSarfgz43hrJhg7RLYse0peNSa4=; b=kui1bmqnakamcvL9PFKLr8RaSFGDUAQ7jCMW2QEg2iCMhVRjT0MQZfby+h5Qb6DuMx b/bqVnO9mM0IbqjqZUzLUKSTVlUzX+EPKgE0AraPO+bn9YGmQfcUnp5iR1Ogs6m5PjlW zi6+iOYqCRAHMz7cQrREgyPUysu+BFrC5XapKqXSppp2SQMwyo0BSP4dMS0ksUWxOjyq 7NTAEeLiyAP/hUM4txggbAVIGzhhMhyMlbDuvPhFY66AxHl7HDUIH6qRwK927RyLEIgB k1nC9IlJxyyXMnO39wkc5bXFtEFkk8ddQzhjYwAbcli1Fcy+akppeNAVn53sF1rfjo92 cpQQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390808; x=1786995608; 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=VJQY9PyWbhU7AG4wbSarfgz43hrJhg7RLYse0peNSa4=; b=CTLkDoUs37mAbDhuk9ymA/8t608XI4HsbJOr/CFrLcn5wSI3RJ+gQxk+NO8ovFBXXz bWn90Xyw//WaQ8hWOlhh0Zf/1z7a+BGvVhmEBMer3Mwq6wXJtKHI/K+kABVF6YuT5AYn A+J3gSjPIyxj9UXefxNcl1M2ow+ZAEpcwbxeAKk43mPisTNmYjL7nIiScwmiglbjrVsj gVG1+TZv/CX0+uHTxQ+r7KzKtEULlr97Gd/M2cmofzY58Ad2XNz8QXEfe5t3aQ3KRDSL aQdrkjIRhcmOdV68bqJGb8XpuKrLfYdsu18NQJ1uPsbWYK9AvBkimm8tlHqbB6g49Do/ JMGg== X-Forwarded-Encrypted: i=1; AHgh+RrJg8WWPeFnvhFqZAZLAopdxx3UeVOFJadFu5sTLXdjJsMZipS6M1p+4sRL0imWnlTOSY/MvXmqzWDrWJk=@vger.kernel.org X-Gm-Message-State: AOJu0Yz/nA3kQvOi1HaCggS6o3BiFuuyWoWLrkpg0baKEysM73UZTMsf aMMqfBQdGItf9ceR4gyUx7IurU9YfZToSRFcSHt+cQq+0qNggHbfyZxd X-Gm-Gg: AR+sD10vgqGxtN7lE+IITaczVcKJ3pDUUZKrC0ySpg1QzgrdBpjTOXzZpgiWjR4fAK3 R1DPY3QSJqSsbE3OupYbaClABZ1H1m7uJxzMRfoCWNsBvMWoZdGsBEOaTOk3+L2SjzBDUTC4Yv9 b4pvY43NW7ZMeRU/4+zW2nGmdpBHa7AZ1jzpN3TnqAhg3HgI0OsAxsOp7RwhlUIcRaRUkxH0/qn 5thuXX6eeBIdQ+Kqb+/y4eBUOPDFo22F2q6ccF8AnCCdeYQPcT+cPYG8JewCkBvzCZY7JrVkA+J 7ZMlJwwwjSXC1j3Xa9Zw0f/2aexk8TY5ZViXKm5vF7Pw0VFWRXxgA01N0bFvCVR2HNHgX/z2kDH b+5o6tBlJKbr1czwg3D0HNlEjiBa0aJgkwyf0YGZxohBMYaeD0841f+W+zz53aSqUsvDanDMt/n QVfzP1Zxh1HINAEtTt/Lu/OJYywFD/0eUjqObdAg+9KJo+mnsYzv81E2BxjL39njifdhQ4aSJkW g== X-Received: by 2002:a5d:588c:0:b0:47f:eca7:ad1a with SMTP id ffacd0b85a97d-47feca7ad3fmr71195460f8f.1.1786390807559; Mon, 10 Aug 2026 12:40:07 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:07 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 4/9] rtc: abx80x: properly handle shared IRQs Date: Mon, 10 Aug 2026 21:38:21 +0200 Message-ID: <20260810193826.210683-5-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 | 54 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 0c8d3416fd5a..485d1ea08030 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,27 +272,34 @@ static irqreturn_t abx80x_handle_irq(int irq, void *d= ev_id) struct i2c_client *client =3D dev_id; struct abx80x_priv *priv =3D i2c_get_clientdata(client); struct rtc_device *rtc =3D priv->rtc; + irqreturn_t handled =3D IRQ_NONE; int status; =20 guard(mutex)(&priv->lock); =20 status =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_STATUS); if (status < 0) - return IRQ_NONE; + return handled; =20 - if (status & ABX8XX_STATUS_AF) + if (status & ABX8XX_STATUS_AF) { rtc_update_irq(rtc, 1, RTC_AF | RTC_IRQF); + handled =3D IRQ_HANDLED; + } =20 /* * It is unclear if we'll get an interrupt before the external * reset kicks in. */ - if (status & ABX8XX_STATUS_WDT) + if (status & ABX8XX_STATUS_WDT) { dev_alert(&client->dev, "watchdog timeout interrupt.\n"); + handled =3D IRQ_HANDLED; + } =20 - i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, 0); + if (handled =3D=3D IRQ_HANDLED) + i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, + status & ~(ABX8XX_STATUS_AF | ABX8XX_STATUS_WDT)); =20 - return IRQ_HANDLED; + return handled; } =20 static int abx80x_read_alarm(struct device *dev, struct rtc_wkalrm *t) @@ -950,6 +963,37 @@ static int abx80x_probe(struct i2c_client *client) if (err) return err; =20 + /* Disable unused interrupts */ + data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); + if (data < 0) { + dev_err(&client->dev, "Unable to read irq register\n"); + return -EIO; + } + + err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, + data & ~(ABX8XX_IRQ_EX1E | + ABX8XX_IRQ_EX2E | + ABX8XX_IRQ_TIE | + ABX8XX_IRQ_BLIE)); + if (err < 0) { + dev_err(&client->dev, "Unable to write irq register\n"); + return -EIO; + } + + data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); + if (data < 0) { + dev_err(&client->dev, "Unable to read Oscillator Control register\n"); + return -EIO; + } + + err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_OSC, + data & ~(ABX8XX_OSC_ACIE | + ABX8XX_OSC_OFIE)); + if (err < 0) { + dev_err(&client->dev, "Unable to write Oscillator Control register\n"); + return -EIO; + } + if (client->irq > 0) { dev_info(&client->dev, "IRQ %d supplied\n", client->irq); err =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, --=20 2.55.0 From nobody Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f45.google.com (mail-wr1-f45.google.com [209.85.221.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E7C8A44212E for ; Mon, 10 Aug 2026 19:40:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390815; cv=none; b=Uaw0O768G+pnB+liVlwj7qaf8WjzqJNqhbGpfslQegRyaUlSEuirDV7joU/lCIjle60sWFXtMSYIXVH8Af8/hioo5L66GdBfcRKDED1t4pAaSST2SoZr5JDpe+RAszfy603nFZDDDNusL4+j4GOCq0q1pgUOHbjRUDiITYpnNUs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390815; c=relaxed/simple; bh=08UtlehfK03KUSQwevWJqiUxLKsv8IURriGU2uZB4o8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Sl+jUa1dJ7eb8EjSLjYlt2P/4qxuGUMQjRxxyWI9rqpyODDYaBheKkvAWGzINWwLp1NUMxLxNzgDRSC2f0wfUwpJABAC2TKr2+NEBWPtzsTwW0e0XCFDQtxwxts4z0IjKnRKXX/2gnpfCpJUKc5kvqp65sAlxHuSJ+XaQjLuyn4= 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=pQK58+xt; arc=none smtp.client-ip=209.85.221.45 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pQK58+xt" Received: by mail-wr1-f45.google.com with SMTP id ffacd0b85a97d-47f96c5b722so1262760f8f.0 for ; Mon, 10 Aug 2026 12:40:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390809; x=1786995609; 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=yFhi9f2vBNbbKbsB00RQsZsEKX9ezsH2FMVXNlaSZW0=; b=pQK58+xtN8eLJbFkYRVM3lKUfL+OHC5eLpP9fLBoYWpTfQUXbZ7Kgv8RUGPSYNPQJM EP/EMryHMrIrLoo6bQSNmi4StUMVyD3rTml80e3x9iyiWs/1/uqr4xwbEEQsRfnyGWbC NGB+CDC8L69OH/tqtDWSnfUo8Vk7VgOJAxWmU1Yn5685/wYue/MfFjbaL7Sfa+LQK8n0 sqL1yMNPxTQ08QBHZ8m+WJDurdeK4R6uYNC11daVlrRSTKsrTv8pExjuypxPm32OIlWU SG3P6Me7YIFRBRzDxwNaeJyQ4JzFndUws6EfPjP1W+oF9fvv1XCnIXLeId4I3Ujf3mAl 7JgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390809; x=1786995609; 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=yFhi9f2vBNbbKbsB00RQsZsEKX9ezsH2FMVXNlaSZW0=; b=PyQf914DvA3wD3oF5r4OQhZ9HnzjYP1wulb/gKrfb/pIGYFmUIJ5Y0j5Pr4zl52tG0 z3rRDda9ODeqO9sHawn2QTsza8IRZnBzp7jaIooyKYmXrIP5nCGuZzg+xumuB/SnZ/4k vFARlY/fHm0yWgC775jyN0E3WNHDuMN9P4tz40mdN/WQ3znx7gploYfhB4xQPCmkLnz7 8DZ/C55+W9JtoVYaRBCelZAIgsiF+Szy4W+AbEFRvB17rm9PwBVKcR4UEL6GGakjzbCG 7CDMhTkzP04yhiPr4Lrg/q/CSunfB8vj+h7rQWKJ/3A3j+vpCx5w76SKAst1kO5oj/yn g4xA== X-Forwarded-Encrypted: i=1; AHgh+RoYc/mDULN09r6vkVvyno/cPy4tBN+o6+Dgiym21jwKBCagQjAYEICuNmZ2Hwd5H6Qz2ofzIgbFyRk5xGM=@vger.kernel.org X-Gm-Message-State: AOJu0YwlzyRcsdeVahYKS+SaH56CX299Tk7hKVJkS659iNyAXRb+Hr52 XvPrDe6IR4dCVz5uNzqdXna18+6dqmAyklVszvNq98cbLTNnmeBubBwK X-Gm-Gg: AR+sD12xYiI43laBP7a3xOBwUdJyqncVPPr6rR6dR+pm0uI+ha76xspP5ONYC+d8irU Dzsods/DNbySDkRS9FSJjpGwmMRZQNbFJb7S/x1NsFxVoLGU80O7RI5EIgAm7bJlftzIyOgVZgI E+LGEPaLcujZRWeUEvL0o1zGvDtiQxLEa3ZuryRHCICr62yKKTz4r6iOD9Y4dH5pr5Tsensa1ke GXfsA/yndT65NkzWQGRCytMXWLQmkuy1QHhp6kRSRS9jhHle7yHX47gFdIXshH1PNO3CuYQB32G 6JGEe/Iw426ilHYfePGwekOlc0iyNUS762BMcso/fURJM2cxRFzC9F3nFw4/7GzXm1iRl81i6ah 1L9pTKtLL/ZtH/XA+oRSCoM9aSgLk1/4F39+vexAVJkovy2f3bPxah/Th529cqv3lB6nxwbQisa EHCDT9/ZvoBPhLBf/i17k+sL9ciD8z0AqiifAABZW96Bzim93pQjcKBbROdJ+Bm+c= X-Received: by 2002:a05:6000:41f7:b0:47f:95ce:6f48 with SMTP id ffacd0b85a97d-481455df5afmr6870669f8f.11.1786390809120; Mon, 10 Aug 2026 12:40:09 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:08 -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 v4 5/9] rtc: abx80x: add irq to struct abx80x_priv Date: Mon, 10 Aug 2026 21:38:22 +0200 Message-ID: <20260810193826.210683-6-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 485d1ea08030..12a4dbfec639 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, @@ -341,7 +343,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; @@ -947,6 +949,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; @@ -994,19 +997,19 @@ static int abx80x_probe(struct i2c_client *client) return -EIO; } =20 - if (client->irq > 0) { - dev_info(&client->dev, "IRQ %d supplied\n", client->irq); - err =3D devm_request_threaded_irq(&client->dev, client->irq, NULL, + if (priv->irq > 0) { + dev_info(&client->dev, "IRQ %d supplied\n", priv->irq); + err =3D devm_request_threaded_irq(&client->dev, priv->irq, NULL, abx80x_handle_irq, IRQF_SHARED | IRQF_ONESHOT, "abx8xx", client); if (err) { dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); - client->irq =3D 0; + priv->irq =3D 0; } } - if (client->irq <=3D 0) + if (priv->irq <=3D 0) clear_bit(RTC_FEATURE_ALARM, priv->rtc->features); =20 err =3D rtc_add_group(priv->rtc, &rtc_calib_attr_group); --=20 2.55.0 From nobody Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f48.google.com (mail-wr1-f48.google.com [209.85.221.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A689244212D for ; Mon, 10 Aug 2026 19:40:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390820; cv=none; b=qTogu4V60+uJCr31ay4iFtc4+eAoNkg/r1dupzq+BjRrnyNgXHULqgLTtBb5vV3ZiVMdgQ6fm5J3mduRX53cJMLKyBwCjUPPZEBjuZZlIsmRo+C497lThepd94DJOK46R3io5Awfj8B/ZFP9XxiOXciAf034UqRnzhYQAeg1Ero= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390820; c=relaxed/simple; bh=4U5s2L+JK6pt5bn+oqBO8mnGY3oOxGJXMUlIyoAUykY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SpoA3Wko0IqTk0h2A3d2T1Wng2oAqtagMyf9HTq7iBrK3qd7PIHwIoeuFzPTfB3Fdmqb5AXAyuyYbqGXwWtA3MNmvMWAMPVcLA8O12/DWi+QwTuq48J/BR9KJbtG8X3M2sXrgOYpm8DCQS5tke9qR7/EkvEJkT3x4H144k2Sido= 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=WmxCT183; arc=none smtp.client-ip=209.85.221.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="WmxCT183" Received: by mail-wr1-f48.google.com with SMTP id ffacd0b85a97d-47ddf7b09e5so2326480f8f.1 for ; Mon, 10 Aug 2026 12:40:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390811; x=1786995611; 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=/mH2/MSL/UFAT3IsfTBYmLtSq62dX7+BB1fHUUx/EhE=; b=WmxCT1830xyTx/4vUIGqiHbJrtBQF5K6litXJCW6iy5nntZQTKLbxYB2eGzSdPRcIm oDuvLvlbBBFOa3cDkIl7bACJNmlCjKyTiq0W48gWUcYQqtTG129GJ7C4sUJWgAuqkOiz 4eGrYnw8YJHLaCj/BPclGo8DLHAuwaYbgwmhbIUuL5qHfyB6NQ2y9hideeWmHLUvvt48 2oVVEqTy0qeYcP5AfkJd9SIUgqwJq5Pec9SxE2uvdRtMJ7yxpQz36dALjOT8WUkFtcZo obqnlwcBk09rXRFAfWB5+qG2rcVe+oG+Dj8lAyp/j5VKDdRik4il6oKUHOFDemtzCDQq HEhg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390811; x=1786995611; 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=/mH2/MSL/UFAT3IsfTBYmLtSq62dX7+BB1fHUUx/EhE=; b=fOCl0Z4WUS9BpLorbAYwBMZTngw4xNLU34C9mwKlBvgV6YW3Q1uBFwYYGmHxafGrav RWKp1+1FzBPsjWOa4g1hYQrmMQ7AoXe8GjjseoHyJ7NUbO+QE4g6NtW7eCLsT9nkN72o Fupczgbx/U574yIrmhptinrW0uK9pt70sgDwYSHCxoBoZcKuoYRvxzdSvPU5wxoeSml6 Wlhm7/wphafROtPQxAyfkfPQzOkaObqPpN8QatR1uQjJLPXD+iG+Z+bMhOvM75SkJxnF f4D3tWYVMaCaknrpTv8elaTdoDXCrtpCfy0wgiIi+3ycvcJARhg23QGrVjfCBjxeo300 1paA== X-Forwarded-Encrypted: i=1; AHgh+Rp9Qbm1jVW90uMGwapQzVY07DtGhTHJSGNpTbSfSpPSbJOd4ZOq8VTzv6cCzAVZ/44/5yHfV7jjHP3OLqY=@vger.kernel.org X-Gm-Message-State: AOJu0YxGBDs9wEDv5NCxeg/eGUe0RCENKsiouwtF1tZQrdyhe4spy6WJ iQ1scSzP/gtMQ8TtNKxK8rX/dlx8nJF7aLzDGuk30LCpw7z6BMWuY5Xe X-Gm-Gg: AR+sD12pKN3eTk3QU4KpxsNm+JZ2TcHMAskoOnSv0dGMlfjP4zpiMCbp+lG1tB3km/W k6O/fd1Uv/cPZRYYsZG7u0iDUUA0whAyx70PTtwwVSTNDATtiEDXijoZOXEsq1xGQCxqr6vLy8Y mLo+eK6prju2kpO75ItpuIzwW+cNF9tzXgB/khyxnQGO27Y2vL5REgFjKzI479yeIxNBfG6eY8m 1qxoIZL2KohRelo68+YOEpz1BQc9AoHpJXexqXgQQEVW9u5dq/6BruDZ9uNSdj/ltQeWRsWr/YK AKH2zL7gE+CQURWm4IhH+03v8lOA1HcE8xxy2J0cQvyml7BcSWVP/Axpevet6tVKuytqCBXHgdR dD0FsYfTpPMEz4GUWkcFAzpkAYjm1oM9EEcbOeZGAr0nylsAr6H4nn5mGlsWTp7YnXV/JSFsDFw etvsWqLx6cQU5hMYgM1bvhqm4BuCx5WpRvGLzb7o1IDuvWXNKHirKMnUSE7taFGdTsRknUtOVHl Q== X-Received: by 2002:a05:6000:43d6:10b0:47f:ff13:105e with SMTP id ffacd0b85a97d-47fff13109emr35491709f8f.28.1786390810802; Mon, 10 Aug 2026 12:40:10 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:10 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 6/9] rtc: abx80x: use regmap instead of I2C specific API Date: Mon, 10 Aug 2026 21:38:23 +0200 Message-ID: <20260810193826.210683-7-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 | 389 +++++++++++++++++++++------------------ 2 files changed, 211 insertions(+), 179 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 12a4dbfec639..5d41882f3c70 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,8 +230,7 @@ static int abx80x_rtc_read_time(struct device *dev, str= uct 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; =20 @@ -246,22 +248,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 +272,17 @@ 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; irqreturn_t handled =3D IRQ_NONE; - int status; + unsigned int status; + 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 handled; =20 if (status & ABX8XX_STATUS_AF) { @@ -292,36 +295,35 @@ 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"); handled =3D IRQ_HANDLED; } =20 if (handled =3D=3D IRQ_HANDLED) - i2c_smbus_write_byte_data(client, ABX8XX_REG_STATUS, - status & ~(ABX8XX_STATUS_AF | ABX8XX_STATUS_WDT)); + regmap_write(priv->regmap, ABX8XX_REG_STATUS, + status & ~(ABX8XX_STATUS_AF | ABX8XX_STATUS_WDT)); =20 return handled; } =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; =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); @@ -338,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 @@ -355,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; } @@ -376,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)) { @@ -388,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); @@ -404,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; @@ -470,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; @@ -485,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); @@ -495,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; @@ -511,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"); @@ -541,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 @@ -575,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; @@ -603,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; @@ -620,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 @@ -633,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 @@ -660,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, @@ -705,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; @@ -716,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; } @@ -731,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; @@ -793,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 }, @@ -810,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; @@ -824,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; @@ -840,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; @@ -863,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"); @@ -883,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; @@ -894,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"); @@ -926,38 +975,20 @@ static int abx80x_probe(struct i2c_client *client) } =20 if (np && abx80x_caps[part].has_tc) - trickle_cfg =3D abx80x_dt_trickle_cfg(client); + trickle_cfg =3D abx80x_dt_trickle_cfg(&client->dev); =20 if (trickle_cfg > 0) { dev_info(&client->dev, "Enabling trickle charger: %02x\n", trickle_cfg); - abx80x_enable_trickle_charger(client, trickle_cfg); + abx80x_enable_trickle_charger(&client->dev, trickle_cfg); } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_CD_TIMER_CTL, - BIT(2)); - if (err) - return err; - - priv =3D devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); - if (priv =3D=3D NULL) - return -ENOMEM; - - priv->rtc =3D devm_rtc_allocate_device(&client->dev); - if (IS_ERR(priv->rtc)) - return PTR_ERR(priv->rtc); - - priv->rtc->ops =3D &abx80x_rtc_ops; - priv->client =3D client; - priv->irq =3D client->irq; - err =3D devm_mutex_init(&client->dev, &priv->lock); + err =3D regmap_write(regmap, ABX8XX_REG_CD_TIMER_CTL, BIT(2)); if (err) return err; =20 - i2c_set_clientdata(client, priv); - if (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(priv); + err =3D abx80x_setup_watchdog(&client->dev); if (err) return err; } @@ -967,31 +998,31 @@ static int abx80x_probe(struct i2c_client *client) return err; =20 /* Disable unused interrupts */ - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_IRQ); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_IRQ, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read irq register\n"); return -EIO; } =20 - err =3D i2c_smbus_write_byte_data(client, ABX8XX_REG_IRQ, - data & ~(ABX8XX_IRQ_EX1E | - ABX8XX_IRQ_EX2E | - ABX8XX_IRQ_TIE | - ABX8XX_IRQ_BLIE)); + err =3D regmap_write(regmap, ABX8XX_REG_IRQ, + data & ~(ABX8XX_IRQ_EX1E | + ABX8XX_IRQ_EX2E | + ABX8XX_IRQ_TIE | + ABX8XX_IRQ_BLIE)); if (err < 0) { dev_err(&client->dev, "Unable to write irq register\n"); return -EIO; } =20 - data =3D i2c_smbus_read_byte_data(client, ABX8XX_REG_OSC); - if (data < 0) { + err =3D regmap_read(regmap, ABX8XX_REG_OSC, &data); + if (err < 0) { dev_err(&client->dev, "Unable to read Oscillator Control register\n"); return -EIO; } =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; @@ -1003,7 +1034,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 Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A9E30442FC4 for ; Mon, 10 Aug 2026 19:40:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390817; cv=none; b=ejf/4sSxxUiOxdUeKAWx06R06EOt9syQgOGYd1dnIMR0daStTlyUFV7i7w2Kh+GXmVDp0cyJvSomgxkWamgCOejPBluaNPgEhDKlOqI2PRI1swRuhmhfWMhMV6/m/roRzDn9A5DZ+Qk94YEhth1s8v+UPxrk7t9Q4iklfXCQ4Ss= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390817; c=relaxed/simple; bh=7zftsifT1TeOCwtPU5cqKvqhs764DJUWLd8kYg26RIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=t5tPIRnY8RGAjhPSgFUb7+kHl8jONKco0Ef4AtC5IR479yDPAIA8/AazLAbWG+kXcZTiw19wNUnUmqFxwXiurrkxcdqNvGT8bUL5sX5o/ux0nI+J2xuPNdzLEUI8AmFAwWxGOpVCDA0dGR5W9+uG69Jur8F4cp+VPJ4uGc+l7qA= 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=Y3+SV9JA; arc=none smtp.client-ip=209.85.221.54 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Y3+SV9JA" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-472326ca506so19890f8f.2 for ; Mon, 10 Aug 2026 12:40:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390812; x=1786995612; 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=Km3JbJM3tHI5y78m8g9L0NcliILGFksyyeAC4KOBDJY=; b=Y3+SV9JAcjKaN0JGHPK/bPP0KMTQpx2EA6W+O1xTFxxPXKcHvpuccSCiOvPPJH6mq5 KRFZ34k6cc5rpLrwGWMgsbVaz0i1H+uqZ2c4PPZKhAzli1TE+HAP/ARCnZwmKZ5C/L8n hqUClVsczyQUbrAHKRNGMqCqS+yAPxKQcnFNNMkxHMS4I5PIjZRnrv6fLEWaSmQIBK9D ZPPlD4FTH9T1XURa/ckfsJJTgq3XfEhBS8DrrBjGRP9k2gofM8+cmMgaFdYTfPovcUNZ J42MQVimFH1ad6Kjo8wmK+o95NfC5B0xAFmxkZ9UI+1/5t/lY0rSxwVX4rAtPsW5Jl/S w/sg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390812; x=1786995612; 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=Km3JbJM3tHI5y78m8g9L0NcliILGFksyyeAC4KOBDJY=; b=cWB1ygdB/PDEByHG/prEvTzEX6aPDwhStiyoric0//s7WyHFDEdIef6Y7H7FZsvzbq /rQ3j2JvBM4hEU0czhcSsUFSIsBbJ64q+2A2KrrmbYSm7TO06Ern+ytd/TbqW7zsTOSo ShSe4MnWdwYIWiwioOMUAUXWzm+vXdEIEk/cFbciBRxJXwhJbayOK7LVmFBbahxnpQXi nBc4Dhg6pF432K5mhO6vrh6OmLqN9D0Md1ZeYnny2gb4Z0S2s3REyjo0KaWQ1PgNUycj 2wckWJA8MmkGphoYPCw6O2jWAbh5GY48D67LdJ6jcYe7FQRDxJ309Cp7Iyvhy/E6Y+gA DEgA== X-Forwarded-Encrypted: i=1; AHgh+RpNFr69KI5Bgsyd7ERRq9daDe66ECPpuCa6HVMVnabW7dB49afMOzYbLvTfQ2OVEVQkYqkOMuneF4Lc9dM=@vger.kernel.org X-Gm-Message-State: AOJu0YxONen26QRcoUmZ1cEwrDCMsUEEXDrRQSRKs3FlgwIA18PZQStt 7T39B2LMT00YHLmRJIoJmTX/QX5mnlfPPUI0RV+sg3qYgQEeruz3e8Rr X-Gm-Gg: AR+sD10QqGM8l5CKcSAETggbSn+YksqNFXtDO+SnFgqrOILyxJjUuAJM2PSpO+NaZYa vM9Yeiapx/KDA6G6zgfKsS62rjukbQwFUOUgBo+6+e6YKA41Hd1prOZohRdohKUwH9p32kffk0z xL39O7jj1ive0SF5YxBgYuCtf4Hpv/43vXuKW7a424CKLQ/NOP/cDF04P2tmHwpMT94MelVC6pD g2YZG8P/MY+YA2nB50ML6hFQtaziTCflxI0dzEtPRU/ww1GFXNUsYNCakPfUnTfld+o5R6uyYcN ewRHxwfxDqb+VmP1faNg2G9ku4h42F3NZl5XTt1ACsH6We/lFJBy1rJiCp2OR7ZoE0ORzEUNzfS W+Spklwb6MyBbDVn6kbZ1olj3zMobQxz4IpO/1dqZPYoGj0clFKXQZiJtHlqvBIhdZ4Uzwz09Vn Gihec2YqePEKOc8DyILNoUaA0Yr6mAXjsVotFTSOQ+2g66o1j2rD9DvlDRS8WeW2DXiwSxXRtDy UvPOBhxBUn8ng== X-Received: by 2002:a5d:6f0c:0:b0:47e:9f16:c0bf with SMTP id ffacd0b85a97d-47fec63e205mr73032320f8f.30.1786390812379; Mon, 10 Aug 2026 12:40:12 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:12 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 7/9] rtc: abx80x: replace read-modify-write pattern with regmap helpers Date: Mon, 10 Aug 2026 21:38:24 +0200 Message-ID: <20260810193826.210683-8-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 | 135 ++++++++++----------------------------- 1 file changed, 35 insertions(+), 100 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index 5d41882f3c70..ab88af43b4fa 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -232,7 +232,7 @@ 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]; - int err, flags; + int err; =20 if (tm->tm_year < 100) return -EINVAL; @@ -256,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 +371,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 +378,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 +389,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 +461,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 +473,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 +550,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 +811,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 +860,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 +876,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 +890,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"); @@ -998,33 +948,18 @@ 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 - err =3D regmap_write(regmap, ABX8XX_REG_OSC, - data & ~(ABX8XX_OSC_ACIE | - ABX8XX_OSC_OFIE)); + err =3D regmap_update_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 Tue Sep 29 07:39:18 2026 Received: from mail-wr1-f51.google.com (mail-wr1-f51.google.com [209.85.221.51]) (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 0D838443302 for ; Mon, 10 Aug 2026 19:40:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.51 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390823; cv=none; b=cstBxYhGS1LRVhCXsZTj7qt6d9G47S/UK4Tq+t14j77dlmvpg/L+M5GLXVIjq9s8zWZYgTxIXx596qVVag0WpHKNHwvyHSYfoXb5RfYERt9A+o1Jzb6EOjWXSW+syz1+tX84EnUtu7c39T7ARt0SU3K4PculYUO3FE4rxEfYIqk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390823; c=relaxed/simple; bh=SG9a3O8kgbbhIUPGdJffq+qyBcl8R53EBTAnTVe65o8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=S62kbLagcLMSwF74KSeXa3zZLYAokq1NLs8E1yvURc7dVhdg6WR41Fu/6kHClW9G+xVvWo5t5AUr2SYevV5H80/NFDoe5RqhXM+HwP+lCWbv8tp8/IfmZIiUhm7t1jXVo2FjR5tXXod/Q7axWmARS6pjf004PrqLEiHwKb/qfmo= 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=b7Izp6HY; arc=none smtp.client-ip=209.85.221.51 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="b7Izp6HY" Received: by mail-wr1-f51.google.com with SMTP id ffacd0b85a97d-4813ea321cdso161840f8f.1 for ; Mon, 10 Aug 2026 12:40:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390814; x=1786995614; 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=EuP0o+o2y3kz5Ka/bLCibsf9qoUzv8ZsKgTXDkaX/fc=; b=b7Izp6HY2zEoxar/NlfwIJ2QDThBiaUm5tdPoivtEJ68Hoi20iXboJPvetbgNY8VUT VmltFvdkKK5ttnheaYvJDT+/LJGw2scmOwUja+Q1gCLd3qRQYI8lOn0OQ40d/J51V10B 5q1N1IcYph6+M1G6VOUXkv9op3NYJP1YEEK/P/FMlNfAYKjugIaxiyVMMNy2TfD63Dod tRD5RLIacaxoUNWckw6Xv+gqeZcUaev1YBHB0jSLCKfjYm/3ZA14EE+nbr4jIrvRnm6W Klyj8wyzgEoFXyFHP4JT+lwx4jdcNjCPGeln3SdRwqVkI59NN1v63d+84GRJWpmmO4Ou ECtQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390814; x=1786995614; 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=EuP0o+o2y3kz5Ka/bLCibsf9qoUzv8ZsKgTXDkaX/fc=; b=Vye3Trt00ELdgmrsLJbFLm7GkC3KtjNlpvlw1aFtyqkQix3zyLkv3iqDtuN4aOKX0D WiIb6cfw270maHLkEBWDbC5NsibKJNrwd8UKfBuEPIwbw0AL8sh2vwUFy3gh5m4k/AhQ WAINCzErZ/L/g3cSqZoMu2AmM2vakKb6NVD8RAyMb8EaY+oFN6Gtcgn7uSz2kctnrcTm 8timds2E5HGX/IzXrTM/P/MflNMmwhi6mSA6MCfm0WOcNqYUowa7d3Vk8V8f5qa/SSJB 8dVJOlsRf3VVX/QLIjEpyUA0rWWW8dguwdUDXr+A7L3WKPefjjUNmFKUU6xsDoR/6Wlt xi1w== X-Forwarded-Encrypted: i=1; AHgh+RpW9S5dF3ej04Ak2qnZETZRd1ng2Wb26EPv6y8nY0/0wyiwshXkn0lHN6rrftXf7g+CMOK2HdCpnEJoCpw=@vger.kernel.org X-Gm-Message-State: AOJu0YwluNHccdxYIINE409proLSrxYxbKURKGPLNQZU8OeoivPs4qoo jnOv9ipbLuCMQi86CxxkLbAIP0ofnQJtbP83F9LyCXq7pRdOaZ3t+ak7 X-Gm-Gg: AR+sD100XLFbMDivWgXCF95trxg/LC6zFP/9T5EHmS7HTnyFwFGdMULWdJ++nsk9+zc 5TNc5S1FJN7jUY/EyY6JuwIvHovMvkdbTRi+diHt0yYC40X1CucLPB8EGGlfeJ2ALG1uPPTsswa O9OxwXYbmC3t8naotekQhlorNLnOf+GnrIWPupl8fFDZueSyvfiYIGsJaIZEQz3oUniR4HhyLUw Tv4efGSWY1McF939R713diyopYMBwZHRq/CtNgpb3dXLlM14lJi0XskPxQmM2mom0S+Mr20TNgk 93QBL61VqQeE8vbud9+R6u2WtG6yapLprejoBSm0IIVS2hHtHq8NRI65Y+dCB4FE07AunQ+dkX5 16NNq+4FG1pg7acTDMhWDBOgZTpeBxFC7hqnX/PrYbLdbLkk+it2KbUAdkNgMXijNlq2PW9leGU gozT9JRTTPA3ufCPIX6gX0c92FdjzubOb0NeqBDgZ/jfbPgaQzYY38heK2jdVJ+2M= X-Received: by 2002:a05:600c:4652:b0:495:648c:a1 with SMTP id 5b1f17b1804b1-49974600c74mr6786225e9.3.1786390813895; Mon, 10 Aug 2026 12:40:13 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:13 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 8/9] rtc: abx80x: create abx80x_i2c_probe() Date: Mon, 10 Aug 2026 21:38:25 +0200 Message-ID: <20260810193826.210683-9-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 | 171 ++++++++++++++++++++++++--------------- 1 file changed, 105 insertions(+), 66 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index ab88af43b4fa..08b22c067699 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -781,73 +781,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 @@ -857,14 +822,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 @@ -879,7 +844,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 @@ -887,7 +852,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 /* @@ -899,7 +864,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; } @@ -911,26 +876,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)); @@ -938,7 +901,7 @@ static int abx80x_probe(struct i2c_client *client) return err; =20 if (abx80x_caps[part].has_wdog) { - err =3D abx80x_setup_watchdog(&client->dev); + err =3D abx80x_setup_watchdog(dev); if (err) return err; } @@ -952,26 +915,26 @@ 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 err =3D regmap_update_bits(regmap, ABX8XX_REG_OSC, ABX8XX_OSC_ACIE | ABX8XX_OSC_OFIE, 0); if (err < 0) { - dev_err(&client->dev, "Unable to update Oscillator Control register\n"); + dev_err(dev, "Unable to update Oscillator Control register\n"); return -EIO; } =20 if (priv->irq > 0) { - dev_info(&client->dev, "IRQ %d supplied\n", priv->irq); - err =3D devm_request_threaded_irq(&client->dev, priv->irq, NULL, + dev_info(dev, "IRQ %d supplied\n", priv->irq); + err =3D devm_request_threaded_irq(dev, priv->irq, NULL, abx80x_handle_irq, IRQF_SHARED | IRQF_ONESHOT, "abx8xx", - &client->dev); + dev); if (err) { - dev_err(&client->dev, "unable to request IRQ, alarms disabled\n"); + dev_err(dev, "unable to request IRQ, alarms disabled\n"); priv->irq =3D 0; } } @@ -980,14 +943,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 { { @@ -1035,16 +1023,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 Tue Sep 29 07:39:18 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 46D1D41737F for ; Mon, 10 Aug 2026 19:40:18 +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=1786390827; cv=none; b=Jl/fqxaO/I34I6yMGGq9Juigg9CqShCCyRmTCEDO9Pz9RXLjLSNf1cYOLv0h7G05Zv/2gx5RhuvDlG0/lkzbJKuQFeiD+oj7Zg0cMCp8Df7t8uUP5Pn2PO3G7CCiiHJKU65De5etr/kDxOmzlhf/vZDxxu8QsKPnenJD11TyfTA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786390827; c=relaxed/simple; bh=L/Xi+O03EBynElRL7L0vL8qcfN7hIjPo8s3prz4BfVc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ECGvaCQoW9Swevnja1BhiuETP/gGCameyq+LAgU/A34ZMPl1WDvUssnbF1WbFfhPxZ2QeZ4Sx3nGLOq7pzccw1vS+Y6/zo2jh7ajWP4KfwoAT4IAo+gGK0hiyWA4vsg2vW2mJ04FdJu1k9CQL7ImHw7cV+N/y00BmqZPXxJQ4Wc= 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=sh2BVM3M; 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="sh2BVM3M" Received: by mail-wr1-f52.google.com with SMTP id ffacd0b85a97d-47f703a9d05so1685509f8f.0 for ; Mon, 10 Aug 2026 12:40:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786390815; x=1786995615; 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=yR/4hjRVD3BKmEkJnBlwxN5TsqF/X+OQ8T6Cq6656R0=; b=sh2BVM3MbZ1TpQenwhNDkrzOa//eZtU1WZ3d7nCrM5624be2/XsGn18J/Z3ddz4ewS krMJ63rASnjP23p8K3zCdYPwfl2yllg16OdnFv4ikckH5UDG/MuG8LC8pJWK7AqRXbS8 4NKVCLk+O/Zf39WvP5lp7f9RAJk6KMzwq7G13fRVaoazVi/LhCSX06tSq4+dBYCMcOTi o/aoQRMVHWPgQBZhqlVR//W9eK/zpcBx3TNF29U+1jQGuQ8/Bjkc4b5qnWp7k/FM+56+ lunxS0jjOMxZek6mmK0AB9UIvgfq2bf4FQER3PbKJwJ8T3FM6lta0pHcIF4io7p6hSXt bvSQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786390815; x=1786995615; 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=yR/4hjRVD3BKmEkJnBlwxN5TsqF/X+OQ8T6Cq6656R0=; b=EUEnxG16lwn0LfXlAumCdiZknvOcTaGU+d0PN0NNfQ3v19A5V/EV2bMeVAe6ff0l05 IZPExAgqRm/+7+1iWIY7YieWw6a17jX2jkdW2oicbp38DAl/plrtNFe2u+E3sjBCTEEc 5b9Y/2gMy3x+k5Vl2PQoTpxSOANR1xsNV3dK5rkC+BZLB0icc0TZ8zHKq8XtSQnIAiIy 5p9kr7unfMzMdTrRMyPO82y4panyAd1xDU0AUk+35+2A+DDEbjsz4y0EKOZ6rkuwaion nroZeremHz8fZ6gJkbq/Z4GP+S9cuJfKLlO3YEdIwyowxKWpUuIgKbLfM7oD0Ih8HJVD DM8g== X-Forwarded-Encrypted: i=1; AHgh+Rr/38rBIar/8axlbloTYolOhGUWc6Y7N99l3QjSGUIhz4x0s7F4ENMSDyayG8wSq50Dh04+dGY1PpaX23s=@vger.kernel.org X-Gm-Message-State: AOJu0YzzU302pI/H8ScK60FzRcXefl0FlreCoMJEKp26tpLO4hTN2Dgu SdUQ1YfdzyAQa18itDvagE8GC2gaAy5uQUx3vyNwLf88laC7R43CarNJ X-Gm-Gg: AR+sD12+qtq5uac016mzEnJPbEZ3x57gl+KFmwbRuI+l1U85x4s283cH75JdLa++ZN3 yXxUxqyy6Flz71fZw2LjA9I2TraGk6TLJjcIfnZ0EnIQ1FxnoNoSlHeipusLozu7YDRnruC2Mm0 rJWOFHozPc0wBiHLQvlNSHJMe2zMBR9ngAdKotnuvmtbzfLTZvPoXYnupZ0nitqCNKWk+7EfOzn AGSvtC1eFR9qSxWwSxesaDY662oW9rq3OaIOHxyW9PCn8ohBxoQ2SHINlwjcXe6BEQ9i/ugAoQG EZoIHkoBy72Ed17nQdV1kvhlszCpMy/l8ZYZUsuqfnCj/O1Fq0JpVjBXqrPP/J1CZqp5tBTw7I1 yiKeMs/lmYcej9Iz67EOZ4zG7+QGAtON6/UrMeddsGG0Wv5/hxdYCLQyHZ3acb+urlJ5OpgxZla EF3wRc7BH3TXT8dpxyZs0Jtgs5fRi3tI1wBJEFMVleZFrjBc2IgZ9ymMPK4BybsNg= X-Received: by 2002:a05:6000:611:b0:47f:756f:9a8f with SMTP id ffacd0b85a97d-480026edbbcmr34391910f8f.26.1786390815397; Mon, 10 Aug 2026 12:40:15 -0700 (PDT) Received: from antoniarch ([78.213.94.207]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-480021506cbsm39291689f8f.14.2026.08.10.12.40.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Aug 2026 12:40:15 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v4 9/9] rtc: abx80x: add support for ABX81X Date: Mon, 10 Aug 2026 21:38:26 +0200 Message-ID: <20260810193826.210683-10-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260810193826.210683-1-apokusinski01@gmail.com> References: <20260810193826.210683-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 08b22c067699..7145de876b50 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} }; @@ -1073,14 +1076,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