1/* 2 * drivers/gpio/max7301.c 3 * 4 * Copyright (C) 2006 Juergen Beisert, Pengutronix 5 * Copyright (C) 2008 Guennadi Liakhovetski, Pengutronix 6 * Copyright (C) 2009 Wolfram Sang, Pengutronix 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 * 12 * Check max730x.c for further details. 13 */ 14 15#include <linux/module.h> 16#include <linux/init.h> 17#include <linux/platform_device.h> 18#include <linux/mutex.h> 19#include <linux/slab.h> 20#include <linux/spi/spi.h> 21#include <linux/spi/max7301.h> 22 23/* A write to the MAX7301 means one message with one transfer */ 24static int max7301_spi_write(struct device *dev, unsigned int reg, 25 unsigned int val) 26{ 27 struct spi_device *spi = to_spi_device(dev); 28 u16 word = ((reg & 0x7F) << 8) | (val & 0xFF); 29 30 return spi_write(spi, (const u8 *)&word, sizeof(word)); 31} 32 33/* A read from the MAX7301 means two transfers; here, one message each */ 34 35static int max7301_spi_read(struct device *dev, unsigned int reg) 36{ 37 int ret; 38 u16 word; 39 struct spi_device *spi = to_spi_device(dev); 40 41 word = 0x8000 | (reg << 8); 42 ret = spi_write(spi, (const u8 *)&word, sizeof(word)); 43 if (ret) 44 return ret; 45 /* 46 * This relies on the fact, that a transfer with NULL tx_buf shifts out 47 * zero bytes (=NOOP for MAX7301) 48 */ 49 ret = spi_read(spi, (u8 *)&word, sizeof(word)); 50 if (ret) 51 return ret; 52 return word & 0xff; 53} 54 55static int __devinit max7301_probe(struct spi_device *spi) 56{ 57 struct max7301 *ts; 58 int ret; 59 60 /* bits_per_word cannot be configured in platform data */ 61 spi->bits_per_word = 16; 62 ret = spi_setup(spi); 63 if (ret < 0) 64 return ret; 65 66 ts = kzalloc(sizeof(struct max7301), GFP_KERNEL); 67 if (!ts) 68 return -ENOMEM; 69 70 ts->read = max7301_spi_read; 71 ts->write = max7301_spi_write; 72 ts->dev = &spi->dev; 73 74 ret = __max730x_probe(ts); 75 if (ret) 76 kfree(ts); 77 return ret; 78} 79 80static int __devexit max7301_remove(struct spi_device *spi) 81{ 82 return __max730x_remove(&spi->dev); 83} 84 85static const struct spi_device_id max7301_id[] = { 86 { "max7301", 0 }, 87 { } 88}; 89MODULE_DEVICE_TABLE(spi, max7301_id); 90 91static struct spi_driver max7301_driver = { 92 .driver = { 93 .name = "max7301", 94 .owner = THIS_MODULE, 95 }, 96 .probe = max7301_probe, 97 .remove = __devexit_p(max7301_remove), 98 .id_table = max7301_id, 99}; 100 101static int __init max7301_init(void) 102{ 103 return spi_register_driver(&max7301_driver); 104} 105/* register after spi postcore initcall and before 106 * subsys initcalls that may rely on these GPIOs 107 */ 108subsys_initcall(max7301_init); 109 110static void __exit max7301_exit(void) 111{ 112 spi_unregister_driver(&max7301_driver); 113} 114module_exit(max7301_exit); 115 116MODULE_AUTHOR("Juergen Beisert, Wolfram Sang"); 117MODULE_LICENSE("GPL v2"); 118MODULE_DESCRIPTION("MAX7301 GPIO-Expander"); 119