* [PATCH v4 0/8] Add support for best effort block read emulation
@ 2015-08-04 14:04 Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 2/8] eeprom: at24: use i2c_smbus_read_i2c_block_data_or_emulated Irina Tirdea
` (6 more replies)
0 siblings, 7 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Irina Tirdea
This is version 4 for adding i2c_smbus_read_i2c_block_data_or_emulated
to i2c-core.
Changes from v3:
- when reading an odd number of bytes using word emulation, read an even
number of bytes using word reads and the last byte using byte read
- code styling changes to improve readability
- add a comment about addressing assumptions to the
i2c_smbus_read_i2c_block_data_or_emulated function as Jonathan suggested
- add Acked-by from Jonathan and Srinivas to the iio changes
Changes from v2:
- changed bmc150-accel, kxcjk-1013 and bmg160 drivers to use
i2c_smbus_read_i2c_block_data_or_emulated
Changes from v1:
- dropped the RFC tag
- changed at24 to use i2c_smbus_read_i2c_block_data_or_emulated
- when reading an odd number of bytes using word emulation, read an even
number of bytes and drop the last one
- add a comment that this might not be suitable for all I2C slaves
Adriana Reus (2):
iio: accel: kxcjk-1013: use available_scan_masks
iio: accel: kxcjk-1013: optimize i2c transfers in trigger handler
Irina Tirdea (6):
i2c: core: Add support for best effort block read emulation
eeprom: at24: use i2c_smbus_read_i2c_block_data_or_emulated
iio: accel: bmc150: use available_scan_masks
iio: accel: bmc150: optimize i2c transfers in trigger handler
iio: gyro: bmg160: use available_scan_masks
iio: gyro: bmg160: optimize i2c transfers in trigger handler
drivers/i2c/i2c-core.c | 65 ++++++++++++++++++++++++++++++++++++++++
drivers/iio/accel/bmc150-accel.c | 23 +++++++-------
drivers/iio/accel/kxcjk-1013.c | 24 +++++++--------
drivers/iio/gyro/bmg160.c | 23 +++++++-------
drivers/misc/eeprom/at24.c | 37 ++++-------------------
include/linux/i2c.h | 3 ++
6 files changed, 110 insertions(+), 65 deletions(-)
--
1.9.1
^ permalink raw reply [flat|nested] 13+ messages in thread
* [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
[not found] ` <1438697056-2946-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2015-08-04 14:04 ` Irina Tirdea
[not found] ` <1438697056-2946-2-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-08-04 14:04 ` [PATCH v4 3/8] iio: accel: bmc150: use available_scan_masks Irina Tirdea
1 sibling, 1 reply; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Srinivas Pandruvada,
Peter Meerwald, Irina Tirdea
There are devices that need to handle block transactions
regardless of the capabilities exported by the adapter.
For performance reasons, they need to use i2c read blocks
if available, otherwise emulate the block transaction with word
or byte transactions.
Add support for a helper function that would read a data block
using the best transfer available: I2C_FUNC_SMBUS_READ_I2C_BLOCK,
I2C_FUNC_SMBUS_READ_WORD_DATA or I2C_FUNC_SMBUS_READ_BYTE_DATA.
Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
---
drivers/i2c/i2c-core.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/i2c.h | 3 +++
2 files changed, 68 insertions(+)
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
index c83e4d1..79ba6a8 100644
--- a/drivers/i2c/i2c-core.c
+++ b/drivers/i2c/i2c-core.c
@@ -2942,6 +2942,71 @@ trace:
}
EXPORT_SYMBOL(i2c_smbus_xfer);
+/**
+ * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
+ * @client: Handle to slave device
+ * @command: Byte interpreted by slave
+ * @length: Size of data block; SMBus allows at most 32 bytes
+ * @values: Byte array into which data will be read; big enough to hold
+ * the data returned by the slave. SMBus allows at most 32 bytes.
+ *
+ * This executes the SMBus "block read" protocol if supported by the adapter.
+ * If block read is not supported, it emulates it using either word or byte
+ * read protocols depending on availability.
+ *
+ * The addresses of the I2C slave device that are accessed with this function
+ * must be mapped to a linear region, so that a block read will have the same
+ * effect as a byte read. Before using this function you must double-check
+ * if the I2C slave does support exchanging a block transfer with a byte
+ * transfer.
+ */
+s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
+ u8 command, u8 length, u8 *values)
+{
+ u8 i;
+ int status;
+
+ if (length > I2C_SMBUS_BLOCK_MAX)
+ length = I2C_SMBUS_BLOCK_MAX;
+
+ if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
+ return i2c_smbus_read_i2c_block_data(client, command, length, values);
+
+ if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA |
+ I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
+ for (i = 0; (i + 2) <= length; i += 2) {
+ status = i2c_smbus_read_word_data(client, command + i);
+ if (status < 0)
+ return status;
+ values[i] = status & 0xff;
+ values[i + 1] = status >> 8;
+ }
+ if (i < length) {
+ status = i2c_smbus_read_byte_data(client, command + i);
+ if (status < 0)
+ return status;
+ values[i] = status;
+ i++;
+ }
+ return i;
+ }
+
+ if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
+ for (i = 0; i < length; i++) {
+ status = i2c_smbus_read_byte_data(client, command + i);
+ if (status < 0)
+ return status;
+ values[i] = status;
+ }
+ return i;
+ }
+
+ dev_err(&client->adapter->dev, "Unsupported transactions\n");
+
+ return -EOPNOTSUPP;
+}
+EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data_or_emulated);
+
#if IS_ENABLED(CONFIG_I2C_SLAVE)
int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
{
diff --git a/include/linux/i2c.h b/include/linux/i2c.h
index e83a738..faf518d 100644
--- a/include/linux/i2c.h
+++ b/include/linux/i2c.h
@@ -121,6 +121,9 @@ extern s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client,
extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,
u8 command, u8 length,
const u8 *values);
+extern s32
+i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
+ u8 command, u8 length, u8 *values);
#endif /* I2C */
/**
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 2/8] eeprom: at24: use i2c_smbus_read_i2c_block_data_or_emulated
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
[not found] ` <1438697056-2946-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
` (5 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Irina Tirdea
For i2c busses that support only SMBUS extensions, the eeprom at24
driver reads data from the device using the SMBus block, word or byte
read protocols depending on availability.
Replace the block read emulation from the driver with the
i2c_smbus_read_i2c_block_data_or_emulated call from i2c core.
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
---
drivers/misc/eeprom/at24.c | 37 ++++++-------------------------------
1 file changed, 6 insertions(+), 31 deletions(-)
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 6ded3dc..f336f01 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -186,19 +186,11 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
if (count > io_limit)
count = io_limit;
- switch (at24->use_smbus) {
- case I2C_SMBUS_I2C_BLOCK_DATA:
+ if (at24->use_smbus) {
/* Smaller eeproms can work given some SMBus extension calls */
if (count > I2C_SMBUS_BLOCK_MAX)
count = I2C_SMBUS_BLOCK_MAX;
- break;
- case I2C_SMBUS_WORD_DATA:
- count = 2;
- break;
- case I2C_SMBUS_BYTE_DATA:
- count = 1;
- break;
- default:
+ } else {
/*
* When we have a better choice than SMBus calls, use a
* combined I2C message. Write address; then read up to
@@ -229,27 +221,10 @@ static ssize_t at24_eeprom_read(struct at24_data *at24, char *buf,
timeout = jiffies + msecs_to_jiffies(write_timeout);
do {
read_time = jiffies;
- switch (at24->use_smbus) {
- case I2C_SMBUS_I2C_BLOCK_DATA:
- status = i2c_smbus_read_i2c_block_data(client, offset,
- count, buf);
- break;
- case I2C_SMBUS_WORD_DATA:
- status = i2c_smbus_read_word_data(client, offset);
- if (status >= 0) {
- buf[0] = status & 0xff;
- buf[1] = status >> 8;
- status = count;
- }
- break;
- case I2C_SMBUS_BYTE_DATA:
- status = i2c_smbus_read_byte_data(client, offset);
- if (status >= 0) {
- buf[0] = status;
- status = count;
- }
- break;
- default:
+ if (at24->use_smbus) {
+ status = i2c_smbus_read_i2c_block_data_or_emulated(client, offset,
+ count, buf);
+ } else {
status = i2c_transfer(client->adapter, msg, 2);
if (status == 2)
status = count;
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 3/8] iio: accel: bmc150: use available_scan_masks
[not found] ` <1438697056-2946-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-08-04 14:04 ` [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
1 sibling, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Srinivas Pandruvada,
Peter Meerwald, Irina Tirdea
Use available_scan_masks to allow the iio core to select
the data to send to userspace depending on which axes are
enabled, instead of doing this in the driver's interrupt
handler.
Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
Acked-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
---
drivers/iio/accel/bmc150-accel.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c
index 4e70f51..49b2f8e 100644
--- a/drivers/iio/accel/bmc150-accel.c
+++ b/drivers/iio/accel/bmc150-accel.c
@@ -136,6 +136,7 @@ enum bmc150_accel_axis {
AXIS_X,
AXIS_Y,
AXIS_Z,
+ AXIS_MAX,
};
enum bmc150_power_modes {
@@ -1200,6 +1201,8 @@ static const struct iio_info bmc150_accel_info_fifo = {
.driver_module = THIS_MODULE,
};
+static const unsigned long bmc150_accel_scan_masks[] = {0x7, 0};
+
static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -1208,8 +1211,7 @@ static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p)
int bit, ret, i = 0;
mutex_lock(&data->mutex);
- for_each_set_bit(bit, indio_dev->active_scan_mask,
- indio_dev->masklength) {
+ for (bit = 0; bit < AXIS_MAX; bit++) {
ret = i2c_smbus_read_word_data(data->client,
BMC150_ACCEL_AXIS_TO_REG(bit));
if (ret < 0) {
@@ -1647,6 +1649,7 @@ static int bmc150_accel_probe(struct i2c_client *client,
indio_dev->dev.parent = &client->dev;
indio_dev->channels = data->chip_info->channels;
indio_dev->num_channels = data->chip_info->num_channels;
+ indio_dev->available_scan_masks = bmc150_accel_scan_masks;
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &bmc150_accel_info;
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 4/8] iio: accel: bmc150: optimize i2c transfers in trigger handler
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 2/8] eeprom: at24: use i2c_smbus_read_i2c_block_data_or_emulated Irina Tirdea
[not found] ` <1438697056-2946-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2015-08-04 14:04 ` Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 5/8] iio: gyro: bmg160: use available_scan_masks Irina Tirdea
` (3 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Irina Tirdea
Some i2c busses (e.g.: Synopsys DesignWare I2C adapter) need to
enable/disable the bus at each i2c transfer and must wait for
the enable/disable to happen before sending the data.
When reading data in the trigger handler, the bmc150 accel driver does
one i2c transfer for each axis. This has an impact on the frequency
of the accelerometer at high sample rates due to additional delays
introduced by the i2c bus at each transfer.
Reading all axis values in one i2c transfer reduces the delays
introduced by the i2c bus. Uses i2c_smbus_read_i2c_block_data_or_emulated
that will fallback to reading each axis as a separate word in case i2c
block read is not supported.
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
drivers/iio/accel/bmc150-accel.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/iio/accel/bmc150-accel.c b/drivers/iio/accel/bmc150-accel.c
index 49b2f8e..6991200 100644
--- a/drivers/iio/accel/bmc150-accel.c
+++ b/drivers/iio/accel/bmc150-accel.c
@@ -1082,6 +1082,7 @@ static const struct iio_event_spec bmc150_accel_event = {
.realbits = (bits), \
.storagebits = 16, \
.shift = 16 - (bits), \
+ .endianness = IIO_LE, \
}, \
.event_spec = &bmc150_accel_event, \
.num_event_specs = 1 \
@@ -1208,19 +1209,16 @@ static irqreturn_t bmc150_accel_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmc150_accel_data *data = iio_priv(indio_dev);
- int bit, ret, i = 0;
+ int ret;
mutex_lock(&data->mutex);
- for (bit = 0; bit < AXIS_MAX; bit++) {
- ret = i2c_smbus_read_word_data(data->client,
- BMC150_ACCEL_AXIS_TO_REG(bit));
- if (ret < 0) {
- mutex_unlock(&data->mutex);
- goto err_read;
- }
- data->buffer[i++] = ret;
- }
+ ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
+ BMC150_ACCEL_REG_XOUT_L,
+ AXIS_MAX * 2,
+ (u8 *)data->buffer);
mutex_unlock(&data->mutex);
+ if (ret < 0)
+ goto err_read;
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
pf->timestamp);
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 5/8] iio: gyro: bmg160: use available_scan_masks
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
` (2 preceding siblings ...)
2015-08-04 14:04 ` [PATCH v4 4/8] iio: accel: bmc150: optimize i2c transfers in trigger handler Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 6/8] iio: gyro: bmg160: optimize i2c transfers in trigger handler Irina Tirdea
` (2 subsequent siblings)
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Irina Tirdea
Use available_scan_masks to allow the iio core to select
the data to send to userspace depending on which axes are
enabled, instead of doing this in the driver's interrupt
handler.
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
drivers/iio/gyro/bmg160.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/gyro/bmg160.c b/drivers/iio/gyro/bmg160.c
index 460bf71..b2a6ccb 100644
--- a/drivers/iio/gyro/bmg160.c
+++ b/drivers/iio/gyro/bmg160.c
@@ -114,6 +114,7 @@ enum bmg160_axis {
AXIS_X,
AXIS_Y,
AXIS_Z,
+ AXIS_MAX,
};
static const struct {
@@ -801,6 +802,8 @@ static const struct iio_info bmg160_info = {
.driver_module = THIS_MODULE,
};
+static const unsigned long bmg160_scan_masks[] = {0x7, 0};
+
static irqreturn_t bmg160_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -809,8 +812,7 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p)
int bit, ret, i = 0;
mutex_lock(&data->mutex);
- for_each_set_bit(bit, indio_dev->active_scan_mask,
- indio_dev->masklength) {
+ for (bit = 0; bit < AXIS_MAX; bit++) {
ret = i2c_smbus_read_word_data(data->client,
BMG160_AXIS_TO_REG(bit));
if (ret < 0) {
@@ -1062,6 +1064,7 @@ static int bmg160_probe(struct i2c_client *client,
indio_dev->dev.parent = &client->dev;
indio_dev->channels = bmg160_channels;
indio_dev->num_channels = ARRAY_SIZE(bmg160_channels);
+ indio_dev->available_scan_masks = bmg160_scan_masks;
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &bmg160_info;
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 6/8] iio: gyro: bmg160: optimize i2c transfers in trigger handler
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
` (3 preceding siblings ...)
2015-08-04 14:04 ` [PATCH v4 5/8] iio: gyro: bmg160: use available_scan_masks Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 7/8] iio: accel: kxcjk-1013: use available_scan_masks Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 8/8] iio: accel: kxcjk-1013: optimize i2c transfers in trigger handler Irina Tirdea
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Irina Tirdea
Some i2c busses (e.g.: Synopsys DesignWare I2C adapter) need to
enable/disable the bus at each i2c transfer and must wait for
the enable/disable to happen before sending the data.
When reading data in the trigger handler, the bmg160 driver does
one i2c transfer for each axis. This has an impact on the frequency
of the gyroscope at high sample rates due to additional delays
introduced by the i2c bus at each transfer.
Reading all axis values in one i2c transfer reduces the delays
introduced by the i2c bus. Uses i2c_smbus_read_i2c_block_data_or_emulated
that will fallback to reading each axis as a separate word in case i2c
block read is not supported.
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
drivers/iio/gyro/bmg160.c | 18 ++++++++----------
1 file changed, 8 insertions(+), 10 deletions(-)
diff --git a/drivers/iio/gyro/bmg160.c b/drivers/iio/gyro/bmg160.c
index b2a6ccb..1ff306d 100644
--- a/drivers/iio/gyro/bmg160.c
+++ b/drivers/iio/gyro/bmg160.c
@@ -772,6 +772,7 @@ static const struct iio_event_spec bmg160_event = {
.sign = 's', \
.realbits = 16, \
.storagebits = 16, \
+ .endianness = IIO_LE, \
}, \
.event_spec = &bmg160_event, \
.num_event_specs = 1 \
@@ -809,19 +810,16 @@ static irqreturn_t bmg160_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct bmg160_data *data = iio_priv(indio_dev);
- int bit, ret, i = 0;
+ int ret = 0;
mutex_lock(&data->mutex);
- for (bit = 0; bit < AXIS_MAX; bit++) {
- ret = i2c_smbus_read_word_data(data->client,
- BMG160_AXIS_TO_REG(bit));
- if (ret < 0) {
- mutex_unlock(&data->mutex);
- goto err;
- }
- data->buffer[i++] = ret;
- }
+ ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
+ BMG160_REG_XOUT_L,
+ AXIS_MAX * 2,
+ (u8 *)data->buffer);
mutex_unlock(&data->mutex);
+ if (ret < 0)
+ goto err;
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
pf->timestamp);
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 7/8] iio: accel: kxcjk-1013: use available_scan_masks
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
` (4 preceding siblings ...)
2015-08-04 14:04 ` [PATCH v4 6/8] iio: gyro: bmg160: optimize i2c transfers in trigger handler Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 8/8] iio: accel: kxcjk-1013: optimize i2c transfers in trigger handler Irina Tirdea
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Adriana Reus,
Irina Tirdea
From: Adriana Reus <adriana.reus@intel.com>
Use available_scan_masks to allow the iio core to select
the data to send to userspace depending on which axes are
enabled, instead of doing this in the driver's interrupt
handler.
Signed-off-by: Adriana Reus <adriana.reus@intel.com>
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
drivers/iio/accel/kxcjk-1013.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index 0d9bd35..d4b80e7 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -115,6 +115,7 @@ enum kxcjk1013_axis {
AXIS_X,
AXIS_Y,
AXIS_Z,
+ AXIS_MAX,
};
enum kxcjk1013_mode {
@@ -956,6 +957,8 @@ static const struct iio_info kxcjk1013_info = {
.driver_module = THIS_MODULE,
};
+static const unsigned long kxcjk1013_scan_masks[] = {0x7, 0};
+
static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
{
struct iio_poll_func *pf = p;
@@ -965,8 +968,7 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
mutex_lock(&data->mutex);
- for_each_set_bit(bit, indio_dev->active_scan_mask,
- indio_dev->masklength) {
+ for (bit = 0; bit < AXIS_MAX; bit++) {
ret = kxcjk1013_get_acc_reg(data, bit);
if (ret < 0) {
mutex_unlock(&data->mutex);
@@ -1236,6 +1238,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
indio_dev->dev.parent = &client->dev;
indio_dev->channels = kxcjk1013_channels;
indio_dev->num_channels = ARRAY_SIZE(kxcjk1013_channels);
+ indio_dev->available_scan_masks = kxcjk1013_scan_masks;
indio_dev->name = name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->info = &kxcjk1013_info;
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* [PATCH v4 8/8] iio: accel: kxcjk-1013: optimize i2c transfers in trigger handler
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
` (5 preceding siblings ...)
2015-08-04 14:04 ` [PATCH v4 7/8] iio: accel: kxcjk-1013: use available_scan_masks Irina Tirdea
@ 2015-08-04 14:04 ` Irina Tirdea
6 siblings, 0 replies; 13+ messages in thread
From: Irina Tirdea @ 2015-08-04 14:04 UTC (permalink / raw)
To: Wolfram Sang, Jonathan Cameron, linux-iio, linux-i2c
Cc: linux-kernel, Srinivas Pandruvada, Peter Meerwald, Adriana Reus,
Irina Tirdea
From: Adriana Reus <adriana.reus@intel.com>
Some i2c busses (e.g.: Synopsys DesignWare I2C adapter) need to
enable/disable the bus at each i2c transfer and must wait for
the enable/disable to happen before sending the data.
When reading data in the trigger handler, the kxcjk-1013 accel driver
does one i2c transfer for each axis. This has an impact on the
frequency of the accelerometer at high sample rates due to additional
delays introduced by the i2c bus at each transfer.
Reading all axis values in one i2c transfer reduces the delays
introduced by the i2c bus. Uses i2c_smbus_read_i2c_block_data_or_emulated
that will fallback to reading each axis as a separate word in case i2c
block read is not supported.
Signed-off-by: Adriana Reus <adriana.reus@intel.com>
Signed-off-by: Irina Tirdea <irina.tirdea@intel.com>
Acked-by: Jonathan Cameron <jic23@kernel.org>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
---
drivers/iio/accel/kxcjk-1013.c | 19 ++++++++-----------
1 file changed, 8 insertions(+), 11 deletions(-)
diff --git a/drivers/iio/accel/kxcjk-1013.c b/drivers/iio/accel/kxcjk-1013.c
index d4b80e7..e8f7b45 100644
--- a/drivers/iio/accel/kxcjk-1013.c
+++ b/drivers/iio/accel/kxcjk-1013.c
@@ -926,7 +926,7 @@ static const struct iio_event_spec kxcjk1013_event = {
.realbits = 12, \
.storagebits = 16, \
.shift = 4, \
- .endianness = IIO_CPU, \
+ .endianness = IIO_LE, \
}, \
.event_spec = &kxcjk1013_event, \
.num_event_specs = 1 \
@@ -964,19 +964,16 @@ static irqreturn_t kxcjk1013_trigger_handler(int irq, void *p)
struct iio_poll_func *pf = p;
struct iio_dev *indio_dev = pf->indio_dev;
struct kxcjk1013_data *data = iio_priv(indio_dev);
- int bit, ret, i = 0;
+ int ret;
mutex_lock(&data->mutex);
-
- for (bit = 0; bit < AXIS_MAX; bit++) {
- ret = kxcjk1013_get_acc_reg(data, bit);
- if (ret < 0) {
- mutex_unlock(&data->mutex);
- goto err;
- }
- data->buffer[i++] = ret;
- }
+ ret = i2c_smbus_read_i2c_block_data_or_emulated(data->client,
+ KXCJK1013_REG_XOUT_L,
+ AXIS_MAX * 2,
+ (u8 *)data->buffer);
mutex_unlock(&data->mutex);
+ if (ret < 0)
+ goto err;
iio_push_to_buffers_with_timestamp(indio_dev, data->buffer,
data->timestamp);
--
1.9.1
^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
[not found] ` <1438697056-2946-2-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
@ 2015-08-08 15:20 ` Jonathan Cameron
2015-08-09 7:31 ` Wolfram Sang
1 sibling, 0 replies; 13+ messages in thread
From: Jonathan Cameron @ 2015-08-08 15:20 UTC (permalink / raw)
To: Irina Tirdea, Wolfram Sang, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-i2c-u79uwXL29TY76Z2rM5mHXA
Cc: linux-kernel-u79uwXL29TY76Z2rM5mHXA, Srinivas Pandruvada,
Peter Meerwald
On 04/08/15 15:04, Irina Tirdea wrote:
> There are devices that need to handle block transactions
> regardless of the capabilities exported by the adapter.
> For performance reasons, they need to use i2c read blocks
> if available, otherwise emulate the block transaction with word
> or byte transactions.
>
> Add support for a helper function that would read a data block
> using the best transfer available: I2C_FUNC_SMBUS_READ_I2C_BLOCK,
> I2C_FUNC_SMBUS_READ_WORD_DATA or I2C_FUNC_SMBUS_READ_BYTE_DATA.
>
> Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
I like this a lot.
Reviewed-by: Jonathan Cameron <jic23-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
> ---
> drivers/i2c/i2c-core.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++
> include/linux/i2c.h | 3 +++
> 2 files changed, 68 insertions(+)
>
> diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
> index c83e4d1..79ba6a8 100644
> --- a/drivers/i2c/i2c-core.c
> +++ b/drivers/i2c/i2c-core.c
> @@ -2942,6 +2942,71 @@ trace:
> }
> EXPORT_SYMBOL(i2c_smbus_xfer);
>
> +/**
> + * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
> + * @client: Handle to slave device
> + * @command: Byte interpreted by slave
> + * @length: Size of data block; SMBus allows at most 32 bytes
> + * @values: Byte array into which data will be read; big enough to hold
> + * the data returned by the slave. SMBus allows at most 32 bytes.
> + *
> + * This executes the SMBus "block read" protocol if supported by the adapter.
> + * If block read is not supported, it emulates it using either word or byte
> + * read protocols depending on availability.
> + *
> + * The addresses of the I2C slave device that are accessed with this function
> + * must be mapped to a linear region, so that a block read will have the same
> + * effect as a byte read. Before using this function you must double-check
> + * if the I2C slave does support exchanging a block transfer with a byte
> + * transfer.
> + */
> +s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
> + u8 command, u8 length, u8 *values)
> +{
> + u8 i;
> + int status;
> +
> + if (length > I2C_SMBUS_BLOCK_MAX)
> + length = I2C_SMBUS_BLOCK_MAX;
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
> + return i2c_smbus_read_i2c_block_data(client, command, length, values);
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA |
> + I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> + for (i = 0; (i + 2) <= length; i += 2) {
> + status = i2c_smbus_read_word_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status & 0xff;
> + values[i + 1] = status >> 8;
I was about to suggest we knew we were word aligned for both elements and hence could
use an endian conversion, but I guess we don't know that as values might not be word
aligned. Hence what you have is the best we can do!
> + }
> + if (i < length) {
> + status = i2c_smbus_read_byte_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status;
> + i++;
> + }
> + return i;
> + }
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> + for (i = 0; i < length; i++) {
> + status = i2c_smbus_read_byte_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status;
> + }
> + return i;
> + }
> +
> + dev_err(&client->adapter->dev, "Unsupported transactions\n");
> +
> + return -EOPNOTSUPP;
> +}
> +EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data_or_emulated);
> +
> #if IS_ENABLED(CONFIG_I2C_SLAVE)
> int i2c_slave_register(struct i2c_client *client, i2c_slave_cb_t slave_cb)
> {
> diff --git a/include/linux/i2c.h b/include/linux/i2c.h
> index e83a738..faf518d 100644
> --- a/include/linux/i2c.h
> +++ b/include/linux/i2c.h
> @@ -121,6 +121,9 @@ extern s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client,
> extern s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client,
> u8 command, u8 length,
> const u8 *values);
> +extern s32
> +i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
> + u8 command, u8 length, u8 *values);
> #endif /* I2C */
>
> /**
>
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
[not found] ` <1438697056-2946-2-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-08-08 15:20 ` Jonathan Cameron
@ 2015-08-09 7:31 ` Wolfram Sang
2015-08-12 14:01 ` Tirdea, Irina
1 sibling, 1 reply; 13+ messages in thread
From: Wolfram Sang @ 2015-08-09 7:31 UTC (permalink / raw)
To: Irina Tirdea
Cc: Jonathan Cameron, linux-iio-u79uwXL29TY76Z2rM5mHXA,
linux-i2c-u79uwXL29TY76Z2rM5mHXA,
linux-kernel-u79uwXL29TY76Z2rM5mHXA, Srinivas Pandruvada,
Peter Meerwald
[-- Attachment #1: Type: text/plain, Size: 3602 bytes --]
On Tue, Aug 04, 2015 at 05:04:09PM +0300, Irina Tirdea wrote:
> There are devices that need to handle block transactions
> regardless of the capabilities exported by the adapter.
> For performance reasons, they need to use i2c read blocks
> if available, otherwise emulate the block transaction with word
> or byte transactions.
>
> Add support for a helper function that would read a data block
> using the best transfer available: I2C_FUNC_SMBUS_READ_I2C_BLOCK,
> I2C_FUNC_SMBUS_READ_WORD_DATA or I2C_FUNC_SMBUS_READ_BYTE_DATA.
>
> Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
We are close, but I think there is one optimization left to do.
> +/**
> + * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
> + * @client: Handle to slave device
> + * @command: Byte interpreted by slave
> + * @length: Size of data block; SMBus allows at most 32 bytes
Please refer to I2C_SMBUS_BLOCK_MAX instead of 32. The new SMBus specs
increased this amount to 256. (Yes, we don't support that yet.)
> + * @values: Byte array into which data will be read; big enough to hold
> + * the data returned by the slave. SMBus allows at most 32 bytes.
> + *
> + * This executes the SMBus "block read" protocol if supported by the adapter.
> + * If block read is not supported, it emulates it using either word or byte
> + * read protocols depending on availability.
> + *
> + * The addresses of the I2C slave device that are accessed with this function
> + * must be mapped to a linear region, so that a block read will have the same
> + * effect as a byte read. Before using this function you must double-check
> + * if the I2C slave does support exchanging a block transfer with a byte
> + * transfer.
> + */
> +s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
> + u8 command, u8 length, u8 *values)
> +{
> + u8 i;
> + int status;
> +
> + if (length > I2C_SMBUS_BLOCK_MAX)
> + length = I2C_SMBUS_BLOCK_MAX;
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
> + return i2c_smbus_read_i2c_block_data(client, command, length, values);
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA |
> + I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> + for (i = 0; (i + 2) <= length; i += 2) {
> + status = i2c_smbus_read_word_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status & 0xff;
> + values[i + 1] = status >> 8;
> + }
> + if (i < length) {
> + status = i2c_smbus_read_byte_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status;
> + i++;
> + }
> + return i;
> + }
> +
> + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> + for (i = 0; i < length; i++) {
> + status = i2c_smbus_read_byte_data(client, command + i);
> + if (status < 0)
> + return status;
> + values[i] = status;
> + }
> + return i;
> + }
We have two very similar blocks for transferring READ_BYTE_DATA now.
What about this pseudo code:
if (check_func(I2C_BLOCK))
return i2c_smbus_read_i2c_block_data(...);
if (!check_func(I2C_READ_BYTE_DATA)
return -EOPNOTSUPP;
if (check_func(I2C_READ_WORD_DATA)
read_as_many_words_as_possible;
read_all_the_remaining_bytes;
> + dev_err(&client->adapter->dev, "Unsupported transactions\n");
Again, if you want to keep this one, it should be the client device
reporting the error.
Thanks,
Wolfram
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* RE: [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
2015-08-09 7:31 ` Wolfram Sang
@ 2015-08-12 14:01 ` Tirdea, Irina
[not found] ` <1F3AC3675D538145B1661F571FE1805F2F0B0B8C-pww93C2UFcwu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
0 siblings, 1 reply; 13+ messages in thread
From: Tirdea, Irina @ 2015-08-12 14:01 UTC (permalink / raw)
To: Wolfram Sang
Cc: Jonathan Cameron,
linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Pandruvada, Srinivas, Peter Meerwald
> -----Original Message-----
> From: Wolfram Sang [mailto:wsa-z923LK4zBo2bacvFa/9K2g@public.gmane.org]
> Sent: 09 August, 2015 10:32
> To: Tirdea, Irina
> Cc: Jonathan Cameron; linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org; Pandruvada, Srinivas;
> Peter Meerwald
> Subject: Re: [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
>
> On Tue, Aug 04, 2015 at 05:04:09PM +0300, Irina Tirdea wrote:
> > There are devices that need to handle block transactions
> > regardless of the capabilities exported by the adapter.
> > For performance reasons, they need to use i2c read blocks
> > if available, otherwise emulate the block transaction with word
> > or byte transactions.
> >
> > Add support for a helper function that would read a data block
> > using the best transfer available: I2C_FUNC_SMBUS_READ_I2C_BLOCK,
> > I2C_FUNC_SMBUS_READ_WORD_DATA or I2C_FUNC_SMBUS_READ_BYTE_DATA.
> >
> > Signed-off-by: Irina Tirdea <irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>
> We are close, but I think there is one optimization left to do.
>
> > +/**
> > + * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
> > + * @client: Handle to slave device
> > + * @command: Byte interpreted by slave
> > + * @length: Size of data block; SMBus allows at most 32 bytes
>
> Please refer to I2C_SMBUS_BLOCK_MAX instead of 32. The new SMBus specs
> increased this amount to 256. (Yes, we don't support that yet.)
>
Sure, I'll use I2C_SMBUS_BLOCK_MAX instead to be compatible with these changes.
> > + * @values: Byte array into which data will be read; big enough to hold
> > + * the data returned by the slave. SMBus allows at most 32 bytes.
> > + *
> > + * This executes the SMBus "block read" protocol if supported by the adapter.
> > + * If block read is not supported, it emulates it using either word or byte
> > + * read protocols depending on availability.
> > + *
> > + * The addresses of the I2C slave device that are accessed with this function
> > + * must be mapped to a linear region, so that a block read will have the same
> > + * effect as a byte read. Before using this function you must double-check
> > + * if the I2C slave does support exchanging a block transfer with a byte
> > + * transfer.
> > + */
> > +s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
> > + u8 command, u8 length, u8 *values)
> > +{
> > + u8 i;
> > + int status;
> > +
> > + if (length > I2C_SMBUS_BLOCK_MAX)
> > + length = I2C_SMBUS_BLOCK_MAX;
> > +
> > + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
> > + return i2c_smbus_read_i2c_block_data(client, command, length, values);
> > +
> > + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA |
> > + I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> > + for (i = 0; (i + 2) <= length; i += 2) {
> > + status = i2c_smbus_read_word_data(client, command + i);
> > + if (status < 0)
> > + return status;
> > + values[i] = status & 0xff;
> > + values[i + 1] = status >> 8;
> > + }
> > + if (i < length) {
> > + status = i2c_smbus_read_byte_data(client, command + i);
> > + if (status < 0)
> > + return status;
> > + values[i] = status;
> > + i++;
> > + }
> > + return i;
> > + }
> > +
> > + if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) {
> > + for (i = 0; i < length; i++) {
> > + status = i2c_smbus_read_byte_data(client, command + i);
> > + if (status < 0)
> > + return status;
> > + values[i] = status;
> > + }
> > + return i;
> > + }
>
> We have two very similar blocks for transferring READ_BYTE_DATA now.
> What about this pseudo code:
>
> if (check_func(I2C_BLOCK))
> return i2c_smbus_read_i2c_block_data(...);
>
> if (!check_func(I2C_READ_BYTE_DATA)
> return -EOPNOTSUPP;
>
> if (check_func(I2C_READ_WORD_DATA)
> read_as_many_words_as_possible;
>
> read_all_the_remaining_bytes;
>
This looks better, so I will change the code following the pseudo code above.
>
> > + dev_err(&client->adapter->dev, "Unsupported transactions\n");
>
> Again, if you want to keep this one, it should be the client device
> reporting the error.
>
Sorry, I misread your previous comment on the device reporting the error.
I thought you'd prefer the code that calls i2c_smbus_read_i2c_block_data_or_emulated
to print any error messages, but I was not sure. Anyway, I think I'll drop the error
message entirely and leave error handling to the calling code.
Thanks,
Irina
> Thanks,
>
> Wolfram
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation
[not found] ` <1F3AC3675D538145B1661F571FE1805F2F0B0B8C-pww93C2UFcwu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
@ 2015-08-12 14:49 ` Wolfram Sang
0 siblings, 0 replies; 13+ messages in thread
From: Wolfram Sang @ 2015-08-12 14:49 UTC (permalink / raw)
To: Tirdea, Irina
Cc: Jonathan Cameron,
linux-iio-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Pandruvada, Srinivas, Peter Meerwald
[-- Attachment #1: Type: text/plain, Size: 191 bytes --]
> to print any error messages, but I was not sure. Anyway, I think I'll drop the error
> message entirely and leave error handling to the calling code.
Even better :)
Thanks,
Wolfram
[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
end of thread, other threads:[~2015-08-12 14:49 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-04 14:04 [PATCH v4 0/8] Add support for best effort block read emulation Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 2/8] eeprom: at24: use i2c_smbus_read_i2c_block_data_or_emulated Irina Tirdea
[not found] ` <1438697056-2946-1-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-08-04 14:04 ` [PATCH v4 1/8] i2c: core: Add support for best effort block read emulation Irina Tirdea
[not found] ` <1438697056-2946-2-git-send-email-irina.tirdea-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2015-08-08 15:20 ` Jonathan Cameron
2015-08-09 7:31 ` Wolfram Sang
2015-08-12 14:01 ` Tirdea, Irina
[not found] ` <1F3AC3675D538145B1661F571FE1805F2F0B0B8C-pww93C2UFcwu0RiL9chJVbfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2015-08-12 14:49 ` Wolfram Sang
2015-08-04 14:04 ` [PATCH v4 3/8] iio: accel: bmc150: use available_scan_masks Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 4/8] iio: accel: bmc150: optimize i2c transfers in trigger handler Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 5/8] iio: gyro: bmg160: use available_scan_masks Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 6/8] iio: gyro: bmg160: optimize i2c transfers in trigger handler Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 7/8] iio: accel: kxcjk-1013: use available_scan_masks Irina Tirdea
2015-08-04 14:04 ` [PATCH v4 8/8] iio: accel: kxcjk-1013: optimize i2c transfers in trigger handler Irina Tirdea
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).