First set of IIO fixes in the 5.3 cycle.

* cros_ec_accel_legacy
   - Fix a false double entry for channel scale as both per channel
     and shared.
 * gyro_adc
   - Fix uninitialized return code that got detected by GCC 9.0 having
     be previously missed.
 * ingenic_adc
   - Set the clock divider on probe to avoid an issue seen with false
     button press detections on JZ4725B SoCs.
 * max9611
   - Backwards parameters in GENMASK.
 * mpu6050
   - Enforce the fact only certain scan modes are actually possible.
 
 One counter fix also picked up for William,
 
 * generic-counter.rst
   - Fix some references.
 -----BEGIN PGP SIGNATURE-----
 
 iQJFBAABCAAvFiEEbilms4eEBlKRJoGxVIU0mcT0FogFAl09YggRHGppYzIzQGtl
 cm5lbC5vcmcACgkQVIU0mcT0Fohy7w/9FONFhav8pCKtDLi3cq94tJwG0TbZmIWU
 gR9wRLLhYUC21qfjlrhb+RE3GHslxYXxgsCRlFGOC12Q/UjAZ+HZPqat4nIAuIAp
 AXzHUc97aksiJE5wTf+d6IxkAAWV8DzcuBsIJw1/sp5P+Y2PB9J8DIemyP7J3LJz
 njyRfSZBVV42zT1h80oPnNQ8w5LB38B2QiVIHp1pDxiV7+EuFniLlR51ziOuWRcv
 Ax41fdLO/C3+Ls0pPacCLOODPrQf6BacOC9TzVK9gq9uPpMJDNGeEGLokPexEmH/
 qT12UInLMd7QQr6ZRJH4ST5VLHDAgplePFR4tULa2N56kWjL+r3fP1GsOSrA6K8w
 jrtDQZnWBoPu3G77MhDX2nCmZzDbn8svKJgXcGOaaYdX/aVAo7eydiBBsDJE1ZgD
 F6RBkIcj2pZG6tQi0nq859rS7if+TL7oKnqR2rBkkR2UjhTroaDslR61L8jKwkto
 c+lwaNTS6eS8zH1DU1uW1I97iTh6DS9xhEAA8pciG/Ezm9ZRbvU3onydO1ORF4se
 yAwfDx1tJ2ZbojR2amTWrzPIqNm4gmO1QnsR1DYUeCcDNNOYpnOxQgyL/ZqsyWUi
 AjUlvlZ05MQFrsdFe/BOM8tmo6AhG6whvNsDhEqmUpg23TbJF1MxmAXGwbdpYrTv
 Ud6HuUPuEaQ=
 =WQ8k
 -----END PGP SIGNATURE-----

Merge tag 'iio-fixes-for-5.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus

Jonathan writes:

First set of IIO fixes in the 5.3 cycle.

* cros_ec_accel_legacy
  - Fix a false double entry for channel scale as both per channel
    and shared.
* gyro_adc
  - Fix uninitialized return code that got detected by GCC 9.0 having
    be previously missed.
* ingenic_adc
  - Set the clock divider on probe to avoid an issue seen with false
    button press detections on JZ4725B SoCs.
* max9611
  - Backwards parameters in GENMASK.
* mpu6050
  - Enforce the fact only certain scan modes are actually possible.

One counter fix also picked up for William,

* generic-counter.rst
  - Fix some references.

* tag 'iio-fixes-for-5.3a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio:
  iio: adc: gyroadc: fix uninitialized return code
  docs: generic-counter.rst: fix broken references for ABI file
  iio: imu: mpu6050: add missing available scan masks
  iio: cros_ec_accel_legacy: Fix incorrect channel setting
  IIO: Ingenic JZ47xx: Set clock divider on probe
  iio: adc: max9611: Fix misuse of GENMASK macro
This commit is contained in:
Greg Kroah-Hartman 2019-07-28 11:07:26 +02:00
commit 09f6109ff4
6 changed files with 102 additions and 6 deletions

View File

@ -233,7 +233,7 @@ Userspace Interface
Several sysfs attributes are generated by the Generic Counter interface, Several sysfs attributes are generated by the Generic Counter interface,
and reside under the /sys/bus/counter/devices/counterX directory, where and reside under the /sys/bus/counter/devices/counterX directory, where
counterX refers to the respective counter device. Please see counterX refers to the respective counter device. Please see
Documentation/ABI/testing/sys-bus-counter-generic-sysfs for detailed Documentation/ABI/testing/sysfs-bus-counter for detailed
information on each Generic Counter interface sysfs attribute. information on each Generic Counter interface sysfs attribute.
Through these sysfs attributes, programs and scripts may interact with Through these sysfs attributes, programs and scripts may interact with
@ -325,7 +325,7 @@ sysfs attributes, where Y is the unique ID of the respective Count:
For a more detailed breakdown of the available Generic Counter interface For a more detailed breakdown of the available Generic Counter interface
sysfs attributes, please refer to the sysfs attributes, please refer to the
Documentation/ABI/testing/sys-bus-counter file. Documentation/ABI/testing/sysfs-bus-counter file.
The Signals and Counts associated with the Counter device are registered The Signals and Counts associated with the Counter device are registered
to the system as well by the counter_register function. The to the system as well by the counter_register function. The

View File

@ -319,7 +319,6 @@ static const struct iio_chan_spec_ext_info cros_ec_accel_legacy_ext_info[] = {
.modified = 1, \ .modified = 1, \
.info_mask_separate = \ .info_mask_separate = \
BIT(IIO_CHAN_INFO_RAW) | \ BIT(IIO_CHAN_INFO_RAW) | \
BIT(IIO_CHAN_INFO_SCALE) | \
BIT(IIO_CHAN_INFO_CALIBBIAS), \ BIT(IIO_CHAN_INFO_CALIBBIAS), \
.info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \ .info_mask_shared_by_all = BIT(IIO_CHAN_INFO_SCALE), \
.ext_info = cros_ec_accel_legacy_ext_info, \ .ext_info = cros_ec_accel_legacy_ext_info, \

View File

@ -11,6 +11,7 @@
#include <linux/iio/iio.h> #include <linux/iio/iio.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/iopoll.h> #include <linux/iopoll.h>
#include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
@ -22,8 +23,11 @@
#define JZ_ADC_REG_ADTCH 0x18 #define JZ_ADC_REG_ADTCH 0x18
#define JZ_ADC_REG_ADBDAT 0x1c #define JZ_ADC_REG_ADBDAT 0x1c
#define JZ_ADC_REG_ADSDAT 0x20 #define JZ_ADC_REG_ADSDAT 0x20
#define JZ_ADC_REG_ADCLK 0x28
#define JZ_ADC_REG_CFG_BAT_MD BIT(4) #define JZ_ADC_REG_CFG_BAT_MD BIT(4)
#define JZ_ADC_REG_ADCLK_CLKDIV_LSB 0
#define JZ_ADC_REG_ADCLK_CLKDIV10US_LSB 16
#define JZ_ADC_AUX_VREF 3300 #define JZ_ADC_AUX_VREF 3300
#define JZ_ADC_AUX_VREF_BITS 12 #define JZ_ADC_AUX_VREF_BITS 12
@ -34,6 +38,8 @@
#define JZ4740_ADC_BATTERY_HIGH_VREF (7500 * 0.986) #define JZ4740_ADC_BATTERY_HIGH_VREF (7500 * 0.986)
#define JZ4740_ADC_BATTERY_HIGH_VREF_BITS 12 #define JZ4740_ADC_BATTERY_HIGH_VREF_BITS 12
struct ingenic_adc;
struct ingenic_adc_soc_data { struct ingenic_adc_soc_data {
unsigned int battery_high_vref; unsigned int battery_high_vref;
unsigned int battery_high_vref_bits; unsigned int battery_high_vref_bits;
@ -41,6 +47,7 @@ struct ingenic_adc_soc_data {
size_t battery_raw_avail_size; size_t battery_raw_avail_size;
const int *battery_scale_avail; const int *battery_scale_avail;
size_t battery_scale_avail_size; size_t battery_scale_avail_size;
int (*init_clk_div)(struct device *dev, struct ingenic_adc *adc);
}; };
struct ingenic_adc { struct ingenic_adc {
@ -151,6 +158,42 @@ static const int jz4740_adc_battery_scale_avail[] = {
JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS, JZ_ADC_BATTERY_LOW_VREF, JZ_ADC_BATTERY_LOW_VREF_BITS,
}; };
static int jz4725b_adc_init_clk_div(struct device *dev, struct ingenic_adc *adc)
{
struct clk *parent_clk;
unsigned long parent_rate, rate;
unsigned int div_main, div_10us;
parent_clk = clk_get_parent(adc->clk);
if (!parent_clk) {
dev_err(dev, "ADC clock has no parent\n");
return -ENODEV;
}
parent_rate = clk_get_rate(parent_clk);
/*
* The JZ4725B ADC works at 500 kHz to 8 MHz.
* We pick the highest rate possible.
* In practice we typically get 6 MHz, half of the 12 MHz EXT clock.
*/
div_main = DIV_ROUND_UP(parent_rate, 8000000);
div_main = clamp(div_main, 1u, 64u);
rate = parent_rate / div_main;
if (rate < 500000 || rate > 8000000) {
dev_err(dev, "No valid divider for ADC main clock\n");
return -EINVAL;
}
/* We also need a divider that produces a 10us clock. */
div_10us = DIV_ROUND_UP(rate, 100000);
writel(((div_10us - 1) << JZ_ADC_REG_ADCLK_CLKDIV10US_LSB) |
(div_main - 1) << JZ_ADC_REG_ADCLK_CLKDIV_LSB,
adc->base + JZ_ADC_REG_ADCLK);
return 0;
}
static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = { static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = {
.battery_high_vref = JZ4725B_ADC_BATTERY_HIGH_VREF, .battery_high_vref = JZ4725B_ADC_BATTERY_HIGH_VREF,
.battery_high_vref_bits = JZ4725B_ADC_BATTERY_HIGH_VREF_BITS, .battery_high_vref_bits = JZ4725B_ADC_BATTERY_HIGH_VREF_BITS,
@ -158,6 +201,7 @@ static const struct ingenic_adc_soc_data jz4725b_adc_soc_data = {
.battery_raw_avail_size = ARRAY_SIZE(jz4725b_adc_battery_raw_avail), .battery_raw_avail_size = ARRAY_SIZE(jz4725b_adc_battery_raw_avail),
.battery_scale_avail = jz4725b_adc_battery_scale_avail, .battery_scale_avail = jz4725b_adc_battery_scale_avail,
.battery_scale_avail_size = ARRAY_SIZE(jz4725b_adc_battery_scale_avail), .battery_scale_avail_size = ARRAY_SIZE(jz4725b_adc_battery_scale_avail),
.init_clk_div = jz4725b_adc_init_clk_div,
}; };
static const struct ingenic_adc_soc_data jz4740_adc_soc_data = { static const struct ingenic_adc_soc_data jz4740_adc_soc_data = {
@ -167,6 +211,7 @@ static const struct ingenic_adc_soc_data jz4740_adc_soc_data = {
.battery_raw_avail_size = ARRAY_SIZE(jz4740_adc_battery_raw_avail), .battery_raw_avail_size = ARRAY_SIZE(jz4740_adc_battery_raw_avail),
.battery_scale_avail = jz4740_adc_battery_scale_avail, .battery_scale_avail = jz4740_adc_battery_scale_avail,
.battery_scale_avail_size = ARRAY_SIZE(jz4740_adc_battery_scale_avail), .battery_scale_avail_size = ARRAY_SIZE(jz4740_adc_battery_scale_avail),
.init_clk_div = NULL, /* no ADCLK register on JZ4740 */
}; };
static int ingenic_adc_read_avail(struct iio_dev *iio_dev, static int ingenic_adc_read_avail(struct iio_dev *iio_dev,
@ -317,6 +362,15 @@ static int ingenic_adc_probe(struct platform_device *pdev)
return ret; return ret;
} }
/* Set clock dividers. */
if (soc_data->init_clk_div) {
ret = soc_data->init_clk_div(dev, adc);
if (ret) {
clk_disable_unprepare(adc->clk);
return ret;
}
}
/* Put hardware in a known passive state. */ /* Put hardware in a known passive state. */
writeb(0x00, adc->base + JZ_ADC_REG_ENABLE); writeb(0x00, adc->base + JZ_ADC_REG_ENABLE);
writeb(0xff, adc->base + JZ_ADC_REG_CTRL); writeb(0xff, adc->base + JZ_ADC_REG_CTRL);

View File

@ -83,7 +83,7 @@
#define MAX9611_TEMP_MAX_POS 0x7f80 #define MAX9611_TEMP_MAX_POS 0x7f80
#define MAX9611_TEMP_MAX_NEG 0xff80 #define MAX9611_TEMP_MAX_NEG 0xff80
#define MAX9611_TEMP_MIN_NEG 0xd980 #define MAX9611_TEMP_MIN_NEG 0xd980
#define MAX9611_TEMP_MASK GENMASK(7, 15) #define MAX9611_TEMP_MASK GENMASK(15, 7)
#define MAX9611_TEMP_SHIFT 0x07 #define MAX9611_TEMP_SHIFT 0x07
#define MAX9611_TEMP_RAW(_r) ((_r) >> MAX9611_TEMP_SHIFT) #define MAX9611_TEMP_RAW(_r) ((_r) >> MAX9611_TEMP_SHIFT)
#define MAX9611_TEMP_SCALE_NUM 1000000 #define MAX9611_TEMP_SCALE_NUM 1000000

View File

@ -382,7 +382,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev)
dev_err(dev, dev_err(dev,
"Only %i channels supported with %pOFn, but reg = <%i>.\n", "Only %i channels supported with %pOFn, but reg = <%i>.\n",
num_channels, child, reg); num_channels, child, reg);
return ret; return -EINVAL;
} }
} }
@ -391,7 +391,7 @@ static int rcar_gyroadc_parse_subdevs(struct iio_dev *indio_dev)
dev_err(dev, dev_err(dev,
"Channel %i uses different ADC mode than the rest.\n", "Channel %i uses different ADC mode than the rest.\n",
reg); reg);
return ret; return -EINVAL;
} }
/* Channel is valid, grab the regulator. */ /* Channel is valid, grab the regulator. */

View File

@ -845,6 +845,25 @@ static const struct iio_chan_spec inv_mpu_channels[] = {
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z), INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_MPU6050_SCAN_ACCL_Z),
}; };
static const unsigned long inv_mpu_scan_masks[] = {
/* 3-axis accel */
BIT(INV_MPU6050_SCAN_ACCL_X)
| BIT(INV_MPU6050_SCAN_ACCL_Y)
| BIT(INV_MPU6050_SCAN_ACCL_Z),
/* 3-axis gyro */
BIT(INV_MPU6050_SCAN_GYRO_X)
| BIT(INV_MPU6050_SCAN_GYRO_Y)
| BIT(INV_MPU6050_SCAN_GYRO_Z),
/* 6-axis accel + gyro */
BIT(INV_MPU6050_SCAN_ACCL_X)
| BIT(INV_MPU6050_SCAN_ACCL_Y)
| BIT(INV_MPU6050_SCAN_ACCL_Z)
| BIT(INV_MPU6050_SCAN_GYRO_X)
| BIT(INV_MPU6050_SCAN_GYRO_Y)
| BIT(INV_MPU6050_SCAN_GYRO_Z),
0,
};
static const struct iio_chan_spec inv_icm20602_channels[] = { static const struct iio_chan_spec inv_icm20602_channels[] = {
IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP), IIO_CHAN_SOFT_TIMESTAMP(INV_ICM20602_SCAN_TIMESTAMP),
{ {
@ -871,6 +890,28 @@ static const struct iio_chan_spec inv_icm20602_channels[] = {
INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z), INV_MPU6050_CHAN(IIO_ACCEL, IIO_MOD_Z, INV_ICM20602_SCAN_ACCL_Z),
}; };
static const unsigned long inv_icm20602_scan_masks[] = {
/* 3-axis accel + temp (mandatory) */
BIT(INV_ICM20602_SCAN_ACCL_X)
| BIT(INV_ICM20602_SCAN_ACCL_Y)
| BIT(INV_ICM20602_SCAN_ACCL_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
/* 3-axis gyro + temp (mandatory) */
BIT(INV_ICM20602_SCAN_GYRO_X)
| BIT(INV_ICM20602_SCAN_GYRO_Y)
| BIT(INV_ICM20602_SCAN_GYRO_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
/* 6-axis accel + gyro + temp (mandatory) */
BIT(INV_ICM20602_SCAN_ACCL_X)
| BIT(INV_ICM20602_SCAN_ACCL_Y)
| BIT(INV_ICM20602_SCAN_ACCL_Z)
| BIT(INV_ICM20602_SCAN_GYRO_X)
| BIT(INV_ICM20602_SCAN_GYRO_Y)
| BIT(INV_ICM20602_SCAN_GYRO_Z)
| BIT(INV_ICM20602_SCAN_TEMP),
0,
};
/* /*
* The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and * The user can choose any frequency between INV_MPU6050_MIN_FIFO_RATE and
* INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the * INV_MPU6050_MAX_FIFO_RATE, but only these frequencies are matched by the
@ -1130,9 +1171,11 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name,
if (chip_type == INV_ICM20602) { if (chip_type == INV_ICM20602) {
indio_dev->channels = inv_icm20602_channels; indio_dev->channels = inv_icm20602_channels;
indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels); indio_dev->num_channels = ARRAY_SIZE(inv_icm20602_channels);
indio_dev->available_scan_masks = inv_icm20602_scan_masks;
} else { } else {
indio_dev->channels = inv_mpu_channels; indio_dev->channels = inv_mpu_channels;
indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels); indio_dev->num_channels = ARRAY_SIZE(inv_mpu_channels);
indio_dev->available_scan_masks = inv_mpu_scan_masks;
} }
indio_dev->info = &mpu_info; indio_dev->info = &mpu_info;