root/include/linux/iio/common/cros_ec_sensors_core.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   1 /* SPDX-License-Identifier: GPL-2.0-only */
   2 /*
   3  * ChromeOS EC sensor hub
   4  *
   5  * Copyright (C) 2016 Google, Inc
   6  */
   7 
   8 #ifndef __CROS_EC_SENSORS_CORE_H
   9 #define __CROS_EC_SENSORS_CORE_H
  10 
  11 #include <linux/iio/iio.h>
  12 #include <linux/irqreturn.h>
  13 #include <linux/platform_data/cros_ec_commands.h>
  14 #include <linux/platform_data/cros_ec_proto.h>
  15 
  16 enum {
  17         CROS_EC_SENSOR_X,
  18         CROS_EC_SENSOR_Y,
  19         CROS_EC_SENSOR_Z,
  20         CROS_EC_SENSOR_MAX_AXIS,
  21 };
  22 
  23 /* EC returns sensor values using signed 16 bit registers */
  24 #define CROS_EC_SENSOR_BITS 16
  25 
  26 /*
  27  * 4 16 bit channels are allowed.
  28  * Good enough for current sensors, they use up to 3 16 bit vectors.
  29  */
  30 #define CROS_EC_SAMPLE_SIZE  (sizeof(s64) * 2)
  31 
  32 /* Minimum sampling period to use when device is suspending */
  33 #define CROS_EC_MIN_SUSPEND_SAMPLING_FREQUENCY 1000  /* 1 second */
  34 
  35 /**
  36  * struct cros_ec_sensors_core_state - state data for EC sensors IIO driver
  37  * @ec:                         cros EC device structure
  38  * @cmd_lock:                   lock used to prevent simultaneous access to the
  39  *                              commands.
  40  * @msg:                        cros EC command structure
  41  * @param:                      motion sensor parameters structure
  42  * @resp:                       motion sensor response structure
  43  * @type:                       type of motion sensor
  44  * @loc:                        location where the motion sensor is placed
  45  * @calib:                      calibration parameters. Note that trigger
  46  *                              captured data will always provide the calibrated
  47  *                              data
  48  * @samples:                    static array to hold data from a single capture.
  49  *                              For each channel we need 2 bytes, except for
  50  *                              the timestamp. The timestamp is always last and
  51  *                              is always 8-byte aligned.
  52  * @read_ec_sensors_data:       function used for accessing sensors values
  53  * @cuur_sampl_freq:            current sampling period
  54  */
  55 struct cros_ec_sensors_core_state {
  56         struct cros_ec_device *ec;
  57         struct mutex cmd_lock;
  58 
  59         struct cros_ec_command *msg;
  60         struct ec_params_motion_sense param;
  61         struct ec_response_motion_sense *resp;
  62 
  63         enum motionsensor_type type;
  64         enum motionsensor_location loc;
  65 
  66         struct calib_data {
  67                 s16 offset;
  68                 u16 scale;
  69         } calib[CROS_EC_SENSOR_MAX_AXIS];
  70         s8 sign[CROS_EC_SENSOR_MAX_AXIS];
  71         u8 samples[CROS_EC_SAMPLE_SIZE];
  72 
  73         int (*read_ec_sensors_data)(struct iio_dev *indio_dev,
  74                                     unsigned long scan_mask, s16 *data);
  75 
  76         int curr_sampl_freq;
  77 
  78         /* Table of known available frequencies : 0, Min and Max in mHz */
  79         int frequencies[3];
  80 };
  81 
  82 /**
  83  * cros_ec_sensors_read_lpc() - retrieve data from EC shared memory
  84  * @indio_dev:  pointer to IIO device
  85  * @scan_mask:  bitmap of the sensor indices to scan
  86  * @data:       location to store data
  87  *
  88  * This is the safe function for reading the EC data. It guarantees that the
  89  * data sampled was not modified by the EC while being read.
  90  *
  91  * Return: 0 on success, -errno on failure.
  92  */
  93 int cros_ec_sensors_read_lpc(struct iio_dev *indio_dev, unsigned long scan_mask,
  94                              s16 *data);
  95 
  96 /**
  97  * cros_ec_sensors_read_cmd() - retrieve data using the EC command protocol
  98  * @indio_dev:  pointer to IIO device
  99  * @scan_mask:  bitmap of the sensor indices to scan
 100  * @data:       location to store data
 101  *
 102  * Return: 0 on success, -errno on failure.
 103  */
 104 int cros_ec_sensors_read_cmd(struct iio_dev *indio_dev, unsigned long scan_mask,
 105                              s16 *data);
 106 
 107 struct platform_device;
 108 /**
 109  * cros_ec_sensors_core_init() - basic initialization of the core structure
 110  * @pdev:               platform device created for the sensors
 111  * @indio_dev:          iio device structure of the device
 112  * @physical_device:    true if the device refers to a physical device
 113  *
 114  * Return: 0 on success, -errno on failure.
 115  */
 116 int cros_ec_sensors_core_init(struct platform_device *pdev,
 117                               struct iio_dev *indio_dev, bool physical_device);
 118 
 119 /**
 120  * cros_ec_sensors_capture() - the trigger handler function
 121  * @irq:        the interrupt number.
 122  * @p:          a pointer to the poll function.
 123  *
 124  * On a trigger event occurring, if the pollfunc is attached then this
 125  * handler is called as a threaded interrupt (and hence may sleep). It
 126  * is responsible for grabbing data from the device and pushing it into
 127  * the associated buffer.
 128  *
 129  * Return: IRQ_HANDLED
 130  */
 131 irqreturn_t cros_ec_sensors_capture(int irq, void *p);
 132 
 133 /**
 134  * cros_ec_motion_send_host_cmd() - send motion sense host command
 135  * @st:         pointer to state information for device
 136  * @opt_length: optional length to reduce the response size, useful on the data
 137  *              path. Otherwise, the maximal allowed response size is used
 138  *
 139  * When called, the sub-command is assumed to be set in param->cmd.
 140  *
 141  * Return: 0 on success, -errno on failure.
 142  */
 143 int cros_ec_motion_send_host_cmd(struct cros_ec_sensors_core_state *st,
 144                                  u16 opt_length);
 145 
 146 /**
 147  * cros_ec_sensors_core_read() - function to request a value from the sensor
 148  * @st:         pointer to state information for device
 149  * @chan:       channel specification structure table
 150  * @val:        will contain one element making up the returned value
 151  * @val2:       will contain another element making up the returned value
 152  * @mask:       specifies which values to be requested
 153  *
 154  * Return:      the type of value returned by the device
 155  */
 156 int cros_ec_sensors_core_read(struct cros_ec_sensors_core_state *st,
 157                               struct iio_chan_spec const *chan,
 158                               int *val, int *val2, long mask);
 159 
 160 /**
 161  * cros_ec_sensors_core_read_avail() - get available values
 162  * @indio_dev:          pointer to state information for device
 163  * @chan:       channel specification structure table
 164  * @vals:       list of available values
 165  * @type:       type of data returned
 166  * @length:     number of data returned in the array
 167  * @mask:       specifies which values to be requested
 168  *
 169  * Return:      an error code, IIO_AVAIL_RANGE or IIO_AVAIL_LIST
 170  */
 171 int cros_ec_sensors_core_read_avail(struct iio_dev *indio_dev,
 172                                     struct iio_chan_spec const *chan,
 173                                     const int **vals,
 174                                     int *type,
 175                                     int *length,
 176                                     long mask);
 177 
 178 /**
 179  * cros_ec_sensors_core_write() - function to write a value to the sensor
 180  * @st:         pointer to state information for device
 181  * @chan:       channel specification structure table
 182  * @val:        first part of value to write
 183  * @val2:       second part of value to write
 184  * @mask:       specifies which values to write
 185  *
 186  * Return:      the type of value returned by the device
 187  */
 188 int cros_ec_sensors_core_write(struct cros_ec_sensors_core_state *st,
 189                                struct iio_chan_spec const *chan,
 190                                int val, int val2, long mask);
 191 
 192 extern const struct dev_pm_ops cros_ec_sensors_pm_ops;
 193 
 194 /* List of extended channel specification for all sensors */
 195 extern const struct iio_chan_spec_ext_info cros_ec_sensors_ext_info[];
 196 
 197 #endif  /* __CROS_EC_SENSORS_CORE_H */

/* [<][>][^][v][top][bottom][index][help] */