aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSudip Mukherjee <sudipm.mukherjee@gmail.com>2015-09-28 19:09:51 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2015-09-28 19:12:17 -0400
commit2260c419b52bd71166aa96fac9081388f76df5e0 (patch)
treeffcc2a24cf9b705bb59a9e07af058e60aec5d1ce
parent09bb431951f7d339bf5ef7179ae807e519928121 (diff)
Input: db9 - use parallel port device model
Modify db9 driver to use the new Parallel Port device model. Signed-off-by: Sudip Mukherjee <sudip@vectorindia.org> Tested-By: Pali Rohár <pali.rohar@gmail.com> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
-rw-r--r--drivers/input/joystick/db9.c110
1 files changed, 56 insertions, 54 deletions
diff --git a/drivers/input/joystick/db9.c b/drivers/input/joystick/db9.c
index 8e7de5c7754f..cf1f602e0f0a 100644
--- a/drivers/input/joystick/db9.c
+++ b/drivers/input/joystick/db9.c
@@ -48,7 +48,7 @@ struct db9_config {
48}; 48};
49 49
50#define DB9_MAX_PORTS 3 50#define DB9_MAX_PORTS 3
51static struct db9_config db9_cfg[DB9_MAX_PORTS] __initdata; 51static struct db9_config db9_cfg[DB9_MAX_PORTS];
52 52
53module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0); 53module_param_array_named(dev, db9_cfg[0].args, int, &db9_cfg[0].nargs, 0);
54MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)"); 54MODULE_PARM_DESC(dev, "Describes first attached device (<parport#>,<type>)");
@@ -106,6 +106,7 @@ struct db9 {
106 struct pardevice *pd; 106 struct pardevice *pd;
107 int mode; 107 int mode;
108 int used; 108 int used;
109 int parportno;
109 struct mutex mutex; 110 struct mutex mutex;
110 char phys[DB9_MAX_DEVICES][32]; 111 char phys[DB9_MAX_DEVICES][32];
111}; 112};
@@ -553,54 +554,60 @@ static void db9_close(struct input_dev *dev)
553 mutex_unlock(&db9->mutex); 554 mutex_unlock(&db9->mutex);
554} 555}
555 556
556static struct db9 __init *db9_probe(int parport, int mode) 557static void db9_attach(struct parport *pp)
557{ 558{
558 struct db9 *db9; 559 struct db9 *db9;
559 const struct db9_mode_data *db9_mode; 560 const struct db9_mode_data *db9_mode;
560 struct parport *pp;
561 struct pardevice *pd; 561 struct pardevice *pd;
562 struct input_dev *input_dev; 562 struct input_dev *input_dev;
563 int i, j; 563 int i, j;
564 int err; 564 int mode;
565 struct pardev_cb db9_parport_cb;
566
567 for (i = 0; i < DB9_MAX_PORTS; i++) {
568 if (db9_cfg[i].nargs == 0 ||
569 db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
570 continue;
571
572 if (db9_cfg[i].args[DB9_ARG_PARPORT] == pp->number)
573 break;
574 }
575
576 if (i == DB9_MAX_PORTS) {
577 pr_debug("Not using parport%d.\n", pp->number);
578 return;
579 }
580
581 mode = db9_cfg[i].args[DB9_ARG_MODE];
565 582
566 if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) { 583 if (mode < 1 || mode >= DB9_MAX_PAD || !db9_modes[mode].n_buttons) {
567 printk(KERN_ERR "db9.c: Bad device type %d\n", mode); 584 printk(KERN_ERR "db9.c: Bad device type %d\n", mode);
568 err = -EINVAL; 585 return;
569 goto err_out;
570 } 586 }
571 587
572 db9_mode = &db9_modes[mode]; 588 db9_mode = &db9_modes[mode];
573 589
574 pp = parport_find_number(parport);
575 if (!pp) {
576 printk(KERN_ERR "db9.c: no such parport\n");
577 err = -ENODEV;
578 goto err_out;
579 }
580
581 if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) { 590 if (db9_mode->bidirectional && !(pp->modes & PARPORT_MODE_TRISTATE)) {
582 printk(KERN_ERR "db9.c: specified parport is not bidirectional\n"); 591 printk(KERN_ERR "db9.c: specified parport is not bidirectional\n");
583 err = -EINVAL; 592 return;
584 goto err_put_pp;
585 } 593 }
586 594
587 pd = parport_register_device(pp, "db9", NULL, NULL, NULL, PARPORT_DEV_EXCL, NULL); 595 db9_parport_cb.flags = PARPORT_FLAG_EXCL;
596
597 pd = parport_register_dev_model(pp, "db9", &db9_parport_cb, i);
588 if (!pd) { 598 if (!pd) {
589 printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n"); 599 printk(KERN_ERR "db9.c: parport busy already - lp.o loaded?\n");
590 err = -EBUSY; 600 return;
591 goto err_put_pp;
592 } 601 }
593 602
594 db9 = kzalloc(sizeof(struct db9), GFP_KERNEL); 603 db9 = kzalloc(sizeof(struct db9), GFP_KERNEL);
595 if (!db9) { 604 if (!db9)
596 printk(KERN_ERR "db9.c: Not enough memory\n");
597 err = -ENOMEM;
598 goto err_unreg_pardev; 605 goto err_unreg_pardev;
599 }
600 606
601 mutex_init(&db9->mutex); 607 mutex_init(&db9->mutex);
602 db9->pd = pd; 608 db9->pd = pd;
603 db9->mode = mode; 609 db9->mode = mode;
610 db9->parportno = pp->number;
604 init_timer(&db9->timer); 611 init_timer(&db9->timer);
605 db9->timer.data = (long) db9; 612 db9->timer.data = (long) db9;
606 db9->timer.function = db9_timer; 613 db9->timer.function = db9_timer;
@@ -610,7 +617,6 @@ static struct db9 __init *db9_probe(int parport, int mode)
610 db9->dev[i] = input_dev = input_allocate_device(); 617 db9->dev[i] = input_dev = input_allocate_device();
611 if (!input_dev) { 618 if (!input_dev) {
612 printk(KERN_ERR "db9.c: Not enough memory for input device\n"); 619 printk(KERN_ERR "db9.c: Not enough memory for input device\n");
613 err = -ENOMEM;
614 goto err_unreg_devs; 620 goto err_unreg_devs;
615 } 621 }
616 622
@@ -639,13 +645,12 @@ static struct db9 __init *db9_probe(int parport, int mode)
639 input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0); 645 input_set_abs_params(input_dev, db9_abs[j], 1, 255, 0, 0);
640 } 646 }
641 647
642 err = input_register_device(input_dev); 648 if (input_register_device(input_dev))
643 if (err)
644 goto err_free_dev; 649 goto err_free_dev;
645 } 650 }
646 651
647 parport_put_port(pp); 652 db9_base[i] = db9;
648 return db9; 653 return;
649 654
650 err_free_dev: 655 err_free_dev:
651 input_free_device(db9->dev[i]); 656 input_free_device(db9->dev[i]);
@@ -655,15 +660,22 @@ static struct db9 __init *db9_probe(int parport, int mode)
655 kfree(db9); 660 kfree(db9);
656 err_unreg_pardev: 661 err_unreg_pardev:
657 parport_unregister_device(pd); 662 parport_unregister_device(pd);
658 err_put_pp:
659 parport_put_port(pp);
660 err_out:
661 return ERR_PTR(err);
662} 663}
663 664
664static void db9_remove(struct db9 *db9) 665static void db9_detach(struct parport *port)
665{ 666{
666 int i; 667 int i;
668 struct db9 *db9;
669
670 for (i = 0; i < DB9_MAX_PORTS; i++) {
671 if (db9_base[i] && db9_base[i]->parportno == port->number)
672 break;
673 }
674
675 if (i == DB9_MAX_PORTS)
676 return;
677
678 db9 = db9_base[i];
667 679
668 for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++) 680 for (i = 0; i < min(db9_modes[db9->mode].n_pads, DB9_MAX_DEVICES); i++)
669 input_unregister_device(db9->dev[i]); 681 input_unregister_device(db9->dev[i]);
@@ -671,11 +683,17 @@ static void db9_remove(struct db9 *db9)
671 kfree(db9); 683 kfree(db9);
672} 684}
673 685
686static struct parport_driver db9_parport_driver = {
687 .name = "db9",
688 .match_port = db9_attach,
689 .detach = db9_detach,
690 .devmodel = true,
691};
692
674static int __init db9_init(void) 693static int __init db9_init(void)
675{ 694{
676 int i; 695 int i;
677 int have_dev = 0; 696 int have_dev = 0;
678 int err = 0;
679 697
680 for (i = 0; i < DB9_MAX_PORTS; i++) { 698 for (i = 0; i < DB9_MAX_PORTS; i++) {
681 if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0) 699 if (db9_cfg[i].nargs == 0 || db9_cfg[i].args[DB9_ARG_PARPORT] < 0)
@@ -683,37 +701,21 @@ static int __init db9_init(void)
683 701
684 if (db9_cfg[i].nargs < 2) { 702 if (db9_cfg[i].nargs < 2) {
685 printk(KERN_ERR "db9.c: Device type must be specified.\n"); 703 printk(KERN_ERR "db9.c: Device type must be specified.\n");
686 err = -EINVAL; 704 return -EINVAL;
687 break;
688 }
689
690 db9_base[i] = db9_probe(db9_cfg[i].args[DB9_ARG_PARPORT],
691 db9_cfg[i].args[DB9_ARG_MODE]);
692 if (IS_ERR(db9_base[i])) {
693 err = PTR_ERR(db9_base[i]);
694 break;
695 } 705 }
696 706
697 have_dev = 1; 707 have_dev = 1;
698 } 708 }
699 709
700 if (err) { 710 if (!have_dev)
701 while (--i >= 0) 711 return -ENODEV;
702 if (db9_base[i])
703 db9_remove(db9_base[i]);
704 return err;
705 }
706 712
707 return have_dev ? 0 : -ENODEV; 713 return parport_register_driver(&db9_parport_driver);
708} 714}
709 715
710static void __exit db9_exit(void) 716static void __exit db9_exit(void)
711{ 717{
712 int i; 718 parport_unregister_driver(&db9_parport_driver);
713
714 for (i = 0; i < DB9_MAX_PORTS; i++)
715 if (db9_base[i])
716 db9_remove(db9_base[i]);
717} 719}
718 720
719module_init(db9_init); 721module_init(db9_init);