1*80503b23SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-or-later 24397c98aSMike Frysinger /* 34397c98aSMike Frysinger * AD7879/AD7889 touchscreen (SPI bus) 44397c98aSMike Frysinger * 54397c98aSMike Frysinger * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. 64397c98aSMike Frysinger */ 74397c98aSMike Frysinger 84397c98aSMike Frysinger #include <linux/input.h> /* BUS_SPI */ 9c7848c8eSMark Brown #include <linux/pm.h> 104397c98aSMike Frysinger #include <linux/spi/spi.h> 11d2d8442dSPaul Gortmaker #include <linux/module.h> 12fa6e3ca2SStefan Agner #include <linux/of.h> 13404a24c3SDmitry Torokhov #include <linux/regmap.h> 144397c98aSMike Frysinger 154397c98aSMike Frysinger #include "ad7879.h" 164397c98aSMike Frysinger 174397c98aSMike Frysinger #define AD7879_DEVID 0x7A /* AD7879/AD7889 */ 184397c98aSMike Frysinger 194397c98aSMike Frysinger #define MAX_SPI_FREQ_HZ 5000000 204397c98aSMike Frysinger 21404a24c3SDmitry Torokhov #define AD7879_CMD_MAGIC 0xE0 22404a24c3SDmitry Torokhov #define AD7879_CMD_READ BIT(2) 234397c98aSMike Frysinger 24404a24c3SDmitry Torokhov static const struct regmap_config ad7879_spi_regmap_config = { 25404a24c3SDmitry Torokhov .reg_bits = 16, 26404a24c3SDmitry Torokhov .val_bits = 16, 27404a24c3SDmitry Torokhov .max_register = 15, 28404a24c3SDmitry Torokhov .read_flag_mask = AD7879_CMD_MAGIC | AD7879_CMD_READ, 29404a24c3SDmitry Torokhov .write_flag_mask = AD7879_CMD_MAGIC, 304397c98aSMike Frysinger }; 314397c98aSMike Frysinger 325298cc4cSBill Pemberton static int ad7879_spi_probe(struct spi_device *spi) 334397c98aSMike Frysinger { 34404a24c3SDmitry Torokhov struct regmap *regmap; 354397c98aSMike Frysinger 364397c98aSMike Frysinger /* don't exceed max specified SPI CLK frequency */ 374397c98aSMike Frysinger if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { 384397c98aSMike Frysinger dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz); 394397c98aSMike Frysinger return -EINVAL; 404397c98aSMike Frysinger } 414397c98aSMike Frysinger 42404a24c3SDmitry Torokhov regmap = devm_regmap_init_spi(spi, &ad7879_spi_regmap_config); 43404a24c3SDmitry Torokhov if (IS_ERR(regmap)) 44404a24c3SDmitry Torokhov return PTR_ERR(regmap); 45404a24c3SDmitry Torokhov 464e34025bSDmitry Torokhov return ad7879_probe(&spi->dev, regmap, spi->irq, BUS_SPI, AD7879_DEVID); 474397c98aSMike Frysinger } 484397c98aSMike Frysinger 49fa6e3ca2SStefan Agner #ifdef CONFIG_OF 50fa6e3ca2SStefan Agner static const struct of_device_id ad7879_spi_dt_ids[] = { 51fa6e3ca2SStefan Agner { .compatible = "adi,ad7879", }, 52fa6e3ca2SStefan Agner { } 53fa6e3ca2SStefan Agner }; 54fa6e3ca2SStefan Agner MODULE_DEVICE_TABLE(of, ad7879_spi_dt_ids); 55fa6e3ca2SStefan Agner #endif 56fa6e3ca2SStefan Agner 574397c98aSMike Frysinger static struct spi_driver ad7879_spi_driver = { 584397c98aSMike Frysinger .driver = { 594397c98aSMike Frysinger .name = "ad7879", 608672bd93SDmitry Torokhov .pm = &ad7879_pm_ops, 61fa6e3ca2SStefan Agner .of_match_table = of_match_ptr(ad7879_spi_dt_ids), 624397c98aSMike Frysinger }, 634397c98aSMike Frysinger .probe = ad7879_spi_probe, 644397c98aSMike Frysinger }; 654397c98aSMike Frysinger 66ca83922eSAxel Lin module_spi_driver(ad7879_spi_driver); 674397c98aSMike Frysinger 682581e5d1SMichael Hennerich MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); 694397c98aSMike Frysinger MODULE_DESCRIPTION("AD7879(-1) touchscreen SPI bus driver"); 704397c98aSMike Frysinger MODULE_LICENSE("GPL"); 714397c98aSMike Frysinger MODULE_ALIAS("spi:ad7879"); 72