summaryrefslogtreecommitdiff
path: root/ina260.c
diff options
context:
space:
mode:
Diffstat (limited to 'ina260.c')
-rw-r--r--ina260.c96
1 files changed, 44 insertions, 52 deletions
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");