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