linux/drivers/iio/adc/ad7606_par.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 * AD7606 Parallel Interface ADC driver
   4 *
   5 * Copyright 2011 Analog Devices Inc.
   6 */
   7
   8#include <linux/module.h>
   9#include <linux/platform_device.h>
  10#include <linux/types.h>
  11#include <linux/err.h>
  12#include <linux/io.h>
  13
  14#include <linux/iio/iio.h>
  15#include "ad7606.h"
  16
  17static int ad7606_par16_read_block(struct device *dev,
  18                                   int count, void *buf)
  19{
  20        struct iio_dev *indio_dev = dev_get_drvdata(dev);
  21        struct ad7606_state *st = iio_priv(indio_dev);
  22
  23        insw((unsigned long)st->base_address, buf, count);
  24
  25        return 0;
  26}
  27
  28static const struct ad7606_bus_ops ad7606_par16_bops = {
  29        .read_block = ad7606_par16_read_block,
  30};
  31
  32static int ad7606_par8_read_block(struct device *dev,
  33                                  int count, void *buf)
  34{
  35        struct iio_dev *indio_dev = dev_get_drvdata(dev);
  36        struct ad7606_state *st = iio_priv(indio_dev);
  37
  38        insb((unsigned long)st->base_address, buf, count * 2);
  39
  40        return 0;
  41}
  42
  43static const struct ad7606_bus_ops ad7606_par8_bops = {
  44        .read_block = ad7606_par8_read_block,
  45};
  46
  47static int ad7606_par_probe(struct platform_device *pdev)
  48{
  49        const struct platform_device_id *id = platform_get_device_id(pdev);
  50        struct resource *res;
  51        void __iomem *addr;
  52        resource_size_t remap_size;
  53        int irq;
  54
  55        irq = platform_get_irq(pdev, 0);
  56        if (irq < 0)
  57                return irq;
  58
  59        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  60        addr = devm_ioremap_resource(&pdev->dev, res);
  61        if (IS_ERR(addr))
  62                return PTR_ERR(addr);
  63
  64        remap_size = resource_size(res);
  65
  66        return ad7606_probe(&pdev->dev, irq, addr,
  67                            id->name, id->driver_data,
  68                            remap_size > 1 ? &ad7606_par16_bops :
  69                            &ad7606_par8_bops);
  70}
  71
  72static const struct platform_device_id ad7606_driver_ids[] = {
  73        { .name = "ad7605-4", .driver_data = ID_AD7605_4, },
  74        { .name = "ad7606-4", .driver_data = ID_AD7606_4, },
  75        { .name = "ad7606-6", .driver_data = ID_AD7606_6, },
  76        { .name = "ad7606-8", .driver_data = ID_AD7606_8, },
  77        { }
  78};
  79MODULE_DEVICE_TABLE(platform, ad7606_driver_ids);
  80
  81static const struct of_device_id ad7606_of_match[] = {
  82        { .compatible = "adi,ad7605-4" },
  83        { .compatible = "adi,ad7606-4" },
  84        { .compatible = "adi,ad7606-6" },
  85        { .compatible = "adi,ad7606-8" },
  86        { },
  87};
  88MODULE_DEVICE_TABLE(of, ad7606_of_match);
  89
  90static struct platform_driver ad7606_driver = {
  91        .probe = ad7606_par_probe,
  92        .id_table = ad7606_driver_ids,
  93        .driver = {
  94                .name = "ad7606",
  95                .pm = AD7606_PM_OPS,
  96                .of_match_table = ad7606_of_match,
  97        },
  98};
  99module_platform_driver(ad7606_driver);
 100
 101MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
 102MODULE_DESCRIPTION("Analog Devices AD7606 ADC");
 103MODULE_LICENSE("GPL v2");
 104