Mercurial > pt1
comparison driver/pt1_pci.c @ 50:23b6f99f65b2
propagate upstream change:
- adapted to FastBoot. use spinlock to avoid resource contention between multiple number of cards.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Thu, 27 Aug 2009 21:39:14 +0900 |
parents | 07d71b1484a8 |
children | c915076353ae |
comparison
equal
deleted
inserted
replaced
49:6bcdd17c12f6 | 50:23b6f99f65b2 |
---|---|
49 MODULE_AUTHOR("Tomoaki Ishikawa tomy@users.sourceforge.jp"); | 49 MODULE_AUTHOR("Tomoaki Ishikawa tomy@users.sourceforge.jp"); |
50 #define DRIVER_DESC "PCI earthsoft PT1 driver" | 50 #define DRIVER_DESC "PCI earthsoft PT1 driver" |
51 MODULE_DESCRIPTION(DRIVER_DESC); | 51 MODULE_DESCRIPTION(DRIVER_DESC); |
52 MODULE_LICENSE("GPL"); | 52 MODULE_LICENSE("GPL"); |
53 | 53 |
54 static int debug = 7; /* 1 normal messages, 0 quiet .. 7 verbose. */ | 54 static int debug = 7; /* 1 normal messages, 0 quiet .. |
55 static int lnb = 0; /* LNB OFF:0 +11V:1 +15V:2 */ | 55 7 verbose. */ |
56 static int lnb = 0; /* LNB OFF:0 +11V:1 +15V:2 */ | |
57 static spinlock_t lock; /* to synchronize at probing */ | |
56 | 58 |
57 module_param(debug, int, 0); | 59 module_param(debug, int, 0); |
58 module_param(lnb, int, 0); | 60 module_param(lnb, int, 0); |
59 MODULE_PARM_DESC(debug, "debug level (1-2)"); | 61 MODULE_PARM_DESC(debug, "debug level (1-2)"); |
60 MODULE_PARM_DESC(debug, "LNB level (0:OFF 1:+11V 2:+15V)"); | 62 MODULE_PARM_DESC(debug, "LNB level (0:OFF 1:+11V 2:+15V)"); |
696 if(rc < 0){ | 698 if(rc < 0){ |
697 printk(KERN_ERR "Error tuner_init\n"); | 699 printk(KERN_ERR "Error tuner_init\n"); |
698 goto out_err_fpga; | 700 goto out_err_fpga; |
699 } | 701 } |
700 } | 702 } |
703 | |
704 spin_lock(&lock); | |
705 | |
701 // 初期化完了 | 706 // 初期化完了 |
702 for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ | 707 for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ |
703 set_sleepmode(dev_conf->regs, &dev_conf->lock, | 708 set_sleepmode(dev_conf->regs, &dev_conf->lock, |
704 i2c_address[lp], channeltype[lp], TYPE_SLEEP); | 709 i2c_address[lp], channeltype[lp], TYPE_SLEEP); |
705 | 710 |
706 schedule_timeout_interruptible(msecs_to_jiffies(50)); | 711 schedule_timeout_interruptible(msecs_to_jiffies(50)); |
707 } | 712 } |
708 rc = alloc_chrdev_region(&dev_conf->dev, 0, MAX_CHANNEL, DEV_NAME); | 713 rc = alloc_chrdev_region(&dev_conf->dev, 0, MAX_CHANNEL, DEV_NAME); |
709 if(rc < 0){ | 714 if(rc < 0){ |
715 spin_unlock(&lock); | |
710 goto out_err_fpga; | 716 goto out_err_fpga; |
711 } | 717 } |
712 | 718 |
713 // 初期化 | 719 // 初期化 |
714 init_waitqueue_head(&dev_conf->dma_wait_q); | 720 init_waitqueue_head(&dev_conf->dma_wait_q); |
721 device[lp] = dev_conf ; | 727 device[lp] = dev_conf ; |
722 dev_conf->card_number = lp; | 728 dev_conf->card_number = lp; |
723 break ; | 729 break ; |
724 } | 730 } |
725 } | 731 } |
732 | |
733 spin_unlock(&lock); | |
734 | |
726 for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ | 735 for(lp = 0 ; lp < MAX_CHANNEL ; lp++){ |
727 cdev_init(&dev_conf->cdev[lp], &pt1_fops); | 736 cdev_init(&dev_conf->cdev[lp], &pt1_fops); |
728 dev_conf->cdev[lp].owner = THIS_MODULE; | 737 dev_conf->cdev[lp].owner = THIS_MODULE; |
729 cdev_add(&dev_conf->cdev[lp], | 738 cdev_add(&dev_conf->cdev[lp], |
730 MKDEV(MAJOR(dev_conf->dev), (MINOR(dev_conf->dev) + lp)), 1); | 739 MKDEV(MAJOR(dev_conf->dev), (MINOR(dev_conf->dev) + lp)), 1); |
908 { | 917 { |
909 printk(version); | 918 printk(version); |
910 pt1video_class = class_create(THIS_MODULE, DRIVERNAME); | 919 pt1video_class = class_create(THIS_MODULE, DRIVERNAME); |
911 if (IS_ERR(pt1video_class)) | 920 if (IS_ERR(pt1video_class)) |
912 return PTR_ERR(pt1video_class); | 921 return PTR_ERR(pt1video_class); |
922 spin_lock_init(&lock); | |
913 return pci_register_driver(&pt1_driver); | 923 return pci_register_driver(&pt1_driver); |
914 } | 924 } |
915 | 925 |
916 | 926 |
917 static void __exit pt1_pci_cleanup(void) | 927 static void __exit pt1_pci_cleanup(void) |