2016-02-02 11:50:44 -06:00
/*
* AFE440X Heart Rate Monitors and Low - Cost Pulse Oximeters
*
* Copyright ( C ) 2015 Texas Instruments Incorporated - http : //www.ti.com/
* Andrew F . Davis < afd @ ti . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful , but
* WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* General Public License for more details .
*/
# ifndef _AFE440X_H
# define _AFE440X_H
/* AFE440X registers */
# define AFE440X_CONTROL0 0x00
# define AFE440X_LED2STC 0x01
# define AFE440X_LED2ENDC 0x02
# define AFE440X_LED1LEDSTC 0x03
# define AFE440X_LED1LEDENDC 0x04
# define AFE440X_ALED2STC 0x05
# define AFE440X_ALED2ENDC 0x06
# define AFE440X_LED1STC 0x07
# define AFE440X_LED1ENDC 0x08
# define AFE440X_LED2LEDSTC 0x09
# define AFE440X_LED2LEDENDC 0x0a
# define AFE440X_ALED1STC 0x0b
# define AFE440X_ALED1ENDC 0x0c
# define AFE440X_LED2CONVST 0x0d
# define AFE440X_LED2CONVEND 0x0e
# define AFE440X_ALED2CONVST 0x0f
# define AFE440X_ALED2CONVEND 0x10
# define AFE440X_LED1CONVST 0x11
# define AFE440X_LED1CONVEND 0x12
# define AFE440X_ALED1CONVST 0x13
# define AFE440X_ALED1CONVEND 0x14
# define AFE440X_ADCRSTSTCT0 0x15
# define AFE440X_ADCRSTENDCT0 0x16
# define AFE440X_ADCRSTSTCT1 0x17
# define AFE440X_ADCRSTENDCT1 0x18
# define AFE440X_ADCRSTSTCT2 0x19
# define AFE440X_ADCRSTENDCT2 0x1a
# define AFE440X_ADCRSTSTCT3 0x1b
# define AFE440X_ADCRSTENDCT3 0x1c
# define AFE440X_PRPCOUNT 0x1d
# define AFE440X_CONTROL1 0x1e
# define AFE440X_LEDCNTRL 0x22
# define AFE440X_CONTROL2 0x23
# define AFE440X_ALARM 0x29
# define AFE440X_LED2VAL 0x2a
# define AFE440X_ALED2VAL 0x2b
# define AFE440X_LED1VAL 0x2c
# define AFE440X_ALED1VAL 0x2d
# define AFE440X_LED2_ALED2VAL 0x2e
# define AFE440X_LED1_ALED1VAL 0x2f
# define AFE440X_CONTROL3 0x31
# define AFE440X_PDNCYCLESTC 0x32
# define AFE440X_PDNCYCLEENDC 0x33
/* CONTROL0 register fields */
# define AFE440X_CONTROL0_REG_READ BIT(0)
# define AFE440X_CONTROL0_TM_COUNT_RST BIT(1)
# define AFE440X_CONTROL0_SW_RESET BIT(3)
/* CONTROL1 register fields */
# define AFE440X_CONTROL1_TIMEREN BIT(8)
/* TIAGAIN register fields */
2016-05-01 15:36:54 -05:00
# define AFE440X_TIAGAIN_ENSEPGAIN BIT(15)
2016-02-02 11:50:44 -06:00
/* CONTROL2 register fields */
# define AFE440X_CONTROL2_PDN_AFE BIT(0)
# define AFE440X_CONTROL2_PDN_RX BIT(1)
# define AFE440X_CONTROL2_DYNAMIC4 BIT(3)
# define AFE440X_CONTROL2_DYNAMIC3 BIT(4)
# define AFE440X_CONTROL2_DYNAMIC2 BIT(14)
# define AFE440X_CONTROL2_DYNAMIC1 BIT(20)
/* CONTROL3 register fields */
# define AFE440X_CONTROL3_CLKDIV GENMASK(2, 0)
/* CONTROL0 values */
# define AFE440X_CONTROL0_WRITE 0x0
# define AFE440X_CONTROL0_READ 0x1
2016-05-01 15:36:58 -05:00
# define AFE440X_INTENSITY_CHAN(_index, _mask) \
2016-02-02 11:50:44 -06:00
{ \
. type = IIO_INTENSITY , \
. channel = _index , \
. address = _index , \
. scan_index = _index , \
. scan_type = { \
. sign = ' s ' , \
. realbits = 24 , \
. storagebits = 32 , \
. endianness = IIO_CPU , \
} , \
. info_mask_separate = BIT ( IIO_CHAN_INFO_RAW ) | \
_mask , \
2016-05-01 15:36:58 -05:00
. indexed = true , \
2016-02-02 11:50:44 -06:00
}
2016-05-01 15:36:58 -05:00
# define AFE440X_CURRENT_CHAN(_index) \
2016-02-02 11:50:44 -06:00
{ \
. type = IIO_CURRENT , \
. channel = _index , \
. address = _index , \
2016-05-01 15:36:55 -05:00
. scan_index = - 1 , \
2016-02-02 11:50:44 -06:00
. info_mask_separate = BIT ( IIO_CHAN_INFO_RAW ) | \
BIT ( IIO_CHAN_INFO_SCALE ) , \
2016-05-01 15:36:58 -05:00
. indexed = true , \
2016-02-02 11:50:44 -06:00
. output = true , \
}
struct afe440x_val_table {
int integer ;
int fract ;
} ;
# define AFE440X_TABLE_ATTR(_name, _table) \
static ssize_t _name # # _show ( struct device * dev , \
struct device_attribute * attr , char * buf ) \
{ \
ssize_t len = 0 ; \
int i ; \
\
for ( i = 0 ; i < ARRAY_SIZE ( _table ) ; i + + ) \
len + = scnprintf ( buf + len , PAGE_SIZE - len , " %d.%06u " , \
_table [ i ] . integer , \
_table [ i ] . fract ) ; \
\
buf [ len - 1 ] = ' \n ' ; \
\
return len ; \
} \
static DEVICE_ATTR_RO ( _name )
struct afe440x_attr {
struct device_attribute dev_attr ;
2016-05-01 15:36:59 -05:00
unsigned int field ;
2016-02-02 11:50:44 -06:00
const struct afe440x_val_table * val_table ;
unsigned int table_size ;
} ;
# define to_afe440x_attr(_dev_attr) \
container_of ( _dev_attr , struct afe440x_attr , dev_attr )
2016-05-01 15:36:59 -05:00
# define AFE440X_ATTR(_name, _field, _table) \
2016-02-02 11:50:44 -06:00
struct afe440x_attr afe440x_attr_ # # _name = { \
. dev_attr = __ATTR ( _name , ( S_IRUGO | S_IWUSR ) , \
afe440x_show_register , \
afe440x_store_register ) , \
2016-05-01 15:36:59 -05:00
. field = _field , \
2016-02-02 11:50:44 -06:00
. val_table = _table , \
2016-05-01 15:36:54 -05:00
. table_size = ARRAY_SIZE ( _table ) , \
2016-02-02 11:50:44 -06:00
}
# endif /* _AFE440X_H */