Re: [PATCH v4 2/2] iio: accel: Add driver support for ADXL355

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

 



On Tue, Jul 27, 2021 at 7:16 PM Jonathan Cameron
<Jonathan.Cameron@xxxxxxxxxx> wrote:
>
> On Tue, 27 Jul 2021 19:45:46 +0800
> kernel test robot <lkp@xxxxxxxxx> wrote:
>
> > Hi Puranjay,
> >
> > I love your patch! Perhaps something to improve:
> >
> > [auto build test WARNING on iio/togreg]
> > [also build test WARNING on linus/master v5.14-rc3 next-20210726]
> > [If your patch is applied to the wrong git tree, kindly drop us a note.
> > And when submitting patch, we suggest to use '--base' as documented in
> > https://git-scm.com/docs/git-format-patch]
> >
> > url:    https://github.com/0day-ci/linux/commits/Puranjay-Mohan/iio-accel-add-support-for-ADXL355/20210727-131822
> > base:   https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio.git togreg
> > config: openrisc-randconfig-s031-20210727 (attached as .config)
> > compiler: or1k-linux-gcc (GCC) 10.3.0
> > reproduce:
> >         wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
> >         chmod +x ~/bin/make.cross
> >         # apt-get install sparse
> >         # sparse version: v0.6.3-341-g8af24329-dirty
> >         # https://github.com/0day-ci/linux/commit/a0ad8ce87d3d3357c64f98bec48b75d07b961da8
> >         git remote add linux-review https://github.com/0day-ci/linux
> >         git fetch --no-tags linux-review Puranjay-Mohan/iio-accel-add-support-for-ADXL355/20210727-131822
> >         git checkout a0ad8ce87d3d3357c64f98bec48b75d07b961da8
> >         # save the attached .config to linux build tree
> >         COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=openrisc
> >
> > If you fix the issue, kindly add following tag as appropriate
> > Reported-by: kernel test robot <lkp@xxxxxxxxx>
> >
> >
> > sparse warnings: (new ones prefixed by >>)
> > >> drivers/iio/accel/adxl355_core.c:204:16: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __be32 [usertype] regval @@     got int @@
> >    drivers/iio/accel/adxl355_core.c:204:16: sparse:     expected restricted __be32 [usertype] regval
> >    drivers/iio/accel/adxl355_core.c:204:16: sparse:     got int
> > >> drivers/iio/accel/adxl355_core.c:341:29: sparse: sparse: incorrect type in assignment (different base types) @@     expected restricted __be16 [usertype] out @@     got int @@
> >    drivers/iio/accel/adxl355_core.c:341:29: sparse:     expected restricted __be16 [usertype] out
> >    drivers/iio/accel/adxl355_core.c:341:29: sparse:     got int
> >
> > vim +204 drivers/iio/accel/adxl355_core.c
> >
> >    195
> >    196        static int adxl355_read_axis(struct adxl355_data *data, u8 addr)
> >    197        {
> >    198                __be32 regval;
> >    199                int ret;
> >    200
> >    201                ret = regmap_bulk_read(data->regmap, addr, data->transf_buf, 3);
> >    202                if (ret < 0)
> >    203                        return ret;
> >  > 204                regval = data->transf_buf[0] + (data->transf_buf[1] << 8)
> >    205                                             + (data->transf_buf[2] << 16);
>
> Note that you can almost certainly use something like get_unaligned_be24(data->transf_buf)
> here, though current code is some mixture of hand unwinding the endianness
> and calling a standard function to do it.

I feel doing it fully manually is fine as most other drivers are doing
it that way. I have sent the next version which does this fully
manually.
Also, I ran it through sparse this time before sending it.
>
> >    206
> >    207                return be32_to_cpu(regval) >> 8;
> >    208        }
> >    209
> >    210        static int adxl355_find_match(const int (*freq_tbl)[2], const int n,
> >    211                                      const int val, const int val2)
> >    212        {
> >    213                int i;
> >    214
> >    215                for (i = 0; i < n; i++) {
> >    216                        if (freq_tbl[i][0] == val && freq_tbl[i][1] == val2)
> >    217                                return i;
> >    218                }
> >    219
> >    220                return -EINVAL;
> >    221        }
> >    222
> >    223        static int adxl355_set_odr(struct adxl355_data *data,
> >    224                                   enum adxl355_odr odr)
> >    225        {
> >    226                int ret = 0;
> >    227
> >    228                mutex_lock(&data->lock);
> >    229
> >    230                if (data->odr == odr)
> >    231                        goto out_unlock;
> >    232
> >    233                ret = adxl355_set_op_mode(data, ADXL355_STANDBY);
> >    234                if (ret < 0)
> >    235                        goto out_unlock;
> >    236
> >    237                ret = regmap_update_bits(data->regmap, ADXL355_FILTER,
> >    238                                         ADXL355_FILTER_ODR_MSK,
> >    239                                         FIELD_PREP(ADXL355_FILTER_ODR_MSK, odr));
> >    240                if (ret < 0)
> >    241                        goto out_unlock;
> >    242
> >    243                data->odr = odr;
> >    244                adxl355_fill_3db_frequency_table(data);
> >    245
> >    246        out_unlock:
> >    247                ret = adxl355_set_op_mode(data, ADXL355_MEASUREMENT);
> >    248                mutex_unlock(&data->lock);
> >    249                return ret;
> >    250        }
> >    251
> >    252        static int adxl355_set_hpf_3db(struct adxl355_data *data,
> >    253                                       enum adxl355_hpf_3db hpf)
> >    254        {
> >    255                int ret = 0;
> >    256
> >    257                mutex_lock(&data->lock);
> >    258
> >    259                if (data->hpf_3db == hpf)
> >    260                        goto out_unlock;
> >    261
> >    262                ret = adxl355_set_op_mode(data, ADXL355_STANDBY);
> >    263                if (ret < 0)
> >    264                        goto out_unlock;
> >    265
> >    266                ret = regmap_update_bits(data->regmap, ADXL355_FILTER,
> >    267                                         ADXL355_FILTER_HPF_MSK,
> >    268                                         FIELD_PREP(ADXL355_FILTER_HPF_MSK, hpf));
> >    269                if (!ret)
> >    270                        data->hpf_3db = hpf;
> >    271
> >    272        out_unlock:
> >    273                ret = adxl355_set_op_mode(data, ADXL355_MEASUREMENT);
> >    274                mutex_unlock(&data->lock);
> >    275                return ret;
> >    276        }
> >    277
> >    278        static int adxl355_set_calibbias(struct adxl355_data *data,
> >    279                                         int channel2, int calibbias)
> >    280        {
> >    281                int ret = 0;
> >    282
> >    283                data->transf_buf[0] = (calibbias >> 8) & 0xFF;
> >    284                data->transf_buf[1] = calibbias & 0xFF;
> >    285                data->transf_buf[2] = 0;
> >    286
> >    287                mutex_lock(&data->lock);
> >    288
> >    289                ret = adxl355_set_op_mode(data, ADXL355_STANDBY);
> >    290                if (ret < 0)
> >    291                        goto out_unlock;
> >    292
> >    293                switch (channel2) {
> >    294                case IIO_MOD_X:
> >    295                        ret = regmap_bulk_write(data->regmap, ADXL355_OFFSET_X_H,
> >    296                                                data->transf_buf, 2);
> >    297                        if (ret < 0)
> >    298                                goto out_unlock;
> >    299                        data->x_calibbias = calibbias;
> >    300                        break;
> >    301                case IIO_MOD_Y:
> >    302                        ret = regmap_bulk_write(data->regmap, ADXL355_OFFSET_Y_H,
> >    303                                                data->transf_buf, 2);
> >    304                        if (ret < 0)
> >    305                                goto out_unlock;
> >    306                        data->y_calibbias = calibbias;
> >    307                        break;
> >    308                case IIO_MOD_Z:
> >    309                        ret = regmap_bulk_write(data->regmap, ADXL355_OFFSET_Z_H,
> >    310                                                data->transf_buf, 2);
> >    311                        if (ret < 0)
> >    312                                goto out_unlock;
> >    313                        data->z_calibbias = calibbias;
> >    314                        break;
> >    315                default:
> >    316                        ret = -EINVAL;
> >    317                        break;
> >    318                }
> >    319
> >    320        out_unlock:
> >    321                ret = adxl355_set_op_mode(data, ADXL355_MEASUREMENT);
> >    322                mutex_unlock(&data->lock);
> >    323                return ret;
> >    324        }
> >    325
> >    326        static int adxl355_read_raw(struct iio_dev *indio_dev,
> >    327                                    struct iio_chan_spec const *chan,
> >    328                                    int *val, int *val2, long mask)
> >    329        {
> >    330                struct adxl355_data *data = iio_priv(indio_dev);
> >    331                int ret;
> >    332                __be16 out;
> >    333
> >    334                switch (mask) {
> >    335                case IIO_CHAN_INFO_RAW:
> >    336                        switch (chan->type) {
> >    337                        case IIO_TEMP:
> >    338                                ret = adxl355_get_temp_data(data, chan->address);
> >    339                                if (ret < 0)
> >    340                                        return ret;
> >  > 341                                out = (data->transf_buf[1] << 8) + data->transf_buf[0];
> >    342                                *val = be16_to_cpu(out);
> >    343
> >    344                                return IIO_VAL_INT;
> >    345                        case IIO_ACCEL:
> >    346                                ret = adxl355_read_axis(data, chan->address);
> >    347                                if (ret < 0)
> >    348                                        return ret;
> >    349                                *val = sign_extend32(ret >> (chan->scan_type.shift),
> >    350                                                     chan->scan_type.realbits - 1);
> >    351                                return IIO_VAL_INT;
> >    352                        default:
> >    353                                return -EINVAL;
> >    354                        }
> >    355
> >    356                case IIO_CHAN_INFO_SCALE:
> >    357                        switch (chan->type) {
> >    358                        case IIO_TEMP:
> >    359                                *val = TEMP_SCALE_VAL;
> >    360                                *val2 = TEMP_SCALE_VAL2;
> >    361                                return IIO_VAL_INT_PLUS_MICRO;
> >    362                        case IIO_ACCEL:
> >    363                                *val = 0;
> >    364                                *val2 = ADXL355_NSCALE;
> >    365                                return IIO_VAL_INT_PLUS_NANO;
> >    366                        default:
> >    367                                return -EINVAL;
> >    368                        }
> >    369                case IIO_CHAN_INFO_OFFSET:
> >    370                        *val = TEMP_OFFSET_VAL;
> >    371                        *val2 = TEMP_OFFSET_VAL2;
> >    372                        return IIO_VAL_INT_PLUS_MICRO;
> >    373                case IIO_CHAN_INFO_CALIBBIAS:
> >    374                        if (chan->channel2 == IIO_MOD_X)
> >    375                                *val = data->x_calibbias;
> >    376                        else if (chan->channel2 == IIO_MOD_Y)
> >    377                                *val = data->y_calibbias;
> >    378                        else
> >    379                                *val = data->z_calibbias;
> >    380                        *val = sign_extend32(*val, 15);
> >    381                        return IIO_VAL_INT;
> >    382                case IIO_CHAN_INFO_SAMP_FREQ:
> >    383                        *val = adxl355_odr_table[data->odr][0];
> >    384                        *val2 = adxl355_odr_table[data->odr][1];
> >    385                        return IIO_VAL_INT_PLUS_MICRO;
> >    386                case IIO_CHAN_INFO_HIGH_PASS_FILTER_3DB_FREQUENCY:
> >    387                        *val = data->adxl355_hpf_3db_table[data->hpf_3db][0];
> >    388                        *val2 = data->adxl355_hpf_3db_table[data->hpf_3db][1];
> >    389                        return IIO_VAL_INT_PLUS_MICRO;
> >    390                default:
> >    391                        return -EINVAL;
> >    392                }
> >    393        }
> >    394
> >
> > ---
> > 0-DAY CI Kernel Test Service, Intel Corporation
> > https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx
> >
>


-- 
Thanks and Regards

Yours Truly,

Puranjay Mohan



[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