2010-03-22 09:23:24 +03:00
/*
* AD714X CapTouch Programmable Controller driver ( SPI bus )
*
2011-08-22 20:45:42 +04:00
* Copyright 2009 - 2011 Analog Devices Inc .
2010-03-22 09:23:24 +03:00
*
* Licensed under the GPL - 2 or later .
*/
2011-08-22 08:04:12 +04:00
# include <linux/input.h> /* BUS_SPI */
2010-03-22 09:23:24 +03:00
# include <linux/module.h>
# include <linux/spi/spi.h>
2011-02-11 19:49:37 +03:00
# include <linux/pm.h>
2010-03-22 09:23:24 +03:00
# include <linux/types.h>
# include "ad714x.h"
# define AD714x_SPI_CMD_PREFIX 0xE000 /* bits 15:11 */
# define AD714x_SPI_READ BIT(10)
2013-03-27 08:38:52 +04:00
# ifdef CONFIG_PM_SLEEP
2011-02-11 19:49:37 +03:00
static int ad714x_spi_suspend ( struct device * dev )
2010-03-22 09:23:24 +03:00
{
2011-02-11 19:49:37 +03:00
return ad714x_disable ( spi_get_drvdata ( to_spi_device ( dev ) ) ) ;
2010-03-22 09:23:24 +03:00
}
2011-02-11 19:49:37 +03:00
static int ad714x_spi_resume ( struct device * dev )
2010-03-22 09:23:24 +03:00
{
2011-02-11 19:49:37 +03:00
return ad714x_enable ( spi_get_drvdata ( to_spi_device ( dev ) ) ) ;
2010-03-22 09:23:24 +03:00
}
# endif
2011-02-11 19:49:37 +03:00
static SIMPLE_DEV_PM_OPS ( ad714x_spi_pm , ad714x_spi_suspend , ad714x_spi_resume ) ;
2011-08-22 20:45:39 +04:00
static int ad714x_spi_read ( struct ad714x_chip * chip ,
2011-08-22 20:45:42 +04:00
unsigned short reg , unsigned short * data , size_t len )
2010-03-22 09:23:24 +03:00
{
2011-08-22 20:45:39 +04:00
struct spi_device * spi = to_spi_device ( chip - > dev ) ;
struct spi_message message ;
struct spi_transfer xfer [ 2 ] ;
2011-08-22 20:45:42 +04:00
int i ;
2011-08-22 20:45:39 +04:00
int error ;
spi_message_init ( & message ) ;
memset ( xfer , 0 , sizeof ( xfer ) ) ;
chip - > xfer_buf [ 0 ] = cpu_to_be16 ( AD714x_SPI_CMD_PREFIX |
2011-08-22 08:04:12 +04:00
AD714x_SPI_READ | reg ) ;
2011-08-22 20:45:39 +04:00
xfer [ 0 ] . tx_buf = & chip - > xfer_buf [ 0 ] ;
xfer [ 0 ] . len = sizeof ( chip - > xfer_buf [ 0 ] ) ;
spi_message_add_tail ( & xfer [ 0 ] , & message ) ;
2010-03-22 09:23:24 +03:00
2011-08-22 20:45:39 +04:00
xfer [ 1 ] . rx_buf = & chip - > xfer_buf [ 1 ] ;
2011-08-22 20:45:42 +04:00
xfer [ 1 ] . len = sizeof ( chip - > xfer_buf [ 1 ] ) * len ;
2011-08-22 20:45:39 +04:00
spi_message_add_tail ( & xfer [ 1 ] , & message ) ;
2011-08-22 08:04:12 +04:00
2011-08-22 20:45:39 +04:00
error = spi_sync ( spi , & message ) ;
if ( unlikely ( error ) ) {
dev_err ( chip - > dev , " SPI read error: %d \n " , error ) ;
return error ;
}
2011-08-22 08:04:12 +04:00
2011-08-22 20:45:42 +04:00
for ( i = 0 ; i < len ; i + + )
data [ i ] = be16_to_cpu ( chip - > xfer_buf [ i + 1 ] ) ;
2011-08-22 20:45:39 +04:00
return 0 ;
2010-03-22 09:23:24 +03:00
}
2011-08-22 20:45:39 +04:00
static int ad714x_spi_write ( struct ad714x_chip * chip ,
2011-08-22 08:04:12 +04:00
unsigned short reg , unsigned short data )
2010-03-22 09:23:24 +03:00
{
2011-08-22 20:45:39 +04:00
struct spi_device * spi = to_spi_device ( chip - > dev ) ;
int error ;
chip - > xfer_buf [ 0 ] = cpu_to_be16 ( AD714x_SPI_CMD_PREFIX | reg ) ;
chip - > xfer_buf [ 1 ] = cpu_to_be16 ( data ) ;
error = spi_write ( spi , ( u8 * ) chip - > xfer_buf ,
2 * sizeof ( * chip - > xfer_buf ) ) ;
if ( unlikely ( error ) ) {
dev_err ( chip - > dev , " SPI write error: %d \n " , error ) ;
return error ;
}
2010-03-22 09:23:24 +03:00
2011-08-22 20:45:39 +04:00
return 0 ;
2010-03-22 09:23:24 +03:00
}
2012-11-24 09:38:25 +04:00
static int ad714x_spi_probe ( struct spi_device * spi )
2010-03-22 09:23:24 +03:00
{
struct ad714x_chip * chip ;
2011-08-22 08:04:12 +04:00
int err ;
spi - > bits_per_word = 8 ;
err = spi_setup ( spi ) ;
if ( err < 0 )
return err ;
2010-03-22 09:23:24 +03:00
chip = ad714x_probe ( & spi - > dev , BUS_SPI , spi - > irq ,
ad714x_spi_read , ad714x_spi_write ) ;
if ( IS_ERR ( chip ) )
return PTR_ERR ( chip ) ;
spi_set_drvdata ( spi , chip ) ;
return 0 ;
}
2012-11-24 09:50:47 +04:00
static int ad714x_spi_remove ( struct spi_device * spi )
2010-03-22 09:23:24 +03:00
{
struct ad714x_chip * chip = spi_get_drvdata ( spi ) ;
ad714x_remove ( chip ) ;
return 0 ;
}
static struct spi_driver ad714x_spi_driver = {
. driver = {
. name = " ad714x_captouch " ,
. owner = THIS_MODULE ,
2011-02-11 19:49:37 +03:00
. pm = & ad714x_spi_pm ,
2010-03-22 09:23:24 +03:00
} ,
. probe = ad714x_spi_probe ,
2012-11-24 09:27:39 +04:00
. remove = ad714x_spi_remove ,
2010-03-22 09:23:24 +03:00
} ;
2012-03-17 10:05:26 +04:00
module_spi_driver ( ad714x_spi_driver ) ;
2010-03-22 09:23:24 +03:00
MODULE_DESCRIPTION ( " Analog Devices AD714X Capacitance Touch Sensor SPI Bus Driver " ) ;
MODULE_AUTHOR ( " Barry Song <21cnbao@gmail.com> " ) ;
MODULE_LICENSE ( " GPL " ) ;