public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@bootlin.com>
To: Camel Guo <camel.guo@axis.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>,
	kernel@axis.com, Camel Guo <camelg@axis.com>,
	linux-rtc@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH] rtc: rs5c372: Add RTC_VL_READ, RTC_VL_CLR ioctls
Date: Wed, 10 Nov 2021 14:54:17 +0100	[thread overview]
Message-ID: <YYvPCehWWVE5mKTy@piout.net> (raw)
In-Reply-To: <20211110115455.18699-1-camel.guo@axis.com>

Hello,

On 10/11/2021 12:54:54+0100, Camel Guo wrote:
> From: Camel Guo <camelg@axis.com>
> 
> In order to make it possible to get battery voltage status, this commit
> adds RTC_VL_READ, RTC_VL_CLR ioctl commands to rtc-rs5c372.
> 
> Signed-off-by: Camel Guo <camelg@axis.com>
> ---
>  drivers/rtc/rtc-rs5c372.c | 66 +++++++++++++++++++++++++++++++++++++++
>  1 file changed, 66 insertions(+)
> 
> diff --git a/drivers/rtc/rtc-rs5c372.c b/drivers/rtc/rtc-rs5c372.c
> index 80980414890c..5a96e5d3663a 100644
> --- a/drivers/rtc/rtc-rs5c372.c
> +++ b/drivers/rtc/rtc-rs5c372.c
> @@ -485,6 +485,71 @@ static int rs5c372_rtc_proc(struct device *dev, struct seq_file *seq)
>  #define	rs5c372_rtc_proc	NULL
>  #endif
>  
> +#ifdef CONFIG_RTC_INTF_DEV
> +static int rs5c372_ioctl(struct device *dev, unsigned int cmd, unsigned long arg)
> +{
> +	struct rs5c372	*rs5c = i2c_get_clientdata(to_i2c_client(dev));
> +	unsigned char	ctrl2;
> +	int		addr;
> +	unsigned int	flags;
> +
> +	dev_dbg(dev, "%s: cmd=%x\n", __func__, cmd);
> +
> +	addr = RS5C_ADDR(RS5C_REG_CTRL2);
> +	ctrl2 = i2c_smbus_read_byte_data(rs5c->client, addr);
> +
> +	switch (cmd) {
> +	case RTC_VL_READ:
> +		flags = 0;
> +
> +		switch (rs5c->type) {
> +		case rtc_r2025sd:
> +		case rtc_r2221tl:
> +			if ((rs5c->type == rtc_r2025sd && !(ctrl2 & R2x2x_CTRL2_XSTP)) ||
> +				(rs5c->type == rtc_r2221tl &&  (ctrl2 & R2x2x_CTRL2_XSTP))) {
> +				flags |= RTC_VL_DATA_INVALID;
> +			}
> +			if (ctrl2 & R2x2x_CTRL2_VDET)
> +				flags |= RTC_VL_ACCURACY_LOW;

Shouldn't that be RTC_VL_BACKUP_LOW?

> +			break;
> +		default:
> +			if (ctrl2 & RS5C_CTRL2_XSTP)
> +				flags |= RTC_VL_DATA_INVALID;
> +			break;
> +		}
> +
> +		return put_user(flags, (unsigned int __user *)arg);
> +	case RTC_VL_CLR:
> +		/* clear rtc VDET, PON and XSTP bits */
> +		switch (rs5c->type) {
> +		case rtc_r2025sd:
> +		case rtc_r2221tl:
> +			ctrl2 &= ~(R2x2x_CTRL2_VDET | R2x2x_CTRL2_PON);
> +			if (rs5c->type == rtc_r2025sd)
> +				ctrl2 |= R2x2x_CTRL2_XSTP;
> +			else
> +				ctrl2 &= ~R2x2x_CTRL2_XSTP;
> +			break;
> +		default:
> +			ctrl2 &= ~RS5C_CTRL2_XSTP;

You can clear VDET but you must nt clear PON or XSTP as they are used to
know whether the time on the RTC has been set correctly. Clearing those
can only be done in .set_time.

> +			break;
> +		}
> +
> +		if (i2c_smbus_write_byte_data(rs5c->client, addr, ctrl2) < 0) {
> +			dev_dbg(&rs5c->client->dev, "%s: write error in line %i\n",
> +					__func__, __LINE__);
> +			return -EIO;
> +		}
> +		return 0;
> +	default:
> +		return -ENOIOCTLCMD;
> +	}
> +	return 0;
> +}
> +#else
> +#define rs5c372_ioctl	NULL
> +#endif
> +
>  static const struct rtc_class_ops rs5c372_rtc_ops = {
>  	.proc		= rs5c372_rtc_proc,
>  	.read_time	= rs5c372_rtc_read_time,
> @@ -492,6 +557,7 @@ static const struct rtc_class_ops rs5c372_rtc_ops = {
>  	.read_alarm	= rs5c_read_alarm,
>  	.set_alarm	= rs5c_set_alarm,
>  	.alarm_irq_enable = rs5c_rtc_alarm_irq_enable,
> +	.ioctl		= rs5c372_ioctl,
>  };
>  
>  #if IS_ENABLED(CONFIG_RTC_INTF_SYSFS)
> -- 
> 2.20.1
> 

-- 
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

  reply	other threads:[~2021-11-10 13:54 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-10 11:54 [PATCH] rtc: rs5c372: Add RTC_VL_READ, RTC_VL_CLR ioctls Camel Guo
2021-11-10 13:54 ` Alexandre Belloni [this message]
2021-11-10 14:03   ` Camel Guo
2021-11-10 14:27     ` Alexandre Belloni
2021-11-10 14:30       ` Camel Guo
2021-11-10 15:01         ` Camel Guo
2021-11-11  8:38         ` Camel Guo

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=YYvPCehWWVE5mKTy@piout.net \
    --to=alexandre.belloni@bootlin.com \
    --cc=a.zummo@towertech.it \
    --cc=camel.guo@axis.com \
    --cc=camelg@axis.com \
    --cc=kernel@axis.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-rtc@vger.kernel.org \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox