1*87aec56eSAndrew F. Davis /* 2*87aec56eSAndrew F. Davis * AFE440X Heart Rate Monitors and Low-Cost Pulse Oximeters 3*87aec56eSAndrew F. Davis * 4*87aec56eSAndrew F. Davis * Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com/ 5*87aec56eSAndrew F. Davis * Andrew F. Davis <afd@ti.com> 6*87aec56eSAndrew F. Davis * 7*87aec56eSAndrew F. Davis * This program is free software; you can redistribute it and/or modify 8*87aec56eSAndrew F. Davis * it under the terms of the GNU General Public License version 2 as 9*87aec56eSAndrew F. Davis * published by the Free Software Foundation. 10*87aec56eSAndrew F. Davis * 11*87aec56eSAndrew F. Davis * This program is distributed in the hope that it will be useful, but 12*87aec56eSAndrew F. Davis * WITHOUT ANY WARRANTY; without even the implied warranty of 13*87aec56eSAndrew F. Davis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*87aec56eSAndrew F. Davis * General Public License for more details. 15*87aec56eSAndrew F. Davis */ 16*87aec56eSAndrew F. Davis 17*87aec56eSAndrew F. Davis #ifndef _AFE440X_H 18*87aec56eSAndrew F. Davis #define _AFE440X_H 19*87aec56eSAndrew F. Davis 20*87aec56eSAndrew F. Davis /* AFE440X registers */ 21*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0 0x00 22*87aec56eSAndrew F. Davis #define AFE440X_LED2STC 0x01 23*87aec56eSAndrew F. Davis #define AFE440X_LED2ENDC 0x02 24*87aec56eSAndrew F. Davis #define AFE440X_LED1LEDSTC 0x03 25*87aec56eSAndrew F. Davis #define AFE440X_LED1LEDENDC 0x04 26*87aec56eSAndrew F. Davis #define AFE440X_ALED2STC 0x05 27*87aec56eSAndrew F. Davis #define AFE440X_ALED2ENDC 0x06 28*87aec56eSAndrew F. Davis #define AFE440X_LED1STC 0x07 29*87aec56eSAndrew F. Davis #define AFE440X_LED1ENDC 0x08 30*87aec56eSAndrew F. Davis #define AFE440X_LED2LEDSTC 0x09 31*87aec56eSAndrew F. Davis #define AFE440X_LED2LEDENDC 0x0a 32*87aec56eSAndrew F. Davis #define AFE440X_ALED1STC 0x0b 33*87aec56eSAndrew F. Davis #define AFE440X_ALED1ENDC 0x0c 34*87aec56eSAndrew F. Davis #define AFE440X_LED2CONVST 0x0d 35*87aec56eSAndrew F. Davis #define AFE440X_LED2CONVEND 0x0e 36*87aec56eSAndrew F. Davis #define AFE440X_ALED2CONVST 0x0f 37*87aec56eSAndrew F. Davis #define AFE440X_ALED2CONVEND 0x10 38*87aec56eSAndrew F. Davis #define AFE440X_LED1CONVST 0x11 39*87aec56eSAndrew F. Davis #define AFE440X_LED1CONVEND 0x12 40*87aec56eSAndrew F. Davis #define AFE440X_ALED1CONVST 0x13 41*87aec56eSAndrew F. Davis #define AFE440X_ALED1CONVEND 0x14 42*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTSTCT0 0x15 43*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTENDCT0 0x16 44*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTSTCT1 0x17 45*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTENDCT1 0x18 46*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTSTCT2 0x19 47*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTENDCT2 0x1a 48*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTSTCT3 0x1b 49*87aec56eSAndrew F. Davis #define AFE440X_ADCRSTENDCT3 0x1c 50*87aec56eSAndrew F. Davis #define AFE440X_PRPCOUNT 0x1d 51*87aec56eSAndrew F. Davis #define AFE440X_CONTROL1 0x1e 52*87aec56eSAndrew F. Davis #define AFE440X_LEDCNTRL 0x22 53*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2 0x23 54*87aec56eSAndrew F. Davis #define AFE440X_ALARM 0x29 55*87aec56eSAndrew F. Davis #define AFE440X_LED2VAL 0x2a 56*87aec56eSAndrew F. Davis #define AFE440X_ALED2VAL 0x2b 57*87aec56eSAndrew F. Davis #define AFE440X_LED1VAL 0x2c 58*87aec56eSAndrew F. Davis #define AFE440X_ALED1VAL 0x2d 59*87aec56eSAndrew F. Davis #define AFE440X_LED2_ALED2VAL 0x2e 60*87aec56eSAndrew F. Davis #define AFE440X_LED1_ALED1VAL 0x2f 61*87aec56eSAndrew F. Davis #define AFE440X_CONTROL3 0x31 62*87aec56eSAndrew F. Davis #define AFE440X_PDNCYCLESTC 0x32 63*87aec56eSAndrew F. Davis #define AFE440X_PDNCYCLEENDC 0x33 64*87aec56eSAndrew F. Davis 65*87aec56eSAndrew F. Davis /* CONTROL0 register fields */ 66*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0_REG_READ BIT(0) 67*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0_TM_COUNT_RST BIT(1) 68*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0_SW_RESET BIT(3) 69*87aec56eSAndrew F. Davis 70*87aec56eSAndrew F. Davis /* CONTROL1 register fields */ 71*87aec56eSAndrew F. Davis #define AFE440X_CONTROL1_TIMEREN BIT(8) 72*87aec56eSAndrew F. Davis 73*87aec56eSAndrew F. Davis /* TIAGAIN register fields */ 74*87aec56eSAndrew F. Davis #define AFE440X_TIAGAIN_ENSEPGAIN_MASK BIT(15) 75*87aec56eSAndrew F. Davis #define AFE440X_TIAGAIN_ENSEPGAIN_SHIFT 15 76*87aec56eSAndrew F. Davis 77*87aec56eSAndrew F. Davis /* CONTROL2 register fields */ 78*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_PDN_AFE BIT(0) 79*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_PDN_RX BIT(1) 80*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_DYNAMIC4 BIT(3) 81*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_DYNAMIC3 BIT(4) 82*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_DYNAMIC2 BIT(14) 83*87aec56eSAndrew F. Davis #define AFE440X_CONTROL2_DYNAMIC1 BIT(20) 84*87aec56eSAndrew F. Davis 85*87aec56eSAndrew F. Davis /* CONTROL3 register fields */ 86*87aec56eSAndrew F. Davis #define AFE440X_CONTROL3_CLKDIV GENMASK(2, 0) 87*87aec56eSAndrew F. Davis 88*87aec56eSAndrew F. Davis /* CONTROL0 values */ 89*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0_WRITE 0x0 90*87aec56eSAndrew F. Davis #define AFE440X_CONTROL0_READ 0x1 91*87aec56eSAndrew F. Davis 92*87aec56eSAndrew F. Davis struct afe440x_reg_info { 93*87aec56eSAndrew F. Davis unsigned int reg; 94*87aec56eSAndrew F. Davis unsigned int offreg; 95*87aec56eSAndrew F. Davis unsigned int shift; 96*87aec56eSAndrew F. Davis unsigned int mask; 97*87aec56eSAndrew F. Davis }; 98*87aec56eSAndrew F. Davis 99*87aec56eSAndrew F. Davis #define AFE440X_REG_INFO(_reg, _offreg, _sm) \ 100*87aec56eSAndrew F. Davis { \ 101*87aec56eSAndrew F. Davis .reg = _reg, \ 102*87aec56eSAndrew F. Davis .offreg = _offreg, \ 103*87aec56eSAndrew F. Davis .shift = _sm ## _SHIFT, \ 104*87aec56eSAndrew F. Davis .mask = _sm ## _MASK, \ 105*87aec56eSAndrew F. Davis } 106*87aec56eSAndrew F. Davis 107*87aec56eSAndrew F. Davis #define AFE440X_INTENSITY_CHAN(_index, _name, _mask) \ 108*87aec56eSAndrew F. Davis { \ 109*87aec56eSAndrew F. Davis .type = IIO_INTENSITY, \ 110*87aec56eSAndrew F. Davis .channel = _index, \ 111*87aec56eSAndrew F. Davis .address = _index, \ 112*87aec56eSAndrew F. Davis .scan_index = _index, \ 113*87aec56eSAndrew F. Davis .scan_type = { \ 114*87aec56eSAndrew F. Davis .sign = 's', \ 115*87aec56eSAndrew F. Davis .realbits = 24, \ 116*87aec56eSAndrew F. Davis .storagebits = 32, \ 117*87aec56eSAndrew F. Davis .endianness = IIO_CPU, \ 118*87aec56eSAndrew F. Davis }, \ 119*87aec56eSAndrew F. Davis .extend_name = _name, \ 120*87aec56eSAndrew F. Davis .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 121*87aec56eSAndrew F. Davis _mask, \ 122*87aec56eSAndrew F. Davis } 123*87aec56eSAndrew F. Davis 124*87aec56eSAndrew F. Davis #define AFE440X_CURRENT_CHAN(_index, _name) \ 125*87aec56eSAndrew F. Davis { \ 126*87aec56eSAndrew F. Davis .type = IIO_CURRENT, \ 127*87aec56eSAndrew F. Davis .channel = _index, \ 128*87aec56eSAndrew F. Davis .address = _index, \ 129*87aec56eSAndrew F. Davis .scan_index = _index, \ 130*87aec56eSAndrew F. Davis .extend_name = _name, \ 131*87aec56eSAndrew F. Davis .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 132*87aec56eSAndrew F. Davis BIT(IIO_CHAN_INFO_SCALE), \ 133*87aec56eSAndrew F. Davis .output = true, \ 134*87aec56eSAndrew F. Davis } 135*87aec56eSAndrew F. Davis 136*87aec56eSAndrew F. Davis enum afe440x_reg_type { 137*87aec56eSAndrew F. Davis SIMPLE, 138*87aec56eSAndrew F. Davis RESISTANCE, 139*87aec56eSAndrew F. Davis CAPACITANCE, 140*87aec56eSAndrew F. Davis }; 141*87aec56eSAndrew F. Davis 142*87aec56eSAndrew F. Davis struct afe440x_val_table { 143*87aec56eSAndrew F. Davis int integer; 144*87aec56eSAndrew F. Davis int fract; 145*87aec56eSAndrew F. Davis }; 146*87aec56eSAndrew F. Davis 147*87aec56eSAndrew F. Davis #define AFE440X_TABLE_ATTR(_name, _table) \ 148*87aec56eSAndrew F. Davis static ssize_t _name ## _show(struct device *dev, \ 149*87aec56eSAndrew F. Davis struct device_attribute *attr, char *buf) \ 150*87aec56eSAndrew F. Davis { \ 151*87aec56eSAndrew F. Davis ssize_t len = 0; \ 152*87aec56eSAndrew F. Davis int i; \ 153*87aec56eSAndrew F. Davis \ 154*87aec56eSAndrew F. Davis for (i = 0; i < ARRAY_SIZE(_table); i++) \ 155*87aec56eSAndrew F. Davis len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", \ 156*87aec56eSAndrew F. Davis _table[i].integer, \ 157*87aec56eSAndrew F. Davis _table[i].fract); \ 158*87aec56eSAndrew F. Davis \ 159*87aec56eSAndrew F. Davis buf[len - 1] = '\n'; \ 160*87aec56eSAndrew F. Davis \ 161*87aec56eSAndrew F. Davis return len; \ 162*87aec56eSAndrew F. Davis } \ 163*87aec56eSAndrew F. Davis static DEVICE_ATTR_RO(_name) 164*87aec56eSAndrew F. Davis 165*87aec56eSAndrew F. Davis struct afe440x_attr { 166*87aec56eSAndrew F. Davis struct device_attribute dev_attr; 167*87aec56eSAndrew F. Davis unsigned int reg; 168*87aec56eSAndrew F. Davis unsigned int shift; 169*87aec56eSAndrew F. Davis unsigned int mask; 170*87aec56eSAndrew F. Davis enum afe440x_reg_type type; 171*87aec56eSAndrew F. Davis const struct afe440x_val_table *val_table; 172*87aec56eSAndrew F. Davis unsigned int table_size; 173*87aec56eSAndrew F. Davis }; 174*87aec56eSAndrew F. Davis 175*87aec56eSAndrew F. Davis #define to_afe440x_attr(_dev_attr) \ 176*87aec56eSAndrew F. Davis container_of(_dev_attr, struct afe440x_attr, dev_attr) 177*87aec56eSAndrew F. Davis 178*87aec56eSAndrew F. Davis #define AFE440X_ATTR(_name, _reg, _field, _type, _table, _size) \ 179*87aec56eSAndrew F. Davis struct afe440x_attr afe440x_attr_##_name = { \ 180*87aec56eSAndrew F. Davis .dev_attr = __ATTR(_name, (S_IRUGO | S_IWUSR), \ 181*87aec56eSAndrew F. Davis afe440x_show_register, \ 182*87aec56eSAndrew F. Davis afe440x_store_register), \ 183*87aec56eSAndrew F. Davis .reg = _reg, \ 184*87aec56eSAndrew F. Davis .shift = _field ## _SHIFT, \ 185*87aec56eSAndrew F. Davis .mask = _field ## _MASK, \ 186*87aec56eSAndrew F. Davis .type = _type, \ 187*87aec56eSAndrew F. Davis .val_table = _table, \ 188*87aec56eSAndrew F. Davis .table_size = _size, \ 189*87aec56eSAndrew F. Davis } 190*87aec56eSAndrew F. Davis 191*87aec56eSAndrew F. Davis #endif /* _AFE440X_H */ 192