diff for duplicates of <20181013102441.5fcdad5e@archlinux> diff --git a/a/1.txt b/N1/1.txt index a5ea799..a0e259a 100644 --- a/a/1.txt +++ b/N1/1.txt @@ -1,10 +1,10 @@ On Thu, 11 Oct 2018 12:35:18 +0800 Song Qiang <songqiang1304521@gmail.com> wrote: -> On 2018=E5=B9=B410=E6=9C=8807=E6=97=A5 23:44, Jonathan Cameron wrote: +> On 2018年10月07日 23:44, Jonathan Cameron wrote: > > On Tue, 2 Oct 2018 22:38:12 +0800 > > Song Qiang <songqiang1304521@gmail.com> wrote: -> > =20 +> > > >> PNI RM3100 is a high resolution, large signal immunity magnetometer, > >> composed of 3 single sensors and a processing chip with a MagI2C > >> interface. @@ -17,7 +17,7 @@ Song Qiang <songqiang1304521@gmail.com> wrote: > >> - Both interrupt and polling measurement is supported, depends on if > >> the 'interrupts' in DT is declared. > >> -> >> Signed-off-by: Song Qiang <songqiang1304521@gmail.com> =20 +> >> Signed-off-by: Song Qiang <songqiang1304521@gmail.com> > > I realise now that I should have read the datasheet properly. > > Sorry about that. > > @@ -48,11 +48,11 @@ Song Qiang <songqiang1304521@gmail.com> wrote: > > about how you were handing the interrupts. > > > > Jonathan -> > =20 ->=20 +> > +> > Hi Jonathan, ->=20 -> I learned the way of handling single shot from the driver of hmc5843,=20 +> +> I learned the way of handling single shot from the driver of hmc5843, > seems like it needs changing, too. Yikes, that is indeed much the same and for no apparent reason. If I was guessing, I would say that driver started as an input device @@ -64,23 +64,21 @@ It should have used the single read mode on that device as well. Now the challenge is whether anyone has one of these fairly old parts to test any changes? -> There was some problems with my computer. Lenovo updates told me to=20 -> update BIOS and it went dead. I didn't write any code the past few days,= -=20 +> There was some problems with my computer. Lenovo updates told me to +> update BIOS and it went dead. I didn't write any code the past few days, > just got it fixed today. :( Jonathan ->=20 +> > yours, > Song Qiang ->=20 +> > >> --- > >> MAINTAINERS | 7 + > >> drivers/iio/magnetometer/Kconfig | 29 ++ > >> drivers/iio/magnetometer/Makefile | 4 + -> >> drivers/iio/magnetometer/rm3100-core.c | 539 +++++++++++++++++++++++= -++ +> >> drivers/iio/magnetometer/rm3100-core.c | 539 +++++++++++++++++++++++++ > >> drivers/iio/magnetometer/rm3100-i2c.c | 58 +++ > >> drivers/iio/magnetometer/rm3100-spi.c | 64 +++ > >> drivers/iio/magnetometer/rm3100.h | 17 + @@ -94,11 +92,10 @@ Jonathan > >> index 967ce8cdd1cc..14eeeb072403 100644 > >> --- a/MAINTAINERS > >> +++ b/MAINTAINERS -> >> @@ -11393,6 +11393,13 @@ M: "Rafael J. Wysocki" <rafael.j.wysocki@inte= -l.com> +> >> @@ -11393,6 +11393,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 @@ -109,15 +106,14 @@ l.com> > >> 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/magnetomet= -er/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 @@ -148,22 +144,19 @@ er/Kconfig > >> + will be called rm3100-spi. > >> + > >> endmenu -> >> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetome= -ter/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/magn= -etometer/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..cacdaee28ae3 > >> --- /dev/null @@ -228,9 +221,8 @@ etometer/rm3100-core.c > >> +#define RM3100_V_REG_END RM3100_REG_STATUS > >> + > >> +/* -> >> + * This is computed by hand, is the sum of channel storage bits and p= -adding -> >> + * 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 > >> + @@ -254,39 +246,39 @@ adding > >> + struct mutex lock; > >> +}; > >> + -> >> +static const struct regmap_range rm3100_readable_ranges[] =3D { +> >> +static const struct regmap_range rm3100_readable_ranges[] = { > >> + regmap_reg_range(RM3100_W_REG_START, RM3100_W_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_R_REG_START, RM3100_R_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_irq_handler(int irq, void *d) > >> +{ -> >> + struct rm3100_data *data =3D d; +> >> + struct rm3100_data *data = d; > >> + > >> + complete(&data->measuring_done); > >> + @@ -295,9 +287,9 @@ adding > >> + > >> +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; > >> + > >> + /* @@ -313,13 +305,13 @@ adding > >> + 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 < 0) > >> + return -ETIMEDOUT; @@ -327,7 +319,7 @@ adding > >> + 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; @@ -342,28 +334,25 @@ adding > >> + return 0; > >> +} > >> + -> >> +static int rm3100_read_mag(struct rm3100_data *data, int idx, int *va= -l) +> >> +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 rm3100_wait_measurement(data); +> >> + ret = rm3100_wait_measurement(data); > >> + if (ret < 0) { > >> + mutex_unlock(&data->lock); > >> + return ret; > >> + } > >> + -> >> + 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); > >> + mutex_unlock(&data->lock); > >> + if (ret < 0) > >> + return ret; > >> + -> >> + *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; @@ -371,43 +360,42 @@ l) > >> + > >> +#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), > >> + IIO_CHAN_SOFT_TIMESTAMP(3), > >> +}; > >> + -> >> +static const unsigned long rm3100_scan_masks[] =3D {BIT(0) | BIT(1) |= - BIT(2), 0}; +> >> +static const unsigned long rm3100_scan_masks[] = {BIT(0) | BIT(1) | BIT(2), 0}; > >> + > >> +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL( > >> + "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 @@ -417,26 +405,25 @@ l) > >> + * 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, i= -nt *val2) +> >> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int *val2) > >> +{ > >> + int ret; > >> + unsigned int tmp; > >> + > >> + 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; > >> +} @@ -446,81 +433,79 @@ nt *val2) > >> + 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; > >> + } > >> + > >> + switch (val) { > >> + case 50: -> >> + data->cycle_count_index =3D 0; +> >> + data->cycle_count_index = 0; > >> + break; > >> + case 100: -> >> + data->cycle_count_index =3D 1; +> >> + data->cycle_count_index = 1; > >> + break; > >> + /* > >> + * This function will never be called by users' code, so here we > >> + * assume that it will never get a wrong parameter. > >> + */ > >> + default: -> >> + data->cycle_count_index =3D 2; +> >> + data->cycle_count_index = 2; > >> + } > >> + > >> + return 0; > >> +} > >> + -> >> +static int rm3100_set_samp_freq(struct rm3100_data *data, int val, in= -t val2) +> >> +static int rm3100_set_samp_freq(struct rm3100_data *data, int val, int val2) > >> +{ -> >> + struct regmap *regmap =3D data->regmap; +> >> + 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; > >> + } > >> + > >> + /* 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(regmap, RM3100_REG_CMM, +> >> + ret = regmap_write(regmap, RM3100_REG_CMM, > >> + RM3100_CMM_X | RM3100_CMM_Y | RM3100_CMM_Z | RM3100_CMM_START); > >> + if (ret < 0) > >> + goto unlock_return; > >> + mutex_unlock(&data->lock); > >> + -> >> + data->conversion_time =3D rm3100_samp_rates[i][2] + 3000; +> >> + data->conversion_time = rm3100_samp_rates[i][2] + 3000; > >> + return 0; > >> + > >> +unlock_return: @@ -529,33 +514,32 @@ t val2) > >> +} > >> + > >> +/* -> >> + * The scale of this sensor depends on the cycle count value, these t= -hree +> >> + * 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. +> >> + * scale = output / gain * 10^4. > >> + */ -> >> +const static int rm3100_scale[] =3D {500, 263, 133}; +> >> +const static int rm3100_scale[] = {500, 263, 133}; > >> + > >> +static int rm3100_read_raw(struct iio_dev *indio_dev, > >> + 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 rm3100_scale[data->cycle_count_index]; +> >> + *val = 0; +> >> + *val2 = rm3100_scale[data->cycle_count_index]; > >> + > >> + return IIO_VAL_INT_PLUS_MICRO; > >> + case IIO_CHAN_INFO_SAMP_FREQ: @@ -569,7 +553,7 @@ hree > >> + struct iio_chan_spec const *chan, > >> + int val, int val2, long mask) > >> +{ -> >> + struct rm3100_data *data =3D iio_priv(indio_dev); +> >> + struct rm3100_data *data = iio_priv(indio_dev); > >> + > >> + switch (mask) { > >> + case IIO_CHAN_INFO_SAMP_FREQ: @@ -580,35 +564,35 @@ hree > >> + > >> +} > >> + -> >> +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 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; -> >> + 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; +> >> + struct rm3100_data *data = iio_priv(indio_dev); +> >> + struct regmap *regmap = data->regmap; > >> + int ret; > >> + int i; > >> + > >> + mutex_lock(&data->lock); -> >> + ret =3D rm3100_wait_measurement(data); +> >> + ret = rm3100_wait_measurement(data); > >> + if (ret < 0) { > >> + mutex_unlock(&data->lock); > >> + goto done; > >> + } > >> + -> >> + 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 0; i < 2; i++) +> >> + for (i = 0; i < 2; i++) > >> + memcpy(data->buffer + (2 - i) * 4, data->buffer + (2 - i) * 3, > >> + 3); > >> + @@ -626,7 +610,7 @@ hree > >> +} > >> + > >> +static void rm3100_remove(void *pdata) -> >> +{ =20 +> >> +{ > > Given this is no longer the opposite of probe, but rather just an > > action to undo one particular element of probe (be it the only > > one that needs undoing - yeah a subtle distinction ;)... @@ -637,46 +621,45 @@ hree > > to be rm3100_start as well so that it's easy to see how these > > are paired? > > -> > =20 -> >> + struct rm3100_data *data =3D pdata; -> >> + struct device *dev =3D regmap_get_device(data->regmap); +> > +> >> + struct rm3100_data *data = pdata; +> >> + struct device *dev = regmap_get_device(data->regmap); > >> + int ret; > >> + -> >> + ret =3D regmap_write(data->regmap, RM3100_REG_CMM, 0x00); +> >> + ret = regmap_write(data->regmap, RM3100_REG_CMM, 0x00); > >> + if (ret < 0) > >> + dev_err(dev, "failed to stop the device.\n"); > >> +} > >> + -> >> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, in= -t irq) +> >> +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_dev->available_scan_masks =3D rm3100_scan_masks; +> >> + 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_dev->available_scan_masks = rm3100_scan_masks; > >> + > >> + if (!irq) -> >> + data->use_interrupt =3D false; +> >> + data->use_interrupt = false; > >> + else { -> >> + data->use_interrupt =3D true; -> >> + ret =3D devm_request_irq(dev, +> >> + data->use_interrupt = true; +> >> + ret = devm_request_irq(dev, > >> + irq, > >> + rm3100_irq_handler, > >> + IRQF_TRIGGER_RISING, @@ -689,34 +672,34 @@ t irq) > >> + init_completion(&data->measuring_done); > >> + } > >> + -> >> + ret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, +> >> + ret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL, > >> + rm3100_trigger_handler, NULL); > >> + 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, 3sec more wait time for conversion. */ -> >> + data->conversion_time =3D +> >> + data->conversion_time = > >> + rm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2] + 3000; > >> + > >> + /* Cycle count values may not be what we want. */ -> >> + ret =3D regmap_read(data->regmap, RM3100_REG_TMRC, &tmp); +> >> + ret = regmap_read(data->regmap, RM3100_REG_TMRC, &tmp); > >> + if (ret < 0) > >> + return ret; -> >> + 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); > >> + > >> + /* Starting all channels' conversion. */ -> >> + ret =3D regmap_write(regmap, RM3100_REG_CMM, +> >> + ret = regmap_write(regmap, RM3100_REG_CMM, > >> + RM3100_CMM_X | RM3100_CMM_Y | RM3100_CMM_Z | RM3100_CMM_START); > >> + if (ret < 0) > >> + return ret; > >> + -> >> + ret =3D devm_add_action(dev, rm3100_remove, data); +> >> + ret = devm_add_action(dev, rm3100_remove, data); > >> + if (ret < 0) { > >> + rm3100_remove(data); > >> + return ret; @@ -729,8 +712,7 @@ t irq) > >> +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/magne= -tometer/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..8f02e0366886 > >> --- /dev/null @@ -750,15 +732,15 @@ tometer/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) @@ -769,33 +751,32 @@ tometer/rm3100-i2c.c > >> + I2C_FUNC_SMBUS_READ_I2C_BLOCK | I2C_FUNC_SMBUS_BYTE_DATA)) > >> + return -EOPNOTSUPP; > >> + -> >> + 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/magne= -tometer/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 @@ -813,17 +794,17 @@ tometer/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) @@ -832,41 +813,40 @@ tometer/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/magnetome= -ter/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 @@ -886,8 +866,7 @@ ter/rm3100.h > >> +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, in= -t irq); +> >> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq); > >> + -> >> +#endif /* RM3100_CORE_H */ =20 ->=20 +> >> +#endif /* RM3100_CORE_H */ +> diff --git a/a/content_digest b/N1/content_digest index 1d45891..5ffa175 100644 --- a/a/content_digest +++ b/N1/content_digest @@ -21,10 +21,10 @@ "On Thu, 11 Oct 2018 12:35:18 +0800\n" "Song Qiang <songqiang1304521@gmail.com> wrote:\n" "\n" - "> On 2018=E5=B9=B410=E6=9C=8807=E6=97=A5 23:44, Jonathan Cameron wrote:\n" + "> On 2018\345\271\26410\346\234\21007\346\227\245 23:44, Jonathan Cameron wrote:\n" "> > On Tue, 2 Oct 2018 22:38:12 +0800\n" "> > Song Qiang <songqiang1304521@gmail.com> wrote:\n" - "> > =20\n" + "> > \n" "> >> 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" @@ -37,7 +37,7 @@ "> >> - Both interrupt and polling measurement is supported, depends on if\n" "> >> the 'interrupts' in DT is declared.\n" "> >>\n" - "> >> Signed-off-by: Song Qiang <songqiang1304521@gmail.com> =20\n" + "> >> Signed-off-by: Song Qiang <songqiang1304521@gmail.com> \n" "> > I realise now that I should have read the datasheet properly.\n" "> > Sorry about that.\n" "> >\n" @@ -68,11 +68,11 @@ "> > about how you were handing the interrupts.\n" "> >\n" "> > Jonathan\n" - "> > =20\n" - ">=20\n" + "> > \n" + "> \n" "> Hi Jonathan,\n" - ">=20\n" - "> I learned the way of handling single shot from the driver of hmc5843,=20\n" + "> \n" + "> I learned the way of handling single shot from the driver of hmc5843, \n" "> seems like it needs changing, too.\n" "Yikes, that is indeed much the same and for no apparent reason.\n" "If I was guessing, I would say that driver started as an input device\n" @@ -84,23 +84,21 @@ "Now the challenge is whether anyone has one of these fairly old parts\n" "to test any changes?\n" "\n" - "> There was some problems with my computer. Lenovo updates told me to=20\n" - "> update BIOS and it went dead. I didn't write any code the past few days,=\n" - "=20\n" + "> There was some problems with my computer. Lenovo updates told me to \n" + "> update BIOS and it went dead. I didn't write any code the past few days, \n" "> just got it fixed today.\n" ":(\n" "\n" "Jonathan\n" - ">=20\n" + "> \n" "> yours,\n" "> Song Qiang\n" - ">=20\n" + "> \n" "> >> ---\n" "> >> MAINTAINERS | 7 +\n" "> >> drivers/iio/magnetometer/Kconfig | 29 ++\n" "> >> drivers/iio/magnetometer/Makefile | 4 +\n" - "> >> drivers/iio/magnetometer/rm3100-core.c | 539 +++++++++++++++++++++++=\n" - "++\n" + "> >> drivers/iio/magnetometer/rm3100-core.c | 539 +++++++++++++++++++++++++\n" "> >> drivers/iio/magnetometer/rm3100-i2c.c | 58 +++\n" "> >> drivers/iio/magnetometer/rm3100-spi.c | 64 +++\n" "> >> drivers/iio/magnetometer/rm3100.h | 17 +\n" @@ -114,11 +112,10 @@ "> >> index 967ce8cdd1cc..14eeeb072403 100644\n" "> >> --- a/MAINTAINERS\n" "> >> +++ b/MAINTAINERS\n" - "> >> @@ -11393,6 +11393,13 @@ M:\t\"Rafael J. Wysocki\" <rafael.j.wysocki@inte=\n" - "l.com>\n" + "> >> @@ -11393,6 +11393,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" @@ -129,15 +126,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/magnetomet=\n" - "er/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" @@ -168,22 +164,19 @@ "> >> +\t will be called rm3100-spi.\n" "> >> +\n" "> >> endmenu\n" - "> >> diff --git a/drivers/iio/magnetometer/Makefile b/drivers/iio/magnetome=\n" - "ter/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=\n" - ".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/magn=\n" - "etometer/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..cacdaee28ae3\n" "> >> --- /dev/null\n" @@ -248,9 +241,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 p=\n" - "adding\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" @@ -274,39 +266,39 @@ "> >> +\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_W_REG_START, RM3100_W_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_R_REG_START, RM3100_R_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_irq_handler(int irq, void *d)\n" "> >> +{\n" - "> >> +\tstruct rm3100_data *data =3D d;\n" + "> >> +\tstruct rm3100_data *data = d;\n" "> >> +\n" "> >> +\tcomplete(&data->measuring_done);\n" "> >> +\n" @@ -315,9 +307,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" @@ -333,13 +325,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 < 0)\n" "> >> +\t\t\t\treturn -ETIMEDOUT;\n" @@ -347,7 +339,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" @@ -362,28 +354,25 @@ "> >> +\treturn 0;\n" "> >> +}\n" "> >> +\n" - "> >> +static int rm3100_read_mag(struct rm3100_data *data, int idx, int *va=\n" - "l)\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 rm3100_wait_measurement(data);\n" + "> >> +\tret = rm3100_wait_measurement(data);\n" "> >> +\tif (ret < 0) {\n" "> >> +\t\tmutex_unlock(&data->lock);\n" "> >> +\t\treturn ret;\n" "> >> +\t}\n" "> >> +\n" - "> >> +\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3=\n" - ");\n" + "> >> +\tret = regmap_bulk_read(regmap, RM3100_REG_MX2 + 3 * idx, buffer, 3);\n" "> >> +\tmutex_unlock(&data->lock);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\treturn ret;\n" "> >> +\n" - "> >> +\t*val =3D sign_extend32((buffer[0] << 16) | (buffer[1] << 8) | buffer=\n" - "[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" @@ -391,43 +380,42 @@ "> >> +\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" "> >> +\tIIO_CHAN_SOFT_TIMESTAMP(3),\n" "> >> +};\n" "> >> +\n" - "> >> +static const unsigned long rm3100_scan_masks[] =3D {BIT(0) | BIT(1) |=\n" - " BIT(2), 0};\n" + "> >> +static const unsigned long rm3100_scan_masks[] = {BIT(0) | BIT(1) | BIT(2), 0};\n" "> >> +\n" "> >> +static IIO_CONST_ATTR_SAMP_FREQ_AVAIL(\n" "> >> +\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" @@ -437,26 +425,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, i=\n" - "nt *val2)\n" + "> >> +static int rm3100_get_samp_freq(struct rm3100_data *data, int *val, int *val2)\n" "> >> +{\n" "> >> +\tint ret;\n" "> >> +\tunsigned int tmp;\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" @@ -466,81 +453,79 @@ "> >> +\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" "> >> +\n" "> >> +\tswitch (val) {\n" "> >> +\tcase 50:\n" - "> >> +\t\tdata->cycle_count_index =3D 0;\n" + "> >> +\t\tdata->cycle_count_index = 0;\n" "> >> +\t\tbreak;\n" "> >> +\tcase 100:\n" - "> >> +\t\tdata->cycle_count_index =3D 1;\n" + "> >> +\t\tdata->cycle_count_index = 1;\n" "> >> +\t\tbreak;\n" "> >> +\t/*\n" "> >> +\t * This function will never be called by users' code, so here we\n" "> >> +\t * assume that it will never get a wrong parameter.\n" "> >> +\t */\n" "> >> +\tdefault:\n" - "> >> +\t\tdata->cycle_count_index =3D 2;\n" + "> >> +\t\tdata->cycle_count_index = 2;\n" "> >> +\t}\n" "> >> +\n" "> >> +\treturn 0;\n" "> >> +}\n" "> >> +\n" - "> >> +static int rm3100_set_samp_freq(struct rm3100_data *data, int val, in=\n" - "t val2)\n" + "> >> +static int rm3100_set_samp_freq(struct rm3100_data *data, int val, int val2)\n" "> >> +{\n" - "> >> +\tstruct regmap *regmap =3D data->regmap;\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" - ");\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" "> >> +\t/* Writing TMRC registers requires CMM reset. */\n" - "> >> +\tret =3D regmap_write(regmap, RM3100_REG_CMM, 0);\n" + "> >> +\tret = regmap_write(regmap, RM3100_REG_CMM, 0);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\tgoto unlock_return;\n" - "> >> +\tret =3D regmap_write(regmap, RM3100_REG_CMM,\n" + "> >> +\tret = regmap_write(regmap, RM3100_REG_CMM,\n" "> >> +\t\tRM3100_CMM_X | RM3100_CMM_Y | RM3100_CMM_Z | RM3100_CMM_START);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\tgoto unlock_return;\n" "> >> +\tmutex_unlock(&data->lock);\n" "> >> +\n" - "> >> +\tdata->conversion_time =3D rm3100_samp_rates[i][2] + 3000;\n" + "> >> +\tdata->conversion_time = rm3100_samp_rates[i][2] + 3000;\n" "> >> +\treturn 0;\n" "> >> +\n" "> >> +unlock_return:\n" @@ -549,33 +534,32 @@ "> >> +}\n" "> >> +\n" "> >> +/*\n" - "> >> + * The scale of this sensor depends on the cycle count value, these t=\n" - "hree\n" + "> >> + * The scale of this sensor depends on the cycle count value, these three\n" "> >> + * values are corresponding to the cycle count value 50, 100, 200.\n" - "> >> + * scale =3D output / gain * 10^4.\n" + "> >> + * scale = output / gain * 10^4.\n" "> >> + */\n" - "> >> +const static int rm3100_scale[] =3D {500, 263, 133};\n" + "> >> +const static int rm3100_scale[] = {500, 263, 133};\n" "> >> +\n" "> >> +static int rm3100_read_raw(struct iio_dev *indio_dev,\n" "> >> +\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 rm3100_scale[data->cycle_count_index];\n" + "> >> +\t\t*val = 0;\n" + "> >> +\t\t*val2 = rm3100_scale[data->cycle_count_index];\n" "> >> +\n" "> >> +\t\treturn IIO_VAL_INT_PLUS_MICRO;\n" "> >> +\tcase IIO_CHAN_INFO_SAMP_FREQ:\n" @@ -589,7 +573,7 @@ "> >> +\t\t\t struct iio_chan_spec const *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" "> >> +\n" "> >> +\tswitch (mask) {\n" "> >> +\tcase IIO_CHAN_INFO_SAMP_FREQ:\n" @@ -600,35 +584,35 @@ "> >> +\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 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" - "> >> +\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" + "> >> +\tstruct rm3100_data *data = iio_priv(indio_dev);\n" + "> >> +\tstruct regmap *regmap = data->regmap;\n" "> >> +\tint ret;\n" "> >> +\tint i;\n" "> >> +\n" "> >> +\tmutex_lock(&data->lock);\n" - "> >> +\tret =3D rm3100_wait_measurement(data);\n" + "> >> +\tret = rm3100_wait_measurement(data);\n" "> >> +\tif (ret < 0) {\n" "> >> +\t\tmutex_unlock(&data->lock);\n" "> >> +\t\tgoto done;\n" "> >> +\t}\n" "> >> +\n" - "> >> +\tret =3D regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" + "> >> +\tret = regmap_bulk_read(regmap, RM3100_REG_MX2, data->buffer, 9);\n" "> >> +\tmutex_unlock(&data->lock);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\tgoto done;\n" "> >> +\n" "> >> +\t/* Convert XXXYYYZZZxxx to XXXxYYYxZZZx. x for paddings. */\n" - "> >> +\tfor (i =3D 0; i < 2; i++)\n" + "> >> +\tfor (i = 0; i < 2; i++)\n" "> >> +\t\tmemcpy(data->buffer + (2 - i) * 4, data->buffer + (2 - i) * 3,\n" "> >> +\t\t 3);\n" "> >> +\n" @@ -646,7 +630,7 @@ "> >> +}\n" "> >> +\n" "> >> +static void rm3100_remove(void *pdata)\n" - "> >> +{ =20\n" + "> >> +{ \n" "> > Given this is no longer the opposite of probe, but rather just an\n" "> > action to undo one particular element of probe (be it the only\n" "> > one that needs undoing - yeah a subtle distinction ;)...\n" @@ -657,46 +641,45 @@ "> > to be rm3100_start as well so that it's easy to see how these\n" "> > are paired?\n" "> >\n" - "> > =20\n" - "> >> +\tstruct rm3100_data *data =3D pdata;\n" - "> >> +\tstruct device *dev =3D regmap_get_device(data->regmap);\n" + "> > \n" + "> >> +\tstruct rm3100_data *data = pdata;\n" + "> >> +\tstruct device *dev = regmap_get_device(data->regmap);\n" "> >> +\tint ret;\n" "> >> +\n" - "> >> +\tret =3D regmap_write(data->regmap, RM3100_REG_CMM, 0x00);\n" + "> >> +\tret = regmap_write(data->regmap, RM3100_REG_CMM, 0x00);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\tdev_err(dev, \"failed to stop the device.\\n\");\n" "> >> +}\n" "> >> +\n" - "> >> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, in=\n" - "t irq)\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;\n" - "> >> +\tindio_dev->available_scan_masks =3D rm3100_scan_masks;\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;\n" + "> >> +\tindio_dev->available_scan_masks = rm3100_scan_masks;\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\tret =3D devm_request_irq(dev,\n" + "> >> +\t\tdata->use_interrupt = true;\n" + "> >> +\t\tret = devm_request_irq(dev,\n" "> >> +\t\t\t\t irq,\n" "> >> +\t\t\t\t rm3100_irq_handler,\n" "> >> +\t\t\t\t IRQF_TRIGGER_RISING,\n" @@ -709,34 +692,34 @@ "> >> +\t\tinit_completion(&data->measuring_done);\n" "> >> +\t}\n" "> >> +\n" - "> >> +\tret =3D devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,\n" + "> >> +\tret = devm_iio_triggered_buffer_setup(dev, indio_dev, NULL,\n" "> >> +\t\t\t\t\t rm3100_trigger_handler, NULL);\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, 3sec more wait time for conversion. */\n" - "> >> +\tdata->conversion_time =3D\n" + "> >> +\tdata->conversion_time =\n" "> >> +\t\trm3100_samp_rates[tmp - RM3100_TMRC_OFFSET][2] + 3000;\n" "> >> +\n" "> >> +\t/* Cycle count values may not be what we want. */\n" - "> >> +\tret =3D regmap_read(data->regmap, RM3100_REG_TMRC, &tmp);\n" + "> >> +\tret = regmap_read(data->regmap, RM3100_REG_TMRC, &tmp);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\treturn ret;\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" "> >> +\n" "> >> +\t/* Starting all channels' conversion. */\n" - "> >> +\tret =3D regmap_write(regmap, RM3100_REG_CMM,\n" + "> >> +\tret = regmap_write(regmap, RM3100_REG_CMM,\n" "> >> +\t\tRM3100_CMM_X | RM3100_CMM_Y | RM3100_CMM_Z | RM3100_CMM_START);\n" "> >> +\tif (ret < 0)\n" "> >> +\t\treturn ret;\n" "> >> +\n" - "> >> +\tret =3D devm_add_action(dev, rm3100_remove, data);\n" + "> >> +\tret = devm_add_action(dev, rm3100_remove, data);\n" "> >> +\tif (ret < 0) {\n" "> >> +\t\trm3100_remove(data);\n" "> >> +\t\treturn ret;\n" @@ -749,8 +732,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/magne=\n" - "tometer/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..8f02e0366886\n" "> >> --- /dev/null\n" @@ -770,15 +752,15 @@ "> >> +\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" @@ -789,33 +771,32 @@ "> >> +\t\tI2C_FUNC_SMBUS_READ_I2C_BLOCK | I2C_FUNC_SMBUS_BYTE_DATA))\n" "> >> +\t\treturn -EOPNOTSUPP;\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/magne=\n" - "tometer/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" @@ -833,17 +814,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" @@ -852,41 +833,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/magnetome=\n" - "ter/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" @@ -906,10 +886,9 @@ "> >> +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, in=\n" - "t irq);\n" + "> >> +int rm3100_common_probe(struct device *dev, struct regmap *regmap, int irq);\n" "> >> +\n" - "> >> +#endif /* RM3100_CORE_H */ =20\n" - >=20 + "> >> +#endif /* RM3100_CORE_H */ \n" + > -c38b99cb2851be7a46fa3e9baa10711e1bfa8a5f96bb59d2020a48bc426e577c +25b156d5ce5153f6d72fa4f5e97bb2105674874d4fd3f8a777b97ed448f7a62f
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.