From mboxrd@z Thu Jan 1 00:00:00 1970 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 991DB322C6D for ; Sat, 25 Jul 2026 14:59:09 +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=1784991551; cv=none; b=Ss5QzLxiP++3sLGzfvjc1Iwis34cmfLcgmygQeRJIHR3u23nS4AsKAdaVu5dLy5r9P9iP5N+kttHb7aMh0nV1WUtfatfrLahcyMs6o8dyOoUeIpXYAJtFdfjS7iW5eOh5yW7rAgwKyp8/4DojXguOhiVjYtNxlCMFIef498xjf8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1784991551; c=relaxed/simple; bh=w5CQrNCZnrp3dSuNUzlBM7jBx864CO/t546WkH6uajs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=gatyOeAcq1BIQ+83N0yXadEsf1Xd9a+IjGFQgIQyYG2JNnb9rO801aHjSkF3SkCww6koe6sYXbLkDk9G0GsPmETMvylrOxwzKDVmweNmhw+OX3+QnfJ1BuDqtnao90qPFoOzTjGHu2ttLfxtybRmsimOVwZTI01QwBTt8nwI0jU= 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=bMsxFAvb; 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="bMsxFAvb" Received: by mail-wm1-f54.google.com with SMTP id 5b1f17b1804b1-495590dde14so14469635e9.0 for ; Sat, 25 Jul 2026 07:59:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1784991548; x=1785596348; 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=e/S5DERPwOhhH1Gh2e1lZrjit9rjhnVf9y1ueu83VQM=; b=bMsxFAvbuO09MRn7oe+V//mJNf6H9fGQrEVpZvi+8MYVmSpcbPlEXKCNNqN1/s1aw9 D/8V+w65c+9EjSRNzAe3TZR5UengAOpB5T6pfn9BWjoH28q2mQ8jTbHBZPdQxqK6LdSK 6Ucm4wjaZaHfCMN7YN1GNYByI+d60jD8Z9doQRUiKljtyt88EoGKIpH0dIW8HBfgnhib lEDbLEIpojW8iiX5WMn6frsefZwv3uOOC99SkBjEzxH7kZqi1PVErrpXfJbKi2l4thln sUNbwh+dBvDWJEUlN7wCg16kVCYjB8/cc/zwiwYe1sxILqJkQM61ULh11ihgp/zF/bwl 5jsw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1784991548; x=1785596348; 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=e/S5DERPwOhhH1Gh2e1lZrjit9rjhnVf9y1ueu83VQM=; b=QOYp94Yg8r6aisIWwZwH42ifDLPK5aRFa+Rv+wOTNIp1hMnfCQXJ/FBPkpVsSMfcvI uXxNKyDGonCfGDX27xABbHihYtP7oyGVkyypOBFhJQChV+l1Dc0kR+NUCZKHtpF7LLAn qTYBJGNEujhv/XJm4LuC57fxRO806Zi7A18NN7fkznbOCDopJx2N2tDxjE42zoZpqn1x dzF9iNwQjN7UJKVlQ7MNkvb59x3YfHdwezpZS9zmLyeFTs7JnaOKKHy/dXKL+LQjK2kW li8oEfJqHb8F2Bk55z5NNQ6D1HZSHyPZIqKuSHB9qnERAlZ0Ch1uOTb9SlMYyLQlJIin oDXg== X-Forwarded-Encrypted: i=1; AHgh+RofCqxZ8XlqMUDxMmwxcpxbJNdO07FqBoUy1JNu273/ERn9bAdSAdp+nDr2WPKZt3g7K7wQURTr7K4=@vger.kernel.org X-Gm-Message-State: AOJu0YyrhoX6d2p3WJSuvBuYoqpifWwVq81vG3/nPtv3us57hu46/L9o ZyTx//tebOq069mhRtv+ChVuv2+uCTfTe10ohWf1+V40MVGP3Ej/Xxty X-Gm-Gg: AR+sD11rctmy14iUcdPrASzQiN+vUDOoMKpJGbejoKbbSCguH0HOs7IicaUraVpY+Fg 08L9ZtfA91s5ps3qzbJ46d5lYxQQR+v0/lwKyM1HUm5D0MHFewOeDcZGlHJNlxWKF3yrjjuPERO 9x6NyJthdh9awP+o1wlyf1CvTtwJOgMWlE4uZL+ghZoqTypMis6EpZL6yaAGoZ69+otiu7fsqnV yNXf92iLgXPCvtANYEY4O60jYZgXioEFBxbefcVhJguf9QiczTbatir/PrOVgg2FlVMZCzHFR0C sAT8bEUUdtwUadvs5cbFvQV48kJMXTMOxa2Z7X2f48SlCtqzj1XxespwmVFtg4hw3cv3g2yUIGG nSQUw+SRX7VkX4Q4HAQP8zswFcKA3RLNxzpuPvEZfNcvc8TDg6vG/R/IDrPSQlTsr6EhFOnmtpw mtiA== X-Received: by 2002:a05:600c:4e0d:b0:493:c535:3934 with SMTP id 5b1f17b1804b1-496b5735020mr34808295e9.36.1784991547863; Sat, 25 Jul 2026 07:59:07 -0700 (PDT) Received: from antoniarch ([78.212.96.5]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-496b4f24a93sm79704435e9.11.2026.07.25.07.59.06 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 25 Jul 2026 07:59:07 -0700 (PDT) From: Antoni Pokusinski To: alexandre.belloni@bootlin.com, robh@kernel.org, krzk+dt@kernel.org, conor+dt@kernel.org Cc: marex@denx.de, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, Antoni Pokusinski Subject: [PATCH v2 7/8] rtc: abx80x: create abx80x_i2c_probe() Date: Sat, 25 Jul 2026 16:57:17 +0200 Message-ID: <20260725145718.14733-8-apokusinski01@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260725145718.14733-1-apokusinski01@gmail.com> References: <20260725145718.14733-1-apokusinski01@gmail.com> Precedence: bulk X-Mailing-List: linux-rtc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit 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 | 165 ++++++++++++++++++++++++--------------- 1 file changed, 102 insertions(+), 63 deletions(-) diff --git a/drivers/rtc/rtc-abx80x.c b/drivers/rtc/rtc-abx80x.c index a7686206eb92..7cba72656d09 100644 --- a/drivers/rtc/rtc-abx80x.c +++ b/drivers/rtc/rtc-abx80x.c @@ -753,70 +753,35 @@ static const struct regmap_access_table abx80x_write_table = { .n_no_ranges = ARRAY_SIZE(abx80x_no_write_ranges), }; -static const struct regmap_config abx80x_regmap_config_i2c = { - .reg_bits = 8, - .val_bits = 8, - .max_register = ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, - - .rd_table = &abx80x_read_table, - .wr_table = &abx80x_write_table, -}; - -static const struct i2c_device_id abx80x_id[] = { - { .name = "abx80x", .driver_data = ABX80X }, - { .name = "ab0801", .driver_data = AB0801 }, - { .name = "ab0803", .driver_data = AB0803 }, - { .name = "ab0804", .driver_data = AB0804 }, - { .name = "ab0805", .driver_data = AB0805 }, - { .name = "ab1801", .driver_data = AB1801 }, - { .name = "ab1803", .driver_data = AB1803 }, - { .name = "ab1804", .driver_data = AB1804 }, - { .name = "ab1805", .driver_data = AB1805 }, - { .name = "rv1805", .driver_data = 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 = client->dev.of_node; struct abx80x_priv *priv; int i, err, trickle_cfg = -EINVAL; char buf[7]; - unsigned int part = (uintptr_t)i2c_get_match_data(client); unsigned int partnumber; unsigned int majrev, minrev; unsigned int lot; unsigned int wafer; unsigned int uid; - if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) - return -ENODEV; - - regmap = devm_regmap_init_i2c(client, &abx80x_regmap_config_i2c); - if (IS_ERR(regmap)) { - dev_err(&client->dev, "Unable to allocate regmap\n"); - return -EIO; - } - - priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL); + priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); if (priv == NULL) return -ENOMEM; - priv->rtc = devm_rtc_allocate_device(&client->dev); + priv->rtc = devm_rtc_allocate_device(dev); if (IS_ERR(priv->rtc)) return PTR_ERR(priv->rtc); priv->rtc->ops = &abx80x_rtc_ops; - priv->irq = client->irq; + priv->irq = irq; priv->regmap = regmap; - dev_set_drvdata(&client->dev, priv); + dev_set_drvdata(dev, priv); err = 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; } @@ -826,14 +791,14 @@ static int abx80x_probe(struct i2c_client *client) lot = ((buf[4] & 0x80) << 2) | ((buf[6] & 0x80) << 1) | buf[3]; uid = ((buf[4] & 0x7f) << 8) | buf[5]; wafer = (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); err = 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; } @@ -843,15 +808,14 @@ static int abx80x_probe(struct i2c_client *client) if (partnumber == abx80x_caps[i].pn) break; if (abx80x_caps[i].pn == 0) { - dev_err(&client->dev, "Unknown part: %04x\n", - partnumber); + dev_err(dev, "Unknown part: %04x\n", partnumber); return -EINVAL; } part = i; } if (partnumber != abx80x_caps[part].pn) { - dev_err(&client->dev, "partnumber mismatch %04x != %04x\n", + dev_err(dev, "partnumber mismatch %04x != %04x\n", partnumber, abx80x_caps[part].pn); return -EINVAL; } @@ -867,7 +831,7 @@ static int abx80x_probe(struct i2c_client *client) err = 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; } @@ -875,7 +839,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; /* @@ -887,19 +851,18 @@ 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; } } if (np && abx80x_caps[part].has_tc) - trickle_cfg = abx80x_dt_trickle_cfg(&client->dev); + trickle_cfg = abx80x_dt_trickle_cfg(dev); 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); } err = regmap_write(regmap, ABX8XX_REG_CD_TIMER_CTL, BIT(2)); @@ -907,7 +870,7 @@ static int abx80x_probe(struct i2c_client *client) return err; if (abx80x_caps[part].has_wdog) { - err = abx80x_setup_watchdog(&client->dev); + err = abx80x_setup_watchdog(dev); if (err) return err; } @@ -917,14 +880,14 @@ static int abx80x_probe(struct i2c_client *client) return err; if (priv->irq > 0) { - dev_info(&client->dev, "IRQ %d supplied\n", priv->irq); - err = devm_request_threaded_irq(&client->dev, priv->irq, NULL, + dev_info(dev, "IRQ %d supplied\n", priv->irq); + err = 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 = 0; } } @@ -933,14 +896,39 @@ static int abx80x_probe(struct i2c_client *client) err = 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; } return devm_rtc_register_device(priv->rtc); } +#if IS_ENABLED(CONFIG_I2C) + +static const struct regmap_config abx80x_regmap_config_i2c = { + .reg_bits = 8, + .val_bits = 8, + .max_register = ABX8XX_SRAM_BASE + ABX8XX_SRAM_WIN_SIZE - 1, + + .rd_table = &abx80x_read_table, + .wr_table = &abx80x_write_table, +}; + +static const struct i2c_device_id abx80x_id[] = { + { .name = "abx80x", .driver_data = ABX80X }, + { .name = "ab0801", .driver_data = AB0801 }, + { .name = "ab0803", .driver_data = AB0803 }, + { .name = "ab0804", .driver_data = AB0804 }, + { .name = "ab0805", .driver_data = AB0805 }, + { .name = "ab1801", .driver_data = AB1801 }, + { .name = "ab1803", .driver_data = AB1803 }, + { .name = "ab1804", .driver_data = AB1804 }, + { .name = "ab1805", .driver_data = AB1805 }, + { .name = "rv1805", .driver_data = RV1805 }, + { } +}; +MODULE_DEVICE_TABLE(i2c, abx80x_id); + #ifdef CONFIG_OF static const struct of_device_id abx80x_of_match[] = { { @@ -988,16 +976,67 @@ static const struct of_device_id abx80x_of_match[] = { MODULE_DEVICE_TABLE(of, abx80x_of_match); #endif +static int abx80x_i2c_probe(struct i2c_client *client) +{ + unsigned int part = (uintptr_t)i2c_get_match_data(client); + struct regmap *regmap; + + if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) + return -ENODEV; + + regmap = devm_regmap_init_i2c(client, &abx80x_regmap_config_i2c); + if (IS_ERR(regmap)) { + dev_err(&client->dev, "Unable to allocate regmap\n"); + return -EIO; + } + + return abx80x_probe(&client->dev, regmap, client->irq, + client->dev.of_node, part); +} + static struct i2c_driver abx80x_driver = { .driver = { .name = "rtc-abx80x", .of_match_table = of_match_ptr(abx80x_of_match), }, - .probe = abx80x_probe, + .probe = abx80x_i2c_probe, .id_table = abx80x_id, }; -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); MODULE_AUTHOR("Philippe De Muyter "); MODULE_AUTHOR("Alexandre Belloni "); -- 2.55.0