rk3066 add phone pad modem support
[firefly-linux-kernel-4.4.55.git] / drivers / input / touchscreen / ct36x_ts / rockchip.c
1
2 #include <linux/i2c.h>
3 #include <linux/delay.h>
4
5 #include "tscore.h"
6 #include "rockchip.h"
7
8
9
10 static struct i2c_device_id ct36x_ts_id[] = {
11         { DRIVER_NAME, 0 },
12         { }
13 };
14
15 static struct i2c_board_info i2c_board_info[] = {
16         {
17                 I2C_BOARD_INFO(DRIVER_NAME, 0x01),
18                 .platform_data = NULL,
19         },
20 };
21
22 struct i2c_driver ct36x_ts_driver  = {
23         .driver = {
24                 .owner  = THIS_MODULE,
25                 .name   = DRIVER_NAME
26         },
27         .id_table       = ct36x_ts_id,
28         .probe      = ct36x_ts_probe,
29         .shutdown       = ct36x_ts_shutdown,
30         .suspend        = ct36x_ts_suspend,
31         .resume     = ct36x_ts_resume,
32         .remove         = __devexit_p(ct36x_ts_remove),
33 };
34
35 void ct36x_ts_reg_read(struct i2c_client *client, unsigned short addr, char *buf, int len)
36 {
37         struct i2c_msg msgs;
38
39         msgs.addr = addr;
40         msgs.flags = 0x01;  // 0x00: write 0x01:read 
41         msgs.len = len;
42         msgs.buf = buf;
43         msgs.scl_rate = CT36X_TS_I2C_SPEED;
44
45         i2c_transfer(client->adapter, &msgs, 1);
46 }
47
48 void ct36x_ts_reg_write(struct i2c_client *client, unsigned short addr, char *buf, int len)
49 {
50         struct i2c_msg msgs;
51
52         msgs.addr = addr;
53         msgs.flags = 0x00;  // 0x00: write 0x01:read 
54         msgs.len = len;
55         msgs.buf = buf;
56         msgs.scl_rate = CT36X_TS_I2C_SPEED;
57
58         i2c_transfer(client->adapter, &msgs, 1);
59 }
60
61 void ct36x_platform_get_cfg(struct ct36x_ts_info *ct36x_ts)
62 {
63         /* I2C config */
64         ct36x_ts->i2c_bus = CT36X_TS_I2C_BUS;
65         ct36x_ts->i2c_address = CT36X_TS_I2C_ADDRESS;
66
67         /* GPIO config */
68         ct36x_ts->rst = CT36X_TS_RST_PIN;
69         ct36x_ts->ss = CT36X_TS_IRQ_PIN;
70
71         /* IRQ config*/
72         ct36x_ts->irq = gpio_to_irq(ct36x_ts->ss);
73
74         ct36x_ts->ready = 0;
75 }
76
77 int ct36x_platform_set_dev(struct ct36x_ts_info *ct36x_ts)
78 {
79         struct i2c_adapter *adapter;
80         struct i2c_client *client;
81
82         adapter = i2c_get_adapter(ct36x_ts->i2c_bus);
83         if ( !adapter ) {
84                 printk("Unable to get i2c adapter on bus %d.\n", ct36x_ts->i2c_bus);
85                 return -ENODEV;
86         }
87
88         client = i2c_new_device(adapter, i2c_board_info);
89         i2c_put_adapter(adapter);
90         if (!client) {
91                 printk("Unable to create i2c device on bus %d.\n", ct36x_ts->i2c_bus);
92                 return -ENODEV;
93         }
94
95         ct36x_ts->client = client;
96         i2c_set_clientdata(client, ct36x_ts);
97
98         return 0;
99 }
100
101 int ct36x_platform_get_resource(struct ct36x_ts_info *ct36x_ts)
102 {
103         int err = -1;
104
105         // Init Reset pin
106         err = gpio_request(ct36x_ts->rst, "ct36x_ts_rst");
107         if ( err ) {
108                 return -EIO;
109         }
110         gpio_direction_output(ct36x_ts->rst, 1);
111         gpio_set_value(ct36x_ts->rst, 1);
112
113         // Init Int pin
114         err = gpio_request(ct36x_ts->ss, "ct36x_ts_int");
115         if ( err ) {
116                 return -EIO;
117         }
118         gpio_direction_input(ct36x_ts->ss);
119
120         return 0;
121 }
122
123 void ct36x_platform_put_resource(struct ct36x_ts_info *ct36x_ts)
124 {
125         gpio_free(ct36x_ts->rst);
126         gpio_free(ct36x_ts->ss);
127 }
128
129 void ct36x_platform_hw_reset(struct ct36x_ts_info *ct36x_ts)
130 {
131         mdelay(500);
132         gpio_set_value(ct36x_ts->rst, 0);
133         mdelay(50);
134         gpio_set_value(ct36x_ts->rst, 1);
135         mdelay(500);
136 }