cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

st_pressure_core.c (18194B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * STMicroelectronics pressures driver
      4 *
      5 * Copyright 2013 STMicroelectronics Inc.
      6 *
      7 * Denis Ciocca <denis.ciocca@st.com>
      8 */
      9
     10#include <linux/kernel.h>
     11#include <linux/module.h>
     12#include <linux/mutex.h>
     13#include <linux/sysfs.h>
     14#include <linux/iio/iio.h>
     15#include <linux/iio/sysfs.h>
     16#include <linux/iio/trigger.h>
     17#include <asm/unaligned.h>
     18
     19#include <linux/iio/common/st_sensors.h>
     20#include "st_pressure.h"
     21
     22/*
     23 * About determining pressure scaling factors
     24 * ------------------------------------------
     25 *
     26 * Datasheets specify typical pressure sensitivity so that pressure is computed
     27 * according to the following equation :
     28 *     pressure[mBar] = raw / sensitivity
     29 * where :
     30 *     raw          the 24 bits long raw sampled pressure
     31 *     sensitivity  a scaling factor specified by the datasheet in LSB/mBar
     32 *
     33 * IIO ABI expects pressure to be expressed as kPascal, hence pressure should be
     34 * computed according to :
     35 *     pressure[kPascal] = pressure[mBar] / 10
     36 *                       = raw / (sensitivity * 10)                          (1)
     37 *
     38 * Finally, st_press_read_raw() returns pressure scaling factor as an
     39 * IIO_VAL_INT_PLUS_NANO with a zero integral part and "gain" as decimal part.
     40 * Therefore, from (1), "gain" becomes :
     41 *     gain = 10^9 / (sensitivity * 10)
     42 *          = 10^8 / sensitivity
     43 *
     44 * About determining temperature scaling factors and offsets
     45 * ---------------------------------------------------------
     46 *
     47 * Datasheets specify typical temperature sensitivity and offset so that
     48 * temperature is computed according to the following equation :
     49 *     temp[Celsius] = offset[Celsius] + (raw / sensitivity)
     50 * where :
     51 *     raw          the 16 bits long raw sampled temperature
     52 *     offset       a constant specified by the datasheet in degree Celsius
     53 *                  (sometimes zero)
     54 *     sensitivity  a scaling factor specified by the datasheet in LSB/Celsius
     55 *
     56 * IIO ABI expects temperature to be expressed as milli degree Celsius such as
     57 * user space should compute temperature according to :
     58 *     temp[mCelsius] = temp[Celsius] * 10^3
     59 *                    = (offset[Celsius] + (raw / sensitivity)) * 10^3
     60 *                    = ((offset[Celsius] * sensitivity) + raw) *
     61 *                      (10^3 / sensitivity)                                 (2)
     62 *
     63 * IIO ABI expects user space to apply offset and scaling factors to raw samples
     64 * according to :
     65 *     temp[mCelsius] = (OFFSET + raw) * SCALE
     66 * where :
     67 *     OFFSET an arbitrary constant exposed by device
     68 *     SCALE  an arbitrary scaling factor exposed by device
     69 *
     70 * Matching OFFSET and SCALE with members of (2) gives :
     71 *     OFFSET = offset[Celsius] * sensitivity                                (3)
     72 *     SCALE  = 10^3 / sensitivity                                           (4)
     73 *
     74 * st_press_read_raw() returns temperature scaling factor as an
     75 * IIO_VAL_FRACTIONAL with a 10^3 numerator and "gain2" as denominator.
     76 * Therefore, from (3), "gain2" becomes :
     77 *     gain2 = sensitivity
     78 *
     79 * When declared within channel, i.e. for a non zero specified offset,
     80 * st_press_read_raw() will return the latter as an IIO_VAL_FRACTIONAL such as :
     81 *     numerator = OFFSET * 10^3
     82 *     denominator = 10^3
     83 * giving from (4):
     84 *     numerator = offset[Celsius] * 10^3 * sensitivity
     85 *               = offset[mCelsius] * gain2
     86 */
     87
     88#define MCELSIUS_PER_CELSIUS			1000
     89
     90/* Default pressure sensitivity */
     91#define ST_PRESS_LSB_PER_MBAR			4096UL
     92#define ST_PRESS_KPASCAL_NANO_SCALE		(100000000UL / \
     93						 ST_PRESS_LSB_PER_MBAR)
     94
     95/* Default temperature sensitivity */
     96#define ST_PRESS_LSB_PER_CELSIUS		480UL
     97#define ST_PRESS_MILLI_CELSIUS_OFFSET		42500UL
     98
     99/* FULLSCALE */
    100#define ST_PRESS_FS_AVL_1100MB			1100
    101#define ST_PRESS_FS_AVL_1260MB			1260
    102
    103#define ST_PRESS_1_OUT_XL_ADDR			0x28
    104#define ST_TEMP_1_OUT_L_ADDR			0x2b
    105
    106/* LPS001WP pressure resolution */
    107#define ST_PRESS_LPS001WP_LSB_PER_MBAR		16UL
    108/* LPS001WP temperature resolution */
    109#define ST_PRESS_LPS001WP_LSB_PER_CELSIUS	64UL
    110/* LPS001WP pressure gain */
    111#define ST_PRESS_LPS001WP_FS_AVL_PRESS_GAIN \
    112	(100000000UL / ST_PRESS_LPS001WP_LSB_PER_MBAR)
    113/* LPS001WP pressure and temp L addresses */
    114#define ST_PRESS_LPS001WP_OUT_L_ADDR		0x28
    115#define ST_TEMP_LPS001WP_OUT_L_ADDR		0x2a
    116
    117/* LPS25H pressure and temp L addresses */
    118#define ST_PRESS_LPS25H_OUT_XL_ADDR		0x28
    119#define ST_TEMP_LPS25H_OUT_L_ADDR		0x2b
    120
    121/* LPS22HB temperature sensitivity */
    122#define ST_PRESS_LPS22HB_LSB_PER_CELSIUS	100UL
    123
    124static const struct iio_chan_spec st_press_1_channels[] = {
    125	{
    126		.type = IIO_PRESSURE,
    127		.address = ST_PRESS_1_OUT_XL_ADDR,
    128		.scan_index = 0,
    129		.scan_type = {
    130			.sign = 's',
    131			.realbits = 24,
    132			.storagebits = 32,
    133			.endianness = IIO_LE,
    134		},
    135		.info_mask_separate =
    136			BIT(IIO_CHAN_INFO_RAW) | BIT(IIO_CHAN_INFO_SCALE),
    137		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
    138	},
    139	{
    140		.type = IIO_TEMP,
    141		.address = ST_TEMP_1_OUT_L_ADDR,
    142		.scan_index = 1,
    143		.scan_type = {
    144			.sign = 's',
    145			.realbits = 16,
    146			.storagebits = 16,
    147			.endianness = IIO_LE,
    148		},
    149		.info_mask_separate =
    150			BIT(IIO_CHAN_INFO_RAW) |
    151			BIT(IIO_CHAN_INFO_SCALE) |
    152			BIT(IIO_CHAN_INFO_OFFSET),
    153		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
    154	},
    155	IIO_CHAN_SOFT_TIMESTAMP(2)
    156};
    157
    158static const struct iio_chan_spec st_press_lps001wp_channels[] = {
    159	{
    160		.type = IIO_PRESSURE,
    161		.address = ST_PRESS_LPS001WP_OUT_L_ADDR,
    162		.scan_index = 0,
    163		.scan_type = {
    164			.sign = 's',
    165			.realbits = 16,
    166			.storagebits = 16,
    167			.endianness = IIO_LE,
    168		},
    169		.info_mask_separate =
    170			BIT(IIO_CHAN_INFO_RAW) |
    171			BIT(IIO_CHAN_INFO_SCALE),
    172	},
    173	{
    174		.type = IIO_TEMP,
    175		.address = ST_TEMP_LPS001WP_OUT_L_ADDR,
    176		.scan_index = 1,
    177		.scan_type = {
    178			.sign = 's',
    179			.realbits = 16,
    180			.storagebits = 16,
    181			.endianness = IIO_LE,
    182		},
    183		.info_mask_separate =
    184			BIT(IIO_CHAN_INFO_RAW) |
    185			BIT(IIO_CHAN_INFO_SCALE),
    186	},
    187	IIO_CHAN_SOFT_TIMESTAMP(2)
    188};
    189
    190static const struct iio_chan_spec st_press_lps22hb_channels[] = {
    191	{
    192		.type = IIO_PRESSURE,
    193		.address = ST_PRESS_1_OUT_XL_ADDR,
    194		.scan_index = 0,
    195		.scan_type = {
    196			.sign = 's',
    197			.realbits = 24,
    198			.storagebits = 32,
    199			.endianness = IIO_LE,
    200		},
    201		.info_mask_separate =
    202			BIT(IIO_CHAN_INFO_RAW) |
    203			BIT(IIO_CHAN_INFO_SCALE),
    204		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
    205	},
    206	{
    207		.type = IIO_TEMP,
    208		.address = ST_TEMP_1_OUT_L_ADDR,
    209		.scan_index = 1,
    210		.scan_type = {
    211			.sign = 's',
    212			.realbits = 16,
    213			.storagebits = 16,
    214			.endianness = IIO_LE,
    215		},
    216		.info_mask_separate =
    217			BIT(IIO_CHAN_INFO_RAW) |
    218			BIT(IIO_CHAN_INFO_SCALE),
    219		.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SAMP_FREQ),
    220	},
    221	IIO_CHAN_SOFT_TIMESTAMP(2)
    222};
    223
    224static const struct st_sensor_settings st_press_sensors_settings[] = {
    225	{
    226		/*
    227		 * CUSTOM VALUES FOR LPS331AP SENSOR
    228		 * See LPS331AP datasheet:
    229		 * http://www2.st.com/resource/en/datasheet/lps331ap.pdf
    230		 */
    231		.wai = 0xbb,
    232		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
    233		.sensors_supported = {
    234			[0] = LPS331AP_PRESS_DEV_NAME,
    235		},
    236		.ch = (struct iio_chan_spec *)st_press_1_channels,
    237		.num_ch = ARRAY_SIZE(st_press_1_channels),
    238		.odr = {
    239			.addr = 0x20,
    240			.mask = 0x70,
    241			.odr_avl = {
    242				{ .hz = 1, .value = 0x01 },
    243				{ .hz = 7, .value = 0x05 },
    244				{ .hz = 13, .value = 0x06 },
    245				{ .hz = 25, .value = 0x07 },
    246			},
    247		},
    248		.pw = {
    249			.addr = 0x20,
    250			.mask = 0x80,
    251			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
    252			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
    253		},
    254		.fs = {
    255			.addr = 0x23,
    256			.mask = 0x30,
    257			.fs_avl = {
    258				/*
    259				 * Pressure and temperature sensitivity values
    260				 * as defined in table 3 of LPS331AP datasheet.
    261				 */
    262				[0] = {
    263					.num = ST_PRESS_FS_AVL_1260MB,
    264					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
    265					.gain2 = ST_PRESS_LSB_PER_CELSIUS,
    266				},
    267			},
    268		},
    269		.bdu = {
    270			.addr = 0x20,
    271			.mask = 0x04,
    272		},
    273		.drdy_irq = {
    274			.int1 = {
    275				.addr = 0x22,
    276				.mask = 0x04,
    277				.addr_od = 0x22,
    278				.mask_od = 0x40,
    279			},
    280			.int2 = {
    281				.addr = 0x22,
    282				.mask = 0x20,
    283				.addr_od = 0x22,
    284				.mask_od = 0x40,
    285			},
    286			.addr_ihl = 0x22,
    287			.mask_ihl = 0x80,
    288			.stat_drdy = {
    289				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
    290				.mask = 0x03,
    291			},
    292		},
    293		.sim = {
    294			.addr = 0x20,
    295			.value = BIT(0),
    296		},
    297		.multi_read_bit = true,
    298		.bootime = 2,
    299	},
    300	{
    301		/*
    302		 * CUSTOM VALUES FOR LPS001WP SENSOR
    303		 */
    304		.wai = 0xba,
    305		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
    306		.sensors_supported = {
    307			[0] = LPS001WP_PRESS_DEV_NAME,
    308		},
    309		.ch = (struct iio_chan_spec *)st_press_lps001wp_channels,
    310		.num_ch = ARRAY_SIZE(st_press_lps001wp_channels),
    311		.odr = {
    312			.addr = 0x20,
    313			.mask = 0x30,
    314			.odr_avl = {
    315				{ .hz = 1, .value = 0x01 },
    316				{ .hz = 7, .value = 0x02 },
    317				{ .hz = 13, .value = 0x03 },
    318			},
    319		},
    320		.pw = {
    321			.addr = 0x20,
    322			.mask = 0x40,
    323			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
    324			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
    325		},
    326		.fs = {
    327			.fs_avl = {
    328				/*
    329				 * Pressure and temperature resolution values
    330				 * as defined in table 3 of LPS001WP datasheet.
    331				 */
    332				[0] = {
    333					.num = ST_PRESS_FS_AVL_1100MB,
    334					.gain = ST_PRESS_LPS001WP_FS_AVL_PRESS_GAIN,
    335					.gain2 = ST_PRESS_LPS001WP_LSB_PER_CELSIUS,
    336				},
    337			},
    338		},
    339		.bdu = {
    340			.addr = 0x20,
    341			.mask = 0x04,
    342		},
    343		.sim = {
    344			.addr = 0x20,
    345			.value = BIT(0),
    346		},
    347		.multi_read_bit = true,
    348		.bootime = 2,
    349	},
    350	{
    351		/*
    352		 * CUSTOM VALUES FOR LPS25H SENSOR
    353		 * See LPS25H datasheet:
    354		 * http://www2.st.com/resource/en/datasheet/lps25h.pdf
    355		 */
    356		.wai = 0xbd,
    357		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
    358		.sensors_supported = {
    359			[0] = LPS25H_PRESS_DEV_NAME,
    360		},
    361		.ch = (struct iio_chan_spec *)st_press_1_channels,
    362		.num_ch = ARRAY_SIZE(st_press_1_channels),
    363		.odr = {
    364			.addr = 0x20,
    365			.mask = 0x70,
    366			.odr_avl = {
    367				{ .hz = 1, .value = 0x01 },
    368				{ .hz = 7, .value = 0x02 },
    369				{ .hz = 13, .value = 0x03 },
    370				{ .hz = 25, .value = 0x04 },
    371			},
    372		},
    373		.pw = {
    374			.addr = 0x20,
    375			.mask = 0x80,
    376			.value_on = ST_SENSORS_DEFAULT_POWER_ON_VALUE,
    377			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
    378		},
    379		.fs = {
    380			.fs_avl = {
    381				/*
    382				 * Pressure and temperature sensitivity values
    383				 * as defined in table 3 of LPS25H datasheet.
    384				 */
    385				[0] = {
    386					.num = ST_PRESS_FS_AVL_1260MB,
    387					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
    388					.gain2 = ST_PRESS_LSB_PER_CELSIUS,
    389				},
    390			},
    391		},
    392		.bdu = {
    393			.addr = 0x20,
    394			.mask = 0x04,
    395		},
    396		.drdy_irq = {
    397			.int1 = {
    398				.addr = 0x23,
    399				.mask = 0x01,
    400				.addr_od = 0x22,
    401				.mask_od = 0x40,
    402			},
    403			.addr_ihl = 0x22,
    404			.mask_ihl = 0x80,
    405			.stat_drdy = {
    406				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
    407				.mask = 0x03,
    408			},
    409		},
    410		.sim = {
    411			.addr = 0x20,
    412			.value = BIT(0),
    413		},
    414		.multi_read_bit = true,
    415		.bootime = 2,
    416	},
    417	{
    418		/*
    419		 * CUSTOM VALUES FOR LPS22HB SENSOR
    420		 * See LPS22HB datasheet:
    421		 * http://www2.st.com/resource/en/datasheet/lps22hb.pdf
    422		 */
    423		.wai = 0xb1,
    424		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
    425		.sensors_supported = {
    426			[0] = LPS22HB_PRESS_DEV_NAME,
    427			[1] = LPS33HW_PRESS_DEV_NAME,
    428			[2] = LPS35HW_PRESS_DEV_NAME,
    429		},
    430		.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
    431		.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
    432		.odr = {
    433			.addr = 0x10,
    434			.mask = 0x70,
    435			.odr_avl = {
    436				{ .hz = 1, .value = 0x01 },
    437				{ .hz = 10, .value = 0x02 },
    438				{ .hz = 25, .value = 0x03 },
    439				{ .hz = 50, .value = 0x04 },
    440				{ .hz = 75, .value = 0x05 },
    441			},
    442		},
    443		.pw = {
    444			.addr = 0x10,
    445			.mask = 0x70,
    446			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
    447		},
    448		.fs = {
    449			.fs_avl = {
    450				/*
    451				 * Pressure and temperature sensitivity values
    452				 * as defined in table 3 of LPS22HB datasheet.
    453				 */
    454				[0] = {
    455					.num = ST_PRESS_FS_AVL_1260MB,
    456					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
    457					.gain2 = ST_PRESS_LPS22HB_LSB_PER_CELSIUS,
    458				},
    459			},
    460		},
    461		.bdu = {
    462			.addr = 0x10,
    463			.mask = 0x02,
    464		},
    465		.drdy_irq = {
    466			.int1 = {
    467				.addr = 0x12,
    468				.mask = 0x04,
    469				.addr_od = 0x12,
    470				.mask_od = 0x40,
    471			},
    472			.addr_ihl = 0x12,
    473			.mask_ihl = 0x80,
    474			.stat_drdy = {
    475				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
    476				.mask = 0x03,
    477			},
    478		},
    479		.sim = {
    480			.addr = 0x10,
    481			.value = BIT(0),
    482		},
    483		.multi_read_bit = false,
    484		.bootime = 2,
    485	},
    486	{
    487		/*
    488		 * CUSTOM VALUES FOR LPS22HH SENSOR
    489		 * See LPS22HH datasheet:
    490		 * http://www2.st.com/resource/en/datasheet/lps22hh.pdf
    491		 */
    492		.wai = 0xb3,
    493		.wai_addr = ST_SENSORS_DEFAULT_WAI_ADDRESS,
    494		.sensors_supported = {
    495			[0] = LPS22HH_PRESS_DEV_NAME,
    496		},
    497		.ch = (struct iio_chan_spec *)st_press_lps22hb_channels,
    498		.num_ch = ARRAY_SIZE(st_press_lps22hb_channels),
    499		.odr = {
    500			.addr = 0x10,
    501			.mask = 0x70,
    502			.odr_avl = {
    503				{ .hz = 1, .value = 0x01 },
    504				{ .hz = 10, .value = 0x02 },
    505				{ .hz = 25, .value = 0x03 },
    506				{ .hz = 50, .value = 0x04 },
    507				{ .hz = 75, .value = 0x05 },
    508				{ .hz = 100, .value = 0x06 },
    509				{ .hz = 200, .value = 0x07 },
    510			},
    511		},
    512		.pw = {
    513			.addr = 0x10,
    514			.mask = 0x70,
    515			.value_off = ST_SENSORS_DEFAULT_POWER_OFF_VALUE,
    516		},
    517		.fs = {
    518			.fs_avl = {
    519				/*
    520				 * Pressure and temperature sensitivity values
    521				 * as defined in table 3 of LPS22HH datasheet.
    522				 */
    523				[0] = {
    524					.num = ST_PRESS_FS_AVL_1260MB,
    525					.gain = ST_PRESS_KPASCAL_NANO_SCALE,
    526					.gain2 = ST_PRESS_LPS22HB_LSB_PER_CELSIUS,
    527				},
    528			},
    529		},
    530		.bdu = {
    531			.addr = 0x10,
    532			.mask = BIT(1),
    533		},
    534		.drdy_irq = {
    535			.int1 = {
    536				.addr = 0x12,
    537				.mask = BIT(2),
    538				.addr_od = 0x11,
    539				.mask_od = BIT(5),
    540			},
    541			.addr_ihl = 0x11,
    542			.mask_ihl = BIT(6),
    543			.stat_drdy = {
    544				.addr = ST_SENSORS_DEFAULT_STAT_ADDR,
    545				.mask = 0x03,
    546			},
    547		},
    548		.sim = {
    549			.addr = 0x10,
    550			.value = BIT(0),
    551		},
    552		.multi_read_bit = false,
    553		.bootime = 2,
    554	},
    555};
    556
    557static int st_press_write_raw(struct iio_dev *indio_dev,
    558			      struct iio_chan_spec const *ch,
    559			      int val,
    560			      int val2,
    561			      long mask)
    562{
    563	switch (mask) {
    564	case IIO_CHAN_INFO_SAMP_FREQ:
    565		if (val2)
    566			return -EINVAL;
    567
    568		return st_sensors_set_odr(indio_dev, val);
    569	default:
    570		return -EINVAL;
    571	}
    572}
    573
    574static int st_press_read_raw(struct iio_dev *indio_dev,
    575			struct iio_chan_spec const *ch, int *val,
    576							int *val2, long mask)
    577{
    578	int err;
    579	struct st_sensor_data *press_data = iio_priv(indio_dev);
    580
    581	switch (mask) {
    582	case IIO_CHAN_INFO_RAW:
    583		err = st_sensors_read_info_raw(indio_dev, ch, val);
    584		if (err < 0)
    585			goto read_error;
    586
    587		return IIO_VAL_INT;
    588	case IIO_CHAN_INFO_SCALE:
    589		switch (ch->type) {
    590		case IIO_PRESSURE:
    591			*val = 0;
    592			*val2 = press_data->current_fullscale->gain;
    593			return IIO_VAL_INT_PLUS_NANO;
    594		case IIO_TEMP:
    595			*val = MCELSIUS_PER_CELSIUS;
    596			*val2 = press_data->current_fullscale->gain2;
    597			return IIO_VAL_FRACTIONAL;
    598		default:
    599			err = -EINVAL;
    600			goto read_error;
    601		}
    602
    603	case IIO_CHAN_INFO_OFFSET:
    604		switch (ch->type) {
    605		case IIO_TEMP:
    606			*val = ST_PRESS_MILLI_CELSIUS_OFFSET *
    607			       press_data->current_fullscale->gain2;
    608			*val2 = MCELSIUS_PER_CELSIUS;
    609			break;
    610		default:
    611			err = -EINVAL;
    612			goto read_error;
    613		}
    614
    615		return IIO_VAL_FRACTIONAL;
    616	case IIO_CHAN_INFO_SAMP_FREQ:
    617		*val = press_data->odr;
    618		return IIO_VAL_INT;
    619	default:
    620		return -EINVAL;
    621	}
    622
    623read_error:
    624	return err;
    625}
    626
    627static ST_SENSORS_DEV_ATTR_SAMP_FREQ_AVAIL();
    628
    629static struct attribute *st_press_attributes[] = {
    630	&iio_dev_attr_sampling_frequency_available.dev_attr.attr,
    631	NULL,
    632};
    633
    634static const struct attribute_group st_press_attribute_group = {
    635	.attrs = st_press_attributes,
    636};
    637
    638static const struct iio_info press_info = {
    639	.attrs = &st_press_attribute_group,
    640	.read_raw = &st_press_read_raw,
    641	.write_raw = &st_press_write_raw,
    642	.debugfs_reg_access = &st_sensors_debugfs_reg_access,
    643};
    644
    645#ifdef CONFIG_IIO_TRIGGER
    646static const struct iio_trigger_ops st_press_trigger_ops = {
    647	.set_trigger_state = ST_PRESS_TRIGGER_SET_STATE,
    648	.validate_device = st_sensors_validate_device,
    649};
    650#define ST_PRESS_TRIGGER_OPS (&st_press_trigger_ops)
    651#else
    652#define ST_PRESS_TRIGGER_OPS NULL
    653#endif
    654
    655/*
    656 * st_press_get_settings() - get sensor settings from device name
    657 * @name: device name buffer reference.
    658 *
    659 * Return: valid reference on success, NULL otherwise.
    660 */
    661const struct st_sensor_settings *st_press_get_settings(const char *name)
    662{
    663	int index = st_sensors_get_settings_index(name,
    664					st_press_sensors_settings,
    665					ARRAY_SIZE(st_press_sensors_settings));
    666	if (index < 0)
    667		return NULL;
    668
    669	return &st_press_sensors_settings[index];
    670}
    671EXPORT_SYMBOL_NS(st_press_get_settings, IIO_ST_SENSORS);
    672
    673int st_press_common_probe(struct iio_dev *indio_dev)
    674{
    675	struct st_sensor_data *press_data = iio_priv(indio_dev);
    676	struct device *parent = indio_dev->dev.parent;
    677	struct st_sensors_platform_data *pdata = dev_get_platdata(parent);
    678	int err;
    679
    680	indio_dev->modes = INDIO_DIRECT_MODE;
    681	indio_dev->info = &press_info;
    682
    683	err = st_sensors_verify_id(indio_dev);
    684	if (err < 0)
    685		return err;
    686
    687	/*
    688	 * Skip timestamping channel while declaring available channels to
    689	 * common st_sensor layer. Look at st_sensors_get_buffer_element() to
    690	 * see how timestamps are explicitly pushed as last samples block
    691	 * element.
    692	 */
    693	press_data->num_data_channels = press_data->sensor_settings->num_ch - 1;
    694	indio_dev->channels = press_data->sensor_settings->ch;
    695	indio_dev->num_channels = press_data->sensor_settings->num_ch;
    696
    697	press_data->current_fullscale = &press_data->sensor_settings->fs.fs_avl[0];
    698
    699	press_data->odr = press_data->sensor_settings->odr.odr_avl[0].hz;
    700
    701	/* Some devices don't support a data ready pin. */
    702	if (!pdata && (press_data->sensor_settings->drdy_irq.int1.addr ||
    703		       press_data->sensor_settings->drdy_irq.int2.addr))
    704		pdata =	(struct st_sensors_platform_data *)&default_press_pdata;
    705
    706	err = st_sensors_init_sensor(indio_dev, pdata);
    707	if (err < 0)
    708		return err;
    709
    710	err = st_press_allocate_ring(indio_dev);
    711	if (err < 0)
    712		return err;
    713
    714	if (press_data->irq > 0) {
    715		err = st_sensors_allocate_trigger(indio_dev,
    716						  ST_PRESS_TRIGGER_OPS);
    717		if (err < 0)
    718			return err;
    719	}
    720
    721	return devm_iio_device_register(parent, indio_dev);
    722}
    723EXPORT_SYMBOL_NS(st_press_common_probe, IIO_ST_SENSORS);
    724
    725MODULE_AUTHOR("Denis Ciocca <denis.ciocca@st.com>");
    726MODULE_DESCRIPTION("STMicroelectronics pressures driver");
    727MODULE_LICENSE("GPL v2");
    728MODULE_IMPORT_NS(IIO_ST_SENSORS);