1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* The industrial I/O core 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun *Copyright (c) 2008 Jonathan Cameron 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * General attributes 7*4882a593Smuzhiyun */ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #ifndef _INDUSTRIAL_IO_SYSFS_H_ 10*4882a593Smuzhiyun #define _INDUSTRIAL_IO_SYSFS_H_ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun struct iio_chan_spec; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun /** 15*4882a593Smuzhiyun * struct iio_dev_attr - iio specific device attribute 16*4882a593Smuzhiyun * @dev_attr: underlying device attribute 17*4882a593Smuzhiyun * @address: associated register address 18*4882a593Smuzhiyun * @l: list head for maintaining list of dynamically created attrs 19*4882a593Smuzhiyun * @c: specification for the underlying channel 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun struct iio_dev_attr { 22*4882a593Smuzhiyun struct device_attribute dev_attr; 23*4882a593Smuzhiyun u64 address; 24*4882a593Smuzhiyun struct list_head l; 25*4882a593Smuzhiyun struct iio_chan_spec const *c; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun #define to_iio_dev_attr(_dev_attr) \ 29*4882a593Smuzhiyun container_of(_dev_attr, struct iio_dev_attr, dev_attr) 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun ssize_t iio_read_const_attr(struct device *dev, 32*4882a593Smuzhiyun struct device_attribute *attr, 33*4882a593Smuzhiyun char *len); 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun /** 36*4882a593Smuzhiyun * struct iio_const_attr - constant device specific attribute 37*4882a593Smuzhiyun * often used for things like available modes 38*4882a593Smuzhiyun * @string: attribute string 39*4882a593Smuzhiyun * @dev_attr: underlying device attribute 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun struct iio_const_attr { 42*4882a593Smuzhiyun const char *string; 43*4882a593Smuzhiyun struct device_attribute dev_attr; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #define to_iio_const_attr(_dev_attr) \ 47*4882a593Smuzhiyun container_of(_dev_attr, struct iio_const_attr, dev_attr) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun /* Some attributes will be hard coded (device dependent) and not require an 50*4882a593Smuzhiyun address, in these cases pass a negative */ 51*4882a593Smuzhiyun #define IIO_ATTR(_name, _mode, _show, _store, _addr) \ 52*4882a593Smuzhiyun { .dev_attr = __ATTR(_name, _mode, _show, _store), \ 53*4882a593Smuzhiyun .address = _addr } 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun #define IIO_ATTR_RO(_name, _addr) \ 56*4882a593Smuzhiyun { .dev_attr = __ATTR_RO(_name), \ 57*4882a593Smuzhiyun .address = _addr } 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #define IIO_ATTR_WO(_name, _addr) \ 60*4882a593Smuzhiyun { .dev_attr = __ATTR_WO(_name), \ 61*4882a593Smuzhiyun .address = _addr } 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun #define IIO_ATTR_RW(_name, _addr) \ 64*4882a593Smuzhiyun { .dev_attr = __ATTR_RW(_name), \ 65*4882a593Smuzhiyun .address = _addr } 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #define IIO_DEVICE_ATTR(_name, _mode, _show, _store, _addr) \ 68*4882a593Smuzhiyun struct iio_dev_attr iio_dev_attr_##_name \ 69*4882a593Smuzhiyun = IIO_ATTR(_name, _mode, _show, _store, _addr) 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun #define IIO_DEVICE_ATTR_RO(_name, _addr) \ 72*4882a593Smuzhiyun struct iio_dev_attr iio_dev_attr_##_name \ 73*4882a593Smuzhiyun = IIO_ATTR_RO(_name, _addr) 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun #define IIO_DEVICE_ATTR_WO(_name, _addr) \ 76*4882a593Smuzhiyun struct iio_dev_attr iio_dev_attr_##_name \ 77*4882a593Smuzhiyun = IIO_ATTR_WO(_name, _addr) 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun #define IIO_DEVICE_ATTR_RW(_name, _addr) \ 80*4882a593Smuzhiyun struct iio_dev_attr iio_dev_attr_##_name \ 81*4882a593Smuzhiyun = IIO_ATTR_RW(_name, _addr) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define IIO_DEVICE_ATTR_NAMED(_vname, _name, _mode, _show, _store, _addr) \ 84*4882a593Smuzhiyun struct iio_dev_attr iio_dev_attr_##_vname \ 85*4882a593Smuzhiyun = IIO_ATTR(_name, _mode, _show, _store, _addr) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun #define IIO_CONST_ATTR(_name, _string) \ 88*4882a593Smuzhiyun struct iio_const_attr iio_const_attr_##_name \ 89*4882a593Smuzhiyun = { .string = _string, \ 90*4882a593Smuzhiyun .dev_attr = __ATTR(_name, S_IRUGO, iio_read_const_attr, NULL)} 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun #define IIO_CONST_ATTR_NAMED(_vname, _name, _string) \ 93*4882a593Smuzhiyun struct iio_const_attr iio_const_attr_##_vname \ 94*4882a593Smuzhiyun = { .string = _string, \ 95*4882a593Smuzhiyun .dev_attr = __ATTR(_name, S_IRUGO, iio_read_const_attr, NULL)} 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /* Generic attributes of onetype or another */ 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun /** 100*4882a593Smuzhiyun * IIO_DEV_ATTR_SAMP_FREQ - sets any internal clock frequency 101*4882a593Smuzhiyun * @_mode: sysfs file mode/permissions 102*4882a593Smuzhiyun * @_show: output method for the attribute 103*4882a593Smuzhiyun * @_store: input method for the attribute 104*4882a593Smuzhiyun **/ 105*4882a593Smuzhiyun #define IIO_DEV_ATTR_SAMP_FREQ(_mode, _show, _store) \ 106*4882a593Smuzhiyun IIO_DEVICE_ATTR(sampling_frequency, _mode, _show, _store, 0) 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun /** 109*4882a593Smuzhiyun * IIO_DEV_ATTR_SAMP_FREQ_AVAIL - list available sampling frequencies 110*4882a593Smuzhiyun * @_show: output method for the attribute 111*4882a593Smuzhiyun * 112*4882a593Smuzhiyun * May be mode dependent on some devices 113*4882a593Smuzhiyun **/ 114*4882a593Smuzhiyun #define IIO_DEV_ATTR_SAMP_FREQ_AVAIL(_show) \ 115*4882a593Smuzhiyun IIO_DEVICE_ATTR(sampling_frequency_available, S_IRUGO, _show, NULL, 0) 116*4882a593Smuzhiyun /** 117*4882a593Smuzhiyun * IIO_CONST_ATTR_SAMP_FREQ_AVAIL - list available sampling frequencies 118*4882a593Smuzhiyun * @_string: frequency string for the attribute 119*4882a593Smuzhiyun * 120*4882a593Smuzhiyun * Constant version 121*4882a593Smuzhiyun **/ 122*4882a593Smuzhiyun #define IIO_CONST_ATTR_SAMP_FREQ_AVAIL(_string) \ 123*4882a593Smuzhiyun IIO_CONST_ATTR(sampling_frequency_available, _string) 124*4882a593Smuzhiyun 125*4882a593Smuzhiyun /** 126*4882a593Smuzhiyun * IIO_DEV_ATTR_INT_TIME_AVAIL - list available integration times 127*4882a593Smuzhiyun * @_show: output method for the attribute 128*4882a593Smuzhiyun **/ 129*4882a593Smuzhiyun #define IIO_DEV_ATTR_INT_TIME_AVAIL(_show) \ 130*4882a593Smuzhiyun IIO_DEVICE_ATTR(integration_time_available, S_IRUGO, _show, NULL, 0) 131*4882a593Smuzhiyun /** 132*4882a593Smuzhiyun * IIO_CONST_ATTR_INT_TIME_AVAIL - list available integration times 133*4882a593Smuzhiyun * @_string: frequency string for the attribute 134*4882a593Smuzhiyun * 135*4882a593Smuzhiyun * Constant version 136*4882a593Smuzhiyun **/ 137*4882a593Smuzhiyun #define IIO_CONST_ATTR_INT_TIME_AVAIL(_string) \ 138*4882a593Smuzhiyun IIO_CONST_ATTR(integration_time_available, _string) 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #define IIO_DEV_ATTR_TEMP_RAW(_show) \ 141*4882a593Smuzhiyun IIO_DEVICE_ATTR(in_temp_raw, S_IRUGO, _show, NULL, 0) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyun #define IIO_CONST_ATTR_TEMP_OFFSET(_string) \ 144*4882a593Smuzhiyun IIO_CONST_ATTR(in_temp_offset, _string) 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun #define IIO_CONST_ATTR_TEMP_SCALE(_string) \ 147*4882a593Smuzhiyun IIO_CONST_ATTR(in_temp_scale, _string) 148*4882a593Smuzhiyun 149*4882a593Smuzhiyun #endif /* _INDUSTRIAL_IO_SYSFS_H_ */ 150