All of lore.kernel.org
 help / color / mirror / Atom feed
From: kernel test robot <lkp@intel.com>
To: Gabriel Shahrouzi <gshahrouzi@gmail.com>,
	gregkh@linuxfoundation.org, jic23@kernel.org, lars@metafoo.de,
	linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-staging@lists.linux.dev, Michael.Hennerich@analog.com,
	sonic.zhang@analog.com, vapier@gentoo.org
Cc: oe-kbuild-all@lists.linux.dev, gshahrouzi@gmail.com,
	skhan@linuxfoundation.org, linux-kernel-mentees@lists.linux.dev
Subject: Re: [PATCH v3 5/5] staging: iio: adc: ad7816: Simplify channel validation using chip_info
Date: Sat, 19 Apr 2025 20:19:48 +0800	[thread overview]
Message-ID: <202504192012.ATXH4XfM-lkp@intel.com> (raw)
In-Reply-To: <fad83a7efb12c0f40dc2660cf9dd4c57422ecff9.1745007964.git.gshahrouzi@gmail.com>

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@intel.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

  reply	other threads:[~2025-04-19 12:20 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-04-18 20:47 [PATCH v3 0/5] staging: iio: adc: ad7816: Fix channel handling Gabriel Shahrouzi
2025-04-18 20:47 ` [PATCH v3 1/5] staging: iio: adc: ad7816: Allow channel 7 for all devices Gabriel Shahrouzi
2025-04-18 20:47 ` [PATCH v3 2/5] staging: iio: adc: ad7816: Rename state structure Gabriel Shahrouzi
2025-04-18 20:47 ` [PATCH v3 3/5] staging: iio: adc: ad7816: Introduce chip_info and use pointer matching Gabriel Shahrouzi
2025-04-18 20:47 ` [PATCH v3 4/5] staging: iio: adc: ad7816: Use chip_info for device capabilities Gabriel Shahrouzi
2025-04-18 20:47 ` [PATCH v3 5/5] staging: iio: adc: ad7816: Simplify channel validation using chip_info Gabriel Shahrouzi
2025-04-19 12:19   ` kernel test robot [this message]
2025-04-19 13:11   ` kernel test robot
2025-04-21 11:29 ` [PATCH v3 0/5] staging: iio: adc: ad7816: Fix channel handling Jonathan Cameron
2025-04-21 13:44   ` Gabriel Shahrouzi

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=202504192012.ATXH4XfM-lkp@intel.com \
    --to=lkp@intel.com \
    --cc=Michael.Hennerich@analog.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=gshahrouzi@gmail.com \
    --cc=jic23@kernel.org \
    --cc=lars@metafoo.de \
    --cc=linux-iio@vger.kernel.org \
    --cc=linux-kernel-mentees@lists.linux.dev \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-staging@lists.linux.dev \
    --cc=oe-kbuild-all@lists.linux.dev \
    --cc=skhan@linuxfoundation.org \
    --cc=sonic.zhang@analog.com \
    --cc=vapier@gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.