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 const struct input_id tsc2005_input_id = { 28 .bustype = BUS_SPI, 29 .product = 2005, 30 }; 31 32 static int tsc2005_cmd(struct device *dev, u8 cmd) 33 { 34 u8 tx = TSC200X_CMD | TSC200X_CMD_12BIT | cmd; 35 struct spi_transfer xfer = { 36 .tx_buf = &tx, 37 .len = 1, 38 .bits_per_word = 8, 39 }; 40 struct spi_message msg; 41 struct spi_device *spi = to_spi_device(dev); 42 int error; 43 44 spi_message_init(&msg); 45 spi_message_add_tail(&xfer, &msg); 46 47 error = spi_sync(spi, &msg); 48 if (error) { 49 dev_err(dev, "%s: failed, command: %x, spi error: %d\n", 50 __func__, cmd, error); 51 return error; 52 } 53 54 return 0; 55 } 56 57 static int tsc2005_probe(struct spi_device *spi) 58 { 59 int error; 60 61 spi->mode = SPI_MODE_0; 62 spi->bits_per_word = 8; 63 if (!spi->max_speed_hz) 64 spi->max_speed_hz = TSC2005_SPI_MAX_SPEED_HZ; 65 66 error = spi_setup(spi); 67 if (error) 68 return error; 69 70 return tsc200x_probe(&spi->dev, spi->irq, &tsc2005_input_id, 71 devm_regmap_init_spi(spi, &tsc200x_regmap_config), 72 tsc2005_cmd); 73 } 74 75 static int tsc2005_remove(struct spi_device *spi) 76 { 77 return tsc200x_remove(&spi->dev); 78 } 79 80 static struct spi_driver tsc2005_driver = { 81 .driver = { 82 .name = "tsc2005", 83 .pm = &tsc200x_pm_ops, 84 }, 85 .probe = tsc2005_probe, 86 .remove = tsc2005_remove, 87 }; 88 module_spi_driver(tsc2005_driver); 89 90 MODULE_AUTHOR("Michael Welling <mwelling@ieee.org>"); 91 MODULE_DESCRIPTION("TSC2005 Touchscreen Driver"); 92 MODULE_LICENSE("GPL"); 93 MODULE_ALIAS("spi:tsc2005"); 94