linux/drivers/gpio/gpio-max7301.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (C) 2006 Juergen Beisert, Pengutronix
   4 * Copyright (C) 2008 Guennadi Liakhovetski, Pengutronix
   5 * Copyright (C) 2009 Wolfram Sang, Pengutronix
   6 *
   7 * Check max730x.c for further details.
   8 */
   9
  10#include <linux/module.h>
  11#include <linux/init.h>
  12#include <linux/platform_device.h>
  13#include <linux/mutex.h>
  14#include <linux/slab.h>
  15#include <linux/spi/spi.h>
  16#include <linux/spi/max7301.h>
  17
  18/* A write to the MAX7301 means one message with one transfer */
  19static int max7301_spi_write(struct device *dev, unsigned int reg,
  20                                unsigned int val)
  21{
  22        struct spi_device *spi = to_spi_device(dev);
  23        u16 word = ((reg & 0x7F) << 8) | (val & 0xFF);
  24
  25        return spi_write_then_read(spi, &word, sizeof(word), NULL, 0);
  26}
  27
  28/* A read from the MAX7301 means two transfers; here, one message each */
  29
  30static int max7301_spi_read(struct device *dev, unsigned int reg)
  31{
  32        int ret;
  33        u16 word;
  34        struct spi_device *spi = to_spi_device(dev);
  35
  36        word = 0x8000 | (reg << 8);
  37        ret = spi_write_then_read(spi, &word, sizeof(word), &word,
  38                                  sizeof(word));
  39        if (ret)
  40                return ret;
  41        return word & 0xff;
  42}
  43
  44static int max7301_probe(struct spi_device *spi)
  45{
  46        struct max7301 *ts;
  47        int ret;
  48
  49        /* bits_per_word cannot be configured in platform data */
  50        spi->bits_per_word = 16;
  51        ret = spi_setup(spi);
  52        if (ret < 0)
  53                return ret;
  54
  55        ts = devm_kzalloc(&spi->dev, sizeof(struct max7301), GFP_KERNEL);
  56        if (!ts)
  57                return -ENOMEM;
  58
  59        ts->read = max7301_spi_read;
  60        ts->write = max7301_spi_write;
  61        ts->dev = &spi->dev;
  62
  63        ret = __max730x_probe(ts);
  64        return ret;
  65}
  66
  67static int max7301_remove(struct spi_device *spi)
  68{
  69        return __max730x_remove(&spi->dev);
  70}
  71
  72static const struct spi_device_id max7301_id[] = {
  73        { "max7301", 0 },
  74        { }
  75};
  76MODULE_DEVICE_TABLE(spi, max7301_id);
  77
  78static struct spi_driver max7301_driver = {
  79        .driver = {
  80                .name = "max7301",
  81        },
  82        .probe = max7301_probe,
  83        .remove = max7301_remove,
  84        .id_table = max7301_id,
  85};
  86
  87static int __init max7301_init(void)
  88{
  89        return spi_register_driver(&max7301_driver);
  90}
  91/* register after spi postcore initcall and before
  92 * subsys initcalls that may rely on these GPIOs
  93 */
  94subsys_initcall(max7301_init);
  95
  96static void __exit max7301_exit(void)
  97{
  98        spi_unregister_driver(&max7301_driver);
  99}
 100module_exit(max7301_exit);
 101
 102MODULE_AUTHOR("Juergen Beisert, Wolfram Sang");
 103MODULE_LICENSE("GPL v2");
 104MODULE_DESCRIPTION("MAX7301 GPIO-Expander");
 105