diff --git a/ina260.c b/ina260.c index 55457c5..2d26937 100644 --- a/ina260.c +++ b/ina260.c @@ -215,32 +215,36 @@ static ssize_t attr_field_show(struct kobject *_kobj, static int ina260_write_field3(struct client_data *cdata, unsigned char reg, unsigned char n, int value3bits){ int mask, value; - if(value3bits>=0 && value3bits <8){ - if(ina260_read_register(cdata,reg,&value)) - return 1; - mask=~(0x7 << n); - value &= mask; // clear bits - value |= value3bits << n; - if(ina260_write_register(cdata,reg,value)) - return 1; - return 0; - } - return -EINVAL; + if(!(value3bits>=0 && value3bits <8)) + return -EINVAL; + // Fetch register value: + if(ina260_read_register(cdata,reg,&value)) + return 1; + // Write bits: + mask=~(0x7 << n); + value &= mask; // clear bits + value |= value3bits << n; + // Write register value: + if(ina260_write_register(cdata,reg,value)) + return 1; + return 0; } static int ina260_write_field1(struct client_data *cdata, unsigned char reg, unsigned char n, int bit){ int mask, value; - if(bit==0 || bit == 1){ - if(ina260_read_register(cdata,reg,&value)) - return 1; - mask=~(1<< n); - value &= mask; // clear bits - value |= bit << n; - if(ina260_write_register(cdata,reg,value)) - return 1; - return 0; - } - return -EINVAL; + if(!(bit==0 || bit == 1)) + return -EINVAL; + // Fetch register value: + if(ina260_read_register(cdata,reg,&value)) + return 1; + // Set bit: + mask=~(1<< n); + value &= mask; // clear bit + value |= bit << n; + // Write register value + if(ina260_write_register(cdata,reg,value)) + return 1; + return 0; } static ssize_t attr_field_store(struct kobject *_kobj, @@ -248,52 +252,40 @@ static ssize_t attr_field_store(struct kobject *_kobj, const char *buf, size_t count) { struct client_data *cdata=container_of(_kobj,struct client_data,kobj); - int data=0; + int data=0, ret=count; unsigned char reg=INA260_REG_CONFIGURATION; + // Extract user supplied value if(kstrtoint(buf, 10,&data)) return -EINVAL; + // Store: if(INA260_IS_ATTR(reset) && data!=0){ - if(ina260_write_register(cdata, reg, 0xFFFF)) - return -1; + ret=ina260_write_register(cdata, reg, 0xFFFF); } else if(INA260_IS_ATTR(avg)){ - if(ina260_write_field3(cdata,reg,9,data)) - return -EINVAL; + ret=ina260_write_field3(cdata,reg,9,data); } else if(INA260_IS_ATTR(mode)){ - if(ina260_write_field3(cdata,reg,0,data)) - return -EINVAL; + ret=ina260_write_field3(cdata,reg,0,data); } else if(INA260_IS_ATTR(ishct)){ - if(ina260_write_field3(cdata,reg,3,data)) - return -EINVAL; + ret=ina260_write_field3(cdata,reg,3,data); } else if(INA260_IS_ATTR(vbusct)){ - if(ina260_write_field3(cdata,reg,6,data)) - return -EINVAL; + ret=ina260_write_field3(cdata,reg,6,data); } else if(INA260_IS_ATTR(ocl)){ - if(ina260_write_field1(cdata,reg,15,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,15,data); } else if(INA260_IS_ATTR(ucl)){ - if(ina260_write_field1(cdata,reg,14,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,14,data); } else if(INA260_IS_ATTR(bol)){ - if(ina260_write_field1(cdata,reg,13,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,13,data); } else if(INA260_IS_ATTR(bul)){ - if(ina260_write_field1(cdata,reg,12,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,12,data); } else if(INA260_IS_ATTR(pol)){ - if(ina260_write_field1(cdata,reg,11,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,11,data); } else if(INA260_IS_ATTR(cnvr)){ - if(ina260_write_field1(cdata,reg,10,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,10,data); } else if(INA260_IS_ATTR(apol)){ - if(ina260_write_field1(cdata,reg,1,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,1,data); } else if(INA260_IS_ATTR(len)){ - if(ina260_write_field1(cdata,reg,0,data)) - return -EINVAL; + ret=ina260_write_field1(cdata,reg,0,data); } - - return count; + return ret ? ret: count; } @@ -472,4 +464,4 @@ module_exit(ina260_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Loïc Guegan"); MODULE_DESCRIPTION("INA260 Texas Instruments"); -MODULE_VERSION("1.0"); \ No newline at end of file +MODULE_VERSION("1.0");