hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/iio/imu/adis.c
....@@ -34,8 +34,8 @@
3434 * @value: The value to write to device (up to 4 bytes)
3535 * @size: The size of the @value (in bytes)
3636 */
37
-int __adis_write_reg(struct adis *adis, unsigned int reg,
38
- unsigned int value, unsigned int size)
37
+int __adis_write_reg(struct adis *adis, unsigned int reg, unsigned int value,
38
+ unsigned int size)
3939 {
4040 unsigned int page = reg / ADIS_PAGE_SIZE;
4141 int ret, i;
....@@ -118,14 +118,14 @@
118118 ret = spi_sync(adis->spi, &msg);
119119 if (ret) {
120120 dev_err(&adis->spi->dev, "Failed to write register 0x%02X: %d\n",
121
- reg, ret);
121
+ reg, ret);
122122 } else {
123123 adis->current_page = page;
124124 }
125125
126126 return ret;
127127 }
128
-EXPORT_SYMBOL_GPL(__adis_write_reg);
128
+EXPORT_SYMBOL_NS_GPL(__adis_write_reg, IIO_ADISLIB);
129129
130130 /**
131131 * __adis_read_reg() - read N bytes from register (unlocked version)
....@@ -134,8 +134,8 @@
134134 * @val: The value read back from the device
135135 * @size: The size of the @val buffer
136136 */
137
-int __adis_read_reg(struct adis *adis, unsigned int reg,
138
- unsigned int *val, unsigned int size)
137
+int __adis_read_reg(struct adis *adis, unsigned int reg, unsigned int *val,
138
+ unsigned int size)
139139 {
140140 unsigned int page = reg / ADIS_PAGE_SIZE;
141141 struct spi_message msg;
....@@ -205,11 +205,11 @@
205205 ret = spi_sync(adis->spi, &msg);
206206 if (ret) {
207207 dev_err(&adis->spi->dev, "Failed to read register 0x%02X: %d\n",
208
- reg, ret);
208
+ reg, ret);
209209 return ret;
210
- } else {
211
- adis->current_page = page;
212210 }
211
+
212
+ adis->current_page = page;
213213
214214 switch (size) {
215215 case 4:
....@@ -222,7 +222,7 @@
222222
223223 return ret;
224224 }
225
-EXPORT_SYMBOL_GPL(__adis_read_reg);
225
+EXPORT_SYMBOL_NS_GPL(__adis_read_reg, IIO_ADISLIB);
226226 /**
227227 * __adis_update_bits_base() - ADIS Update bits function - Unlocked version
228228 * @adis: The adis device
....@@ -247,17 +247,17 @@
247247
248248 return __adis_write_reg(adis, reg, __val, size);
249249 }
250
-EXPORT_SYMBOL_GPL(__adis_update_bits_base);
250
+EXPORT_SYMBOL_NS_GPL(__adis_update_bits_base, IIO_ADISLIB);
251251
252252 #ifdef CONFIG_DEBUG_FS
253253
254
-int adis_debugfs_reg_access(struct iio_dev *indio_dev,
255
- unsigned int reg, unsigned int writeval, unsigned int *readval)
254
+int adis_debugfs_reg_access(struct iio_dev *indio_dev, unsigned int reg,
255
+ unsigned int writeval, unsigned int *readval)
256256 {
257257 struct adis *adis = iio_device_get_drvdata(indio_dev);
258258
259259 if (readval) {
260
- uint16_t val16;
260
+ u16 val16;
261261 int ret;
262262
263263 ret = adis_read_reg_16(adis, reg, &val16);
....@@ -265,36 +265,41 @@
265265 *readval = val16;
266266
267267 return ret;
268
- } else {
269
- return adis_write_reg_16(adis, reg, writeval);
270268 }
269
+
270
+ return adis_write_reg_16(adis, reg, writeval);
271271 }
272
-EXPORT_SYMBOL(adis_debugfs_reg_access);
272
+EXPORT_SYMBOL_NS(adis_debugfs_reg_access, IIO_ADISLIB);
273273
274274 #endif
275275
276276 /**
277
- * adis_enable_irq() - Enable or disable data ready IRQ
277
+ * __adis_enable_irq() - Enable or disable data ready IRQ (unlocked)
278278 * @adis: The adis device
279279 * @enable: Whether to enable the IRQ
280280 *
281281 * Returns 0 on success, negative error code otherwise
282282 */
283
-int adis_enable_irq(struct adis *adis, bool enable)
283
+int __adis_enable_irq(struct adis *adis, bool enable)
284284 {
285
- int ret = 0;
286
- uint16_t msc;
285
+ int ret;
286
+ u16 msc;
287287
288
- mutex_lock(&adis->state_lock);
288
+ if (adis->data->enable_irq)
289
+ return adis->data->enable_irq(adis, enable);
289290
290
- if (adis->data->enable_irq) {
291
- ret = adis->data->enable_irq(adis, enable);
292
- goto out_unlock;
291
+ if (adis->data->unmasked_drdy) {
292
+ if (enable)
293
+ enable_irq(adis->spi->irq);
294
+ else
295
+ disable_irq(adis->spi->irq);
296
+
297
+ return 0;
293298 }
294299
295300 ret = __adis_read_reg_16(adis, adis->data->msc_ctrl_reg, &msc);
296301 if (ret)
297
- goto out_unlock;
302
+ return ret;
298303
299304 msc |= ADIS_MSC_CTRL_DATA_RDY_POL_HIGH;
300305 msc &= ~ADIS_MSC_CTRL_DATA_RDY_DIO2;
....@@ -303,13 +308,9 @@
303308 else
304309 msc &= ~ADIS_MSC_CTRL_DATA_RDY_EN;
305310
306
- ret = __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, msc);
307
-
308
-out_unlock:
309
- mutex_unlock(&adis->state_lock);
310
- return ret;
311
+ return __adis_write_reg_16(adis, adis->data->msc_ctrl_reg, msc);
311312 }
312
-EXPORT_SYMBOL(adis_enable_irq);
313
+EXPORT_SYMBOL_NS(__adis_enable_irq, IIO_ADISLIB);
313314
314315 /**
315316 * __adis_check_status() - Check the device for error conditions (unlocked)
....@@ -319,7 +320,7 @@
319320 */
320321 int __adis_check_status(struct adis *adis)
321322 {
322
- uint16_t status;
323
+ u16 status;
323324 int ret;
324325 int i;
325326
....@@ -341,7 +342,7 @@
341342
342343 return -EIO;
343344 }
344
-EXPORT_SYMBOL_GPL(__adis_check_status);
345
+EXPORT_SYMBOL_NS_GPL(__adis_check_status, IIO_ADISLIB);
345346
346347 /**
347348 * __adis_reset() - Reset the device (unlocked version)
....@@ -355,7 +356,7 @@
355356 const struct adis_timeout *timeouts = adis->data->timeouts;
356357
357358 ret = __adis_write_reg_8(adis, adis->data->glob_cmd_reg,
358
- ADIS_GLOB_CMD_SW_RESET);
359
+ ADIS_GLOB_CMD_SW_RESET);
359360 if (ret) {
360361 dev_err(&adis->spi->dev, "Failed to reset device: %d\n", ret);
361362 return ret;
....@@ -365,7 +366,7 @@
365366
366367 return 0;
367368 }
368
-EXPORT_SYMBOL_GPL(__adis_reset);
369
+EXPORT_SYMBOL_NS_GPL(__adis_reset, IIO_ADIS_LIB);
369370
370371 static int adis_self_test(struct adis *adis)
371372 {
....@@ -411,7 +412,7 @@
411412 {
412413 const struct adis_timeout *timeouts = adis->data->timeouts;
413414 struct gpio_desc *gpio;
414
- uint16_t prod_id;
415
+ u16 prod_id;
415416 int ret;
416417
417418 /* check if the device has rst pin low */
....@@ -420,7 +421,7 @@
420421 return PTR_ERR(gpio);
421422
422423 if (gpio) {
423
- msleep(10);
424
+ usleep_range(10, 12);
424425 /* bring device out of reset */
425426 gpiod_set_value_cansleep(gpio, 0);
426427 msleep(timeouts->reset_ms);
....@@ -434,7 +435,13 @@
434435 if (ret)
435436 return ret;
436437
437
- adis_enable_irq(adis, false);
438
+ /*
439
+ * don't bother calling this if we can't unmask the IRQ as in this case
440
+ * the IRQ is most likely not yet requested and we will request it
441
+ * with 'IRQF_NO_AUTOEN' anyways.
442
+ */
443
+ if (!adis->data->unmasked_drdy)
444
+ __adis_enable_irq(adis, false);
438445
439446 if (!adis->data->prod_id_reg)
440447 return 0;
....@@ -450,7 +457,7 @@
450457
451458 return 0;
452459 }
453
-EXPORT_SYMBOL_GPL(__adis_initial_startup);
460
+EXPORT_SYMBOL_NS_GPL(__adis_initial_startup, IIO_ADISLIB);
454461
455462 /**
456463 * adis_single_conversion() - Performs a single sample conversion
....@@ -468,7 +475,8 @@
468475 * a error bit in the channels raw value set error_mask to 0.
469476 */
470477 int adis_single_conversion(struct iio_dev *indio_dev,
471
- const struct iio_chan_spec *chan, unsigned int error_mask, int *val)
478
+ const struct iio_chan_spec *chan,
479
+ unsigned int error_mask, int *val)
472480 {
473481 struct adis *adis = iio_device_get_drvdata(indio_dev);
474482 unsigned int uval;
....@@ -477,7 +485,7 @@
477485 mutex_lock(&adis->state_lock);
478486
479487 ret = __adis_read_reg(adis, chan->address, &uval,
480
- chan->scan_type.storagebits / 8);
488
+ chan->scan_type.storagebits / 8);
481489 if (ret)
482490 goto err_unlock;
483491
....@@ -497,7 +505,7 @@
497505 mutex_unlock(&adis->state_lock);
498506 return ret;
499507 }
500
-EXPORT_SYMBOL_GPL(adis_single_conversion);
508
+EXPORT_SYMBOL_NS_GPL(adis_single_conversion, IIO_ADISLIB);
501509
502510 /**
503511 * adis_init() - Initialize adis device structure
....@@ -512,7 +520,7 @@
512520 * called.
513521 */
514522 int adis_init(struct adis *adis, struct iio_dev *indio_dev,
515
- struct spi_device *spi, const struct adis_data *data)
523
+ struct spi_device *spi, const struct adis_data *data)
516524 {
517525 if (!data || !data->timeouts) {
518526 dev_err(&spi->dev, "No config data or timeouts not defined!\n");
....@@ -534,7 +542,7 @@
534542
535543 return 0;
536544 }
537
-EXPORT_SYMBOL_GPL(adis_init);
545
+EXPORT_SYMBOL_NS_GPL(adis_init, IIO_ADISLIB);
538546
539547 MODULE_LICENSE("GPL");
540548 MODULE_AUTHOR("Lars-Peter Clausen <lars@metafoo.de>");