From nobody Tue Sep 29 06:47:02 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.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 3DBCA30CD82 for ; Tue, 11 Aug 2026 19:42:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477342; cv=none; b=X3d3suAOX7mN7UTFWuJaipzbOr1OYEGGZpuPkYSm0r2BSY6uraMwvEzAq1qM0yBuV6oUEBpvD7NCWGkEU4G+q49X936cffrjsaHxevSB30Y1v0ZcoEpsBVT3E6do6zBzQF31a+E1uJMPoU0NGDaYk+N2bJgINH1UvScmlHCOXq8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477342; c=relaxed/simple; bh=JzPmVao8FK9SYW6EqLoAZ+WBysafs2v13tUyYWLjmGk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=DyKygsi19PozzPrLNV7iIQcUUrRe6jcpigexm2Mr6mT09NAuEXHtwttqVBXEczJFQF77Vyl/fSHH34Sl2XOJmRCuBP54xPrR65Z7wLxPBFc4fLhnCBrN9vgk2XUPIsWV5+ySmvAUfq8rs1vNi28xUPt+5rH/VURsfWrg2+tuXws= 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=Is0cCD3K; arc=none smtp.client-ip=209.85.128.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="Is0cCD3K" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-49800c6a846so1507825e9.3 for ; Tue, 11 Aug 2026 12:42:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477338; x=1787082138; 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=Is0cCD3KN0Qf03/1UsrUSGHVjG5JaCHjTcrDdsuL/hfnD9C1GogzlROc67xGmq1Oea RIZzEl9/BJZ/Tr7TpQK9gyynRTMleZdqk6ri/TUQRx25i6TpRzY8otboyg+eA4Cw4zIx EQom2dlne9PjL/lAbDffEW0SpIggbRrDv+MJvCwaJOvlFP/N4spsPXk9TvTuRHHVh0Z/ irvWuwQjZsHEyRXaY9rpcIpNcRrmQaWvswfj7Y7c8TNCvN2U5FzvNkkqbXK822PpZJeZ HJielUP8/YvprnAoHCxMVm+BbfzxRwsdI1P9+wScTFJo6YKY9KHygd/Mkp6457OQdnRZ 8KxQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477338; x=1787082138; 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=VtGlZbqP5pHztuXjXLDO2IqHBTAegAPqHuL+nQjpVJgrtbG2izTicO5ueUM/tly7Xv J1vKpup3PMARxVHS0bG5sxFN1xku5rUMqPUumTFJUtuL058DqIJjiqWvrY10wotKDdS/ L5/SlyqIkmP0KCYJW+y+qWSUIzVcXoSKAL6Cp8QhoKQf9PMJEHroJ3Eq6qd+OZa05T9s j8WG8UYdO5n7A4Kn7WYsQoGNegICdeF2ScjODoWewObRY/b9YcGzzcDoGRhkYRxf2VN3 EjXu+fIjXXNtAhWN/XUP9xUaiCwe8rrefGvGnHRyaPumv7XQWG/r0g7xEXiu8LG96R6P 63UQ== X-Forwarded-Encrypted: i=1; AHgh+RpwPpJIdddMsrPpcBV3My6/bHy2R71pr/M0k/nOQwhq+N5wa0FaReFUmG74U7JdwYM7bc1TC67+GnoaXi4=@vger.kernel.org X-Gm-Message-State: AOJu0YxCnX1D5anBIfbAy37erjm83P2sU1DyoDQTxHc4mhmepwTURVxF tRZhwTtnwpptLcvXLyi/T4btdqIVkSTPZVdIhlehdDPq3gVpPBOPLo/Q X-Gm-Gg: AR+sD138AnU5lUbxNp1YiKUxz0JjR1S6rtMCsUS+aLsgWx3RLhU7gdURikDhCiyLRcw MesQqEZQWVCRtBeOhS0Kx62wDRbm79la/PImIuxAthybYS1vtjYJzz4ybuBX75OO5iq8Yc3500K dI6KK/17c+gbyI/wT7TdvbxlftSiFxpgRtvZj9oKnbUVsf3qtlfrEd6N6ITp68OShWbId7xOKml hipFZmzJmfqpUjZ2OPhlkTjF36Q3NOAfz34IYuzMeeD+zqyAVi0sVBtLOVl/lr7fzwrXDrh4K3x klWBVSMfM+v9kw8XC3JWa+kGV0Pf6/BtW/Xh99Rq33Ckv+XgIZ5+zOTkSRk5mcUEWlBATXdEz01 4vHZxX6SEreF+aEm604E3VNMFwF4a0XSeleBJgZOU8xrvZ+xzjR/adatKJWk5UMo310xZ4q8dep IdBEYaZ85TF3wGW6obS6wR8o0Q5EWCTlERX4wPAczRw4iJv5uM62B9EZhbpG5OIjwnEbobo85aK Hrx X-Received: by 2002:a05:600c:a45:b0:499:79c3:4b55 with SMTP id 5b1f17b1804b1-49979c34b61mr63546905e9.18.1786477338437; Tue, 11 Aug 2026 12:42:18 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:17 -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 v5 1/9] dt-bindings: rtc: abx80x: document ABX81X RTCs Date: Tue, 11 Aug 2026 21:40:26 +0200 Message-ID: <20260811194034.28937-2-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.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 D77054772AE for ; Tue, 11 Aug 2026 19:42:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477343; cv=none; b=qs2GXA77WW99ikE2+3zqcz5KqzwDIaKNvQJFMK5cAF/vxkO+xyR9dioiF2A4TfQl6PFRMhhs64noFeb5VD71dk650Z+DtDHWu5A1N75RJx9GBCxXIdm3I35Gaa/yREw2/DrqaUyQpUPnl65PI5N51+6q9efgOjyuiUEuBDrGZs4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477343; c=relaxed/simple; bh=iymtdZbAVDC4szK+VL2vsDv4Um3gp/9GnkovC0TOf7E=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HAnJxbuSxONBnhQh6Y7v2XMQ8LSnJIIbnb3q9/LcxuZsnrnQPAipk2f3hGqiVaaKOVxIFnTs2OenaCbKdAsSXfObNozyJ+kzTZ3lXPAr+FWRdaOe72JQYJ7Nt/N9tz43ViTmJOE4iDgmz/vM+jJ7niH8Hfutj9Hjo/sh29j8A3M= 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=rsu/2LTZ; arc=none smtp.client-ip=209.85.128.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="rsu/2LTZ" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-4980dc26022so1738925e9.1 for ; Tue, 11 Aug 2026 12:42:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477340; x=1787082140; 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=rsu/2LTZTEAhX//Q29JAAyuL/d9olDI3dISJO7M2kpO4uonZSqspmWPeTa8oQMf2P8 nn76FbxH6ph5p6mQYExRgWNQ6yeli/B1K7JQYo9aE3yQXqmzwugptTkPAJz3F+Q6h/j9 RuKKaMJV/pcndzbcx4HITrzLLcRIwWaftWJhsoioWPC/7CX4qkgQxhg6kimZ0jHf+LpW 13CIjZkuVbpfoPEdzgumoLs9XHDnHRh/iSR4BHFICtiNS/1ixJc0I/Iqn/2FRpU/Htc0 1NlSDDFf36CdkEiCHSermn/6v4njmioq1zdnQH4cnX0QR3TYPdqQhX3VjGY7aicIfsU9 g8Aw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477340; x=1787082140; 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=ezAjrD0A7BLM332Khe4g17WK1qnibJxGRno3fsVxyzHK2gVa208dKboJhndlJiHf7O QpJgOQJuEfosatdlKThNS/ylw+9oe7IUj9V11rkO/AyoBNoJdEDSK/N/vjNGSqj431f5 tebNWsFf5tHFrFZKSvK4MC0BhMf9Mvmb6Q1vgnaRXhURCXSiwOi0Bdi9SvsdTND+Esab NfklJXb0tP7fTG6b07ax9KlFvjDZcY+zEF1rZxsnVL5zQkT6ITusfkV+U3p2z9ONFhee nZs8/S7g711AJH5bXFpBYObvD45xkf3jGhDzjQV/rIVHwBqdvQWr4qLzODZpgWRykvR4 buEQ== X-Forwarded-Encrypted: i=1; AHgh+Rq+EG/4HMKPGqExcHA4iDlYfrj3dywuVIwK+tZk13nQQEG9jdRwym6BrOH+/HvOHp4QCwsLxai/wjpqXs4=@vger.kernel.org X-Gm-Message-State: AOJu0Yyw86GW2n5thg6j+O6w7Sa9i+tyLpjh+XjWKJwB1w9s30cTyuaq xQnJVz1ggjKTe394SiwPchL3x+w9YRoipQszvRlskyRL3qedGzwTO2oY X-Gm-Gg: AR+sD11f3apoTzEBsl/w0BcdHOr/KUPogf2mCXzi5j3b05H9l14P8to/HDNQ8WWI4Tq avvIPamcYParvwH3IVw9Tu6DBP3vUeAkUJ/EJ5YnWxcpzvP05g0pPrPWZ8nqqkL6LZncrCydDR5 Orl5G+sE9LJjIhz+9PwfkIMXqqaGUiyxWv+MHyBkI3nKe22CoV+A0A5UjbMmlx6drmvwL+MPAWo K37dMzgpB3Ux+GD9DX9iTpn+Awup/RICdUlv9Zj3M1h/g4IPi40IkHfX5tCx43W+aDGC5u4tyI3 IZvZPj+8EY+PglAC0uaQpb4Z9HAl6519k9JA0SvyjWOvzDgbVa/Vb7vwK6YgCCvzgSnH5ei7i/u MSudp2ATQGK2+BGriAd3K3N8IwRI5TY+Gew2vwHG7YDhRaKddCw2ZU+RWaPmL0tAM5fomdlERRQ +P0UnNjmqkiVqueDBMDSVdqgPaGP55FrXrzz8jnvoViqp9i+/VxuHrCtqD3mwW0UTT X-Received: by 2002:a05:600c:b85:b0:499:516b:83d5 with SMTP id 5b1f17b1804b1-4997845f3f3mr82515435e9.11.1786477339927; Tue, 11 Aug 2026 12:42:19 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:19 -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 v5 2/9] rtc: abx80x: fix error check after i2c_smbus_read in read_alarm() Date: Tue, 11 Aug 2026 21:40:27 +0200 Message-ID: <20260811194034.28937-3-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E8CF4477293 for ; Tue, 11 Aug 2026 19:42:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477346; cv=none; b=PA0Kp1MMvLBxzgqq0oBOy2mlaykI731Iz5kWJBfrKRoCjNQWpN5NKUSvrTScoMthd39bv47J9ysB/igk01nZXZABy1L/EPdGm53xAgSvg4X4PrYxGbbLwNOJRYabK4x1OwInwEOPnm0Uw0uwxU7WpBrulUjaV2jHr3+DvFmqkV4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477346; c=relaxed/simple; bh=p25ogiM2Sa8dkypvVtSH6kxWkficJn5eIY7C0S2Bxg4=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=qSh58Nkxqc/eEtedkux07wCw5bZdz4qbXNL5uiW6gj+uKKLAHXw3ZCYN6J7iXHR8dVCJAoi8zmHN0ak28LGuJqiFRchfzCLVe9k8WdKMo9mGpoLJnNEZUPBwXNqfGJ28X+VvhS8kZSGed1Ga4tw3Zm9DfqpDcQFRYBWpH000/dA= 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=pTk5fbZP; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="pTk5fbZP" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-4980dc26022so1739155e9.1 for ; Tue, 11 Aug 2026 12:42:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477342; x=1787082142; 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=pTk5fbZPsQpstlfgPL/3DlgIz1MuygqnL+Z4caDmgyugtWAVtaFkXnVMsrYDZwUfvc oHDDq5WAPp4ImqP0blIyArHffrLcSd3z30CewANGrF6HWWOx0jZNFHqFRKc6+bpeE/0X vbTZAQTytCIrHn3fe6ZhXnn6vm4BNJD71uMKoaA5x31h1O4L471TuFYDYlcfW+wb2Psb WybbzLCpbEtJL4hCQ6259vUuWFdgHzy7Y32GqLgidU/oeELi6kCfUFqVKm4PgGsWlSM1 cUCp0nJAuVfToGvGKErl0xALd67DDhGn7jBGSQ9XAHI9tEUdqucYrOiTJAst7yeOLbRP oXdQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477342; x=1787082142; 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=XwIxXs71UjmKBfpZculMg8dNIgGNIqlrJF41KjHyJ3sbYSXFxr9uI3leIbaFT+Iu4g U0pySOG/sSvdvCfTrDwhZT010iNKpOeMm+7RRqVS69/QzbU+fhw6F2bI6B4X5QcLNJPB FfQFJn4o5CEtIWquoofLZigfjoT6vJ/ecs8iFF8HJAkcIvA8u1HhxwpoFn/ccBLkHdDJ Inv9G3twSIeZXr+sVLlKlVyF5cD0JHTclGDAFyOdZ6C3SqB+Z9FJdKWuYIb1Fo+fNz2E ct473mZ01nGB+bB7wT72tcws3Y1lYG9dElv08FsXFm97AnWUOdPo5IDxjynK71JdDcde V+Lg== X-Forwarded-Encrypted: i=1; AHgh+RpZk/Ijh+f4jOKE4RULZSh1bNGh1TpSly1raG1SgVSIgOca3n9ZLkfWh2cQKt9ySx9jrZN0QfKLgCoNpro=@vger.kernel.org X-Gm-Message-State: AOJu0YzOpdP2705KDNkylWcuX6p2Tv4E/Ia/2ZLqBJxXqhBV5tYmtFIO JLi2T1HLEAJrDI5LOFif3hvL5JCqOEHb2pn32O5cv/nIagQvzd31sQrb X-Gm-Gg: AR+sD11v761JKbMbBM4+5SHK8iAl34tYbYoi3+H2mTO3VCMA47rpfP0RJ0PsNyGiDjS hhCtmnqjgDwEcY2Xwmu2lJYmvTxLihuYSFZycglwtt5yE6azFmLXFjXDHjLJY/7/N4TDAGRH85R D+eSrEF8aM+rf0+K3QPZZmXQOeHDschLLhlFosQE07iX77PfQVzj99ShIczHfFBv4xTdksniwnR FJAlz9Sroi2mACm7nnLqUmU/l6lDYHBaxz7YH/XX6RzRmVGeAdf7oiHyiXvD1Ko2Ht1FCCbWgav eVoVb6q/fom8dlAdhT+q3kuvVlbmw/O/hF+kbCq4+LOy9oGhwMUmXoXE2/wKew7aC61bZTUQLk7 jXvLKdBGOm40Am91OEzbQFz69UbGfdFtreBk9kYh1GA47T3Pu1b1zoxJd9EapW/wFia3YGxnIB7 VkdHFMqbbfSGZdgjlKFfzV1KpJB/gVklsmDl2ta3vrosFLA0QvMqbEZ8C3QWucWthqGMxlkApvb nU= X-Received: by 2002:a05:600c:154c:b0:499:79b9:e226 with SMTP id 5b1f17b1804b1-49979b9e359mr45810255e9.0.1786477341678; Tue, 11 Aug 2026 12:42:21 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.20 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:21 -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 v5 3/9] rtc: abx80x: add mutex protection for register writes Date: Tue, 11 Aug 2026 21:40:28 +0200 Message-ID: <20260811194034.28937-4-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) (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 69AF9476CCF for ; Tue, 11 Aug 2026 19:42:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477348; cv=none; b=SMZDhtDjtjrZC0hHi13nDZCgY2crUFhJ9+YizGUbcerZWd5VLxsQRT5ThZwK0M2R2/bXAssH75sfLOxfdkLdnYm3CrOmED9sQTjDe1YW9TA4DENoAlVV7BTFneUz5eSqNkhCo6eMgFWeD8o/937C/swheg5MCWDBicKBuvgzsnE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477348; c=relaxed/simple; bh=s1E975qyDx/aoC3utss4boTjVjGr6XZHFUjkKJJOiyw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=SzmPJ6aFpND7Cy3J9mEFtvzZliOenhubrBhvzTtuOAYFyaZ3385NkZ7X1G4nScBiQEKqxychNmunPaCIEn5MPuC7XN6WQs1RWHCr+krHgXyYti3jPth1zjGdSfO8xUqmLApEaQvLVF9owCKvm9+WcqHpInfa1d9SEM2TMY0ioSI= 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=Dab1Ym6E; arc=none smtp.client-ip=209.85.128.43 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="Dab1Ym6E" Received: by mail-wm1-f43.google.com with SMTP id 5b1f17b1804b1-493b966dd74so1015835e9.3 for ; Tue, 11 Aug 2026 12:42:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477343; x=1787082143; 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=Dab1Ym6E+uHZ9YI1Pxfh4O21qdAHDcDGEWKeFTPWMgiJ972sEPJ31KRlG8T885C3Di uP6RKrazVgBPY8b4xCd2Eays9PCmM63suzArUvPJxziiHqpYG+JGmTePMdX9a1SXsTDC ejop90ke3VoDUvqwcH0Nr2DFOFDSXO7JAjqt3iqzEjnW6lAG4HacdI8bP2Yl56OM3LDi 0pokgPdX9770LgqVTPmI4CkcXyXNzKFg0i8di9BjvqSMBefssqE4zQrVkE33RxDzbii+ 0mZylETU7lu+Lnu9Rwyo4+iWc5uMKFcY9Xee4lUcx0skf1u8586rCRkfqfkoTGOK7DQn /YBA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477343; x=1787082143; 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=hCiyLJOYLg/dCyCc6VGYsd90tKbiSwAQjv+r9sfhrkDrJk2rVG1pxcleMrnWbNRlWp SN57m88gWwQ92wZUUC5CIH9Qle/8P8VV9afo6JwVYzTzoXH913Ux719kKwfUtwDaZlmS K006xnslzzi5zr/Go7oua+6yCYG4r8Z5aFBP8F38WbeVxaPg00Pk1YIYYLjOAbaomyGk sOa6GL4zTWf7SD/HHmp4mVL7+upVWCQeYFHjKikKpsllXqfbzvhQQZ5WPexsz+ii+47I 5yMnta77B81PE3TTNq+QzqEvZtrEcp1D911hAZxly0mcpl1dbbOsDdqDIPm3PFn9rkbA fEyg== X-Forwarded-Encrypted: i=1; AHgh+RrdBKt9W94BQirekCsUSd7JYTXF9RE257Zjo4Lst5p2GhbYEgL4b2ucktKBxVcHGsq/atYLaMtYbWR2L30=@vger.kernel.org X-Gm-Message-State: AOJu0YxkW6tHeEBASh6gQgggfoSpUbJNqRtRrlHwbZ4BeZwHIyq1j1WY S2L8iV3rdOK7VSkgoSu107ucf3sgf26cJIF4LOxSJjM7C+BunAaWf9uj X-Gm-Gg: AR+sD13kJSG0jH5gfXwvMhPYDpVKFWvU5ZZNcb0HtebX/px1wjOiY7efU6iPBUzm2f4 0OHes20OX/mjStWsRvQYfv71d2wt42HazK846bbU20QPwzfEwSDgRftUD1lu8qL/zZB9GCZBezD fcovqMp19+ogoUqGZbFPRBnor4LWTZYMntlvkUqTnQ6WflVtZyxtwUEK8b7KopczJCqhGLcIyMY 9OVPgBxmrv+GTVerzmNq5mUZtkHMK8x6spYHUUrtb7umz2LUYLj3hmdljVe7EXK+/hFJBbX0zUz Agym0lYNMd15nKit282BqgK/MD7LRc2GiZ3Jlp4yUc9Z03gFDMxYV4rH1aEB8E5nlLTM4iYTrzv h792X7okI8/1txw8wU2U8DLgKrzLTqKZVRAJYxoI0wILATjIFk/tZG0jDzAFGovSVN7ytUR5f0D fm2Cv5lHDY6DhVWvSGzgw0jahIpvh+COliyZUOmLpZSfVAKJG2Xo96dEGqGY4Fe38y X-Received: by 2002:a05:600c:34c3:b0:490:e5c1:b8bf with SMTP id 5b1f17b1804b1-49978465fbcmr99538485e9.13.1786477343119; Tue, 11 Aug 2026 12:42:23 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:22 -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 v5 4/9] rtc: abx80x: properly handle shared IRQs Date: Tue, 11 Aug 2026 21:40:29 +0200 Message-ID: <20260811194034.28937-5-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f42.google.com (mail-wm1-f42.google.com [209.85.128.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 971F7477E2A for ; Tue, 11 Aug 2026 19:42:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477348; cv=none; b=PZRdqUzVFc7b0qGWCjqkW08z45j6x164rNwIu5xk2eaoULBK0zwi1EaJcumuaxfBa2PhbawQF5+Z18Nns63ph6HZ+WK/yjmOQJXW5FIFfUZ0KQx3fgQSql2a1aBKAgdqJ8zLeEZQh1s++px8XbNaA+sjpVuutaR1Y+VDSd8xYYQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477348; c=relaxed/simple; bh=08UtlehfK03KUSQwevWJqiUxLKsv8IURriGU2uZB4o8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GMvVY0SvQJw7QVo1Qeo4N87rZtF8bxF6yN8Nu3dJ6R2wlOMk0MZuEU4ahWqhm9vAEO5/ENmuYHTYT24++DmFPiklUOItuS9U5eDe7Sg6ODtpGfYR+cmQF2gGr61qFnyUGqs4t1VUKW++LwpjpFf3zWHtzONs5xfijf49F9/EjRk= 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=R2LsqdJm; arc=none smtp.client-ip=209.85.128.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="R2LsqdJm" Received: by mail-wm1-f42.google.com with SMTP id 5b1f17b1804b1-4995b0343c1so1381545e9.3 for ; Tue, 11 Aug 2026 12:42:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477345; x=1787082145; 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=R2LsqdJm7A3mRbohs2ZL1MNXoUpV0vcbjgt51nhhEl3892NjbwaphqXwa0n5hzbdWF FGtgQucuXW/ihEYC68nHGOJdMvlaNdWxdK0D1CMC+NyaD3Jm4ur75egCMjiItH2+oCec dq0oim69eIAW4T/1J4kesvCiniLM776jFM8meN/FAgzwrK893nMuJNVIc3GF/VOh6gtl i71dc3FbepWl/HwIyD3UOtQxYp8JJvJRItYz2Hdyt5yjntf+o7M6lZwRQumrjG7A05iG 8Mu1vKxeFd2vJQwJdPmwtOCW2MzO8v64qNjhmQcC6pr2KORTufB3VA92CD9ilq/THRs4 VR5A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477345; x=1787082145; 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=jko0YIhE/4NqeDh9ZluPD7vJlJyIZ7dpDaz9hRqxnPycGvDr719lyxfjIG9aONHCO8 0D8vOQ/Vm2qtxuMysoncsgdvGHRwrudmbPPzO74oziB79eAOg28wEKkxZVhV2i/yP26P +LDDGw7OIbitdsgZ0pM2is56xGsJz78dHc7v4A4SrG5gUh3HdF8CHmvo9QFxh1TnXEZb yRiU5HMpzAUGKcJNnO2J98WzVi6r7HNgVCIpK8odgJQfLiU6nrh0+trBdbUoiluOJZPM oNwsQluBTRHUjYAEL4568vzSf5tXAPmAOxDzlPFjlT5ClRk8MjKZstFw2GoIWPiwSOL6 yMPA== X-Forwarded-Encrypted: i=1; AHgh+RoLnHysuhd92y3mF1YUKWXEqLBgR9Z2D8L2ENtQxmSzd3MICEugF5YlicP9QbW7MtckKuDHPG41WWphKjs=@vger.kernel.org X-Gm-Message-State: AOJu0YxfOAGZ6/JjaISfEQTRvvQOGf4kpeR/Gqy3YNQWwm5m+efQOAtR kSmLAntWAZEsCsCDtLC+wC32pZ1zdKjNTbX8sQX+THeHDXmyw6aRkJ0f3t9yLw== X-Gm-Gg: AR+sD13qP84eIh7B8kVe5y47AiGw3fkxklyOINKe7MzLrIWskVldmDtBtKv85mMxRxM GG0ySV/zDOxzHARQck7hnJOMH0qXj7yZ9B8Np7GvsOHsahNo9U6Q9dHumBDcAFmvf+AI4NFhhbL YB7cMk3LFcuJWHBd41jF6DBPCviowYboVwfvks3x9ujycFfNvcm4XGhWhR9qgtXZPWZpowbUK1C 6RVSHXGB+TqP/t4LLxzDNhP71wGLU7QTHJpFqhl8myjeHWxwRnOcL5kceGPkMg47tWZw/zly0W3 7qUogsfPbsxD58dnF8SRc4LkV7VpC3CQxVyhYfpOWd3xQKJBbVv6e55xr0BuvAx8z1YrRltxhW9 Nqusyb+nFiy6nG54U/KF5FB3czPEMDInMqNtqxV6lTGNioR8g4wqmerbyLZqdtf2xP7vfo0vXgv 2JXGSSnMPglw54jD+jKp/ua0nJw3QYNHHQuySfwEMsG6DInRlPhiMJ4hslRQ/6/SvC X-Received: by 2002:a05:600c:45d5:b0:496:c1f3:e8f8 with SMTP id 5b1f17b1804b1-49978441d3dmr86339245e9.7.1786477344536; Tue, 11 Aug 2026 12:42:24 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:24 -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 v5 5/9] rtc: abx80x: add irq to struct abx80x_priv Date: Tue, 11 Aug 2026 21:40:30 +0200 Message-ID: <20260811194034.28937-6-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f46.google.com (mail-wm1-f46.google.com [209.85.128.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 75D374779B2 for ; Tue, 11 Aug 2026 19:42:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.46 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477351; cv=none; b=X9Zgr14a37PESiRl+8sRkRA7sIzF0PvSAU1zgTchQC+sUjQ+I8lO++EgKsgNXLM/mSFQPxkLig51Lgc/Ex+u6gae9Cd2ietG8HA6skZnJhdNP91OQWGIFiUy7guLPjz9DfSiFa4KhDkzpd86yv4t2zLhRa0a06GYR0LBFTxG78E= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477351; c=relaxed/simple; bh=4U5s2L+JK6pt5bn+oqBO8mnGY3oOxGJXMUlIyoAUykY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=GD8pcNvLOwj28CgJSqfvSzzCGc0El6Z/PHtwqDw8zxxcGh8ep8OVbbtcTg0g5Lf+BYKx27jFM5vNT2+IH3NtHaiIfrH6M71P+H+jNB+8FI6Wuw2WbT/DlSROukIrqT6RmS9+5MKt3gnjoHJpQ5RDEAnHoskmZoJAffl6zOXgjrE= 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=boLextlq; arc=none smtp.client-ip=209.85.128.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="boLextlq" Received: by mail-wm1-f46.google.com with SMTP id 5b1f17b1804b1-4954f5e8020so778765e9.2 for ; Tue, 11 Aug 2026 12:42:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477346; x=1787082146; 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=boLextlq0nVN1QPGUAvUhAelOHlFSgUr+5e2dxG+C8vi50PL7X762yWey9vmRGC+kU 675smwpNtXB9OsEKhJ4S9LLGPvif8GQLMgoeyoDZazIO2qa7MBcGp7dM7F5dF9FewPCA yjNCXaDDlHUd7H/zoG0UGEcF7biNaQ3vgUgPg8kIl6L+pu6MBfX4nBWebYEvjze0qBH9 K4Sb8+xc2/7a8h4vYi3nzaNGnRE8lGfYhsqQbOGnGs1oFua24/KuQ0UNJW68Xj9Sk3Sb fbTqGLWN/EmAtGKudULGHmk2WcVxTyCSa1ScLmmTqeS8bqPNUjs02hEz4Wu7SO1de1MW g/Fw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477346; x=1787082146; 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=UVhAvk9N0yLjEnC2M+XrR29BoDGhgk9BbemU2B/fNlhUKMcW/a9OHUPwessGvxGg7s uEI6TsBHZ5sbLhl9wWGXT8gA+gGN+IRi19yoo/z3Wk3X2clZ2WR0RYdTC5qPe+Ad3C0w Wgjxr9SZNByy5qVH4WMysxaeujfFVSfqy850ApaGIe0UxpQGMEibW0MgwStDO25qOywk g08scN79bdYlIhHM5f5Wnkm537YU+Mxu8i3zKoWV1Yme/QxdMWFMVjxXZXRDvqcTKwSY VaK3vQWQD7oowd4/u5IHhAc7J1gUSXPnEmF0irpgnZafg/IJfvtRrTgAudzXuKGaDK/G uXOw== X-Forwarded-Encrypted: i=1; AHgh+RrHmFeJM6Cmg3Ej7asO8TRQGOZX/63s88y7T+M2LnZBmFtHDYAhezvo5o2M9VUQcAh4TdbHbcMECLqFtKM=@vger.kernel.org X-Gm-Message-State: AOJu0YwRVbD4IyTD2xGN58y/6jARX+8Q1y5NDyQeWP8aQTycz+yq73X1 WjL5NILzE+aZvEF9QVv4Gv8HcueZUCCltn5BZYY8nJGnJ3iJny9x2gHK X-Gm-Gg: AR+sD12Q2zq1JYOspf06PBL0eRBfPRx83Ays9/1IqcJeaLHdlaUzW5MJKSGcJLuGYl+ EPlb8vdO5s//IQwGy0qgpWEb9RDaV7KLHsdWla2oQ0yYOMIyOUa+NZY/lsVkit+UVesOUjmZOqs rTI9l/5nDRxdHOQF6cf0vlLBiIsFGMt/O9wWcUHOVsYt1rgdjy1xsM2i6g1Ev6D2rBSYsXpBnXr uEdQTFU8JK+LvI3/FdvyBEpLgy8CoSo3zYpH8SrHPonINUpDQw5A33iOj/QFeXiiET+eNwaGO1b R99AxobmIg8YopGi8BcoAZ+ifrZyp4PouSRxnxhbB+TEjhhjWNb1kWwEczwWCq2RXnxCMVIFb/O JXRtWmozVK9nu00MAy+uXXlSKAkl5Y8tO2PX7AeS2g2EJtEY8Y3GZBF/dyRltb57+5FXhy+4PB5 pQ11wm6L3S666kCArDcRkwwX3PfImje9g+I+8llk30R/GyZKUkt2hcgAwojLgp2yCi X-Received: by 2002:a05:600c:1990:b0:499:78b3:7b34 with SMTP id 5b1f17b1804b1-49978b37c3amr68570495e9.2.1786477346310; Tue, 11 Aug 2026 12:42:26 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:25 -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 v5 6/9] rtc: abx80x: use regmap instead of I2C specific API Date: Tue, 11 Aug 2026 21:40:31 +0200 Message-ID: <20260811194034.28937-7-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 970794772B8 for ; Tue, 11 Aug 2026 19:42:29 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477352; cv=none; b=Wh6kPXXNdQ6+eJuU5jC7CcGT9e7FDxP+NZ5OXt8eWOtjhmIP6ilntq9DMk5GI9NEqa2M35tgX2ihlrltQOQ7IQmnyKBdKZ4H4drFX308EZvyvjqOPei3r5d1kDYlZr40jYuOFYHXyc87AbhJ2pPSwfwR+T27t/4DVws+H8sUPI4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477352; c=relaxed/simple; bh=7zftsifT1TeOCwtPU5cqKvqhs764DJUWLd8kYg26RIk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IAPvVQli7hlRM6bmot38hd9yI2nkpM60e0QLGrj5eiiA6YfaLhpTwEdz/ms2oKB7nYiuVjzRSGqa4SfnG5oJG4TNifRYV3fzRtkraGJvuINrUBbbPQdD9MekcGAXsdswm4HsyAD8ahbsCzL/sXcHzy2kieKcNTiw5dcoZ8KkFAI= 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=C4mnptJc; arc=none smtp.client-ip=209.85.128.47 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="C4mnptJc" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-4980dc26022so1740165e9.1 for ; Tue, 11 Aug 2026 12:42:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477348; x=1787082148; 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=C4mnptJct4IlgE3gUwy91DHCBPT31w/3u8NPEEFdtPHa8c46azdtMdMYjkQYptmQtL /2ocncWYkPewsg26XtDdX4v4fXJCXcWOCLzcB3rOY1+cEdC+jsZg7T/Rgr8vREGjEQgn Idchy5xOVdquyJATS1/M25efpfG+Ar8vG7uc5GxbGZRQVCA53knfu9nGoi3XB6MbLqfk PVjxC/NVJFyUZEpKnX7xF59o5psoJGp90pu/UVOTyidvkMSfO3OP++A4lk9yJy9oi0ay hufrXThK/One3Uu3GJkOEh33qWLYV/Ke2VYmLL4KAqKsqMDuxYoEMRgc/6ZJE8gheH1T DdgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477348; x=1787082148; 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=K/df/uTGHW5VaMBBjFbtLomIJSiPHUFT5b+a8X4xofxEqi1zNknhWytrJZZBb94qA5 bd2LrtzrNEp1WM5iMesTPSH0FfGA8RIQD/e3oBnPo8k5CfyLHPrMlvL52GqqIGfF1gAG QFIdazVfB5P1csuXnlS/y2ra4YbTE9m64TwcBIeF1BvfPgwmEFVjIQip/rMVEbzfhaMN xT2nYNfQlk/KE8uOcl5MmGpjwbn4Ys1HwS1A/jQOjKaJSXVfGrNEdiIju9CJZnpteZS5 j845KtVWHtkqB2svUKjQMrFwe0IXBv5gPN2TyozUAs7RIdENaOlNUq0wvvaOGiI7Dyz2 SimA== X-Forwarded-Encrypted: i=1; AHgh+Rp1EaMpc54wyVynOiODOIrFg+IAvK5OY0xfjAuxrYCeqlr8CoFsDkxficuMd+YT27b2T7W9L+3fZ5oLPPQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyZq7ncL3W4EuWKsSoRu5vBoKJQQ5NFGt3XgL2Dca6bSJ/036An VeGFOBRkuCNX6x/w2PZR+nv+N966Qe8UZsF6P1fCfZIQuFvsmbyOG20W X-Gm-Gg: AR+sD12gBSWHw+JyOZWo9YrphL2lPZjdxPEVcB5uZBiGyUJd34nKL9hboOnS9uqnB4B Tn3VRWGWNqHfq7Pxdhn1lkUudOAjrDGMNRKfzJx2NveQxzPwR9bny5DBDbU1z0FkRNNhvxjsUpT PnvikJ07fnL93kjBJdUxReMrfz2IA68XopUeQBzqMnyI9KTUCqJThMfd6N8hD+Bs5Dns5rpCbQQ tBTFjf5fvhmYBlS1ZP+1ZgpU7DDRIDw44LIZmmHuLEeWP5ME3Kr2+EGATS34OwGVrM5vIwPBtOd 4nUw//Rlp8OT9zPBo0Ludhh9HEep2/SgHV3+JQ+H/3va/hOmsxZmY7oXJsafXcjXYhRLgs61Ojf mcll+aJD3kmYO/FC5p1+uPwLQeupGQRi1j1zcUcdZz0cOJmRDEuc0jimPI/Q22sjUP8LgZVLDug alQILrcH2K2f0CpbF8L1e0XpsLO8CFFTrr1ax0ut8pPDsi8LIk4OVt0QLyMADgNIF0 X-Received: by 2002:a05:600c:1d02:b0:496:b3a0:1cfe with SMTP id 5b1f17b1804b1-4997845f3femr88998265e9.12.1786477347680; Tue, 11 Aug 2026 12:42:27 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.26 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:27 -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 v5 7/9] rtc: abx80x: replace read-modify-write pattern with regmap helpers Date: Tue, 11 Aug 2026 21:40:32 +0200 Message-ID: <20260811194034.28937-8-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 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 68F1F47A881 for ; Tue, 11 Aug 2026 19:42:31 +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=1786477354; cv=none; b=emye2kRjtnqAcHzc8zi679YtNA0IuboFUUzRHhMdpNIvrJaGTtyLU5FA/RfrOWqSvYqmH1SPQ61YiphL3ccum7sdn+TZGssYUjhbet791E50rVlxvLQyAtL43tu81Oe966fgiuRXAxCghB/1rSPYsy3YtEyE/gG6DGJD/hDxo74= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477354; c=relaxed/simple; bh=SG9a3O8kgbbhIUPGdJffq+qyBcl8R53EBTAnTVe65o8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oHgfuhAv1abrv/D7BnHPn+BJAPgqBU/noSRTrarAD0j+fBAU6vvqCuYv3ObDOSZVUhlLjoLqXZVP4Mwb71pY+mCW+c5lcAdH5WLNsHDMlJlilO1bFCpRU9uiVthMWZXwHcOgU7pPyF/CJ66/SnlRZ8qBAg/mXZcydy5bdM3LmVU= 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=p35gEs2w; 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="p35gEs2w" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-496bb7cdf51so982535e9.2 for ; Tue, 11 Aug 2026 12:42:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477349; x=1787082149; 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=p35gEs2wyuQJXuU2Ne/Fuxy0Vk5juwvlHtd+pR4mZbKEieny65r0824XP/17D8SygS HsnwVjlvqmgMLELiYh91WVmOoCvgX3xR0BVWZALq+rhv463Sl1vBLUPJCy9I4XLriukj aAu8ULMg4i7mibdoz1x0rqtO2xExC8XrMriDrdafQMh2J+qNFCIX8J+HaEI51oWeSlwX u/r3CncsT3VSwY74xWTo5D27uZhEtjELPnbbx7j3YYpaoQl6a7U4IoH0sjCvk3Och/EW 6dl+yYdZHEEU22rSDYZ0pMZHRjzVqMN3KFak8q6SO0skDZMZRguQt+j9nMCsYxuztob3 r4Ew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477349; x=1787082149; 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=REDbRcWHUf1ohBqRUQQEjpZRuAD4Vmnx+jaweOAr8/DW44stUeLjdd2uzIthYH+/d4 e4qvOYLStHrMaCErxCcyy3uSMMYJNoHTflwi8wOu0NJy0JGoyuVZz1s3Smly/jrgiU0u QgP5JAqM+1MmDwtXTqm4pC6w4mVe5mNzGSWCzRM16O+lshjnvd7Q6nmYrw4Dn5Jb+2ih TOVRRuk1td0IPY99eMGdT3qBYfuPu6pWSPJ+7BQTS9SprcW/QSeMBpODrbCeg+r023RK zrbxgkNrvGjCfUDJjPbhWEEQlzuA8oCkMmLhtPUcG7TviLsI2CymG7Ze3nhf5VyhYQun Ojiw== X-Forwarded-Encrypted: i=1; AHgh+Rr89lEZ7qL/xlMaLjArfi73vQR/o8+3C7tCEux6jEHAD7xLy7Y/DCc8dFmuRbjjZq6hmJ80sTHJ3WLs5hU=@vger.kernel.org X-Gm-Message-State: AOJu0Ywza8wVlq9WcCSKJC+II/nE+r6E+lDRBGQIsdWZpUwjw6e3a177 n46DMgPz30+jQ+MTmDj2rnDPXOLEmYVS7IhKz9RM27fYsZ1gTOW7iba8 X-Gm-Gg: AR+sD12ZZPJxwsAsuRxiJg/IIIJpOSmhTdSPX5ujTbIeKF4ZFKXMkrkcsZ45eogja2R lrdKNAgEG5LCONc6qMv+Mbop7X/fpN76bCfmRoqzeqYs31GtJ1aDBqbutH6youAbMGv0gTLLWQR Tkibbihu8Wsq237FAZwC5pMH2p/nFsOlRyHy6gytmU8qDTaISPSVfR7B3xRSvBZYE1aO62yM2dn w6X+b3ngZOKgnMTF+c+DFTdhkEs8STtHl/+hr5SSRiW1CpCI8aenRwoip8ZwOGUwrcCAvwCNj0C gD0VKhOQEQcLkIwYmnSCeqW9pp/yzXMJRsjYsjltQbN6ah7bM5dqBqLcy2BbN5gA9FS3Dwy2JZ9 u03/uwbjPnq7UYXkct1Fjaw8TZEtNwTO7baG2lEmH7o5f8S7UMzjPqpsnJ6xF7NhRxA0Vmn28Xp DIggmSWu/0GbMbtWbqiNPLR7FO3ksdAhFawQP6jLe8O1C85753DucE1ygNhY7ggqsp X-Received: by 2002:a05:600c:4e08:b0:493:f140:c3fb with SMTP id 5b1f17b1804b1-4997ac78e71mr22044615e9.7.1786477349246; Tue, 11 Aug 2026 12:42:29 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.27 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:28 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v5 8/9] rtc: abx80x: create abx80x_i2c_probe() Date: Tue, 11 Aug 2026 21:40:33 +0200 Message-ID: <20260811194034.28937-9-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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 06:47:02 2026 Received: from mail-wm1-f48.google.com (mail-wm1-f48.google.com [209.85.128.48]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1D4F47ACD3 for ; Tue, 11 Aug 2026 19:42:32 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.48 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477354; cv=none; b=X4O5LgC4x09fSfwZInHR5yv9QwjHPqeM5GgQdked6UJxDKJ1GVuP4xZa32ah5rQNNbsxa2oSrzFmRbFT98Dvjoc889LnwvHpskXYFhNmMneilhk9kvZwVVNFs5lL2dh5QhD5cRsSBjOHHIjHH340wiKWo/ft62oX7O1c5nLLFqU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1786477354; c=relaxed/simple; bh=L/Xi+O03EBynElRL7L0vL8qcfN7hIjPo8s3prz4BfVc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=CHvur3Fho3IZtVi0FyifR1bEuoJ6rXWBoqp48mRRiJvVPb8997cU+YSj/RkfDyiZonZ35DehNTHZuw/3YPuce4RP8rDxVWkAZUh6UPGt5kAWDesR6qu1qmv0zRcWTIdRHLZtDPzM4lyIPpGTEo4u9A+LJR0xkgaNV7rqHF+jOws= 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=L60GtcNg; arc=none smtp.client-ip=209.85.128.48 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="L60GtcNg" Received: by mail-wm1-f48.google.com with SMTP id 5b1f17b1804b1-496b7622a83so1147865e9.2 for ; Tue, 11 Aug 2026 12:42:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1786477351; x=1787082151; 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=L60GtcNgZUmTWJ+0RL3+vwsaBH7mBvzq5mS5YyRC3jXXpsh7eQ0CkPdBJxrRW4BKMD uUQBxdqHzCPdTJCsJ8fBkPkDwyQvTUiBYJFPY2aNT2kx+saj3GOxGVTU/Y9QHkohEaEY nArO5kitsvPpEdZgdAGyP2SmmNBIgfj1YAzuyV4XGWVm1DkJmN6Uou3hqHpSfK97NX5j JU5ZoVMlmZs4If943Fw/H111nLro9sI09OVEdMiYdyL+KlyzjwyuqpB1SRtR/cbZRhu4 aiabdtYiARRqB6VvQFRNzyqRKmTxJbpJe18rtpq5k/9cBrOgIxfQMf45aGiiW/YX7i0I 4P/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1786477351; x=1787082151; 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=MRbVsik7CssKek7ogsWtmfpaY8PGRN0QV1wovLaG1pqgD/eIjXyKqMYwjvJW9YQ4OX 9j5z49WAgjVdkJXy0uZfYuUkB9WXNABxrdZVM4IgkysKbdt57z1NHKsky/S7QglYi3hn IArsTW/n3j5yd/vL7yrw5wgNSTGjCyg+w/od9KDjFYAKv5KtgfKWBxk+BhYD4PA5ioDi mo1VrDIQHKNRipcR6k/j7cji7VEKO4f7yq2i5hi/oabR6hkGJnJSQsM3NvUZZhrc/5Qy LsdGnnBp8hanUrA8LQNqMHp5D9YG5tyzHfcYuH7l+QkPOKkVHeDx5u922reTUovveyeM SQlg== X-Forwarded-Encrypted: i=1; AHgh+RpcKkhvxk7sUB/e57GsiTFPakC8ck7/iMByP4Gzvu0cvKdfeq1l7B5/xo6O2M6RdW5eqxbDvbg4hMfuVxs=@vger.kernel.org X-Gm-Message-State: AOJu0YxPOi9fHpuk/hDna2JGmqLg9lzqDkqfHcZPbtqCAqI/TgjObU9T CTXfFO8ngmwSyFRrhdJF6UnwVq8xoQYrGbzGvZlvbXfRhFcO/1qwr43N X-Gm-Gg: AR+sD11YvxdnkPTjnMltzXOPJ79ElcGvajGwCNrc53NmyZUYFX0pG3iuBV9TqVzr8op Lwh5mUvaBUeTuFd7Mt+gaa2dFu/1o6r1Z6FJeRUQeJozUPtKFmbp+TSyn1iiDULbi94ximBwkoi UelaEkWiv2Cxv9e7SGV5GmNk/qSovZ1YRmPrrsga5KKZc/jjveXQ00vHJGn8e0gkn9/HULaE9QP h7ILPR55usTRtREg7dbTo/SQISvY1Jzk2PL3HPtXnlvsAbtfZWRpw+/FLBQAm5uzcAs/wtMOyzm 6aSd1Fk32BF2aEXUYW/tcpiwFvchxVaE/plAjAfZzh++ugAl5Fmddz5gLronsgnTn5ho9EOHLGn 8ztaEoDAOHC59VW+JCSCczZ3KgB+NDBa/Yd4YIr4fQ9ABPCeqaBjBq1/2riRVaY+EhCF3ku6SZM s4u05sO8U2aWDb5UJvfPOjHjyj2uuMNnRxX9iUDK68C7d9xCNnkBSsxjniXNCsCZNq X-Received: by 2002:a05:600c:6989:b0:499:726a:a017 with SMTP id 5b1f17b1804b1-4997842da5cmr91637965e9.1.1786477350688; Tue, 11 Aug 2026 12:42:30 -0700 (PDT) Received: from antoniarch ([78.213.143.159]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4997b22784fsm2606535e9.2.2026.08.11.12.42.29 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 11 Aug 2026 12:42:30 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v5 9/9] rtc: abx80x: add support for ABX81X Date: Tue, 11 Aug 2026 21:40:34 +0200 Message-ID: <20260811194034.28937-10-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260811194034.28937-1-apokusinski01@gmail.com> References: <20260811194034.28937-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