1dd4cae8bSChristian Gmeiner /* 2021cbc1eSMartin Kepplinger * Microchip AR1020 and AR1021 driver for I2C 3dd4cae8bSChristian Gmeiner * 4dd4cae8bSChristian Gmeiner * Author: Christian Gmeiner <christian.gmeiner@gmail.com> 5dd4cae8bSChristian Gmeiner * 6dd4cae8bSChristian Gmeiner * License: GPLv2 as published by the FSF. 7dd4cae8bSChristian Gmeiner */ 8dd4cae8bSChristian Gmeiner 98a038b83SMartin Kepplinger #include <linux/bitops.h> 10dd4cae8bSChristian Gmeiner #include <linux/module.h> 11dd4cae8bSChristian Gmeiner #include <linux/input.h> 12dd4cae8bSChristian Gmeiner #include <linux/of.h> 13dd4cae8bSChristian Gmeiner #include <linux/i2c.h> 14dd4cae8bSChristian Gmeiner #include <linux/irq.h> 15dd4cae8bSChristian Gmeiner #include <linux/interrupt.h> 16dd4cae8bSChristian Gmeiner 17dd4cae8bSChristian Gmeiner #define AR1021_TOCUH_PKG_SIZE 5 18dd4cae8bSChristian Gmeiner 19dd4cae8bSChristian Gmeiner #define AR1021_MAX_X 4095 20dd4cae8bSChristian Gmeiner #define AR1021_MAX_Y 4095 21dd4cae8bSChristian Gmeiner 22e55057e8SMartin Kepplinger #define AR1021_CMD 0x55 23e55057e8SMartin Kepplinger 24e55057e8SMartin Kepplinger #define AR1021_CMD_ENABLE_TOUCH 0x12 25e55057e8SMartin Kepplinger 26dd4cae8bSChristian Gmeiner struct ar1021_i2c { 27dd4cae8bSChristian Gmeiner struct i2c_client *client; 28dd4cae8bSChristian Gmeiner struct input_dev *input; 29dd4cae8bSChristian Gmeiner u8 data[AR1021_TOCUH_PKG_SIZE]; 30dd4cae8bSChristian Gmeiner }; 31dd4cae8bSChristian Gmeiner 32dd4cae8bSChristian Gmeiner static irqreturn_t ar1021_i2c_irq(int irq, void *dev_id) 33dd4cae8bSChristian Gmeiner { 34dd4cae8bSChristian Gmeiner struct ar1021_i2c *ar1021 = dev_id; 35dd4cae8bSChristian Gmeiner struct input_dev *input = ar1021->input; 36dd4cae8bSChristian Gmeiner u8 *data = ar1021->data; 37dd4cae8bSChristian Gmeiner unsigned int x, y, button; 38dd4cae8bSChristian Gmeiner int retval; 39dd4cae8bSChristian Gmeiner 40dd4cae8bSChristian Gmeiner retval = i2c_master_recv(ar1021->client, 41dd4cae8bSChristian Gmeiner ar1021->data, sizeof(ar1021->data)); 42dd4cae8bSChristian Gmeiner if (retval != sizeof(ar1021->data)) 43dd4cae8bSChristian Gmeiner goto out; 44dd4cae8bSChristian Gmeiner 45dd4cae8bSChristian Gmeiner /* sync bit set ? */ 468a038b83SMartin Kepplinger if (!(data[0] & BIT(7))) 47dd4cae8bSChristian Gmeiner goto out; 48dd4cae8bSChristian Gmeiner 49dd4cae8bSChristian Gmeiner button = data[0] & BIT(0); 50dd4cae8bSChristian Gmeiner x = ((data[2] & 0x1f) << 7) | (data[1] & 0x7f); 51dd4cae8bSChristian Gmeiner y = ((data[4] & 0x1f) << 7) | (data[3] & 0x7f); 52dd4cae8bSChristian Gmeiner 53dd4cae8bSChristian Gmeiner input_report_abs(input, ABS_X, x); 54dd4cae8bSChristian Gmeiner input_report_abs(input, ABS_Y, y); 55dd4cae8bSChristian Gmeiner input_report_key(input, BTN_TOUCH, button); 56dd4cae8bSChristian Gmeiner input_sync(input); 57dd4cae8bSChristian Gmeiner 58dd4cae8bSChristian Gmeiner out: 59dd4cae8bSChristian Gmeiner return IRQ_HANDLED; 60dd4cae8bSChristian Gmeiner } 61dd4cae8bSChristian Gmeiner 62dd4cae8bSChristian Gmeiner static int ar1021_i2c_open(struct input_dev *dev) 63dd4cae8bSChristian Gmeiner { 64e55057e8SMartin Kepplinger static const u8 cmd_enable_touch[] = { 65e55057e8SMartin Kepplinger AR1021_CMD, 66e55057e8SMartin Kepplinger 0x01, /* number of bytes after this */ 67e55057e8SMartin Kepplinger AR1021_CMD_ENABLE_TOUCH 68e55057e8SMartin Kepplinger }; 69dd4cae8bSChristian Gmeiner struct ar1021_i2c *ar1021 = input_get_drvdata(dev); 70dd4cae8bSChristian Gmeiner struct i2c_client *client = ar1021->client; 71e55057e8SMartin Kepplinger int error; 72e55057e8SMartin Kepplinger 73e55057e8SMartin Kepplinger error = i2c_master_send(ar1021->client, cmd_enable_touch, 74e55057e8SMartin Kepplinger sizeof(cmd_enable_touch)); 75e55057e8SMartin Kepplinger if (error < 0) 76e55057e8SMartin Kepplinger return error; 77dd4cae8bSChristian Gmeiner 78dd4cae8bSChristian Gmeiner enable_irq(client->irq); 79dd4cae8bSChristian Gmeiner 80dd4cae8bSChristian Gmeiner return 0; 81dd4cae8bSChristian Gmeiner } 82dd4cae8bSChristian Gmeiner 83dd4cae8bSChristian Gmeiner static void ar1021_i2c_close(struct input_dev *dev) 84dd4cae8bSChristian Gmeiner { 85dd4cae8bSChristian Gmeiner struct ar1021_i2c *ar1021 = input_get_drvdata(dev); 86dd4cae8bSChristian Gmeiner struct i2c_client *client = ar1021->client; 87dd4cae8bSChristian Gmeiner 88dd4cae8bSChristian Gmeiner disable_irq(client->irq); 89dd4cae8bSChristian Gmeiner } 90dd4cae8bSChristian Gmeiner 91dd4cae8bSChristian Gmeiner static int ar1021_i2c_probe(struct i2c_client *client, 92dd4cae8bSChristian Gmeiner const struct i2c_device_id *id) 93dd4cae8bSChristian Gmeiner { 94dd4cae8bSChristian Gmeiner struct ar1021_i2c *ar1021; 95dd4cae8bSChristian Gmeiner struct input_dev *input; 96dd4cae8bSChristian Gmeiner int error; 97dd4cae8bSChristian Gmeiner 98dd4cae8bSChristian Gmeiner if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { 99dd4cae8bSChristian Gmeiner dev_err(&client->dev, "i2c_check_functionality error\n"); 100dd4cae8bSChristian Gmeiner return -ENXIO; 101dd4cae8bSChristian Gmeiner } 102dd4cae8bSChristian Gmeiner 103dd4cae8bSChristian Gmeiner ar1021 = devm_kzalloc(&client->dev, sizeof(*ar1021), GFP_KERNEL); 104dd4cae8bSChristian Gmeiner if (!ar1021) 105dd4cae8bSChristian Gmeiner return -ENOMEM; 106dd4cae8bSChristian Gmeiner 107dd4cae8bSChristian Gmeiner input = devm_input_allocate_device(&client->dev); 108dd4cae8bSChristian Gmeiner if (!input) 109dd4cae8bSChristian Gmeiner return -ENOMEM; 110dd4cae8bSChristian Gmeiner 111dd4cae8bSChristian Gmeiner ar1021->client = client; 112dd4cae8bSChristian Gmeiner ar1021->input = input; 113dd4cae8bSChristian Gmeiner 114dd4cae8bSChristian Gmeiner input->name = "ar1021 I2C Touchscreen"; 115dd4cae8bSChristian Gmeiner input->id.bustype = BUS_I2C; 116dd4cae8bSChristian Gmeiner input->dev.parent = &client->dev; 117dd4cae8bSChristian Gmeiner input->open = ar1021_i2c_open; 118dd4cae8bSChristian Gmeiner input->close = ar1021_i2c_close; 119dd4cae8bSChristian Gmeiner 120*53f0b7f0SMartin Kepplinger __set_bit(INPUT_PROP_DIRECT, input->propbit); 121dd4cae8bSChristian Gmeiner input_set_capability(input, EV_KEY, BTN_TOUCH); 122dd4cae8bSChristian Gmeiner input_set_abs_params(input, ABS_X, 0, AR1021_MAX_X, 0, 0); 123dd4cae8bSChristian Gmeiner input_set_abs_params(input, ABS_Y, 0, AR1021_MAX_Y, 0, 0); 124dd4cae8bSChristian Gmeiner 125dd4cae8bSChristian Gmeiner input_set_drvdata(input, ar1021); 126dd4cae8bSChristian Gmeiner 127dd4cae8bSChristian Gmeiner error = devm_request_threaded_irq(&client->dev, client->irq, 128dd4cae8bSChristian Gmeiner NULL, ar1021_i2c_irq, 12961e977b7SDmitry Torokhov IRQF_ONESHOT, 130dd4cae8bSChristian Gmeiner "ar1021_i2c", ar1021); 131dd4cae8bSChristian Gmeiner if (error) { 132dd4cae8bSChristian Gmeiner dev_err(&client->dev, 133dd4cae8bSChristian Gmeiner "Failed to enable IRQ, error: %d\n", error); 134dd4cae8bSChristian Gmeiner return error; 135dd4cae8bSChristian Gmeiner } 136dd4cae8bSChristian Gmeiner 137dd4cae8bSChristian Gmeiner /* Disable the IRQ, we'll enable it in ar1021_i2c_open() */ 138dd4cae8bSChristian Gmeiner disable_irq(client->irq); 139dd4cae8bSChristian Gmeiner 140dd4cae8bSChristian Gmeiner error = input_register_device(ar1021->input); 141dd4cae8bSChristian Gmeiner if (error) { 142dd4cae8bSChristian Gmeiner dev_err(&client->dev, 143dd4cae8bSChristian Gmeiner "Failed to register input device, error: %d\n", error); 144dd4cae8bSChristian Gmeiner return error; 145dd4cae8bSChristian Gmeiner } 146dd4cae8bSChristian Gmeiner 147dd4cae8bSChristian Gmeiner return 0; 148dd4cae8bSChristian Gmeiner } 149dd4cae8bSChristian Gmeiner 150dd4cae8bSChristian Gmeiner static int __maybe_unused ar1021_i2c_suspend(struct device *dev) 151dd4cae8bSChristian Gmeiner { 152dd4cae8bSChristian Gmeiner struct i2c_client *client = to_i2c_client(dev); 153dd4cae8bSChristian Gmeiner 154dd4cae8bSChristian Gmeiner disable_irq(client->irq); 155dd4cae8bSChristian Gmeiner 156dd4cae8bSChristian Gmeiner return 0; 157dd4cae8bSChristian Gmeiner } 158dd4cae8bSChristian Gmeiner 159dd4cae8bSChristian Gmeiner static int __maybe_unused ar1021_i2c_resume(struct device *dev) 160dd4cae8bSChristian Gmeiner { 161dd4cae8bSChristian Gmeiner struct i2c_client *client = to_i2c_client(dev); 162dd4cae8bSChristian Gmeiner 163dd4cae8bSChristian Gmeiner enable_irq(client->irq); 164dd4cae8bSChristian Gmeiner 165dd4cae8bSChristian Gmeiner return 0; 166dd4cae8bSChristian Gmeiner } 167dd4cae8bSChristian Gmeiner 168dd4cae8bSChristian Gmeiner static SIMPLE_DEV_PM_OPS(ar1021_i2c_pm, ar1021_i2c_suspend, ar1021_i2c_resume); 169dd4cae8bSChristian Gmeiner 170dd4cae8bSChristian Gmeiner static const struct i2c_device_id ar1021_i2c_id[] = { 17195123fc4SDmitry Torokhov { "ar1021", 0 }, 172dd4cae8bSChristian Gmeiner { }, 173dd4cae8bSChristian Gmeiner }; 174dd4cae8bSChristian Gmeiner MODULE_DEVICE_TABLE(i2c, ar1021_i2c_id); 175dd4cae8bSChristian Gmeiner 176245165deSFabian Frederick static const struct of_device_id ar1021_i2c_of_match[] = { 177dd4cae8bSChristian Gmeiner { .compatible = "microchip,ar1021-i2c", }, 178dd4cae8bSChristian Gmeiner { } 179dd4cae8bSChristian Gmeiner }; 180dd4cae8bSChristian Gmeiner MODULE_DEVICE_TABLE(of, ar1021_i2c_of_match); 181dd4cae8bSChristian Gmeiner 182dd4cae8bSChristian Gmeiner static struct i2c_driver ar1021_i2c_driver = { 183dd4cae8bSChristian Gmeiner .driver = { 184dd4cae8bSChristian Gmeiner .name = "ar1021_i2c", 185dd4cae8bSChristian Gmeiner .pm = &ar1021_i2c_pm, 186dd4cae8bSChristian Gmeiner .of_match_table = ar1021_i2c_of_match, 187dd4cae8bSChristian Gmeiner }, 188dd4cae8bSChristian Gmeiner 189dd4cae8bSChristian Gmeiner .probe = ar1021_i2c_probe, 190dd4cae8bSChristian Gmeiner .id_table = ar1021_i2c_id, 191dd4cae8bSChristian Gmeiner }; 192dd4cae8bSChristian Gmeiner module_i2c_driver(ar1021_i2c_driver); 193dd4cae8bSChristian Gmeiner 194dd4cae8bSChristian Gmeiner MODULE_AUTHOR("Christian Gmeiner <christian.gmeiner@gmail.com>"); 195021cbc1eSMartin Kepplinger MODULE_DESCRIPTION("Microchip AR1020 and AR1021 I2C Driver"); 196dd4cae8bSChristian Gmeiner MODULE_LICENSE("GPL"); 197