static int adis16400_initial_setup(struct iio_dev *indio_dev) { struct adis16400_state *st = iio_priv(indio_dev); uint16_t prod_id, smp_prd; unsigned int device_id; int ret; /* use low spi speed for init if the device has a slow mode */ if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) st->adis.spi->max_speed_hz = ADIS16400_SPI_SLOW; else st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST; st->adis.spi->mode = SPI_MODE_3; spi_setup(st->adis.spi); ret = adis_initial_startup(&st->adis); if (ret) return ret; if (st->variant->flags & ADIS16400_HAS_PROD_ID) { ret = adis_read_reg_16(&st->adis, ADIS16400_PRODUCT_ID, &prod_id); if (ret) goto err_ret; sscanf(indio_dev->name, "adis%u\n", &device_id); if (prod_id != device_id) dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.", device_id, prod_id); dev_info(&indio_dev->dev, "%s: prod_id 0x%04x at CS%d (irq %d)\n", indio_dev->name, prod_id, st->adis.spi->chip_select, st->adis.spi->irq); } /* use high spi speed if possible */ if (st->variant->flags & ADIS16400_HAS_SLOW_MODE) { ret = adis_read_reg_16(&st->adis, ADIS16400_SMPL_PRD, &smp_prd); if (ret) goto err_ret; if ((smp_prd & ADIS16400_SMPL_PRD_DIV_MASK) < 0x0A) { st->adis.spi->max_speed_hz = ADIS16400_SPI_FAST; spi_setup(st->adis.spi); } } err_ret: return ret; }
static int adis16260_probe(struct spi_device *spi) { struct iio_dev *indio_dev; struct adis *adis; int ret; /* setup the industrialio driver allocated elements */ indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*adis)); if (!indio_dev) return -ENOMEM; adis = iio_priv(indio_dev); /* this is only used for removal purposes */ spi_set_drvdata(spi, indio_dev); indio_dev->name = spi_get_device_id(spi)->name; indio_dev->dev.parent = &spi->dev; indio_dev->info = &adis16260_info; indio_dev->channels = adis16260_channels; indio_dev->num_channels = ARRAY_SIZE(adis16260_channels); indio_dev->modes = INDIO_DIRECT_MODE; ret = adis_init(adis, indio_dev, spi, &adis16260_data); if (ret) return ret; ret = adis_setup_buffer_and_trigger(adis, indio_dev, NULL); if (ret) return ret; /* Get the device into a sane initial state */ ret = adis_initial_startup(adis); if (ret) goto error_cleanup_buffer_trigger; ret = iio_device_register(indio_dev); if (ret) goto error_cleanup_buffer_trigger; return 0; error_cleanup_buffer_trigger: adis_cleanup_buffer_and_trigger(adis, indio_dev); return ret; }
static int adis16209_probe(struct spi_device *spi) { int ret; struct adis *st; struct iio_dev *indio_dev; indio_dev = devm_iio_device_alloc(&spi->dev, sizeof(*st)); if (!indio_dev) return -ENOMEM; st = iio_priv(indio_dev); spi_set_drvdata(spi, indio_dev); indio_dev->name = spi->dev.driver->name; indio_dev->dev.parent = &spi->dev; indio_dev->info = &adis16209_info; indio_dev->channels = adis16209_channels; indio_dev->num_channels = ARRAY_SIZE(adis16209_channels); indio_dev->modes = INDIO_DIRECT_MODE; ret = adis_init(st, indio_dev, spi, &adis16209_data); if (ret) return ret; ret = adis_setup_buffer_and_trigger(st, indio_dev, NULL); if (ret) return ret; ret = adis_initial_startup(st); if (ret) goto error_cleanup_buffer_trigger; ret = iio_device_register(indio_dev); if (ret) goto error_cleanup_buffer_trigger; return 0; error_cleanup_buffer_trigger: adis_cleanup_buffer_and_trigger(st, indio_dev); return ret; }
static int adis16136_initial_setup(struct iio_dev *indio_dev) { struct adis16136 *adis16136 = iio_priv(indio_dev); unsigned int device_id; uint16_t prod_id; int ret; ret = adis_initial_startup(&adis16136->adis); if (ret) return ret; ret = adis_read_reg_16(&adis16136->adis, ADIS16136_REG_PROD_ID, &prod_id); if (ret) return ret; sscanf(indio_dev->name, "adis%u\n", &device_id); if (prod_id != device_id) dev_warn(&indio_dev->dev, "Device ID(%u) and product ID(%u) do not match.", device_id, prod_id); return 0; }