Lines Matching +full:spi +full:- +full:gpio
1 // SPDX-License-Identifier: GPL-2.0
3 * Texas Instruments ADS7950 SPI ADC driver
12 * Copyright (C) 2013 Texas Instruments Incorporated - https://www.ti.com/
20 #include <linux/gpio/driver.h>
26 #include <linux/spi/spi.h>
36 * Device tree users encode that via the vref-supply regulator.
54 (((val) >> (dec)) & ((1 << (bits)) - 1))
61 (TI_ADS7950_MAN_CMD(TI_ADS7950_CR_WRITE | st->cmd_settings_bitmask))
62 /* GPIO mode configuration */
64 (TI_ADS7950_GPIO_CMD(st->gpio_cmd_settings_bitmask))
67 struct spi_device *spi; member
73 /* Lock to protect the spi xfer buffers */
84 * [0-3] GPIO signal
85 * [4] Set following frame to return GPIO signal values
94 * Bitmask of GPIO command
95 * [0-3] GPIO direction
96 * [4-6] Different GPIO alarm mode configurations
97 * [7] GPIO 2 as device range input
98 * [8] GPIO 3 as device power down input
100 * [10-11] N/A
150 .shift = 12 - (bits), \
280 * ti_ads7950_update_scan_mode() setup the spi transfer buffer for the new
290 for_each_set_bit(i, active_scan_mask, indio_dev->num_channels) { in ti_ads7950_update_scan_mode()
292 st->tx_buf[len++] = cmd; in ti_ads7950_update_scan_mode()
296 st->tx_buf[len++] = 0; in ti_ads7950_update_scan_mode()
297 st->tx_buf[len++] = 0; in ti_ads7950_update_scan_mode()
299 st->ring_xfer.len = len * 2; in ti_ads7950_update_scan_mode()
307 struct iio_dev *indio_dev = pf->indio_dev; in ti_ads7950_trigger_handler()
311 mutex_lock(&st->slock); in ti_ads7950_trigger_handler()
312 ret = spi_sync(st->spi, &st->ring_msg); in ti_ads7950_trigger_handler()
316 iio_push_to_buffers_with_timestamp(indio_dev, &st->rx_buf[2], in ti_ads7950_trigger_handler()
320 mutex_unlock(&st->slock); in ti_ads7950_trigger_handler()
321 iio_trigger_notify_done(indio_dev->trig); in ti_ads7950_trigger_handler()
331 mutex_lock(&st->slock); in ti_ads7950_scan_direct()
333 st->single_tx = cmd; in ti_ads7950_scan_direct()
335 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_scan_direct()
339 ret = st->single_rx; in ti_ads7950_scan_direct()
342 mutex_unlock(&st->slock); in ti_ads7950_scan_direct()
351 if (st->vref_mv) { in ti_ads7950_get_range()
352 vref = st->vref_mv; in ti_ads7950_get_range()
354 vref = regulator_get_voltage(st->reg); in ti_ads7950_get_range()
361 if (st->cmd_settings_bitmask & TI_ADS7950_CR_RANGE_5V) in ti_ads7950_get_range()
376 ret = ti_ads7950_scan_direct(indio_dev, chan->address); in ti_ads7950_read_raw()
380 if (chan->address != TI_ADS7950_EXTRACT(ret, 12, 4)) in ti_ads7950_read_raw()
381 return -EIO; in ti_ads7950_read_raw()
383 *val = TI_ADS7950_EXTRACT(ret, chan->scan_type.shift, in ti_ads7950_read_raw()
384 chan->scan_type.realbits); in ti_ads7950_read_raw()
393 *val2 = (1 << chan->scan_type.realbits) - 1; in ti_ads7950_read_raw()
398 return -EINVAL; in ti_ads7950_read_raw()
412 mutex_lock(&st->slock); in ti_ads7950_set()
415 st->cmd_settings_bitmask |= BIT(offset); in ti_ads7950_set()
417 st->cmd_settings_bitmask &= ~BIT(offset); in ti_ads7950_set()
419 st->single_tx = TI_ADS7950_MAN_CMD_SETTINGS(st); in ti_ads7950_set()
420 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_set()
422 mutex_unlock(&st->slock); in ti_ads7950_set()
432 mutex_lock(&st->slock); in ti_ads7950_get()
435 if (st->gpio_cmd_settings_bitmask & BIT(offset)) { in ti_ads7950_get()
436 ret = st->cmd_settings_bitmask & BIT(offset); in ti_ads7950_get()
440 /* GPIO data bit sets SDO bits 12-15 to GPIO input */ in ti_ads7950_get()
441 st->cmd_settings_bitmask |= TI_ADS7950_CR_GPIO_DATA; in ti_ads7950_get()
442 st->single_tx = TI_ADS7950_MAN_CMD_SETTINGS(st); in ti_ads7950_get()
443 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_get()
447 ret = ((st->single_rx >> 12) & BIT(offset)) ? 1 : 0; in ti_ads7950_get()
450 st->cmd_settings_bitmask &= ~TI_ADS7950_CR_GPIO_DATA; in ti_ads7950_get()
451 st->single_tx = TI_ADS7950_MAN_CMD_SETTINGS(st); in ti_ads7950_get()
452 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_get()
457 mutex_unlock(&st->slock); in ti_ads7950_get()
467 /* Bitmask is inverted from GPIO framework 0=input/1=output */ in ti_ads7950_get_direction()
468 return !(st->gpio_cmd_settings_bitmask & BIT(offset)); in ti_ads7950_get_direction()
477 mutex_lock(&st->slock); in _ti_ads7950_set_direction()
480 if (input && (st->gpio_cmd_settings_bitmask & BIT(offset))) in _ti_ads7950_set_direction()
481 st->gpio_cmd_settings_bitmask &= ~BIT(offset); in _ti_ads7950_set_direction()
482 else if (!input && !(st->gpio_cmd_settings_bitmask & BIT(offset))) in _ti_ads7950_set_direction()
483 st->gpio_cmd_settings_bitmask |= BIT(offset); in _ti_ads7950_set_direction()
487 st->single_tx = TI_ADS7950_GPIO_CMD_SETTINGS(st); in _ti_ads7950_set_direction()
488 ret = spi_sync(st->spi, &st->scan_single_msg); in _ti_ads7950_set_direction()
491 mutex_unlock(&st->slock); in _ti_ads7950_set_direction()
518 mutex_lock(&st->slock); in ti_ads7950_init_hw()
522 st->cmd_settings_bitmask = TI_ADS7950_CR_RANGE_5V; in ti_ads7950_init_hw()
523 st->single_tx = TI_ADS7950_MAN_CMD_SETTINGS(st); in ti_ads7950_init_hw()
524 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_init_hw()
528 /* Settings for GPIO command */ in ti_ads7950_init_hw()
529 st->gpio_cmd_settings_bitmask = 0x0; in ti_ads7950_init_hw()
530 st->single_tx = TI_ADS7950_GPIO_CMD_SETTINGS(st); in ti_ads7950_init_hw()
531 ret = spi_sync(st->spi, &st->scan_single_msg); in ti_ads7950_init_hw()
534 mutex_unlock(&st->slock); in ti_ads7950_init_hw()
539 static int ti_ads7950_probe(struct spi_device *spi) in ti_ads7950_probe() argument
546 spi->bits_per_word = 16; in ti_ads7950_probe()
547 spi->mode |= SPI_CS_WORD; in ti_ads7950_probe()
548 ret = spi_setup(spi); in ti_ads7950_probe()
550 dev_err(&spi->dev, "Error in spi setup\n"); in ti_ads7950_probe()
554 indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); in ti_ads7950_probe()
556 return -ENOMEM; in ti_ads7950_probe()
560 spi_set_drvdata(spi, indio_dev); in ti_ads7950_probe()
562 st->spi = spi; in ti_ads7950_probe()
564 info = &ti_ads7950_chip_info[spi_get_device_id(spi)->driver_data]; in ti_ads7950_probe()
566 indio_dev->name = spi_get_device_id(spi)->name; in ti_ads7950_probe()
567 indio_dev->modes = INDIO_DIRECT_MODE; in ti_ads7950_probe()
568 indio_dev->channels = info->channels; in ti_ads7950_probe()
569 indio_dev->num_channels = info->num_channels; in ti_ads7950_probe()
570 indio_dev->info = &ti_ads7950_info; in ti_ads7950_probe()
572 /* build spi ring message */ in ti_ads7950_probe()
573 spi_message_init(&st->ring_msg); in ti_ads7950_probe()
575 st->ring_xfer.tx_buf = &st->tx_buf[0]; in ti_ads7950_probe()
576 st->ring_xfer.rx_buf = &st->rx_buf[0]; in ti_ads7950_probe()
579 spi_message_add_tail(&st->ring_xfer, &st->ring_msg); in ti_ads7950_probe()
585 * the SPI clock, which is why we have 3 transfers. The middle one is in ti_ads7950_probe()
590 st->scan_single_xfer[0].tx_buf = &st->single_tx; in ti_ads7950_probe()
591 st->scan_single_xfer[0].len = 2; in ti_ads7950_probe()
592 st->scan_single_xfer[0].cs_change = 1; in ti_ads7950_probe()
593 st->scan_single_xfer[1].tx_buf = &st->single_tx; in ti_ads7950_probe()
594 st->scan_single_xfer[1].len = 2; in ti_ads7950_probe()
595 st->scan_single_xfer[1].cs_change = 1; in ti_ads7950_probe()
596 st->scan_single_xfer[2].rx_buf = &st->single_rx; in ti_ads7950_probe()
597 st->scan_single_xfer[2].len = 2; in ti_ads7950_probe()
599 spi_message_init_with_transfers(&st->scan_single_msg, in ti_ads7950_probe()
600 st->scan_single_xfer, 3); in ti_ads7950_probe()
603 if (ACPI_COMPANION(&spi->dev)) in ti_ads7950_probe()
604 st->vref_mv = TI_ADS7950_VA_MV_ACPI_DEFAULT; in ti_ads7950_probe()
606 mutex_init(&st->slock); in ti_ads7950_probe()
608 st->reg = devm_regulator_get(&spi->dev, "vref"); in ti_ads7950_probe()
609 if (IS_ERR(st->reg)) { in ti_ads7950_probe()
610 ret = dev_err_probe(&spi->dev, PTR_ERR(st->reg), in ti_ads7950_probe()
615 ret = regulator_enable(st->reg); in ti_ads7950_probe()
617 dev_err(&spi->dev, "Failed to enable regulator \"vref\"\n"); in ti_ads7950_probe()
624 dev_err(&spi->dev, "Failed to setup triggered buffer\n"); in ti_ads7950_probe()
630 dev_err(&spi->dev, "Failed to init adc chip\n"); in ti_ads7950_probe()
636 dev_err(&spi->dev, "Failed to register iio device\n"); in ti_ads7950_probe()
640 /* Add GPIO chip */ in ti_ads7950_probe()
641 st->chip.label = dev_name(&st->spi->dev); in ti_ads7950_probe()
642 st->chip.parent = &st->spi->dev; in ti_ads7950_probe()
643 st->chip.owner = THIS_MODULE; in ti_ads7950_probe()
644 st->chip.can_sleep = true; in ti_ads7950_probe()
645 st->chip.base = -1; in ti_ads7950_probe()
646 st->chip.ngpio = TI_ADS7950_NUM_GPIOS; in ti_ads7950_probe()
647 st->chip.get_direction = ti_ads7950_get_direction; in ti_ads7950_probe()
648 st->chip.direction_input = ti_ads7950_direction_input; in ti_ads7950_probe()
649 st->chip.direction_output = ti_ads7950_direction_output; in ti_ads7950_probe()
650 st->chip.get = ti_ads7950_get; in ti_ads7950_probe()
651 st->chip.set_rv = ti_ads7950_set; in ti_ads7950_probe()
653 ret = gpiochip_add_data(&st->chip, st); in ti_ads7950_probe()
655 dev_err(&spi->dev, "Failed to init GPIOs\n"); in ti_ads7950_probe()
666 regulator_disable(st->reg); in ti_ads7950_probe()
668 mutex_destroy(&st->slock); in ti_ads7950_probe()
673 static void ti_ads7950_remove(struct spi_device *spi) in ti_ads7950_remove() argument
675 struct iio_dev *indio_dev = spi_get_drvdata(spi); in ti_ads7950_remove()
678 gpiochip_remove(&st->chip); in ti_ads7950_remove()
681 regulator_disable(st->reg); in ti_ads7950_remove()
682 mutex_destroy(&st->slock); in ti_ads7950_remove()
700 MODULE_DEVICE_TABLE(spi, ti_ads7950_id);