Lines Matching refs:pm

54 struct pm {  struct
63 void (*parse_packet)(struct pm *); argument
70 static void pm_mtevent(struct pm *pm, struct input_dev *input) in pm_mtevent() argument
74 for (i = 0; i < pm->maxcontacts; ++i) { in pm_mtevent()
77 pm->slots[i].active); in pm_mtevent()
78 if (pm->slots[i].active) { in pm_mtevent()
79 input_event(input, EV_ABS, ABS_MT_POSITION_X, pm->slots[i].x); in pm_mtevent()
80 input_event(input, EV_ABS, ABS_MT_POSITION_Y, pm->slots[i].y); in pm_mtevent()
103 static void pm_parse_9000(struct pm *pm) in pm_parse_9000() argument
105 struct input_dev *dev = pm->dev; in pm_parse_9000()
107 if ((pm->data[0] & 0x80) && pm->packetsize == ++pm->idx) { in pm_parse_9000()
108 input_report_abs(dev, ABS_X, pm->data[1] * 128 + pm->data[2]); in pm_parse_9000()
109 input_report_abs(dev, ABS_Y, pm->data[3] * 128 + pm->data[4]); in pm_parse_9000()
110 input_report_key(dev, BTN_TOUCH, !!(pm->data[0] & 0x40)); in pm_parse_9000()
112 pm->idx = 0; in pm_parse_9000()
116 static void pm_parse_6000(struct pm *pm) in pm_parse_6000() argument
118 struct input_dev *dev = pm->dev; in pm_parse_6000()
120 if ((pm->data[0] & 0xbf) == 0x30 && pm->packetsize == ++pm->idx) { in pm_parse_6000()
121 if (pm_checkpacket(pm->data)) { in pm_parse_6000()
123 pm->data[2] * 256 + pm->data[1]); in pm_parse_6000()
125 pm->data[4] * 256 + pm->data[3]); in pm_parse_6000()
126 input_report_key(dev, BTN_TOUCH, pm->data[0] & 0x40); in pm_parse_6000()
129 pm->idx = 0; in pm_parse_6000()
133 static void pm_parse_3000(struct pm *pm) in pm_parse_3000() argument
135 struct input_dev *dev = pm->dev; in pm_parse_3000()
137 if ((pm->data[0] & 0xce) == 0x40 && pm->packetsize == ++pm->idx) { in pm_parse_3000()
138 if (pm_checkpacket(pm->data)) { in pm_parse_3000()
139 int slotnum = pm->data[0] & 0x0f; in pm_parse_3000()
140 pm->slots[slotnum].active = pm->data[0] & 0x30; in pm_parse_3000()
141 pm->slots[slotnum].x = pm->data[2] * 256 + pm->data[1]; in pm_parse_3000()
142 pm->slots[slotnum].y = pm->data[4] * 256 + pm->data[3]; in pm_parse_3000()
143 pm_mtevent(pm, dev); in pm_parse_3000()
145 pm->idx = 0; in pm_parse_3000()
149 static void pm_parse_6250(struct pm *pm) in pm_parse_6250() argument
151 struct input_dev *dev = pm->dev; in pm_parse_6250()
153 if ((pm->data[0] & 0xb0) == 0x30 && pm->packetsize == ++pm->idx) { in pm_parse_6250()
154 if (pm_checkpacket(pm->data)) { in pm_parse_6250()
155 int slotnum = pm->data[0] & 0x0f; in pm_parse_6250()
156 pm->slots[slotnum].active = pm->data[0] & 0x40; in pm_parse_6250()
157 pm->slots[slotnum].x = pm->data[2] * 256 + pm->data[1]; in pm_parse_6250()
158 pm->slots[slotnum].y = pm->data[4] * 256 + pm->data[3]; in pm_parse_6250()
159 pm_mtevent(pm, dev); in pm_parse_6250()
161 pm->idx = 0; in pm_parse_6250()
168 struct pm *pm = serio_get_drvdata(serio); in pm_interrupt() local
170 pm->data[pm->idx] = data; in pm_interrupt()
172 pm->parse_packet(pm); in pm_interrupt()
183 struct pm *pm = serio_get_drvdata(serio); in pm_disconnect() local
187 input_unregister_device(pm->dev); in pm_disconnect()
188 kfree(pm); in pm_disconnect()
201 struct pm *pm; in pm_connect() local
206 pm = kzalloc(sizeof(struct pm), GFP_KERNEL); in pm_connect()
208 if (!pm || !input_dev) { in pm_connect()
213 pm->serio = serio; in pm_connect()
214 pm->dev = input_dev; in pm_connect()
215 snprintf(pm->phys, sizeof(pm->phys), "%s/input0", serio->phys); in pm_connect()
216 pm->maxcontacts = 1; in pm_connect()
219 input_dev->phys = pm->phys; in pm_connect()
232 pm->packetsize = 5; in pm_connect()
233 pm->parse_packet = pm_parse_9000; in pm_connect()
239 pm->packetsize = 6; in pm_connect()
240 pm->parse_packet = pm_parse_6000; in pm_connect()
246 pm->packetsize = 6; in pm_connect()
247 pm->parse_packet = pm_parse_3000; in pm_connect()
250 pm->maxcontacts = PM_3000_MTSLOT; in pm_connect()
254 pm->packetsize = 6; in pm_connect()
255 pm->parse_packet = pm_parse_6250; in pm_connect()
258 pm->maxcontacts = PM_6250_MTSLOT; in pm_connect()
262 input_set_abs_params(pm->dev, ABS_X, 0, max_x, 0, 0); in pm_connect()
263 input_set_abs_params(pm->dev, ABS_Y, 0, max_y, 0, 0); in pm_connect()
265 if (pm->maxcontacts > 1) { in pm_connect()
266 input_mt_init_slots(pm->dev, pm->maxcontacts, 0); in pm_connect()
267 input_set_abs_params(pm->dev, in pm_connect()
269 input_set_abs_params(pm->dev, in pm_connect()
273 serio_set_drvdata(serio, pm); in pm_connect()
279 err = input_register_device(pm->dev); in pm_connect()
288 kfree(pm); in pm_connect()