Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iio: make st_sensors drivers use regmap

This patch is meant to replace the i2c/spi transfer functions with
regmap. SPI framework requires DMA safe buffers so let's add GFP_DMA
flag for memory allocation used by bulk_read functions.

Signed-off-by: Denis Ciocca <denis.ciocca@st.com>
Signed-off-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>

authored by

Denis Ciocca and committed by
Jonathan Cameron
062809ef 1ecd245e

+105 -213
+2 -1
drivers/iio/accel/st_accel_buffer.c
··· 39 39 int err; 40 40 struct st_sensor_data *adata = iio_priv(indio_dev); 41 41 42 - adata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 42 + adata->buffer_data = kmalloc(indio_dev->scan_bytes, 43 + GFP_DMA | GFP_KERNEL); 43 44 if (adata->buffer_data == NULL) { 44 45 err = -ENOMEM; 45 46 goto allocate_memory_error;
-3
drivers/iio/accel/st_accel_core.c
··· 13 13 #include <linux/acpi.h> 14 14 #include <linux/errno.h> 15 15 #include <linux/types.h> 16 - #include <linux/mutex.h> 17 16 #include <linux/interrupt.h> 18 17 #include <linux/i2c.h> 19 18 #include <linux/gpio.h> ··· 1176 1177 1177 1178 indio_dev->modes = INDIO_DIRECT_MODE; 1178 1179 indio_dev->info = &accel_info; 1179 - mutex_init(&adata->tb.buf_lock); 1180 1180 1181 1181 err = st_sensors_power_enable(indio_dev); 1182 1182 if (err) ··· 1186 1188 goto st_accel_power_off; 1187 1189 1188 1190 adata->num_data_channels = ST_ACCEL_NUMBER_DATA_CHANNELS; 1189 - adata->multiread_bit = adata->sensor_settings->multi_read_bit; 1190 1191 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 1191 1192 1192 1193 channels_size = indio_dev->num_channels * sizeof(struct iio_chan_spec);
+3 -1
drivers/iio/accel/st_accel_i2c.c
··· 174 174 adata = iio_priv(indio_dev); 175 175 adata->sensor_settings = (struct st_sensor_settings *)settings; 176 176 177 - st_sensors_i2c_configure(indio_dev, client, adata); 177 + ret = st_sensors_i2c_configure(indio_dev, client); 178 + if (ret < 0) 179 + return ret; 178 180 179 181 ret = st_accel_common_probe(indio_dev); 180 182 if (ret < 0)
+4 -6
drivers/iio/common/st_sensors/st_sensors_buffer.c
··· 17 17 #include <linux/iio/trigger_consumer.h> 18 18 #include <linux/iio/triggered_buffer.h> 19 19 #include <linux/irqreturn.h> 20 + #include <linux/regmap.h> 20 21 21 22 #include <linux/iio/common/st_sensors.h> 22 23 23 24 24 25 static int st_sensors_get_buffer_element(struct iio_dev *indio_dev, u8 *buf) 25 26 { 26 - int i; 27 27 struct st_sensor_data *sdata = iio_priv(indio_dev); 28 28 unsigned int num_data_channels = sdata->num_data_channels; 29 + int i; 29 30 30 31 for_each_set_bit(i, indio_dev->active_scan_mask, num_data_channels) { 31 32 const struct iio_chan_spec *channel = &indio_dev->channels[i]; ··· 37 36 channel->scan_type.storagebits >> 3; 38 37 39 38 buf = PTR_ALIGN(buf, storage_bytes); 40 - if (sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev, 41 - channel->address, 42 - bytes_to_read, buf, 43 - sdata->multiread_bit) < 44 - bytes_to_read) 39 + if (regmap_bulk_read(sdata->regmap, channel->address, 40 + buf, bytes_to_read) < 0) 45 41 return -EIO; 46 42 47 43 /* Advance the buffer pointer */
+12 -27
drivers/iio/common/st_sensors/st_sensors_core.c
··· 15 15 #include <linux/regulator/consumer.h> 16 16 #include <linux/of.h> 17 17 #include <linux/of_device.h> 18 + #include <linux/regmap.h> 18 19 #include <asm/unaligned.h> 19 20 #include <linux/iio/common/st_sensors.h> 20 21 ··· 29 28 int st_sensors_write_data_with_mask(struct iio_dev *indio_dev, 30 29 u8 reg_addr, u8 mask, u8 data) 31 30 { 32 - int err; 33 - u8 new_data; 34 31 struct st_sensor_data *sdata = iio_priv(indio_dev); 35 32 36 - err = sdata->tf->read_byte(&sdata->tb, sdata->dev, reg_addr, &new_data); 37 - if (err < 0) 38 - goto st_sensors_write_data_with_mask_error; 39 - 40 - new_data = ((new_data & (~mask)) | ((data << __ffs(mask)) & mask)); 41 - err = sdata->tf->write_byte(&sdata->tb, sdata->dev, reg_addr, new_data); 42 - 43 - st_sensors_write_data_with_mask_error: 44 - return err; 33 + return regmap_update_bits(sdata->regmap, 34 + reg_addr, mask, data << __ffs(mask)); 45 35 } 46 36 47 37 int st_sensors_debugfs_reg_access(struct iio_dev *indio_dev, ··· 40 48 unsigned *readval) 41 49 { 42 50 struct st_sensor_data *sdata = iio_priv(indio_dev); 43 - u8 readdata; 44 51 int err; 45 52 46 53 if (!readval) 47 - return sdata->tf->write_byte(&sdata->tb, sdata->dev, 48 - (u8)reg, (u8)writeval); 54 + return regmap_write(sdata->regmap, reg, writeval); 49 55 50 - err = sdata->tf->read_byte(&sdata->tb, sdata->dev, (u8)reg, &readdata); 56 + err = regmap_read(sdata->regmap, reg, readval); 51 57 if (err < 0) 52 58 return err; 53 - 54 - *readval = (unsigned)readdata; 55 59 56 60 return 0; 57 61 } ··· 533 545 EXPORT_SYMBOL(st_sensors_set_fullscale_by_gain); 534 546 535 547 static int st_sensors_read_axis_data(struct iio_dev *indio_dev, 536 - struct iio_chan_spec const *ch, int *data) 548 + struct iio_chan_spec const *ch, int *data) 537 549 { 538 550 int err; 539 551 u8 *outdata; ··· 542 554 543 555 byte_for_channel = DIV_ROUND_UP(ch->scan_type.realbits + 544 556 ch->scan_type.shift, 8); 545 - outdata = kmalloc(byte_for_channel, GFP_KERNEL); 557 + outdata = kmalloc(byte_for_channel, GFP_DMA | GFP_KERNEL); 546 558 if (!outdata) 547 559 return -ENOMEM; 548 560 549 - err = sdata->tf->read_multiple_byte(&sdata->tb, sdata->dev, 550 - ch->address, byte_for_channel, 551 - outdata, sdata->multiread_bit); 561 + err = regmap_bulk_read(sdata->regmap, ch->address, 562 + outdata, byte_for_channel); 552 563 if (err < 0) 553 564 goto st_sensors_free_memory; 554 565 ··· 632 645 int st_sensors_verify_id(struct iio_dev *indio_dev) 633 646 { 634 647 struct st_sensor_data *sdata = iio_priv(indio_dev); 635 - int err; 636 - u8 wai; 648 + int wai, err; 637 649 638 650 if (sdata->sensor_settings->wai_addr) { 639 - err = sdata->tf->read_byte(&sdata->tb, sdata->dev, 640 - sdata->sensor_settings->wai_addr, 641 - &wai); 651 + err = regmap_read(sdata->regmap, 652 + sdata->sensor_settings->wai_addr, &wai); 642 653 if (err < 0) { 643 654 dev_err(&indio_dev->dev, 644 655 "failed to read Who-Am-I register.\n");
+36 -39
drivers/iio/common/st_sensors/st_sensors_i2c.c
··· 13 13 #include <linux/iio/iio.h> 14 14 #include <linux/of_device.h> 15 15 #include <linux/acpi.h> 16 + #include <linux/regmap.h> 16 17 17 18 #include <linux/iio/common/st_sensors_i2c.h> 18 19 ··· 27 26 return to_i2c_client(sdata->dev)->irq; 28 27 } 29 28 30 - static int st_sensors_i2c_read_byte(struct st_sensor_transfer_buffer *tb, 31 - struct device *dev, u8 reg_addr, u8 *res_byte) 32 - { 33 - int err; 34 - 35 - err = i2c_smbus_read_byte_data(to_i2c_client(dev), reg_addr); 36 - if (err < 0) 37 - goto st_accel_i2c_read_byte_error; 38 - 39 - *res_byte = err & 0xff; 40 - 41 - st_accel_i2c_read_byte_error: 42 - return err < 0 ? err : 0; 43 - } 44 - 45 - static int st_sensors_i2c_read_multiple_byte( 46 - struct st_sensor_transfer_buffer *tb, struct device *dev, 47 - u8 reg_addr, int len, u8 *data, bool multiread_bit) 48 - { 49 - if (multiread_bit) 50 - reg_addr |= ST_SENSORS_I2C_MULTIREAD; 51 - 52 - return i2c_smbus_read_i2c_block_data_or_emulated(to_i2c_client(dev), 53 - reg_addr, len, data); 54 - } 55 - 56 - static int st_sensors_i2c_write_byte(struct st_sensor_transfer_buffer *tb, 57 - struct device *dev, u8 reg_addr, u8 data) 58 - { 59 - return i2c_smbus_write_byte_data(to_i2c_client(dev), reg_addr, data); 60 - } 61 - 62 - static const struct st_sensor_transfer_function st_sensors_tf_i2c = { 63 - .read_byte = st_sensors_i2c_read_byte, 64 - .write_byte = st_sensors_i2c_write_byte, 65 - .read_multiple_byte = st_sensors_i2c_read_multiple_byte, 29 + static const struct regmap_config st_sensors_i2c_regmap_config = { 30 + .reg_bits = 8, 31 + .val_bits = 8, 66 32 }; 67 33 68 - void st_sensors_i2c_configure(struct iio_dev *indio_dev, 69 - struct i2c_client *client, struct st_sensor_data *sdata) 34 + static const struct regmap_config st_sensors_i2c_regmap_multiread_bit_config = { 35 + .reg_bits = 8, 36 + .val_bits = 8, 37 + .read_flag_mask = ST_SENSORS_I2C_MULTIREAD, 38 + }; 39 + 40 + /* 41 + * st_sensors_i2c_configure() - configure I2C interface 42 + * @indio_dev: IIO device reference. 43 + * @client: i2c client reference. 44 + * 45 + * Return: 0 on success, else a negative error code. 46 + */ 47 + int st_sensors_i2c_configure(struct iio_dev *indio_dev, 48 + struct i2c_client *client) 70 49 { 50 + struct st_sensor_data *sdata = iio_priv(indio_dev); 51 + const struct regmap_config *config; 52 + 53 + if (sdata->sensor_settings->multi_read_bit) 54 + config = &st_sensors_i2c_regmap_multiread_bit_config; 55 + else 56 + config = &st_sensors_i2c_regmap_config; 57 + 58 + sdata->regmap = devm_regmap_init_i2c(client, config); 59 + if (IS_ERR(sdata->regmap)) { 60 + dev_err(&client->dev, "Failed to register i2c regmap (%d)\n", 61 + (int)PTR_ERR(sdata->regmap)); 62 + return PTR_ERR(sdata->regmap); 63 + } 64 + 71 65 i2c_set_clientdata(client, indio_dev); 72 66 73 67 indio_dev->dev.parent = &client->dev; 74 68 indio_dev->name = client->name; 75 69 76 70 sdata->dev = &client->dev; 77 - sdata->tf = &st_sensors_tf_i2c; 78 71 sdata->get_irq_data_ready = st_sensors_i2c_get_irq; 72 + 73 + return 0; 79 74 } 80 75 EXPORT_SYMBOL(st_sensors_i2c_configure); 81 76
+23 -77
drivers/iio/common/st_sensors/st_sensors_spi.c
··· 11 11 #include <linux/module.h> 12 12 #include <linux/slab.h> 13 13 #include <linux/iio/iio.h> 14 + #include <linux/regmap.h> 14 15 15 16 #include <linux/iio/common/st_sensors_spi.h> 16 - 17 + #include "st_sensors_core.h" 17 18 18 19 #define ST_SENSORS_SPI_MULTIREAD 0xc0 19 - #define ST_SENSORS_SPI_READ 0x80 20 20 21 21 static unsigned int st_sensors_spi_get_irq(struct iio_dev *indio_dev) 22 22 { ··· 25 25 return to_spi_device(sdata->dev)->irq; 26 26 } 27 27 28 - static int st_sensors_spi_read(struct st_sensor_transfer_buffer *tb, 29 - struct device *dev, u8 reg_addr, int len, u8 *data, bool multiread_bit) 30 - { 31 - int err; 28 + static const struct regmap_config st_sensors_spi_regmap_config = { 29 + .reg_bits = 8, 30 + .val_bits = 8, 31 + }; 32 32 33 - struct spi_transfer xfers[] = { 34 - { 35 - .tx_buf = tb->tx_buf, 36 - .bits_per_word = 8, 37 - .len = 1, 38 - }, 39 - { 40 - .rx_buf = tb->rx_buf, 41 - .bits_per_word = 8, 42 - .len = len, 43 - } 44 - }; 45 - 46 - mutex_lock(&tb->buf_lock); 47 - if ((multiread_bit) && (len > 1)) 48 - tb->tx_buf[0] = reg_addr | ST_SENSORS_SPI_MULTIREAD; 49 - else 50 - tb->tx_buf[0] = reg_addr | ST_SENSORS_SPI_READ; 51 - 52 - err = spi_sync_transfer(to_spi_device(dev), xfers, ARRAY_SIZE(xfers)); 53 - if (err) 54 - goto acc_spi_read_error; 55 - 56 - memcpy(data, tb->rx_buf, len); 57 - mutex_unlock(&tb->buf_lock); 58 - return len; 59 - 60 - acc_spi_read_error: 61 - mutex_unlock(&tb->buf_lock); 62 - return err; 63 - } 64 - 65 - static int st_sensors_spi_read_byte(struct st_sensor_transfer_buffer *tb, 66 - struct device *dev, u8 reg_addr, u8 *res_byte) 67 - { 68 - return st_sensors_spi_read(tb, dev, reg_addr, 1, res_byte, false); 69 - } 70 - 71 - static int st_sensors_spi_read_multiple_byte( 72 - struct st_sensor_transfer_buffer *tb, struct device *dev, 73 - u8 reg_addr, int len, u8 *data, bool multiread_bit) 74 - { 75 - return st_sensors_spi_read(tb, dev, reg_addr, len, data, multiread_bit); 76 - } 77 - 78 - static int st_sensors_spi_write_byte(struct st_sensor_transfer_buffer *tb, 79 - struct device *dev, u8 reg_addr, u8 data) 80 - { 81 - int err; 82 - 83 - struct spi_transfer xfers = { 84 - .tx_buf = tb->tx_buf, 85 - .bits_per_word = 8, 86 - .len = 2, 87 - }; 88 - 89 - mutex_lock(&tb->buf_lock); 90 - tb->tx_buf[0] = reg_addr; 91 - tb->tx_buf[1] = data; 92 - 93 - err = spi_sync_transfer(to_spi_device(dev), &xfers, 1); 94 - mutex_unlock(&tb->buf_lock); 95 - 96 - return err; 97 - } 98 - 99 - static const struct st_sensor_transfer_function st_sensors_tf_spi = { 100 - .read_byte = st_sensors_spi_read_byte, 101 - .write_byte = st_sensors_spi_write_byte, 102 - .read_multiple_byte = st_sensors_spi_read_multiple_byte, 33 + static const struct regmap_config st_sensors_spi_regmap_multiread_bit_config = { 34 + .reg_bits = 8, 35 + .val_bits = 8, 36 + .read_flag_mask = ST_SENSORS_SPI_MULTIREAD, 103 37 }; 104 38 105 39 /* ··· 89 155 struct spi_device *spi) 90 156 { 91 157 struct st_sensor_data *sdata = iio_priv(indio_dev); 158 + const struct regmap_config *config; 92 159 int err; 93 160 94 161 if (st_sensors_is_spi_3_wire(spi)) { ··· 99 164 return err; 100 165 } 101 166 167 + if (sdata->sensor_settings->multi_read_bit) 168 + config = &st_sensors_spi_regmap_multiread_bit_config; 169 + else 170 + config = &st_sensors_spi_regmap_config; 171 + 172 + sdata->regmap = devm_regmap_init_spi(spi, config); 173 + if (IS_ERR(sdata->regmap)) { 174 + dev_err(&spi->dev, "Failed to register spi regmap (%d)\n", 175 + (int)PTR_ERR(sdata->regmap)); 176 + return PTR_ERR(sdata->regmap); 177 + } 178 + 102 179 spi_set_drvdata(spi, indio_dev); 103 180 104 181 indio_dev->dev.parent = &spi->dev; 105 182 indio_dev->name = spi->modalias; 106 183 107 184 sdata->dev = &spi->dev; 108 - sdata->tf = &st_sensors_tf_spi; 109 185 sdata->get_irq_data_ready = st_sensors_spi_get_irq; 110 186 111 187 return 0;
+5 -5
drivers/iio/common/st_sensors/st_sensors_trigger.c
··· 13 13 #include <linux/iio/iio.h> 14 14 #include <linux/iio/trigger.h> 15 15 #include <linux/interrupt.h> 16 + #include <linux/regmap.h> 16 17 #include <linux/iio/common/st_sensors.h> 17 18 #include "st_sensors_core.h" 18 19 ··· 27 26 static int st_sensors_new_samples_available(struct iio_dev *indio_dev, 28 27 struct st_sensor_data *sdata) 29 28 { 30 - u8 status; 31 - int ret; 29 + int ret, status; 32 30 33 31 /* How would I know if I can't check it? */ 34 32 if (!sdata->sensor_settings->drdy_irq.stat_drdy.addr) ··· 37 37 if (!indio_dev->active_scan_mask) 38 38 return 0; 39 39 40 - ret = sdata->tf->read_byte(&sdata->tb, sdata->dev, 41 - sdata->sensor_settings->drdy_irq.stat_drdy.addr, 42 - &status); 40 + ret = regmap_read(sdata->regmap, 41 + sdata->sensor_settings->drdy_irq.stat_drdy.addr, 42 + &status); 43 43 if (ret < 0) { 44 44 dev_err(sdata->dev, 45 45 "error checking samples available\n");
+2 -1
drivers/iio/gyro/st_gyro_buffer.c
··· 39 39 int err; 40 40 struct st_sensor_data *gdata = iio_priv(indio_dev); 41 41 42 - gdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 42 + gdata->buffer_data = kmalloc(indio_dev->scan_bytes, 43 + GFP_DMA | GFP_KERNEL); 43 44 if (gdata->buffer_data == NULL) { 44 45 err = -ENOMEM; 45 46 goto allocate_memory_error;
-3
drivers/iio/gyro/st_gyro_core.c
··· 12 12 #include <linux/slab.h> 13 13 #include <linux/errno.h> 14 14 #include <linux/types.h> 15 - #include <linux/mutex.h> 16 15 #include <linux/interrupt.h> 17 16 #include <linux/i2c.h> 18 17 #include <linux/gpio.h> ··· 393 394 394 395 indio_dev->modes = INDIO_DIRECT_MODE; 395 396 indio_dev->info = &gyro_info; 396 - mutex_init(&gdata->tb.buf_lock); 397 397 398 398 err = st_sensors_power_enable(indio_dev); 399 399 if (err) ··· 403 405 goto st_gyro_power_off; 404 406 405 407 gdata->num_data_channels = ST_GYRO_NUMBER_DATA_CHANNELS; 406 - gdata->multiread_bit = gdata->sensor_settings->multi_read_bit; 407 408 indio_dev->channels = gdata->sensor_settings->ch; 408 409 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 409 410
+3 -1
drivers/iio/gyro/st_gyro_i2c.c
··· 87 87 gdata = iio_priv(indio_dev); 88 88 gdata->sensor_settings = (struct st_sensor_settings *)settings; 89 89 90 - st_sensors_i2c_configure(indio_dev, client, gdata); 90 + err = st_sensors_i2c_configure(indio_dev, client); 91 + if (err < 0) 92 + return err; 91 93 92 94 err = st_gyro_common_probe(indio_dev); 93 95 if (err < 0)
+2 -1
drivers/iio/magnetometer/st_magn_buffer.c
··· 34 34 int err; 35 35 struct st_sensor_data *mdata = iio_priv(indio_dev); 36 36 37 - mdata->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 37 + mdata->buffer_data = kmalloc(indio_dev->scan_bytes, 38 + GFP_DMA | GFP_KERNEL); 38 39 if (mdata->buffer_data == NULL) { 39 40 err = -ENOMEM; 40 41 goto allocate_memory_error;
-3
drivers/iio/magnetometer/st_magn_core.c
··· 12 12 #include <linux/slab.h> 13 13 #include <linux/errno.h> 14 14 #include <linux/types.h> 15 - #include <linux/mutex.h> 16 15 #include <linux/interrupt.h> 17 16 #include <linux/i2c.h> 18 17 #include <linux/gpio.h> ··· 495 496 496 497 indio_dev->modes = INDIO_DIRECT_MODE; 497 498 indio_dev->info = &magn_info; 498 - mutex_init(&mdata->tb.buf_lock); 499 499 500 500 err = st_sensors_power_enable(indio_dev); 501 501 if (err) ··· 505 507 goto st_magn_power_off; 506 508 507 509 mdata->num_data_channels = ST_MAGN_NUMBER_DATA_CHANNELS; 508 - mdata->multiread_bit = mdata->sensor_settings->multi_read_bit; 509 510 indio_dev->channels = mdata->sensor_settings->ch; 510 511 indio_dev->num_channels = ST_SENSORS_NUMBER_ALL_CHANNELS; 511 512
+3 -1
drivers/iio/magnetometer/st_magn_i2c.c
··· 79 79 mdata = iio_priv(indio_dev); 80 80 mdata->sensor_settings = (struct st_sensor_settings *)settings; 81 81 82 - st_sensors_i2c_configure(indio_dev, client, mdata); 82 + err = st_sensors_i2c_configure(indio_dev, client); 83 + if (err < 0) 84 + return err; 83 85 84 86 err = st_magn_common_probe(indio_dev); 85 87 if (err < 0)
+2 -1
drivers/iio/pressure/st_pressure_buffer.c
··· 39 39 int err; 40 40 struct st_sensor_data *press_data = iio_priv(indio_dev); 41 41 42 - press_data->buffer_data = kmalloc(indio_dev->scan_bytes, GFP_KERNEL); 42 + press_data->buffer_data = kmalloc(indio_dev->scan_bytes, 43 + GFP_DMA | GFP_KERNEL); 43 44 if (press_data->buffer_data == NULL) { 44 45 err = -ENOMEM; 45 46 goto allocate_memory_error;
-3
drivers/iio/pressure/st_pressure_core.c
··· 12 12 #include <linux/slab.h> 13 13 #include <linux/errno.h> 14 14 #include <linux/types.h> 15 - #include <linux/mutex.h> 16 15 #include <linux/interrupt.h> 17 16 #include <linux/i2c.h> 18 17 #include <linux/gpio.h> ··· 691 692 692 693 indio_dev->modes = INDIO_DIRECT_MODE; 693 694 indio_dev->info = &press_info; 694 - mutex_init(&press_data->tb.buf_lock); 695 695 696 696 err = st_sensors_power_enable(indio_dev); 697 697 if (err) ··· 707 709 * element. 708 710 */ 709 711 press_data->num_data_channels = press_data->sensor_settings->num_ch - 1; 710 - press_data->multiread_bit = press_data->sensor_settings->multi_read_bit; 711 712 indio_dev->channels = press_data->sensor_settings->ch; 712 713 indio_dev->num_channels = press_data->sensor_settings->num_ch; 713 714
+3 -1
drivers/iio/pressure/st_pressure_i2c.c
··· 112 112 press_data = iio_priv(indio_dev); 113 113 press_data->sensor_settings = (struct st_sensor_settings *)settings; 114 114 115 - st_sensors_i2c_configure(indio_dev, client, press_data); 115 + ret = st_sensors_i2c_configure(indio_dev, client); 116 + if (ret < 0) 117 + return ret; 116 118 117 119 ret = st_press_common_probe(indio_dev); 118 120 if (ret < 0)
+3 -37
include/linux/iio/common/st_sensors.h
··· 16 16 #include <linux/iio/trigger.h> 17 17 #include <linux/bitops.h> 18 18 #include <linux/regulator/consumer.h> 19 + #include <linux/regmap.h> 19 20 20 21 #include <linux/platform_data/st_sensors_pdata.h> 21 22 ··· 171 170 }; 172 171 173 172 /** 174 - * struct st_sensor_transfer_buffer - ST sensor device I/O buffer 175 - * @buf_lock: Mutex to protect rx and tx buffers. 176 - * @tx_buf: Buffer used by SPI transfer function to send data to the sensors. 177 - * This buffer is used to avoid DMA not-aligned issue. 178 - * @rx_buf: Buffer used by SPI transfer to receive data from sensors. 179 - * This buffer is used to avoid DMA not-aligned issue. 180 - */ 181 - struct st_sensor_transfer_buffer { 182 - struct mutex buf_lock; 183 - u8 rx_buf[ST_SENSORS_RX_MAX_LENGTH]; 184 - u8 tx_buf[ST_SENSORS_TX_MAX_LENGTH] ____cacheline_aligned; 185 - }; 186 - 187 - /** 188 - * struct st_sensor_transfer_function - ST sensor device I/O function 189 - * @read_byte: Function used to read one byte. 190 - * @write_byte: Function used to write one byte. 191 - * @read_multiple_byte: Function used to read multiple byte. 192 - */ 193 - struct st_sensor_transfer_function { 194 - int (*read_byte) (struct st_sensor_transfer_buffer *tb, 195 - struct device *dev, u8 reg_addr, u8 *res_byte); 196 - int (*write_byte) (struct st_sensor_transfer_buffer *tb, 197 - struct device *dev, u8 reg_addr, u8 data); 198 - int (*read_multiple_byte) (struct st_sensor_transfer_buffer *tb, 199 - struct device *dev, u8 reg_addr, int len, u8 *data, 200 - bool multiread_bit); 201 - }; 202 - 203 - /** 204 173 * struct st_sensor_settings - ST specific sensor settings 205 174 * @wai: Contents of WhoAmI register. 206 175 * @wai_addr: The address of WhoAmI register. ··· 213 242 * @current_fullscale: Maximum range of measure by the sensor. 214 243 * @vdd: Pointer to sensor's Vdd power supply 215 244 * @vdd_io: Pointer to sensor's Vdd-IO power supply 245 + * @regmap: Pointer to specific sensor regmap configuration. 216 246 * @enabled: Status of the sensor (false->off, true->on). 217 - * @multiread_bit: Use or not particular bit for [I2C/SPI] multiread. 218 247 * @buffer_data: Data used by buffer part. 219 248 * @odr: Output data rate of the sensor [Hz]. 220 249 * num_data_channels: Number of data channels used in buffer. 221 250 * @drdy_int_pin: Redirect DRDY on pin 1 (1) or pin 2 (2). 222 251 * @int_pin_open_drain: Set the interrupt/DRDY to open drain. 223 252 * @get_irq_data_ready: Function to get the IRQ used for data ready signal. 224 - * @tf: Transfer function structure used by I/O operations. 225 - * @tb: Transfer buffers and mutex used by I/O operations. 226 253 * @edge_irq: the IRQ triggers on edges and need special handling. 227 254 * @hw_irq_trigger: if we're using the hardware interrupt on the sensor. 228 255 * @hw_timestamp: Latest timestamp from the interrupt handler, when in use. ··· 233 264 struct st_sensor_fullscale_avl *current_fullscale; 234 265 struct regulator *vdd; 235 266 struct regulator *vdd_io; 267 + struct regmap *regmap; 236 268 237 269 bool enabled; 238 - bool multiread_bit; 239 270 240 271 char *buffer_data; 241 272 ··· 246 277 bool int_pin_open_drain; 247 278 248 279 unsigned int (*get_irq_data_ready) (struct iio_dev *indio_dev); 249 - 250 - const struct st_sensor_transfer_function *tf; 251 - struct st_sensor_transfer_buffer tb; 252 280 253 281 bool edge_irq; 254 282 bool hw_irq_trigger;
+2 -2
include/linux/iio/common/st_sensors_i2c.h
··· 14 14 #include <linux/iio/common/st_sensors.h> 15 15 #include <linux/of.h> 16 16 17 - void st_sensors_i2c_configure(struct iio_dev *indio_dev, 18 - struct i2c_client *client, struct st_sensor_data *sdata); 17 + int st_sensors_i2c_configure(struct iio_dev *indio_dev, 18 + struct i2c_client *client); 19 19 20 20 #ifdef CONFIG_ACPI 21 21 int st_sensors_match_acpi_device(struct device *dev);