Blame view

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