Re: [PATCH v4 2/2] iio: humidity: Add support for ENS210

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Joshua,

kernel test robot noticed the following build warnings:

[auto build test WARNING on 1ebab783647a9e3bf357002d5c4ff060c8474a0a]

url:    https://github.com/intel-lab-lkp/linux/commits/Joshua-Felmeden/dt-bindings-iio-humidity-add-ENS210-sensor-family/20240719-210648
base:   1ebab783647a9e3bf357002d5c4ff060c8474a0a
patch link:    https://lore.kernel.org/r/20240719-ens21x-v4-2-6044e48a376a%40thegoodpenguin.co.uk
patch subject: [PATCH v4 2/2] iio: humidity: Add support for ENS210
config: sh-allmodconfig (https://download.01.org/0day-ci/archive/20240720/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/config)
compiler: sh4-linux-gcc (GCC) 14.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20240720/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/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@xxxxxxxxx>
| Closes: https://lore.kernel.org/oe-kbuild-all/202407201729.dZc0rJ8y-lkp@xxxxxxxxx/

All warnings (new ones prefixed by >>):

   In file included from include/linux/device.h:15,
                    from include/linux/acpi.h:14,
                    from include/linux/i2c.h:13,
                    from drivers/iio/humidity/ens210.c:19:
   drivers/iio/humidity/ens210.c: In function 'ens210_probe':
>> drivers/iio/humidity/ens210.c:251:25: warning: format '%lx' expects argument of type 'long unsigned int', but argument 4 has type 'unsigned int' [-Wformat=]
     251 |                         "Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
         |                         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:110:30: note: in definition of macro 'dev_printk_index_wrap'
     110 |                 _p_func(dev, fmt, ##__VA_ARGS__);                       \
         |                              ^~~
   include/linux/dev_printk.h:160:58: note: in expansion of macro 'dev_fmt'
     160 |         dev_printk_index_wrap(_dev_info, KERN_INFO, dev, dev_fmt(fmt), ##__VA_ARGS__)
         |                                                          ^~~~~~~
   drivers/iio/humidity/ens210.c:250:17: note: in expansion of macro 'dev_info'
     250 |                 dev_info(&client->dev,
         |                 ^~~~~~~~
   drivers/iio/humidity/ens210.c:251:66: note: format string is defined here
     251 |                         "Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
         |                                                              ~~~~^
         |                                                                  |
         |                                                                  long unsigned int
         |                                                              %04x
>> drivers/iio/humidity/ens210.c:200:37: warning: unused variable 'id' [-Wunused-variable]
     200 |         const struct i2c_device_id *id = i2c_client_get_device_id(client);
         |                                     ^~
--
>> drivers/iio/humidity/ens210.c:83: warning: Function parameter or struct member 'chip_info' not described in 'ens210_data'
>> drivers/iio/humidity/ens210.c:83: warning: Excess struct member 'res_index' description in 'ens210_data'


vim +251 drivers/iio/humidity/ens210.c

    72	
    73	/**
    74	 * struct ens210_data - Humidity/Temperature sensor device structure
    75	 * @client:	i2c client
    76	 * @lock:	lock protecting the i2c conversion
    77	 * @res_index:	index to selected sensor resolution
    78	 */
    79	struct ens210_data {
    80		struct i2c_client *client;
    81		const struct ens210_chip_info *chip_info;
    82		struct mutex lock;
  > 83	};
    84	
    85	/* calculate 17-bit crc7 */
    86	static u8 ens210_crc7(u32 val)
    87	{
    88		__be32 val_be = (cpu_to_be32(val & 0x1ffff) >> 0x8);
    89	
    90		return crc7_be(0xde, (u8 *)&val_be, 3) >> 1;
    91	}
    92	
    93	static int ens210_get_measurement(struct iio_dev *indio_dev, bool temp, int *val)
    94	{
    95		u32 regval;
    96		u8 regval_le[3];
    97		int ret;
    98		struct ens210_data *data = iio_priv(indio_dev);
    99	
   100		/* assert read */
   101		ret = i2c_smbus_write_byte_data(data->client, ENS210_REG_SENS_START,
   102					  temp ? ENS210_SENS_START_T_START :
   103						 ENS210_SENS_START_H_START);
   104		if (ret)
   105			return ret;
   106	
   107		/* wait for conversion to be ready */
   108		msleep(data->chip_info->conv_time_msec);
   109	
   110		ret = i2c_smbus_read_byte_data(data->client,
   111					       ENS210_REG_SENS_STAT);
   112		if (ret < 0)
   113			return ret;
   114	
   115		/* perform read */
   116		ret = i2c_smbus_read_i2c_block_data(
   117			data->client, temp ? ENS210_REG_T_VAL : ENS210_REG_H_VAL, 3,
   118			(u8 *)&regval_le);
   119		if (ret < 0) {
   120			dev_err(&data->client->dev, "failed to read register");
   121			return -EIO;
   122		} else if (ret != 3) {
   123			dev_err(&indio_dev->dev, "expected 3 bytes, received %d\n", ret);
   124			return -EIO;
   125		}
   126	
   127		regval = get_unaligned_le24(regval_le);
   128		if (ens210_crc7(regval) != ((regval >> 17) & 0x7f)) {
   129			/* crc fail */
   130			dev_err(&indio_dev->dev, "ens invalid crc\n");
   131			return -EIO;
   132		}
   133	
   134		*val = regval & 0xffff;
   135		return IIO_VAL_INT;
   136	}
   137	
   138	static int ens210_read_raw(struct iio_dev *indio_dev,
   139				   struct iio_chan_spec const *channel, int *val,
   140				   int *val2, long mask)
   141	{
   142		struct ens210_data *data = iio_priv(indio_dev);
   143		int ret = -EINVAL;
   144	
   145		switch (mask) {
   146		case IIO_CHAN_INFO_RAW:
   147			scoped_guard(mutex, &data->lock) {
   148				ret = ens210_get_measurement(
   149					indio_dev, channel->type == IIO_TEMP, val);
   150				if (ret)
   151					return ret;
   152				return IIO_VAL_INT;
   153			}
   154			return ret;
   155		case IIO_CHAN_INFO_SCALE:
   156			if (channel->type == IIO_TEMP) {
   157				*val = 15;
   158				*val2 = 625000;
   159			} else {
   160				*val = 1;
   161				*val2 = 953125;
   162			}
   163			return IIO_VAL_INT_PLUS_MICRO;
   164		case IIO_CHAN_INFO_OFFSET:
   165			if (channel->type == IIO_TEMP) {
   166				*val = -17481;
   167				*val2 = 600000;
   168				ret = IIO_VAL_INT_PLUS_MICRO;
   169				break;
   170			}
   171			*val = 0;
   172			return IIO_VAL_INT;
   173		default:
   174			return -EINVAL;
   175		}
   176		return ret;
   177	}
   178	
   179	static const struct iio_chan_spec ens210_channels[] = {
   180		{
   181			.type = IIO_TEMP,
   182			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
   183					      BIT(IIO_CHAN_INFO_SCALE) |
   184					      BIT(IIO_CHAN_INFO_OFFSET),
   185		},
   186		{
   187			.type = IIO_HUMIDITYRELATIVE,
   188			.info_mask_separate = BIT(IIO_CHAN_INFO_RAW) |
   189					      BIT(IIO_CHAN_INFO_SCALE) |
   190					      BIT(IIO_CHAN_INFO_OFFSET),
   191		}
   192	};
   193	
   194	static const struct iio_info ens210_info = {
   195		.read_raw = ens210_read_raw,
   196	};
   197	
   198	static int ens210_probe(struct i2c_client *client)
   199	{
 > 200		const struct i2c_device_id *id = i2c_client_get_device_id(client);
   201		struct ens210_data *data;
   202		struct iio_dev *indio_dev;
   203		uint16_t part_id;
   204		int ret;
   205	
   206		if (!i2c_check_functionality(client->adapter,
   207				I2C_FUNC_SMBUS_WRITE_BYTE_DATA |
   208				I2C_FUNC_SMBUS_WRITE_BYTE |
   209				I2C_FUNC_SMBUS_READ_I2C_BLOCK)) {
   210			dev_err_probe(&client->dev, -EOPNOTSUPP,
   211				"adapter does not support some i2c transactions\n");
   212			return -EOPNOTSUPP;
   213		}
   214	
   215		indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
   216		if (!indio_dev)
   217			return -ENOMEM;
   218	
   219		data = iio_priv(indio_dev);
   220		i2c_set_clientdata(client, indio_dev);
   221		data->client = client;
   222		mutex_init(&data->lock);
   223		data->chip_info = i2c_get_match_data(client);
   224	
   225		ret = devm_regulator_get_enable(&client->dev, "vdd");
   226		if (ret)
   227			return ret;
   228	
   229		/* reset device */
   230		ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL,
   231						ENS210_SYS_CTRL_SYS_RESET);
   232		if (ret)
   233			return ret;
   234	
   235		/* wait for device to become active */
   236		usleep_range(4000, 5000);
   237	
   238		/* disable low power mode */
   239		ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL, 0x00);
   240		if (ret)
   241			return ret;
   242	
   243		/* wait for device to finish */
   244		usleep_range(4000, 5000);
   245	
   246		/* get part_id */
   247		part_id = i2c_smbus_read_word_data(client, ENS210_REG_PART_ID);
   248	
   249		if (part_id != data->chip_info->part_id) {
 > 250			dev_info(&client->dev,
 > 251				"Part ID does not match (0x%04x != 0x%04lx)\n", part_id,
   252				data->chip_info->part_id);
   253		}
   254	
   255		/* reenable low power */
   256		ret = i2c_smbus_write_byte_data(client, ENS210_REG_SYS_CTRL,
   257						ENS210_SYS_CTRL_LOW_POWER_ENABLE);
   258		if (ret)
   259			return ret;
   260	
   261		indio_dev->name = data->chip_info->name;
   262		indio_dev->modes = INDIO_DIRECT_MODE;
   263		indio_dev->channels = ens210_channels;
   264		indio_dev->num_channels = ARRAY_SIZE(ens210_channels);
   265		indio_dev->info = &ens210_info;
   266	
   267		return devm_iio_device_register(&client->dev, indio_dev);
   268	}
   269	

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




[Index of Archives]     [Device Tree Compilter]     [Device Tree Spec]     [Linux Driver Backports]     [Video for Linux]     [Linux USB Devel]     [Linux PCI Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Yosemite Backpacking]


  Powered by Linux