From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Karel Balej <balejk@matfyz.cz>
Cc: Lee Jones <lee@kernel.org>,
linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org,
duje.mihanovic@skole.hr, phone-devel@vger.kernel.org,
~postmarketos/upstreaming@lists.sr.ht
Subject: Re: [RFC PATCH v2 2/2] rtc: add driver for Marvell 88PM886 PMIC RTC
Date: Mon, 11 Nov 2024 23:30:07 +0100 [thread overview]
Message-ID: <20241111223007bd126e5c@mail.local> (raw)
In-Reply-To: <20241012193345.18594-2-balejk@matfyz.cz>
Lee,
I'm happy taking this patch, I guess you are going to take 1/2 ?
On 12/10/2024 21:31:39+0200, Karel Balej wrote:
> RTC lives on the chip's base register page. Add the relevant register
> definitions and implement a basic set/read time functionality. Tested
> with the samsung,coreprimevelte smartphone which contains this PMIC and
> whose vendor kernel tree has also served as the sole reference for this.
>
> Signed-off-by: Karel Balej <balejk@matfyz.cz>
> ---
>
> Notes:
> RFC v2:
> - Move in the register definitions from the preceding patch and reword
> the commit message accordingly.
> - Rebase to v6.12-rc2.
>
> MAINTAINERS | 1 +
> drivers/rtc/Kconfig | 10 ++++
> drivers/rtc/Makefile | 1 +
> drivers/rtc/rtc-88pm886.c | 97 +++++++++++++++++++++++++++++++++++++
> include/linux/mfd/88pm886.h | 9 ++++
> 5 files changed, 118 insertions(+)
> create mode 100644 drivers/rtc/rtc-88pm886.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index a097afd76ded..3a15b8711041 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -13710,6 +13710,7 @@ F: Documentation/devicetree/bindings/mfd/marvell,88pm886-a1.yaml
> F: drivers/input/misc/88pm886-onkey.c
> F: drivers/mfd/88pm886.c
> F: drivers/regulator/88pm886-regulator.c
> +F: drivers/rtc/rtc-88pm886.c
> F: include/linux/mfd/88pm886.h
>
> MARVELL ARMADA 3700 PHY DRIVERS
> diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
> index 66eb1122248b..2718ea194dd4 100644
> --- a/drivers/rtc/Kconfig
> +++ b/drivers/rtc/Kconfig
> @@ -182,6 +182,16 @@ config RTC_DRV_88PM80X
> This driver can also be built as a module. If so, the module
> will be called rtc-88pm80x.
>
> +config RTC_DRV_88PM886
> + tristate "Marvell 88PM886 RTC driver"
> + depends on MFD_88PM886_PMIC
> + help
> + If you say yes here you will get support for the RTC function in the
> + Marvell 88PM886 chip.
> +
> + This driver can also be built as a module. If so, the module
> + will be called rtc-88pm886.
> +
> config RTC_DRV_ABB5ZES3
> select REGMAP_I2C
> tristate "Abracon AB-RTCMC-32.768kHz-B5ZE-S3"
> diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
> index f62340ecc534..70bbce968a43 100644
> --- a/drivers/rtc/Makefile
> +++ b/drivers/rtc/Makefile
> @@ -21,6 +21,7 @@ obj-$(CONFIG_RTC_LIB_KUNIT_TEST) += lib_test.o
>
> obj-$(CONFIG_RTC_DRV_88PM80X) += rtc-88pm80x.o
> obj-$(CONFIG_RTC_DRV_88PM860X) += rtc-88pm860x.o
> +obj-$(CONFIG_RTC_DRV_88PM886) += rtc-88pm886.o
> obj-$(CONFIG_RTC_DRV_AB8500) += rtc-ab8500.o
> obj-$(CONFIG_RTC_DRV_ABB5ZES3) += rtc-ab-b5ze-s3.o
> obj-$(CONFIG_RTC_DRV_ABEOZ9) += rtc-ab-eoz9.o
> diff --git a/drivers/rtc/rtc-88pm886.c b/drivers/rtc/rtc-88pm886.c
> new file mode 100644
> index 000000000000..57e9b0a66eed
> --- /dev/null
> +++ b/drivers/rtc/rtc-88pm886.c
> @@ -0,0 +1,97 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +#include <linux/limits.h>
> +#include <linux/mod_devicetable.h>
> +#include <linux/platform_device.h>
> +#include <linux/rtc.h>
> +
> +#include <linux/mfd/88pm886.h>
> +
> +/*
> + * Time is calculated as the sum of a 32-bit read-only advancing counter and a
> + * writeable constant offset stored in the chip's spare registers.
> + */
> +
> +static int pm886_rtc_read_time(struct device *dev, struct rtc_time *tm)
> +{
> + struct regmap *regmap = dev_get_drvdata(dev);
> + u32 time;
> + u32 buf;
> + int ret;
> +
> + ret = regmap_bulk_read(regmap, PM886_REG_RTC_SPARE1, &buf, 4);
> + if (ret)
> + return ret;
> + time = buf;
> +
> + ret = regmap_bulk_read(regmap, PM886_REG_RTC_CNT1, &buf, 4);
> + if (ret)
> + return ret;
> + time += buf;
> +
> + rtc_time64_to_tm(time, tm);
> +
> + return 0;
> +}
> +
> +static int pm886_rtc_set_time(struct device *dev, struct rtc_time *tm)
> +{
> + struct regmap *regmap = dev_get_drvdata(dev);
> + u32 buf;
> + int ret;
> +
> + ret = regmap_bulk_read(regmap, PM886_REG_RTC_CNT1, &buf, 4);
> + if (ret)
> + return ret;
> +
> + buf = rtc_tm_to_time64(tm) - buf;
> +
> + return regmap_bulk_write(regmap, PM886_REG_RTC_SPARE1, &buf, 4);
> +}
> +
> +static const struct rtc_class_ops pm886_rtc_ops = {
> + .read_time = pm886_rtc_read_time,
> + .set_time = pm886_rtc_set_time,
> +};
> +
> +static int pm886_rtc_probe(struct platform_device *pdev)
> +{
> + struct pm886_chip *chip = dev_get_drvdata(pdev->dev.parent);
> + struct device *dev = &pdev->dev;
> + struct rtc_device *rtc;
> + int ret;
> +
> + platform_set_drvdata(pdev, chip->regmap);
> +
> + rtc = devm_rtc_allocate_device(dev);
> + if (IS_ERR(rtc))
> + return dev_err_probe(dev, PTR_ERR(rtc),
> + "Failed to allocate RTC device\n");
> +
> + rtc->ops = &pm886_rtc_ops;
> + rtc->range_max = U32_MAX;
> +
> + ret = devm_rtc_register_device(rtc);
> + if (ret)
> + return dev_err_probe(dev, ret, "Failed to register RTC device\n");
> +
> + return 0;
> +}
> +
> +static const struct platform_device_id pm886_rtc_id_table[] = {
> + { "88pm886-rtc", },
> + { }
> +};
> +MODULE_DEVICE_TABLE(platform, pm886_rtc_id_table);
> +
> +static struct platform_driver pm886_rtc_driver = {
> + .driver = {
> + .name = "88pm886-rtc",
> + },
> + .probe = pm886_rtc_probe,
> + .id_table = pm886_rtc_id_table,
> +};
> +module_platform_driver(pm886_rtc_driver);
> +
> +MODULE_DESCRIPTION("Marvell 88PM886 RTC driver");
> +MODULE_AUTHOR("Karel Balej <balejk@matfyz.cz>");
> +MODULE_LICENSE("GPL");
> diff --git a/include/linux/mfd/88pm886.h b/include/linux/mfd/88pm886.h
> index 133aa302e492..85eca44f39ab 100644
> --- a/include/linux/mfd/88pm886.h
> +++ b/include/linux/mfd/88pm886.h
> @@ -31,6 +31,15 @@
> #define PM886_INT_WC BIT(1)
> #define PM886_INT_MASK_MODE BIT(2)
>
> +#define PM886_REG_RTC_CNT1 0xd1
> +#define PM886_REG_RTC_CNT2 0xd2
> +#define PM886_REG_RTC_CNT3 0xd3
> +#define PM886_REG_RTC_CNT4 0xd4
> +#define PM886_REG_RTC_SPARE1 0xea
> +#define PM886_REG_RTC_SPARE2 0xeb
> +#define PM886_REG_RTC_SPARE3 0xec
> +#define PM886_REG_RTC_SPARE4 0xed
> +#define PM886_REG_RTC_SPARE5 0xee
> #define PM886_REG_RTC_SPARE6 0xef
>
> #define PM886_REG_BUCK_EN 0x08
> --
> 2.47.0
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
next prev parent reply other threads:[~2024-11-11 22:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-12 19:31 [RFC PATCH v2 1/2] mfd: 88pm886: add the RTC cell Karel Balej
2024-10-12 19:31 ` [RFC PATCH v2 2/2] rtc: add driver for Marvell 88PM886 PMIC RTC Karel Balej
2024-10-15 8:35 ` Lee Jones
2024-11-11 22:30 ` Alexandre Belloni [this message]
2024-11-11 22:38 ` (subset) " Alexandre Belloni
2024-10-15 8:36 ` [RFC PATCH v2 1/2] mfd: 88pm886: add the RTC cell Lee Jones
2024-11-12 7:21 ` Karel Balej
2024-11-12 14:45 ` (subset) " Lee Jones
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20241111223007bd126e5c@mail.local \
--to=alexandre.belloni@bootlin.com \
--cc=balejk@matfyz.cz \
--cc=duje.mihanovic@skole.hr \
--cc=lee@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-rtc@vger.kernel.org \
--cc=phone-devel@vger.kernel.org \
--cc=~postmarketos/upstreaming@lists.sr.ht \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.