lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <202504192012.ATXH4XfM-lkp@intel.com>
Date: Sat, 19 Apr 2025 20:19:48 +0800
From: kernel test robot <lkp@...el.com>
To: Gabriel Shahrouzi <gshahrouzi@...il.com>, gregkh@...uxfoundation.org,
	jic23@...nel.org, lars@...afoo.de, linux-iio@...r.kernel.org,
	linux-kernel@...r.kernel.org, linux-staging@...ts.linux.dev,
	Michael.Hennerich@...log.com, sonic.zhang@...log.com,
	vapier@...too.org
Cc: oe-kbuild-all@...ts.linux.dev, gshahrouzi@...il.com,
	skhan@...uxfoundation.org, linux-kernel-mentees@...ts.linux.dev
Subject: Re: [PATCH v3 5/5] staging: iio: adc: ad7816: Simplify channel
 validation using chip_info

Hi Gabriel,

kernel test robot noticed the following build errors:

[auto build test ERROR on staging/staging-testing]

url:    https://github.com/intel-lab-lkp/linux/commits/Gabriel-Shahrouzi/staging-iio-adc-ad7816-Allow-channel-7-for-all-devices/20250419-045531
base:   staging/staging-testing
patch link:    https://lore.kernel.org/r/fad83a7efb12c0f40dc2660cf9dd4c57422ecff9.1745007964.git.gshahrouzi%40gmail.com
patch subject: [PATCH v3 5/5] staging: iio: adc: ad7816: Simplify channel validation using chip_info
config: x86_64-buildonly-randconfig-003-20250419 (https://download.01.org/0day-ci/archive/20250419/202504192012.ATXH4XfM-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250419/202504192012.ATXH4XfM-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@...el.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202504192012.ATXH4XfM-lkp@intel.com/

All error/warnings (new ones prefixed by >>):

   drivers/staging/iio/adc/ad7816.c: In function 'ad7816_store_channel':
>> drivers/staging/iio/adc/ad7816.c:222:16: error: invalid storage class for function 'ad7816_show_value'
     222 | static ssize_t ad7816_show_value(struct device *dev,
         |                ^~~~~~~~~~~~~~~~~
   In file included from include/linux/kobject.h:20,
                    from include/linux/energy_model.h:7,
                    from include/linux/device.h:16,
                    from drivers/staging/iio/adc/ad7816.c:10:
>> drivers/staging/iio/adc/ad7816.c:248:37: error: initializer element is not constant
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |                                     ^~~~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:248:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |        ^~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:248:37: note: (near initialization for 'iio_dev_attr_value.dev_attr.show')
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |                                     ^~~~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:248:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |        ^~~~~~~~~~~~~~~
>> drivers/staging/iio/adc/ad7816.c:271:20: error: invalid storage class for function 'ad7816_event_handler'
     271 | static irqreturn_t ad7816_event_handler(int irq, void *private)
         |                    ^~~~~~~~~~~~~~~~~~~~
>> drivers/staging/iio/adc/ad7816.c:278:16: error: invalid storage class for function 'ad7816_show_oti'
     278 | static ssize_t ad7816_show_oti(struct device *dev,
         |                ^~~~~~~~~~~~~~~
>> drivers/staging/iio/adc/ad7816.c:298:23: error: invalid storage class for function 'ad7816_set_oti'
     298 | static inline ssize_t ad7816_set_oti(struct device *dev,
         |                       ^~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:340:24: error: initializer element is not constant
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                        ^~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:340:24: note: (near initialization for 'iio_dev_attr_oti.dev_attr.show')
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                        ^~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:340:41: error: initializer element is not constant
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                                         ^~~~~~~~~~~~~~
   include/linux/sysfs.h:234:19: note: in definition of macro '__ATTR'
     234 |         .store  = _store,                                               \
         |                   ^~~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:340:41: note: (near initialization for 'iio_dev_attr_oti.dev_attr.store')
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                                         ^~~~~~~~~~~~~~
   include/linux/sysfs.h:234:19: note: in definition of macro '__ATTR'
     234 |         .store  = _store,                                               \
         |                   ^~~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
>> drivers/staging/iio/adc/ad7816.c:361:12: error: invalid storage class for function 'ad7816_probe'
     361 | static int ad7816_probe(struct spi_device *spi_dev)
         |            ^~~~~~~~~~~~
>> drivers/staging/iio/adc/ad7816.c:442:1: warning: 'alias' attribute ignored [-Wattributes]
     442 | MODULE_DEVICE_TABLE(of, ad7816_of_match);
         | ^~~~~~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:451:1: warning: 'alias' attribute ignored [-Wattributes]
     451 | MODULE_DEVICE_TABLE(spi, ad7816_id);
         | ^~~~~~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:458:18: error: initializer element is not constant
     458 |         .probe = ad7816_probe,
         |                  ^~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:458:18: note: (near initialization for 'ad7816_driver.probe')
   In file included from include/linux/device.h:32:
>> drivers/staging/iio/adc/ad7816.c:461:19: error: invalid storage class for function 'ad7816_driver_init'
     461 | module_spi_driver(ad7816_driver);
         |                   ^~~~~~~~~~~~~
   include/linux/device/driver.h:258:19: note: in definition of macro 'module_driver'
     258 | static int __init __driver##_init(void) \
         |                   ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   In file included from include/linux/device/driver.h:21:
>> include/linux/module.h:131:49: error: invalid storage class for function '__inittest'
     131 |         static inline initcall_t __maybe_unused __inittest(void)                \
         |                                                 ^~~~~~~~~~
   include/linux/device/driver.h:262:1: note: in expansion of macro 'module_init'
     262 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/spi/spi.h:387:9: note: in expansion of macro 'module_driver'
     387 |         module_driver(__spi_driver, spi_register_driver, \
         |         ^~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: warning: 'alias' attribute ignored [-Wattributes]
>> drivers/staging/iio/adc/ad7816.c:461:19: error: invalid storage class for function 'ad7816_driver_exit'
     461 | module_spi_driver(ad7816_driver);
         |                   ^~~~~~~~~~~~~
   include/linux/device/driver.h:263:20: note: in definition of macro 'module_driver'
     263 | static void __exit __driver##_exit(void) \
         |                    ^~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
>> include/linux/module.h:139:49: error: invalid storage class for function '__exittest'
     139 |         static inline exitcall_t __maybe_unused __exittest(void)                \
         |                                                 ^~~~~~~~~~
   include/linux/device/driver.h:267:1: note: in expansion of macro 'module_exit'
     267 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/spi/spi.h:387:9: note: in expansion of macro 'module_driver'
     387 |         module_driver(__spi_driver, spi_register_driver, \
         |         ^~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c:461:1: warning: 'alias' attribute ignored [-Wattributes]
>> drivers/staging/iio/adc/ad7816.c:465:1: error: expected declaration or statement at end of input
     465 | MODULE_LICENSE("GPL v2");
         | ^~~~~~~~~~~~~~
   drivers/staging/iio/adc/ad7816.c: At top level:
>> drivers/staging/iio/adc/ad7816.c:193:16: warning: 'ad7816_store_channel' defined but not used [-Wunused-function]
     193 | static ssize_t ad7816_store_channel(struct device *dev,
         |                ^~~~~~~~~~~~~~~~~~~~
--
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:248:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |        ^~~~~~~~~~~~~~~
   ad7816.c:248:37: note: (near initialization for 'iio_dev_attr_value.dev_attr.show')
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |                                     ^~~~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:248:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     248 | static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
         |        ^~~~~~~~~~~~~~~
   ad7816.c:271:20: error: invalid storage class for function 'ad7816_event_handler'
     271 | static irqreturn_t ad7816_event_handler(int irq, void *private)
         |                    ^~~~~~~~~~~~~~~~~~~~
   ad7816.c:278:16: error: invalid storage class for function 'ad7816_show_oti'
     278 | static ssize_t ad7816_show_oti(struct device *dev,
         |                ^~~~~~~~~~~~~~~
   ad7816.c:298:23: error: invalid storage class for function 'ad7816_set_oti'
     298 | static inline ssize_t ad7816_set_oti(struct device *dev,
         |                       ^~~~~~~~~~~~~~
   ad7816.c:340:24: error: initializer element is not constant
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                        ^~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   ad7816.c:340:24: note: (near initialization for 'iio_dev_attr_oti.dev_attr.show')
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                        ^~~~~~~~~~~~~~~
   include/linux/sysfs.h:233:19: note: in definition of macro '__ATTR'
     233 |         .show   = _show,                                                \
         |                   ^~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   ad7816.c:340:41: error: initializer element is not constant
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                                         ^~~~~~~~~~~~~~
   include/linux/sysfs.h:234:19: note: in definition of macro '__ATTR'
     234 |         .store  = _store,                                               \
         |                   ^~~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   ad7816.c:340:41: note: (near initialization for 'iio_dev_attr_oti.dev_attr.store')
     340 |                        ad7816_show_oti, ad7816_set_oti, 0);
         |                                         ^~~~~~~~~~~~~~
   include/linux/sysfs.h:234:19: note: in definition of macro '__ATTR'
     234 |         .store  = _store,                                               \
         |                   ^~~~~~
   include/linux/iio/sysfs.h:72:11: note: in expansion of macro 'IIO_ATTR'
      72 |         = IIO_ATTR(_name, _mode, _show, _store, _addr)
         |           ^~~~~~~~
   ad7816.c:339:8: note: in expansion of macro 'IIO_DEVICE_ATTR'
     339 | static IIO_DEVICE_ATTR(oti, 0644,
         |        ^~~~~~~~~~~~~~~
   ad7816.c:361:12: error: invalid storage class for function 'ad7816_probe'
     361 | static int ad7816_probe(struct spi_device *spi_dev)
         |            ^~~~~~~~~~~~
   ad7816.c:442:1: warning: 'alias' attribute ignored [-Wattributes]
     442 | MODULE_DEVICE_TABLE(of, ad7816_of_match);
         | ^~~~~~~~~~~~~~~~~~~
   ad7816.c:451:1: warning: 'alias' attribute ignored [-Wattributes]
     451 | MODULE_DEVICE_TABLE(spi, ad7816_id);
         | ^~~~~~~~~~~~~~~~~~~
   ad7816.c:458:18: error: initializer element is not constant
     458 |         .probe = ad7816_probe,
         |                  ^~~~~~~~~~~~
   ad7816.c:458:18: note: (near initialization for 'ad7816_driver.probe')
   In file included from include/linux/device.h:32:
   ad7816.c:461:19: error: invalid storage class for function 'ad7816_driver_init'
     461 | module_spi_driver(ad7816_driver);
         |                   ^~~~~~~~~~~~~
   include/linux/device/driver.h:258:19: note: in definition of macro 'module_driver'
     258 | static int __init __driver##_init(void) \
         |                   ^~~~~~~~
   ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   In file included from include/linux/device/driver.h:21:
>> include/linux/module.h:131:49: error: invalid storage class for function '__inittest'
     131 |         static inline initcall_t __maybe_unused __inittest(void)                \
         |                                                 ^~~~~~~~~~
   include/linux/device/driver.h:262:1: note: in expansion of macro 'module_init'
     262 | module_init(__driver##_init); \
         | ^~~~~~~~~~~
   include/linux/spi/spi.h:387:9: note: in expansion of macro 'module_driver'
     387 |         module_driver(__spi_driver, spi_register_driver, \
         |         ^~~~~~~~~~~~~
   ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   ad7816.c:461:1: warning: 'alias' attribute ignored [-Wattributes]
   ad7816.c:461:19: error: invalid storage class for function 'ad7816_driver_exit'
     461 | module_spi_driver(ad7816_driver);
         |                   ^~~~~~~~~~~~~
   include/linux/device/driver.h:263:20: note: in definition of macro 'module_driver'
     263 | static void __exit __driver##_exit(void) \
         |                    ^~~~~~~~
   ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
>> include/linux/module.h:139:49: error: invalid storage class for function '__exittest'
     139 |         static inline exitcall_t __maybe_unused __exittest(void)                \
         |                                                 ^~~~~~~~~~
   include/linux/device/driver.h:267:1: note: in expansion of macro 'module_exit'
     267 | module_exit(__driver##_exit);
         | ^~~~~~~~~~~
   include/linux/spi/spi.h:387:9: note: in expansion of macro 'module_driver'
     387 |         module_driver(__spi_driver, spi_register_driver, \
         |         ^~~~~~~~~~~~~
   ad7816.c:461:1: note: in expansion of macro 'module_spi_driver'
     461 | module_spi_driver(ad7816_driver);
         | ^~~~~~~~~~~~~~~~~
   ad7816.c:461:1: warning: 'alias' attribute ignored [-Wattributes]
   ad7816.c:465:1: error: expected declaration or statement at end of input
     465 | MODULE_LICENSE("GPL v2");
         | ^~~~~~~~~~~~~~
   ad7816.c: At top level:
   ad7816.c:193:16: warning: 'ad7816_store_channel' defined but not used [-Wunused-function]
     193 | static ssize_t ad7816_store_channel(struct device *dev,
         |                ^~~~~~~~~~~~~~~~~~~~


vim +/ad7816_show_value +222 drivers/staging/iio/adc/ad7816.c

7924425db04a61 Sonic Zhang          2010-10-27  192  
7924425db04a61 Sonic Zhang          2010-10-27 @193  static ssize_t ad7816_store_channel(struct device *dev,
7924425db04a61 Sonic Zhang          2010-10-27  194  				    struct device_attribute *attr,
7924425db04a61 Sonic Zhang          2010-10-27  195  				    const char *buf,
7924425db04a61 Sonic Zhang          2010-10-27  196  				    size_t len)
7924425db04a61 Sonic Zhang          2010-10-27  197  {
62c5183971428a Lars-Peter Clausen   2012-05-12  198  	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
c746f5c9c52e03 Gabriel Shahrouzi    2025-04-18  199  	struct ad7816_state *chip = iio_priv(indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  200  	unsigned long data;
7924425db04a61 Sonic Zhang          2010-10-27  201  	int ret;
7924425db04a61 Sonic Zhang          2010-10-27  202  
f86f83622fe2c4 Aida Mynzhasova      2013-05-07  203  	ret = kstrtoul(buf, 10, &data);
7924425db04a61 Sonic Zhang          2010-10-27  204  	if (ret)
f86f83622fe2c4 Aida Mynzhasova      2013-05-07  205  		return ret;
7924425db04a61 Sonic Zhang          2010-10-27  206  
563a61a6448851 Gabriel Shahrouzi    2025-04-18  207  	if (data > chip->chip_info->max_channels && data != AD7816_CS_MASK) {
7924425db04a61 Sonic Zhang          2010-10-27  208  		dev_err(&chip->spi_dev->dev, "Invalid channel id %lu for %s.\n",
563a61a6448851 Gabriel Shahrouzi    2025-04-18  209  			data, chip->chip_info->name);
7924425db04a61 Sonic Zhang          2010-10-27  210  		return -EINVAL;
7924425db04a61 Sonic Zhang          2010-10-27  211  
7924425db04a61 Sonic Zhang          2010-10-27  212  	chip->channel_id = data;
7924425db04a61 Sonic Zhang          2010-10-27  213  
7924425db04a61 Sonic Zhang          2010-10-27  214  	return len;
7924425db04a61 Sonic Zhang          2010-10-27  215  }
7924425db04a61 Sonic Zhang          2010-10-27  216  
7f47d56c5b0500 Julián de Gortari    2017-01-23  217  static IIO_DEVICE_ATTR(channel, 0644,
7924425db04a61 Sonic Zhang          2010-10-27  218  		ad7816_show_channel,
7924425db04a61 Sonic Zhang          2010-10-27  219  		ad7816_store_channel,
7924425db04a61 Sonic Zhang          2010-10-27  220  		0);
7924425db04a61 Sonic Zhang          2010-10-27  221  
7924425db04a61 Sonic Zhang          2010-10-27 @222  static ssize_t ad7816_show_value(struct device *dev,
7924425db04a61 Sonic Zhang          2010-10-27  223  				 struct device_attribute *attr,
7924425db04a61 Sonic Zhang          2010-10-27  224  				 char *buf)
7924425db04a61 Sonic Zhang          2010-10-27  225  {
62c5183971428a Lars-Peter Clausen   2012-05-12  226  	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
c746f5c9c52e03 Gabriel Shahrouzi    2025-04-18  227  	struct ad7816_state *chip = iio_priv(indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  228  	u16 data;
7924425db04a61 Sonic Zhang          2010-10-27  229  	s8 value;
7924425db04a61 Sonic Zhang          2010-10-27  230  	int ret;
7924425db04a61 Sonic Zhang          2010-10-27  231  
7924425db04a61 Sonic Zhang          2010-10-27  232  	ret = ad7816_spi_read(chip, &data);
7924425db04a61 Sonic Zhang          2010-10-27  233  	if (ret)
7924425db04a61 Sonic Zhang          2010-10-27  234  		return -EIO;
7924425db04a61 Sonic Zhang          2010-10-27  235  
7924425db04a61 Sonic Zhang          2010-10-27  236  	data >>= AD7816_VALUE_OFFSET;
7924425db04a61 Sonic Zhang          2010-10-27  237  
7924425db04a61 Sonic Zhang          2010-10-27  238  	if (chip->channel_id == 0) {
7924425db04a61 Sonic Zhang          2010-10-27  239  		value = (s8)((data >> AD7816_TEMP_FLOAT_OFFSET) - 103);
7924425db04a61 Sonic Zhang          2010-10-27  240  		data &= AD7816_TEMP_FLOAT_MASK;
7924425db04a61 Sonic Zhang          2010-10-27  241  		if (value < 0)
e7c3d05459673d Payal Kshirsagar     2019-04-02  242  			data = BIT(AD7816_TEMP_FLOAT_OFFSET) - data;
7924425db04a61 Sonic Zhang          2010-10-27  243  		return sprintf(buf, "%d.%.2d\n", value, data * 25);
da96aecdc59d08 Vaishali Thakkar     2014-09-25  244  	}
7924425db04a61 Sonic Zhang          2010-10-27  245  	return sprintf(buf, "%u\n", data);
7924425db04a61 Sonic Zhang          2010-10-27  246  }
7924425db04a61 Sonic Zhang          2010-10-27  247  
7f47d56c5b0500 Julián de Gortari    2017-01-23 @248  static IIO_DEVICE_ATTR(value, 0444, ad7816_show_value, NULL, 0);
7924425db04a61 Sonic Zhang          2010-10-27  249  
7924425db04a61 Sonic Zhang          2010-10-27  250  static struct attribute *ad7816_attributes[] = {
7924425db04a61 Sonic Zhang          2010-10-27  251  	&iio_dev_attr_available_modes.dev_attr.attr,
7924425db04a61 Sonic Zhang          2010-10-27  252  	&iio_dev_attr_mode.dev_attr.attr,
7924425db04a61 Sonic Zhang          2010-10-27  253  	&iio_dev_attr_channel.dev_attr.attr,
7924425db04a61 Sonic Zhang          2010-10-27  254  	&iio_dev_attr_value.dev_attr.attr,
7924425db04a61 Sonic Zhang          2010-10-27  255  	NULL,
7924425db04a61 Sonic Zhang          2010-10-27  256  };
7924425db04a61 Sonic Zhang          2010-10-27  257  
7924425db04a61 Sonic Zhang          2010-10-27  258  static const struct attribute_group ad7816_attribute_group = {
7924425db04a61 Sonic Zhang          2010-10-27  259  	.attrs = ad7816_attributes,
7924425db04a61 Sonic Zhang          2010-10-27  260  };
7924425db04a61 Sonic Zhang          2010-10-27  261  
7924425db04a61 Sonic Zhang          2010-10-27  262  /*
7924425db04a61 Sonic Zhang          2010-10-27  263   * temperature bound events
7924425db04a61 Sonic Zhang          2010-10-27  264   */
7924425db04a61 Sonic Zhang          2010-10-27  265  
c4b14d99bbc93c Jonathan Cameron     2011-08-12  266  #define IIO_EVENT_CODE_AD7816_OTI IIO_UNMOD_EVENT_CODE(IIO_TEMP,	\
0bb8be643161ae Jonathan Cameron     2011-05-18  267  						       0,		\
0bb8be643161ae Jonathan Cameron     2011-05-18  268  						       IIO_EV_TYPE_THRESH, \
0bb8be643161ae Jonathan Cameron     2011-05-18  269  						       IIO_EV_DIR_FALLING)
7924425db04a61 Sonic Zhang          2010-10-27  270  
db9afe2fc0c59f Jonathan Cameron     2011-05-18 @271  static irqreturn_t ad7816_event_handler(int irq, void *private)
7924425db04a61 Sonic Zhang          2010-10-27  272  {
bc2b7dab629a51 Gregor Boirie        2016-03-09  273  	iio_push_event(private, IIO_EVENT_CODE_AD7816_OTI,
bd28425a307417 Arushi Singhal       2018-03-07  274  		       iio_get_time_ns(private));
db9afe2fc0c59f Jonathan Cameron     2011-05-18  275  	return IRQ_HANDLED;
7924425db04a61 Sonic Zhang          2010-10-27  276  }
7924425db04a61 Sonic Zhang          2010-10-27  277  
7924425db04a61 Sonic Zhang          2010-10-27 @278  static ssize_t ad7816_show_oti(struct device *dev,
7924425db04a61 Sonic Zhang          2010-10-27  279  			       struct device_attribute *attr,
7924425db04a61 Sonic Zhang          2010-10-27  280  			       char *buf)
7924425db04a61 Sonic Zhang          2010-10-27  281  {
62c5183971428a Lars-Peter Clausen   2012-05-12  282  	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
c746f5c9c52e03 Gabriel Shahrouzi    2025-04-18  283  	struct ad7816_state *chip = iio_priv(indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  284  	int value;
7924425db04a61 Sonic Zhang          2010-10-27  285  
7924425db04a61 Sonic Zhang          2010-10-27  286  	if (chip->channel_id > AD7816_CS_MAX) {
7924425db04a61 Sonic Zhang          2010-10-27  287  		dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
7924425db04a61 Sonic Zhang          2010-10-27  288  		return -EINVAL;
7924425db04a61 Sonic Zhang          2010-10-27  289  	} else if (chip->channel_id == 0) {
7924425db04a61 Sonic Zhang          2010-10-27  290  		value = AD7816_BOUND_VALUE_MIN +
7924425db04a61 Sonic Zhang          2010-10-27  291  			(chip->oti_data[chip->channel_id] -
7924425db04a61 Sonic Zhang          2010-10-27  292  			AD7816_BOUND_VALUE_BASE);
7924425db04a61 Sonic Zhang          2010-10-27  293  		return sprintf(buf, "%d\n", value);
da96aecdc59d08 Vaishali Thakkar     2014-09-25  294  	}
7924425db04a61 Sonic Zhang          2010-10-27  295  	return sprintf(buf, "%u\n", chip->oti_data[chip->channel_id]);
7924425db04a61 Sonic Zhang          2010-10-27  296  }
7924425db04a61 Sonic Zhang          2010-10-27  297  
7924425db04a61 Sonic Zhang          2010-10-27 @298  static inline ssize_t ad7816_set_oti(struct device *dev,
7924425db04a61 Sonic Zhang          2010-10-27  299  				     struct device_attribute *attr,
7924425db04a61 Sonic Zhang          2010-10-27  300  				     const char *buf,
7924425db04a61 Sonic Zhang          2010-10-27  301  				     size_t len)
7924425db04a61 Sonic Zhang          2010-10-27  302  {
62c5183971428a Lars-Peter Clausen   2012-05-12  303  	struct iio_dev *indio_dev = dev_to_iio_dev(dev);
c746f5c9c52e03 Gabriel Shahrouzi    2025-04-18  304  	struct ad7816_state *chip = iio_priv(indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  305  	long value;
7924425db04a61 Sonic Zhang          2010-10-27  306  	u8 data;
7924425db04a61 Sonic Zhang          2010-10-27  307  	int ret;
7924425db04a61 Sonic Zhang          2010-10-27  308  
f86f83622fe2c4 Aida Mynzhasova      2013-05-07  309  	ret = kstrtol(buf, 10, &value);
f86f83622fe2c4 Aida Mynzhasova      2013-05-07  310  	if (ret)
f86f83622fe2c4 Aida Mynzhasova      2013-05-07  311  		return ret;
7924425db04a61 Sonic Zhang          2010-10-27  312  
7924425db04a61 Sonic Zhang          2010-10-27  313  	if (chip->channel_id > AD7816_CS_MAX) {
7924425db04a61 Sonic Zhang          2010-10-27  314  		dev_err(dev, "Invalid oti channel id %d.\n", chip->channel_id);
7924425db04a61 Sonic Zhang          2010-10-27  315  		return -EINVAL;
7924425db04a61 Sonic Zhang          2010-10-27  316  	} else if (chip->channel_id == 0) {
0fd736f9f4d2ae Amitoj Kaur Chawla   2016-02-16  317  		if (value < AD7816_BOUND_VALUE_MIN ||
7924425db04a61 Sonic Zhang          2010-10-27  318  		    value > AD7816_BOUND_VALUE_MAX)
7924425db04a61 Sonic Zhang          2010-10-27  319  			return -EINVAL;
7924425db04a61 Sonic Zhang          2010-10-27  320  
7924425db04a61 Sonic Zhang          2010-10-27  321  		data = (u8)(value - AD7816_BOUND_VALUE_MIN +
7924425db04a61 Sonic Zhang          2010-10-27  322  			AD7816_BOUND_VALUE_BASE);
7924425db04a61 Sonic Zhang          2010-10-27  323  	} else {
0fd736f9f4d2ae Amitoj Kaur Chawla   2016-02-16  324  		if (value < AD7816_BOUND_VALUE_BASE || value > 255)
7924425db04a61 Sonic Zhang          2010-10-27  325  			return -EINVAL;
7924425db04a61 Sonic Zhang          2010-10-27  326  
7924425db04a61 Sonic Zhang          2010-10-27  327  		data = (u8)value;
7924425db04a61 Sonic Zhang          2010-10-27  328  	}
7924425db04a61 Sonic Zhang          2010-10-27  329  
7924425db04a61 Sonic Zhang          2010-10-27  330  	ret = ad7816_spi_write(chip, data);
7924425db04a61 Sonic Zhang          2010-10-27  331  	if (ret)
7924425db04a61 Sonic Zhang          2010-10-27  332  		return -EIO;
7924425db04a61 Sonic Zhang          2010-10-27  333  
7924425db04a61 Sonic Zhang          2010-10-27  334  	chip->oti_data[chip->channel_id] = data;
7924425db04a61 Sonic Zhang          2010-10-27  335  
7924425db04a61 Sonic Zhang          2010-10-27  336  	return len;
7924425db04a61 Sonic Zhang          2010-10-27  337  }
7924425db04a61 Sonic Zhang          2010-10-27  338  
7f47d56c5b0500 Julián de Gortari    2017-01-23 @339  static IIO_DEVICE_ATTR(oti, 0644,
7924425db04a61 Sonic Zhang          2010-10-27  340  		       ad7816_show_oti, ad7816_set_oti, 0);
7924425db04a61 Sonic Zhang          2010-10-27  341  
7924425db04a61 Sonic Zhang          2010-10-27  342  static struct attribute *ad7816_event_attributes[] = {
db9afe2fc0c59f Jonathan Cameron     2011-05-18  343  	&iio_dev_attr_oti.dev_attr.attr,
7924425db04a61 Sonic Zhang          2010-10-27  344  	NULL,
7924425db04a61 Sonic Zhang          2010-10-27  345  };
7924425db04a61 Sonic Zhang          2010-10-27  346  
0fa90023f23ced Bhumika Goyal        2016-10-02  347  static const struct attribute_group ad7816_event_attribute_group = {
7924425db04a61 Sonic Zhang          2010-10-27  348  	.attrs = ad7816_event_attributes,
8e7d967244a8ee Jonathan Cameron     2011-08-30  349  	.name = "events",
7924425db04a61 Sonic Zhang          2010-10-27  350  };
7924425db04a61 Sonic Zhang          2010-10-27  351  
6fe8135fccd66a Jonathan Cameron     2011-05-18  352  static const struct iio_info ad7816_info = {
6fe8135fccd66a Jonathan Cameron     2011-05-18  353  	.attrs = &ad7816_attribute_group,
6fe8135fccd66a Jonathan Cameron     2011-05-18  354  	.event_attrs = &ad7816_event_attribute_group,
6fe8135fccd66a Jonathan Cameron     2011-05-18  355  };
6fe8135fccd66a Jonathan Cameron     2011-05-18  356  
7924425db04a61 Sonic Zhang          2010-10-27  357  /*
7924425db04a61 Sonic Zhang          2010-10-27  358   * device probe and remove
7924425db04a61 Sonic Zhang          2010-10-27  359   */
7924425db04a61 Sonic Zhang          2010-10-27  360  
4ae1c61ff2ba4f Bill Pemberton       2012-11-19 @361  static int ad7816_probe(struct spi_device *spi_dev)
7924425db04a61 Sonic Zhang          2010-10-27  362  {
c746f5c9c52e03 Gabriel Shahrouzi    2025-04-18  363  	struct ad7816_state *chip;
b0011d6dbae18a Jonathan Cameron     2011-06-27  364  	struct iio_dev *indio_dev;
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  365  	const struct ad7816_chip_info *info;
f1b753a0f866a8 Hardik Singh Rathore 2018-12-12  366  	int i, ret;
7924425db04a61 Sonic Zhang          2010-10-27  367  
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  368  	indio_dev = devm_iio_device_alloc(&spi_dev->dev, sizeof(*chip));
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  369  	if (!indio_dev)
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  370  		return -ENOMEM;
b0011d6dbae18a Jonathan Cameron     2011-06-27  371  	chip = iio_priv(indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  372  	/* this is only used for device removal purposes */
b0011d6dbae18a Jonathan Cameron     2011-06-27  373  	dev_set_drvdata(&spi_dev->dev, indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  374  
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  375  	info = device_get_match_data(&spi_dev->dev);
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  376  	if (!info)
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  377  		return -ENODEV;
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  378  	chip->chip_info = info;
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  379  
7924425db04a61 Sonic Zhang          2010-10-27  380  	chip->spi_dev = spi_dev;
7924425db04a61 Sonic Zhang          2010-10-27  381  	for (i = 0; i <= AD7816_CS_MAX; i++)
7924425db04a61 Sonic Zhang          2010-10-27  382  		chip->oti_data[i] = 203;
073a391ca0352d Nishad Kamdar        2018-10-17  383  
72e3a5248da904 Nishad Kamdar        2018-11-09  384  	chip->rdwr_pin = devm_gpiod_get(&spi_dev->dev, "rdwr", GPIOD_OUT_HIGH);
073a391ca0352d Nishad Kamdar        2018-10-17  385  	if (IS_ERR(chip->rdwr_pin)) {
073a391ca0352d Nishad Kamdar        2018-10-17  386  		ret = PTR_ERR(chip->rdwr_pin);
073a391ca0352d Nishad Kamdar        2018-10-17  387  		dev_err(&spi_dev->dev, "Failed to request rdwr GPIO: %d\n",
073a391ca0352d Nishad Kamdar        2018-10-17  388  			ret);
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  389  		return ret;
7924425db04a61 Sonic Zhang          2010-10-27  390  	}
72e3a5248da904 Nishad Kamdar        2018-11-09  391  	chip->convert_pin = devm_gpiod_get(&spi_dev->dev, "convert",
72e3a5248da904 Nishad Kamdar        2018-11-09  392  					   GPIOD_OUT_HIGH);
073a391ca0352d Nishad Kamdar        2018-10-17  393  	if (IS_ERR(chip->convert_pin)) {
073a391ca0352d Nishad Kamdar        2018-10-17  394  		ret = PTR_ERR(chip->convert_pin);
073a391ca0352d Nishad Kamdar        2018-10-17  395  		dev_err(&spi_dev->dev, "Failed to request convert GPIO: %d\n",
073a391ca0352d Nishad Kamdar        2018-10-17  396  			ret);
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  397  		return ret;
7924425db04a61 Sonic Zhang          2010-10-27  398  	}
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  399  	if (chip->chip_info == &ad7816_info_ad7816 || chip->chip_info == &ad7817_info_ad7817) {
06c77f564ddb6a Nishad Kamdar        2018-11-09  400  		chip->busy_pin = devm_gpiod_get(&spi_dev->dev, "busy",
06c77f564ddb6a Nishad Kamdar        2018-11-09  401  						GPIOD_IN);
073a391ca0352d Nishad Kamdar        2018-10-17  402  		if (IS_ERR(chip->busy_pin)) {
073a391ca0352d Nishad Kamdar        2018-10-17  403  			ret = PTR_ERR(chip->busy_pin);
073a391ca0352d Nishad Kamdar        2018-10-17  404  			dev_err(&spi_dev->dev, "Failed to request busy GPIO: %d\n",
073a391ca0352d Nishad Kamdar        2018-10-17  405  				ret);
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  406  			return ret;
7924425db04a61 Sonic Zhang          2010-10-27  407  		}
06c77f564ddb6a Nishad Kamdar        2018-11-09  408  	}
7924425db04a61 Sonic Zhang          2010-10-27  409  
fc79e5b62248ee Gabriel Shahrouzi    2025-04-18  410  	indio_dev->name = chip->chip_info->name;
b0011d6dbae18a Jonathan Cameron     2011-06-27  411  	indio_dev->info = &ad7816_info;
b0011d6dbae18a Jonathan Cameron     2011-06-27  412  	indio_dev->modes = INDIO_DIRECT_MODE;
7924425db04a61 Sonic Zhang          2010-10-27  413  
7924425db04a61 Sonic Zhang          2010-10-27  414  	if (spi_dev->irq) {
7924425db04a61 Sonic Zhang          2010-10-27  415  		/* Only low trigger is supported in ad7816/7/8 */
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  416  		ret = devm_request_threaded_irq(&spi_dev->dev, spi_dev->irq,
db9afe2fc0c59f Jonathan Cameron     2011-05-18  417  						NULL,
db9afe2fc0c59f Jonathan Cameron     2011-05-18  418  						&ad7816_event_handler,
a91aff1c09fc41 Lars-Peter Clausen   2012-07-02  419  						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
b0011d6dbae18a Jonathan Cameron     2011-06-27  420  						indio_dev->name,
b0011d6dbae18a Jonathan Cameron     2011-06-27  421  						indio_dev);
7924425db04a61 Sonic Zhang          2010-10-27  422  		if (ret)
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  423  			return ret;
7924425db04a61 Sonic Zhang          2010-10-27  424  	}
7924425db04a61 Sonic Zhang          2010-10-27  425  
5404dc77266e31 Sachin Kamat         2013-10-29  426  	ret = devm_iio_device_register(&spi_dev->dev, indio_dev);
26d25ae3f0d8ff Jonathan Cameron     2011-09-02  427  	if (ret)
e5bf4f5b7d95ff Sachin Kamat         2013-08-31  428  		return ret;
26d25ae3f0d8ff Jonathan Cameron     2011-09-02  429  
7924425db04a61 Sonic Zhang          2010-10-27  430  	dev_info(&spi_dev->dev, "%s temperature sensor and ADC registered.\n",
b0011d6dbae18a Jonathan Cameron     2011-06-27  431  		 indio_dev->name);
7924425db04a61 Sonic Zhang          2010-10-27  432  
7924425db04a61 Sonic Zhang          2010-10-27  433  	return 0;
7924425db04a61 Sonic Zhang          2010-10-27  434  }
7924425db04a61 Sonic Zhang          2010-10-27  435  

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ