| /* |
| * 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"); |