PageRenderTime 99ms CodeModel.GetById 49ms app.highlight 5ms RepoModel.GetById 19ms app.codeStats 0ms

/drivers/input/misc/ad714x-spi.c

https://bitbucket.org/ndreys/linux-sunxi
C | 102 lines | 75 code | 20 blank | 7 comment | 1 complexity | 28b9a18e4c68d94fabbb118d4aa080b2 MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.0, AGPL-1.0
  1/*
  2 * AD714X CapTouch Programmable Controller driver (SPI bus)
  3 *
  4 * Copyright 2009 Analog Devices Inc.
  5 *
  6 * Licensed under the GPL-2 or later.
  7 */
  8
  9#include <linux/input.h>	/* BUS_I2C */
 10#include <linux/module.h>
 11#include <linux/spi/spi.h>
 12#include <linux/pm.h>
 13#include <linux/types.h>
 14#include "ad714x.h"
 15
 16#define AD714x_SPI_CMD_PREFIX      0xE000   /* bits 15:11 */
 17#define AD714x_SPI_READ            BIT(10)
 18
 19#ifdef CONFIG_PM
 20static int ad714x_spi_suspend(struct device *dev)
 21{
 22	return ad714x_disable(spi_get_drvdata(to_spi_device(dev)));
 23}
 24
 25static int ad714x_spi_resume(struct device *dev)
 26{
 27	return ad714x_enable(spi_get_drvdata(to_spi_device(dev)));
 28}
 29#endif
 30
 31static SIMPLE_DEV_PM_OPS(ad714x_spi_pm, ad714x_spi_suspend, ad714x_spi_resume);
 32
 33static int ad714x_spi_read(struct device *dev, unsigned short reg,
 34		unsigned short *data)
 35{
 36	struct spi_device *spi = to_spi_device(dev);
 37	unsigned short tx = AD714x_SPI_CMD_PREFIX | AD714x_SPI_READ | reg;
 38
 39	return spi_write_then_read(spi, (u8 *)&tx, 2, (u8 *)data, 2);
 40}
 41
 42static int ad714x_spi_write(struct device *dev, unsigned short reg,
 43		unsigned short data)
 44{
 45	struct spi_device *spi = to_spi_device(dev);
 46	unsigned short tx[2] = {
 47		AD714x_SPI_CMD_PREFIX | reg,
 48		data
 49	};
 50
 51	return spi_write(spi, (u8 *)tx, 4);
 52}
 53
 54static int __devinit ad714x_spi_probe(struct spi_device *spi)
 55{
 56	struct ad714x_chip *chip;
 57
 58	chip = ad714x_probe(&spi->dev, BUS_SPI, spi->irq,
 59			    ad714x_spi_read, ad714x_spi_write);
 60	if (IS_ERR(chip))
 61		return PTR_ERR(chip);
 62
 63	spi_set_drvdata(spi, chip);
 64
 65	return 0;
 66}
 67
 68static int __devexit ad714x_spi_remove(struct spi_device *spi)
 69{
 70	struct ad714x_chip *chip = spi_get_drvdata(spi);
 71
 72	ad714x_remove(chip);
 73	spi_set_drvdata(spi, NULL);
 74
 75	return 0;
 76}
 77
 78static struct spi_driver ad714x_spi_driver = {
 79	.driver = {
 80		.name	= "ad714x_captouch",
 81		.owner	= THIS_MODULE,
 82		.pm	= &ad714x_spi_pm,
 83	},
 84	.probe		= ad714x_spi_probe,
 85	.remove		= __devexit_p(ad714x_spi_remove),
 86};
 87
 88static __init int ad714x_spi_init(void)
 89{
 90	return spi_register_driver(&ad714x_spi_driver);
 91}
 92module_init(ad714x_spi_init);
 93
 94static __exit void ad714x_spi_exit(void)
 95{
 96	spi_unregister_driver(&ad714x_spi_driver);
 97}
 98module_exit(ad714x_spi_exit);
 99
100MODULE_DESCRIPTION("Analog Devices AD714X Capacitance Touch Sensor SPI Bus Driver");
101MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>");
102MODULE_LICENSE("GPL");