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

Input: parkbd - use parallel port device model

Modify parkbd driver to use the new Parallel Port device model.

Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org>
Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>

authored by

Sudip Mukherjee and committed by
Dmitry Torokhov
33ca8ab9 7b415285

+39 -20
+39 -20
drivers/input/serio/parkbd.c
··· 141 141 parkbd_last = jiffies; 142 142 } 143 143 144 - static int parkbd_getport(void) 144 + static int parkbd_getport(struct parport *pp) 145 145 { 146 - struct parport *pp; 146 + struct pardev_cb parkbd_parport_cb; 147 147 148 - pp = parport_find_number(parkbd_pp_no); 148 + parkbd_parport_cb.irq_func = parkbd_interrupt; 149 + parkbd_parport_cb.flags = PARPORT_FLAG_EXCL; 149 150 150 - if (pp == NULL) { 151 - printk(KERN_ERR "parkbd: no such parport\n"); 152 - return -ENODEV; 153 - } 154 - 155 - parkbd_dev = parport_register_device(pp, "parkbd", NULL, NULL, parkbd_interrupt, PARPORT_DEV_EXCL, NULL); 156 - parport_put_port(pp); 151 + parkbd_dev = parport_register_dev_model(pp, "parkbd", 152 + &parkbd_parport_cb, 0); 157 153 158 154 if (!parkbd_dev) 159 155 return -ENODEV; ··· 179 183 return serio; 180 184 } 181 185 182 - static int __init parkbd_init(void) 186 + static void parkbd_attach(struct parport *pp) 183 187 { 184 - int err; 188 + if (pp->number != parkbd_pp_no) { 189 + pr_debug("Not using parport%d.\n", pp->number); 190 + return; 191 + } 185 192 186 - err = parkbd_getport(); 187 - if (err) 188 - return err; 193 + if (parkbd_getport(pp)) 194 + return; 189 195 190 196 parkbd_port = parkbd_allocate_serio(); 191 197 if (!parkbd_port) { 192 198 parport_release(parkbd_dev); 193 199 parport_unregister_device(parkbd_dev); 194 - return -ENOMEM; 200 + return; 195 201 } 196 202 197 203 parkbd_writelines(3); ··· 203 205 printk(KERN_INFO "serio: PARKBD %s adapter on %s\n", 204 206 parkbd_mode ? "AT" : "XT", parkbd_dev->port->name); 205 207 206 - return 0; 208 + return; 209 + } 210 + 211 + static void parkbd_detach(struct parport *port) 212 + { 213 + if (!parkbd_port || port->number != parkbd_pp_no) 214 + return; 215 + 216 + parport_release(parkbd_dev); 217 + serio_unregister_port(parkbd_port); 218 + parport_unregister_device(parkbd_dev); 219 + parkbd_port = NULL; 220 + } 221 + 222 + static struct parport_driver parkbd_parport_driver = { 223 + .name = "parkbd", 224 + .match_port = parkbd_attach, 225 + .detach = parkbd_detach, 226 + .devmodel = true, 227 + }; 228 + 229 + static int __init parkbd_init(void) 230 + { 231 + return parport_register_driver(&parkbd_parport_driver); 207 232 } 208 233 209 234 static void __exit parkbd_exit(void) 210 235 { 211 - parport_release(parkbd_dev); 212 - serio_unregister_port(parkbd_port); 213 - parport_unregister_device(parkbd_dev); 236 + parport_unregister_driver(&parkbd_parport_driver); 214 237 } 215 238 216 239 module_init(parkbd_init);