Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[PATCH] drivers/input/touchscreen: convert to dynamic input_dev allocation

Input: convert drivers/input/touchscreen to dynamic input_dev allocation

This is required for input_dev sysfs integration

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Dmitry Torokhov and committed by
Greg Kroah-Hartman
eca1ed19 bd622663

+281 -310
+45 -44
drivers/input/touchscreen/corgi_ts.c
··· 41 41 }; 42 42 43 43 struct corgi_ts { 44 - char phys[32]; 45 - struct input_dev input; 44 + struct input_dev *input; 46 45 struct timer_list timer; 47 46 struct ts_event tc; 48 47 int pendown; ··· 181 182 if (!corgi_ts->tc.pressure && corgi_ts->pendown == 0) 182 183 return; 183 184 184 - if (regs) 185 - input_regs(&corgi_ts->input, regs); 186 - 187 - input_report_abs(&corgi_ts->input, ABS_X, corgi_ts->tc.x); 188 - input_report_abs(&corgi_ts->input, ABS_Y, corgi_ts->tc.y); 189 - input_report_abs(&corgi_ts->input, ABS_PRESSURE, corgi_ts->tc.pressure); 190 - input_report_key(&corgi_ts->input, BTN_TOUCH, (corgi_ts->pendown != 0)); 191 - input_sync(&corgi_ts->input); 185 + input_regs(corgi_ts->input, regs); 186 + input_report_abs(corgi_ts->input, ABS_X, corgi_ts->tc.x); 187 + input_report_abs(corgi_ts->input, ABS_Y, corgi_ts->tc.y); 188 + input_report_abs(corgi_ts->input, ABS_PRESSURE, corgi_ts->tc.pressure); 189 + input_report_key(corgi_ts->input, BTN_TOUCH, (corgi_ts->pendown != 0)); 190 + input_sync(corgi_ts->input); 192 191 } 193 192 194 193 static void ts_interrupt_main(struct corgi_ts *corgi_ts, int isTimer, struct pt_regs *regs) ··· 270 273 { 271 274 struct corgi_ts *corgi_ts; 272 275 struct platform_device *pdev = to_platform_device(dev); 276 + struct input_dev *input_dev; 277 + int err = -ENOMEM; 273 278 274 - if (!(corgi_ts = kmalloc(sizeof(struct corgi_ts), GFP_KERNEL))) 275 - return -ENOMEM; 279 + corgi_ts = kzalloc(sizeof(struct corgi_ts), GFP_KERNEL); 280 + input_dev = input_allocate_device(); 281 + if (!corgi_ts || !input_dev) 282 + goto fail; 276 283 277 284 dev_set_drvdata(dev, corgi_ts); 278 - 279 - memset(corgi_ts, 0, sizeof(struct corgi_ts)); 280 285 281 286 corgi_ts->machinfo = dev->platform_data; 282 287 corgi_ts->irq_gpio = platform_get_irq(pdev, 0); 283 288 284 289 if (corgi_ts->irq_gpio < 0) { 285 - kfree(corgi_ts); 286 - return -ENODEV; 290 + err = -ENODEV; 291 + goto fail; 287 292 } 288 293 289 - init_input_dev(&corgi_ts->input); 290 - corgi_ts->input.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 291 - corgi_ts->input.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 292 - input_set_abs_params(&corgi_ts->input, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); 293 - input_set_abs_params(&corgi_ts->input, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); 294 - input_set_abs_params(&corgi_ts->input, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0); 294 + corgi_ts->input = input_dev; 295 295 296 - strcpy(corgi_ts->phys, "corgits/input0"); 296 + init_timer(&corgi_ts->timer); 297 + corgi_ts->timer.data = (unsigned long) corgi_ts; 298 + corgi_ts->timer.function = corgi_ts_timer; 297 299 298 - corgi_ts->input.private = corgi_ts; 299 - corgi_ts->input.name = "Corgi Touchscreen"; 300 - corgi_ts->input.dev = dev; 301 - corgi_ts->input.phys = corgi_ts->phys; 302 - corgi_ts->input.id.bustype = BUS_HOST; 303 - corgi_ts->input.id.vendor = 0x0001; 304 - corgi_ts->input.id.product = 0x0002; 305 - corgi_ts->input.id.version = 0x0100; 300 + input_dev->name = "Corgi Touchscreen"; 301 + input_dev->phys = "corgits/input0"; 302 + input_dev->id.bustype = BUS_HOST; 303 + input_dev->id.vendor = 0x0001; 304 + input_dev->id.product = 0x0002; 305 + input_dev->id.version = 0x0100; 306 + input_dev->cdev.dev = dev; 307 + input_dev->private = corgi_ts; 308 + 309 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 310 + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 311 + input_set_abs_params(input_dev, ABS_X, X_AXIS_MIN, X_AXIS_MAX, 0, 0); 312 + input_set_abs_params(input_dev, ABS_Y, Y_AXIS_MIN, Y_AXIS_MAX, 0, 0); 313 + input_set_abs_params(input_dev, ABS_PRESSURE, PRESSURE_MIN, PRESSURE_MAX, 0, 0); 306 314 307 315 pxa_gpio_mode(IRQ_TO_GPIO(corgi_ts->irq_gpio) | GPIO_IN); 308 316 ··· 321 319 corgi_ssp_ads7846_putget((5u << ADSCTRL_ADR_SH) | ADSCTRL_STS); 322 320 mdelay(5); 323 321 324 - init_timer(&corgi_ts->timer); 325 - corgi_ts->timer.data = (unsigned long) corgi_ts; 326 - corgi_ts->timer.function = corgi_ts_timer; 327 - 328 - input_register_device(&corgi_ts->input); 329 - corgi_ts->power_mode = PWR_MODE_ACTIVE; 330 - 331 322 if (request_irq(corgi_ts->irq_gpio, ts_interrupt, SA_INTERRUPT, "ts", corgi_ts)) { 332 - input_unregister_device(&corgi_ts->input); 333 - kfree(corgi_ts); 334 - return -EBUSY; 323 + err = -EBUSY; 324 + goto fail; 335 325 } 326 + 327 + input_register_device(corgi_ts->input); 328 + 329 + corgi_ts->power_mode = PWR_MODE_ACTIVE; 336 330 337 331 /* Enable Falling Edge */ 338 332 set_irq_type(corgi_ts->irq_gpio, IRQT_FALLING); 339 333 340 - printk(KERN_INFO "input: Corgi Touchscreen Registered\n"); 341 - 342 334 return 0; 335 + 336 + fail: input_free_device(input_dev); 337 + kfree(corgi_ts); 338 + return err; 339 + 343 340 } 344 341 345 342 static int corgits_remove(struct device *dev) ··· 348 347 free_irq(corgi_ts->irq_gpio, NULL); 349 348 del_timer_sync(&corgi_ts->timer); 350 349 corgi_ts->machinfo->put_hsync(); 351 - input_unregister_device(&corgi_ts->input); 350 + input_unregister_device(corgi_ts->input); 352 351 kfree(corgi_ts); 353 352 return 0; 354 353 }
+45 -46
drivers/input/touchscreen/elo.c
··· 36 36 37 37 #define ELO_MAX_LENGTH 10 38 38 39 - static char *elo_name = "Elo Serial TouchScreen"; 40 - 41 39 /* 42 40 * Per-touchscreen data. 43 41 */ 44 42 45 43 struct elo { 46 - struct input_dev dev; 44 + struct input_dev *dev; 47 45 struct serio *serio; 48 46 int id; 49 47 int idx; ··· 52 54 53 55 static void elo_process_data_10(struct elo* elo, unsigned char data, struct pt_regs *regs) 54 56 { 55 - struct input_dev *dev = &elo->dev; 57 + struct input_dev *dev = elo->dev; 56 58 57 59 elo->csum += elo->data[elo->idx] = data; 58 60 ··· 78 80 input_report_abs(dev, ABS_X, (elo->data[4] << 8) | elo->data[3]); 79 81 input_report_abs(dev, ABS_Y, (elo->data[6] << 8) | elo->data[5]); 80 82 input_report_abs(dev, ABS_PRESSURE, (elo->data[8] << 8) | elo->data[7]); 81 - input_report_key(dev, BTN_TOUCH, elo->data[2] & 3); 83 + input_report_key(dev, BTN_TOUCH, elo->data[8] || elo->data[7]); 82 84 input_sync(dev); 83 85 } 84 86 elo->idx = 0; ··· 89 91 90 92 static void elo_process_data_6(struct elo* elo, unsigned char data, struct pt_regs *regs) 91 93 { 92 - struct input_dev *dev = &elo->dev; 94 + struct input_dev *dev = elo->dev; 93 95 94 96 elo->data[elo->idx] = data; 95 97 ··· 127 129 case 5: 128 130 if ((data & 0xf0) == 0) { 129 131 input_report_abs(dev, ABS_PRESSURE, elo->data[5]); 130 - input_report_key(dev, BTN_TOUCH, elo->data[5]); 132 + input_report_key(dev, BTN_TOUCH, !!elo->data[5]); 131 133 } 132 134 input_sync(dev); 133 135 elo->idx = 0; ··· 137 139 138 140 static void elo_process_data_3(struct elo* elo, unsigned char data, struct pt_regs *regs) 139 141 { 140 - struct input_dev *dev = &elo->dev; 142 + struct input_dev *dev = elo->dev; 141 143 142 144 elo->data[elo->idx] = data; 143 145 ··· 189 191 { 190 192 struct elo* elo = serio_get_drvdata(serio); 191 193 192 - input_unregister_device(&elo->dev); 194 + input_unregister_device(elo->dev); 193 195 serio_close(serio); 194 196 serio_set_drvdata(serio, NULL); 195 197 kfree(elo); ··· 204 206 static int elo_connect(struct serio *serio, struct serio_driver *drv) 205 207 { 206 208 struct elo *elo; 209 + struct input_dev *input_dev; 207 210 int err; 208 211 209 - if (!(elo = kmalloc(sizeof(struct elo), GFP_KERNEL))) 210 - return -ENOMEM; 212 + elo = kzalloc(sizeof(struct elo), GFP_KERNEL); 213 + input_dev = input_allocate_device(); 214 + if (!elo || !input_dev) { 215 + err = -ENOMEM; 216 + goto fail; 217 + } 211 218 212 - memset(elo, 0, sizeof(struct elo)); 213 - 214 - init_input_dev(&elo->dev); 215 - elo->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 216 - elo->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 217 - 219 + elo->serio = serio; 218 220 elo->id = serio->id.id; 221 + elo->dev = input_dev; 222 + snprintf(elo->phys, sizeof(elo->phys), "%s/input0", serio->phys); 223 + 224 + input_dev->private = elo; 225 + input_dev->name = "Elo Serial TouchScreen"; 226 + input_dev->phys = elo->phys; 227 + input_dev->id.bustype = BUS_RS232; 228 + input_dev->id.vendor = SERIO_ELO; 229 + input_dev->id.product = elo->id; 230 + input_dev->id.version = 0x0100; 231 + input_dev->cdev.dev = &serio->dev; 232 + 233 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 234 + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 219 235 220 236 switch (elo->id) { 221 237 222 238 case 0: /* 10-byte protocol */ 223 - input_set_abs_params(&elo->dev, ABS_X, 96, 4000, 0, 0); 224 - input_set_abs_params(&elo->dev, ABS_Y, 96, 4000, 0, 0); 225 - input_set_abs_params(&elo->dev, ABS_PRESSURE, 0, 255, 0, 0); 239 + input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); 240 + input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); 241 + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 255, 0, 0); 226 242 break; 227 243 228 244 case 1: /* 6-byte protocol */ 229 - input_set_abs_params(&elo->dev, ABS_PRESSURE, 0, 15, 0, 0); 245 + input_set_abs_params(input_dev, ABS_PRESSURE, 0, 15, 0, 0); 230 246 231 247 case 2: /* 4-byte protocol */ 232 - input_set_abs_params(&elo->dev, ABS_X, 96, 4000, 0, 0); 233 - input_set_abs_params(&elo->dev, ABS_Y, 96, 4000, 0, 0); 248 + input_set_abs_params(input_dev, ABS_X, 96, 4000, 0, 0); 249 + input_set_abs_params(input_dev, ABS_Y, 96, 4000, 0, 0); 234 250 break; 235 251 236 252 case 3: /* 3-byte protocol */ 237 - input_set_abs_params(&elo->dev, ABS_X, 0, 255, 0, 0); 238 - input_set_abs_params(&elo->dev, ABS_Y, 0, 255, 0, 0); 253 + input_set_abs_params(input_dev, ABS_X, 0, 255, 0, 0); 254 + input_set_abs_params(input_dev, ABS_Y, 0, 255, 0, 0); 239 255 break; 240 256 } 241 - 242 - elo->serio = serio; 243 - 244 - sprintf(elo->phys, "%s/input0", serio->phys); 245 - 246 - elo->dev.private = elo; 247 - elo->dev.name = elo_name; 248 - elo->dev.phys = elo->phys; 249 - elo->dev.id.bustype = BUS_RS232; 250 - elo->dev.id.vendor = SERIO_ELO; 251 - elo->dev.id.product = elo->id; 252 - elo->dev.id.version = 0x0100; 253 257 254 258 serio_set_drvdata(serio, elo); 255 259 256 260 err = serio_open(serio, drv); 257 - if (err) { 258 - serio_set_drvdata(serio, NULL); 259 - kfree(elo); 260 - return err; 261 - } 261 + if (err) 262 + goto fail; 262 263 263 - input_register_device(&elo->dev); 264 - 265 - printk(KERN_INFO "input: %s on %s\n", elo_name, serio->phys); 266 - 264 + input_register_device(elo->dev); 267 265 return 0; 266 + 267 + fail: serio_set_drvdata(serio, NULL); 268 + input_free_device(input_dev); 269 + kfree(elo); 270 + return err; 268 271 } 269 272 270 273 /*
+33 -33
drivers/input/touchscreen/gunze.c
··· 48 48 49 49 #define GUNZE_MAX_LENGTH 10 50 50 51 - static char *gunze_name = "Gunze AHL-51S TouchScreen"; 52 - 53 51 /* 54 52 * Per-touchscreen data. 55 53 */ 56 54 57 55 struct gunze { 58 - struct input_dev dev; 56 + struct input_dev *dev; 59 57 struct serio *serio; 60 58 int idx; 61 59 unsigned char data[GUNZE_MAX_LENGTH]; ··· 62 64 63 65 static void gunze_process_packet(struct gunze* gunze, struct pt_regs *regs) 64 66 { 65 - struct input_dev *dev = &gunze->dev; 67 + struct input_dev *dev = gunze->dev; 66 68 67 69 if (gunze->idx != GUNZE_MAX_LENGTH || gunze->data[5] != ',' || 68 70 (gunze->data[0] != 'T' && gunze->data[0] != 'R')) { ··· 98 100 99 101 static void gunze_disconnect(struct serio *serio) 100 102 { 101 - struct gunze* gunze = serio_get_drvdata(serio); 103 + struct gunze *gunze = serio_get_drvdata(serio); 102 104 103 - input_unregister_device(&gunze->dev); 105 + input_get_device(gunze->dev); 106 + input_unregister_device(gunze->dev); 104 107 serio_close(serio); 105 108 serio_set_drvdata(serio, NULL); 109 + input_put_device(gunze->dev); 106 110 kfree(gunze); 107 111 } 108 112 ··· 117 117 static int gunze_connect(struct serio *serio, struct serio_driver *drv) 118 118 { 119 119 struct gunze *gunze; 120 + struct input_dev *input_dev; 120 121 int err; 121 122 122 - if (!(gunze = kmalloc(sizeof(struct gunze), GFP_KERNEL))) 123 - return -ENOMEM; 124 - 125 - memset(gunze, 0, sizeof(struct gunze)); 126 - 127 - init_input_dev(&gunze->dev); 128 - gunze->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 129 - gunze->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 130 - input_set_abs_params(&gunze->dev, ABS_X, 24, 1000, 0, 0); 131 - input_set_abs_params(&gunze->dev, ABS_Y, 24, 1000, 0, 0); 123 + gunze = kzalloc(sizeof(struct gunze), GFP_KERNEL); 124 + input_dev = input_allocate_device(); 125 + if (!gunze || !input_dev) { 126 + err = -ENOMEM; 127 + goto fail; 128 + } 132 129 133 130 gunze->serio = serio; 134 - 131 + gunze->dev = input_dev; 135 132 sprintf(gunze->phys, "%s/input0", serio->phys); 136 133 137 - gunze->dev.private = gunze; 138 - gunze->dev.name = gunze_name; 139 - gunze->dev.phys = gunze->phys; 140 - gunze->dev.id.bustype = BUS_RS232; 141 - gunze->dev.id.vendor = SERIO_GUNZE; 142 - gunze->dev.id.product = 0x0051; 143 - gunze->dev.id.version = 0x0100; 134 + input_dev->private = gunze; 135 + input_dev->name = "Gunze AHL-51S TouchScreen"; 136 + input_dev->phys = gunze->phys; 137 + input_dev->id.bustype = BUS_RS232; 138 + input_dev->id.vendor = SERIO_GUNZE; 139 + input_dev->id.product = 0x0051; 140 + input_dev->id.version = 0x0100; 141 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 142 + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 143 + input_set_abs_params(input_dev, ABS_X, 24, 1000, 0, 0); 144 + input_set_abs_params(input_dev, ABS_Y, 24, 1000, 0, 0); 144 145 145 146 serio_set_drvdata(serio, gunze); 146 147 147 148 err = serio_open(serio, drv); 148 - if (err) { 149 - serio_set_drvdata(serio, NULL); 150 - kfree(gunze); 151 - return err; 152 - } 149 + if (err) 150 + goto fail; 153 151 154 - input_register_device(&gunze->dev); 155 - 156 - printk(KERN_INFO "input: %s on %s\n", gunze_name, serio->phys); 157 - 152 + input_register_device(gunze->dev); 158 153 return 0; 154 + 155 + fail: serio_set_drvdata(serio, NULL); 156 + input_free_device(input_dev); 157 + kfree(gunze); 158 + return err; 159 159 } 160 160 161 161 /*
+59 -90
drivers/input/touchscreen/h3600_ts_input.c
··· 39 39 #include <linux/serio.h> 40 40 #include <linux/init.h> 41 41 #include <linux/delay.h> 42 - #include <linux/pm.h> 43 42 44 43 /* SA1100 serial defines */ 45 44 #include <asm/arch/hardware.h> ··· 92 93 #define H3600_SCANCODE_LEFT 8 /* 8 -> left */ 93 94 #define H3600_SCANCODE_DOWN 9 /* 9 -> down */ 94 95 95 - static char *h3600_name = "H3600 TouchScreen"; 96 - 97 96 /* 98 97 * Per-touchscreen data. 99 98 */ 100 99 struct h3600_dev { 101 - struct input_dev dev; 102 - struct pm_dev *pm_dev; 100 + struct input_dev *dev; 103 101 struct serio *serio; 104 - struct pm_dev *pm_dev; 105 102 unsigned char event; /* event ID from packet */ 106 103 unsigned char chksum; 107 104 unsigned char len; ··· 158 163 return 0; 159 164 } 160 165 161 - static int suspended = 0; 162 - static int h3600ts_pm_callback(struct pm_dev *pm_dev, pm_request_t req, 163 - void *data) 164 - { 165 - struct input_dev *dev = (struct input_dev *) data; 166 - 167 - switch (req) { 168 - case PM_SUSPEND: /* enter D1-D3 */ 169 - suspended = 1; 170 - h3600_flite_power(dev, FLITE_PWR_OFF); 171 - break; 172 - case PM_BLANK: 173 - if (!suspended) 174 - h3600_flite_power(dev, FLITE_PWR_OFF); 175 - break; 176 - case PM_RESUME: /* enter D0 */ 177 - /* same as unblank */ 178 - case PM_UNBLANK: 179 - if (suspended) { 180 - //initSerial(); 181 - suspended = 0; 182 - } 183 - h3600_flite_power(dev, FLITE_PWR_ON); 184 - break; 185 - } 186 - return 0; 187 - } 188 166 #endif 189 167 190 168 /* ··· 167 199 */ 168 200 static void h3600ts_process_packet(struct h3600_dev *ts, struct pt_regs *regs) 169 201 { 170 - struct input_dev *dev = &ts->dev; 202 + struct input_dev *dev = ts->dev; 171 203 static int touched = 0; 172 204 int key, down = 0; 173 205 ··· 263 295 static int h3600ts_event(struct input_dev *dev, unsigned int type, 264 296 unsigned int code, int value) 265 297 { 298 + #if 0 266 299 struct h3600_dev *ts = dev->private; 267 300 268 301 switch (type) { ··· 273 304 } 274 305 } 275 306 return -1; 307 + #endif 308 + return 0; 276 309 } 277 310 278 311 /* ··· 351 380 static int h3600ts_connect(struct serio *serio, struct serio_driver *drv) 352 381 { 353 382 struct h3600_dev *ts; 383 + struct input_dev *input_dev; 354 384 int err; 355 385 356 - if (!(ts = kmalloc(sizeof(struct h3600_dev), GFP_KERNEL))) 357 - return -ENOMEM; 386 + ts = kzalloc(sizeof(struct h3600_dev), GFP_KERNEL); 387 + input_dev = input_allocate_device(); 388 + if (!ts || !input_dev) { 389 + err = -ENOMEM; 390 + goto fail1; 391 + } 358 392 359 - memset(ts, 0, sizeof(struct h3600_dev)); 393 + ts->serio = serio; 394 + ts->dev = input_dev; 395 + sprintf(ts->phys, "%s/input0", serio->phys); 360 396 361 - init_input_dev(&ts->dev); 397 + input_dev->name = "H3600 TouchScreen"; 398 + input_dev->phys = ts->phys; 399 + input_dev->id.bustype = BUS_RS232; 400 + input_dev->id.vendor = SERIO_H3600; 401 + input_dev->id.product = 0x0666; /* FIXME !!! We can ask the hardware */ 402 + input_dev->id.version = 0x0100; 403 + input_dev->cdev.dev = &serio->dev; 404 + input_dev->private = ts; 405 + 406 + input_dev->event = h3600ts_event; 407 + 408 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_LED) | BIT(EV_PWR); 409 + input_dev->ledbit[0] = BIT(LED_SLEEP); 410 + input_set_abs_params(input_dev, ABS_X, 60, 985, 0, 0); 411 + input_set_abs_params(input_dev, ABS_Y, 35, 1024, 0, 0); 412 + 413 + set_bit(KEY_RECORD, input_dev->keybit); 414 + set_bit(KEY_Q, input_dev->keybit); 415 + set_bit(KEY_PROG1, input_dev->keybit); 416 + set_bit(KEY_PROG2, input_dev->keybit); 417 + set_bit(KEY_PROG3, input_dev->keybit); 418 + set_bit(KEY_UP, input_dev->keybit); 419 + set_bit(KEY_RIGHT, input_dev->keybit); 420 + set_bit(KEY_LEFT, input_dev->keybit); 421 + set_bit(KEY_DOWN, input_dev->keybit); 422 + set_bit(KEY_ENTER, input_dev->keybit); 423 + set_bit(KEY_SUSPEND, input_dev->keybit); 424 + set_bit(BTN_TOUCH, input_dev->keybit); 362 425 363 426 /* Device specific stuff */ 364 427 set_GPIO_IRQ_edge(GPIO_BITSY_ACTION_BUTTON, GPIO_BOTH_EDGES); ··· 402 397 SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM, 403 398 "h3600_action", &ts->dev)) { 404 399 printk(KERN_ERR "h3600ts.c: Could not allocate Action Button IRQ!\n"); 405 - kfree(ts); 406 - return -EBUSY; 400 + err = -EBUSY; 401 + goto fail2; 407 402 } 408 403 409 404 if (request_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, npower_button_handler, 410 405 SA_SHIRQ | SA_INTERRUPT | SA_SAMPLE_RANDOM, 411 406 "h3600_suspend", &ts->dev)) { 412 - free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, &ts->dev); 413 407 printk(KERN_ERR "h3600ts.c: Could not allocate Power Button IRQ!\n"); 414 - kfree(ts); 415 - return -EBUSY; 408 + err = -EBUSY; 409 + goto fail3; 416 410 } 417 - 418 - /* Now we have things going we setup our input device */ 419 - ts->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS) | BIT(EV_LED) | BIT(EV_PWR); 420 - ts->dev.ledbit[0] = BIT(LED_SLEEP); 421 - input_set_abs_params(&ts->dev, ABS_X, 60, 985, 0, 0); 422 - input_set_abs_params(&ts->dev, ABS_Y, 35, 1024, 0, 0); 423 - 424 - set_bit(KEY_RECORD, ts->dev.keybit); 425 - set_bit(KEY_Q, ts->dev.keybit); 426 - set_bit(KEY_PROG1, ts->dev.keybit); 427 - set_bit(KEY_PROG2, ts->dev.keybit); 428 - set_bit(KEY_PROG3, ts->dev.keybit); 429 - set_bit(KEY_UP, ts->dev.keybit); 430 - set_bit(KEY_RIGHT, ts->dev.keybit); 431 - set_bit(KEY_LEFT, ts->dev.keybit); 432 - set_bit(KEY_DOWN, ts->dev.keybit); 433 - set_bit(KEY_ENTER, ts->dev.keybit); 434 - ts->dev.keybit[LONG(BTN_TOUCH)] |= BIT(BTN_TOUCH); 435 - ts->dev.keybit[LONG(KEY_SUSPEND)] |= BIT(KEY_SUSPEND); 436 - 437 - ts->serio = serio; 438 - 439 - sprintf(ts->phys, "%s/input0", serio->phys); 440 - 441 - ts->dev.event = h3600ts_event; 442 - ts->dev.private = ts; 443 - ts->dev.name = h3600_name; 444 - ts->dev.phys = ts->phys; 445 - ts->dev.id.bustype = BUS_RS232; 446 - ts->dev.id.vendor = SERIO_H3600; 447 - ts->dev.id.product = 0x0666; /* FIXME !!! We can ask the hardware */ 448 - ts->dev.id.version = 0x0100; 449 411 450 412 serio_set_drvdata(serio, ts); 451 413 452 414 err = serio_open(serio, drv); 453 - if (err) { 454 - free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts); 455 - free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts); 456 - serio_set_drvdata(serio, NULL); 457 - kfree(ts); 415 + if (err) 458 416 return err; 459 - } 460 417 461 418 //h3600_flite_control(1, 25); /* default brightness */ 462 - #ifdef CONFIG_PM 463 - ts->pm_dev = pm_register(PM_ILLUMINATION_DEV, PM_SYS_LIGHT, 464 - h3600ts_pm_callback); 465 - printk("registered pm callback\n"); 466 - #endif 467 - input_register_device(&ts->dev); 468 - 469 - printk(KERN_INFO "input: %s on %s\n", h3600_name, serio->phys); 419 + input_register_device(ts->dev); 470 420 471 421 return 0; 422 + 423 + fail3: free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, ts->dev); 424 + fail2: free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, ts->dev); 425 + fail1: serio_set_drvdata(serio, NULL); 426 + input_free_device(input_dev); 427 + kfree(ts); 428 + return err; 472 429 } 473 430 474 431 /* ··· 443 476 444 477 free_irq(IRQ_GPIO_BITSY_ACTION_BUTTON, &ts->dev); 445 478 free_irq(IRQ_GPIO_BITSY_NPOWER_BUTTON, &ts->dev); 446 - input_unregister_device(&ts->dev); 479 + input_get_device(ts->dev); 480 + input_unregister_device(ts->dev); 447 481 serio_close(serio); 448 482 serio_set_drvdata(serio, NULL); 483 + input_put_device(ts->dev); 449 484 kfree(ts); 450 485 } 451 486
+25 -25
drivers/input/touchscreen/hp680_ts_input.c
··· 21 21 22 22 static void do_softint(void *data); 23 23 24 - static struct input_dev hp680_ts_dev; 24 + static struct input_dev *hp680_ts_dev; 25 25 static DECLARE_WORK(work, do_softint, 0); 26 - static char *hp680_ts_name = "HP Jornada touchscreen"; 27 - static char *hp680_ts_phys = "input0"; 28 26 29 27 static void do_softint(void *data) 30 28 { ··· 56 58 } 57 59 58 60 if (touched) { 59 - input_report_key(&hp680_ts_dev, BTN_TOUCH, 1); 60 - input_report_abs(&hp680_ts_dev, ABS_X, absx); 61 - input_report_abs(&hp680_ts_dev, ABS_Y, absy); 61 + input_report_key(hp680_ts_dev, BTN_TOUCH, 1); 62 + input_report_abs(hp680_ts_dev, ABS_X, absx); 63 + input_report_abs(hp680_ts_dev, ABS_Y, absy); 62 64 } else { 63 - input_report_key(&hp680_ts_dev, BTN_TOUCH, 0); 65 + input_report_key(hp680_ts_dev, BTN_TOUCH, 0); 64 66 } 65 67 66 - input_sync(&hp680_ts_dev); 68 + input_sync(hp680_ts_dev); 67 69 enable_irq(HP680_TS_IRQ); 68 70 } 69 71 ··· 90 92 scpcr |= SCPCR_TS_ENABLE; 91 93 ctrl_outw(scpcr, SCPCR); 92 94 93 - memset(&hp680_ts_dev, 0, sizeof(hp680_ts_dev)); 94 - init_input_dev(&hp680_ts_dev); 95 + hp680_ts_dev = input_allocate_device(); 96 + if (!hp680_ts_dev) 97 + return -ENOMEM; 95 98 96 - hp680_ts_dev.evbit[0] = BIT(EV_ABS) | BIT(EV_KEY); 97 - hp680_ts_dev.absbit[0] = BIT(ABS_X) | BIT(ABS_Y); 98 - hp680_ts_dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 99 + hp680_ts_dev->evbit[0] = BIT(EV_ABS) | BIT(EV_KEY); 100 + hp680_ts_dev->absbit[0] = BIT(ABS_X) | BIT(ABS_Y); 101 + hp680_ts_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 99 102 100 - hp680_ts_dev.absmin[ABS_X] = HP680_TS_ABS_X_MIN; 101 - hp680_ts_dev.absmin[ABS_Y] = HP680_TS_ABS_Y_MIN; 102 - hp680_ts_dev.absmax[ABS_X] = HP680_TS_ABS_X_MAX; 103 - hp680_ts_dev.absmax[ABS_Y] = HP680_TS_ABS_Y_MAX; 103 + hp680_ts_dev->absmin[ABS_X] = HP680_TS_ABS_X_MIN; 104 + hp680_ts_dev->absmin[ABS_Y] = HP680_TS_ABS_Y_MIN; 105 + hp680_ts_dev->absmax[ABS_X] = HP680_TS_ABS_X_MAX; 106 + hp680_ts_dev->absmax[ABS_Y] = HP680_TS_ABS_Y_MAX; 104 107 105 - hp680_ts_dev.name = hp680_ts_name; 106 - hp680_ts_dev.phys = hp680_ts_phys; 107 - input_register_device(&hp680_ts_dev); 108 + hp680_ts_dev->name = "HP Jornada touchscreen"; 109 + hp680_ts_dev->phys = "hp680_ts/input0"; 108 110 109 - if (request_irq 110 - (HP680_TS_IRQ, hp680_ts_interrupt, SA_INTERRUPT, MODNAME, 0) < 0) { 111 - printk(KERN_ERR "hp680_touchscreen.c : Can't allocate irq %d\n", 111 + input_register_device(hp680_ts_dev); 112 + 113 + if (request_irq(HP680_TS_IRQ, hp680_ts_interrupt, 114 + SA_INTERRUPT, MODNAME, 0) < 0) { 115 + printk(KERN_ERR "hp680_touchscreen.c: Can't allocate irq %d\n", 112 116 HP680_TS_IRQ); 113 - input_unregister_device(&hp680_ts_dev); 117 + input_unregister_device(hp680_ts_dev); 114 118 return -EBUSY; 115 119 } 116 120 ··· 124 124 free_irq(HP680_TS_IRQ, 0); 125 125 cancel_delayed_work(&work); 126 126 flush_scheduled_work(); 127 - input_unregister_device(&hp680_ts_dev); 127 + input_unregister_device(hp680_ts_dev); 128 128 } 129 129 130 130 module_init(hp680_ts_init);
+42 -40
drivers/input/touchscreen/mk712.c
··· 77 77 #define MK712_READ_ONE_POINT 0x20 78 78 #define MK712_POWERUP 0x40 79 79 80 - static struct input_dev mk712_dev; 80 + static struct input_dev *mk712_dev; 81 81 static DEFINE_SPINLOCK(mk712_lock); 82 82 83 83 static irqreturn_t mk712_interrupt(int irq, void *dev_id, struct pt_regs *regs) ··· 88 88 static unsigned short last_y; 89 89 90 90 spin_lock(&mk712_lock); 91 - input_regs(&mk712_dev, regs); 91 + input_regs(mk712_dev, regs); 92 92 93 93 status = inb(mk712_io + MK712_STATUS); 94 94 ··· 100 100 if (~status & MK712_STATUS_TOUCH) 101 101 { 102 102 debounce = 1; 103 - input_report_key(&mk712_dev, BTN_TOUCH, 0); 103 + input_report_key(mk712_dev, BTN_TOUCH, 0); 104 104 goto end; 105 105 } 106 106 ··· 110 110 goto end; 111 111 } 112 112 113 - input_report_key(&mk712_dev, BTN_TOUCH, 1); 114 - input_report_abs(&mk712_dev, ABS_X, last_x); 115 - input_report_abs(&mk712_dev, ABS_Y, last_y); 113 + input_report_key(mk712_dev, BTN_TOUCH, 1); 114 + input_report_abs(mk712_dev, ABS_X, last_x); 115 + input_report_abs(mk712_dev, ABS_Y, last_y); 116 116 117 117 end: 118 118 119 119 last_x = inw(mk712_io + MK712_X) & 0x0fff; 120 120 last_y = inw(mk712_io + MK712_Y) & 0x0fff; 121 - input_sync(&mk712_dev); 121 + input_sync(mk712_dev); 122 122 spin_unlock(&mk712_lock); 123 123 return IRQ_HANDLED; 124 124 } ··· 154 154 spin_unlock_irqrestore(&mk712_lock, flags); 155 155 } 156 156 157 - static struct input_dev mk712_dev = { 158 - .evbit = { BIT(EV_KEY) | BIT(EV_ABS) }, 159 - .keybit = { [LONG(BTN_TOUCH)] = BIT(BTN_TOUCH) }, 160 - .absbit = { BIT(ABS_X) | BIT(ABS_Y) }, 161 - .open = mk712_open, 162 - .close = mk712_close, 163 - .name = "ICS MicroClock MK712 TouchScreen", 164 - .phys = "isa0260/input0", 165 - .absmin = { [ABS_X] = 0, [ABS_Y] = 0 }, 166 - .absmax = { [ABS_X] = 0xfff, [ABS_Y] = 0xfff }, 167 - .absfuzz = { [ABS_X] = 88, [ABS_Y] = 88 }, 168 - .id = { 169 - .bustype = BUS_ISA, 170 - .vendor = 0x0005, 171 - .product = 0x0001, 172 - .version = 0x0100, 173 - }, 174 - }; 175 - 176 157 int __init mk712_init(void) 177 158 { 159 + int err; 178 160 179 - if(!request_region(mk712_io, 8, "mk712")) 180 - { 161 + if (!request_region(mk712_io, 8, "mk712")) { 181 162 printk(KERN_WARNING "mk712: unable to get IO region\n"); 182 163 return -ENODEV; 183 164 } ··· 169 188 (inw(mk712_io + MK712_Y) & 0xf000) || 170 189 (inw(mk712_io + MK712_STATUS) & 0xf333)) { 171 190 printk(KERN_WARNING "mk712: device not present\n"); 172 - release_region(mk712_io, 8); 173 - return -ENODEV; 191 + err = -ENODEV; 192 + goto fail; 174 193 } 175 194 176 - if(request_irq(mk712_irq, mk712_interrupt, 0, "mk712", &mk712_dev)) 177 - { 195 + if (!(mk712_dev = input_allocate_device())) { 196 + printk(KERN_ERR "mk712: not enough memory\n"); 197 + err = -ENOMEM; 198 + goto fail; 199 + } 200 + 201 + mk712_dev->name = "ICS MicroClock MK712 TouchScreen"; 202 + mk712_dev->phys = "isa0260/input0"; 203 + mk712_dev->id.bustype = BUS_ISA; 204 + mk712_dev->id.vendor = 0x0005; 205 + mk712_dev->id.product = 0x0001; 206 + mk712_dev->id.version = 0x0100; 207 + 208 + mk712_dev->open = mk712_open; 209 + mk712_dev->close = mk712_close; 210 + 211 + mk712_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 212 + mk712_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 213 + input_set_abs_params(mk712_dev, ABS_X, 0, 0xfff, 88, 0); 214 + input_set_abs_params(mk712_dev, ABS_Y, 0, 0xfff, 88, 0); 215 + 216 + if (request_irq(mk712_irq, mk712_interrupt, 0, "mk712", mk712_dev)) { 178 217 printk(KERN_WARNING "mk712: unable to get IRQ\n"); 179 - release_region(mk712_io, 8); 180 - return -EBUSY; 218 + err = -EBUSY; 219 + goto fail; 181 220 } 182 221 183 - input_register_device(&mk712_dev); 184 - 185 - printk(KERN_INFO "input: ICS MicroClock MK712 TouchScreen at %#x irq %d\n", mk712_io, mk712_irq); 186 - 222 + input_register_device(mk712_dev); 187 223 return 0; 224 + 225 + fail: input_free_device(mk712_dev); 226 + release_region(mk712_io, 8); 227 + return err; 188 228 } 189 229 190 230 static void __exit mk712_exit(void) 191 231 { 192 - input_unregister_device(&mk712_dev); 193 - free_irq(mk712_irq, &mk712_dev); 232 + input_unregister_device(mk712_dev); 233 + free_irq(mk712_irq, mk712_dev); 194 234 release_region(mk712_io, 8); 195 235 } 196 236
+32 -32
drivers/input/touchscreen/mtouch.c
··· 51 51 #define MTOUCH_GET_YC(data) (((data[4])<<7) | data[3]) 52 52 #define MTOUCH_GET_TOUCHED(data) (MTOUCH_FORMAT_TABLET_TOUCH_BIT & data[0]) 53 53 54 - static char *mtouch_name = "MicroTouch Serial TouchScreen"; 55 - 56 54 /* 57 55 * Per-touchscreen data. 58 56 */ 59 57 60 58 struct mtouch { 61 - struct input_dev dev; 59 + struct input_dev *dev; 62 60 struct serio *serio; 63 61 int idx; 64 62 unsigned char data[MTOUCH_MAX_LENGTH]; ··· 65 67 66 68 static void mtouch_process_format_tablet(struct mtouch *mtouch, struct pt_regs *regs) 67 69 { 68 - struct input_dev *dev = &mtouch->dev; 70 + struct input_dev *dev = mtouch->dev; 69 71 70 72 if (MTOUCH_FORMAT_TABLET_LENGTH == ++mtouch->idx) { 71 73 input_regs(dev, regs); ··· 114 116 { 115 117 struct mtouch* mtouch = serio_get_drvdata(serio); 116 118 117 - input_unregister_device(&mtouch->dev); 119 + input_get_device(mtouch->dev); 120 + input_unregister_device(mtouch->dev); 118 121 serio_close(serio); 119 122 serio_set_drvdata(serio, NULL); 123 + input_put_device(mtouch->dev); 120 124 kfree(mtouch); 121 125 } 122 126 ··· 131 131 static int mtouch_connect(struct serio *serio, struct serio_driver *drv) 132 132 { 133 133 struct mtouch *mtouch; 134 + struct input_dev *input_dev; 134 135 int err; 135 136 136 - if (!(mtouch = kmalloc(sizeof(*mtouch), GFP_KERNEL))) 137 - return -ENOMEM; 138 - 139 - memset(mtouch, 0, sizeof(*mtouch)); 140 - 141 - init_input_dev(&mtouch->dev); 142 - mtouch->dev.evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 143 - mtouch->dev.keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 144 - 145 - input_set_abs_params(&mtouch->dev, ABS_X, MTOUCH_MIN_XC, MTOUCH_MAX_XC, 0, 0); 146 - input_set_abs_params(&mtouch->dev, ABS_Y, MTOUCH_MIN_YC, MTOUCH_MAX_YC, 0, 0); 137 + mtouch = kzalloc(sizeof(struct mtouch), GFP_KERNEL); 138 + input_dev = input_allocate_device(); 139 + if (!mtouch || !input_dev) { 140 + err = -ENOMEM; 141 + goto fail; 142 + } 147 143 148 144 mtouch->serio = serio; 149 - 145 + mtouch->dev = input_dev; 150 146 sprintf(mtouch->phys, "%s/input0", serio->phys); 151 147 152 - mtouch->dev.private = mtouch; 153 - mtouch->dev.name = mtouch_name; 154 - mtouch->dev.phys = mtouch->phys; 155 - mtouch->dev.id.bustype = BUS_RS232; 156 - mtouch->dev.id.vendor = SERIO_MICROTOUCH; 157 - mtouch->dev.id.product = 0; 158 - mtouch->dev.id.version = 0x0100; 148 + input_dev->private = mtouch; 149 + input_dev->name = "MicroTouch Serial TouchScreen"; 150 + input_dev->phys = mtouch->phys; 151 + input_dev->id.bustype = BUS_RS232; 152 + input_dev->id.vendor = SERIO_MICROTOUCH; 153 + input_dev->id.product = 0; 154 + input_dev->id.version = 0x0100; 155 + input_dev->evbit[0] = BIT(EV_KEY) | BIT(EV_ABS); 156 + input_dev->keybit[LONG(BTN_TOUCH)] = BIT(BTN_TOUCH); 157 + input_set_abs_params(mtouch->dev, ABS_X, MTOUCH_MIN_XC, MTOUCH_MAX_XC, 0, 0); 158 + input_set_abs_params(mtouch->dev, ABS_Y, MTOUCH_MIN_YC, MTOUCH_MAX_YC, 0, 0); 159 159 160 160 serio_set_drvdata(serio, mtouch); 161 161 162 162 err = serio_open(serio, drv); 163 - if (err) { 164 - serio_set_drvdata(serio, NULL); 165 - kfree(mtouch); 166 - return err; 167 - } 163 + if (err) 164 + goto fail; 168 165 169 - input_register_device(&mtouch->dev); 170 - 171 - printk(KERN_INFO "input: %s on %s\n", mtouch->dev.name, serio->phys); 166 + input_register_device(mtouch->dev); 172 167 173 168 return 0; 169 + 170 + fail: serio_set_drvdata(serio, NULL); 171 + input_free_device(input_dev); 172 + kfree(mtouch); 173 + return err; 174 174 } 175 175 176 176 /*