mirror of
https://github.com/torvalds/linux.git
synced 2024-11-17 17:41:44 +00:00
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:
commit
09f6109ff4
@ -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
|
||||||
|
@ -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, \
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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. */
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user