Lines Matching +full:spi +full:- +full:present +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0-only
14 #include <linux/spi/spi.h>
59 * struct ad5421_state - driver instance specific data
60 * @spi: spi_device
63 * @data: spi transfer buffers
65 * @lock: lock to protect the data buffer during SPI ops
68 struct spi_device *spi; member
128 .channel = -1,
139 st->data[0].d32 = cpu_to_be32((reg << 16) | val); in ad5421_write_unlocked()
141 return spi_write(st->spi, &st->data[0].d8[1], 3); in ad5421_write_unlocked()
150 mutex_lock(&st->lock); in ad5421_write()
152 mutex_unlock(&st->lock); in ad5421_write()
163 .tx_buf = &st->data[0].d8[1], in ad5421_read()
167 .rx_buf = &st->data[1].d8[1], in ad5421_read()
172 mutex_lock(&st->lock); in ad5421_read()
174 st->data[0].d32 = cpu_to_be32((1 << 23) | (reg << 16)); in ad5421_read()
176 ret = spi_sync_transfer(st->spi, t, ARRAY_SIZE(t)); in ad5421_read()
178 ret = be32_to_cpu(st->data[1].d32) & 0xffff; in ad5421_read()
180 mutex_unlock(&st->lock); in ad5421_read()
191 mutex_lock(&st->lock); in ad5421_update_ctrl()
193 st->ctrl &= ~clr; in ad5421_update_ctrl()
194 st->ctrl |= set; in ad5421_update_ctrl()
196 ret = ad5421_write_unlocked(indio_dev, AD5421_REG_CTRL, st->ctrl); in ad5421_update_ctrl()
198 mutex_unlock(&st->lock); in ad5421_update_ctrl()
223 /* The fault pin stays high as long as a fault condition is present and in ad5421_fault_handler()
224 * it is not possible to mask fault conditions. For certain fault in ad5421_fault_handler()
225 * conditions for example like over-temperature it takes some time in ad5421_fault_handler()
229 * a interrupt condition is still present. in ad5421_fault_handler()
239 events &= st->fault_mask; in ad5421_fault_handler()
285 * usually hard-wired and not run-time switchable. */ in ad5421_get_current_min_max()
286 switch (st->current_range) { in ad5421_get_current_min_max()
311 return (min * (1 << 16)) / (max - min); in ad5421_get_offset()
321 if (chan->type != IIO_CURRENT) in ad5421_read_raw()
322 return -EINVAL; in ad5421_read_raw()
333 *val = max - min; in ad5421_read_raw()
343 *val = ret - 32768; in ad5421_read_raw()
353 return -EINVAL; in ad5421_read_raw()
357 struct iio_chan_spec const *chan, int val, int val2, long mask) in ad5421_write_raw() argument
361 switch (mask) { in ad5421_write_raw()
364 return -EINVAL; in ad5421_write_raw()
370 return -EINVAL; in ad5421_write_raw()
375 return -EINVAL; in ad5421_write_raw()
382 return -EINVAL; in ad5421_write_raw()
390 unsigned int mask; in ad5421_write_event_config() local
392 switch (chan->type) { in ad5421_write_event_config()
395 mask = AD5421_FAULT_OVER_CURRENT; in ad5421_write_event_config()
397 mask = AD5421_FAULT_UNDER_CURRENT; in ad5421_write_event_config()
400 mask = AD5421_FAULT_TEMP_OVER_140; in ad5421_write_event_config()
403 return -EINVAL; in ad5421_write_event_config()
406 mutex_lock(&st->lock); in ad5421_write_event_config()
408 st->fault_mask |= mask; in ad5421_write_event_config()
410 st->fault_mask &= ~mask; in ad5421_write_event_config()
411 mutex_unlock(&st->lock); in ad5421_write_event_config()
421 unsigned int mask; in ad5421_read_event_config() local
423 switch (chan->type) { in ad5421_read_event_config()
426 mask = AD5421_FAULT_OVER_CURRENT; in ad5421_read_event_config()
428 mask = AD5421_FAULT_UNDER_CURRENT; in ad5421_read_event_config()
431 mask = AD5421_FAULT_TEMP_OVER_140; in ad5421_read_event_config()
434 return -EINVAL; in ad5421_read_event_config()
437 return (bool)(st->fault_mask & mask); in ad5421_read_event_config()
447 switch (chan->type) { in ad5421_read_event_value()
458 return -EINVAL; in ad5421_read_event_value()
472 static int ad5421_probe(struct spi_device *spi) in ad5421_probe() argument
474 struct ad5421_platform_data *pdata = dev_get_platdata(&spi->dev); in ad5421_probe()
479 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ad5421_probe()
481 dev_err(&spi->dev, "Failed to allocate iio device\n"); in ad5421_probe()
482 return -ENOMEM; in ad5421_probe()
486 spi_set_drvdata(spi, indio_dev); in ad5421_probe()
488 st->spi = spi; in ad5421_probe()
490 indio_dev->name = "ad5421"; in ad5421_probe()
491 indio_dev->info = &ad5421_info; in ad5421_probe()
492 indio_dev->modes = INDIO_DIRECT_MODE; in ad5421_probe()
493 indio_dev->channels = ad5421_channels; in ad5421_probe()
494 indio_dev->num_channels = ARRAY_SIZE(ad5421_channels); in ad5421_probe()
496 mutex_init(&st->lock); in ad5421_probe()
498 st->ctrl = AD5421_CTRL_WATCHDOG_DISABLE | in ad5421_probe()
502 st->current_range = pdata->current_range; in ad5421_probe()
503 if (pdata->external_vref) in ad5421_probe()
504 st->ctrl |= AD5421_CTRL_PWR_DOWN_INT_VREF; in ad5421_probe()
506 st->current_range = AD5421_CURRENT_RANGE_4mA_20mA; in ad5421_probe()
512 if (spi->irq) { in ad5421_probe()
513 ret = devm_request_threaded_irq(&spi->dev, spi->irq, in ad5421_probe()
523 return devm_iio_device_register(&spi->dev, indio_dev); in ad5421_probe()
534 MODULE_AUTHOR("Lars-Peter Clausen <[email protected]>");
537 MODULE_ALIAS("spi:ad5421");