> On 29.08.19 10:37, Lorenzo Bianconi wrote: > >> On 27.08.19 22:08, Jonathan Cameron wrote: > >>> On Tue, 27 Aug 2019 10:26:35 +0200 > >>> Lorenzo Bianconi wrote: > >>> > >>>> Get rid of invalid sensitivity value for LSM9DS1 gyro sensor > >>>> > >>>> Fixes: 687a60feb9c6 ("iio: imu: st_lsm6dsx: add support for accel/gyro unit of lsm9ds1") > >>>> Signed-off-by: Lorenzo Bianconi > >>> The zero degree scale is certainly odd otherwise, so good to tidy > >>> this up. > >>> > >>> Applied to the togreg branch of iio.git. > >>> [...] > > struct st_lsm6dsx_fs_table_entry in st_lsm6dsx_settings will always have 4 > > elements for fs_avl array and since the array is defined as static the > > uninitialized elements are set to 0. > > > > Could you please share the ops you are getting? > > > > How this oops during startup can look like is appended below. I know > that exactly this change causes it. Can you test this too please? I did it but I have no issues > > Given the cleanup nature of this patch, I think it's best to revert it > in case of any doubt. > > thanks, > > martin > is it the full ops? It seems some parts are missing. Are you running some userspace aps reading in_anglvel_scale_available or reading/writing in in_anglvel_scale? Could you please double check if the following patch helps? (just compiled) Regards, Lorenzo --- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h | 1 + drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c | 28 +++++++++++++------- drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c | 3 ++- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h index 5e3cd96b0059..a6cd736fd273 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx.h @@ -100,6 +100,7 @@ struct st_lsm6dsx_fs { struct st_lsm6dsx_fs_table_entry { struct st_lsm6dsx_reg reg; struct st_lsm6dsx_fs fs_avl[ST_LSM6DSX_FS_LIST_SIZE]; + int len; }; /** diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c index 2d3495560136..37a2aa211757 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_core.c @@ -145,6 +145,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(732), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -154,6 +155,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[0] = { IIO_DEGREE_TO_RAD(245), 0x0 }, .fs_avl[1] = { IIO_DEGREE_TO_RAD(500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(2000), 0x3 }, + .len = 3, }, }, }, @@ -215,6 +217,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -225,6 +228,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .decimator = { @@ -327,6 +331,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -337,6 +342,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .decimator = { @@ -448,6 +454,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -458,6 +465,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .decimator = { @@ -563,6 +571,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -573,6 +582,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .batch = { @@ -693,6 +703,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -703,6 +714,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .batch = { @@ -800,6 +812,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_G_TO_M_S_2(122), 0x2 }, .fs_avl[2] = { IIO_G_TO_M_S_2(244), 0x3 }, .fs_avl[3] = { IIO_G_TO_M_S_2(488), 0x1 }, + .len = 4, }, [ST_LSM6DSX_ID_GYRO] = { .reg = { @@ -810,6 +823,7 @@ static const struct st_lsm6dsx_settings st_lsm6dsx_sensor_settings[] = { .fs_avl[1] = { IIO_DEGREE_TO_RAD(17500), 0x1 }, .fs_avl[2] = { IIO_DEGREE_TO_RAD(35000), 0x2 }, .fs_avl[3] = { IIO_DEGREE_TO_RAD(70000), 0x3 }, + .len = 4, }, }, .batch = { @@ -933,11 +947,12 @@ static int st_lsm6dsx_set_full_scale(struct st_lsm6dsx_sensor *sensor, int i, err; fs_table = &sensor->hw->settings->fs_table[sensor->id]; - for (i = 0; i < ST_LSM6DSX_FS_LIST_SIZE; i++) + for (i = 0; i < fs_table->len; i++) { if (fs_table->fs_avl[i].gain == gain) break; + } - if (i == ST_LSM6DSX_FS_LIST_SIZE) + if (i == fs_table->len) return -EINVAL; data = ST_LSM6DSX_SHIFT_VAL(fs_table->fs_avl[i].val, @@ -1196,18 +1211,13 @@ static ssize_t st_lsm6dsx_sysfs_scale_avail(struct device *dev, { struct st_lsm6dsx_sensor *sensor = iio_priv(dev_get_drvdata(dev)); const struct st_lsm6dsx_fs_table_entry *fs_table; - enum st_lsm6dsx_sensor_id id = sensor->id; struct st_lsm6dsx_hw *hw = sensor->hw; int i, len = 0; - fs_table = &hw->settings->fs_table[id]; - for (i = 0; i < ST_LSM6DSX_FS_LIST_SIZE; i++) { - if (!fs_table->fs_avl[i].gain) - break; - + fs_table = &hw->settings->fs_table[sensor->id]; + for (i = 0; i < fs_table->len; i++) len += scnprintf(buf + len, PAGE_SIZE - len, "0.%06u ", fs_table->fs_avl[i].gain); - } buf[len - 1] = '\n'; return len; diff --git a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c index 66fbcd94642d..dcf349278e8f 100644 --- a/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c +++ b/drivers/iio/imu/st_lsm6dsx/st_lsm6dsx_shub.c @@ -61,6 +61,7 @@ static const struct st_lsm6dsx_ext_dev_settings st_lsm6dsx_ext_dev_table[] = { .gain = 1500, .val = 0x0, }, /* 1500 uG/LSB */ + .len = 1, }, .temp_comp = { .addr = 0x60, @@ -555,7 +556,7 @@ static ssize_t st_lsm6dsx_shub_scale_avail(struct device *dev, int i, len = 0; settings = sensor->ext_info.settings; - for (i = 0; i < ST_LSM6DSX_FS_LIST_SIZE; i++) { + for (i = 0; i < settings->fs_table.len; i++) { u16 val = settings->fs_table.fs_avl[i].gain; if (val > 0) -- 2.21.0 > > > Feb 14 10:12:00 pureos kernel: [ 4.056014] Data abort info: > Feb 14 10:12:00 pureos kernel: [ 4.061361] bq25890-charger 0-006b: > Capacity for 4184000 is 99% > Feb 14 10:12:00 pureos kernel: [ 4.064751] ISV = 0, ISS = 0x00000004 > Feb 14 10:12:00 pureos kernel: [ 4.070942] CM = 0, WnR = 0 > Feb 14 10:12:00 pureos kernel: [ 4.076588] user pgtable: 4k pages, > 48-bit VAs, pgdp=00000000e4fa6000 > Feb 14 10:12:00 pureos kernel: [ 4.086256] [0000000000000018] > pgd=0000000000000000 > Feb 14 10:12:00 pureos kernel: [ 4.100224] Internal error: Oops: > 96000004 [#1] PREEMPT SMP > Feb 14 10:12:00 pureos kernel: [ 4.101985] Goodix-TS 2-005d: ID 5688, > version: 0100 > Feb 14 10:12:00 pureos kernel: [ 4.106038] Modules linked in: > crct10dif_ce(+) st_magn_i2c(+) st_lsm6dsx_i2c(+) st_magn st_lsm6dsx > snd_soc_sgtl5000(+) st_sensors_i2c st_sensors tcpci > industrialio_triggered_buffer vcnl4000 kfifo_buf snd_soc_simple_card > snd_soc_fsl_sai tcpm ghash_ce bq25890_charger snd_soc_gtm601 > snd_soc_simple_card_utils imx_pcm_dma goodix(+) roles snd_soc_core typec > sha2_ce snd_pcm_dmaengine snd_pcm imx_sdma imx2_wdt sha1_ce snvs_pwrkey > gpio_vibra qoriq_thermal virt_dma snd_timer watchdog snd soundcore > usb_f_acm u_serial usb_f_rndis g_multi usb_f_mass_storage u_ether > libcomposite ip_tables x_tables ipv6 nf_defrag_ipv6 xhci_plat_hcd > xhci_hcd usbcore dwc3 ulpi udc_core usb_common phy_fsl_imx8mq_usb > Feb 14 10:12:00 pureos kernel: [ 4.113252] Goodix-TS 2-005d: Direct > firmware load for goodix_5688_cfg.bin failed with error -2 > Feb 14 10:12:00 pureos kernel: [ 4.174094] CPU: 2 PID: 341 Comm: > systemd-udevd Tainted: G W 5.3.0-rc2-gc652c7f46913 #141 > Feb 14 10:12:00 pureos kernel: [ 4.174096] Hardware name: Purism > Librem 5 devkit (DT) > Feb 14 10:12:00 pureos kernel: [ 4.174100] pstate: 80000005 (Nzcv > daif -PAN -UAO) > Feb 14 10:12:00 pureos kernel: [ 4.174113] pc : > st_lsm6dsx_i2c_probe+0x18/0x80 [st_lsm6dsx_i2c] > Feb 14 10:12:00 pureos kernel: [ 4.174124] lr : > i2c_device_probe+0x1f0/0x2b8 > Feb 14 10:12:00 pureos kernel: [ 4.174126] sp : ffff8000a4837970 > Feb 14 10:12:00 pureos kernel: [ 4.174128] x29: ffff8000a4837970 x28: > 0000000000000000 > Feb 14 10:12:00 pureos kernel: [ 4.174132] x27: ffff000010b70000 x26: > ffff8000a4837d68 > Feb 14 10:12:00 pureos kernel: [ 4.174135] x25: ffff000010860000 x24: > ffff000008a94038 > Feb 14 10:12:00 pureos kernel: [ 4.174139] x23: ffff000008a94038 x22: > ffff000008a94000 > Feb 14 10:12:00 pureos kernel: [ 4.174142] x21: ffff8000a55a0400 x20: > ffff000008a92000 > Feb 14 10:12:00 pureos kernel: [ 4.174146] x19: ffff8000a55a0400 x18: > ffffffffffffffff > Feb 14 10:12:00 pureos kernel: [ 4.174149] x17: 0000000000000000 x16: > 0000000000000000 > Feb 14 10:12:00 pureos kernel: [ 4.174152] x15: 0000000000040000 x14: > 00000000fffffff0 > Feb 14 10:12:00 pureos kernel: [ 4.174156] x13: 0000000000000001 x12: > 0000000000000000 > Feb 14 10:12:00 pureos kernel: [ 4.174159] x11: 0000000000000000 x10: > 0101010101010101 > Feb 14 10:12:00 pureos kernel: [ 4.174162] x9 : fffffffffffffffc x8 : > 0000000000000008 > Feb 14 10:12:00 pureos kernel: [ 4.174166] x7 : 0000000000000004 x6 : > 1e0e1a00f2ade4ef > Feb 14 10:12:00 pureos kernel: [ 4.174169] x5 : 6f642d72001a0e1e x4 : > 8080808000000000 > Feb 14 10:12:00 pureos kernel: [ 4.174173] x3 : 0000000000000000 x2 : > ffff000008a93000 > Feb 14 10:12:00 pureos kernel: [ 4.193031] driver: 'Goodix-TS': > driver_bound: bound to device '2-005d' > Feb 14 10:12:00 pureos kernel: [ 4.193105] x1 : 0000000000000000 x0 : > ffff8000a55a0400 > Feb 14 10:12:00 pureos kernel: [ 4.199343] bus: 'i2c': really_probe: > bound device 2-005d to driver Goodix-TS > Feb 14 10:12:00 pureos kernel: [ 4.203445] Call trace: > Feb 14 10:12:00 pureos kernel: [ 4.203456] > st_lsm6dsx_i2c_probe+0x18/0x80 [st_lsm6dsx_i2c] > Feb 14 10:12:00 pureos kernel: [ 4.203462] i2c_device_probe+0x1f0/0x2b8 > Feb 14 10:12:00 pureos kernel: [ 4.203468] really_probe+0x168/0x368 > Feb 14 10:12:00 pureos kernel: [ 4.203471] > driver_probe_device.part.2+0x10c/0x128 > Feb 14 10:12:00 pureos kernel: [ 4.203475] > device_driver_attach+0x74/0xa0 > Feb 14 10:12:00 pureos kernel: [ 4.203478] __driver_attach+0x84/0x130 > Feb 14 10:12:00 pureos kernel: [ 4.203481] bus_for_each_dev+0x68/0xc8 > Feb 14 10:12:00 pureos kernel: [ 4.203484] driver_attach+0x20/0x28 > Feb 14 10:12:00 pureos kernel: [ 4.203487] bus_add_driver+0xd4/0x1f8 > Feb 14 10:12:00 pureos kernel: [ 4.203490] driver_register+0x60/0x110 > Feb 14 10:12:00 pureos kernel: [ 4.203497] i2c_register_driver+0x44/0x98 > Feb 14 10:12:00 pureos kernel: [ 4.216908] devices_kset: Moving sound > to end of list > Feb 14 10:12:00 pureos kernel: [ 4.217738] > st_lsm6dsx_driver_init+0x1c/0x1000 [st_lsm6dsx_i2c] > Feb 14 10:12:00 pureos kernel: [ 4.217744] do_one_initcall+0x58/0x1a8 > Feb 14 10:12:00 pureos kernel: [ 4.217749] do_init_module+0x54/0x1d4 > Feb 14 10:12:00 pureos kernel: [ 4.217752] load_module+0x1998/0x1c40 > Feb 14 10:12:00 pureos kernel: [ 4.217755] > __se_sys_finit_module+0xc0/0xd8 > Feb 14 10:12:00 pureos kernel: [ 4.217761] > __arm64_sys_finit_module+0x14/0x20 > Feb 14 10:12:00 pureos kernel: [ 4.223515] PM: Moving platform:sound > to end of list > Feb 14 10:12:00 pureos kernel: [ 4.228823] > el0_svc_common.constprop.0+0xb0/0x168 > Feb 14 10:12:00 pureos kernel: [ 4.228827] el0_svc_handler+0x18/0x20 > Feb 14 10:12:00 pureos kernel: [ 4.228830] el0_svc+0x8/0xc > Feb 14 10:12:00 pureos kernel: [ 4.228838] Code: d2800003 910003fd > a90153f3 aa0003f3 (f9400c34) > Feb 14 10:12:00 pureos kernel: [ 4.228843] ---[ end trace > 4933f7b108d54662 ]--- >