.. | .. |
---|
479 | 479 | return -ENOMEM; |
---|
480 | 480 | } |
---|
481 | 481 | |
---|
482 | | - dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL); |
---|
| 482 | + dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL); |
---|
483 | 483 | |
---|
484 | 484 | if (!dvbdevfops){ |
---|
485 | 485 | kfree (dvbdev); |
---|
.. | .. |
---|
495 | 495 | dvbdev->fops = dvbdevfops; |
---|
496 | 496 | init_waitqueue_head (&dvbdev->wait_queue); |
---|
497 | 497 | |
---|
498 | | - memcpy(dvbdevfops, template->fops, sizeof(struct file_operations)); |
---|
499 | 498 | dvbdevfops->owner = adap->module; |
---|
500 | 499 | |
---|
501 | 500 | list_add_tail (&dvbdev->list_head, &adap->device_list); |
---|
.. | .. |
---|
529 | 528 | dvb_media_device_free(dvbdev); |
---|
530 | 529 | kfree(dvbdevfops); |
---|
531 | 530 | kfree(dvbdev); |
---|
532 | | - up_write(&minor_rwsem); |
---|
533 | 531 | mutex_unlock(&dvbdev_register_lock); |
---|
534 | 532 | return ret; |
---|
535 | 533 | } |
---|
.. | .. |
---|
624 | 622 | unsigned demux_pad = 0; |
---|
625 | 623 | unsigned dvr_pad = 0; |
---|
626 | 624 | unsigned ntuner = 0, ndemod = 0; |
---|
627 | | - int ret; |
---|
| 625 | + int ret, pad_source, pad_sink; |
---|
628 | 626 | static const char *connector_name = "Television"; |
---|
629 | 627 | |
---|
630 | 628 | if (!mdev) |
---|
.. | .. |
---|
684 | 682 | if (ret) |
---|
685 | 683 | return ret; |
---|
686 | 684 | |
---|
687 | | - if (!ntuner) |
---|
| 685 | + if (!ntuner) { |
---|
688 | 686 | ret = media_create_pad_links(mdev, |
---|
689 | 687 | MEDIA_ENT_F_CONN_RF, |
---|
690 | 688 | conn, 0, |
---|
.. | .. |
---|
692 | 690 | demod, 0, |
---|
693 | 691 | MEDIA_LNK_FL_ENABLED, |
---|
694 | 692 | false); |
---|
695 | | - else |
---|
| 693 | + } else { |
---|
| 694 | + pad_sink = media_get_pad_index(tuner, true, |
---|
| 695 | + PAD_SIGNAL_ANALOG); |
---|
| 696 | + if (pad_sink < 0) |
---|
| 697 | + return -EINVAL; |
---|
696 | 698 | ret = media_create_pad_links(mdev, |
---|
697 | 699 | MEDIA_ENT_F_CONN_RF, |
---|
698 | 700 | conn, 0, |
---|
699 | 701 | MEDIA_ENT_F_TUNER, |
---|
700 | | - tuner, TUNER_PAD_RF_INPUT, |
---|
| 702 | + tuner, pad_sink, |
---|
701 | 703 | MEDIA_LNK_FL_ENABLED, |
---|
702 | 704 | false); |
---|
| 705 | + } |
---|
703 | 706 | if (ret) |
---|
704 | 707 | return ret; |
---|
705 | 708 | } |
---|
706 | 709 | |
---|
707 | 710 | if (ntuner && ndemod) { |
---|
| 711 | + /* NOTE: first found tuner source pad presumed correct */ |
---|
| 712 | + pad_source = media_get_pad_index(tuner, false, |
---|
| 713 | + PAD_SIGNAL_ANALOG); |
---|
| 714 | + if (pad_source < 0) |
---|
| 715 | + return -EINVAL; |
---|
708 | 716 | ret = media_create_pad_links(mdev, |
---|
709 | 717 | MEDIA_ENT_F_TUNER, |
---|
710 | | - tuner, TUNER_PAD_OUTPUT, |
---|
| 718 | + tuner, pad_source, |
---|
711 | 719 | MEDIA_ENT_F_DTV_DEMOD, |
---|
712 | 720 | demod, 0, MEDIA_LNK_FL_ENABLED, |
---|
713 | 721 | false); |
---|
.. | .. |
---|
892 | 900 | |
---|
893 | 901 | /* if the miracle happens and "generic_usercopy()" is included into |
---|
894 | 902 | the kernel, then this can vanish. please don't make the mistake and |
---|
895 | | - define this as video_usercopy(). this will introduce a dependecy |
---|
| 903 | + define this as video_usercopy(). this will introduce a dependency |
---|
896 | 904 | to the v4l "videodev.o" module, which is unnecessary for some |
---|
897 | 905 | cards (ie. the budget dvb-cards don't need the v4l module...) */ |
---|
898 | 906 | int dvb_usercopy(struct file *file, |
---|
.. | .. |
---|
970 | 978 | return NULL; |
---|
971 | 979 | |
---|
972 | 980 | if (name) |
---|
973 | | - strlcpy(board_info->type, name, I2C_NAME_SIZE); |
---|
| 981 | + strscpy(board_info->type, name, I2C_NAME_SIZE); |
---|
974 | 982 | else |
---|
975 | | - strlcpy(board_info->type, module_name, I2C_NAME_SIZE); |
---|
| 983 | + strscpy(board_info->type, module_name, I2C_NAME_SIZE); |
---|
976 | 984 | |
---|
977 | 985 | board_info->addr = addr; |
---|
978 | 986 | board_info->platform_data = platform_data; |
---|
979 | 987 | request_module(module_name); |
---|
980 | | - client = i2c_new_device(adap, board_info); |
---|
981 | | - if (client == NULL || client->dev.driver == NULL) { |
---|
| 988 | + client = i2c_new_client_device(adap, board_info); |
---|
| 989 | + if (!i2c_client_has_driver(client)) { |
---|
982 | 990 | kfree(board_info); |
---|
983 | 991 | return NULL; |
---|
984 | 992 | } |
---|