Re: [PATCH v7 6/6] w1: ds2438: support for writing to offset register

2021-04-16 Thread kernel test robot
Hi Luiz,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on linus/master]
[also build test WARNING on v5.12-rc7 next-20210416]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Luiz-Sampaio/w1-ds2438-fixed-a-coding-style-issue/20210417-071754
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
151501160401e2dc669ea7dac2c599b53f220c33
config: csky-randconfig-m031-20210416 (attached as .config)
compiler: csky-linux-gcc (GCC) 9.3.0

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

smatch warnings:
drivers/w1/slaves/w1_ds2438.c:218 w1_ds2438_change_offset_register() warn: 
inconsistent indenting

vim +218 drivers/w1/slaves/w1_ds2438.c

   195  
   196  static int w1_ds2438_change_offset_register(struct w1_slave *sl, u8 
*value)
   197  {
   198  unsigned int retries = W1_DS2438_RETRIES;
   199  u8 w1_buf[9];
   200  u8 w1_page1_buf[DS2438_PAGE_SIZE + 1 /*for CRC*/];
   201  
   202  if (w1_ds2438_get_page(sl, 1, w1_page1_buf) == 0) {
   203  memcpy(&w1_buf[2], w1_page1_buf, DS2438_PAGE_SIZE - 1); 
/* last register reserved */
   204  w1_buf[7] = value[0]; /* change only offset register */
   205  w1_buf[8] = value[1];
   206  while (retries--) {
   207  if (w1_reset_select_slave(sl))
   208  continue;
   209  w1_buf[0] = W1_DS2438_WRITE_SCRATCH;
   210  w1_buf[1] = 0x01; /* write to page 1 */
   211  w1_write_block(sl->master, w1_buf, 9);
   212  
   213  if (w1_reset_select_slave(sl))
   214  continue;
   215  w1_buf[0] = W1_DS2438_COPY_SCRATCH;
   216  w1_buf[1] = 0x01;
   217  w1_write_block(sl->master, w1_buf, 2);
 > 218  return 0;
   219  }
   220  }
   221  return -1;
   222  }
   223  

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip


[PATCH v7 6/6] w1: ds2438: support for writing to offset register

2021-04-16 Thread Luiz Sampaio
Added a sysfs entry to support writing to the offset register on page1.
This register is used to calibrate the chip canceling offset errors in the
current ADC. This means that, over time, reading the IAD register will not
return the correct current measurement, it will have an offset. Writing to
the offset register if the two's complement of the current register while
passing zero current to the load will calibrate the measurements. This
change was tested on real hardware and it was able to calibrate the chip
correctly.

Signed-off-by: Luiz Sampaio 
---
 .../ABI/stable/sysfs-driver-w1_ds2438 |  7 +++
 Documentation/w1/slaves/w1_ds2438.rst | 11 -
 drivers/w1/slaves/w1_ds2438.c | 49 +++
 3 files changed, 66 insertions(+), 1 deletion(-)

diff --git a/Documentation/ABI/stable/sysfs-driver-w1_ds2438 
b/Documentation/ABI/stable/sysfs-driver-w1_ds2438
index fa47437c11d9..d2e7681cc287 100644
--- a/Documentation/ABI/stable/sysfs-driver-w1_ds2438
+++ b/Documentation/ABI/stable/sysfs-driver-w1_ds2438
@@ -4,3 +4,10 @@ Contact:   Luiz Sampaio 
 Description:   read the contents of the page1 of the DS2438
see Documentation/w1/slaves/w1_ds2438.rst for detailed 
information
 Users: any user space application which wants to communicate with 
DS2438
+
+What:  /sys/bus/w1/devices/.../offset
+Date:  April 2021
+Contact:   Luiz Sampaio 
+Description:   write the contents to the offset register of the DS2438
+   see Documentation/w1/slaves/w1_ds2438.rst for detailed 
information
+Users: any user space application which wants to communicate with 
DS2438
diff --git a/Documentation/w1/slaves/w1_ds2438.rst 
b/Documentation/w1/slaves/w1_ds2438.rst
index ac8d0d4b0d0e..5c5573991351 100644
--- a/Documentation/w1/slaves/w1_ds2438.rst
+++ b/Documentation/w1/slaves/w1_ds2438.rst
@@ -22,7 +22,7 @@ is also often used in weather stations and applications such 
as: rain gauge,
 wind speed/direction measuring, humidity sensing, etc.
 
 Current support is provided through the following sysfs files (all files
-except "iad" are readonly):
+except "iad" and "offset" are readonly):
 
 "iad"
 -
@@ -52,6 +52,15 @@ Internally when this file is read, the additional CRC byte 
is also obtained
 from the slave device. If it is correct, the 8 bytes page data are passed
 to userspace, otherwise an I/O error is returned.
 
+"offset"
+---
+This file controls the 2-byte Offset Register of the chip.
+Writing a 2-byte value will change the Offset Register, which changes the
+current measurement done by the chip. Changing this register to the two's 
complement
+of the current register while forcing zero current through the load will 
calibrate
+the chip, canceling offset errors in the current ADC.
+
+
 "temperature"
 -
 Opening and reading this file initiates the CONVERT_T (temperature conversion)
diff --git a/drivers/w1/slaves/w1_ds2438.c b/drivers/w1/slaves/w1_ds2438.c
index 42080ae779f0..9c39bd6f5fcc 100644
--- a/drivers/w1/slaves/w1_ds2438.c
+++ b/drivers/w1/slaves/w1_ds2438.c
@@ -193,6 +193,34 @@ static int w1_ds2438_change_config_bit(struct w1_slave 
*sl, u8 mask, u8 value)
return -1;
 }
 
+static int w1_ds2438_change_offset_register(struct w1_slave *sl, u8 *value)
+{
+   unsigned int retries = W1_DS2438_RETRIES;
+   u8 w1_buf[9];
+   u8 w1_page1_buf[DS2438_PAGE_SIZE + 1 /*for CRC*/];
+
+   if (w1_ds2438_get_page(sl, 1, w1_page1_buf) == 0) {
+   memcpy(&w1_buf[2], w1_page1_buf, DS2438_PAGE_SIZE - 1); /* last 
register reserved */
+   w1_buf[7] = value[0]; /* change only offset register */
+   w1_buf[8] = value[1];
+   while (retries--) {
+   if (w1_reset_select_slave(sl))
+   continue;
+   w1_buf[0] = W1_DS2438_WRITE_SCRATCH;
+   w1_buf[1] = 0x01; /* write to page 1 */
+   w1_write_block(sl->master, w1_buf, 9);
+
+   if (w1_reset_select_slave(sl))
+   continue;
+   w1_buf[0] = W1_DS2438_COPY_SCRATCH;
+   w1_buf[1] = 0x01;
+   w1_write_block(sl->master, w1_buf, 2);
+   return 0;
+   }
+   }
+   return -1;
+}
+
 static int w1_ds2438_get_voltage(struct w1_slave *sl,
 int adc_input, uint16_t *voltage)
 {
@@ -364,6 +392,25 @@ static ssize_t page1_read(struct file *filp, struct 
kobject *kobj,
return ret;
 }
 
+static ssize_t offset_write(struct file *filp, struct kobject *kobj,
+   struct bin_attribute *bin_attr, char *buf,
+   loff_t off, size_t count)
+{
+   struct w1_slave *sl = kobj_to_w1_slave(kobj);
+   int ret;
+
+   mutex_lock(&sl->master->bus_mutex);
+
+   if (w1_ds2438_change_offset_r