Re: [PATCH v5 0/4] iio: Add support for rotation from north

From: Srinivas Pandruvada
Date: Tue Jul 15 2014 - 17:51:24 EST


Since you have only one attribute, it is working for you.
There is a dereference error in *channels.

Check the attached diff, which will fix this.


On 07/09/2014 03:12 PM, Reyad Attiyat wrote:
Hey Srinivas,

I did look into the panic you sent. I wasn't sure exactly what caused
the NULL pointer.
I tested it with out applying the last rotation from north patch, so
no hid usages are found, my device only has rotation_from_north, and
hid_parse_report() would return -EINVAL.
I added another check to make sure a iio channel were set up, and
return -EINVAL if not, but couldn't think of anything else.

Could you test this version with dynamic debugging and see if it is
finding any hid usage attributes.
Any ideas what could cause this? I think I'm handling errors properly
by returning what parse_report returns (-EINVAL or -ENOMEM) in probe

Reyad Attiyat

On Wed, Jul 9, 2014 at 2:45 PM, Srinivas Pandruvada
<srinivas.pandruvada@xxxxxxxxxxxxxxx> wrote:
On 07/09/2014 12:30 PM, Reyad Attiyat wrote:
This series of patches modifies magn-3d driver to handle the rotation
from north usage. This is done by scanning the report and then building
the iio arrays (vals and channels) dynamically.

Changes from V4
I use the address field of struct iio_chan_spec to hold the array index
of the usage attribute. The scan_index field is generated when creating
an iio channel.

Reyad Attiyat (4):
iio: Documentation: Add documentation for rotation from north sensor
usage attributes
iio: types: Added support for rotation from north usage attributes
iio: hid-sensor-magn-3d: Scan for usage attributes before setting up
iio channels
iio: hid-sensor-magn-3d: Add support for rotation from north

Documentation/ABI/testing/sysfs-bus-iio | 82 +++++++++++
drivers/iio/industrialio-core.c | 4 +
drivers/iio/magnetometer/hid-sensor-magn-3d.c | 199
include/linux/iio/types.h | 4 +
4 files changed, 245 insertions(+), 44 deletions(-)

Did you get chance to look at the cause of panic?


diff --git a/drivers/iio/magnetometer/hid-sensor-magn-3d.c b/drivers/iio/magnetometer/hid-sensor-magn-3d.c
index 070d20e..63f23af 100644
--- a/drivers/iio/magnetometer/hid-sensor-magn-3d.c
+++ b/drivers/iio/magnetometer/hid-sensor-magn-3d.c
@@ -271,6 +271,7 @@ static int magn_3d_parse_report(struct platform_device *pdev,
int ret = 0;
int i;
int attr_count = 0;
+ struct iio_chan_spec *_channels;

/* Scan for each usage attribute supported */
for (i = 0; i < MAGN_3D_CHANNEL_MAX; i++) {
@@ -300,10 +301,10 @@ static int magn_3d_parse_report(struct platform_device *pdev,
return -EINVAL;

/* Setup IIO channel array */
- *channels = devm_kcalloc(&pdev->dev, attr_count,
+ _channels = devm_kcalloc(&pdev->dev, attr_count,
sizeof(struct iio_chan_spec),
- if (!*channels) {
+ if (!_channels) {
dev_err(&pdev->dev, "failed to allocate space for iio channels\n");
return -ENOMEM;
@@ -322,14 +323,16 @@ static int magn_3d_parse_report(struct platform_device *pdev,
if (st->magn[i].index >= 0) {
/* Setup IIO channel struct */
- *channels[*chan_count] = magn_3d_channels[i];
+ _channels[*chan_count] = magn_3d_channels[i];

st->magn_val_addr[i] = &(st->iio_val[*chan_count]);
- magn_3d_adjust_channel_bit_mask(*channels, *chan_count, st->magn[i].size);
+ magn_3d_adjust_channel_bit_mask(_channels, *chan_count, st->magn[i].size);

+ *channels = _channels;
st->scale_precision = hid_sensor_format_scale(