diff for duplicates of <20181111142339.59c1c713@archlinux> diff --git a/a/1.txt b/N1/1.txt index 7205375..271f7b3 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -4,7 +4,7 @@ Song Qiang <songqiang1304521@gmail.com> wrote: > PNI RM3100 is a high resolution, large signal immunity magnetometer, > composed of 3 single sensors and a processing chip with a MagI2C > interface. ->=20 +> > Following functions are available: > - Single-shot measurement from > /sys/bus/iio/devices/iio:deviceX/in_magn_{axis}_raw @@ -13,7 +13,7 @@ Song Qiang <songqiang1304521@gmail.com> wrote: > - Both i2c and spi interface are supported. > - Both interrupt and polling measurement is supported, depends on if > the 'interrupts' in DT is declared. ->=20 +> > Signed-off-by: Song Qiang <songqiang1304521@gmail.com> The goto copy2 bit just makes the code less readable. Better to duplicate the code. @@ -21,9 +21,7 @@ the code. A few other really trivial things I fixed up whilst applying. + some warnings about memcpy which are correct. -drivers/iio/magnetometer/rm3100-core.c:496:3: warning: =E2=80=98memcpy=E2= -=80=99 accessing 3 bytes at offsets 1272 and 1271 overlaps 2 bytes at offse= -t 1272 [-Wrestrict] +drivers/iio/magnetometer/rm3100-core.c:496:3: warning: ‘memcpy’ accessing 3 bytes at offsets 1272 and 1271 overlaps 2 bytes at offset 1272 [-Wrestrict] memcpy(data->buffer + 4, data->buffer + 3, 3); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ I switched them for memmove which I am fairly sure is safe in this @@ -49,16 +47,15 @@ Jonathan > create mode 100644 drivers/iio/magnetometer/rm3100-i2c.c > create mode 100644 drivers/iio/magnetometer/rm3100-spi.c > create mode 100644 drivers/iio/magnetometer/rm3100.h ->=20 +> > diff --git a/MAINTAINERS b/MAINTAINERS > index 1c0f771b859e..ca7a31736256 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS -> @@ -11824,6 +11824,13 @@ M: "Rafael J. Wysocki" <rafael.j.wysocki@intel.c= -om> +> @@ -11824,6 +11824,13 @@ M: "Rafael J. Wysocki" <rafael.j.wysocki@intel.com> > S: Maintained > F: drivers/pnp/ -> =20 +> > +PNI RM3100 IIO DRIVER > +M: Song Qiang <songqiang1304521@gmail.com> > +L: linux-iio@vger.kernel.org @@ -69,15 +66,14 @@ om> > POSIX CLOCKS and TIMERS > M: Thomas Gleixner <tglx@linutronix.de> > L: linux-kernel@vger.kernel.org -> diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/= -Kconfig +> diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig > index ed9d776d01af..8a63cbbca4b7 100644 > --- a/drivers/iio/magnetometer/Kconfig > +++ b/drivers/iio/magnetometer/Kconfig > @@ -175,4 +175,33 @@ config SENSORS_HMC5843_SPI > - hmc5843_core (core functions) > - hmc5843_spi (support for HMC5983) -> =20 +> > +config SENSORS_RM3100 > + tristate > + select IIO_BUFFER @@ -108,21 +104,19 @@ Kconfig > + will be called rm3100-spi. > + > endmenu -> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer= -/Makefile +> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/Makefile > index 664b2f866472..ba1bc34b82fa 100644 > --- a/drivers/iio/magnetometer/Makefile > +++ b/drivers/iio/magnetometer/Makefile -> @@ -24,3 +24,7 @@ obj-$(CONFIG_IIO_ST_MAGN_SPI_3AXIS) +=3D st_magn_spi.o -> obj-$(CONFIG_SENSORS_HMC5843) +=3D hmc5843_core.o -> obj-$(CONFIG_SENSORS_HMC5843_I2C) +=3D hmc5843_i2c.o -> obj-$(CONFIG_SENSORS_HMC5843_SPI) +=3D hmc5843_spi.o -> + -> +obj-$(CONFIG_SENSORS_RM3100) +=3D rm3100-core.o -> +obj-$(CONFIG_SENSORS_RM3100_I2C) +=3D rm3100-i2c.o -> +obj-$(CONFIG_SENSORS_RM3100_SPI) +=3D rm3100-spi.o -> diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magneto= -meter/rm3100-core.c +> @@ -24,3 +24,7 @@ obj-$(CONFIG_IIO_ST_MAGN_SPI_3AXIS) += st_magn_spi.o +> obj-$(CONFIG_SENSORS_HMC5843) += hmc5843_core.o +> obj-$(CONFIG_SENSORS_HMC5843_I2C) += hmc5843_i2c.o +> obj-$(CONFIG_SENSORS_HMC5843_SPI) += hmc5843_spi.o +> + +> +obj-$(CONFIG_SENSORS_RM3100) += rm3100-core.o +> +obj-$(CONFIG_SENSORS_RM3100_I2C) += rm3100-i2c.o +> +obj-$(CONFIG_SENSORS_RM3100_SPI) += rm3100-spi.o +> diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magnetometer/rm3100-core.c > new file mode 100644 > index 000000000000..e64290cf6406 > --- /dev/null @@ -197,9 +191,8 @@ directly. > +#define RM3100_V_REG_END RM3100_REG_STATUS > + > +/* -> + * This is computed by hand, is the sum of channel storage bits and padd= -ing -> + * bits, which is 4+4+4+12=3D24 in here. +> + * This is computed by hand, is the sum of channel storage bits and padding +> + * bits, which is 4+4+4+12=24 in here. > + */ > +#define RM3100_SCAN_BYTES 24 > + @@ -224,40 +217,40 @@ ing > + struct mutex lock; > +}; > + -> +static const struct regmap_range rm3100_readable_ranges[] =3D { +> +static const struct regmap_range rm3100_readable_ranges[] = { > + regmap_reg_range(RM3100_R_REG_START, RM3100_R_REG_END), > +}; > + -> +const struct regmap_access_table rm3100_readable_table =3D { -> + .yes_ranges =3D rm3100_readable_ranges, -> + .n_yes_ranges =3D ARRAY_SIZE(rm3100_readable_ranges), +> +const struct regmap_access_table rm3100_readable_table = { +> + .yes_ranges = rm3100_readable_ranges, +> + .n_yes_ranges = ARRAY_SIZE(rm3100_readable_ranges), > +}; > +EXPORT_SYMBOL_GPL(rm3100_readable_table); > + -> +static const struct regmap_range rm3100_writable_ranges[] =3D { +> +static const struct regmap_range rm3100_writable_ranges[] = { > + regmap_reg_range(RM3100_W_REG_START, RM3100_W_REG_END), > +}; > + -> +const struct regmap_access_table rm3100_writable_table =3D { -> + .yes_ranges =3D rm3100_writable_ranges, -> + .n_yes_ranges =3D ARRAY_SIZE(rm3100_writable_ranges), +> +const struct regmap_access_table rm3100_writable_table = { +> + .yes_ranges = rm3100_writable_ranges, +> + .n_yes_ranges = ARRAY_SIZE(rm3100_writable_ranges), > +}; > +EXPORT_SYMBOL_GPL(rm3100_writable_table); > + -> +static const struct regmap_range rm3100_volatile_ranges[] =3D { +> +static const struct regmap_range rm3100_volatile_ranges[] = { > + regmap_reg_range(RM3100_V_REG_START, RM3100_V_REG_END), > +}; > + -> +const struct regmap_access_table rm3100_volatile_table =3D { -> + .yes_ranges =3D rm3100_volatile_ranges, -> + .n_yes_ranges =3D ARRAY_SIZE(rm3100_volatile_ranges), +> +const struct regmap_access_table rm3100_volatile_table = { +> + .yes_ranges = rm3100_volatile_ranges, +> + .n_yes_ranges = ARRAY_SIZE(rm3100_volatile_ranges), > +}; > +EXPORT_SYMBOL_GPL(rm3100_volatile_table); > + > +static irqreturn_t rm3100_thread_fn(int irq, void *d) > +{ -> + struct iio_dev *indio_dev =3D d; -> + struct rm3100_data *data =3D iio_priv(indio_dev); +> + struct iio_dev *indio_dev = d; +> + struct rm3100_data *data = iio_priv(indio_dev); > + > + /* > + * Write operation to any register or read operation @@ -270,8 +263,8 @@ ing > + > +static irqreturn_t rm3100_irq_handler(int irq, void *d) > +{ -> + struct iio_dev *indio_dev =3D d; -> + struct rm3100_data *data =3D iio_priv(indio_dev); +> + struct iio_dev *indio_dev = d; +> + struct rm3100_data *data = iio_priv(indio_dev); > + > + switch (indio_dev->currentmode) { > + case INDIO_DIRECT_MODE: @@ -291,9 +284,9 @@ ing > + > +static int rm3100_wait_measurement(struct rm3100_data *data) > +{ -> + struct regmap *regmap =3D data->regmap; +> + struct regmap *regmap = data->regmap; > + unsigned int val; -> + int tries =3D 20; +> + int tries = 20; > + int ret; > + > + /* @@ -309,13 +302,13 @@ ing > + if (data->use_interrupt) > + reinit_completion(&data->measuring_done); > + -> + ret =3D regmap_read(regmap, RM3100_REG_STATUS, &val); +> + ret = regmap_read(regmap, RM3100_REG_STATUS, &val); > + if (ret < 0) > + return ret; > + -> + if ((val & RM3100_STATUS_DRDY) !=3D RM3100_STATUS_DRDY) { +> + if ((val & RM3100_STATUS_DRDY) != RM3100_STATUS_DRDY) { > + if (data->use_interrupt) { -> + ret =3D wait_for_completion_timeout(&data->measuring_done, +> + ret = wait_for_completion_timeout(&data->measuring_done, > + msecs_to_jiffies(data->conversion_time)); > + if (!ret) > + return -ETIMEDOUT; @@ -323,7 +316,7 @@ ing > + do { > + usleep_range(1000, 5000); > + -> + ret =3D regmap_read(regmap, RM3100_REG_STATUS, +> + ret = regmap_read(regmap, RM3100_REG_STATUS, > + &val); > + if (ret < 0) > + return ret; @@ -340,25 +333,25 @@ ing > + > +static int rm3100_read_mag(struct rm3100_data *data, int idx, int *val) > +{ -> + struct regmap *regmap =3D data->regmap; +> + struct regmap *regmap = data->regmap; > + u8 buffer[3]; > + int ret; > + > + mutex_lock(&data->lock); -> + ret =3D regmap_write(regmap, RM3100_REG_POLL, BIT(4 + idx)); +> + ret = regmap_write(regmap, RM3100_REG_POLL, BIT(4 + idx)); > + if (ret < 0) > + goto unlock_return; > + -> + ret =3D rm3100_wait_measurement(data); +> + ret = rm3100_wait_measurement(data); > + if (ret < 0) > + goto unlock_return; > + -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3); +> + ret = regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3); > + if (ret < 0) > + goto unlock_return; > + mutex_unlock(&data->lock); > + -> + *val =3D sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2], +> + *val = sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2], > + 23); > + > + return IIO_VAL_INT; @@ -370,23 +363,23 @@ ing > + > +#define RM3100_CHANNEL(axis, idx) \ > + { \ -> + .type =3D IIO_MAGN, \ -> + .modified =3D 1, \ -> + .channel2 =3D IIO_MOD_##axis, \ -> + .info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW), \ -> + .info_mask_shared_by_type =3D BIT(IIO_CHAN_INFO_SCALE) | \ +> + .type = IIO_MAGN, \ +> + .modified = 1, \ +> + .channel2 = IIO_MOD_##axis, \ +> + .info_mask_separate = BIT(IIO_CHAN_INFO_RAW), \ +> + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ > + BIT(IIO_CHAN_INFO_SAMP_FREQ), \ -> + .scan_index =3D idx, \ -> + .scan_type =3D { \ -> + .sign =3D 's', \ -> + .realbits =3D 24, \ -> + .storagebits =3D 32, \ -> + .shift =3D 8, \ -> + .endianness =3D IIO_BE, \ +> + .scan_index = idx, \ +> + .scan_type = { \ +> + .sign = 's', \ +> + .realbits = 24, \ +> + .storagebits = 32, \ +> + .shift = 8, \ +> + .endianness = IIO_BE, \ > + }, \ > + } > + -> +static const struct iio_chan_spec rm3100_channels[] =3D { +> +static const struct iio_chan_spec rm3100_channels[] = { > + RM3100_CHANNEL(X, 0), > + RM3100_CHANNEL(Y, 1), > + RM3100_CHANNEL(Z, 2), @@ -397,13 +390,13 @@ ing > + "600 300 150 75 37 18 9 4.5 2.3 1.2 0.6 0.3 0.015 0.075" > +); > + -> +static struct attribute *rm3100_attributes[] =3D { +> +static struct attribute *rm3100_attributes[] = { > + &iio_const_attr_sampling_frequency_available.dev_attr.attr, > + NULL, > +}; > + -> +static const struct attribute_group rm3100_attribute_group =3D { -> + .attrs =3D rm3100_attributes, +> +static const struct attribute_group rm3100_attribute_group = { +> + .attrs = rm3100_attributes, > +}; > + > +#define RM3100_SAMP_NUM 14 @@ -413,26 +406,25 @@ ing > + * Time between reading: rm3100_sam_rates[][2]ms. > + * The first one is actually 1.7ms. > + */ -> +static const int rm3100_samp_rates[RM3100_SAMP_NUM][3] =3D { +> +static const int rm3100_samp_rates[RM3100_SAMP_NUM][3] = { > + {600, 0, 2}, {300, 0, 3}, {150, 0, 7}, {75, 0, 13}, {37, 0, 27}, > + {18, 0, 55}, {9, 0, 110}, {4, 500000, 220}, {2, 300000, 440}, > + {1, 200000, 800}, {0, 600000, 1600}, {0, 300000, 3300}, > + {0, 15000, 6700}, {0, 75000, 13000} > +}; > + -> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int = -*val2) +> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int *val2) > +{ > + unsigned int tmp; > + int ret; > + > + mutex_lock(&data->lock); -> + ret =3D regmap_read(data->regmap, RM3100_REG_TMRC, &tmp); +> + ret = regmap_read(data->regmap, RM3100_REG_TMRC, &tmp); > + mutex_unlock(&data->lock); > + if (ret < 0) > + return ret; -> + *val =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][0]; -> + *val2 =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][1]; +> + *val = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][0]; +> + *val2 = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][1]; > + > + return IIO_VAL_INT_PLUS_MICRO; > +} @@ -442,8 +434,8 @@ ing > + int ret; > + u8 i; > + -> + for (i =3D 0; i < 3; i++) { -> + ret =3D regmap_write(data->regmap, RM3100_REG_CC_X + 2 * i, val); +> + for (i = 0; i < 3; i++) { +> + ret = regmap_write(data->regmap, RM3100_REG_CC_X + 2 * i, val); > + if (ret < 0) > + return ret; > + } @@ -451,14 +443,14 @@ ing > + /* > + * The scale of this sensor depends on the cycle count value, these > + * three values are corresponding to the cycle count value 50, 100, -> + * 200. scale =3D output / gain * 10^4. +> + * 200. scale = output / gain * 10^4. > + */ > + switch (val) { > + case 50: -> + data->scale =3D 500; +> + data->scale = 500; > + break; > + case 100: -> + data->scale =3D 263; +> + data->scale = 263; > + break; > + /* > + * case 200: @@ -466,58 +458,57 @@ ing > + * assume that it will never get a wrong parameter. > + */ > + default: -> + data->scale =3D 133; +> + data->scale = 133; > + } > + > + return 0; > +} > + -> +static int rm3100_set_samp_freq(struct iio_dev *indio_dev, int val, int = -val2) +> +static int rm3100_set_samp_freq(struct iio_dev *indio_dev, int val, int val2) > +{ -> + struct rm3100_data *data =3D iio_priv(indio_dev); -> + struct regmap *regmap =3D data->regmap; +> + struct rm3100_data *data = iio_priv(indio_dev); +> + struct regmap *regmap = data->regmap; > + unsigned int cycle_count; > + int ret; > + int i; > + > + mutex_lock(&data->lock); > + /* All cycle count registers use the same value. */ -> + ret =3D regmap_read(regmap, RM3100_REG_CC_X, &cycle_count); +> + ret = regmap_read(regmap, RM3100_REG_CC_X, &cycle_count); > + if (ret < 0) > + goto unlock_return; > + -> + for (i =3D 0; i < RM3100_SAMP_NUM; i++) { -> + if (val =3D=3D rm3100_samp_rates[i][0] && -> + val2 =3D=3D rm3100_samp_rates[i][1]) +> + for (i = 0; i < RM3100_SAMP_NUM; i++) { +> + if (val == rm3100_samp_rates[i][0] && +> + val2 == rm3100_samp_rates[i][1]) > + break; > + } -> + if (i =3D=3D RM3100_SAMP_NUM) { -> + ret =3D -EINVAL; +> + if (i == RM3100_SAMP_NUM) { +> + ret = -EINVAL; > + goto unlock_return; > + } > + -> + ret =3D regmap_write(regmap, RM3100_REG_TMRC, i + RM3100_TMRC_OFFSET); +> + ret = regmap_write(regmap, RM3100_REG_TMRC, i + RM3100_TMRC_OFFSET); > + if (ret < 0) > + goto unlock_return; > + > + /* Checking if cycle count registers need changing. */ -> + if (val =3D=3D 600 && cycle_count =3D=3D 200) { -> + ret =3D rm3100_set_cycle_count(data, 100); +> + if (val == 600 && cycle_count == 200) { +> + ret = rm3100_set_cycle_count(data, 100); > + if (ret < 0) > + goto unlock_return; -> + } else if (val !=3D 600 && cycle_count =3D=3D 100) { -> + ret =3D rm3100_set_cycle_count(data, 200); +> + } else if (val != 600 && cycle_count == 100) { +> + ret = rm3100_set_cycle_count(data, 200); > + if (ret < 0) > + goto unlock_return; > + } > + -> + if (indio_dev->currentmode =3D=3D INDIO_BUFFER_TRIGGERED) { +> + if (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) { > + /* Writing TMRC registers requires CMM reset. */ -> + ret =3D regmap_write(regmap, RM3100_REG_CMM, 0); +> + ret = regmap_write(regmap, RM3100_REG_CMM, 0); > + if (ret < 0) > + goto unlock_return; -> + ret =3D regmap_write(data->regmap, RM3100_REG_CMM, +> + ret = regmap_write(data->regmap, RM3100_REG_CMM, > + (*indio_dev->active_scan_mask & 0x7) << > + RM3100_CMM_AXIS_SHIFT | RM3100_CMM_START); > + if (ret < 0) @@ -525,7 +516,7 @@ val2) > + } > + mutex_unlock(&data->lock); > + -> + data->conversion_time =3D rm3100_samp_rates[i][2] * 2; +> + data->conversion_time = rm3100_samp_rates[i][2] * 2; > + return 0; > + > +unlock_return: @@ -537,22 +528,22 @@ val2) > + const struct iio_chan_spec *chan, > + int *val, int *val2, long mask) > +{ -> + struct rm3100_data *data =3D iio_priv(indio_dev); +> + struct rm3100_data *data = iio_priv(indio_dev); > + int ret; > + > + switch (mask) { > + case IIO_CHAN_INFO_RAW: -> + ret =3D iio_device_claim_direct_mode(indio_dev); +> + ret = iio_device_claim_direct_mode(indio_dev); > + if (ret < 0) > + return ret; > + -> + ret =3D rm3100_read_mag(data, chan->scan_index, val); +> + ret = rm3100_read_mag(data, chan->scan_index, val); > + iio_device_release_direct_mode(indio_dev); > + > + return ret; > + case IIO_CHAN_INFO_SCALE: -> + *val =3D 0; -> + *val2 =3D data->scale; +> + *val = 0; +> + *val2 = data->scale; > + > + return IIO_VAL_INT_PLUS_MICRO; > + case IIO_CHAN_INFO_SAMP_FREQ: @@ -574,15 +565,15 @@ val2) > + } > +} > + -> +static const struct iio_info rm3100_info =3D { -> + .attrs =3D &rm3100_attribute_group, -> + .read_raw =3D rm3100_read_raw, -> + .write_raw =3D rm3100_write_raw, +> +static const struct iio_info rm3100_info = { +> + .attrs = &rm3100_attribute_group, +> + .read_raw = rm3100_read_raw, +> + .write_raw = rm3100_write_raw, > +}; > + > +static int rm3100_buffer_preenable(struct iio_dev *indio_dev) > +{ -> + struct rm3100_data *data =3D iio_priv(indio_dev); +> + struct rm3100_data *data = iio_priv(indio_dev); > + > + /* Starting channels enabled. */ > + return regmap_write(data->regmap, RM3100_REG_CMM, @@ -592,59 +583,58 @@ val2) > + > +static int rm3100_buffer_postdisable(struct iio_dev *indio_dev) > +{ -> + struct rm3100_data *data =3D iio_priv(indio_dev); +> + struct rm3100_data *data = iio_priv(indio_dev); > + > + return regmap_write(data->regmap, RM3100_REG_CMM, 0); > +} > + -> +static const struct iio_buffer_setup_ops rm3100_buffer_ops =3D { -> + .preenable =3D rm3100_buffer_preenable, -> + .postenable =3D iio_triggered_buffer_postenable, -> + .predisable =3D iio_triggered_buffer_predisable, -> + .postdisable =3D rm3100_buffer_postdisable, +> +static const struct iio_buffer_setup_ops rm3100_buffer_ops = { +> + .preenable = rm3100_buffer_preenable, +> + .postenable = iio_triggered_buffer_postenable, +> + .predisable = iio_triggered_buffer_predisable, +> + .postdisable = rm3100_buffer_postdisable, > +}; > + > +static irqreturn_t rm3100_trigger_handler(int irq, void *p) > +{ -> + struct iio_poll_func *pf =3D p; -> + struct iio_dev *indio_dev =3D pf->indio_dev; -> + unsigned long scan_mask =3D *indio_dev->active_scan_mask; -> + unsigned int mask_len =3D indio_dev->masklength; -> + struct rm3100_data *data =3D iio_priv(indio_dev); -> + struct regmap *regmap =3D data->regmap; +> + struct iio_poll_func *pf = p; +> + struct iio_dev *indio_dev = pf->indio_dev; +> + unsigned long scan_mask = *indio_dev->active_scan_mask; +> + unsigned int mask_len = indio_dev->masklength; +> + struct rm3100_data *data = iio_priv(indio_dev); +> + struct regmap *regmap = data->regmap; > + int ret, i, bit; > + > + mutex_lock(&data->lock); > + switch (scan_mask) { > + case BIT(0) | BIT(1) | BIT(2): -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9); +> + ret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9); > + mutex_unlock(&data->lock); > + if (ret < 0) > + goto done; > + /* Convert XXXYYYZZZxxx to XXXxYYYxZZZx. x for paddings. */ -> + for (i =3D 2; i > 0; i--) +> + for (i = 2; i > 0; i--) > + memcpy(data->buffer + i * 4, data->buffer + i * 3, 3); > + break; Odd indenting of breaks. I'll clear that up. > + case BIT(0) | BIT(1): -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 6); +> + ret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 6); > + mutex_unlock(&data->lock); > + if (ret < 0) > + goto done; > + goto copy_2; > + case BIT(1) | BIT(2): -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MY2, data->buffer, 6); +> + ret = regmap_bulk_read(regmap, RM3100_REG_MY2, data->buffer, 6); > + mutex_unlock(&data->lock); > + if (ret < 0) > + goto done; > +copy_2: memcpy(data->buffer + 4, data->buffer + 3, 3); -This isn't a good idea. Saves one line of code and a tiny bit of duplicatio= -n but -makes it much harder to read. =20 +This isn't a good idea. Saves one line of code and a tiny bit of duplication but +makes it much harder to read. > + break; > + case BIT(0) | BIT(2): -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9); +> + ret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9); > + mutex_unlock(&data->lock); > + if (ret < 0) > + goto done; @@ -652,7 +642,7 @@ makes it much harder to read. =20 > + break; > + default: > + for_each_set_bit(bit, &scan_mask, mask_len) { -> + ret =3D regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * bit, +> + ret = regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * bit, > + data->buffer, 3); > + if (ret < 0) { > + mutex_unlock(&data->lock); @@ -673,38 +663,37 @@ makes it much harder to read. =20 > + return IRQ_HANDLED; > +} > + -> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int i= -rq) +> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq) > +{ > + struct iio_dev *indio_dev; > + struct rm3100_data *data; > + unsigned int tmp; > + int ret; > + -> + indio_dev =3D devm_iio_device_alloc(dev, sizeof(*data)); +> + indio_dev = devm_iio_device_alloc(dev, sizeof(*data)); > + if (!indio_dev) > + return -ENOMEM; > + -> + data =3D iio_priv(indio_dev); -> + data->regmap =3D regmap; +> + data = iio_priv(indio_dev); +> + data->regmap = regmap; > + > + mutex_init(&data->lock); > + -> + indio_dev->dev.parent =3D dev; -> + indio_dev->name =3D "rm3100"; -> + indio_dev->info =3D &rm3100_info; -> + indio_dev->channels =3D rm3100_channels; -> + indio_dev->num_channels =3D ARRAY_SIZE(rm3100_channels); -> + indio_dev->modes =3D INDIO_DIRECT_MODE | INDIO_BUFFER_TRIGGERED; -> + indio_dev->currentmode =3D INDIO_DIRECT_MODE; +> + indio_dev->dev.parent = dev; +> + indio_dev->name = "rm3100"; +> + indio_dev->info = &rm3100_info; +> + indio_dev->channels = rm3100_channels; +> + indio_dev->num_channels = ARRAY_SIZE(rm3100_channels); +> + indio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_TRIGGERED; +> + indio_dev->currentmode = INDIO_DIRECT_MODE; > + > + if (!irq) -> + data->use_interrupt =3D false; +> + data->use_interrupt = false; > + else { -> + data->use_interrupt =3D true; +> + data->use_interrupt = true; > + > + init_completion(&data->measuring_done); -> + ret =3D devm_request_threaded_irq(dev, +> + ret = devm_request_threaded_irq(dev, > + irq, > + rm3100_irq_handler, > + rm3100_thread_fn, @@ -717,34 +706,34 @@ rq) > + return ret; > + } > + -> + data->drdy_trig =3D devm_iio_trigger_alloc(dev, "%s-drdy%d", +> + data->drdy_trig = devm_iio_trigger_alloc(dev, "%s-drdy%d", > + indio_dev->name, > + indio_dev->id); > + if (!data->drdy_trig) > + return -ENOMEM; > + -> + data->drdy_trig->dev.parent =3D dev; -> + ret =3D devm_iio_trigger_register(dev, data->drdy_trig); +> + data->drdy_trig->dev.parent = dev; +> + ret = devm_iio_trigger_register(dev, data->drdy_trig); > + if (ret < 0) > + return ret; > + } > + -> + ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, +> + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, > + &iio_pollfunc_store_time, > + rm3100_trigger_handler, > + &rm3100_buffer_ops); > + if (ret < 0) > + return ret; > + -> + ret =3D regmap_read(regmap, RM3100_REG_TMRC, &tmp); +> + ret = regmap_read(regmap, RM3100_REG_TMRC, &tmp); > + if (ret < 0) > + return ret; > + /* Initializing max wait time, which is double conversion time. */ -> + data->conversion_time =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2] +> + data->conversion_time = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2] > + * 2; > + > + /* Cycle count values may not be what we want. */ -> + if ((tmp - RM3100_TMRC_OFFSET) =3D=3D 0) +> + if ((tmp - RM3100_TMRC_OFFSET) == 0) > + rm3100_set_cycle_count(data, 100); > + else > + rm3100_set_cycle_count(data, 200); @@ -756,8 +745,7 @@ rq) > +MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>"); > +MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer i2c driver"); > +MODULE_LICENSE("GPL v2"); -> diff --git a/drivers/iio/magnetometer/rm3100-i2c.c b/drivers/iio/magnetom= -eter/rm3100-i2c.c +> diff --git a/drivers/iio/magnetometer/rm3100-i2c.c b/drivers/iio/magnetometer/rm3100-i2c.c > new file mode 100644 > index 000000000000..1ac622c6d6c9 > --- /dev/null @@ -777,48 +765,47 @@ eter/rm3100-i2c.c > + > +#include "rm3100.h" > + -> +static const struct regmap_config rm3100_regmap_config =3D { -> + .reg_bits =3D 8, -> + .val_bits =3D 8, +> +static const struct regmap_config rm3100_regmap_config = { +> + .reg_bits = 8, +> + .val_bits = 8, > + -> + .rd_table =3D &rm3100_readable_table, -> + .wr_table =3D &rm3100_writable_table, -> + .volatile_table =3D &rm3100_volatile_table, +> + .rd_table = &rm3100_readable_table, +> + .wr_table = &rm3100_writable_table, +> + .volatile_table = &rm3100_volatile_table, > + -> + .cache_type =3D REGCACHE_RBTREE, +> + .cache_type = REGCACHE_RBTREE, > +}; > + > +static int rm3100_probe(struct i2c_client *client) > +{ > + struct regmap *regmap; > + -> + regmap =3D devm_regmap_init_i2c(client, &rm3100_regmap_config); +> + regmap = devm_regmap_init_i2c(client, &rm3100_regmap_config); > + if (IS_ERR(regmap)) > + return PTR_ERR(regmap); > + > + return rm3100_common_probe(&client->dev, regmap, client->irq); > +} > + -> +static const struct of_device_id rm3100_dt_match[] =3D { -> + { .compatible =3D "pni,rm3100", }, +> +static const struct of_device_id rm3100_dt_match[] = { +> + { .compatible = "pni,rm3100", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, rm3100_dt_match); > + -> +static struct i2c_driver rm3100_driver =3D { -> + .driver =3D { -> + .name =3D "rm3100-i2c", -> + .of_match_table =3D rm3100_dt_match, +> +static struct i2c_driver rm3100_driver = { +> + .driver = { +> + .name = "rm3100-i2c", +> + .of_match_table = rm3100_dt_match, > + }, -> + .probe_new =3D rm3100_probe, +> + .probe_new = rm3100_probe, > +}; > +module_i2c_driver(rm3100_driver); > + > +MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>"); > +MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer i2c driver"); > +MODULE_LICENSE("GPL v2"); -> diff --git a/drivers/iio/magnetometer/rm3100-spi.c b/drivers/iio/magnetom= -eter/rm3100-spi.c +> diff --git a/drivers/iio/magnetometer/rm3100-spi.c b/drivers/iio/magnetometer/rm3100-spi.c > new file mode 100644 > index 000000000000..65d5eb9e4f5e > --- /dev/null @@ -836,17 +823,17 @@ eter/rm3100-spi.c > + > +#include "rm3100.h" > + -> +static const struct regmap_config rm3100_regmap_config =3D { -> + .reg_bits =3D 8, -> + .val_bits =3D 8, +> +static const struct regmap_config rm3100_regmap_config = { +> + .reg_bits = 8, +> + .val_bits = 8, > + -> + .rd_table =3D &rm3100_readable_table, -> + .wr_table =3D &rm3100_writable_table, -> + .volatile_table =3D &rm3100_volatile_table, +> + .rd_table = &rm3100_readable_table, +> + .wr_table = &rm3100_writable_table, +> + .volatile_table = &rm3100_volatile_table, > + -> + .read_flag_mask =3D 0x80, +> + .read_flag_mask = 0x80, > + -> + .cache_type =3D REGCACHE_RBTREE, +> + .cache_type = REGCACHE_RBTREE, > +}; > + > +static int rm3100_probe(struct spi_device *spi) @@ -855,41 +842,40 @@ eter/rm3100-spi.c > + int ret; > + > + /* Actually this device supports both mode 0 and mode 3. */ -> + spi->mode =3D SPI_MODE_0; +> + spi->mode = SPI_MODE_0; > + /* Data rates cannot exceed 1Mbits. */ -> + spi->max_speed_hz =3D 1000000; -> + spi->bits_per_word =3D 8; -> + ret =3D spi_setup(spi); +> + spi->max_speed_hz = 1000000; +> + spi->bits_per_word = 8; +> + ret = spi_setup(spi); > + if (ret) > + return ret; > + -> + regmap =3D devm_regmap_init_spi(spi, &rm3100_regmap_config); +> + regmap = devm_regmap_init_spi(spi, &rm3100_regmap_config); > + if (IS_ERR(regmap)) > + return PTR_ERR(regmap); > + > + return rm3100_common_probe(&spi->dev, regmap, spi->irq); > +} > + -> +static const struct of_device_id rm3100_dt_match[] =3D { -> + { .compatible =3D "pni,rm3100", }, +> +static const struct of_device_id rm3100_dt_match[] = { +> + { .compatible = "pni,rm3100", }, > + { } > +}; > +MODULE_DEVICE_TABLE(of, rm3100_dt_match); > + -> +static struct spi_driver rm3100_driver =3D { -> + .driver =3D { -> + .name =3D "rm3100-spi", -> + .of_match_table =3D rm3100_dt_match, +> +static struct spi_driver rm3100_driver = { +> + .driver = { +> + .name = "rm3100-spi", +> + .of_match_table = rm3100_dt_match, > + }, -> + .probe =3D rm3100_probe, +> + .probe = rm3100_probe, > +}; > +module_spi_driver(rm3100_driver); > + > +MODULE_AUTHOR("Song Qiang <songqiang1304521@gmail.com>"); > +MODULE_DESCRIPTION("PNI RM3100 3-axis magnetometer spi driver"); > +MODULE_LICENSE("GPL v2"); -> diff --git a/drivers/iio/magnetometer/rm3100.h b/drivers/iio/magnetometer= -/rm3100.h +> diff --git a/drivers/iio/magnetometer/rm3100.h b/drivers/iio/magnetometer/rm3100.h > new file mode 100644 > index 000000000000..c3508218bc77 > --- /dev/null @@ -909,7 +895,6 @@ eter/rm3100-spi.c > +extern const struct regmap_access_table rm3100_writable_table; > +extern const struct regmap_access_table rm3100_volatile_table; > + -> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int i= -rq); +> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq); > + > +#endif /* RM3100_CORE_H */ diff --git a/a/content_digest b/N1/content_digest index bf49929..02f76f8 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -22,7 +22,7 @@ "> PNI RM3100 is a high resolution, large signal immunity magnetometer,\n" "> composed of 3 single sensors and a processing chip with a MagI2C\n" "> interface.\n" - ">=20\n" + "> \n" "> Following functions are available:\n" "> - Single-shot measurement from\n" "> /sys/bus/iio/devices/iio:deviceX/in_magn_{axis}_raw\n" @@ -31,7 +31,7 @@ "> - Both i2c and spi interface are supported.\n" "> - Both interrupt and polling measurement is supported, depends on if\n" "> the 'interrupts' in DT is declared.\n" - ">=20\n" + "> \n" "> Signed-off-by: Song Qiang <songqiang1304521@gmail.com>\n" "The goto copy2 bit just makes the code less readable. Better to duplicate\n" "the code.\n" @@ -39,9 +39,7 @@ "A few other really trivial things I fixed up whilst applying.\n" "+ some warnings about memcpy which are correct.\n" "\n" - "drivers/iio/magnetometer/rm3100-core.c:496:3: warning: =E2=80=98memcpy=E2=\n" - "=80=99 accessing 3 bytes at offsets 1272 and 1271 overlaps 2 bytes at offse=\n" - "t 1272 [-Wrestrict]\n" + "drivers/iio/magnetometer/rm3100-core.c:496:3: warning: \342\200\230memcpy\342\200\231 accessing 3 bytes at offsets 1272 and 1271 overlaps 2 bytes at offset 1272 [-Wrestrict]\n" " memcpy(data->buffer + 4, data->buffer + 3, 3);\n" " ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" "I switched them for memmove which I am fairly sure is safe in this\n" @@ -67,16 +65,15 @@ "> create mode 100644 drivers/iio/magnetometer/rm3100-i2c.c\n" "> create mode 100644 drivers/iio/magnetometer/rm3100-spi.c\n" "> create mode 100644 drivers/iio/magnetometer/rm3100.h\n" - ">=20\n" + "> \n" "> diff --git a/MAINTAINERS b/MAINTAINERS\n" "> index 1c0f771b859e..ca7a31736256 100644\n" "> --- a/MAINTAINERS\n" "> +++ b/MAINTAINERS\n" - "> @@ -11824,6 +11824,13 @@ M:\t\"Rafael J. Wysocki\" <rafael.j.wysocki@intel.c=\n" - "om>\n" + "> @@ -11824,6 +11824,13 @@ M:\t\"Rafael J. Wysocki\" <rafael.j.wysocki@intel.com>\n" "> S:\tMaintained\n" "> F:\tdrivers/pnp/\n" - "> =20\n" + "> \n" "> +PNI RM3100 IIO DRIVER\n" "> +M:\tSong Qiang <songqiang1304521@gmail.com>\n" "> +L:\tlinux-iio@vger.kernel.org\n" @@ -87,15 +84,14 @@ "> POSIX CLOCKS and TIMERS\n" "> M:\tThomas Gleixner <tglx@linutronix.de>\n" "> L:\tlinux-kernel@vger.kernel.org\n" - "> diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/=\n" - "Kconfig\n" + "> diff --git a/drivers/iio/magnetometer/Kconfig b/drivers/iio/magnetometer/Kconfig\n" "> index ed9d776d01af..8a63cbbca4b7 100644\n" "> --- a/drivers/iio/magnetometer/Kconfig\n" "> +++ b/drivers/iio/magnetometer/Kconfig\n" "> @@ -175,4 +175,33 @@ config SENSORS_HMC5843_SPI\n" "> \t - hmc5843_core (core functions)\n" "> \t - hmc5843_spi (support for HMC5983)\n" - "> =20\n" + "> \n" "> +config SENSORS_RM3100\n" "> +\ttristate\n" "> +\tselect IIO_BUFFER\n" @@ -126,21 +122,19 @@ "> +\t will be called rm3100-spi.\n" "> +\n" "> endmenu\n" - "> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer=\n" - "/Makefile\n" + "> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetometer/Makefile\n" "> index 664b2f866472..ba1bc34b82fa 100644\n" "> --- a/drivers/iio/magnetometer/Makefile\n" "> +++ b/drivers/iio/magnetometer/Makefile\n" - "> @@ -24,3 +24,7 @@ obj-$(CONFIG_IIO_ST_MAGN_SPI_3AXIS) +=3D st_magn_spi.o\n" - "> obj-$(CONFIG_SENSORS_HMC5843)\t\t+=3D hmc5843_core.o\n" - "> obj-$(CONFIG_SENSORS_HMC5843_I2C)\t+=3D hmc5843_i2c.o\n" - "> obj-$(CONFIG_SENSORS_HMC5843_SPI)\t+=3D hmc5843_spi.o\n" - "> +\n" - "> +obj-$(CONFIG_SENSORS_RM3100)\t\t+=3D rm3100-core.o\n" - "> +obj-$(CONFIG_SENSORS_RM3100_I2C)\t+=3D rm3100-i2c.o\n" - "> +obj-$(CONFIG_SENSORS_RM3100_SPI)\t+=3D rm3100-spi.o\n" - "> diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magneto=\n" - "meter/rm3100-core.c\n" + "> @@ -24,3 +24,7 @@ obj-$(CONFIG_IIO_ST_MAGN_SPI_3AXIS) += st_magn_spi.o\n" + "> obj-$(CONFIG_SENSORS_HMC5843)\t\t+= hmc5843_core.o\n" + "> obj-$(CONFIG_SENSORS_HMC5843_I2C)\t+= hmc5843_i2c.o\n" + "> obj-$(CONFIG_SENSORS_HMC5843_SPI)\t+= hmc5843_spi.o\n" + "> +\n" + "> +obj-$(CONFIG_SENSORS_RM3100)\t\t+= rm3100-core.o\n" + "> +obj-$(CONFIG_SENSORS_RM3100_I2C)\t+= rm3100-i2c.o\n" + "> +obj-$(CONFIG_SENSORS_RM3100_SPI)\t+= rm3100-spi.o\n" + "> diff --git a/drivers/iio/magnetometer/rm3100-core.c b/drivers/iio/magnetometer/rm3100-core.c\n" "> new file mode 100644\n" "> index 000000000000..e64290cf6406\n" "> --- /dev/null\n" @@ -215,9 +209,8 @@ "> +#define RM3100_V_REG_END\t\tRM3100_REG_STATUS\n" "> +\n" "> +/*\n" - "> + * This is computed by hand, is the sum of channel storage bits and padd=\n" - "ing\n" - "> + * bits, which is 4+4+4+12=3D24 in here.\n" + "> + * This is computed by hand, is the sum of channel storage bits and padding\n" + "> + * bits, which is 4+4+4+12=24 in here.\n" "> + */\n" "> +#define RM3100_SCAN_BYTES\t\t24\n" "> +\n" @@ -242,40 +235,40 @@ "> +\tstruct mutex lock;\n" "> +};\n" "> +\n" - "> +static const struct regmap_range rm3100_readable_ranges[] =3D {\n" + "> +static const struct regmap_range rm3100_readable_ranges[] = {\n" "> +\tregmap_reg_range(RM3100_R_REG_START, RM3100_R_REG_END),\n" "> +};\n" "> +\n" - "> +const struct regmap_access_table rm3100_readable_table =3D {\n" - "> +\t.yes_ranges =3D rm3100_readable_ranges,\n" - "> +\t.n_yes_ranges =3D ARRAY_SIZE(rm3100_readable_ranges),\n" + "> +const struct regmap_access_table rm3100_readable_table = {\n" + "> +\t.yes_ranges = rm3100_readable_ranges,\n" + "> +\t.n_yes_ranges = ARRAY_SIZE(rm3100_readable_ranges),\n" "> +};\n" "> +EXPORT_SYMBOL_GPL(rm3100_readable_table);\n" "> +\n" - "> +static const struct regmap_range rm3100_writable_ranges[] =3D {\n" + "> +static const struct regmap_range rm3100_writable_ranges[] = {\n" "> +\tregmap_reg_range(RM3100_W_REG_START, RM3100_W_REG_END),\n" "> +};\n" "> +\n" - "> +const struct regmap_access_table rm3100_writable_table =3D {\n" - "> +\t.yes_ranges =3D rm3100_writable_ranges,\n" - "> +\t.n_yes_ranges =3D ARRAY_SIZE(rm3100_writable_ranges),\n" + "> +const struct regmap_access_table rm3100_writable_table = {\n" + "> +\t.yes_ranges = rm3100_writable_ranges,\n" + "> +\t.n_yes_ranges = ARRAY_SIZE(rm3100_writable_ranges),\n" "> +};\n" "> +EXPORT_SYMBOL_GPL(rm3100_writable_table);\n" "> +\n" - "> +static const struct regmap_range rm3100_volatile_ranges[] =3D {\n" + "> +static const struct regmap_range rm3100_volatile_ranges[] = {\n" "> +\tregmap_reg_range(RM3100_V_REG_START, RM3100_V_REG_END),\n" "> +};\n" "> +\n" - "> +const struct regmap_access_table rm3100_volatile_table =3D {\n" - "> +\t.yes_ranges =3D rm3100_volatile_ranges,\n" - "> +\t.n_yes_ranges =3D ARRAY_SIZE(rm3100_volatile_ranges),\n" + "> +const struct regmap_access_table rm3100_volatile_table = {\n" + "> +\t.yes_ranges = rm3100_volatile_ranges,\n" + "> +\t.n_yes_ranges = ARRAY_SIZE(rm3100_volatile_ranges),\n" "> +};\n" "> +EXPORT_SYMBOL_GPL(rm3100_volatile_table);\n" "> +\n" "> +static irqreturn_t rm3100_thread_fn(int irq, void *d)\n" "> +{\n" - "> +\tstruct iio_dev *indio_dev =3D d;\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" + "> +\tstruct iio_dev *indio_dev = d;\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" "> +\n" "> +\t/*\n" "> +\t * Write operation to any register or read operation\n" @@ -288,8 +281,8 @@ "> +\n" "> +static irqreturn_t rm3100_irq_handler(int irq, void *d)\n" "> +{\n" - "> +\tstruct iio_dev *indio_dev =3D d;\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" + "> +\tstruct iio_dev *indio_dev = d;\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" "> +\n" "> +\tswitch (indio_dev->currentmode) {\n" "> +\tcase INDIO_DIRECT_MODE:\n" @@ -309,9 +302,9 @@ "> +\n" "> +static int rm3100_wait_measurement(struct rm3100_data *data)\n" "> +{\n" - "> +\tstruct regmap *regmap =3D data->regmap;\n" + "> +\tstruct regmap *regmap = data->regmap;\n" "> +\tunsigned int val;\n" - "> +\tint tries =3D 20;\n" + "> +\tint tries = 20;\n" "> +\tint ret;\n" "> +\n" "> +\t/*\n" @@ -327,13 +320,13 @@ "> +\tif (data->use_interrupt)\n" "> +\t\treinit_completion(&data->measuring_done);\n" "> +\n" - "> +\tret =3D regmap_read(regmap, RM3100_REG_STATUS, &val);\n" + "> +\tret = regmap_read(regmap, RM3100_REG_STATUS, &val);\n" "> +\tif (ret < 0)\n" "> +\t\treturn ret;\n" "> +\n" - "> +\tif ((val & RM3100_STATUS_DRDY) !=3D RM3100_STATUS_DRDY) {\n" + "> +\tif ((val & RM3100_STATUS_DRDY) != RM3100_STATUS_DRDY) {\n" "> +\t\tif (data->use_interrupt) {\n" - "> +\t\t\tret =3D wait_for_completion_timeout(&data->measuring_done,\n" + "> +\t\t\tret = wait_for_completion_timeout(&data->measuring_done,\n" "> +\t\t\t\tmsecs_to_jiffies(data->conversion_time));\n" "> +\t\t\tif (!ret)\n" "> +\t\t\t\treturn -ETIMEDOUT;\n" @@ -341,7 +334,7 @@ "> +\t\t\tdo {\n" "> +\t\t\t\tusleep_range(1000, 5000);\n" "> +\n" - "> +\t\t\t\tret =3D regmap_read(regmap, RM3100_REG_STATUS,\n" + "> +\t\t\t\tret = regmap_read(regmap, RM3100_REG_STATUS,\n" "> +\t\t\t\t\t\t &val);\n" "> +\t\t\t\tif (ret < 0)\n" "> +\t\t\t\t\treturn ret;\n" @@ -358,25 +351,25 @@ "> +\n" "> +static int rm3100_read_mag(struct rm3100_data *data, int idx, int *val)\n" "> +{\n" - "> +\tstruct regmap *regmap =3D data->regmap;\n" + "> +\tstruct regmap *regmap = data->regmap;\n" "> +\tu8 buffer[3];\n" "> +\tint ret;\n" "> +\n" "> +\tmutex_lock(&data->lock);\n" - "> +\tret =3D regmap_write(regmap, RM3100_REG_POLL, BIT(4 + idx));\n" + "> +\tret = regmap_write(regmap, RM3100_REG_POLL, BIT(4 + idx));\n" "> +\tif (ret < 0)\n" "> +\t\tgoto unlock_return;\n" "> +\n" - "> +\tret =3D rm3100_wait_measurement(data);\n" + "> +\tret = rm3100_wait_measurement(data);\n" "> +\tif (ret < 0)\n" "> +\t\tgoto unlock_return;\n" "> +\n" - "> +\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3);\n" + "> +\tret = regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3);\n" "> +\tif (ret < 0)\n" "> +\t\tgoto unlock_return;\n" "> +\tmutex_unlock(&data->lock);\n" "> +\n" - "> +\t*val =3D sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2],\n" + "> +\t*val = sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer[2],\n" "> +\t\t\t 23);\n" "> +\n" "> +\treturn IIO_VAL_INT;\n" @@ -388,23 +381,23 @@ "> +\n" "> +#define RM3100_CHANNEL(axis, idx)\t\t\t\t\t\\\n" "> +\t{\t\t\t\t\t\t\t\t\\\n" - "> +\t\t.type =3D IIO_MAGN,\t\t\t\t\t\\\n" - "> +\t\t.modified =3D 1,\t\t\t\t\t\t\\\n" - "> +\t\t.channel2 =3D IIO_MOD_##axis,\t\t\t\t\\\n" - "> +\t\t.info_mask_separate =3D BIT(IIO_CHAN_INFO_RAW),\t\t\\\n" - "> +\t\t.info_mask_shared_by_type =3D BIT(IIO_CHAN_INFO_SCALE) |\t\\\n" + "> +\t\t.type = IIO_MAGN,\t\t\t\t\t\\\n" + "> +\t\t.modified = 1,\t\t\t\t\t\t\\\n" + "> +\t\t.channel2 = IIO_MOD_##axis,\t\t\t\t\\\n" + "> +\t\t.info_mask_separate = BIT(IIO_CHAN_INFO_RAW),\t\t\\\n" + "> +\t\t.info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) |\t\\\n" "> +\t\t\tBIT(IIO_CHAN_INFO_SAMP_FREQ),\t\t\t\\\n" - "> +\t\t.scan_index =3D idx,\t\t\t\t\t\\\n" - "> +\t\t.scan_type =3D {\t\t\t\t\t\t\\\n" - "> +\t\t\t.sign =3D 's',\t\t\t\t\t\\\n" - "> +\t\t\t.realbits =3D 24,\t\t\t\t\t\\\n" - "> +\t\t\t.storagebits =3D 32,\t\t\t\t\\\n" - "> +\t\t\t.shift =3D 8,\t\t\t\t\t\\\n" - "> +\t\t\t.endianness =3D IIO_BE,\t\t\t\t\\\n" + "> +\t\t.scan_index = idx,\t\t\t\t\t\\\n" + "> +\t\t.scan_type = {\t\t\t\t\t\t\\\n" + "> +\t\t\t.sign = 's',\t\t\t\t\t\\\n" + "> +\t\t\t.realbits = 24,\t\t\t\t\t\\\n" + "> +\t\t\t.storagebits = 32,\t\t\t\t\\\n" + "> +\t\t\t.shift = 8,\t\t\t\t\t\\\n" + "> +\t\t\t.endianness = IIO_BE,\t\t\t\t\\\n" "> +\t\t},\t\t\t\t\t\t\t\\\n" "> +\t}\n" "> +\n" - "> +static const struct iio_chan_spec rm3100_channels[] =3D {\n" + "> +static const struct iio_chan_spec rm3100_channels[] = {\n" "> +\tRM3100_CHANNEL(X, 0),\n" "> +\tRM3100_CHANNEL(Y, 1),\n" "> +\tRM3100_CHANNEL(Z, 2),\n" @@ -415,13 +408,13 @@ "> +\t\"600 300 150 75 37 18 9 4.5 2.3 1.2 0.6 0.3 0.015 0.075\"\n" "> +);\n" "> +\n" - "> +static struct attribute *rm3100_attributes[] =3D {\n" + "> +static struct attribute *rm3100_attributes[] = {\n" "> +\t&iio_const_attr_sampling_frequency_available.dev_attr.attr,\n" "> +\tNULL,\n" "> +};\n" "> +\n" - "> +static const struct attribute_group rm3100_attribute_group =3D {\n" - "> +\t.attrs =3D rm3100_attributes,\n" + "> +static const struct attribute_group rm3100_attribute_group = {\n" + "> +\t.attrs = rm3100_attributes,\n" "> +};\n" "> +\n" "> +#define RM3100_SAMP_NUM\t\t\t14\n" @@ -431,26 +424,25 @@ "> + * Time between reading: rm3100_sam_rates[][2]ms.\n" "> + * The first one is actually 1.7ms.\n" "> + */\n" - "> +static const int rm3100_samp_rates[RM3100_SAMP_NUM][3] =3D {\n" + "> +static const int rm3100_samp_rates[RM3100_SAMP_NUM][3] = {\n" "> +\t{600, 0, 2}, {300, 0, 3}, {150, 0, 7}, {75, 0, 13}, {37, 0, 27},\n" "> +\t{18, 0, 55}, {9, 0, 110}, {4, 500000, 220}, {2, 300000, 440},\n" "> +\t{1, 200000, 800}, {0, 600000, 1600}, {0, 300000, 3300},\n" "> +\t{0, 15000, 6700}, {0, 75000, 13000}\n" "> +};\n" "> +\n" - "> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int =\n" - "*val2)\n" + "> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int *val2)\n" "> +{\n" "> +\tunsigned int tmp;\n" "> +\tint ret;\n" "> +\n" "> +\tmutex_lock(&data->lock);\n" - "> +\tret =3D regmap_read(data->regmap, RM3100_REG_TMRC, &tmp);\n" + "> +\tret = regmap_read(data->regmap, RM3100_REG_TMRC, &tmp);\n" "> +\tmutex_unlock(&data->lock);\n" "> +\tif (ret < 0)\n" "> +\t\treturn ret;\n" - "> +\t*val =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][0];\n" - "> +\t*val2 =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][1];\n" + "> +\t*val = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][0];\n" + "> +\t*val2 = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][1];\n" "> +\n" "> +\treturn IIO_VAL_INT_PLUS_MICRO;\n" "> +}\n" @@ -460,8 +452,8 @@ "> +\tint ret;\n" "> +\tu8 i;\n" "> +\n" - "> +\tfor (i =3D 0; i < 3; i++) {\n" - "> +\t\tret =3D regmap_write(data->regmap, RM3100_REG_CC_X + 2 * i, val);\n" + "> +\tfor (i = 0; i < 3; i++) {\n" + "> +\t\tret = regmap_write(data->regmap, RM3100_REG_CC_X + 2 * i, val);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\treturn ret;\n" "> +\t}\n" @@ -469,14 +461,14 @@ "> +\t/*\n" "> +\t * The scale of this sensor depends on the cycle count value, these\n" "> +\t * three values are corresponding to the cycle count value 50, 100,\n" - "> +\t * 200. scale =3D output / gain * 10^4.\n" + "> +\t * 200. scale = output / gain * 10^4.\n" "> +\t */\n" "> +\tswitch (val) {\n" "> +\tcase 50:\n" - "> +\t\tdata->scale =3D 500;\n" + "> +\t\tdata->scale = 500;\n" "> +\t\tbreak;\n" "> +\tcase 100:\n" - "> +\t\tdata->scale =3D 263;\n" + "> +\t\tdata->scale = 263;\n" "> +\t\tbreak;\n" "> +\t/*\n" "> +\t * case 200:\n" @@ -484,58 +476,57 @@ "> +\t * assume that it will never get a wrong parameter.\n" "> +\t */\n" "> +\tdefault:\n" - "> +\t\tdata->scale =3D 133;\n" + "> +\t\tdata->scale = 133;\n" "> +\t}\n" "> +\n" "> +\treturn 0;\n" "> +}\n" "> +\n" - "> +static int rm3100_set_samp_freq(struct iio_dev *indio_dev, int val, int =\n" - "val2)\n" + "> +static int rm3100_set_samp_freq(struct iio_dev *indio_dev, int val, int val2)\n" "> +{\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" - "> +\tstruct regmap *regmap =3D data->regmap;\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" + "> +\tstruct regmap *regmap = data->regmap;\n" "> +\tunsigned int cycle_count;\n" "> +\tint ret;\n" "> +\tint i;\n" "> +\n" "> +\tmutex_lock(&data->lock);\n" "> +\t/* All cycle count registers use the same value. */\n" - "> +\tret =3D regmap_read(regmap, RM3100_REG_CC_X, &cycle_count);\n" + "> +\tret = regmap_read(regmap, RM3100_REG_CC_X, &cycle_count);\n" "> +\tif (ret < 0)\n" "> +\t\tgoto unlock_return;\n" "> +\n" - "> +\tfor (i =3D 0; i < RM3100_SAMP_NUM; i++) {\n" - "> +\t\tif (val =3D=3D rm3100_samp_rates[i][0] &&\n" - "> +\t\t val2 =3D=3D rm3100_samp_rates[i][1])\n" + "> +\tfor (i = 0; i < RM3100_SAMP_NUM; i++) {\n" + "> +\t\tif (val == rm3100_samp_rates[i][0] &&\n" + "> +\t\t val2 == rm3100_samp_rates[i][1])\n" "> +\t\t\tbreak;\n" "> +\t}\n" - "> +\tif (i =3D=3D RM3100_SAMP_NUM) {\n" - "> +\t\tret =3D -EINVAL;\n" + "> +\tif (i == RM3100_SAMP_NUM) {\n" + "> +\t\tret = -EINVAL;\n" "> +\t\tgoto unlock_return;\n" "> +\t}\n" "> +\n" - "> +\tret =3D regmap_write(regmap, RM3100_REG_TMRC, i + RM3100_TMRC_OFFSET);\n" + "> +\tret = regmap_write(regmap, RM3100_REG_TMRC, i + RM3100_TMRC_OFFSET);\n" "> +\tif (ret < 0)\n" "> +\t\tgoto unlock_return;\n" "> +\n" "> +\t/* Checking if cycle count registers need changing. */\n" - "> +\tif (val =3D=3D 600 && cycle_count =3D=3D 200) {\n" - "> +\t\tret =3D rm3100_set_cycle_count(data, 100);\n" + "> +\tif (val == 600 && cycle_count == 200) {\n" + "> +\t\tret = rm3100_set_cycle_count(data, 100);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto unlock_return;\n" - "> +\t} else if (val !=3D 600 && cycle_count =3D=3D 100) {\n" - "> +\t\tret =3D rm3100_set_cycle_count(data, 200);\n" + "> +\t} else if (val != 600 && cycle_count == 100) {\n" + "> +\t\tret = rm3100_set_cycle_count(data, 200);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto unlock_return;\n" "> +\t}\n" "> +\n" - "> +\tif (indio_dev->currentmode =3D=3D INDIO_BUFFER_TRIGGERED) {\n" + "> +\tif (indio_dev->currentmode == INDIO_BUFFER_TRIGGERED) {\n" "> +\t\t/* Writing TMRC registers requires CMM reset. */\n" - "> +\t\tret =3D regmap_write(regmap, RM3100_REG_CMM, 0);\n" + "> +\t\tret = regmap_write(regmap, RM3100_REG_CMM, 0);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto unlock_return;\n" - "> +\t\tret =3D regmap_write(data->regmap, RM3100_REG_CMM,\n" + "> +\t\tret = regmap_write(data->regmap, RM3100_REG_CMM,\n" "> +\t\t\t(*indio_dev->active_scan_mask & 0x7) <<\n" "> +\t\t\tRM3100_CMM_AXIS_SHIFT | RM3100_CMM_START);\n" "> +\t\tif (ret < 0)\n" @@ -543,7 +534,7 @@ "> +\t}\n" "> +\tmutex_unlock(&data->lock);\n" "> +\n" - "> +\tdata->conversion_time =3D rm3100_samp_rates[i][2] * 2;\n" + "> +\tdata->conversion_time = rm3100_samp_rates[i][2] * 2;\n" "> +\treturn 0;\n" "> +\n" "> +unlock_return:\n" @@ -555,22 +546,22 @@ "> +\t\t\t const struct iio_chan_spec *chan,\n" "> +\t\t\t int *val, int *val2, long mask)\n" "> +{\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" "> +\tint ret;\n" "> +\n" "> +\tswitch (mask) {\n" "> +\tcase IIO_CHAN_INFO_RAW:\n" - "> +\t\tret =3D iio_device_claim_direct_mode(indio_dev);\n" + "> +\t\tret = iio_device_claim_direct_mode(indio_dev);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\treturn ret;\n" "> +\n" - "> +\t\tret =3D rm3100_read_mag(data, chan->scan_index, val);\n" + "> +\t\tret = rm3100_read_mag(data, chan->scan_index, val);\n" "> +\t\tiio_device_release_direct_mode(indio_dev);\n" "> +\n" "> +\t\treturn ret;\n" "> +\tcase IIO_CHAN_INFO_SCALE:\n" - "> +\t\t*val =3D 0;\n" - "> +\t\t*val2 =3D data->scale;\n" + "> +\t\t*val = 0;\n" + "> +\t\t*val2 = data->scale;\n" "> +\n" "> +\t\treturn IIO_VAL_INT_PLUS_MICRO;\n" "> +\tcase IIO_CHAN_INFO_SAMP_FREQ:\n" @@ -592,15 +583,15 @@ "> +\t}\n" "> +}\n" "> +\n" - "> +static const struct iio_info rm3100_info =3D {\n" - "> +\t.attrs =3D &rm3100_attribute_group,\n" - "> +\t.read_raw =3D rm3100_read_raw,\n" - "> +\t.write_raw =3D rm3100_write_raw,\n" + "> +static const struct iio_info rm3100_info = {\n" + "> +\t.attrs = &rm3100_attribute_group,\n" + "> +\t.read_raw = rm3100_read_raw,\n" + "> +\t.write_raw = rm3100_write_raw,\n" "> +};\n" "> +\n" "> +static int rm3100_buffer_preenable(struct iio_dev *indio_dev)\n" "> +{\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" "> +\n" "> +\t/* Starting channels enabled. */\n" "> +\treturn regmap_write(data->regmap, RM3100_REG_CMM,\n" @@ -610,59 +601,58 @@ "> +\n" "> +static int rm3100_buffer_postdisable(struct iio_dev *indio_dev)\n" "> +{\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" "> +\n" "> +\treturn regmap_write(data->regmap, RM3100_REG_CMM, 0);\n" "> +}\n" "> +\n" - "> +static const struct iio_buffer_setup_ops rm3100_buffer_ops =3D {\n" - "> +\t.preenable =3D rm3100_buffer_preenable,\n" - "> +\t.postenable =3D iio_triggered_buffer_postenable,\n" - "> +\t.predisable =3D iio_triggered_buffer_predisable,\n" - "> +\t.postdisable =3D rm3100_buffer_postdisable,\n" + "> +static const struct iio_buffer_setup_ops rm3100_buffer_ops = {\n" + "> +\t.preenable = rm3100_buffer_preenable,\n" + "> +\t.postenable = iio_triggered_buffer_postenable,\n" + "> +\t.predisable = iio_triggered_buffer_predisable,\n" + "> +\t.postdisable = rm3100_buffer_postdisable,\n" "> +};\n" "> +\n" "> +static irqreturn_t rm3100_trigger_handler(int irq, void *p)\n" "> +{\n" - "> +\tstruct iio_poll_func *pf =3D p;\n" - "> +\tstruct iio_dev *indio_dev =3D pf->indio_dev;\n" - "> +\tunsigned long scan_mask =3D *indio_dev->active_scan_mask;\n" - "> +\tunsigned int mask_len =3D indio_dev->masklength;\n" - "> +\tstruct rm3100_data *data =3D iio_priv(indio_dev);\n" - "> +\tstruct regmap *regmap =3D data->regmap;\n" + "> +\tstruct iio_poll_func *pf = p;\n" + "> +\tstruct iio_dev *indio_dev = pf->indio_dev;\n" + "> +\tunsigned long scan_mask = *indio_dev->active_scan_mask;\n" + "> +\tunsigned int mask_len = indio_dev->masklength;\n" + "> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" + "> +\tstruct regmap *regmap = data->regmap;\n" "> +\tint ret, i, bit;\n" "> +\n" "> +\tmutex_lock(&data->lock);\n" "> +\tswitch (scan_mask) {\n" "> +\tcase BIT(0) | BIT(1) | BIT(2):\n" - "> +\t\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" + "> +\t\tret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" "> +\t\tmutex_unlock(&data->lock);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto done;\n" "> +\t\t/* Convert XXXYYYZZZxxx to XXXxYYYxZZZx. x for paddings. */\n" - "> +\t\tfor (i =3D 2; i > 0; i--)\n" + "> +\t\tfor (i = 2; i > 0; i--)\n" "> +\t\t\tmemcpy(data->buffer + i * 4, data->buffer + i * 3, 3);\n" "> +\tbreak;\n" "Odd indenting of breaks. I'll clear that up.\n" "\n" "> +\tcase BIT(0) | BIT(1):\n" - "> +\t\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 6);\n" + "> +\t\tret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 6);\n" "> +\t\tmutex_unlock(&data->lock);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto done;\n" "> +\t\tgoto copy_2;\n" "> +\tcase BIT(1) | BIT(2):\n" - "> +\t\tret =3D regmap_bulk_read(regmap, RM3100_REG_MY2, data->buffer, 6);\n" + "> +\t\tret = regmap_bulk_read(regmap, RM3100_REG_MY2, data->buffer, 6);\n" "> +\t\tmutex_unlock(&data->lock);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto done;\n" "> +copy_2:\t\tmemcpy(data->buffer + 4, data->buffer + 3, 3);\n" - "This isn't a good idea. Saves one line of code and a tiny bit of duplicatio=\n" - "n but\n" - "makes it much harder to read. =20\n" + "This isn't a good idea. Saves one line of code and a tiny bit of duplication but\n" + "makes it much harder to read. \n" "> +\tbreak;\n" "> +\tcase BIT(0) | BIT(2):\n" - "> +\t\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" + "> +\t\tret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" "> +\t\tmutex_unlock(&data->lock);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\tgoto done;\n" @@ -670,7 +660,7 @@ "> +\tbreak;\n" "> +\tdefault:\n" "> +\t\tfor_each_set_bit(bit, &scan_mask, mask_len) {\n" - "> +\t\t\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * bit,\n" + "> +\t\t\tret = regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * bit,\n" "> +\t\t\t\t\t data->buffer, 3);\n" "> +\t\t\tif (ret < 0) {\n" "> +\t\t\t\tmutex_unlock(&data->lock);\n" @@ -691,38 +681,37 @@ "> +\treturn IRQ_HANDLED;\n" "> +}\n" "> +\n" - "> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int i=\n" - "rq)\n" + "> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq)\n" "> +{\n" "> +\tstruct iio_dev *indio_dev;\n" "> +\tstruct rm3100_data *data;\n" "> +\tunsigned int tmp;\n" "> +\tint ret;\n" "> +\n" - "> +\tindio_dev =3D devm_iio_device_alloc(dev, sizeof(*data));\n" + "> +\tindio_dev = devm_iio_device_alloc(dev, sizeof(*data));\n" "> +\tif (!indio_dev)\n" "> +\t\treturn -ENOMEM;\n" "> +\n" - "> +\tdata =3D iio_priv(indio_dev);\n" - "> +\tdata->regmap =3D regmap;\n" + "> +\tdata = iio_priv(indio_dev);\n" + "> +\tdata->regmap = regmap;\n" "> +\n" "> +\tmutex_init(&data->lock);\n" "> +\n" - "> +\tindio_dev->dev.parent =3D dev;\n" - "> +\tindio_dev->name =3D \"rm3100\";\n" - "> +\tindio_dev->info =3D &rm3100_info;\n" - "> +\tindio_dev->channels =3D rm3100_channels;\n" - "> +\tindio_dev->num_channels =3D ARRAY_SIZE(rm3100_channels);\n" - "> +\tindio_dev->modes =3D INDIO_DIRECT_MODE | INDIO_BUFFER_TRIGGERED;\n" - "> +\tindio_dev->currentmode =3D INDIO_DIRECT_MODE;\n" + "> +\tindio_dev->dev.parent = dev;\n" + "> +\tindio_dev->name = \"rm3100\";\n" + "> +\tindio_dev->info = &rm3100_info;\n" + "> +\tindio_dev->channels = rm3100_channels;\n" + "> +\tindio_dev->num_channels = ARRAY_SIZE(rm3100_channels);\n" + "> +\tindio_dev->modes = INDIO_DIRECT_MODE | INDIO_BUFFER_TRIGGERED;\n" + "> +\tindio_dev->currentmode = INDIO_DIRECT_MODE;\n" "> +\n" "> +\tif (!irq)\n" - "> +\t\tdata->use_interrupt =3D false;\n" + "> +\t\tdata->use_interrupt = false;\n" "> +\telse {\n" - "> +\t\tdata->use_interrupt =3D true;\n" + "> +\t\tdata->use_interrupt = true;\n" "> +\n" "> +\t\tinit_completion(&data->measuring_done);\n" - "> +\t\tret =3D devm_request_threaded_irq(dev,\n" + "> +\t\tret = devm_request_threaded_irq(dev,\n" "> +\t\t\t\t\t\tirq,\n" "> +\t\t\t\t\t\trm3100_irq_handler,\n" "> +\t\t\t\t\t\trm3100_thread_fn,\n" @@ -735,34 +724,34 @@ "> +\t\t\treturn ret;\n" "> +\t\t}\n" "> +\n" - "> +\t\tdata->drdy_trig =3D devm_iio_trigger_alloc(dev, \"%s-drdy%d\",\n" + "> +\t\tdata->drdy_trig = devm_iio_trigger_alloc(dev, \"%s-drdy%d\",\n" "> +\t\t\t\t\t\t\t indio_dev->name,\n" "> +\t\t\t\t\t\t\t indio_dev->id);\n" "> +\t\tif (!data->drdy_trig)\n" "> +\t\t\treturn -ENOMEM;\n" "> +\n" - "> +\t\tdata->drdy_trig->dev.parent =3D dev;\n" - "> +\t\tret =3D devm_iio_trigger_register(dev, data->drdy_trig);\n" + "> +\t\tdata->drdy_trig->dev.parent = dev;\n" + "> +\t\tret = devm_iio_trigger_register(dev, data->drdy_trig);\n" "> +\t\tif (ret < 0)\n" "> +\t\t\treturn ret;\n" "> +\t}\n" "> +\n" - "> +\tret =3D devm_iio_triggered_buffer_setup(dev, indio_dev,\n" + "> +\tret = devm_iio_triggered_buffer_setup(dev, indio_dev,\n" "> +\t\t\t\t\t &iio_pollfunc_store_time,\n" "> +\t\t\t\t\t rm3100_trigger_handler,\n" "> +\t\t\t\t\t &rm3100_buffer_ops);\n" "> +\tif (ret < 0)\n" "> +\t\treturn ret;\n" "> +\n" - "> +\tret =3D regmap_read(regmap, RM3100_REG_TMRC, &tmp);\n" + "> +\tret = regmap_read(regmap, RM3100_REG_TMRC, &tmp);\n" "> +\tif (ret < 0)\n" "> +\t\treturn ret;\n" "> +\t/* Initializing max wait time, which is double conversion time. */\n" - "> +\tdata->conversion_time =3D rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2]\n" + "> +\tdata->conversion_time = rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2]\n" "> +\t\t\t\t* 2;\n" "> +\n" "> +\t/* Cycle count values may not be what we want. */\n" - "> +\tif ((tmp - RM3100_TMRC_OFFSET) =3D=3D 0)\n" + "> +\tif ((tmp - RM3100_TMRC_OFFSET) == 0)\n" "> +\t\trm3100_set_cycle_count(data, 100);\n" "> +\telse\n" "> +\t\trm3100_set_cycle_count(data, 200);\n" @@ -774,8 +763,7 @@ "> +MODULE_AUTHOR(\"Song Qiang <songqiang1304521@gmail.com>\");\n" "> +MODULE_DESCRIPTION(\"PNI RM3100 3-axis magnetometer i2c driver\");\n" "> +MODULE_LICENSE(\"GPL v2\");\n" - "> diff --git a/drivers/iio/magnetometer/rm3100-i2c.c b/drivers/iio/magnetom=\n" - "eter/rm3100-i2c.c\n" + "> diff --git a/drivers/iio/magnetometer/rm3100-i2c.c b/drivers/iio/magnetometer/rm3100-i2c.c\n" "> new file mode 100644\n" "> index 000000000000..1ac622c6d6c9\n" "> --- /dev/null\n" @@ -795,48 +783,47 @@ "> +\n" "> +#include \"rm3100.h\"\n" "> +\n" - "> +static const struct regmap_config rm3100_regmap_config =3D {\n" - "> +\t.reg_bits =3D 8,\n" - "> +\t.val_bits =3D 8,\n" + "> +static const struct regmap_config rm3100_regmap_config = {\n" + "> +\t.reg_bits = 8,\n" + "> +\t.val_bits = 8,\n" "> +\n" - "> +\t.rd_table =3D &rm3100_readable_table,\n" - "> +\t.wr_table =3D &rm3100_writable_table,\n" - "> +\t.volatile_table =3D &rm3100_volatile_table,\n" + "> +\t.rd_table = &rm3100_readable_table,\n" + "> +\t.wr_table = &rm3100_writable_table,\n" + "> +\t.volatile_table = &rm3100_volatile_table,\n" "> +\n" - "> +\t.cache_type =3D REGCACHE_RBTREE,\n" + "> +\t.cache_type = REGCACHE_RBTREE,\n" "> +};\n" "> +\n" "> +static int rm3100_probe(struct i2c_client *client)\n" "> +{\n" "> +\tstruct regmap *regmap;\n" "> +\n" - "> +\tregmap =3D devm_regmap_init_i2c(client, &rm3100_regmap_config);\n" + "> +\tregmap = devm_regmap_init_i2c(client, &rm3100_regmap_config);\n" "> +\tif (IS_ERR(regmap))\n" "> +\t\treturn PTR_ERR(regmap);\n" "> +\n" "> +\treturn rm3100_common_probe(&client->dev, regmap, client->irq);\n" "> +}\n" "> +\n" - "> +static const struct of_device_id rm3100_dt_match[] =3D {\n" - "> +\t{ .compatible =3D \"pni,rm3100\", },\n" + "> +static const struct of_device_id rm3100_dt_match[] = {\n" + "> +\t{ .compatible = \"pni,rm3100\", },\n" "> +\t{ }\n" "> +};\n" "> +MODULE_DEVICE_TABLE(of, rm3100_dt_match);\n" "> +\n" - "> +static struct i2c_driver rm3100_driver =3D {\n" - "> +\t.driver =3D {\n" - "> +\t\t.name =3D \"rm3100-i2c\",\n" - "> +\t\t.of_match_table =3D rm3100_dt_match,\n" + "> +static struct i2c_driver rm3100_driver = {\n" + "> +\t.driver = {\n" + "> +\t\t.name = \"rm3100-i2c\",\n" + "> +\t\t.of_match_table = rm3100_dt_match,\n" "> +\t},\n" - "> +\t.probe_new =3D rm3100_probe,\n" + "> +\t.probe_new = rm3100_probe,\n" "> +};\n" "> +module_i2c_driver(rm3100_driver);\n" "> +\n" "> +MODULE_AUTHOR(\"Song Qiang <songqiang1304521@gmail.com>\");\n" "> +MODULE_DESCRIPTION(\"PNI RM3100 3-axis magnetometer i2c driver\");\n" "> +MODULE_LICENSE(\"GPL v2\");\n" - "> diff --git a/drivers/iio/magnetometer/rm3100-spi.c b/drivers/iio/magnetom=\n" - "eter/rm3100-spi.c\n" + "> diff --git a/drivers/iio/magnetometer/rm3100-spi.c b/drivers/iio/magnetometer/rm3100-spi.c\n" "> new file mode 100644\n" "> index 000000000000..65d5eb9e4f5e\n" "> --- /dev/null\n" @@ -854,17 +841,17 @@ "> +\n" "> +#include \"rm3100.h\"\n" "> +\n" - "> +static const struct regmap_config rm3100_regmap_config =3D {\n" - "> +\t.reg_bits =3D 8,\n" - "> +\t.val_bits =3D 8,\n" + "> +static const struct regmap_config rm3100_regmap_config = {\n" + "> +\t.reg_bits = 8,\n" + "> +\t.val_bits = 8,\n" "> +\n" - "> +\t.rd_table =3D &rm3100_readable_table,\n" - "> +\t.wr_table =3D &rm3100_writable_table,\n" - "> +\t.volatile_table =3D &rm3100_volatile_table,\n" + "> +\t.rd_table = &rm3100_readable_table,\n" + "> +\t.wr_table = &rm3100_writable_table,\n" + "> +\t.volatile_table = &rm3100_volatile_table,\n" "> +\n" - "> +\t.read_flag_mask =3D 0x80,\n" + "> +\t.read_flag_mask = 0x80,\n" "> +\n" - "> +\t.cache_type =3D REGCACHE_RBTREE,\n" + "> +\t.cache_type = REGCACHE_RBTREE,\n" "> +};\n" "> +\n" "> +static int rm3100_probe(struct spi_device *spi)\n" @@ -873,41 +860,40 @@ "> +\tint ret;\n" "> +\n" "> +\t/* Actually this device supports both mode 0 and mode 3. */\n" - "> +\tspi->mode =3D SPI_MODE_0;\n" + "> +\tspi->mode = SPI_MODE_0;\n" "> +\t/* Data rates cannot exceed 1Mbits. */\n" - "> +\tspi->max_speed_hz =3D 1000000;\n" - "> +\tspi->bits_per_word =3D 8;\n" - "> +\tret =3D spi_setup(spi);\n" + "> +\tspi->max_speed_hz = 1000000;\n" + "> +\tspi->bits_per_word = 8;\n" + "> +\tret = spi_setup(spi);\n" "> +\tif (ret)\n" "> +\t\treturn ret;\n" "> +\n" - "> +\tregmap =3D devm_regmap_init_spi(spi, &rm3100_regmap_config);\n" + "> +\tregmap = devm_regmap_init_spi(spi, &rm3100_regmap_config);\n" "> +\tif (IS_ERR(regmap))\n" "> +\t\treturn PTR_ERR(regmap);\n" "> +\n" "> +\treturn rm3100_common_probe(&spi->dev, regmap, spi->irq);\n" "> +}\n" "> +\n" - "> +static const struct of_device_id rm3100_dt_match[] =3D {\n" - "> +\t{ .compatible =3D \"pni,rm3100\", },\n" + "> +static const struct of_device_id rm3100_dt_match[] = {\n" + "> +\t{ .compatible = \"pni,rm3100\", },\n" "> +\t{ }\n" "> +};\n" "> +MODULE_DEVICE_TABLE(of, rm3100_dt_match);\n" "> +\n" - "> +static struct spi_driver rm3100_driver =3D {\n" - "> +\t.driver =3D {\n" - "> +\t\t.name =3D \"rm3100-spi\",\n" - "> +\t\t.of_match_table =3D rm3100_dt_match,\n" + "> +static struct spi_driver rm3100_driver = {\n" + "> +\t.driver = {\n" + "> +\t\t.name = \"rm3100-spi\",\n" + "> +\t\t.of_match_table = rm3100_dt_match,\n" "> +\t},\n" - "> +\t.probe =3D rm3100_probe,\n" + "> +\t.probe = rm3100_probe,\n" "> +};\n" "> +module_spi_driver(rm3100_driver);\n" "> +\n" "> +MODULE_AUTHOR(\"Song Qiang <songqiang1304521@gmail.com>\");\n" "> +MODULE_DESCRIPTION(\"PNI RM3100 3-axis magnetometer spi driver\");\n" "> +MODULE_LICENSE(\"GPL v2\");\n" - "> diff --git a/drivers/iio/magnetometer/rm3100.h b/drivers/iio/magnetometer=\n" - "/rm3100.h\n" + "> diff --git a/drivers/iio/magnetometer/rm3100.h b/drivers/iio/magnetometer/rm3100.h\n" "> new file mode 100644\n" "> index 000000000000..c3508218bc77\n" "> --- /dev/null\n" @@ -927,9 +913,8 @@ "> +extern const struct regmap_access_table rm3100_writable_table;\n" "> +extern const struct regmap_access_table rm3100_volatile_table;\n" "> +\n" - "> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int i=\n" - "rq);\n" + "> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq);\n" "> +\n" > +#endif /* RM3100_CORE_H */ -b75d19b4bf0238df5cbc1b693fe5db294c6e02aea0c28ab542353dce39c4178b +484428ac2c75d275cea8413c93ab16451550723c97464fe7d1ec8dafd739dc6e
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.