Path: blob/master/drivers/input/misc/adxl34x-i2c.c
15111 views
/*1* ADLX345/346 Three-Axis Digital Accelerometers (I2C Interface)2*3* Enter bugs at http://blackfin.uclinux.org/4*5* Copyright (C) 2009 Michael Hennerich, Analog Devices Inc.6* Licensed under the GPL-2 or later.7*/89#include <linux/input.h> /* BUS_I2C */10#include <linux/i2c.h>11#include <linux/module.h>12#include <linux/types.h>13#include <linux/pm.h>14#include "adxl34x.h"1516static int adxl34x_smbus_read(struct device *dev, unsigned char reg)17{18struct i2c_client *client = to_i2c_client(dev);1920return i2c_smbus_read_byte_data(client, reg);21}2223static int adxl34x_smbus_write(struct device *dev,24unsigned char reg, unsigned char val)25{26struct i2c_client *client = to_i2c_client(dev);2728return i2c_smbus_write_byte_data(client, reg, val);29}3031static int adxl34x_smbus_read_block(struct device *dev,32unsigned char reg, int count,33void *buf)34{35struct i2c_client *client = to_i2c_client(dev);3637return i2c_smbus_read_i2c_block_data(client, reg, count, buf);38}3940static int adxl34x_i2c_read_block(struct device *dev,41unsigned char reg, int count,42void *buf)43{44struct i2c_client *client = to_i2c_client(dev);45int ret;4647ret = i2c_master_send(client, ®, 1);48if (ret < 0)49return ret;5051ret = i2c_master_recv(client, buf, count);52if (ret < 0)53return ret;5455if (ret != count)56return -EIO;5758return 0;59}6061static const struct adxl34x_bus_ops adxl34x_smbus_bops = {62.bustype = BUS_I2C,63.write = adxl34x_smbus_write,64.read = adxl34x_smbus_read,65.read_block = adxl34x_smbus_read_block,66};6768static const struct adxl34x_bus_ops adxl34x_i2c_bops = {69.bustype = BUS_I2C,70.write = adxl34x_smbus_write,71.read = adxl34x_smbus_read,72.read_block = adxl34x_i2c_read_block,73};7475static int __devinit adxl34x_i2c_probe(struct i2c_client *client,76const struct i2c_device_id *id)77{78struct adxl34x *ac;79int error;8081error = i2c_check_functionality(client->adapter,82I2C_FUNC_SMBUS_BYTE_DATA);83if (!error) {84dev_err(&client->dev, "SMBUS Byte Data not Supported\n");85return -EIO;86}8788ac = adxl34x_probe(&client->dev, client->irq, false,89i2c_check_functionality(client->adapter,90I2C_FUNC_SMBUS_READ_I2C_BLOCK) ?91&adxl34x_smbus_bops : &adxl34x_i2c_bops);92if (IS_ERR(ac))93return PTR_ERR(ac);9495i2c_set_clientdata(client, ac);9697return 0;98}99100static int __devexit adxl34x_i2c_remove(struct i2c_client *client)101{102struct adxl34x *ac = i2c_get_clientdata(client);103104return adxl34x_remove(ac);105}106107#ifdef CONFIG_PM108static int adxl34x_i2c_suspend(struct device *dev)109{110struct i2c_client *client = to_i2c_client(dev);111struct adxl34x *ac = i2c_get_clientdata(client);112113adxl34x_suspend(ac);114115return 0;116}117118static int adxl34x_i2c_resume(struct device *dev)119{120struct i2c_client *client = to_i2c_client(dev);121struct adxl34x *ac = i2c_get_clientdata(client);122123adxl34x_resume(ac);124125return 0;126}127#endif128129static SIMPLE_DEV_PM_OPS(adxl34x_i2c_pm, adxl34x_i2c_suspend,130adxl34x_i2c_resume);131132static const struct i2c_device_id adxl34x_id[] = {133{ "adxl34x", 0 },134{ }135};136137MODULE_DEVICE_TABLE(i2c, adxl34x_id);138139static struct i2c_driver adxl34x_driver = {140.driver = {141.name = "adxl34x",142.owner = THIS_MODULE,143.pm = &adxl34x_i2c_pm,144},145.probe = adxl34x_i2c_probe,146.remove = __devexit_p(adxl34x_i2c_remove),147.id_table = adxl34x_id,148};149150static int __init adxl34x_i2c_init(void)151{152return i2c_add_driver(&adxl34x_driver);153}154module_init(adxl34x_i2c_init);155156static void __exit adxl34x_i2c_exit(void)157{158i2c_del_driver(&adxl34x_driver);159}160module_exit(adxl34x_i2c_exit);161162MODULE_AUTHOR("Michael Hennerich <[email protected]>");163MODULE_DESCRIPTION("ADXL345/346 Three-Axis Digital Accelerometer I2C Bus Driver");164MODULE_LICENSE("GPL");165166167