From: Ismo Puustinen <ismo.puusti...@intel.com> Upstream-status: Pending
Signed-off-by: Saul Wold <s...@linux.intel.com> --- drivers/staging/iio/adc/adc1x8s102.c | 76 ++++++++++++++++++++++++++++++------ 1 file changed, 63 insertions(+), 13 deletions(-) diff --git a/drivers/staging/iio/adc/adc1x8s102.c b/drivers/staging/iio/adc/adc1x8s102.c index 52472e2..881b145 100644 --- a/drivers/staging/iio/adc/adc1x8s102.c +++ b/drivers/staging/iio/adc/adc1x8s102.c @@ -1,7 +1,7 @@ /* * ADC1x8S102 SPI ADC driver * - * Copyright(c) 2013 Intel Corporation. + * Copyright(c) 2013-2015 Intel Corporation. * * This program is free software; you can redistribute it and/or modify it * under the terms and conditions of the GNU General Public License, @@ -33,6 +33,13 @@ #include <linux/platform_data/adc1x8s102.h> #include <linux/regulator/consumer.h> +#include <linux/delay.h> +#include <linux/acpi.h> +#include <linux/property.h> +#include <linux/gpio.h> + +#include <linux/spi/pxa2xx_spi.h> + /* * Defining the ADC resolution being 12 bits, we can use the same driver for * both ADC108S102 (10 bits resolution) and ADC128S102 (12 bits resolution) @@ -259,14 +266,60 @@ static const struct iio_info adc1x8s102_info = { .driver_module = THIS_MODULE, }; +struct adc1x8s102_spi_info { + kernel_ulong_t driver_data; + void (*setup)(struct spi_device *spi); +}; + +static void adc1x8s102_setup_int3495(struct spi_device *spi) +{ + /* Galileo Gen 2 SPI setup */ + +#define ADC1x8S102_GALILEO2_CS 8 + + struct pxa2xx_spi_chip *chip_data; + chip_data = devm_kzalloc(&spi->dev, sizeof(*chip_data), GFP_KERNEL); + + if (chip_data) { + chip_data->gpio_cs = ADC1x8S102_GALILEO2_CS; + spi->controller_data = chip_data; + dev_info(&spi->dev, "setting GPIO CS value to %d\n", chip_data->gpio_cs); + spi_setup(spi); + } +} + +static const struct adc1x8s102_spi_info adc1x8s102_info_int3495 = { + .driver_data = 0, + .setup = adc1x8s102_setup_int3495, +}; + +static const struct acpi_device_id adc1x8s102_acpi_ids[] = { + { "INT3495", (kernel_ulong_t)&adc1x8s102_info_int3495 }, + { } +}; +MODULE_DEVICE_TABLE(acpi, adc1x8s102_acpi_ids); static int adc1x8s102_probe(struct spi_device *spi) { struct adc1x8s102_platform_data *pdata = spi->dev.platform_data; struct adc1x8s102_state *st; struct iio_dev *indio_dev = iio_device_alloc(sizeof(*st)); + const struct acpi_device_id *id; int ret; + id = acpi_match_device(adc1x8s102_acpi_ids, &spi->dev); + + if (id) { + const struct adc1x8s102_spi_info *info = + (struct adc1x8s102_spi_info *)id->driver_data; + + if (!info) + return -ENODEV; + + if (info->setup) + info->setup(spi); + } + if (NULL == indio_dev) { dev_crit(&spi->dev, "Cannot allocate memory for indio_dev\n"); return -ENOMEM; @@ -274,10 +327,13 @@ static int adc1x8s102_probe(struct spi_device *spi) st = iio_priv(indio_dev); if (NULL == pdata) { - dev_err(&spi->dev, "Cannot get adc1x8s102 platform data\n"); - return -EFAULT; + dev_warn(&spi->dev, "Cannot get adc1x8s102 platform data\n"); + /* FIXME: make this ACPI-dependent */ + st->ext_vin = 5000; + } + else { + st->ext_vin = pdata->ext_vin; } - st->ext_vin = pdata->ext_vin; /* Use regulator, if available. */ st->reg = regulator_get(&spi->dev, "vref"); @@ -297,7 +353,7 @@ static int adc1x8s102_probe(struct spi_device *spi) spi_set_drvdata(spi, indio_dev); st->spi = spi; - indio_dev->name = spi_get_device_id(spi)->name; + indio_dev->name = spi->modalias; indio_dev->dev.parent = &spi->dev; indio_dev->modes = INDIO_DIRECT_MODE; indio_dev->channels = adc1x8s102_channels; @@ -365,20 +421,14 @@ static int adc1x8s102_remove(struct spi_device *spi) } -static const struct spi_device_id adc1x8s102_id[] = { - {"adc1x8s102", 0}, - {} -}; -MODULE_DEVICE_TABLE(spi, adc1x8s102_id); - static struct spi_driver adc1x8s102_driver = { .driver = { - .name = "adc1x8s102", + .name = "adc1x8s102", .owner = THIS_MODULE, + .acpi_match_table = ACPI_PTR(adc1x8s102_acpi_ids), }, .probe = adc1x8s102_probe, .remove = adc1x8s102_remove, - .id_table = adc1x8s102_id, }; module_spi_driver(adc1x8s102_driver); -- 2.5.0 -- _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto