root/drivers/gpio/gpio-max7301.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. max7301_spi_write
  2. max7301_spi_read
  3. max7301_probe
  4. max7301_remove
  5. max7301_init
  6. max7301_exit

   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 */
  19 static 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 
  30 static 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 
  44 static 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 
  67 static int max7301_remove(struct spi_device *spi)
  68 {
  69         return __max730x_remove(&spi->dev);
  70 }
  71 
  72 static const struct spi_device_id max7301_id[] = {
  73         { "max7301", 0 },
  74         { }
  75 };
  76 MODULE_DEVICE_TABLE(spi, max7301_id);
  77 
  78 static 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 
  87 static 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  */
  94 subsys_initcall(max7301_init);
  95 
  96 static void __exit max7301_exit(void)
  97 {
  98         spi_unregister_driver(&max7301_driver);
  99 }
 100 module_exit(max7301_exit);
 101 
 102 MODULE_AUTHOR("Juergen Beisert, Wolfram Sang");
 103 MODULE_LICENSE("GPL v2");
 104 MODULE_DESCRIPTION("MAX7301 GPIO-Expander");

/* [<][>][^][v][top][bottom][index][help] */