RE: [PATCH v2 4/5] mfd: Add Renesas PMIC RAA215300 RTC driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi All,

> Subject: [PATCH v2 4/5] mfd: Add Renesas PMIC RAA215300 RTC driver
> 
> Currently, it is not possible to instantiate the i2c client driver using MFD
> cell as it is not a platform driver. Add support for Renesas PMIC
> RAA215300 RTC platform driver, so that it can be instantiated by MFD API.
> The rtc device is created by using i2c_new_ancillary_device() and it
> register as the rtc device by the helper function provided by
> rtc-isl2108 driver.

Not sure this platform driver has to be placed in RTC subsystem rather than MFD subsystem
as PMIC MFD driver, can instantiate it using MFD cell??

The advantage is the header file[1](isl1208.h) will be local to RTC subsystem compared
to across subsystem (include/linux/rtc/isl1208.h) and thereby avoids subsystem dependencies.

[1]
https://lore.kernel.org/linux-renesas-soc/20230505172530.357455-4-biju.das.jz@xxxxxxxxxxxxxx/T/#u

Cheers,
Biju

> 
> The PMIC driver enables RTC device and share the PMIC revision to RTC
> platform driver.
> 
> Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
> ---
> v2:
>  * New patch
> ---
>  drivers/mfd/Kconfig         |  7 +++++
>  drivers/mfd/Makefile        |  1 +
>  drivers/mfd/raa215300-rtc.c | 52 +++++++++++++++++++++++++++++++++++++
>  drivers/mfd/raa215300.c     | 38 ++++++++++++++++++++++++---
>  4 files changed, 95 insertions(+), 3 deletions(-)  create mode 100644
> drivers/mfd/raa215300-rtc.c
> 
> diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig index
> 9071b0f27b62..cec20c1f143d 100644
> --- a/drivers/mfd/Kconfig
> +++ b/drivers/mfd/Kconfig
> @@ -318,6 +318,13 @@ config PMIC_RAA215300
>  	help
>  	  Support for the Renesas RAA215300 PMIC.
> 
> +config PMIC_RAA215300_RTC
> +	tristate "Renesas RAA215300 RTC driver"
> +	depends on PMIC_RAA215300
> +	select RTC_DRV_ISL1208
> +	help
> +	  Select this to get support for the Renesas RAA215300 RTC
> +
>  config PMIC_DA903X
>  	bool "Dialog Semiconductor DA9030/DA9034 PMIC Support"
>  	depends on I2C=y
> diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile index
> d9c601120bfd..ed4b760e564e 100644
> --- a/drivers/mfd/Makefile
> +++ b/drivers/mfd/Makefile
> @@ -127,6 +127,7 @@ obj-$(CONFIG_MCP_UCB1200)	+= ucb1x00-assabet.o
>  endif
> 
>  obj-$(CONFIG_PMIC_RAA215300)	+= raa215300.o
> +obj-$(CONFIG_PMIC_RAA215300_RTC)	+= raa215300-rtc.o
> 
>  obj-$(CONFIG_PMIC_DA903X)	+= da903x.o
> 
> diff --git a/drivers/mfd/raa215300-rtc.c b/drivers/mfd/raa215300-rtc.c new
> file mode 100644 index 000000000000..309ed34d6cd7
> --- /dev/null
> +++ b/drivers/mfd/raa215300-rtc.c
> @@ -0,0 +1,52 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/*
> + * Renesas RAA215300 RTC Driver
> + *
> + * Copyright (C) 2023 Renesas Electronics Corporation  */
> +
> +#include <linux/err.h>
> +#include <linux/i2c.h>
> +#include <linux/module.h>
> +#include <linux/platform_device.h>
> +#include <linux/rtc/isl1208.h>
> +
> +#define RAA215300_RTC_DEFAULT_ADDR 0x6f
> +
> +static void raa215300_rtc_unregister_device(void *data) {
> +	i2c_unregister_device(data);
> +}
> +
> +static int raa215300_rtc_probe(struct platform_device *pdev) {
> +	unsigned int *pmic_version = dev_get_drvdata(pdev->dev.parent);
> +	struct i2c_client *client;
> +	int ret;
> +
> +	client = i2c_new_ancillary_device(to_i2c_client(pdev->dev.parent),
> +					  "rtc", RAA215300_RTC_DEFAULT_ADDR);
> +	if (IS_ERR(client))
> +		return PTR_ERR(client);
> +
> +	ret = devm_add_action_or_reset(&pdev->dev,
> +				       raa215300_rtc_unregister_device, client);
> +	if (ret < 0)
> +		return ret;
> +
> +	return raa215300_rtc_probe_helper(client, *pmic_version); }
> +
> +static struct platform_driver raa215300_rtc_driver = {
> +	.probe = raa215300_rtc_probe,
> +	.driver = {
> +		.name = "raa215300-rtc",
> +	},
> +};
> +module_platform_driver(raa215300_rtc_driver);
> +
> +MODULE_DESCRIPTION("Renesas RAA215300 MFD RTC Driver");
> +MODULE_ALIAS("platform:raa215300-rtc");
> +MODULE_AUTHOR("Biju Das <biju.das.jz@xxxxxxxxxxxxxx>");
> +MODULE_LICENSE("GPL");
> +MODULE_SOFTDEP("post: rtc_isl1208");
> diff --git a/drivers/mfd/raa215300.c b/drivers/mfd/raa215300.c index
> 5cdd3213e99c..c8bdf96b203f 100644
> --- a/drivers/mfd/raa215300.c
> +++ b/drivers/mfd/raa215300.c
> @@ -8,6 +8,7 @@
>  #include <linux/err.h>
>  #include <linux/i2c.h>
>  #include <linux/module.h>
> +#include <linux/mfd/core.h>
>  #include <linux/of.h>
>  #include <linux/regmap.h>
> 
> @@ -29,13 +30,26 @@ static const struct regmap_config
> raa215300_regmap_config = {
>  	.cache_type = REGCACHE_FLAT,
>  };
> 
> +static const struct mfd_cell raa215300_rtc_dev[] = {
> +	{ .name = "raa215300-rtc" }
> +};
> +
> +static void raa215300_remove_devices(void *data) {
> +	mfd_remove_devices(data);
> +}
> +
>  static int raa215300_i2c_probe(struct i2c_client *client)  {
>  	struct device *dev = &client->dev;
> -	unsigned int pmic_version;
> +	unsigned int *pmic_version;
>  	struct regmap *regmap;
>  	int ret;
> 
> +	pmic_version = devm_kzalloc(dev, sizeof(*pmic_version), GFP_KERNEL);
> +	if (!pmic_version)
> +		return -ENOMEM;
> +
>  	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C))
>  		return -EOPNOTSUPP;
> 
> @@ -44,11 +58,29 @@ static int raa215300_i2c_probe(struct i2c_client
> *client)
>  		return dev_err_probe(dev, PTR_ERR(regmap),
>  				     "regmap i2c init failed\n");
> 
> -	ret = regmap_read(regmap, RAA215300_HW_REV, &pmic_version);
> +	ret = regmap_read(regmap, RAA215300_HW_REV, pmic_version);
>  	if (ret < 0)
>  		return dev_err_probe(dev, ret, "HW rev read failed\n");
> 
> -	dev_dbg(dev, "RAA215300 PMIC version 0x%04x\n", pmic_version);
> +	dev_dbg(dev, "RAA215300 PMIC version 0x%04x\n", *pmic_version);
> +	dev_set_drvdata(dev, pmic_version);
> +
> +	if (of_property_read_bool(dev->of_node, "renesas,rtc-enabled"))  {
> +		/* Enable RTC block */
> +		regmap_update_bits(regmap, RAA215300_REG_BLOCK_EN,
> +				   RAA215300_REG_BLOCK_EN_RTC_EN,
> +				   RAA215300_REG_BLOCK_EN_RTC_EN);
> +
> +		ret = mfd_add_devices(dev, 0, raa215300_rtc_dev,
> +				      ARRAY_SIZE(raa215300_rtc_dev), NULL,
> +				      0, NULL);
> +		if (ret < 0)
> +			return ret;
> +
> +		ret = devm_add_action_or_reset(dev, raa215300_remove_devices,
> dev);
> +		if (ret < 0)
> +			return ret;
> +	}
> 
>  	return 0;
>  }
> --
> 2.25.1





[Index of Archives]     [Linux Samsung SOC]     [Linux Wireless]     [Linux Kernel]     [ATH6KL]     [Linux Bluetooth]     [Linux Netdev]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Samba]     [Device Mapper]

  Powered by Linux