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