All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
To: Joshua Clayton <stillcompiling@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>,
	rtc-linux@googlegroups.com, linux-kernel@vger.kernel.org
Subject: [rtc-linux] Re: [PATCH 3/9] rtc-pcf2123: clean up writes to the rtc chip
Date: Tue, 24 Nov 2015 23:16:26 +0100	[thread overview]
Message-ID: <20151124221626.GE3950@piout.net> (raw)
In-Reply-To: <813a6fe306c384c59418495605236927b9d00940.1446587705.git.stillcompiling@gmail.com>

On 04/11/2015 at 07:36:34 -0800, Joshua Clayton wrote :
> +static int pcf2123_write(struct device *dev, u8 *txbuf, size_t size)
> +{
> +	struct spi_device *spi = to_spi_device(dev);
> +	int ret;
> +
> +	if (txbuf[0] > PCF2123_REG_MAX)
> +		return -EFAULT;
> +

Is that test really necessary? From what I understand the driver always
controls which register is written.

> +	txbuf[0] |= PCF2123_WRITE;
> +	ret = spi_write(spi, txbuf, size);
> +	pcf2123_delay_trec();
> +
> +	return ret;
> +}
> +
> +static int pcf2123_write_reg(struct device *dev, u8 reg, u8 val)
> +{
> +	u8 txbuf[2];
> +
> +	txbuf[0] = reg;
> +	txbuf[1] = val;
> +	return pcf2123_write(dev, txbuf, sizeof(txbuf));
> +}
> +
>  static ssize_t pcf2123_show(struct device *dev, struct device_attribute *attr,
>  			    char *buffer)
>  {
> @@ -142,9 +166,7 @@ static ssize_t pcf2123_show(struct device *dev, struct device_attribute *attr,
>  
>  static ssize_t pcf2123_store(struct device *dev, struct device_attribute *attr,
>  			     const char *buffer, size_t count) {
> -	struct spi_device *spi = to_spi_device(dev);
>  	struct pcf2123_sysfs_reg *r;
> -	u8 txbuf[2];
>  	unsigned long reg;
>  	unsigned long val;
>  
> @@ -160,12 +182,9 @@ static ssize_t pcf2123_store(struct device *dev, struct device_attribute *attr,
>  	if (ret)
>  		return ret;
>  
> -	txbuf[0] = PCF2123_WRITE | reg;
> -	txbuf[1] = val;
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	pcf2123_write_reg(dev, reg, val);
>  	if (ret < 0)
>  		return -EIO;
> -	pcf2123_delay_trec();
>  	return count;
>  }
>  
> @@ -205,7 +224,6 @@ static int pcf2123_rtc_read_time(struct device *dev, struct rtc_time *tm)
>  
>  static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  {
> -	struct spi_device *spi = to_spi_device(dev);
>  	u8 txbuf[8];
>  	int ret;
>  
> @@ -216,15 +234,12 @@ static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  			tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
>  
>  	/* Stop the counter first */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x20;
> -	ret = spi_write(spi, txbuf, 2);
> +	ret = pcf2123_write_reg(dev, PCF2123_REG_CTRL1, 0x20);
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	/* Set the new time */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_SC;
> +	txbuf[0] = PCF2123_REG_SC;
>  	txbuf[1] = bin2bcd(tm->tm_sec & 0x7F);
>  	txbuf[2] = bin2bcd(tm->tm_min & 0x7F);
>  	txbuf[3] = bin2bcd(tm->tm_hour & 0x3F);
> @@ -233,18 +248,14 @@ static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  	txbuf[6] = bin2bcd((tm->tm_mon + 1) & 0x1F); /* rtc mn 1-12 */
>  	txbuf[7] = bin2bcd(tm->tm_year < 100 ? tm->tm_year : tm->tm_year - 100);
>  
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	ret = pcf2123_write(dev, txbuf, sizeof(txbuf));
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	/* Start the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x00;
> -	ret = spi_write(spi, txbuf, 2);
> +	ret = pcf2123_write_reg(dev, PCF2123_REG_CTRL1, 0x00);
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	return 0;
>  }
> @@ -258,7 +269,7 @@ static int pcf2123_probe(struct spi_device *spi)
>  {
>  	struct rtc_device *rtc;
>  	struct pcf2123_plat_data *pdata;
> -	u8 txbuf[2], rxbuf[2];
> +	u8  rxbuf[2];
>  	int ret, i;
>  
>  	pdata = devm_kzalloc(&spi->dev, sizeof(struct pcf2123_plat_data),
> @@ -268,24 +279,16 @@ static int pcf2123_probe(struct spi_device *spi)
>  	spi->dev.platform_data = pdata;
>  
>  	/* Send a software reset command */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x58;
> -	dev_dbg(&spi->dev, "resetting RTC (0x%02X 0x%02X)\n",
> -			txbuf[0], txbuf[1]);
> -	ret = spi_write(spi, txbuf, 2 * sizeof(u8));
> +	dev_dbg(&spi->dev, "resetting RTC\n");
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x58);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* Stop the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x20;
> -	dev_dbg(&spi->dev, "stopping RTC (0x%02X 0x%02X)\n",
> -			txbuf[0], txbuf[1]);
> -	ret = spi_write(spi, txbuf, 2 * sizeof(u8));
> +	dev_dbg(&spi->dev, "stopping RTC\n");
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x20);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* See if the counter was actually stopped */
>  	dev_dbg(&spi->dev, "checking for presence of RTC\n");
> @@ -306,12 +309,9 @@ static int pcf2123_probe(struct spi_device *spi)
>  			(spi->max_speed_hz + 500) / 1000);
>  
>  	/* Start the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x00;
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x00);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* Finalize the initialization */
>  	rtc = devm_rtc_device_register(&spi->dev, pcf2123_driver.driver.name,
> -- 
> 2.5.0
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

-- 
-- 
You received this message because you are subscribed to "rtc-linux".
Membership options at http://groups.google.com/group/rtc-linux .
Please read http://groups.google.com/group/rtc-linux/web/checklist
before submitting a driver.
--- 
You received this message because you are subscribed to the Google Groups "rtc-linux" group.
To unsubscribe from this group and stop receiving emails from it, send an email to rtc-linux+unsubscribe@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

WARNING: multiple messages have this Message-ID (diff)
From: Alexandre Belloni <alexandre.belloni@free-electrons.com>
To: Joshua Clayton <stillcompiling@gmail.com>
Cc: Alessandro Zummo <a.zummo@towertech.it>,
	rtc-linux@googlegroups.com, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 3/9] rtc-pcf2123: clean up writes to the rtc chip
Date: Tue, 24 Nov 2015 23:16:26 +0100	[thread overview]
Message-ID: <20151124221626.GE3950@piout.net> (raw)
In-Reply-To: <813a6fe306c384c59418495605236927b9d00940.1446587705.git.stillcompiling@gmail.com>

On 04/11/2015 at 07:36:34 -0800, Joshua Clayton wrote :
> +static int pcf2123_write(struct device *dev, u8 *txbuf, size_t size)
> +{
> +	struct spi_device *spi = to_spi_device(dev);
> +	int ret;
> +
> +	if (txbuf[0] > PCF2123_REG_MAX)
> +		return -EFAULT;
> +

Is that test really necessary? From what I understand the driver always
controls which register is written.

> +	txbuf[0] |= PCF2123_WRITE;
> +	ret = spi_write(spi, txbuf, size);
> +	pcf2123_delay_trec();
> +
> +	return ret;
> +}
> +
> +static int pcf2123_write_reg(struct device *dev, u8 reg, u8 val)
> +{
> +	u8 txbuf[2];
> +
> +	txbuf[0] = reg;
> +	txbuf[1] = val;
> +	return pcf2123_write(dev, txbuf, sizeof(txbuf));
> +}
> +
>  static ssize_t pcf2123_show(struct device *dev, struct device_attribute *attr,
>  			    char *buffer)
>  {
> @@ -142,9 +166,7 @@ static ssize_t pcf2123_show(struct device *dev, struct device_attribute *attr,
>  
>  static ssize_t pcf2123_store(struct device *dev, struct device_attribute *attr,
>  			     const char *buffer, size_t count) {
> -	struct spi_device *spi = to_spi_device(dev);
>  	struct pcf2123_sysfs_reg *r;
> -	u8 txbuf[2];
>  	unsigned long reg;
>  	unsigned long val;
>  
> @@ -160,12 +182,9 @@ static ssize_t pcf2123_store(struct device *dev, struct device_attribute *attr,
>  	if (ret)
>  		return ret;
>  
> -	txbuf[0] = PCF2123_WRITE | reg;
> -	txbuf[1] = val;
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	pcf2123_write_reg(dev, reg, val);
>  	if (ret < 0)
>  		return -EIO;
> -	pcf2123_delay_trec();
>  	return count;
>  }
>  
> @@ -205,7 +224,6 @@ static int pcf2123_rtc_read_time(struct device *dev, struct rtc_time *tm)
>  
>  static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  {
> -	struct spi_device *spi = to_spi_device(dev);
>  	u8 txbuf[8];
>  	int ret;
>  
> @@ -216,15 +234,12 @@ static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  			tm->tm_mday, tm->tm_mon, tm->tm_year, tm->tm_wday);
>  
>  	/* Stop the counter first */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x20;
> -	ret = spi_write(spi, txbuf, 2);
> +	ret = pcf2123_write_reg(dev, PCF2123_REG_CTRL1, 0x20);
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	/* Set the new time */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_SC;
> +	txbuf[0] = PCF2123_REG_SC;
>  	txbuf[1] = bin2bcd(tm->tm_sec & 0x7F);
>  	txbuf[2] = bin2bcd(tm->tm_min & 0x7F);
>  	txbuf[3] = bin2bcd(tm->tm_hour & 0x3F);
> @@ -233,18 +248,14 @@ static int pcf2123_rtc_set_time(struct device *dev, struct rtc_time *tm)
>  	txbuf[6] = bin2bcd((tm->tm_mon + 1) & 0x1F); /* rtc mn 1-12 */
>  	txbuf[7] = bin2bcd(tm->tm_year < 100 ? tm->tm_year : tm->tm_year - 100);
>  
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	ret = pcf2123_write(dev, txbuf, sizeof(txbuf));
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	/* Start the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x00;
> -	ret = spi_write(spi, txbuf, 2);
> +	ret = pcf2123_write_reg(dev, PCF2123_REG_CTRL1, 0x00);
>  	if (ret < 0)
>  		return ret;
> -	pcf2123_delay_trec();
>  
>  	return 0;
>  }
> @@ -258,7 +269,7 @@ static int pcf2123_probe(struct spi_device *spi)
>  {
>  	struct rtc_device *rtc;
>  	struct pcf2123_plat_data *pdata;
> -	u8 txbuf[2], rxbuf[2];
> +	u8  rxbuf[2];
>  	int ret, i;
>  
>  	pdata = devm_kzalloc(&spi->dev, sizeof(struct pcf2123_plat_data),
> @@ -268,24 +279,16 @@ static int pcf2123_probe(struct spi_device *spi)
>  	spi->dev.platform_data = pdata;
>  
>  	/* Send a software reset command */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x58;
> -	dev_dbg(&spi->dev, "resetting RTC (0x%02X 0x%02X)\n",
> -			txbuf[0], txbuf[1]);
> -	ret = spi_write(spi, txbuf, 2 * sizeof(u8));
> +	dev_dbg(&spi->dev, "resetting RTC\n");
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x58);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* Stop the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x20;
> -	dev_dbg(&spi->dev, "stopping RTC (0x%02X 0x%02X)\n",
> -			txbuf[0], txbuf[1]);
> -	ret = spi_write(spi, txbuf, 2 * sizeof(u8));
> +	dev_dbg(&spi->dev, "stopping RTC\n");
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x20);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* See if the counter was actually stopped */
>  	dev_dbg(&spi->dev, "checking for presence of RTC\n");
> @@ -306,12 +309,9 @@ static int pcf2123_probe(struct spi_device *spi)
>  			(spi->max_speed_hz + 500) / 1000);
>  
>  	/* Start the counter */
> -	txbuf[0] = PCF2123_WRITE | PCF2123_REG_CTRL1;
> -	txbuf[1] = 0x00;
> -	ret = spi_write(spi, txbuf, sizeof(txbuf));
> +	ret = pcf2123_write_reg(&spi->dev, PCF2123_REG_CTRL1, 0x00);
>  	if (ret < 0)
>  		goto kfree_exit;
> -	pcf2123_delay_trec();
>  
>  	/* Finalize the initialization */
>  	rtc = devm_rtc_device_register(&spi->dev, pcf2123_driver.driver.name,
> -- 
> 2.5.0
> 

-- 
Alexandre Belloni, Free Electrons
Embedded Linux, Kernel and Android engineering
http://free-electrons.com

  reply	other threads:[~2015-11-24 22:16 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-11-04 15:36 [rtc-linux] [PATCH 0/9] rtc-2123: access the clock offset feature Joshua Clayton
2015-11-04 15:36 ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 1/9] rtc-pcf2123: Document all registers and useful bits Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-24 21:51   ` [rtc-linux] " Alexandre Belloni
2015-11-24 21:51     ` Alexandre Belloni
2015-12-01 18:13     ` [rtc-linux] " Joshua Clayton
2015-12-01 18:13       ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 2/9] rtc-pcf2123: clean up reads from the chip Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 3/9] rtc-pcf2123: clean up writes to the rtc chip Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-24 22:16   ` Alexandre Belloni [this message]
2015-11-24 22:16     ` Alexandre Belloni
2015-12-01 18:19     ` [rtc-linux] " Joshua Clayton
2015-12-01 18:19       ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 4/9] rtc-pcf2123: replace magic numbers with defines Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 5/9] rtc-pcf2123: put the chip reset into a function Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-24 23:17   ` [rtc-linux] " Alexandre Belloni
2015-11-24 23:17     ` Alexandre Belloni
2015-12-01 18:22     ` [rtc-linux] " Joshua Clayton
2015-12-01 18:22       ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 6/9] rtc-pcf2123: avoid resetting the clock if possible Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-24 23:25   ` [rtc-linux] " Alexandre Belloni
2015-11-24 23:25     ` Alexandre Belloni
2015-12-01 20:23     ` [rtc-linux] " Joshua Clayton
2015-12-01 20:23       ` Joshua Clayton
2015-12-01 21:04       ` [rtc-linux] " Alexandre Belloni
2015-12-01 21:04         ` Alexandre Belloni
2015-11-04 15:36 ` [rtc-linux] [PATCH 7/9] rtc-pcf2123: allow sysfs to accept hexidecimal Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-04 15:36 ` [rtc-linux] [PATCH 8/9] rtc-pcf2123: use sysfs groups Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-18 23:52   ` [rtc-linux] " Joshua Clayton
2015-11-18 23:52     ` Joshua Clayton
2015-11-24 23:31   ` [rtc-linux] " Alexandre Belloni
2015-11-24 23:31     ` Alexandre Belloni
2015-12-01 20:28     ` [rtc-linux] " Joshua Clayton
2015-12-01 20:28       ` Joshua Clayton
2015-12-01 20:47       ` [rtc-linux] " Alexandre Belloni
2015-12-01 20:47         ` Alexandre Belloni
2015-11-04 15:36 ` [rtc-linux] [PATCH 9/9] rtc-pcf2123: adjust the clock rate via sysfs Joshua Clayton
2015-11-04 15:36   ` Joshua Clayton
2015-11-18 23:51   ` [rtc-linux] " Joshua Clayton
2015-11-18 23:51     ` Joshua Clayton
2015-11-17 15:30 ` [rtc-linux] Re: [PATCH 0/9] rtc-2123: access the clock offset feature Joshua Clayton
2015-11-17 15:30   ` Joshua Clayton
2015-11-17 15:30   ` Joshua Clayton
2015-11-17 16:25   ` [rtc-linux] " Alexandre Belloni
2015-11-17 16:25     ` Alexandre Belloni
2015-11-17 16:25     ` Alexandre Belloni
2015-11-19  0:25     ` [rtc-linux] " Joshua Clayton
2015-11-19  0:25       ` Joshua Clayton

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=20151124221626.GE3950@piout.net \
    --to=alexandre.belloni@free-electrons.com \
    --cc=a.zummo@towertech.it \
    --cc=linux-kernel@vger.kernel.org \
    --cc=rtc-linux@googlegroups.com \
    --cc=stillcompiling@gmail.com \
    /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.