| /* | |
| * AD7879/AD7889 touchscreen (SPI bus) | |
| * | |
| * Copyright (C) 2008-2010 Michael Hennerich, Analog Devices Inc. | |
| * | |
| * Licensed under the GPL-2 or later. | |
| */ | |
| #include <linux/input.h> /* BUS_SPI */ | |
| #include <linux/pm.h> | |
| #include <linux/spi/spi.h> | |
| #include <linux/module.h> | |
| #include <linux/of.h> | |
| #include <linux/regmap.h> | |
| #include "ad7879.h" | |
| #define AD7879_DEVID 0x7A /* AD7879/AD7889 */ | |
| #define MAX_SPI_FREQ_HZ 5000000 | |
| #define AD7879_CMD_MAGIC 0xE0 | |
| #define AD7879_CMD_READ BIT(2) | |
| static const struct regmap_config ad7879_spi_regmap_config = { | |
| .reg_bits = 16, | |
| .val_bits = 16, | |
| .max_register = 15, | |
| .read_flag_mask = AD7879_CMD_MAGIC | AD7879_CMD_READ, | |
| .write_flag_mask = AD7879_CMD_MAGIC, | |
| }; | |
| static int ad7879_spi_probe(struct spi_device *spi) | |
| { | |
| struct regmap *regmap; | |
| /* don't exceed max specified SPI CLK frequency */ | |
| if (spi->max_speed_hz > MAX_SPI_FREQ_HZ) { | |
| dev_err(&spi->dev, "SPI CLK %d Hz?\n", spi->max_speed_hz); | |
| return -EINVAL; | |
| } | |
| regmap = devm_regmap_init_spi(spi, &ad7879_spi_regmap_config); | |
| if (IS_ERR(regmap)) | |
| return PTR_ERR(regmap); | |
| return ad7879_probe(&spi->dev, regmap, spi->irq, BUS_SPI, AD7879_DEVID); | |
| } | |
| #ifdef CONFIG_OF | |
| static const struct of_device_id ad7879_spi_dt_ids[] = { | |
| { .compatible = "adi,ad7879", }, | |
| { } | |
| }; | |
| MODULE_DEVICE_TABLE(of, ad7879_spi_dt_ids); | |
| #endif | |
| static struct spi_driver ad7879_spi_driver = { | |
| .driver = { | |
| .name = "ad7879", | |
| .pm = &ad7879_pm_ops, | |
| .of_match_table = of_match_ptr(ad7879_spi_dt_ids), | |
| }, | |
| .probe = ad7879_spi_probe, | |
| }; | |
| module_spi_driver(ad7879_spi_driver); | |
| MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>"); | |
| MODULE_DESCRIPTION("AD7879(-1) touchscreen SPI bus driver"); | |
| MODULE_LICENSE("GPL"); | |
| MODULE_ALIAS("spi:ad7879"); |