2019-05-24 12:04:09 +02:00
// SPDX-License-Identifier: GPL-2.0-or-later
2010-06-25 08:44:10 -07:00
/*
* ADLX345 / 346 Three - Axis Digital Accelerometers ( I2C Interface )
*
* Enter bugs at http : //blackfin.uclinux.org/
*
* Copyright ( C ) 2009 Michael Hennerich , Analog Devices Inc .
*/
# include <linux/input.h> /* BUS_I2C */
# include <linux/i2c.h>
# include <linux/module.h>
2015-05-21 16:07:37 -07:00
# include <linux/of.h>
2010-06-25 08:44:10 -07:00
# include <linux/types.h>
2011-02-11 08:51:52 -08:00
# include <linux/pm.h>
2010-06-25 08:44:10 -07:00
# include "adxl34x.h"
static int adxl34x_smbus_read ( struct device * dev , unsigned char reg )
{
struct i2c_client * client = to_i2c_client ( dev ) ;
return i2c_smbus_read_byte_data ( client , reg ) ;
}
static int adxl34x_smbus_write ( struct device * dev ,
unsigned char reg , unsigned char val )
{
struct i2c_client * client = to_i2c_client ( dev ) ;
return i2c_smbus_write_byte_data ( client , reg , val ) ;
}
static int adxl34x_smbus_read_block ( struct device * dev ,
unsigned char reg , int count ,
void * buf )
{
struct i2c_client * client = to_i2c_client ( dev ) ;
return i2c_smbus_read_i2c_block_data ( client , reg , count , buf ) ;
}
static int adxl34x_i2c_read_block ( struct device * dev ,
unsigned char reg , int count ,
void * buf )
{
struct i2c_client * client = to_i2c_client ( dev ) ;
int ret ;
ret = i2c_master_send ( client , & reg , 1 ) ;
if ( ret < 0 )
return ret ;
ret = i2c_master_recv ( client , buf , count ) ;
if ( ret < 0 )
return ret ;
if ( ret ! = count )
return - EIO ;
return 0 ;
}
2010-07-01 09:07:33 -07:00
static const struct adxl34x_bus_ops adxl34x_smbus_bops = {
2010-06-25 08:44:10 -07:00
. bustype = BUS_I2C ,
. write = adxl34x_smbus_write ,
. read = adxl34x_smbus_read ,
. read_block = adxl34x_smbus_read_block ,
} ;
2010-07-01 09:07:33 -07:00
static const struct adxl34x_bus_ops adxl34x_i2c_bops = {
2010-06-25 08:44:10 -07:00
. bustype = BUS_I2C ,
. write = adxl34x_smbus_write ,
. read = adxl34x_smbus_read ,
. read_block = adxl34x_i2c_read_block ,
} ;
2022-11-18 23:39:01 +01:00
static int adxl34x_i2c_probe ( struct i2c_client * client )
2010-06-25 08:44:10 -07:00
{
struct adxl34x * ac ;
int error ;
error = i2c_check_functionality ( client - > adapter ,
I2C_FUNC_SMBUS_BYTE_DATA ) ;
if ( ! error ) {
dev_err ( & client - > dev , " SMBUS Byte Data not Supported \n " ) ;
return - EIO ;
}
ac = adxl34x_probe ( & client - > dev , client - > irq , false ,
i2c_check_functionality ( client - > adapter ,
I2C_FUNC_SMBUS_READ_I2C_BLOCK ) ?
2010-07-01 09:07:33 -07:00
& adxl34x_smbus_bops : & adxl34x_i2c_bops ) ;
2010-06-25 08:44:10 -07:00
if ( IS_ERR ( ac ) )
return PTR_ERR ( ac ) ;
i2c_set_clientdata ( client , ac ) ;
return 0 ;
}
2022-08-15 10:02:30 +02:00
static void adxl34x_i2c_remove ( struct i2c_client * client )
2010-06-25 08:44:10 -07:00
{
struct adxl34x * ac = i2c_get_clientdata ( client ) ;
2021-10-12 19:37:44 -07:00
adxl34x_remove ( ac ) ;
2010-06-25 08:44:10 -07:00
}
static const struct i2c_device_id adxl34x_id [ ] = {
{ " adxl34x " , 0 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( i2c , adxl34x_id ) ;
2015-05-21 16:07:37 -07:00
static const struct of_device_id adxl34x_of_id [ ] = {
/*
* The ADXL346 is backward - compatible with the ADXL345 . Differences are
* handled by runtime detection of the device model , there ' s thus no
* need for listing the " adi,adxl346 " compatible value explicitly .
*/
{ . compatible = " adi,adxl345 " , } ,
/*
* Deprecated , DT nodes should use one or more of the device - specific
* compatible values " adi,adxl345 " and " adi,adxl346 " .
*/
{ . compatible = " adi,adxl34x " , } ,
{ }
} ;
MODULE_DEVICE_TABLE ( of , adxl34x_of_id ) ;
2010-06-25 08:44:10 -07:00
static struct i2c_driver adxl34x_driver = {
. driver = {
. name = " adxl34x " ,
2023-01-14 17:16:12 +00:00
. pm = pm_sleep_ptr ( & adxl34x_pm ) ,
2017-01-03 11:51:48 -08:00
. of_match_table = adxl34x_of_id ,
2010-06-25 08:44:10 -07:00
} ,
2022-11-18 23:39:01 +01:00
. probe_new = adxl34x_i2c_probe ,
2012-11-23 21:27:39 -08:00
. remove = adxl34x_i2c_remove ,
2010-06-25 08:44:10 -07:00
. id_table = adxl34x_id ,
} ;
2012-03-16 23:05:41 -07:00
module_i2c_driver ( adxl34x_driver ) ;
2010-06-25 08:44:10 -07:00
MODULE_AUTHOR ( " Michael Hennerich <hennerich@blackfin.uclinux.org> " ) ;
MODULE_DESCRIPTION ( " ADXL345/346 Three-Axis Digital Accelerometer I2C Bus Driver " ) ;
MODULE_LICENSE ( " GPL " ) ;