Skip to content

Commit 2dde282

Browse files
committed
Merge tag 'iio-fixes-for-5.10a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio into staging-linus
Jonathan writes: First set of IIO and counter fixes for the 5.10 cycle. IIO cros_ec - Provide defauts for max and min frequency when older machines fail to return them correctly. ingenic-adc - Fix wrong vref value for JZ4770 SoC - Fix AUX / VBAT readings when touchscreen in use by pausing touchscreen readings during a read of these channels. kxcjk1013 - Fix an issue with KIOX010A ACPI id using devices which need to run a ACPI device specific method to avoid leaving the keyboard disabled. Includes a minor precursor patch to make this fix easier to do. mt6577-auxadc - Fix an issue with dev_comp not being set resulting in a null ptr deref. st_lsm6dsx - Set a 10ms min shub slave timeout to handle fast snesors where more time is needed to set up the config than the cycles allowed. stm32-adc - Fix an issue due to a clash between an ADC configured to use IRQs and a second configured to use DMA cause by some incorrect register masking. vcnl4035 - Kconfig missing dependency Counter ti-eqep - wrong value for max_register as one beyond the end instead of the end. * tag 'iio-fixes-for-5.10a' of https://git.kernel.org/pub/scm/linux/kernel/git/jic23/iio: iio: accel: kxcjk1013: Add support for KIOX010A ACPI DSM for setting tablet-mode iio: accel: kxcjk1013: Replace is_smo8500_device with an acpi_type enum iio: light: fix kconfig dependency bug for VCNL4035 iio/adc: ingenic: Fix AUX/VBAT readings when touchscreen is used iio/adc: ingenic: Fix battery VREF for JZ4770 SoC iio: imu: st_lsm6dsx: set 10ms as min shub slave timeout counter/ti-eqep: Fix regmap max_register iio: adc: stm32-adc: fix a regression when using dma and irq iio: adc: mediatek: fix unset field iio: cros_ec: Use default frequencies when EC returns invalid information
2 parents 18db36a + e5b1032 commit 2dde282

9 files changed

Lines changed: 160 additions & 49 deletions

File tree

drivers/counter/ti-eqep.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -368,15 +368,15 @@ static const struct regmap_config ti_eqep_regmap32_config = {
368368
.reg_bits = 32,
369369
.val_bits = 32,
370370
.reg_stride = 4,
371-
.max_register = 0x24,
371+
.max_register = QUPRD,
372372
};
373373

374374
static const struct regmap_config ti_eqep_regmap16_config = {
375375
.name = "16-bit",
376376
.reg_bits = 16,
377377
.val_bits = 16,
378378
.reg_stride = 2,
379-
.max_register = 0x1e,
379+
.max_register = QCPRDLAT,
380380
};
381381

382382
static int ti_eqep_probe(struct platform_device *pdev)

drivers/iio/accel/kxcjk-1013.c

Lines changed: 46 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,12 @@ enum kx_chipset {
126126
KX_MAX_CHIPS /* this must be last */
127127
};
128128

129+
enum kx_acpi_type {
130+
ACPI_GENERIC,
131+
ACPI_SMO8500,
132+
ACPI_KIOX010A,
133+
};
134+
129135
struct kxcjk1013_data {
130136
struct i2c_client *client;
131137
struct iio_trigger *dready_trig;
@@ -143,7 +149,7 @@ struct kxcjk1013_data {
143149
bool motion_trigger_on;
144150
int64_t timestamp;
145151
enum kx_chipset chipset;
146-
bool is_smo8500_device;
152+
enum kx_acpi_type acpi_type;
147153
};
148154

149155
enum kxcjk1013_axis {
@@ -270,6 +276,32 @@ static const struct {
270276
{19163, 1, 0},
271277
{38326, 0, 1} };
272278

279+
#ifdef CONFIG_ACPI
280+
enum kiox010a_fn_index {
281+
KIOX010A_SET_LAPTOP_MODE = 1,
282+
KIOX010A_SET_TABLET_MODE = 2,
283+
};
284+
285+
static int kiox010a_dsm(struct device *dev, int fn_index)
286+
{
287+
acpi_handle handle = ACPI_HANDLE(dev);
288+
guid_t kiox010a_dsm_guid;
289+
union acpi_object *obj;
290+
291+
if (!handle)
292+
return -ENODEV;
293+
294+
guid_parse("1f339696-d475-4e26-8cad-2e9f8e6d7a91", &kiox010a_dsm_guid);
295+
296+
obj = acpi_evaluate_dsm(handle, &kiox010a_dsm_guid, 1, fn_index, NULL);
297+
if (!obj)
298+
return -EIO;
299+
300+
ACPI_FREE(obj);
301+
return 0;
302+
}
303+
#endif
304+
273305
static int kxcjk1013_set_mode(struct kxcjk1013_data *data,
274306
enum kxcjk1013_mode mode)
275307
{
@@ -347,6 +379,13 @@ static int kxcjk1013_chip_init(struct kxcjk1013_data *data)
347379
{
348380
int ret;
349381

382+
#ifdef CONFIG_ACPI
383+
if (data->acpi_type == ACPI_KIOX010A) {
384+
/* Make sure the kbd and touchpad on 2-in-1s using 2 KXCJ91008-s work */
385+
kiox010a_dsm(&data->client->dev, KIOX010A_SET_LAPTOP_MODE);
386+
}
387+
#endif
388+
350389
ret = i2c_smbus_read_byte_data(data->client, KXCJK1013_REG_WHO_AM_I);
351390
if (ret < 0) {
352391
dev_err(&data->client->dev, "Error reading who_am_i\n");
@@ -1247,7 +1286,7 @@ static irqreturn_t kxcjk1013_data_rdy_trig_poll(int irq, void *private)
12471286

12481287
static const char *kxcjk1013_match_acpi_device(struct device *dev,
12491288
enum kx_chipset *chipset,
1250-
bool *is_smo8500_device)
1289+
enum kx_acpi_type *acpi_type)
12511290
{
12521291
const struct acpi_device_id *id;
12531292

@@ -1256,7 +1295,9 @@ static const char *kxcjk1013_match_acpi_device(struct device *dev,
12561295
return NULL;
12571296

12581297
if (strcmp(id->id, "SMO8500") == 0)
1259-
*is_smo8500_device = true;
1298+
*acpi_type = ACPI_SMO8500;
1299+
else if (strcmp(id->id, "KIOX010A") == 0)
1300+
*acpi_type = ACPI_KIOX010A;
12601301

12611302
*chipset = (enum kx_chipset)id->driver_data;
12621303

@@ -1299,7 +1340,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
12991340
} else if (ACPI_HANDLE(&client->dev)) {
13001341
name = kxcjk1013_match_acpi_device(&client->dev,
13011342
&data->chipset,
1302-
&data->is_smo8500_device);
1343+
&data->acpi_type);
13031344
} else
13041345
return -ENODEV;
13051346

@@ -1316,7 +1357,7 @@ static int kxcjk1013_probe(struct i2c_client *client,
13161357
indio_dev->modes = INDIO_DIRECT_MODE;
13171358
indio_dev->info = &kxcjk1013_info;
13181359

1319-
if (client->irq > 0 && !data->is_smo8500_device) {
1360+
if (client->irq > 0 && data->acpi_type != ACPI_SMO8500) {
13201361
ret = devm_request_threaded_irq(&client->dev, client->irq,
13211362
kxcjk1013_data_rdy_trig_poll,
13221363
kxcjk1013_event_handler,

drivers/iio/adc/ingenic-adc.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@
7171
#define JZ4725B_ADC_BATTERY_HIGH_VREF_BITS 10
7272
#define JZ4740_ADC_BATTERY_HIGH_VREF (7500 * 0.986)
7373
#define JZ4740_ADC_BATTERY_HIGH_VREF_BITS 12
74-
#define JZ4770_ADC_BATTERY_VREF 6600
74+
#define JZ4770_ADC_BATTERY_VREF 1200
7575
#define JZ4770_ADC_BATTERY_VREF_BITS 12
7676

7777
#define JZ_ADC_IRQ_AUX BIT(0)
@@ -177,13 +177,12 @@ static void ingenic_adc_set_config(struct ingenic_adc *adc,
177177
mutex_unlock(&adc->lock);
178178
}
179179

180-
static void ingenic_adc_enable(struct ingenic_adc *adc,
181-
int engine,
182-
bool enabled)
180+
static void ingenic_adc_enable_unlocked(struct ingenic_adc *adc,
181+
int engine,
182+
bool enabled)
183183
{
184184
u8 val;
185185

186-
mutex_lock(&adc->lock);
187186
val = readb(adc->base + JZ_ADC_REG_ENABLE);
188187

189188
if (enabled)
@@ -192,20 +191,41 @@ static void ingenic_adc_enable(struct ingenic_adc *adc,
192191
val &= ~BIT(engine);
193192

194193
writeb(val, adc->base + JZ_ADC_REG_ENABLE);
194+
}
195+
196+
static void ingenic_adc_enable(struct ingenic_adc *adc,
197+
int engine,
198+
bool enabled)
199+
{
200+
mutex_lock(&adc->lock);
201+
ingenic_adc_enable_unlocked(adc, engine, enabled);
195202
mutex_unlock(&adc->lock);
196203
}
197204

198205
static int ingenic_adc_capture(struct ingenic_adc *adc,
199206
int engine)
200207
{
208+
u32 cfg;
201209
u8 val;
202210
int ret;
203211

204-
ingenic_adc_enable(adc, engine, true);
212+
/*
213+
* Disable CMD_SEL temporarily, because it causes wrong VBAT readings,
214+
* probably due to the switch of VREF. We must keep the lock here to
215+
* avoid races with the buffer enable/disable functions.
216+
*/
217+
mutex_lock(&adc->lock);
218+
cfg = readl(adc->base + JZ_ADC_REG_CFG);
219+
writel(cfg & ~JZ_ADC_REG_CFG_CMD_SEL, adc->base + JZ_ADC_REG_CFG);
220+
221+
ingenic_adc_enable_unlocked(adc, engine, true);
205222
ret = readb_poll_timeout(adc->base + JZ_ADC_REG_ENABLE, val,
206223
!(val & BIT(engine)), 250, 1000);
207224
if (ret)
208-
ingenic_adc_enable(adc, engine, false);
225+
ingenic_adc_enable_unlocked(adc, engine, false);
226+
227+
writel(cfg, adc->base + JZ_ADC_REG_CFG);
228+
mutex_unlock(&adc->lock);
209229

210230
return ret;
211231
}

drivers/iio/adc/mt6577_auxadc.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
#include <linux/err.h>
1010
#include <linux/kernel.h>
1111
#include <linux/module.h>
12-
#include <linux/of.h>
13-
#include <linux/of_device.h>
12+
#include <linux/mod_devicetable.h>
1413
#include <linux/platform_device.h>
14+
#include <linux/property.h>
1515
#include <linux/iopoll.h>
1616
#include <linux/io.h>
1717
#include <linux/iio/iio.h>
@@ -276,6 +276,8 @@ static int mt6577_auxadc_probe(struct platform_device *pdev)
276276
goto err_disable_clk;
277277
}
278278

279+
adc_dev->dev_comp = device_get_match_data(&pdev->dev);
280+
279281
mutex_init(&adc_dev->lock);
280282

281283
mt6577_auxadc_mod_reg(adc_dev->reg_base + MT6577_AUXADC_MISC,

drivers/iio/adc/stm32-adc-core.c

Lines changed: 17 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -41,18 +41,16 @@
4141
* struct stm32_adc_common_regs - stm32 common registers
4242
* @csr: common status register offset
4343
* @ccr: common control register offset
44-
* @eoc1_msk: adc1 end of conversion flag in @csr
45-
* @eoc2_msk: adc2 end of conversion flag in @csr
46-
* @eoc3_msk: adc3 end of conversion flag in @csr
44+
* @eoc_msk: array of eoc (end of conversion flag) masks in csr for adc1..n
45+
* @ovr_msk: array of ovr (overrun flag) masks in csr for adc1..n
4746
* @ier: interrupt enable register offset for each adc
4847
* @eocie_msk: end of conversion interrupt enable mask in @ier
4948
*/
5049
struct stm32_adc_common_regs {
5150
u32 csr;
5251
u32 ccr;
53-
u32 eoc1_msk;
54-
u32 eoc2_msk;
55-
u32 eoc3_msk;
52+
u32 eoc_msk[STM32_ADC_MAX_ADCS];
53+
u32 ovr_msk[STM32_ADC_MAX_ADCS];
5654
u32 ier;
5755
u32 eocie_msk;
5856
};
@@ -282,21 +280,20 @@ static int stm32h7_adc_clk_sel(struct platform_device *pdev,
282280
static const struct stm32_adc_common_regs stm32f4_adc_common_regs = {
283281
.csr = STM32F4_ADC_CSR,
284282
.ccr = STM32F4_ADC_CCR,
285-
.eoc1_msk = STM32F4_EOC1 | STM32F4_OVR1,
286-
.eoc2_msk = STM32F4_EOC2 | STM32F4_OVR2,
287-
.eoc3_msk = STM32F4_EOC3 | STM32F4_OVR3,
283+
.eoc_msk = { STM32F4_EOC1, STM32F4_EOC2, STM32F4_EOC3},
284+
.ovr_msk = { STM32F4_OVR1, STM32F4_OVR2, STM32F4_OVR3},
288285
.ier = STM32F4_ADC_CR1,
289-
.eocie_msk = STM32F4_EOCIE | STM32F4_OVRIE,
286+
.eocie_msk = STM32F4_EOCIE,
290287
};
291288

292289
/* STM32H7 common registers definitions */
293290
static const struct stm32_adc_common_regs stm32h7_adc_common_regs = {
294291
.csr = STM32H7_ADC_CSR,
295292
.ccr = STM32H7_ADC_CCR,
296-
.eoc1_msk = STM32H7_EOC_MST | STM32H7_OVR_MST,
297-
.eoc2_msk = STM32H7_EOC_SLV | STM32H7_OVR_SLV,
293+
.eoc_msk = { STM32H7_EOC_MST, STM32H7_EOC_SLV},
294+
.ovr_msk = { STM32H7_OVR_MST, STM32H7_OVR_SLV},
298295
.ier = STM32H7_ADC_IER,
299-
.eocie_msk = STM32H7_EOCIE | STM32H7_OVRIE,
296+
.eocie_msk = STM32H7_EOCIE,
300297
};
301298

302299
static const unsigned int stm32_adc_offset[STM32_ADC_MAX_ADCS] = {
@@ -318,6 +315,7 @@ static void stm32_adc_irq_handler(struct irq_desc *desc)
318315
{
319316
struct stm32_adc_priv *priv = irq_desc_get_handler_data(desc);
320317
struct irq_chip *chip = irq_desc_get_chip(desc);
318+
int i;
321319
u32 status;
322320

323321
chained_irq_enter(chip, desc);
@@ -335,17 +333,12 @@ static void stm32_adc_irq_handler(struct irq_desc *desc)
335333
* before invoking the interrupt handler (e.g. call ISR only for
336334
* IRQ-enabled ADCs).
337335
*/
338-
if (status & priv->cfg->regs->eoc1_msk &&
339-
stm32_adc_eoc_enabled(priv, 0))
340-
generic_handle_irq(irq_find_mapping(priv->domain, 0));
341-
342-
if (status & priv->cfg->regs->eoc2_msk &&
343-
stm32_adc_eoc_enabled(priv, 1))
344-
generic_handle_irq(irq_find_mapping(priv->domain, 1));
345-
346-
if (status & priv->cfg->regs->eoc3_msk &&
347-
stm32_adc_eoc_enabled(priv, 2))
348-
generic_handle_irq(irq_find_mapping(priv->domain, 2));
336+
for (i = 0; i < priv->cfg->num_irqs; i++) {
337+
if ((status & priv->cfg->regs->eoc_msk[i] &&
338+
stm32_adc_eoc_enabled(priv, i)) ||
339+
(status & priv->cfg->regs->ovr_msk[i]))
340+
generic_handle_irq(irq_find_mapping(priv->domain, i));
341+
}
349342

350343
chained_irq_exit(chip, desc);
351344
};

0 commit comments

Comments
 (0)