1 /* 2 * Copyright (C) 2009 Wolfram Sang, Pengutronix 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * Check max730x.c for further details. 9 */ 10 11 #include <linux/module.h> 12 #include <linux/init.h> 13 #include <linux/platform_device.h> 14 #include <linux/mutex.h> 15 #include <linux/i2c.h> 16 #include <linux/spi/max7301.h> 17 #include <linux/slab.h> 18 19 static int max7300_i2c_write(struct device *dev, unsigned int reg, 20 unsigned int val) 21 { 22 struct i2c_client *client = to_i2c_client(dev); 23 24 return i2c_smbus_write_byte_data(client, reg, val); 25 } 26 27 static int max7300_i2c_read(struct device *dev, unsigned int reg) 28 { 29 struct i2c_client *client = to_i2c_client(dev); 30 31 return i2c_smbus_read_byte_data(client, reg); 32 } 33 34 static int max7300_probe(struct i2c_client *client, 35 const struct i2c_device_id *id) 36 { 37 struct max7301 *ts; 38 int ret; 39 40 if (!i2c_check_functionality(client->adapter, 41 I2C_FUNC_SMBUS_BYTE_DATA)) 42 return -EIO; 43 44 ts = kzalloc(sizeof(struct max7301), GFP_KERNEL); 45 if (!ts) 46 return -ENOMEM; 47 48 ts->read = max7300_i2c_read; 49 ts->write = max7300_i2c_write; 50 ts->dev = &client->dev; 51 52 ret = __max730x_probe(ts); 53 if (ret) 54 kfree(ts); 55 return ret; 56 } 57 58 static int max7300_remove(struct i2c_client *client) 59 { 60 return __max730x_remove(&client->dev); 61 } 62 63 static const struct i2c_device_id max7300_id[] = { 64 { "max7300", 0 }, 65 { } 66 }; 67 MODULE_DEVICE_TABLE(i2c, max7300_id); 68 69 static struct i2c_driver max7300_driver = { 70 .driver = { 71 .name = "max7300", 72 .owner = THIS_MODULE, 73 }, 74 .probe = max7300_probe, 75 .remove = max7300_remove, 76 .id_table = max7300_id, 77 }; 78 79 static int __init max7300_init(void) 80 { 81 return i2c_add_driver(&max7300_driver); 82 } 83 subsys_initcall(max7300_init); 84 85 static void __exit max7300_exit(void) 86 { 87 i2c_del_driver(&max7300_driver); 88 } 89 module_exit(max7300_exit); 90 91 MODULE_AUTHOR("Wolfram Sang"); 92 MODULE_LICENSE("GPL v2"); 93 MODULE_DESCRIPTION("MAX7300 GPIO-Expander"); 94