162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * AFE440X Heart Rate Monitors and Low-Cost Pulse Oximeters 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015 Texas Instruments Incorporated - https://www.ti.com/ 662306a36Sopenharmony_ci * Andrew F. Davis <afd@ti.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef _AFE440X_H 1062306a36Sopenharmony_ci#define _AFE440X_H 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci/* AFE440X registers */ 1362306a36Sopenharmony_ci#define AFE440X_CONTROL0 0x00 1462306a36Sopenharmony_ci#define AFE440X_LED2STC 0x01 1562306a36Sopenharmony_ci#define AFE440X_LED2ENDC 0x02 1662306a36Sopenharmony_ci#define AFE440X_LED1LEDSTC 0x03 1762306a36Sopenharmony_ci#define AFE440X_LED1LEDENDC 0x04 1862306a36Sopenharmony_ci#define AFE440X_ALED2STC 0x05 1962306a36Sopenharmony_ci#define AFE440X_ALED2ENDC 0x06 2062306a36Sopenharmony_ci#define AFE440X_LED1STC 0x07 2162306a36Sopenharmony_ci#define AFE440X_LED1ENDC 0x08 2262306a36Sopenharmony_ci#define AFE440X_LED2LEDSTC 0x09 2362306a36Sopenharmony_ci#define AFE440X_LED2LEDENDC 0x0a 2462306a36Sopenharmony_ci#define AFE440X_ALED1STC 0x0b 2562306a36Sopenharmony_ci#define AFE440X_ALED1ENDC 0x0c 2662306a36Sopenharmony_ci#define AFE440X_LED2CONVST 0x0d 2762306a36Sopenharmony_ci#define AFE440X_LED2CONVEND 0x0e 2862306a36Sopenharmony_ci#define AFE440X_ALED2CONVST 0x0f 2962306a36Sopenharmony_ci#define AFE440X_ALED2CONVEND 0x10 3062306a36Sopenharmony_ci#define AFE440X_LED1CONVST 0x11 3162306a36Sopenharmony_ci#define AFE440X_LED1CONVEND 0x12 3262306a36Sopenharmony_ci#define AFE440X_ALED1CONVST 0x13 3362306a36Sopenharmony_ci#define AFE440X_ALED1CONVEND 0x14 3462306a36Sopenharmony_ci#define AFE440X_ADCRSTSTCT0 0x15 3562306a36Sopenharmony_ci#define AFE440X_ADCRSTENDCT0 0x16 3662306a36Sopenharmony_ci#define AFE440X_ADCRSTSTCT1 0x17 3762306a36Sopenharmony_ci#define AFE440X_ADCRSTENDCT1 0x18 3862306a36Sopenharmony_ci#define AFE440X_ADCRSTSTCT2 0x19 3962306a36Sopenharmony_ci#define AFE440X_ADCRSTENDCT2 0x1a 4062306a36Sopenharmony_ci#define AFE440X_ADCRSTSTCT3 0x1b 4162306a36Sopenharmony_ci#define AFE440X_ADCRSTENDCT3 0x1c 4262306a36Sopenharmony_ci#define AFE440X_PRPCOUNT 0x1d 4362306a36Sopenharmony_ci#define AFE440X_CONTROL1 0x1e 4462306a36Sopenharmony_ci#define AFE440X_LEDCNTRL 0x22 4562306a36Sopenharmony_ci#define AFE440X_CONTROL2 0x23 4662306a36Sopenharmony_ci#define AFE440X_ALARM 0x29 4762306a36Sopenharmony_ci#define AFE440X_LED2VAL 0x2a 4862306a36Sopenharmony_ci#define AFE440X_ALED2VAL 0x2b 4962306a36Sopenharmony_ci#define AFE440X_LED1VAL 0x2c 5062306a36Sopenharmony_ci#define AFE440X_ALED1VAL 0x2d 5162306a36Sopenharmony_ci#define AFE440X_LED2_ALED2VAL 0x2e 5262306a36Sopenharmony_ci#define AFE440X_LED1_ALED1VAL 0x2f 5362306a36Sopenharmony_ci#define AFE440X_CONTROL3 0x31 5462306a36Sopenharmony_ci#define AFE440X_PDNCYCLESTC 0x32 5562306a36Sopenharmony_ci#define AFE440X_PDNCYCLEENDC 0x33 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci/* CONTROL0 register fields */ 5862306a36Sopenharmony_ci#define AFE440X_CONTROL0_REG_READ BIT(0) 5962306a36Sopenharmony_ci#define AFE440X_CONTROL0_TM_COUNT_RST BIT(1) 6062306a36Sopenharmony_ci#define AFE440X_CONTROL0_SW_RESET BIT(3) 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci/* CONTROL1 register fields */ 6362306a36Sopenharmony_ci#define AFE440X_CONTROL1_TIMEREN BIT(8) 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci/* TIAGAIN register fields */ 6662306a36Sopenharmony_ci#define AFE440X_TIAGAIN_ENSEPGAIN BIT(15) 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* CONTROL2 register fields */ 6962306a36Sopenharmony_ci#define AFE440X_CONTROL2_PDN_AFE BIT(0) 7062306a36Sopenharmony_ci#define AFE440X_CONTROL2_PDN_RX BIT(1) 7162306a36Sopenharmony_ci#define AFE440X_CONTROL2_DYNAMIC4 BIT(3) 7262306a36Sopenharmony_ci#define AFE440X_CONTROL2_DYNAMIC3 BIT(4) 7362306a36Sopenharmony_ci#define AFE440X_CONTROL2_DYNAMIC2 BIT(14) 7462306a36Sopenharmony_ci#define AFE440X_CONTROL2_DYNAMIC1 BIT(20) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci/* CONTROL3 register fields */ 7762306a36Sopenharmony_ci#define AFE440X_CONTROL3_CLKDIV GENMASK(2, 0) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci/* CONTROL0 values */ 8062306a36Sopenharmony_ci#define AFE440X_CONTROL0_WRITE 0x0 8162306a36Sopenharmony_ci#define AFE440X_CONTROL0_READ 0x1 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_ci#define AFE440X_INTENSITY_CHAN(_index, _mask) \ 8462306a36Sopenharmony_ci { \ 8562306a36Sopenharmony_ci .type = IIO_INTENSITY, \ 8662306a36Sopenharmony_ci .channel = _index, \ 8762306a36Sopenharmony_ci .address = _index, \ 8862306a36Sopenharmony_ci .scan_index = _index, \ 8962306a36Sopenharmony_ci .scan_type = { \ 9062306a36Sopenharmony_ci .sign = 's', \ 9162306a36Sopenharmony_ci .realbits = 24, \ 9262306a36Sopenharmony_ci .storagebits = 32, \ 9362306a36Sopenharmony_ci .endianness = IIO_CPU, \ 9462306a36Sopenharmony_ci }, \ 9562306a36Sopenharmony_ci .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 9662306a36Sopenharmony_ci _mask, \ 9762306a36Sopenharmony_ci .indexed = true, \ 9862306a36Sopenharmony_ci } 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci#define AFE440X_CURRENT_CHAN(_index) \ 10162306a36Sopenharmony_ci { \ 10262306a36Sopenharmony_ci .type = IIO_CURRENT, \ 10362306a36Sopenharmony_ci .channel = _index, \ 10462306a36Sopenharmony_ci .address = _index, \ 10562306a36Sopenharmony_ci .scan_index = -1, \ 10662306a36Sopenharmony_ci .info_mask_separate = BIT(IIO_CHAN_INFO_RAW) | \ 10762306a36Sopenharmony_ci BIT(IIO_CHAN_INFO_SCALE), \ 10862306a36Sopenharmony_ci .indexed = true, \ 10962306a36Sopenharmony_ci .output = true, \ 11062306a36Sopenharmony_ci } 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistruct afe440x_val_table { 11362306a36Sopenharmony_ci int integer; 11462306a36Sopenharmony_ci int fract; 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci#define AFE440X_TABLE_ATTR(_name, _table) \ 11862306a36Sopenharmony_cistatic ssize_t _name ## _show(struct device *dev, \ 11962306a36Sopenharmony_ci struct device_attribute *attr, char *buf) \ 12062306a36Sopenharmony_ci{ \ 12162306a36Sopenharmony_ci ssize_t len = 0; \ 12262306a36Sopenharmony_ci int i; \ 12362306a36Sopenharmony_ci \ 12462306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(_table); i++) \ 12562306a36Sopenharmony_ci len += scnprintf(buf + len, PAGE_SIZE - len, "%d.%06u ", \ 12662306a36Sopenharmony_ci _table[i].integer, \ 12762306a36Sopenharmony_ci _table[i].fract); \ 12862306a36Sopenharmony_ci \ 12962306a36Sopenharmony_ci buf[len - 1] = '\n'; \ 13062306a36Sopenharmony_ci \ 13162306a36Sopenharmony_ci return len; \ 13262306a36Sopenharmony_ci} \ 13362306a36Sopenharmony_cistatic DEVICE_ATTR_RO(_name) 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cistruct afe440x_attr { 13662306a36Sopenharmony_ci struct device_attribute dev_attr; 13762306a36Sopenharmony_ci unsigned int field; 13862306a36Sopenharmony_ci const struct afe440x_val_table *val_table; 13962306a36Sopenharmony_ci unsigned int table_size; 14062306a36Sopenharmony_ci}; 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci#define to_afe440x_attr(_dev_attr) \ 14362306a36Sopenharmony_ci container_of(_dev_attr, struct afe440x_attr, dev_attr) 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_ci#define AFE440X_ATTR(_name, _field, _table) \ 14662306a36Sopenharmony_ci struct afe440x_attr afe440x_attr_##_name = { \ 14762306a36Sopenharmony_ci .dev_attr = __ATTR(_name, (S_IRUGO | S_IWUSR), \ 14862306a36Sopenharmony_ci afe440x_show_register, \ 14962306a36Sopenharmony_ci afe440x_store_register), \ 15062306a36Sopenharmony_ci .field = _field, \ 15162306a36Sopenharmony_ci .val_table = _table, \ 15262306a36Sopenharmony_ci .table_size = ARRAY_SIZE(_table), \ 15362306a36Sopenharmony_ci } 15462306a36Sopenharmony_ci 15562306a36Sopenharmony_ci#endif /* _AFE440X_H */ 156