| .. | .. |
|---|
| 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 | } |
|---|