1 /* 2 * TSC2005 touchscreen driver 3 * 4 * Copyright (C) 2006-2010 Nokia Corporation 5 * Copyright (C) 2015 QWERTY Embedded Design 6 * Copyright (C) 2015 EMAC Inc. 7 * 8 * Based on original tsc2005.c by Lauri Leukkunen <lauri.leukkunen@nokia.com> 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or 13 * (at your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU General Public License for more details. 19 */ 20 21 #include <linux/module.h> 22 #include <linux/input.h> 23 #include <linux/spi/spi.h> 24 #include <linux/regmap.h> 25 #include "tsc200x-core.h" 26 27 static int tsc2005_cmd(struct device *dev, u8 cmd) 28 { 29 u8 tx = TSC200X_CMD | TSC200X_CMD_12BIT | cmd; 30 struct spi_transfer xfer = { 31 .tx_buf = &tx, 32 .len = 1, 33 .bits_per_word = 8, 34 }; 35 struct spi_message msg; 36 struct spi_device *spi = to_spi_device(dev); 37 int error; 38 39 spi_message_init(&msg); 40 spi_message_add_tail(&xfer, &msg); 41 42 error = spi_sync(spi, &msg); 43 if (error) { 44 dev_err(dev, "%s: failed, command: %x, spi error: %d\n", 45 __func__, cmd, error); 46 return error; 47 } 48 49 return 0; 50 } 51 52 static int tsc2005_probe(struct spi_device *spi) 53 { 54 int error; 55 56 spi->mode = SPI_MODE_0; 57 spi->bits_per_word = 8; 58 if (!spi->max_speed_hz) 59 spi->max_speed_hz = TSC2005_SPI_MAX_SPEED_HZ; 60 61 error = spi_setup(spi); 62 if (error) 63 return error; 64 65 return tsc200x_probe(&spi->dev, spi->irq, BUS_SPI, 66 devm_regmap_init_spi(spi, &tsc200x_regmap_config), 67 tsc2005_cmd); 68 } 69 70 static int tsc2005_remove(struct spi_device *spi) 71 { 72 return tsc200x_remove(&spi->dev); 73 } 74 75 static struct spi_driver tsc2005_driver = { 76 .driver = { 77 .name = "tsc2005", 78 .pm = &tsc200x_pm_ops, 79 }, 80 .probe = tsc2005_probe, 81 .remove = tsc2005_remove, 82 }; 83 module_spi_driver(tsc2005_driver); 84 85 MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>"); 86 MODULE_DESCRIPTION("TSC2005 Touchscreen Driver"); 87 MODULE_LICENSE("GPL"); 88 MODULE_ALIAS("spi:tsc2005"); 89