diff options
Diffstat (limited to 'drivers/media/dvb/ttpci')
-rw-r--r-- | drivers/media/dvb/ttpci/Kconfig | 9 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110.c | 251 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110.h | 7 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_av.c | 220 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_av.h | 4 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_hw.c | 395 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_hw.h | 12 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/av7110_ipack.c | 2 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-av.c | 10 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget-ci.c | 21 | ||||
-rw-r--r-- | drivers/media/dvb/ttpci/budget.c | 99 |
11 files changed, 642 insertions, 388 deletions
diff --git a/drivers/media/dvb/ttpci/Kconfig b/drivers/media/dvb/ttpci/Kconfig index 7ffa2c7315b3..bf3c011d2cfb 100644 --- a/drivers/media/dvb/ttpci/Kconfig +++ b/drivers/media/dvb/ttpci/Kconfig | |||
@@ -12,7 +12,7 @@ config DVB_AV7110 | |||
12 | select DVB_STV0297 | 12 | select DVB_STV0297 |
13 | select DVB_L64781 | 13 | select DVB_L64781 |
14 | help | 14 | help |
15 | Support for SAA7146 and AV7110 based DVB cards as produced | 15 | Support for SAA7146 and AV7110 based DVB cards as produced |
16 | by Fujitsu-Siemens, Technotrend, Hauppauge and others. | 16 | by Fujitsu-Siemens, Technotrend, Hauppauge and others. |
17 | 17 | ||
18 | This driver only supports the fullfeatured cards with | 18 | This driver only supports the fullfeatured cards with |
@@ -33,7 +33,7 @@ config DVB_AV7110_FIRMWARE | |||
33 | If you want to compile the firmware into the driver you need to say | 33 | If you want to compile the firmware into the driver you need to say |
34 | Y here and provide the correct path of the firmware. You need this | 34 | Y here and provide the correct path of the firmware. You need this |
35 | option if you want to compile the whole driver statically into the | 35 | option if you want to compile the whole driver statically into the |
36 | kernel. | 36 | kernel. |
37 | 37 | ||
38 | All other people say N. | 38 | All other people say N. |
39 | 39 | ||
@@ -66,6 +66,7 @@ config DVB_BUDGET | |||
66 | select DVB_L64781 | 66 | select DVB_L64781 |
67 | select DVB_TDA8083 | 67 | select DVB_TDA8083 |
68 | select DVB_TDA10021 | 68 | select DVB_TDA10021 |
69 | select DVB_S5H1420 | ||
69 | help | 70 | help |
70 | Support for simple SAA7146 based DVB cards | 71 | Support for simple SAA7146 based DVB cards |
71 | (so called Budget- or Nova-PCI cards) without onboard | 72 | (so called Budget- or Nova-PCI cards) without onboard |
@@ -119,9 +120,9 @@ config DVB_BUDGET_PATCH | |||
119 | select DVB_VES1X93 | 120 | select DVB_VES1X93 |
120 | select DVB_TDA8083 | 121 | select DVB_TDA8083 |
121 | help | 122 | help |
122 | Support for Budget Patch (full TS) modification on | 123 | Support for Budget Patch (full TS) modification on |
123 | SAA7146+AV7110 based cards (DVB-S cards). This | 124 | SAA7146+AV7110 based cards (DVB-S cards). This |
124 | driver doesn't use onboard MPEG2 decoder. The | 125 | driver doesn't use onboard MPEG2 decoder. The |
125 | card is driven in Budget-only mode. Card is | 126 | card is driven in Budget-only mode. Card is |
126 | required to have loaded firmware to tune properly. | 127 | required to have loaded firmware to tune properly. |
127 | Firmware can be loaded by insertion and removal of | 128 | Firmware can be loaded by insertion and removal of |
diff --git a/drivers/media/dvb/ttpci/av7110.c b/drivers/media/dvb/ttpci/av7110.c index 8e33a850e13e..e4c6e87f6c5d 100644 --- a/drivers/media/dvb/ttpci/av7110.c +++ b/drivers/media/dvb/ttpci/av7110.c | |||
@@ -116,13 +116,18 @@ static int av7110_num = 0; | |||
116 | 116 | ||
117 | static void init_av7110_av(struct av7110 *av7110) | 117 | static void init_av7110_av(struct av7110 *av7110) |
118 | { | 118 | { |
119 | int ret; | ||
119 | struct saa7146_dev *dev = av7110->dev; | 120 | struct saa7146_dev *dev = av7110->dev; |
120 | 121 | ||
121 | /* set internal volume control to maximum */ | 122 | /* set internal volume control to maximum */ |
122 | av7110->adac_type = DVB_ADAC_TI; | 123 | av7110->adac_type = DVB_ADAC_TI; |
123 | av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right); | 124 | ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right); |
125 | if (ret < 0) | ||
126 | printk("dvb-ttpci:cannot set internal volume to maximum:%d\n",ret); | ||
124 | 127 | ||
125 | av7710_set_video_mode(av7110, vidmode); | 128 | ret = av7710_set_video_mode(av7110, vidmode); |
129 | if (ret < 0) | ||
130 | printk("dvb-ttpci:cannot set video mode:%d\n",ret); | ||
126 | 131 | ||
127 | /* handle different card types */ | 132 | /* handle different card types */ |
128 | /* remaining inits according to card and frontend type */ | 133 | /* remaining inits according to card and frontend type */ |
@@ -156,8 +161,12 @@ static void init_av7110_av(struct av7110 *av7110) | |||
156 | 161 | ||
157 | if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP) { | 162 | if (av7110->adac_type == DVB_ADAC_NONE || av7110->adac_type == DVB_ADAC_MSP) { |
158 | // switch DVB SCART on | 163 | // switch DVB SCART on |
159 | av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0); | 164 | ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, MainSwitch, 1, 0); |
160 | av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1); | 165 | if (ret < 0) |
166 | printk("dvb-ttpci:cannot switch on SCART(Main):%d\n",ret); | ||
167 | ret = av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, ADSwitch, 1, 1); | ||
168 | if (ret < 0) | ||
169 | printk("dvb-ttpci:cannot switch on SCART(AD):%d\n",ret); | ||
161 | if (rgb_on && | 170 | if (rgb_on && |
162 | (av7110->dev->pci->subsystem_vendor == 0x110a) && (av7110->dev->pci->subsystem_device == 0x0000)) { | 171 | (av7110->dev->pci->subsystem_vendor == 0x110a) && (av7110->dev->pci->subsystem_device == 0x0000)) { |
163 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16 | 172 | saa7146_setgpio(dev, 1, SAA7146_GPIO_OUTHI); // RGB on, SCART pin 16 |
@@ -165,8 +174,12 @@ static void init_av7110_av(struct av7110 *av7110) | |||
165 | } | 174 | } |
166 | } | 175 | } |
167 | 176 | ||
168 | av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right); | 177 | ret = av7110_set_volume(av7110, av7110->mixer.volume_left, av7110->mixer.volume_right); |
169 | av7110_setup_irc_config(av7110, 0); | 178 | if (ret < 0) |
179 | printk("dvb-ttpci:cannot set volume :%d\n",ret); | ||
180 | ret = av7110_setup_irc_config(av7110, 0); | ||
181 | if (ret < 0) | ||
182 | printk("dvb-ttpci:cannot setup irc config :%d\n",ret); | ||
170 | } | 183 | } |
171 | 184 | ||
172 | static void recover_arm(struct av7110 *av7110) | 185 | static void recover_arm(struct av7110 *av7110) |
@@ -258,8 +271,9 @@ static int arm_thread(void *data) | |||
258 | * | 271 | * |
259 | * If we want to support multiple controls we would have to do much more... | 272 | * If we want to support multiple controls we would have to do much more... |
260 | */ | 273 | */ |
261 | void av7110_setup_irc_config(struct av7110 *av7110, u32 ir_config) | 274 | int av7110_setup_irc_config(struct av7110 *av7110, u32 ir_config) |
262 | { | 275 | { |
276 | int ret = 0; | ||
263 | static struct av7110 *last; | 277 | static struct av7110 *last; |
264 | 278 | ||
265 | dprintk(4, "%p\n", av7110); | 279 | dprintk(4, "%p\n", av7110); |
@@ -270,9 +284,10 @@ void av7110_setup_irc_config(struct av7110 *av7110, u32 ir_config) | |||
270 | last = av7110; | 284 | last = av7110; |
271 | 285 | ||
272 | if (av7110) { | 286 | if (av7110) { |
273 | av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config); | 287 | ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, SetIR, 1, ir_config); |
274 | av7110->ir_config = ir_config; | 288 | av7110->ir_config = ir_config; |
275 | } | 289 | } |
290 | return ret; | ||
276 | } | 291 | } |
277 | 292 | ||
278 | static void (*irc_handler)(u32); | 293 | static void (*irc_handler)(u32); |
@@ -765,13 +780,14 @@ static inline int SetPIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, | |||
765 | pcrpid, vpid, apid, ttpid, subpid); | 780 | pcrpid, vpid, apid, ttpid, subpid); |
766 | } | 781 | } |
767 | 782 | ||
768 | void ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, | 783 | int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, |
769 | u16 subpid, u16 pcrpid) | 784 | u16 subpid, u16 pcrpid) |
770 | { | 785 | { |
786 | int ret = 0; | ||
771 | dprintk(4, "%p\n", av7110); | 787 | dprintk(4, "%p\n", av7110); |
772 | 788 | ||
773 | if (down_interruptible(&av7110->pid_mutex)) | 789 | if (down_interruptible(&av7110->pid_mutex)) |
774 | return; | 790 | return -ERESTARTSYS; |
775 | 791 | ||
776 | if (!(vpid & 0x8000)) | 792 | if (!(vpid & 0x8000)) |
777 | av7110->pids[DMX_PES_VIDEO] = vpid; | 793 | av7110->pids[DMX_PES_VIDEO] = vpid; |
@@ -786,10 +802,11 @@ void ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, | |||
786 | 802 | ||
787 | if (av7110->fe_synced) { | 803 | if (av7110->fe_synced) { |
788 | pcrpid = av7110->pids[DMX_PES_PCR]; | 804 | pcrpid = av7110->pids[DMX_PES_PCR]; |
789 | SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid); | 805 | ret = SetPIDs(av7110, vpid, apid, ttpid, subpid, pcrpid); |
790 | } | 806 | } |
791 | 807 | ||
792 | up(&av7110->pid_mutex); | 808 | up(&av7110->pid_mutex); |
809 | return ret; | ||
793 | } | 810 | } |
794 | 811 | ||
795 | 812 | ||
@@ -832,11 +849,13 @@ static int StartHWFilter(struct dvb_demux_filter *dvbdmxfilter) | |||
832 | ret = av7110_fw_request(av7110, buf, 20, &handle, 1); | 849 | ret = av7110_fw_request(av7110, buf, 20, &handle, 1); |
833 | if (ret != 0 || handle >= 32) { | 850 | if (ret != 0 || handle >= 32) { |
834 | printk("dvb-ttpci: %s error buf %04x %04x %04x %04x " | 851 | printk("dvb-ttpci: %s error buf %04x %04x %04x %04x " |
835 | "ret %x handle %04x\n", | 852 | "ret %d handle %04x\n", |
836 | __FUNCTION__, buf[0], buf[1], buf[2], buf[3], | 853 | __FUNCTION__, buf[0], buf[1], buf[2], buf[3], |
837 | ret, handle); | 854 | ret, handle); |
838 | dvbdmxfilter->hw_handle = 0xffff; | 855 | dvbdmxfilter->hw_handle = 0xffff; |
839 | return -1; | 856 | if (!ret) |
857 | ret = -1; | ||
858 | return ret; | ||
840 | } | 859 | } |
841 | 860 | ||
842 | av7110->handle2filter[handle] = dvbdmxfilter; | 861 | av7110->handle2filter[handle] = dvbdmxfilter; |
@@ -859,7 +878,7 @@ static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter) | |||
859 | if (handle >= 32) { | 878 | if (handle >= 32) { |
860 | printk("%s tried to stop invalid filter %04x, filter type = %x\n", | 879 | printk("%s tried to stop invalid filter %04x, filter type = %x\n", |
861 | __FUNCTION__, handle, dvbdmxfilter->type); | 880 | __FUNCTION__, handle, dvbdmxfilter->type); |
862 | return 0; | 881 | return -EINVAL; |
863 | } | 882 | } |
864 | 883 | ||
865 | av7110->handle2filter[handle] = NULL; | 884 | av7110->handle2filter[handle] = NULL; |
@@ -873,18 +892,20 @@ static int StopHWFilter(struct dvb_demux_filter *dvbdmxfilter) | |||
873 | "resp %04x %04x pid %d\n", | 892 | "resp %04x %04x pid %d\n", |
874 | __FUNCTION__, buf[0], buf[1], buf[2], ret, | 893 | __FUNCTION__, buf[0], buf[1], buf[2], ret, |
875 | answ[0], answ[1], dvbdmxfilter->feed->pid); | 894 | answ[0], answ[1], dvbdmxfilter->feed->pid); |
876 | ret = -1; | 895 | if (!ret) |
896 | ret = -1; | ||
877 | } | 897 | } |
878 | return ret; | 898 | return ret; |
879 | } | 899 | } |
880 | 900 | ||
881 | 901 | ||
882 | static void dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed) | 902 | static int dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed) |
883 | { | 903 | { |
884 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 904 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
885 | struct av7110 *av7110 = (struct av7110 *) dvbdmx->priv; | 905 | struct av7110 *av7110 = (struct av7110 *) dvbdmx->priv; |
886 | u16 *pid = dvbdmx->pids, npids[5]; | 906 | u16 *pid = dvbdmx->pids, npids[5]; |
887 | int i; | 907 | int i; |
908 | int ret = 0; | ||
888 | 909 | ||
889 | dprintk(4, "%p\n", av7110); | 910 | dprintk(4, "%p\n", av7110); |
890 | 911 | ||
@@ -893,36 +914,49 @@ static void dvb_feed_start_pid(struct dvb_demux_feed *dvbdmxfeed) | |||
893 | npids[i] = (pid[i]&0x8000) ? 0 : pid[i]; | 914 | npids[i] = (pid[i]&0x8000) ? 0 : pid[i]; |
894 | if ((i == 2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) { | 915 | if ((i == 2) && npids[i] && (dvbdmxfeed->ts_type & TS_PACKET)) { |
895 | npids[i] = 0; | 916 | npids[i] = 0; |
896 | ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); | 917 | ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); |
897 | StartHWFilter(dvbdmxfeed->filter); | 918 | if (!ret) |
898 | return; | 919 | ret = StartHWFilter(dvbdmxfeed->filter); |
920 | return ret; | ||
921 | } | ||
922 | if (dvbdmxfeed->pes_type <= 2 || dvbdmxfeed->pes_type == 4) { | ||
923 | ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); | ||
924 | if (ret) | ||
925 | return ret; | ||
899 | } | 926 | } |
900 | if (dvbdmxfeed->pes_type <= 2 || dvbdmxfeed->pes_type == 4) | ||
901 | ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); | ||
902 | 927 | ||
903 | if (dvbdmxfeed->pes_type < 2 && npids[0]) | 928 | if (dvbdmxfeed->pes_type < 2 && npids[0]) |
904 | if (av7110->fe_synced) | 929 | if (av7110->fe_synced) |
905 | av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | 930 | { |
931 | ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | ||
932 | if (ret) | ||
933 | return ret; | ||
934 | } | ||
906 | 935 | ||
907 | if ((dvbdmxfeed->ts_type & TS_PACKET)) { | 936 | if ((dvbdmxfeed->ts_type & TS_PACKET)) { |
908 | if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000)) | 937 | if (dvbdmxfeed->pes_type == 0 && !(dvbdmx->pids[0] & 0x8000)) |
909 | av7110_av_start_record(av7110, RP_AUDIO, dvbdmxfeed); | 938 | ret = av7110_av_start_record(av7110, RP_AUDIO, dvbdmxfeed); |
910 | if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000)) | 939 | if (dvbdmxfeed->pes_type == 1 && !(dvbdmx->pids[1] & 0x8000)) |
911 | av7110_av_start_record(av7110, RP_VIDEO, dvbdmxfeed); | 940 | ret = av7110_av_start_record(av7110, RP_VIDEO, dvbdmxfeed); |
912 | } | 941 | } |
942 | return ret; | ||
913 | } | 943 | } |
914 | 944 | ||
915 | static void dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed) | 945 | static int dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed) |
916 | { | 946 | { |
917 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 947 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
918 | struct av7110 *av7110 = (struct av7110 *) dvbdmx->priv; | 948 | struct av7110 *av7110 = (struct av7110 *) dvbdmx->priv; |
919 | u16 *pid = dvbdmx->pids, npids[5]; | 949 | u16 *pid = dvbdmx->pids, npids[5]; |
920 | int i; | 950 | int i; |
921 | 951 | ||
952 | int ret = 0; | ||
953 | |||
922 | dprintk(4, "%p\n", av7110); | 954 | dprintk(4, "%p\n", av7110); |
923 | 955 | ||
924 | if (dvbdmxfeed->pes_type <= 1) { | 956 | if (dvbdmxfeed->pes_type <= 1) { |
925 | av7110_av_stop(av7110, dvbdmxfeed->pes_type ? RP_VIDEO : RP_AUDIO); | 957 | ret = av7110_av_stop(av7110, dvbdmxfeed->pes_type ? RP_VIDEO : RP_AUDIO); |
958 | if (ret) | ||
959 | return ret; | ||
926 | if (!av7110->rec_mode) | 960 | if (!av7110->rec_mode) |
927 | dvbdmx->recording = 0; | 961 | dvbdmx->recording = 0; |
928 | if (!av7110->playing) | 962 | if (!av7110->playing) |
@@ -933,24 +967,27 @@ static void dvb_feed_stop_pid(struct dvb_demux_feed *dvbdmxfeed) | |||
933 | switch (i) { | 967 | switch (i) { |
934 | case 2: //teletext | 968 | case 2: //teletext |
935 | if (dvbdmxfeed->ts_type & TS_PACKET) | 969 | if (dvbdmxfeed->ts_type & TS_PACKET) |
936 | StopHWFilter(dvbdmxfeed->filter); | 970 | ret = StopHWFilter(dvbdmxfeed->filter); |
937 | npids[2] = 0; | 971 | npids[2] = 0; |
938 | break; | 972 | break; |
939 | case 0: | 973 | case 0: |
940 | case 1: | 974 | case 1: |
941 | case 4: | 975 | case 4: |
942 | if (!pids_off) | 976 | if (!pids_off) |
943 | return; | 977 | return 0; |
944 | npids[i] = (pid[i]&0x8000) ? 0 : pid[i]; | 978 | npids[i] = (pid[i]&0x8000) ? 0 : pid[i]; |
945 | break; | 979 | break; |
946 | } | 980 | } |
947 | ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); | 981 | if (!ret) |
982 | ret = ChangePIDs(av7110, npids[1], npids[0], npids[2], npids[3], npids[4]); | ||
983 | return ret; | ||
948 | } | 984 | } |
949 | 985 | ||
950 | static int av7110_start_feed(struct dvb_demux_feed *feed) | 986 | static int av7110_start_feed(struct dvb_demux_feed *feed) |
951 | { | 987 | { |
952 | struct dvb_demux *demux = feed->demux; | 988 | struct dvb_demux *demux = feed->demux; |
953 | struct av7110 *av7110 = demux->priv; | 989 | struct av7110 *av7110 = demux->priv; |
990 | int ret = 0; | ||
954 | 991 | ||
955 | dprintk(4, "%p\n", av7110); | 992 | dprintk(4, "%p\n", av7110); |
956 | 993 | ||
@@ -971,21 +1008,22 @@ static int av7110_start_feed(struct dvb_demux_feed *feed) | |||
971 | !(demux->pids[1] & 0x8000)) { | 1008 | !(demux->pids[1] & 0x8000)) { |
972 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); | 1009 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->avout); |
973 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); | 1010 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); |
974 | av7110_av_start_play(av7110,RP_AV); | 1011 | ret = av7110_av_start_play(av7110,RP_AV); |
975 | demux->playing = 1; | 1012 | if (!ret) |
1013 | demux->playing = 1; | ||
976 | } | 1014 | } |
977 | break; | 1015 | break; |
978 | default: | 1016 | default: |
979 | dvb_feed_start_pid(feed); | 1017 | ret = dvb_feed_start_pid(feed); |
980 | break; | 1018 | break; |
981 | } | 1019 | } |
982 | } else if ((feed->ts_type & TS_PACKET) && | 1020 | } else if ((feed->ts_type & TS_PACKET) && |
983 | (demux->dmx.frontend->source != DMX_MEMORY_FE)) { | 1021 | (demux->dmx.frontend->source != DMX_MEMORY_FE)) { |
984 | StartHWFilter(feed->filter); | 1022 | ret = StartHWFilter(feed->filter); |
985 | } | 1023 | } |
986 | } | 1024 | } |
987 | 1025 | ||
988 | if (feed->type == DMX_TYPE_SEC) { | 1026 | else if (feed->type == DMX_TYPE_SEC) { |
989 | int i; | 1027 | int i; |
990 | 1028 | ||
991 | for (i = 0; i < demux->filternum; i++) { | 1029 | for (i = 0; i < demux->filternum; i++) { |
@@ -996,12 +1034,15 @@ static int av7110_start_feed(struct dvb_demux_feed *feed) | |||
996 | if (demux->filter[i].filter.parent != &feed->feed.sec) | 1034 | if (demux->filter[i].filter.parent != &feed->feed.sec) |
997 | continue; | 1035 | continue; |
998 | demux->filter[i].state = DMX_STATE_GO; | 1036 | demux->filter[i].state = DMX_STATE_GO; |
999 | if (demux->dmx.frontend->source != DMX_MEMORY_FE) | 1037 | if (demux->dmx.frontend->source != DMX_MEMORY_FE) { |
1000 | StartHWFilter(&demux->filter[i]); | 1038 | ret = StartHWFilter(&demux->filter[i]); |
1039 | if (ret) | ||
1040 | break; | ||
1041 | } | ||
1001 | } | 1042 | } |
1002 | } | 1043 | } |
1003 | 1044 | ||
1004 | return 0; | 1045 | return ret; |
1005 | } | 1046 | } |
1006 | 1047 | ||
1007 | 1048 | ||
@@ -1009,7 +1050,7 @@ static int av7110_stop_feed(struct dvb_demux_feed *feed) | |||
1009 | { | 1050 | { |
1010 | struct dvb_demux *demux = feed->demux; | 1051 | struct dvb_demux *demux = feed->demux; |
1011 | struct av7110 *av7110 = demux->priv; | 1052 | struct av7110 *av7110 = demux->priv; |
1012 | 1053 | int i, rc, ret = 0; | |
1013 | dprintk(4, "%p\n", av7110); | 1054 | dprintk(4, "%p\n", av7110); |
1014 | 1055 | ||
1015 | if (feed->type == DMX_TYPE_TS) { | 1056 | if (feed->type == DMX_TYPE_TS) { |
@@ -1022,26 +1063,29 @@ static int av7110_stop_feed(struct dvb_demux_feed *feed) | |||
1022 | } | 1063 | } |
1023 | if (feed->ts_type & TS_DECODER && | 1064 | if (feed->ts_type & TS_DECODER && |
1024 | feed->pes_type < DMX_TS_PES_OTHER) { | 1065 | feed->pes_type < DMX_TS_PES_OTHER) { |
1025 | dvb_feed_stop_pid(feed); | 1066 | ret = dvb_feed_stop_pid(feed); |
1026 | } else | 1067 | } else |
1027 | if ((feed->ts_type & TS_PACKET) && | 1068 | if ((feed->ts_type & TS_PACKET) && |
1028 | (demux->dmx.frontend->source != DMX_MEMORY_FE)) | 1069 | (demux->dmx.frontend->source != DMX_MEMORY_FE)) |
1029 | StopHWFilter(feed->filter); | 1070 | ret = StopHWFilter(feed->filter); |
1030 | } | 1071 | } |
1031 | 1072 | ||
1032 | if (feed->type == DMX_TYPE_SEC) { | 1073 | if (!ret && feed->type == DMX_TYPE_SEC) { |
1033 | int i; | 1074 | for (i = 0; i<demux->filternum; i++) { |
1034 | |||
1035 | for (i = 0; i<demux->filternum; i++) | ||
1036 | if (demux->filter[i].state == DMX_STATE_GO && | 1075 | if (demux->filter[i].state == DMX_STATE_GO && |
1037 | demux->filter[i].filter.parent == &feed->feed.sec) { | 1076 | demux->filter[i].filter.parent == &feed->feed.sec) { |
1038 | demux->filter[i].state = DMX_STATE_READY; | 1077 | demux->filter[i].state = DMX_STATE_READY; |
1039 | if (demux->dmx.frontend->source != DMX_MEMORY_FE) | 1078 | if (demux->dmx.frontend->source != DMX_MEMORY_FE) { |
1040 | StopHWFilter(&demux->filter[i]); | 1079 | rc = StopHWFilter(&demux->filter[i]); |
1080 | if (!ret) | ||
1081 | ret = rc; | ||
1082 | /* keep going, stop as many filters as possible */ | ||
1083 | } | ||
1084 | } | ||
1041 | } | 1085 | } |
1042 | } | 1086 | } |
1043 | 1087 | ||
1044 | return 0; | 1088 | return ret; |
1045 | } | 1089 | } |
1046 | 1090 | ||
1047 | 1091 | ||
@@ -1093,7 +1137,7 @@ static int dvb_get_stc(struct dmx_demux *demux, unsigned int num, | |||
1093 | ret = av7110_fw_request(av7110, &tag, 0, fwstc, 4); | 1137 | ret = av7110_fw_request(av7110, &tag, 0, fwstc, 4); |
1094 | if (ret) { | 1138 | if (ret) { |
1095 | printk(KERN_ERR "%s: av7110_fw_request error\n", __FUNCTION__); | 1139 | printk(KERN_ERR "%s: av7110_fw_request error\n", __FUNCTION__); |
1096 | return -EIO; | 1140 | return ret; |
1097 | } | 1141 | } |
1098 | dprintk(2, "fwstc = %04hx %04hx %04hx %04hx\n", | 1142 | dprintk(2, "fwstc = %04hx %04hx %04hx %04hx\n", |
1099 | fwstc[0], fwstc[1], fwstc[2], fwstc[3]); | 1143 | fwstc[0], fwstc[1], fwstc[2], fwstc[3]); |
@@ -1119,18 +1163,14 @@ static int av7110_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) | |||
1119 | 1163 | ||
1120 | switch (tone) { | 1164 | switch (tone) { |
1121 | case SEC_TONE_ON: | 1165 | case SEC_TONE_ON: |
1122 | Set22K(av7110, 1); | 1166 | return Set22K(av7110, 1); |
1123 | break; | ||
1124 | 1167 | ||
1125 | case SEC_TONE_OFF: | 1168 | case SEC_TONE_OFF: |
1126 | Set22K(av7110, 0); | 1169 | return Set22K(av7110, 0); |
1127 | break; | ||
1128 | 1170 | ||
1129 | default: | 1171 | default: |
1130 | return -EINVAL; | 1172 | return -EINVAL; |
1131 | } | 1173 | } |
1132 | |||
1133 | return 0; | ||
1134 | } | 1174 | } |
1135 | 1175 | ||
1136 | static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe, | 1176 | static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe, |
@@ -1138,9 +1178,7 @@ static int av7110_diseqc_send_master_cmd(struct dvb_frontend* fe, | |||
1138 | { | 1178 | { |
1139 | struct av7110* av7110 = fe->dvb->priv; | 1179 | struct av7110* av7110 = fe->dvb->priv; |
1140 | 1180 | ||
1141 | av7110_diseqc_send(av7110, cmd->msg_len, cmd->msg, -1); | 1181 | return av7110_diseqc_send(av7110, cmd->msg_len, cmd->msg, -1); |
1142 | |||
1143 | return 0; | ||
1144 | } | 1182 | } |
1145 | 1183 | ||
1146 | static int av7110_diseqc_send_burst(struct dvb_frontend* fe, | 1184 | static int av7110_diseqc_send_burst(struct dvb_frontend* fe, |
@@ -1148,9 +1186,7 @@ static int av7110_diseqc_send_burst(struct dvb_frontend* fe, | |||
1148 | { | 1186 | { |
1149 | struct av7110* av7110 = fe->dvb->priv; | 1187 | struct av7110* av7110 = fe->dvb->priv; |
1150 | 1188 | ||
1151 | av7110_diseqc_send(av7110, 0, NULL, minicmd); | 1189 | return av7110_diseqc_send(av7110, 0, NULL, minicmd); |
1152 | |||
1153 | return 0; | ||
1154 | } | 1190 | } |
1155 | 1191 | ||
1156 | /* simplified code from budget-core.c */ | 1192 | /* simplified code from budget-core.c */ |
@@ -1992,76 +2028,85 @@ static struct l64781_config grundig_29504_401_config = { | |||
1992 | 2028 | ||
1993 | 2029 | ||
1994 | 2030 | ||
1995 | static void av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status) | 2031 | static int av7110_fe_lock_fix(struct av7110* av7110, fe_status_t status) |
1996 | { | 2032 | { |
2033 | int ret = 0; | ||
1997 | int synced = (status & FE_HAS_LOCK) ? 1 : 0; | 2034 | int synced = (status & FE_HAS_LOCK) ? 1 : 0; |
1998 | 2035 | ||
1999 | av7110->fe_status = status; | 2036 | av7110->fe_status = status; |
2000 | 2037 | ||
2001 | if (av7110->fe_synced == synced) | 2038 | if (av7110->fe_synced == synced) |
2002 | return; | 2039 | return 0; |
2003 | |||
2004 | av7110->fe_synced = synced; | ||
2005 | 2040 | ||
2006 | if (av7110->playing) | 2041 | if (av7110->playing) |
2007 | return; | 2042 | return 0; |
2008 | 2043 | ||
2009 | if (down_interruptible(&av7110->pid_mutex)) | 2044 | if (down_interruptible(&av7110->pid_mutex)) |
2010 | return; | 2045 | return -ERESTARTSYS; |
2011 | 2046 | ||
2012 | if (av7110->fe_synced) { | 2047 | if (synced) { |
2013 | SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], | 2048 | ret = SetPIDs(av7110, av7110->pids[DMX_PES_VIDEO], |
2014 | av7110->pids[DMX_PES_AUDIO], | 2049 | av7110->pids[DMX_PES_AUDIO], |
2015 | av7110->pids[DMX_PES_TELETEXT], 0, | 2050 | av7110->pids[DMX_PES_TELETEXT], 0, |
2016 | av7110->pids[DMX_PES_PCR]); | 2051 | av7110->pids[DMX_PES_PCR]); |
2017 | av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | 2052 | if (!ret) |
2053 | ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | ||
2018 | } else { | 2054 | } else { |
2019 | SetPIDs(av7110, 0, 0, 0, 0, 0); | 2055 | ret = SetPIDs(av7110, 0, 0, 0, 0, 0); |
2020 | av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0); | 2056 | if (!ret) { |
2021 | av7110_wait_msgstate(av7110, GPMQBusy); | 2057 | ret = av7110_fw_cmd(av7110, COMTYPE_PID_FILTER, FlushTSQueue, 0); |
2058 | if (!ret) | ||
2059 | ret = av7110_wait_msgstate(av7110, GPMQBusy); | ||
2060 | } | ||
2022 | } | 2061 | } |
2023 | 2062 | ||
2063 | if (!ret) | ||
2064 | av7110->fe_synced = synced; | ||
2065 | |||
2024 | up(&av7110->pid_mutex); | 2066 | up(&av7110->pid_mutex); |
2067 | return ret; | ||
2025 | } | 2068 | } |
2026 | 2069 | ||
2027 | static int av7110_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 2070 | static int av7110_fe_set_frontend(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) |
2028 | { | 2071 | { |
2029 | struct av7110* av7110 = fe->dvb->priv; | 2072 | struct av7110* av7110 = fe->dvb->priv; |
2030 | av7110_fe_lock_fix(av7110, 0); | 2073 | |
2031 | return av7110->fe_set_frontend(fe, params); | 2074 | int ret = av7110_fe_lock_fix(av7110, 0); |
2075 | if (!ret) | ||
2076 | ret = av7110->fe_set_frontend(fe, params); | ||
2077 | return ret; | ||
2032 | } | 2078 | } |
2033 | 2079 | ||
2034 | static int av7110_fe_init(struct dvb_frontend* fe) | 2080 | static int av7110_fe_init(struct dvb_frontend* fe) |
2035 | { | 2081 | { |
2036 | struct av7110* av7110 = fe->dvb->priv; | 2082 | struct av7110* av7110 = fe->dvb->priv; |
2037 | 2083 | ||
2038 | av7110_fe_lock_fix(av7110, 0); | 2084 | int ret = av7110_fe_lock_fix(av7110, 0); |
2039 | return av7110->fe_init(fe); | 2085 | if (!ret) |
2086 | ret = av7110->fe_init(fe); | ||
2087 | return ret; | ||
2040 | } | 2088 | } |
2041 | 2089 | ||
2042 | static int av7110_fe_read_status(struct dvb_frontend* fe, fe_status_t* status) | 2090 | static int av7110_fe_read_status(struct dvb_frontend* fe, fe_status_t* status) |
2043 | { | 2091 | { |
2044 | struct av7110* av7110 = fe->dvb->priv; | 2092 | struct av7110* av7110 = fe->dvb->priv; |
2045 | int ret; | ||
2046 | 2093 | ||
2047 | /* call the real implementation */ | 2094 | /* call the real implementation */ |
2048 | ret = av7110->fe_read_status(fe, status); | 2095 | int ret = av7110->fe_read_status(fe, status); |
2049 | if (ret) | 2096 | if (!ret) |
2050 | return ret; | 2097 | if (((*status ^ av7110->fe_status) & FE_HAS_LOCK) && (*status & FE_HAS_LOCK)) |
2051 | 2098 | ret = av7110_fe_lock_fix(av7110, *status); | |
2052 | if (((*status ^ av7110->fe_status) & FE_HAS_LOCK) && (*status & FE_HAS_LOCK)) { | 2099 | return ret; |
2053 | av7110_fe_lock_fix(av7110, *status); | ||
2054 | } | ||
2055 | |||
2056 | return 0; | ||
2057 | } | 2100 | } |
2058 | 2101 | ||
2059 | static int av7110_fe_diseqc_reset_overload(struct dvb_frontend* fe) | 2102 | static int av7110_fe_diseqc_reset_overload(struct dvb_frontend* fe) |
2060 | { | 2103 | { |
2061 | struct av7110* av7110 = fe->dvb->priv; | 2104 | struct av7110* av7110 = fe->dvb->priv; |
2062 | 2105 | ||
2063 | av7110_fe_lock_fix(av7110, 0); | 2106 | int ret = av7110_fe_lock_fix(av7110, 0); |
2064 | return av7110->fe_diseqc_reset_overload(fe); | 2107 | if (!ret) |
2108 | ret = av7110->fe_diseqc_reset_overload(fe); | ||
2109 | return ret; | ||
2065 | } | 2110 | } |
2066 | 2111 | ||
2067 | static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe, | 2112 | static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe, |
@@ -2069,40 +2114,50 @@ static int av7110_fe_diseqc_send_master_cmd(struct dvb_frontend* fe, | |||
2069 | { | 2114 | { |
2070 | struct av7110* av7110 = fe->dvb->priv; | 2115 | struct av7110* av7110 = fe->dvb->priv; |
2071 | 2116 | ||
2072 | av7110_fe_lock_fix(av7110, 0); | 2117 | int ret = av7110_fe_lock_fix(av7110, 0); |
2073 | return av7110->fe_diseqc_send_master_cmd(fe, cmd); | 2118 | if (!ret) |
2119 | ret = av7110->fe_diseqc_send_master_cmd(fe, cmd); | ||
2120 | return ret; | ||
2074 | } | 2121 | } |
2075 | 2122 | ||
2076 | static int av7110_fe_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) | 2123 | static int av7110_fe_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t minicmd) |
2077 | { | 2124 | { |
2078 | struct av7110* av7110 = fe->dvb->priv; | 2125 | struct av7110* av7110 = fe->dvb->priv; |
2079 | 2126 | ||
2080 | av7110_fe_lock_fix(av7110, 0); | 2127 | int ret = av7110_fe_lock_fix(av7110, 0); |
2081 | return av7110->fe_diseqc_send_burst(fe, minicmd); | 2128 | if (!ret) |
2129 | ret = av7110->fe_diseqc_send_burst(fe, minicmd); | ||
2130 | return ret; | ||
2082 | } | 2131 | } |
2083 | 2132 | ||
2084 | static int av7110_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) | 2133 | static int av7110_fe_set_tone(struct dvb_frontend* fe, fe_sec_tone_mode_t tone) |
2085 | { | 2134 | { |
2086 | struct av7110* av7110 = fe->dvb->priv; | 2135 | struct av7110* av7110 = fe->dvb->priv; |
2087 | 2136 | ||
2088 | av7110_fe_lock_fix(av7110, 0); | 2137 | int ret = av7110_fe_lock_fix(av7110, 0); |
2089 | return av7110->fe_set_tone(fe, tone); | 2138 | if (!ret) |
2139 | ret = av7110->fe_set_tone(fe, tone); | ||
2140 | return ret; | ||
2090 | } | 2141 | } |
2091 | 2142 | ||
2092 | static int av7110_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) | 2143 | static int av7110_fe_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) |
2093 | { | 2144 | { |
2094 | struct av7110* av7110 = fe->dvb->priv; | 2145 | struct av7110* av7110 = fe->dvb->priv; |
2095 | 2146 | ||
2096 | av7110_fe_lock_fix(av7110, 0); | 2147 | int ret = av7110_fe_lock_fix(av7110, 0); |
2097 | return av7110->fe_set_voltage(fe, voltage); | 2148 | if (!ret) |
2149 | ret = av7110->fe_set_voltage(fe, voltage); | ||
2150 | return ret; | ||
2098 | } | 2151 | } |
2099 | 2152 | ||
2100 | static int av7110_fe_dishnetwork_send_legacy_command(struct dvb_frontend* fe, unsigned int cmd) | 2153 | static int av7110_fe_dishnetwork_send_legacy_command(struct dvb_frontend* fe, unsigned int cmd) |
2101 | { | 2154 | { |
2102 | struct av7110* av7110 = fe->dvb->priv; | 2155 | struct av7110* av7110 = fe->dvb->priv; |
2103 | 2156 | ||
2104 | av7110_fe_lock_fix(av7110, 0); | 2157 | int ret = av7110_fe_lock_fix(av7110, 0); |
2105 | return av7110->fe_dishnetwork_send_legacy_command(fe, cmd); | 2158 | if (!ret) |
2159 | ret = av7110->fe_dishnetwork_send_legacy_command(fe, cmd); | ||
2160 | return ret; | ||
2106 | } | 2161 | } |
2107 | 2162 | ||
2108 | static u8 read_pwm(struct av7110* av7110) | 2163 | static u8 read_pwm(struct av7110* av7110) |
diff --git a/drivers/media/dvb/ttpci/av7110.h b/drivers/media/dvb/ttpci/av7110.h index 4f69b4d01479..508b7739c609 100644 --- a/drivers/media/dvb/ttpci/av7110.h +++ b/drivers/media/dvb/ttpci/av7110.h | |||
@@ -119,8 +119,7 @@ struct av7110 { | |||
119 | volatile int bmp_state; | 119 | volatile int bmp_state; |
120 | #define BMP_NONE 0 | 120 | #define BMP_NONE 0 |
121 | #define BMP_LOADING 1 | 121 | #define BMP_LOADING 1 |
122 | #define BMP_LOADINGS 2 | 122 | #define BMP_LOADED 2 |
123 | #define BMP_LOADED 3 | ||
124 | wait_queue_head_t bmpq; | 123 | wait_queue_head_t bmpq; |
125 | 124 | ||
126 | 125 | ||
@@ -255,12 +254,12 @@ struct av7110 { | |||
255 | }; | 254 | }; |
256 | 255 | ||
257 | 256 | ||
258 | extern void ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, | 257 | extern int ChangePIDs(struct av7110 *av7110, u16 vpid, u16 apid, u16 ttpid, |
259 | u16 subpid, u16 pcrpid); | 258 | u16 subpid, u16 pcrpid); |
260 | 259 | ||
261 | extern void av7110_register_irc_handler(void (*func)(u32)); | 260 | extern void av7110_register_irc_handler(void (*func)(u32)); |
262 | extern void av7110_unregister_irc_handler(void (*func)(u32)); | 261 | extern void av7110_unregister_irc_handler(void (*func)(u32)); |
263 | extern void av7110_setup_irc_config (struct av7110 *av7110, u32 ir_config); | 262 | extern int av7110_setup_irc_config (struct av7110 *av7110, u32 ir_config); |
264 | 263 | ||
265 | extern int av7110_ir_init (void); | 264 | extern int av7110_ir_init (void); |
266 | extern void av7110_ir_exit (void); | 265 | extern void av7110_ir_exit (void); |
diff --git a/drivers/media/dvb/ttpci/av7110_av.c b/drivers/media/dvb/ttpci/av7110_av.c index ccf946125d02..0696a5a4f855 100644 --- a/drivers/media/dvb/ttpci/av7110_av.c +++ b/drivers/media/dvb/ttpci/av7110_av.c | |||
@@ -121,6 +121,7 @@ static int dvb_filter_pes2ts_cb(void *priv, unsigned char *data) | |||
121 | int av7110_av_start_record(struct av7110 *av7110, int av, | 121 | int av7110_av_start_record(struct av7110 *av7110, int av, |
122 | struct dvb_demux_feed *dvbdmxfeed) | 122 | struct dvb_demux_feed *dvbdmxfeed) |
123 | { | 123 | { |
124 | int ret = 0; | ||
124 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; | 125 | struct dvb_demux *dvbdmx = dvbdmxfeed->demux; |
125 | 126 | ||
126 | dprintk(2, "av7110:%p, , dvb_demux_feed:%p\n", av7110, dvbdmxfeed); | 127 | dprintk(2, "av7110:%p, , dvb_demux_feed:%p\n", av7110, dvbdmxfeed); |
@@ -137,7 +138,7 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
137 | dvbdmx->pesfilter[0]->pid, | 138 | dvbdmx->pesfilter[0]->pid, |
138 | dvb_filter_pes2ts_cb, | 139 | dvb_filter_pes2ts_cb, |
139 | (void *) dvbdmx->pesfilter[0]); | 140 | (void *) dvbdmx->pesfilter[0]); |
140 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); | 141 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); |
141 | break; | 142 | break; |
142 | 143 | ||
143 | case RP_VIDEO: | 144 | case RP_VIDEO: |
@@ -145,7 +146,7 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
145 | dvbdmx->pesfilter[1]->pid, | 146 | dvbdmx->pesfilter[1]->pid, |
146 | dvb_filter_pes2ts_cb, | 147 | dvb_filter_pes2ts_cb, |
147 | (void *) dvbdmx->pesfilter[1]); | 148 | (void *) dvbdmx->pesfilter[1]); |
148 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); | 149 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); |
149 | break; | 150 | break; |
150 | 151 | ||
151 | case RP_AV: | 152 | case RP_AV: |
@@ -157,14 +158,15 @@ int av7110_av_start_record(struct av7110 *av7110, int av, | |||
157 | dvbdmx->pesfilter[1]->pid, | 158 | dvbdmx->pesfilter[1]->pid, |
158 | dvb_filter_pes2ts_cb, | 159 | dvb_filter_pes2ts_cb, |
159 | (void *) dvbdmx->pesfilter[1]); | 160 | (void *) dvbdmx->pesfilter[1]); |
160 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); | 161 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AV_PES, 0); |
161 | break; | 162 | break; |
162 | } | 163 | } |
163 | return 0; | 164 | return ret; |
164 | } | 165 | } |
165 | 166 | ||
166 | int av7110_av_start_play(struct av7110 *av7110, int av) | 167 | int av7110_av_start_play(struct av7110 *av7110, int av) |
167 | { | 168 | { |
169 | int ret = 0; | ||
168 | dprintk(2, "av7110:%p, \n", av7110); | 170 | dprintk(2, "av7110:%p, \n", av7110); |
169 | 171 | ||
170 | if (av7110->rec_mode) | 172 | if (av7110->rec_mode) |
@@ -182,54 +184,57 @@ int av7110_av_start_play(struct av7110 *av7110, int av) | |||
182 | av7110->playing |= av; | 184 | av7110->playing |= av; |
183 | switch (av7110->playing) { | 185 | switch (av7110->playing) { |
184 | case RP_AUDIO: | 186 | case RP_AUDIO: |
185 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); | 187 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); |
186 | break; | 188 | break; |
187 | case RP_VIDEO: | 189 | case RP_VIDEO: |
188 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); | 190 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); |
189 | av7110->sinfo = 0; | 191 | av7110->sinfo = 0; |
190 | break; | 192 | break; |
191 | case RP_AV: | 193 | case RP_AV: |
192 | av7110->sinfo = 0; | 194 | av7110->sinfo = 0; |
193 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); | 195 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AV_PES, 0); |
194 | break; | 196 | break; |
195 | } | 197 | } |
196 | return av7110->playing; | 198 | if (!ret) |
199 | ret = av7110->playing; | ||
200 | return ret; | ||
197 | } | 201 | } |
198 | 202 | ||
199 | void av7110_av_stop(struct av7110 *av7110, int av) | 203 | int av7110_av_stop(struct av7110 *av7110, int av) |
200 | { | 204 | { |
205 | int ret = 0; | ||
201 | dprintk(2, "av7110:%p, \n", av7110); | 206 | dprintk(2, "av7110:%p, \n", av7110); |
202 | 207 | ||
203 | if (!(av7110->playing & av) && !(av7110->rec_mode & av)) | 208 | if (!(av7110->playing & av) && !(av7110->rec_mode & av)) |
204 | return; | 209 | return 0; |
205 | |||
206 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); | 210 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); |
207 | if (av7110->playing) { | 211 | if (av7110->playing) { |
208 | av7110->playing &= ~av; | 212 | av7110->playing &= ~av; |
209 | switch (av7110->playing) { | 213 | switch (av7110->playing) { |
210 | case RP_AUDIO: | 214 | case RP_AUDIO: |
211 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); | 215 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, AudioPES, 0); |
212 | break; | 216 | break; |
213 | case RP_VIDEO: | 217 | case RP_VIDEO: |
214 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); | 218 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Play, 2, VideoPES, 0); |
215 | break; | 219 | break; |
216 | case RP_NONE: | 220 | case RP_NONE: |
217 | av7110_set_vidmode(av7110, av7110->vidmode); | 221 | ret = av7110_set_vidmode(av7110, av7110->vidmode); |
218 | break; | 222 | break; |
219 | } | 223 | } |
220 | } else { | 224 | } else { |
221 | av7110->rec_mode &= ~av; | 225 | av7110->rec_mode &= ~av; |
222 | switch (av7110->rec_mode) { | 226 | switch (av7110->rec_mode) { |
223 | case RP_AUDIO: | 227 | case RP_AUDIO: |
224 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); | 228 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, AudioPES, 0); |
225 | break; | 229 | break; |
226 | case RP_VIDEO: | 230 | case RP_VIDEO: |
227 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); | 231 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Record, 2, VideoPES, 0); |
228 | break; | 232 | break; |
229 | case RP_NONE: | 233 | case RP_NONE: |
230 | break; | 234 | break; |
231 | } | 235 | } |
232 | } | 236 | } |
237 | return ret; | ||
233 | } | 238 | } |
234 | 239 | ||
235 | 240 | ||
@@ -317,19 +322,22 @@ int av7110_set_volume(struct av7110 *av7110, int volleft, int volright) | |||
317 | return 0; | 322 | return 0; |
318 | } | 323 | } |
319 | 324 | ||
320 | void av7110_set_vidmode(struct av7110 *av7110, int mode) | 325 | int av7110_set_vidmode(struct av7110 *av7110, int mode) |
321 | { | 326 | { |
327 | int ret; | ||
322 | dprintk(2, "av7110:%p, \n", av7110); | 328 | dprintk(2, "av7110:%p, \n", av7110); |
323 | 329 | ||
324 | av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); | 330 | ret = av7110_fw_cmd(av7110, COMTYPE_ENCODER, LoadVidCode, 1, mode); |
325 | 331 | ||
326 | if (!av7110->playing) { | 332 | if (!ret && !av7110->playing) { |
327 | ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], | 333 | ret = ChangePIDs(av7110, av7110->pids[DMX_PES_VIDEO], |
328 | av7110->pids[DMX_PES_AUDIO], | 334 | av7110->pids[DMX_PES_AUDIO], |
329 | av7110->pids[DMX_PES_TELETEXT], | 335 | av7110->pids[DMX_PES_TELETEXT], |
330 | 0, av7110->pids[DMX_PES_PCR]); | 336 | 0, av7110->pids[DMX_PES_PCR]); |
331 | av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | 337 | if (!ret) |
338 | ret = av7110_fw_cmd(av7110, COMTYPE_PIDFILTER, Scan, 0); | ||
332 | } | 339 | } |
340 | return ret; | ||
333 | } | 341 | } |
334 | 342 | ||
335 | 343 | ||
@@ -340,17 +348,18 @@ static int sw2mode[16] = { | |||
340 | VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, | 348 | VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, VIDEO_MODE_PAL, |
341 | }; | 349 | }; |
342 | 350 | ||
343 | static void get_video_format(struct av7110 *av7110, u8 *buf, int count) | 351 | static int get_video_format(struct av7110 *av7110, u8 *buf, int count) |
344 | { | 352 | { |
345 | int i; | 353 | int i; |
346 | int hsize, vsize; | 354 | int hsize, vsize; |
347 | int sw; | 355 | int sw; |
348 | u8 *p; | 356 | u8 *p; |
357 | int ret = 0; | ||
349 | 358 | ||
350 | dprintk(2, "av7110:%p, \n", av7110); | 359 | dprintk(2, "av7110:%p, \n", av7110); |
351 | 360 | ||
352 | if (av7110->sinfo) | 361 | if (av7110->sinfo) |
353 | return; | 362 | return 0; |
354 | for (i = 7; i < count - 10; i++) { | 363 | for (i = 7; i < count - 10; i++) { |
355 | p = buf + i; | 364 | p = buf + i; |
356 | if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3) | 365 | if (p[0] || p[1] || p[2] != 0x01 || p[3] != 0xb3) |
@@ -359,11 +368,14 @@ static void get_video_format(struct av7110 *av7110, u8 *buf, int count) | |||
359 | hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4); | 368 | hsize = ((p[1] &0xF0) >> 4) | (p[0] << 4); |
360 | vsize = ((p[1] &0x0F) << 8) | (p[2]); | 369 | vsize = ((p[1] &0x0F) << 8) | (p[2]); |
361 | sw = (p[3] & 0x0F); | 370 | sw = (p[3] & 0x0F); |
362 | av7110_set_vidmode(av7110, sw2mode[sw]); | 371 | ret = av7110_set_vidmode(av7110, sw2mode[sw]); |
363 | dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw); | 372 | if (!ret) { |
364 | av7110->sinfo = 1; | 373 | dprintk(2, "playback %dx%d fr=%d\n", hsize, vsize, sw); |
374 | av7110->sinfo = 1; | ||
375 | } | ||
365 | break; | 376 | break; |
366 | } | 377 | } |
378 | return ret; | ||
367 | } | 379 | } |
368 | 380 | ||
369 | 381 | ||
@@ -974,7 +986,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
974 | unsigned long arg = (unsigned long) parg; | 986 | unsigned long arg = (unsigned long) parg; |
975 | int ret = 0; | 987 | int ret = 0; |
976 | 988 | ||
977 | dprintk(2, "av7110:%p, \n", av7110); | 989 | dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd); |
978 | 990 | ||
979 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { | 991 | if ((file->f_flags & O_ACCMODE) == O_RDONLY) { |
980 | if ( cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT && | 992 | if ( cmd != VIDEO_GET_STATUS && cmd != VIDEO_GET_EVENT && |
@@ -987,49 +999,57 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
987 | case VIDEO_STOP: | 999 | case VIDEO_STOP: |
988 | av7110->videostate.play_state = VIDEO_STOPPED; | 1000 | av7110->videostate.play_state = VIDEO_STOPPED; |
989 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) | 1001 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) |
990 | av7110_av_stop(av7110, RP_VIDEO); | 1002 | ret = av7110_av_stop(av7110, RP_VIDEO); |
991 | else | 1003 | else |
992 | vidcom(av7110, VIDEO_CMD_STOP, | 1004 | ret = vidcom(av7110, VIDEO_CMD_STOP, |
993 | av7110->videostate.video_blank ? 0 : 1); | 1005 | av7110->videostate.video_blank ? 0 : 1); |
994 | av7110->trickmode = TRICK_NONE; | 1006 | if (!ret) |
1007 | av7110->trickmode = TRICK_NONE; | ||
995 | break; | 1008 | break; |
996 | 1009 | ||
997 | case VIDEO_PLAY: | 1010 | case VIDEO_PLAY: |
998 | av7110->trickmode = TRICK_NONE; | 1011 | av7110->trickmode = TRICK_NONE; |
999 | if (av7110->videostate.play_state == VIDEO_FREEZED) { | 1012 | if (av7110->videostate.play_state == VIDEO_FREEZED) { |
1000 | av7110->videostate.play_state = VIDEO_PLAYING; | 1013 | av7110->videostate.play_state = VIDEO_PLAYING; |
1001 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1014 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1015 | if (ret) | ||
1016 | break; | ||
1002 | } | 1017 | } |
1003 | 1018 | ||
1004 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { | 1019 | if (av7110->videostate.stream_source == VIDEO_SOURCE_MEMORY) { |
1005 | if (av7110->playing == RP_AV) { | 1020 | if (av7110->playing == RP_AV) { |
1006 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); | 1021 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Stop, 0); |
1022 | if (ret) | ||
1023 | break; | ||
1007 | av7110->playing &= ~RP_VIDEO; | 1024 | av7110->playing &= ~RP_VIDEO; |
1008 | } | 1025 | } |
1009 | av7110_av_start_play(av7110, RP_VIDEO); | 1026 | ret = av7110_av_start_play(av7110, RP_VIDEO); |
1010 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1011 | } else { | ||
1012 | //av7110_av_stop(av7110, RP_VIDEO); | ||
1013 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1014 | } | 1027 | } |
1015 | av7110->videostate.play_state = VIDEO_PLAYING; | 1028 | if (!ret) |
1029 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); | ||
1030 | if (!ret) | ||
1031 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1016 | break; | 1032 | break; |
1017 | 1033 | ||
1018 | case VIDEO_FREEZE: | 1034 | case VIDEO_FREEZE: |
1019 | av7110->videostate.play_state = VIDEO_FREEZED; | 1035 | av7110->videostate.play_state = VIDEO_FREEZED; |
1020 | if (av7110->playing & RP_VIDEO) | 1036 | if (av7110->playing & RP_VIDEO) |
1021 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); | 1037 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Pause, 0); |
1022 | else | 1038 | else |
1023 | vidcom(av7110, VIDEO_CMD_FREEZE, 1); | 1039 | ret = vidcom(av7110, VIDEO_CMD_FREEZE, 1); |
1024 | av7110->trickmode = TRICK_FREEZE; | 1040 | if (!ret) |
1041 | av7110->trickmode = TRICK_FREEZE; | ||
1025 | break; | 1042 | break; |
1026 | 1043 | ||
1027 | case VIDEO_CONTINUE: | 1044 | case VIDEO_CONTINUE: |
1028 | if (av7110->playing & RP_VIDEO) | 1045 | if (av7110->playing & RP_VIDEO) |
1029 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); | 1046 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Continue, 0); |
1030 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1047 | if (!ret) |
1031 | av7110->videostate.play_state = VIDEO_PLAYING; | 1048 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1032 | av7110->trickmode = TRICK_NONE; | 1049 | if (!ret) { |
1050 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1051 | av7110->trickmode = TRICK_NONE; | ||
1052 | } | ||
1033 | break; | 1053 | break; |
1034 | 1054 | ||
1035 | case VIDEO_SELECT_SOURCE: | 1055 | case VIDEO_SELECT_SOURCE: |
@@ -1045,7 +1065,7 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1045 | break; | 1065 | break; |
1046 | 1066 | ||
1047 | case VIDEO_GET_EVENT: | 1067 | case VIDEO_GET_EVENT: |
1048 | ret=dvb_video_get_event(av7110, parg, file->f_flags); | 1068 | ret = dvb_video_get_event(av7110, parg, file->f_flags); |
1049 | break; | 1069 | break; |
1050 | 1070 | ||
1051 | case VIDEO_GET_SIZE: | 1071 | case VIDEO_GET_SIZE: |
@@ -1105,25 +1125,32 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1105 | case VIDEO_FAST_FORWARD: | 1125 | case VIDEO_FAST_FORWARD: |
1106 | //note: arg is ignored by firmware | 1126 | //note: arg is ignored by firmware |
1107 | if (av7110->playing & RP_VIDEO) | 1127 | if (av7110->playing & RP_VIDEO) |
1108 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1128 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1109 | __Scan_I, 2, AV_PES, 0); | 1129 | __Scan_I, 2, AV_PES, 0); |
1110 | else | 1130 | else |
1111 | vidcom(av7110, VIDEO_CMD_FFWD, arg); | 1131 | ret = vidcom(av7110, VIDEO_CMD_FFWD, arg); |
1112 | av7110->trickmode = TRICK_FAST; | 1132 | if (!ret) { |
1113 | av7110->videostate.play_state = VIDEO_PLAYING; | 1133 | av7110->trickmode = TRICK_FAST; |
1134 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1135 | } | ||
1114 | break; | 1136 | break; |
1115 | 1137 | ||
1116 | case VIDEO_SLOWMOTION: | 1138 | case VIDEO_SLOWMOTION: |
1117 | if (av7110->playing&RP_VIDEO) { | 1139 | if (av7110->playing&RP_VIDEO) { |
1118 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); | 1140 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, __Slow, 2, 0, 0); |
1119 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1141 | if (!ret) |
1142 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1120 | } else { | 1143 | } else { |
1121 | vidcom(av7110, VIDEO_CMD_PLAY, 0); | 1144 | ret = vidcom(av7110, VIDEO_CMD_PLAY, 0); |
1122 | vidcom(av7110, VIDEO_CMD_STOP, 0); | 1145 | if (!ret) |
1123 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1146 | ret = vidcom(av7110, VIDEO_CMD_STOP, 0); |
1147 | if (!ret) | ||
1148 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1149 | } | ||
1150 | if (!ret) { | ||
1151 | av7110->trickmode = TRICK_SLOW; | ||
1152 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1124 | } | 1153 | } |
1125 | av7110->trickmode = TRICK_SLOW; | ||
1126 | av7110->videostate.play_state = VIDEO_PLAYING; | ||
1127 | break; | 1154 | break; |
1128 | 1155 | ||
1129 | case VIDEO_GET_CAPABILITIES: | 1156 | case VIDEO_GET_CAPABILITIES: |
@@ -1136,18 +1163,21 @@ static int dvb_video_ioctl(struct inode *inode, struct file *file, | |||
1136 | av7110_ipack_reset(&av7110->ipack[1]); | 1163 | av7110_ipack_reset(&av7110->ipack[1]); |
1137 | 1164 | ||
1138 | if (av7110->playing == RP_AV) { | 1165 | if (av7110->playing == RP_AV) { |
1139 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1166 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1140 | __Play, 2, AV_PES, 0); | 1167 | __Play, 2, AV_PES, 0); |
1168 | if (ret) | ||
1169 | break; | ||
1141 | if (av7110->trickmode == TRICK_FAST) | 1170 | if (av7110->trickmode == TRICK_FAST) |
1142 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1171 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1143 | __Scan_I, 2, AV_PES, 0); | 1172 | __Scan_I, 2, AV_PES, 0); |
1144 | if (av7110->trickmode == TRICK_SLOW) { | 1173 | if (av7110->trickmode == TRICK_SLOW) { |
1145 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1174 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1146 | __Slow, 2, 0, 0); | 1175 | __Slow, 2, 0, 0); |
1147 | vidcom(av7110, VIDEO_CMD_SLOW, arg); | 1176 | if (!ret) |
1177 | ret = vidcom(av7110, VIDEO_CMD_SLOW, arg); | ||
1148 | } | 1178 | } |
1149 | if (av7110->trickmode == TRICK_FREEZE) | 1179 | if (av7110->trickmode == TRICK_FREEZE) |
1150 | vidcom(av7110, VIDEO_CMD_STOP, 1); | 1180 | ret = vidcom(av7110, VIDEO_CMD_STOP, 1); |
1151 | } | 1181 | } |
1152 | break; | 1182 | break; |
1153 | 1183 | ||
@@ -1170,7 +1200,7 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1170 | unsigned long arg = (unsigned long) parg; | 1200 | unsigned long arg = (unsigned long) parg; |
1171 | int ret = 0; | 1201 | int ret = 0; |
1172 | 1202 | ||
1173 | dprintk(2, "av7110:%p, \n", av7110); | 1203 | dprintk(1, "av7110:%p, cmd=%04x\n", av7110,cmd); |
1174 | 1204 | ||
1175 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) && | 1205 | if (((file->f_flags & O_ACCMODE) == O_RDONLY) && |
1176 | (cmd != AUDIO_GET_STATUS)) | 1206 | (cmd != AUDIO_GET_STATUS)) |
@@ -1179,28 +1209,32 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1179 | switch (cmd) { | 1209 | switch (cmd) { |
1180 | case AUDIO_STOP: | 1210 | case AUDIO_STOP: |
1181 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) | 1211 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) |
1182 | av7110_av_stop(av7110, RP_AUDIO); | 1212 | ret = av7110_av_stop(av7110, RP_AUDIO); |
1183 | else | 1213 | else |
1184 | audcom(av7110, AUDIO_CMD_MUTE); | 1214 | ret = audcom(av7110, AUDIO_CMD_MUTE); |
1185 | av7110->audiostate.play_state = AUDIO_STOPPED; | 1215 | if (!ret) |
1216 | av7110->audiostate.play_state = AUDIO_STOPPED; | ||
1186 | break; | 1217 | break; |
1187 | 1218 | ||
1188 | case AUDIO_PLAY: | 1219 | case AUDIO_PLAY: |
1189 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) | 1220 | if (av7110->audiostate.stream_source == AUDIO_SOURCE_MEMORY) |
1190 | av7110_av_start_play(av7110, RP_AUDIO); | 1221 | ret = av7110_av_start_play(av7110, RP_AUDIO); |
1191 | audcom(av7110, AUDIO_CMD_UNMUTE); | 1222 | if (!ret) |
1192 | av7110->audiostate.play_state = AUDIO_PLAYING; | 1223 | ret = audcom(av7110, AUDIO_CMD_UNMUTE); |
1224 | if (!ret) | ||
1225 | av7110->audiostate.play_state = AUDIO_PLAYING; | ||
1193 | break; | 1226 | break; |
1194 | 1227 | ||
1195 | case AUDIO_PAUSE: | 1228 | case AUDIO_PAUSE: |
1196 | audcom(av7110, AUDIO_CMD_MUTE); | 1229 | ret = audcom(av7110, AUDIO_CMD_MUTE); |
1197 | av7110->audiostate.play_state = AUDIO_PAUSED; | 1230 | if (!ret) |
1231 | av7110->audiostate.play_state = AUDIO_PAUSED; | ||
1198 | break; | 1232 | break; |
1199 | 1233 | ||
1200 | case AUDIO_CONTINUE: | 1234 | case AUDIO_CONTINUE: |
1201 | if (av7110->audiostate.play_state == AUDIO_PAUSED) { | 1235 | if (av7110->audiostate.play_state == AUDIO_PAUSED) { |
1202 | av7110->audiostate.play_state = AUDIO_PLAYING; | 1236 | av7110->audiostate.play_state = AUDIO_PLAYING; |
1203 | audcom(av7110, AUDIO_CMD_MUTE | AUDIO_CMD_PCM16); | 1237 | ret = audcom(av7110, AUDIO_CMD_UNMUTE | AUDIO_CMD_PCM16); |
1204 | } | 1238 | } |
1205 | break; | 1239 | break; |
1206 | 1240 | ||
@@ -1210,14 +1244,15 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1210 | 1244 | ||
1211 | case AUDIO_SET_MUTE: | 1245 | case AUDIO_SET_MUTE: |
1212 | { | 1246 | { |
1213 | audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE); | 1247 | ret = audcom(av7110, arg ? AUDIO_CMD_MUTE : AUDIO_CMD_UNMUTE); |
1214 | av7110->audiostate.mute_state = (int) arg; | 1248 | if (!ret) |
1249 | av7110->audiostate.mute_state = (int) arg; | ||
1215 | break; | 1250 | break; |
1216 | } | 1251 | } |
1217 | 1252 | ||
1218 | case AUDIO_SET_AV_SYNC: | 1253 | case AUDIO_SET_AV_SYNC: |
1219 | av7110->audiostate.AV_sync_state = (int) arg; | 1254 | av7110->audiostate.AV_sync_state = (int) arg; |
1220 | audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF); | 1255 | ret = audcom(av7110, arg ? AUDIO_CMD_SYNC_ON : AUDIO_CMD_SYNC_OFF); |
1221 | break; | 1256 | break; |
1222 | 1257 | ||
1223 | case AUDIO_SET_BYPASS_MODE: | 1258 | case AUDIO_SET_BYPASS_MODE: |
@@ -1229,21 +1264,24 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1229 | 1264 | ||
1230 | switch(av7110->audiostate.channel_select) { | 1265 | switch(av7110->audiostate.channel_select) { |
1231 | case AUDIO_STEREO: | 1266 | case AUDIO_STEREO: |
1232 | audcom(av7110, AUDIO_CMD_STEREO); | 1267 | ret = audcom(av7110, AUDIO_CMD_STEREO); |
1233 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1268 | if (!ret) |
1234 | i2c_writereg(av7110, 0x20, 0x02, 0x49); | 1269 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1270 | i2c_writereg(av7110, 0x20, 0x02, 0x49); | ||
1235 | break; | 1271 | break; |
1236 | 1272 | ||
1237 | case AUDIO_MONO_LEFT: | 1273 | case AUDIO_MONO_LEFT: |
1238 | audcom(av7110, AUDIO_CMD_MONO_L); | 1274 | ret = audcom(av7110, AUDIO_CMD_MONO_L); |
1239 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1275 | if (!ret) |
1240 | i2c_writereg(av7110, 0x20, 0x02, 0x4a); | 1276 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1277 | i2c_writereg(av7110, 0x20, 0x02, 0x4a); | ||
1241 | break; | 1278 | break; |
1242 | 1279 | ||
1243 | case AUDIO_MONO_RIGHT: | 1280 | case AUDIO_MONO_RIGHT: |
1244 | audcom(av7110, AUDIO_CMD_MONO_R); | 1281 | ret = audcom(av7110, AUDIO_CMD_MONO_R); |
1245 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) | 1282 | if (!ret) |
1246 | i2c_writereg(av7110, 0x20, 0x02, 0x45); | 1283 | if (av7110->adac_type == DVB_ADAC_CRYSTAL) |
1284 | i2c_writereg(av7110, 0x20, 0x02, 0x45); | ||
1247 | break; | 1285 | break; |
1248 | 1286 | ||
1249 | default: | 1287 | default: |
@@ -1264,8 +1302,8 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1264 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); | 1302 | dvb_ringbuffer_flush_spinlock_wakeup(&av7110->aout); |
1265 | av7110_ipack_reset(&av7110->ipack[0]); | 1303 | av7110_ipack_reset(&av7110->ipack[0]); |
1266 | if (av7110->playing == RP_AV) | 1304 | if (av7110->playing == RP_AV) |
1267 | av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, | 1305 | ret = av7110_fw_cmd(av7110, COMTYPE_REC_PLAY, |
1268 | __Play, 2, AV_PES, 0); | 1306 | __Play, 2, AV_PES, 0); |
1269 | break; | 1307 | break; |
1270 | case AUDIO_SET_ID: | 1308 | case AUDIO_SET_ID: |
1271 | 1309 | ||
@@ -1274,7 +1312,7 @@ static int dvb_audio_ioctl(struct inode *inode, struct file *file, | |||
1274 | { | 1312 | { |
1275 | struct audio_mixer *amix = (struct audio_mixer *)parg; | 1313 | struct audio_mixer *amix = (struct audio_mixer *)parg; |
1276 | 1314 | ||
1277 | av7110_set_volume(av7110, amix->volume_left, amix->volume_right); | 1315 | ret = av7110_set_volume(av7110, amix->volume_left, amix->volume_right); |
1278 | break; | 1316 | break; |
1279 | } | 1317 | } |
1280 | case AUDIO_SET_STREAMTYPE: | 1318 | case AUDIO_SET_STREAMTYPE: |
diff --git a/drivers/media/dvb/ttpci/av7110_av.h b/drivers/media/dvb/ttpci/av7110_av.h index cc5e7a7e87c3..45dc144b8b43 100644 --- a/drivers/media/dvb/ttpci/av7110_av.h +++ b/drivers/media/dvb/ttpci/av7110_av.h | |||
@@ -3,14 +3,14 @@ | |||
3 | 3 | ||
4 | struct av7110; | 4 | struct av7110; |
5 | 5 | ||
6 | extern void av7110_set_vidmode(struct av7110 *av7110, int mode); | 6 | extern int av7110_set_vidmode(struct av7110 *av7110, int mode); |
7 | 7 | ||
8 | extern int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len); | 8 | extern int av7110_record_cb(struct dvb_filter_pes2ts *p2t, u8 *buf, size_t len); |
9 | extern int av7110_pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen); | 9 | extern int av7110_pes_play(void *dest, struct dvb_ringbuffer *buf, int dlen); |
10 | extern int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len); | 10 | extern int av7110_write_to_decoder(struct dvb_demux_feed *feed, const u8 *buf, size_t len); |
11 | 11 | ||
12 | extern int av7110_set_volume(struct av7110 *av7110, int volleft, int volright); | 12 | extern int av7110_set_volume(struct av7110 *av7110, int volleft, int volright); |
13 | extern void av7110_av_stop(struct av7110 *av7110, int av); | 13 | extern int av7110_av_stop(struct av7110 *av7110, int av); |
14 | extern int av7110_av_start_record(struct av7110 *av7110, int av, | 14 | extern int av7110_av_start_record(struct av7110 *av7110, int av, |
15 | struct dvb_demux_feed *dvbdmxfeed); | 15 | struct dvb_demux_feed *dvbdmxfeed); |
16 | extern int av7110_av_start_play(struct av7110 *av7110, int av); | 16 | extern int av7110_av_start_play(struct av7110 *av7110, int av); |
diff --git a/drivers/media/dvb/ttpci/av7110_hw.c b/drivers/media/dvb/ttpci/av7110_hw.c index 7fa4a0ebe133..1220826696c5 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.c +++ b/drivers/media/dvb/ttpci/av7110_hw.c | |||
@@ -137,7 +137,7 @@ static int waitdebi(struct av7110 *av7110, int adr, int state) | |||
137 | return 0; | 137 | return 0; |
138 | udelay(5); | 138 | udelay(5); |
139 | } | 139 | } |
140 | return -1; | 140 | return -ETIMEDOUT; |
141 | } | 141 | } |
142 | 142 | ||
143 | static int load_dram(struct av7110 *av7110, u32 *data, int len) | 143 | static int load_dram(struct av7110 *av7110, u32 *data, int len) |
@@ -155,7 +155,7 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len) | |||
155 | for (i = 0; i < blocks; i++) { | 155 | for (i = 0; i < blocks; i++) { |
156 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { | 156 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { |
157 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i); | 157 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at block %d\n", i); |
158 | return -1; | 158 | return -ETIMEDOUT; |
159 | } | 159 | } |
160 | dprintk(4, "writing DRAM block %d\n", i); | 160 | dprintk(4, "writing DRAM block %d\n", i); |
161 | mwdebi(av7110, DEBISWAB, bootblock, | 161 | mwdebi(av7110, DEBISWAB, bootblock, |
@@ -170,7 +170,7 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len) | |||
170 | if (rest > 0) { | 170 | if (rest > 0) { |
171 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { | 171 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { |
172 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n"); | 172 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout at last block\n"); |
173 | return -1; | 173 | return -ETIMEDOUT; |
174 | } | 174 | } |
175 | if (rest > 4) | 175 | if (rest > 4) |
176 | mwdebi(av7110, DEBISWAB, bootblock, | 176 | mwdebi(av7110, DEBISWAB, bootblock, |
@@ -185,13 +185,13 @@ static int load_dram(struct av7110 *av7110, u32 *data, int len) | |||
185 | } | 185 | } |
186 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { | 186 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) { |
187 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n"); | 187 | printk(KERN_ERR "dvb-ttpci: load_dram(): timeout after last block\n"); |
188 | return -1; | 188 | return -ETIMEDOUT; |
189 | } | 189 | } |
190 | iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2); | 190 | iwdebi(av7110, DEBINOSWAP, BOOT_SIZE, 0, 2); |
191 | iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); | 191 | iwdebi(av7110, DEBINOSWAP, BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2); |
192 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) { | 192 | if (waitdebi(av7110, BOOT_STATE, BOOTSTATE_BOOT_COMPLETE) < 0) { |
193 | printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n"); | 193 | printk(KERN_ERR "dvb-ttpci: load_dram(): final handshake timeout\n"); |
194 | return -1; | 194 | return -ETIMEDOUT; |
195 | } | 195 | } |
196 | return 0; | 196 | return 0; |
197 | } | 197 | } |
@@ -263,7 +263,7 @@ int av7110_bootarm(struct av7110 *av7110) | |||
263 | if (saa7146_wait_for_debi_done(av7110->dev, 1)) { | 263 | if (saa7146_wait_for_debi_done(av7110->dev, 1)) { |
264 | printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): " | 264 | printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): " |
265 | "saa7146_wait_for_debi_done() timed out\n"); | 265 | "saa7146_wait_for_debi_done() timed out\n"); |
266 | return -1; | 266 | return -ETIMEDOUT; |
267 | } | 267 | } |
268 | saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI); | 268 | saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI); |
269 | mdelay(1); | 269 | mdelay(1); |
@@ -284,7 +284,7 @@ int av7110_bootarm(struct av7110 *av7110) | |||
284 | if (saa7146_wait_for_debi_done(av7110->dev, 1)) { | 284 | if (saa7146_wait_for_debi_done(av7110->dev, 1)) { |
285 | printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): " | 285 | printk(KERN_ERR "dvb-ttpci: av7110_bootarm(): " |
286 | "saa7146_wait_for_debi_done() timed out after loading DRAM\n"); | 286 | "saa7146_wait_for_debi_done() timed out after loading DRAM\n"); |
287 | return -1; | 287 | return -ETIMEDOUT; |
288 | } | 288 | } |
289 | saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI); | 289 | saa7146_setgpio(dev, RESET_LINE, SAA7146_GPIO_OUTHI); |
290 | msleep(30); /* the firmware needs some time to initialize */ | 290 | msleep(30); /* the firmware needs some time to initialize */ |
@@ -308,6 +308,7 @@ int av7110_wait_msgstate(struct av7110 *av7110, u16 flags) | |||
308 | { | 308 | { |
309 | unsigned long start; | 309 | unsigned long start; |
310 | u32 stat; | 310 | u32 stat; |
311 | int err; | ||
311 | 312 | ||
312 | if (FW_VERSION(av7110->arm_app) <= 0x261c) { | 313 | if (FW_VERSION(av7110->arm_app) <= 0x261c) { |
313 | /* not supported by old firmware */ | 314 | /* not supported by old firmware */ |
@@ -318,17 +319,17 @@ int av7110_wait_msgstate(struct av7110 *av7110, u16 flags) | |||
318 | /* new firmware */ | 319 | /* new firmware */ |
319 | start = jiffies; | 320 | start = jiffies; |
320 | for (;;) { | 321 | for (;;) { |
322 | err = time_after(jiffies, start + ARM_WAIT_FREE); | ||
321 | if (down_interruptible(&av7110->dcomlock)) | 323 | if (down_interruptible(&av7110->dcomlock)) |
322 | return -ERESTARTSYS; | 324 | return -ERESTARTSYS; |
323 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); | 325 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); |
324 | up(&av7110->dcomlock); | 326 | up(&av7110->dcomlock); |
325 | if ((stat & flags) == 0) { | 327 | if ((stat & flags) == 0) |
326 | break; | 328 | break; |
327 | } | 329 | if (err) { |
328 | if (time_after(jiffies, start + ARM_WAIT_FREE)) { | ||
329 | printk(KERN_ERR "%s: timeout waiting for MSGSTATE %04x\n", | 330 | printk(KERN_ERR "%s: timeout waiting for MSGSTATE %04x\n", |
330 | __FUNCTION__, stat & flags); | 331 | __FUNCTION__, stat & flags); |
331 | return -1; | 332 | return -ETIMEDOUT; |
332 | } | 333 | } |
333 | msleep(1); | 334 | msleep(1); |
334 | } | 335 | } |
@@ -342,6 +343,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
342 | char *type = NULL; | 343 | char *type = NULL; |
343 | u16 flags[2] = {0, 0}; | 344 | u16 flags[2] = {0, 0}; |
344 | u32 stat; | 345 | u32 stat; |
346 | int err; | ||
345 | 347 | ||
346 | // dprintk(4, "%p\n", av7110); | 348 | // dprintk(4, "%p\n", av7110); |
347 | 349 | ||
@@ -351,24 +353,30 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
351 | } | 353 | } |
352 | 354 | ||
353 | start = jiffies; | 355 | start = jiffies; |
354 | while (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 )) { | 356 | while (1) { |
355 | msleep(1); | 357 | err = time_after(jiffies, start + ARM_WAIT_FREE); |
356 | if (time_after(jiffies, start + ARM_WAIT_FREE)) { | 358 | if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0) |
359 | break; | ||
360 | if (err) { | ||
357 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND idle\n", __FUNCTION__); | 361 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND idle\n", __FUNCTION__); |
358 | return -ETIMEDOUT; | 362 | return -ETIMEDOUT; |
359 | } | 363 | } |
364 | msleep(1); | ||
360 | } | 365 | } |
361 | 366 | ||
362 | wdebi(av7110, DEBINOSWAP, COM_IF_LOCK, 0xffff, 2); | 367 | wdebi(av7110, DEBINOSWAP, COM_IF_LOCK, 0xffff, 2); |
363 | 368 | ||
364 | #ifndef _NOHANDSHAKE | 369 | #ifndef _NOHANDSHAKE |
365 | start = jiffies; | 370 | start = jiffies; |
366 | while (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 )) { | 371 | while (1) { |
367 | msleep(1); | 372 | err = time_after(jiffies, start + ARM_WAIT_SHAKE); |
368 | if (time_after(jiffies, start + ARM_WAIT_SHAKE)) { | 373 | if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0) |
374 | break; | ||
375 | if (err) { | ||
369 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); | 376 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); |
370 | return -ETIMEDOUT; | 377 | return -ETIMEDOUT; |
371 | } | 378 | } |
379 | msleep(1); | ||
372 | } | 380 | } |
373 | #endif | 381 | #endif |
374 | 382 | ||
@@ -401,6 +409,7 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
401 | /* non-immediate COMMAND type */ | 409 | /* non-immediate COMMAND type */ |
402 | start = jiffies; | 410 | start = jiffies; |
403 | for (;;) { | 411 | for (;;) { |
412 | err = time_after(jiffies, start + ARM_WAIT_FREE); | ||
404 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); | 413 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); |
405 | if (stat & flags[0]) { | 414 | if (stat & flags[0]) { |
406 | printk(KERN_ERR "%s: %s QUEUE overflow\n", | 415 | printk(KERN_ERR "%s: %s QUEUE overflow\n", |
@@ -409,10 +418,10 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
409 | } | 418 | } |
410 | if ((stat & flags[1]) == 0) | 419 | if ((stat & flags[1]) == 0) |
411 | break; | 420 | break; |
412 | if (time_after(jiffies, start + ARM_WAIT_FREE)) { | 421 | if (err) { |
413 | printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n", | 422 | printk(KERN_ERR "%s: timeout waiting on busy %s QUEUE\n", |
414 | __FUNCTION__, type); | 423 | __FUNCTION__, type); |
415 | return -1; | 424 | return -ETIMEDOUT; |
416 | } | 425 | } |
417 | msleep(1); | 426 | msleep(1); |
418 | } | 427 | } |
@@ -432,13 +441,16 @@ static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
432 | 441 | ||
433 | #ifdef COM_DEBUG | 442 | #ifdef COM_DEBUG |
434 | start = jiffies; | 443 | start = jiffies; |
435 | while (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2 )) { | 444 | while (1) { |
436 | msleep(1); | 445 | err = time_after(jiffies, start + ARM_WAIT_FREE); |
437 | if (time_after(jiffies, start + ARM_WAIT_FREE)) { | 446 | if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0) |
438 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND to complete\n", | 447 | break; |
439 | __FUNCTION__); | 448 | if (err) { |
449 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for COMMAND %d to complete\n", | ||
450 | __FUNCTION__, (buf[0] >> 8) & 0xff); | ||
440 | return -ETIMEDOUT; | 451 | return -ETIMEDOUT; |
441 | } | 452 | } |
453 | msleep(1); | ||
442 | } | 454 | } |
443 | 455 | ||
444 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); | 456 | stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2); |
@@ -470,7 +482,7 @@ static int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length) | |||
470 | 482 | ||
471 | ret = __av7110_send_fw_cmd(av7110, buf, length); | 483 | ret = __av7110_send_fw_cmd(av7110, buf, length); |
472 | up(&av7110->dcomlock); | 484 | up(&av7110->dcomlock); |
473 | if (ret) | 485 | if (ret && ret!=-ERESTARTSYS) |
474 | printk(KERN_ERR "dvb-ttpci: %s(): av7110_send_fw_cmd error %d\n", | 486 | printk(KERN_ERR "dvb-ttpci: %s(): av7110_send_fw_cmd error %d\n", |
475 | __FUNCTION__, ret); | 487 | __FUNCTION__, ret); |
476 | return ret; | 488 | return ret; |
@@ -495,7 +507,7 @@ int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...) | |||
495 | } | 507 | } |
496 | 508 | ||
497 | ret = av7110_send_fw_cmd(av7110, buf, num + 2); | 509 | ret = av7110_send_fw_cmd(av7110, buf, num + 2); |
498 | if (ret) | 510 | if (ret && ret != -ERESTARTSYS) |
499 | printk(KERN_ERR "dvb-ttpci: av7110_fw_cmd error %d\n", ret); | 511 | printk(KERN_ERR "dvb-ttpci: av7110_fw_cmd error %d\n", ret); |
500 | return ret; | 512 | return ret; |
501 | } | 513 | } |
@@ -518,7 +530,7 @@ int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len) | |||
518 | } | 530 | } |
519 | 531 | ||
520 | ret = av7110_send_fw_cmd(av7110, cmd, 18); | 532 | ret = av7110_send_fw_cmd(av7110, cmd, 18); |
521 | if (ret) | 533 | if (ret && ret != -ERESTARTSYS) |
522 | printk(KERN_ERR "dvb-ttpci: av7110_send_ci_cmd error %d\n", ret); | 534 | printk(KERN_ERR "dvb-ttpci: av7110_send_ci_cmd error %d\n", ret); |
523 | return ret; | 535 | return ret; |
524 | } | 536 | } |
@@ -551,26 +563,32 @@ int av7110_fw_request(struct av7110 *av7110, u16 *request_buf, | |||
551 | } | 563 | } |
552 | 564 | ||
553 | start = jiffies; | 565 | start = jiffies; |
554 | while (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2)) { | 566 | while (1) { |
555 | #ifdef _NOHANDSHAKE | 567 | err = time_after(jiffies, start + ARM_WAIT_FREE); |
556 | msleep(1); | 568 | if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0) |
557 | #endif | 569 | break; |
558 | if (time_after(jiffies, start + ARM_WAIT_FREE)) { | 570 | if (err) { |
559 | printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__); | 571 | printk(KERN_ERR "%s: timeout waiting for COMMAND to complete\n", __FUNCTION__); |
560 | up(&av7110->dcomlock); | 572 | up(&av7110->dcomlock); |
561 | return -1; | 573 | return -ETIMEDOUT; |
562 | } | 574 | } |
575 | #ifdef _NOHANDSHAKE | ||
576 | msleep(1); | ||
577 | #endif | ||
563 | } | 578 | } |
564 | 579 | ||
565 | #ifndef _NOHANDSHAKE | 580 | #ifndef _NOHANDSHAKE |
566 | start = jiffies; | 581 | start = jiffies; |
567 | while (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2 )) { | 582 | while (1) { |
568 | msleep(1); | 583 | err = time_after(jiffies, start + ARM_WAIT_SHAKE); |
569 | if (time_after(jiffies, start + ARM_WAIT_SHAKE)) { | 584 | if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0) |
585 | break; | ||
586 | if (err) { | ||
570 | printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); | 587 | printk(KERN_ERR "%s: timeout waiting for HANDSHAKE_REG\n", __FUNCTION__); |
571 | up(&av7110->dcomlock); | 588 | up(&av7110->dcomlock); |
572 | return -1; | 589 | return -ETIMEDOUT; |
573 | } | 590 | } |
591 | msleep(1); | ||
574 | } | 592 | } |
575 | #endif | 593 | #endif |
576 | 594 | ||
@@ -667,10 +685,10 @@ int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long bu | |||
667 | for (i = 0; i < len; i++) | 685 | for (i = 0; i < len; i++) |
668 | buf[i + 4] = msg[i]; | 686 | buf[i + 4] = msg[i]; |
669 | 687 | ||
670 | if ((ret = av7110_send_fw_cmd(av7110, buf, 18))) | 688 | ret = av7110_send_fw_cmd(av7110, buf, 18); |
689 | if (ret && ret!=-ERESTARTSYS) | ||
671 | printk(KERN_ERR "dvb-ttpci: av7110_diseqc_send error %d\n", ret); | 690 | printk(KERN_ERR "dvb-ttpci: av7110_diseqc_send error %d\n", ret); |
672 | 691 | return ret; | |
673 | return 0; | ||
674 | } | 692 | } |
675 | 693 | ||
676 | 694 | ||
@@ -705,18 +723,22 @@ static inline int SetFont(struct av7110 *av7110, u8 windownr, u8 fontsize, | |||
705 | static int FlushText(struct av7110 *av7110) | 723 | static int FlushText(struct av7110 *av7110) |
706 | { | 724 | { |
707 | unsigned long start; | 725 | unsigned long start; |
726 | int err; | ||
708 | 727 | ||
709 | if (down_interruptible(&av7110->dcomlock)) | 728 | if (down_interruptible(&av7110->dcomlock)) |
710 | return -ERESTARTSYS; | 729 | return -ERESTARTSYS; |
711 | start = jiffies; | 730 | start = jiffies; |
712 | while (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2)) { | 731 | while (1) { |
713 | msleep(1); | 732 | err = time_after(jiffies, start + ARM_WAIT_OSD); |
714 | if (time_after(jiffies, start + ARM_WAIT_OSD)) { | 733 | if (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2) == 0) |
734 | break; | ||
735 | if (err) { | ||
715 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for BUFF1_BASE == 0\n", | 736 | printk(KERN_ERR "dvb-ttpci: %s(): timeout waiting for BUFF1_BASE == 0\n", |
716 | __FUNCTION__); | 737 | __FUNCTION__); |
717 | up(&av7110->dcomlock); | 738 | up(&av7110->dcomlock); |
718 | return -1; | 739 | return -ETIMEDOUT; |
719 | } | 740 | } |
741 | msleep(1); | ||
720 | } | 742 | } |
721 | up(&av7110->dcomlock); | 743 | up(&av7110->dcomlock); |
722 | return 0; | 744 | return 0; |
@@ -733,25 +755,31 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) | |||
733 | return -ERESTARTSYS; | 755 | return -ERESTARTSYS; |
734 | 756 | ||
735 | start = jiffies; | 757 | start = jiffies; |
736 | while (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2)) { | 758 | while (1) { |
737 | msleep(1); | 759 | ret = time_after(jiffies, start + ARM_WAIT_OSD); |
738 | if (time_after(jiffies, start + ARM_WAIT_OSD)) { | 760 | if (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2) == 0) |
761 | break; | ||
762 | if (ret) { | ||
739 | printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for BUFF1_BASE == 0\n", | 763 | printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for BUFF1_BASE == 0\n", |
740 | __FUNCTION__); | 764 | __FUNCTION__); |
741 | up(&av7110->dcomlock); | 765 | up(&av7110->dcomlock); |
742 | return -1; | 766 | return -ETIMEDOUT; |
743 | } | 767 | } |
768 | msleep(1); | ||
744 | } | 769 | } |
745 | #ifndef _NOHANDSHAKE | 770 | #ifndef _NOHANDSHAKE |
746 | start = jiffies; | 771 | start = jiffies; |
747 | while (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2)) { | 772 | while (1) { |
748 | msleep(1); | 773 | ret = time_after(jiffies, start + ARM_WAIT_SHAKE); |
749 | if (time_after(jiffies, start + ARM_WAIT_SHAKE)) { | 774 | if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0) |
775 | break; | ||
776 | if (ret) { | ||
750 | printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for HANDSHAKE_REG\n", | 777 | printk(KERN_ERR "dvb-ttpci: %s: timeout waiting for HANDSHAKE_REG\n", |
751 | __FUNCTION__); | 778 | __FUNCTION__); |
752 | up(&av7110->dcomlock); | 779 | up(&av7110->dcomlock); |
753 | return -1; | 780 | return -ETIMEDOUT; |
754 | } | 781 | } |
782 | msleep(1); | ||
755 | } | 783 | } |
756 | #endif | 784 | #endif |
757 | for (i = 0; i < length / 2; i++) | 785 | for (i = 0; i < length / 2; i++) |
@@ -761,7 +789,7 @@ static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, u8* buf) | |||
761 | wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i * 2, 0, 2); | 789 | wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i * 2, 0, 2); |
762 | ret = __av7110_send_fw_cmd(av7110, cbuf, 5); | 790 | ret = __av7110_send_fw_cmd(av7110, cbuf, 5); |
763 | up(&av7110->dcomlock); | 791 | up(&av7110->dcomlock); |
764 | if (ret) | 792 | if (ret && ret!=-ERESTARTSYS) |
765 | printk(KERN_ERR "dvb-ttpci: WriteText error %d\n", ret); | 793 | printk(KERN_ERR "dvb-ttpci: WriteText error %d\n", ret); |
766 | return ret; | 794 | return ret; |
767 | } | 795 | } |
@@ -816,9 +844,25 @@ static osd_raw_window_t bpp2bit[8] = { | |||
816 | OSD_BITMAP1, OSD_BITMAP2, 0, OSD_BITMAP4, 0, 0, 0, OSD_BITMAP8 | 844 | OSD_BITMAP1, OSD_BITMAP2, 0, OSD_BITMAP4, 0, 0, 0, OSD_BITMAP8 |
817 | }; | 845 | }; |
818 | 846 | ||
819 | static inline int LoadBitmap(struct av7110 *av7110, u16 format, | 847 | static inline int WaitUntilBmpLoaded(struct av7110 *av7110) |
848 | { | ||
849 | int ret = wait_event_interruptible_timeout(av7110->bmpq, | ||
850 | av7110->bmp_state != BMP_LOADING, 10*HZ); | ||
851 | if (ret == -ERESTARTSYS) | ||
852 | return ret; | ||
853 | if (ret == 0) { | ||
854 | printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", | ||
855 | ret, av7110->bmp_state); | ||
856 | av7110->bmp_state = BMP_NONE; | ||
857 | return -ETIMEDOUT; | ||
858 | } | ||
859 | return 0; | ||
860 | } | ||
861 | |||
862 | static inline int LoadBitmap(struct av7110 *av7110, | ||
820 | u16 dx, u16 dy, int inc, u8 __user * data) | 863 | u16 dx, u16 dy, int inc, u8 __user * data) |
821 | { | 864 | { |
865 | u16 format; | ||
822 | int bpp; | 866 | int bpp; |
823 | int i; | 867 | int i; |
824 | int d, delta; | 868 | int d, delta; |
@@ -827,14 +871,7 @@ static inline int LoadBitmap(struct av7110 *av7110, u16 format, | |||
827 | 871 | ||
828 | dprintk(4, "%p\n", av7110); | 872 | dprintk(4, "%p\n", av7110); |
829 | 873 | ||
830 | ret = wait_event_interruptible_timeout(av7110->bmpq, av7110->bmp_state != BMP_LOADING, HZ); | 874 | format = bpp2bit[av7110->osdbpp[av7110->osdwin]]; |
831 | if (ret == -ERESTARTSYS || ret == 0) { | ||
832 | printk("dvb-ttpci: warning: timeout waiting in LoadBitmap: %d, %d\n", | ||
833 | ret, av7110->bmp_state); | ||
834 | av7110->bmp_state = BMP_NONE; | ||
835 | return -1; | ||
836 | } | ||
837 | BUG_ON (av7110->bmp_state == BMP_LOADING); | ||
838 | 875 | ||
839 | av7110->bmp_state = BMP_LOADING; | 876 | av7110->bmp_state = BMP_LOADING; |
840 | if (format == OSD_BITMAP8) { | 877 | if (format == OSD_BITMAP8) { |
@@ -847,18 +884,18 @@ static inline int LoadBitmap(struct av7110 *av7110, u16 format, | |||
847 | bpp=1; delta = 8; | 884 | bpp=1; delta = 8; |
848 | } else { | 885 | } else { |
849 | av7110->bmp_state = BMP_NONE; | 886 | av7110->bmp_state = BMP_NONE; |
850 | return -1; | 887 | return -EINVAL; |
851 | } | 888 | } |
852 | av7110->bmplen = ((dx * dy * bpp + 7) & ~7) / 8; | 889 | av7110->bmplen = ((dx * dy * bpp + 7) & ~7) / 8; |
853 | av7110->bmpp = 0; | 890 | av7110->bmpp = 0; |
854 | if (av7110->bmplen > 32768) { | 891 | if (av7110->bmplen > 32768) { |
855 | av7110->bmp_state = BMP_NONE; | 892 | av7110->bmp_state = BMP_NONE; |
856 | return -1; | 893 | return -EINVAL; |
857 | } | 894 | } |
858 | for (i = 0; i < dy; i++) { | 895 | for (i = 0; i < dy; i++) { |
859 | if (copy_from_user(av7110->bmpbuf + 1024 + i * dx, data + i * inc, dx)) { | 896 | if (copy_from_user(av7110->bmpbuf + 1024 + i * dx, data + i * inc, dx)) { |
860 | av7110->bmp_state = BMP_NONE; | 897 | av7110->bmp_state = BMP_NONE; |
861 | return -1; | 898 | return -EINVAL; |
862 | } | 899 | } |
863 | } | 900 | } |
864 | if (format != OSD_BITMAP8) { | 901 | if (format != OSD_BITMAP8) { |
@@ -873,37 +910,27 @@ static inline int LoadBitmap(struct av7110 *av7110, u16 format, | |||
873 | } | 910 | } |
874 | av7110->bmplen += 1024; | 911 | av7110->bmplen += 1024; |
875 | dprintk(4, "av7110_fw_cmd: LoadBmp size %d\n", av7110->bmplen); | 912 | dprintk(4, "av7110_fw_cmd: LoadBmp size %d\n", av7110->bmplen); |
876 | return av7110_fw_cmd(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy); | 913 | ret = av7110_fw_cmd(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy); |
914 | if (!ret) | ||
915 | ret = WaitUntilBmpLoaded(av7110); | ||
916 | return ret; | ||
877 | } | 917 | } |
878 | 918 | ||
879 | static int BlitBitmap(struct av7110 *av7110, u16 win, u16 x, u16 y, u16 trans) | 919 | static int BlitBitmap(struct av7110 *av7110, u16 x, u16 y) |
880 | { | 920 | { |
881 | int ret; | ||
882 | |||
883 | dprintk(4, "%p\n", av7110); | 921 | dprintk(4, "%p\n", av7110); |
884 | 922 | ||
885 | BUG_ON (av7110->bmp_state == BMP_NONE); | 923 | return av7110_fw_cmd(av7110, COMTYPE_OSD, BlitBmp, 4, av7110->osdwin, x, y, 0); |
886 | |||
887 | ret = wait_event_interruptible_timeout(av7110->bmpq, | ||
888 | av7110->bmp_state != BMP_LOADING, 10*HZ); | ||
889 | if (ret == -ERESTARTSYS || ret == 0) { | ||
890 | printk("dvb-ttpci: warning: timeout waiting in BlitBitmap: %d, %d\n", | ||
891 | ret, av7110->bmp_state); | ||
892 | av7110->bmp_state = BMP_NONE; | ||
893 | return (ret == 0) ? -ETIMEDOUT : ret; | ||
894 | } | ||
895 | |||
896 | BUG_ON (av7110->bmp_state != BMP_LOADED); | ||
897 | |||
898 | return av7110_fw_cmd(av7110, COMTYPE_OSD, BlitBmp, 4, win, x, y, trans); | ||
899 | } | 924 | } |
900 | 925 | ||
901 | static inline int ReleaseBitmap(struct av7110 *av7110) | 926 | static inline int ReleaseBitmap(struct av7110 *av7110) |
902 | { | 927 | { |
903 | dprintk(4, "%p\n", av7110); | 928 | dprintk(4, "%p\n", av7110); |
904 | 929 | ||
905 | if (av7110->bmp_state != BMP_LOADED) | 930 | if (av7110->bmp_state != BMP_LOADED && FW_VERSION(av7110->arm_app) < 0x261e) |
906 | return -1; | 931 | return -1; |
932 | if (av7110->bmp_state == BMP_LOADING) | ||
933 | dprintk(1,"ReleaseBitmap called while BMP_LOADING\n"); | ||
907 | av7110->bmp_state = BMP_NONE; | 934 | av7110->bmp_state = BMP_NONE; |
908 | return av7110_fw_cmd(av7110, COMTYPE_OSD, ReleaseBmp, 0); | 935 | return av7110_fw_cmd(av7110, COMTYPE_OSD, ReleaseBmp, 0); |
909 | } | 936 | } |
@@ -924,18 +951,22 @@ static u32 RGB2YUV(u16 R, u16 G, u16 B) | |||
924 | return Cr | (Cb << 16) | (Y << 8); | 951 | return Cr | (Cb << 16) | (Y << 8); |
925 | } | 952 | } |
926 | 953 | ||
927 | static void OSDSetColor(struct av7110 *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend) | 954 | static int OSDSetColor(struct av7110 *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend) |
928 | { | 955 | { |
956 | int ret; | ||
957 | |||
929 | u16 ch, cl; | 958 | u16 ch, cl; |
930 | u32 yuv; | 959 | u32 yuv; |
931 | 960 | ||
932 | yuv = blend ? RGB2YUV(r,g,b) : 0; | 961 | yuv = blend ? RGB2YUV(r,g,b) : 0; |
933 | cl = (yuv & 0xffff); | 962 | cl = (yuv & 0xffff); |
934 | ch = ((yuv >> 16) & 0xffff); | 963 | ch = ((yuv >> 16) & 0xffff); |
935 | SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], | 964 | ret = SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], |
936 | color, ch, cl); | 965 | color, ch, cl); |
937 | SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], | 966 | if (!ret) |
938 | color, ((blend >> 4) & 0x0f)); | 967 | ret = SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]], |
968 | color, ((blend >> 4) & 0x0f)); | ||
969 | return ret; | ||
939 | } | 970 | } |
940 | 971 | ||
941 | static int OSDSetPalette(struct av7110 *av7110, u32 __user * colors, u8 first, u8 last) | 972 | static int OSDSetPalette(struct av7110 *av7110, u32 __user * colors, u8 first, u8 last) |
@@ -968,14 +999,14 @@ static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, | |||
968 | { | 999 | { |
969 | uint w, h, bpp, bpl, size, lpb, bnum, brest; | 1000 | uint w, h, bpp, bpl, size, lpb, bnum, brest; |
970 | int i; | 1001 | int i; |
971 | int rc; | 1002 | int rc,release_rc; |
972 | 1003 | ||
973 | w = x1 - x0 + 1; | 1004 | w = x1 - x0 + 1; |
974 | h = y1 - y0 + 1; | 1005 | h = y1 - y0 + 1; |
975 | if (inc <= 0) | 1006 | if (inc <= 0) |
976 | inc = w; | 1007 | inc = w; |
977 | if (w <= 0 || w > 720 || h <= 0 || h > 576) | 1008 | if (w <= 0 || w > 720 || h <= 0 || h > 576) |
978 | return -1; | 1009 | return -EINVAL; |
979 | bpp = av7110->osdbpp[av7110->osdwin] + 1; | 1010 | bpp = av7110->osdbpp[av7110->osdwin] + 1; |
980 | bpl = ((w * bpp + 7) & ~7) / 8; | 1011 | bpl = ((w * bpp + 7) & ~7) / 8; |
981 | size = h * bpl; | 1012 | size = h * bpl; |
@@ -983,176 +1014,186 @@ static int OSDSetBlock(struct av7110 *av7110, int x0, int y0, | |||
983 | bnum = size / (lpb * bpl); | 1014 | bnum = size / (lpb * bpl); |
984 | brest = size - bnum * lpb * bpl; | 1015 | brest = size - bnum * lpb * bpl; |
985 | 1016 | ||
986 | for (i = 0; i < bnum; i++) { | 1017 | if (av7110->bmp_state == BMP_LOADING) { |
987 | rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], | 1018 | /* possible if syscall is repeated by -ERESTARTSYS and if firmware cannot abort */ |
988 | w, lpb, inc, data); | 1019 | BUG_ON (FW_VERSION(av7110->arm_app) >= 0x261e); |
989 | if (rc) | 1020 | rc = WaitUntilBmpLoaded(av7110); |
990 | return rc; | ||
991 | rc = BlitBitmap(av7110, av7110->osdwin, x0, y0 + i * lpb, 0); | ||
992 | if (rc) | 1021 | if (rc) |
993 | return rc; | 1022 | return rc; |
994 | data += lpb * inc; | 1023 | /* just continue. This should work for all fw versions |
1024 | * if bnum==1 && !brest && LoadBitmap was successful | ||
1025 | */ | ||
995 | } | 1026 | } |
996 | if (brest) { | 1027 | |
997 | rc = LoadBitmap(av7110, bpp2bit[av7110->osdbpp[av7110->osdwin]], | 1028 | rc = 0; |
998 | w, brest / bpl, inc, data); | 1029 | for (i = 0; i < bnum; i++) { |
1030 | rc = LoadBitmap(av7110, w, lpb, inc, data); | ||
999 | if (rc) | 1031 | if (rc) |
1000 | return rc; | 1032 | break; |
1001 | rc = BlitBitmap(av7110, av7110->osdwin, x0, y0 + bnum * lpb, 0); | 1033 | rc = BlitBitmap(av7110, x0, y0 + i * lpb); |
1002 | if (rc) | 1034 | if (rc) |
1003 | return rc; | 1035 | break; |
1036 | data += lpb * inc; | ||
1004 | } | 1037 | } |
1005 | ReleaseBitmap(av7110); | 1038 | if (!rc && brest) { |
1006 | return 0; | 1039 | rc = LoadBitmap(av7110, w, brest / bpl, inc, data); |
1040 | if (!rc) | ||
1041 | rc = BlitBitmap(av7110, x0, y0 + bnum * lpb); | ||
1042 | } | ||
1043 | release_rc = ReleaseBitmap(av7110); | ||
1044 | if (!rc) | ||
1045 | rc = release_rc; | ||
1046 | if (rc) | ||
1047 | dprintk(1,"returns %d\n",rc); | ||
1048 | return rc; | ||
1007 | } | 1049 | } |
1008 | 1050 | ||
1009 | int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc) | 1051 | int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc) |
1010 | { | 1052 | { |
1011 | int ret; | 1053 | int ret; |
1012 | 1054 | ||
1013 | ret = down_interruptible(&av7110->osd_sema); | 1055 | if (down_interruptible(&av7110->osd_sema)) |
1014 | if (ret) | ||
1015 | return -ERESTARTSYS; | 1056 | return -ERESTARTSYS; |
1016 | 1057 | ||
1017 | /* stupid, but OSD functions don't provide a return code anyway */ | ||
1018 | ret = 0; | ||
1019 | |||
1020 | switch (dc->cmd) { | 1058 | switch (dc->cmd) { |
1021 | case OSD_Close: | 1059 | case OSD_Close: |
1022 | DestroyOSDWindow(av7110, av7110->osdwin); | 1060 | ret = DestroyOSDWindow(av7110, av7110->osdwin); |
1023 | goto out; | 1061 | break; |
1024 | case OSD_Open: | 1062 | case OSD_Open: |
1025 | av7110->osdbpp[av7110->osdwin] = (dc->color - 1) & 7; | 1063 | av7110->osdbpp[av7110->osdwin] = (dc->color - 1) & 7; |
1026 | CreateOSDWindow(av7110, av7110->osdwin, | 1064 | ret = CreateOSDWindow(av7110, av7110->osdwin, |
1027 | bpp2bit[av7110->osdbpp[av7110->osdwin]], | 1065 | bpp2bit[av7110->osdbpp[av7110->osdwin]], |
1028 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1); | 1066 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1); |
1067 | if (ret) | ||
1068 | break; | ||
1029 | if (!dc->data) { | 1069 | if (!dc->data) { |
1030 | MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); | 1070 | ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); |
1031 | SetColorBlend(av7110, av7110->osdwin); | 1071 | if (ret) |
1072 | break; | ||
1073 | ret = SetColorBlend(av7110, av7110->osdwin); | ||
1032 | } | 1074 | } |
1033 | goto out; | 1075 | break; |
1034 | case OSD_Show: | 1076 | case OSD_Show: |
1035 | MoveWindowRel(av7110, av7110->osdwin, 0, 0); | 1077 | ret = MoveWindowRel(av7110, av7110->osdwin, 0, 0); |
1036 | goto out; | 1078 | break; |
1037 | case OSD_Hide: | 1079 | case OSD_Hide: |
1038 | HideWindow(av7110, av7110->osdwin); | 1080 | ret = HideWindow(av7110, av7110->osdwin); |
1039 | goto out; | 1081 | break; |
1040 | case OSD_Clear: | 1082 | case OSD_Clear: |
1041 | DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0); | 1083 | ret = DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0); |
1042 | goto out; | 1084 | break; |
1043 | case OSD_Fill: | 1085 | case OSD_Fill: |
1044 | DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color); | 1086 | ret = DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color); |
1045 | goto out; | 1087 | break; |
1046 | case OSD_SetColor: | 1088 | case OSD_SetColor: |
1047 | OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); | 1089 | ret = OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1); |
1048 | goto out; | 1090 | break; |
1049 | case OSD_SetPalette: | 1091 | case OSD_SetPalette: |
1050 | { | 1092 | if (FW_VERSION(av7110->arm_app) >= 0x2618) |
1051 | if (FW_VERSION(av7110->arm_app) >= 0x2618) { | ||
1052 | ret = OSDSetPalette(av7110, dc->data, dc->color, dc->x0); | 1093 | ret = OSDSetPalette(av7110, dc->data, dc->color, dc->x0); |
1053 | goto out; | 1094 | else { |
1054 | } else { | ||
1055 | int i, len = dc->x0-dc->color+1; | 1095 | int i, len = dc->x0-dc->color+1; |
1056 | u8 __user *colors = (u8 __user *)dc->data; | 1096 | u8 __user *colors = (u8 __user *)dc->data; |
1057 | u8 r, g, b, blend; | 1097 | u8 r, g, b, blend; |
1058 | 1098 | ret = 0; | |
1059 | for (i = 0; i<len; i++) { | 1099 | for (i = 0; i<len; i++) { |
1060 | if (get_user(r, colors + i * 4) || | 1100 | if (get_user(r, colors + i * 4) || |
1061 | get_user(g, colors + i * 4 + 1) || | 1101 | get_user(g, colors + i * 4 + 1) || |
1062 | get_user(b, colors + i * 4 + 2) || | 1102 | get_user(b, colors + i * 4 + 2) || |
1063 | get_user(blend, colors + i * 4 + 3)) { | 1103 | get_user(blend, colors + i * 4 + 3)) { |
1064 | ret = -EFAULT; | 1104 | ret = -EFAULT; |
1065 | goto out; | 1105 | break; |
1066 | } | 1106 | } |
1067 | OSDSetColor(av7110, dc->color + i, r, g, b, blend); | 1107 | ret = OSDSetColor(av7110, dc->color + i, r, g, b, blend); |
1108 | if (ret) | ||
1109 | break; | ||
1068 | } | 1110 | } |
1069 | } | 1111 | } |
1070 | ret = 0; | 1112 | break; |
1071 | goto out; | ||
1072 | } | ||
1073 | case OSD_SetTrans: | ||
1074 | goto out; | ||
1075 | case OSD_SetPixel: | 1113 | case OSD_SetPixel: |
1076 | DrawLine(av7110, av7110->osdwin, | 1114 | ret = DrawLine(av7110, av7110->osdwin, |
1077 | dc->x0, dc->y0, 0, 0, dc->color); | 1115 | dc->x0, dc->y0, 0, 0, dc->color); |
1078 | goto out; | 1116 | break; |
1079 | case OSD_GetPixel: | ||
1080 | goto out; | ||
1081 | case OSD_SetRow: | 1117 | case OSD_SetRow: |
1082 | dc->y1 = dc->y0; | 1118 | dc->y1 = dc->y0; |
1083 | /* fall through */ | 1119 | /* fall through */ |
1084 | case OSD_SetBlock: | 1120 | case OSD_SetBlock: |
1085 | ret = OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data); | 1121 | ret = OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data); |
1086 | goto out; | 1122 | break; |
1087 | case OSD_FillRow: | 1123 | case OSD_FillRow: |
1088 | DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, | 1124 | ret = DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, |
1089 | dc->x1-dc->x0+1, dc->y1, dc->color); | 1125 | dc->x1-dc->x0+1, dc->y1, dc->color); |
1090 | goto out; | 1126 | break; |
1091 | case OSD_FillBlock: | 1127 | case OSD_FillBlock: |
1092 | DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, | 1128 | ret = DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0, |
1093 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1, dc->color); | 1129 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1, dc->color); |
1094 | goto out; | 1130 | break; |
1095 | case OSD_Line: | 1131 | case OSD_Line: |
1096 | DrawLine(av7110, av7110->osdwin, | 1132 | ret = DrawLine(av7110, av7110->osdwin, |
1097 | dc->x0, dc->y0, dc->x1 - dc->x0, dc->y1 - dc->y0, dc->color); | 1133 | dc->x0, dc->y0, dc->x1 - dc->x0, dc->y1 - dc->y0, dc->color); |
1098 | goto out; | 1134 | break; |
1099 | case OSD_Query: | ||
1100 | goto out; | ||
1101 | case OSD_Test: | ||
1102 | goto out; | ||
1103 | case OSD_Text: | 1135 | case OSD_Text: |
1104 | { | 1136 | { |
1105 | char textbuf[240]; | 1137 | char textbuf[240]; |
1106 | 1138 | ||
1107 | if (strncpy_from_user(textbuf, dc->data, 240) < 0) { | 1139 | if (strncpy_from_user(textbuf, dc->data, 240) < 0) { |
1108 | ret = -EFAULT; | 1140 | ret = -EFAULT; |
1109 | goto out; | 1141 | break; |
1110 | } | 1142 | } |
1111 | textbuf[239] = 0; | 1143 | textbuf[239] = 0; |
1112 | if (dc->x1 > 3) | 1144 | if (dc->x1 > 3) |
1113 | dc->x1 = 3; | 1145 | dc->x1 = 3; |
1114 | SetFont(av7110, av7110->osdwin, dc->x1, | 1146 | ret = SetFont(av7110, av7110->osdwin, dc->x1, |
1115 | (u16) (dc->color & 0xffff), (u16) (dc->color >> 16)); | 1147 | (u16) (dc->color & 0xffff), (u16) (dc->color >> 16)); |
1116 | FlushText(av7110); | 1148 | if (!ret) |
1117 | WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf); | 1149 | ret = FlushText(av7110); |
1118 | goto out; | 1150 | if (!ret) |
1151 | ret = WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf); | ||
1152 | break; | ||
1119 | } | 1153 | } |
1120 | case OSD_SetWindow: | 1154 | case OSD_SetWindow: |
1121 | if (dc->x0 < 1 || dc->x0 > 7) { | 1155 | if (dc->x0 < 1 || dc->x0 > 7) |
1122 | ret = -EINVAL; | 1156 | ret = -EINVAL; |
1123 | goto out; | 1157 | else { |
1158 | av7110->osdwin = dc->x0; | ||
1159 | ret = 0; | ||
1124 | } | 1160 | } |
1125 | av7110->osdwin = dc->x0; | 1161 | break; |
1126 | goto out; | ||
1127 | case OSD_MoveWindow: | 1162 | case OSD_MoveWindow: |
1128 | MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); | 1163 | ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); |
1129 | SetColorBlend(av7110, av7110->osdwin); | 1164 | if (!ret) |
1130 | goto out; | 1165 | ret = SetColorBlend(av7110, av7110->osdwin); |
1166 | break; | ||
1131 | case OSD_OpenRaw: | 1167 | case OSD_OpenRaw: |
1132 | if (dc->color < OSD_BITMAP1 || dc->color > OSD_CURSOR) { | 1168 | if (dc->color < OSD_BITMAP1 || dc->color > OSD_CURSOR) { |
1133 | ret = -EINVAL; | 1169 | ret = -EINVAL; |
1134 | goto out; | 1170 | break; |
1135 | } | 1171 | } |
1136 | if (dc->color >= OSD_BITMAP1 && dc->color <= OSD_BITMAP8HR) { | 1172 | if (dc->color >= OSD_BITMAP1 && dc->color <= OSD_BITMAP8HR) |
1137 | av7110->osdbpp[av7110->osdwin] = (1 << (dc->color & 3)) - 1; | 1173 | av7110->osdbpp[av7110->osdwin] = (1 << (dc->color & 3)) - 1; |
1138 | } | 1174 | else |
1139 | else { | ||
1140 | av7110->osdbpp[av7110->osdwin] = 0; | 1175 | av7110->osdbpp[av7110->osdwin] = 0; |
1141 | } | 1176 | ret = CreateOSDWindow(av7110, av7110->osdwin, (osd_raw_window_t)dc->color, |
1142 | CreateOSDWindow(av7110, av7110->osdwin, (osd_raw_window_t)dc->color, | ||
1143 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1); | 1177 | dc->x1 - dc->x0 + 1, dc->y1 - dc->y0 + 1); |
1178 | if (ret) | ||
1179 | break; | ||
1144 | if (!dc->data) { | 1180 | if (!dc->data) { |
1145 | MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); | 1181 | ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0); |
1146 | SetColorBlend(av7110, av7110->osdwin); | 1182 | if (!ret) |
1183 | ret = SetColorBlend(av7110, av7110->osdwin); | ||
1147 | } | 1184 | } |
1148 | goto out; | 1185 | break; |
1149 | default: | 1186 | default: |
1150 | ret = -EINVAL; | 1187 | ret = -EINVAL; |
1151 | goto out; | 1188 | break; |
1152 | } | 1189 | } |
1153 | 1190 | ||
1154 | out: | ||
1155 | up(&av7110->osd_sema); | 1191 | up(&av7110->osd_sema); |
1192 | if (ret==-ERESTARTSYS) | ||
1193 | dprintk(1, "av7110_osd_cmd(%d) returns with -ERESTARTSYS\n",dc->cmd); | ||
1194 | else if (ret) | ||
1195 | dprintk(1, "av7110_osd_cmd(%d) returns with %d\n",dc->cmd,ret); | ||
1196 | |||
1156 | return ret; | 1197 | return ret; |
1157 | } | 1198 | } |
1158 | 1199 | ||
diff --git a/drivers/media/dvb/ttpci/av7110_hw.h b/drivers/media/dvb/ttpci/av7110_hw.h index 52061e17c6dd..fedd20f9815d 100644 --- a/drivers/media/dvb/ttpci/av7110_hw.h +++ b/drivers/media/dvb/ttpci/av7110_hw.h | |||
@@ -458,27 +458,27 @@ static inline int SendDAC(struct av7110 *av7110, u8 addr, u8 data) | |||
458 | return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); | 458 | return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, AudioDAC, 2, addr, data); |
459 | } | 459 | } |
460 | 460 | ||
461 | static inline void av7710_set_video_mode(struct av7110 *av7110, int mode) | 461 | static inline int av7710_set_video_mode(struct av7110 *av7110, int mode) |
462 | { | 462 | { |
463 | av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); | 463 | return av7110_fw_cmd(av7110, COMTYPE_ENCODER, SetVidMode, 1, mode); |
464 | } | 464 | } |
465 | 465 | ||
466 | static int inline vidcom(struct av7110 *av7110, u32 com, u32 arg) | 466 | static inline int vidcom(struct av7110 *av7110, u32 com, u32 arg) |
467 | { | 467 | { |
468 | return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_VIDEO_COMMAND, 4, | 468 | return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_VIDEO_COMMAND, 4, |
469 | (com>>16), (com&0xffff), | 469 | (com>>16), (com&0xffff), |
470 | (arg>>16), (arg&0xffff)); | 470 | (arg>>16), (arg&0xffff)); |
471 | } | 471 | } |
472 | 472 | ||
473 | static int inline audcom(struct av7110 *av7110, u32 com) | 473 | static inline int audcom(struct av7110 *av7110, u32 com) |
474 | { | 474 | { |
475 | return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_AUDIO_COMMAND, 2, | 475 | return av7110_fw_cmd(av7110, COMTYPE_MISC, AV7110_FW_AUDIO_COMMAND, 2, |
476 | (com>>16), (com&0xffff)); | 476 | (com>>16), (com&0xffff)); |
477 | } | 477 | } |
478 | 478 | ||
479 | static inline void Set22K(struct av7110 *av7110, int state) | 479 | static inline int Set22K(struct av7110 *av7110, int state) |
480 | { | 480 | { |
481 | av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); | 481 | return av7110_fw_cmd(av7110, COMTYPE_AUDIODAC, (state ? ON22K : OFF22K), 0); |
482 | } | 482 | } |
483 | 483 | ||
484 | 484 | ||
diff --git a/drivers/media/dvb/ttpci/av7110_ipack.c b/drivers/media/dvb/ttpci/av7110_ipack.c index 246640741888..699ef8b5b99a 100644 --- a/drivers/media/dvb/ttpci/av7110_ipack.c +++ b/drivers/media/dvb/ttpci/av7110_ipack.c | |||
@@ -24,7 +24,7 @@ int av7110_ipack_init(struct ipack *p, int size, | |||
24 | void (*func)(u8 *buf, int size, void *priv)) | 24 | void (*func)(u8 *buf, int size, void *priv)) |
25 | { | 25 | { |
26 | if (!(p->buf = vmalloc(size*sizeof(u8)))) { | 26 | if (!(p->buf = vmalloc(size*sizeof(u8)))) { |
27 | printk ("Couldn't allocate memory for ipack\n"); | 27 | printk(KERN_WARNING "Couldn't allocate memory for ipack\n"); |
28 | return -ENOMEM; | 28 | return -ENOMEM; |
29 | } | 29 | } |
30 | p->size = size; | 30 | p->size = size; |
diff --git a/drivers/media/dvb/ttpci/budget-av.c b/drivers/media/dvb/ttpci/budget-av.c index 6e0f5d307c52..b65f4b0a481f 100644 --- a/drivers/media/dvb/ttpci/budget-av.c +++ b/drivers/media/dvb/ttpci/budget-av.c | |||
@@ -570,9 +570,9 @@ static int philips_cu1216_pll_set(struct dvb_frontend *fe, struct dvb_frontend_p | |||
570 | 570 | ||
571 | buf[0] = (div >> 8) & 0x7f; | 571 | buf[0] = (div >> 8) & 0x7f; |
572 | buf[1] = div & 0xff; | 572 | buf[1] = div & 0xff; |
573 | buf[2] = 0x8e; | 573 | buf[2] = 0x86; |
574 | buf[3] = (params->frequency < 174500000 ? 0xa1 : | 574 | buf[3] = (params->frequency < 150000000 ? 0x01 : |
575 | params->frequency < 454000000 ? 0x92 : 0x34); | 575 | params->frequency < 445000000 ? 0x02 : 0x04); |
576 | 576 | ||
577 | if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) | 577 | if (i2c_transfer(&budget->i2c_adap, &msg, 1) != 1) |
578 | return -EIO; | 578 | return -EIO; |
@@ -695,8 +695,12 @@ static struct tda1004x_config philips_tu1216_config = { | |||
695 | .demod_address = 0x8, | 695 | .demod_address = 0x8, |
696 | .invert = 1, | 696 | .invert = 1, |
697 | .invert_oclk = 1, | 697 | .invert_oclk = 1, |
698 | .xtal_freq = TDA10046_XTAL_4M, | ||
699 | .agc_config = TDA10046_AGC_DEFAULT, | ||
700 | .if_freq = TDA10046_FREQ_3617, | ||
698 | .pll_init = philips_tu1216_pll_init, | 701 | .pll_init = philips_tu1216_pll_init, |
699 | .pll_set = philips_tu1216_pll_set, | 702 | .pll_set = philips_tu1216_pll_set, |
703 | .pll_sleep = NULL, | ||
700 | .request_firmware = philips_tu1216_request_firmware, | 704 | .request_firmware = philips_tu1216_request_firmware, |
701 | }; | 705 | }; |
702 | 706 | ||
diff --git a/drivers/media/dvb/ttpci/budget-ci.c b/drivers/media/dvb/ttpci/budget-ci.c index dce116111376..a1267054bc01 100644 --- a/drivers/media/dvb/ttpci/budget-ci.c +++ b/drivers/media/dvb/ttpci/budget-ci.c | |||
@@ -69,6 +69,7 @@ struct budget_ci { | |||
69 | int slot_status; | 69 | int slot_status; |
70 | struct dvb_ca_en50221 ca; | 70 | struct dvb_ca_en50221 ca; |
71 | char ir_dev_name[50]; | 71 | char ir_dev_name[50]; |
72 | u8 tuner_pll_address; /* used for philips_tdm1316l configs */ | ||
72 | }; | 73 | }; |
73 | 74 | ||
74 | /* from reading the following remotes: | 75 | /* from reading the following remotes: |
@@ -723,7 +724,7 @@ static int philips_tdm1316l_pll_init(struct dvb_frontend *fe) | |||
723 | struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; | 724 | struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; |
724 | static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab }; | 725 | static u8 td1316_init[] = { 0x0b, 0xf5, 0x85, 0xab }; |
725 | static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 }; | 726 | static u8 disable_mc44BC374c[] = { 0x1d, 0x74, 0xa0, 0x68 }; |
726 | struct i2c_msg tuner_msg = {.addr = 0x63,.flags = 0,.buf = td1316_init,.len = | 727 | struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = td1316_init,.len = |
727 | sizeof(td1316_init) }; | 728 | sizeof(td1316_init) }; |
728 | 729 | ||
729 | // setup PLL configuration | 730 | // setup PLL configuration |
@@ -746,7 +747,7 @@ static int philips_tdm1316l_pll_set(struct dvb_frontend *fe, struct dvb_frontend | |||
746 | { | 747 | { |
747 | struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; | 748 | struct budget_ci *budget_ci = (struct budget_ci *) fe->dvb->priv; |
748 | u8 tuner_buf[4]; | 749 | u8 tuner_buf[4]; |
749 | struct i2c_msg tuner_msg = {.addr = 0x63,.flags = 0,.buf = tuner_buf,.len = sizeof(tuner_buf) }; | 750 | struct i2c_msg tuner_msg = {.addr = budget_ci->tuner_pll_address,.flags = 0,.buf = tuner_buf,.len = sizeof(tuner_buf) }; |
750 | int tuner_frequency = 0; | 751 | int tuner_frequency = 0; |
751 | u8 band, cp, filter; | 752 | u8 band, cp, filter; |
752 | 753 | ||
@@ -838,8 +839,12 @@ static struct tda1004x_config philips_tdm1316l_config = { | |||
838 | .demod_address = 0x8, | 839 | .demod_address = 0x8, |
839 | .invert = 0, | 840 | .invert = 0, |
840 | .invert_oclk = 0, | 841 | .invert_oclk = 0, |
842 | .xtal_freq = TDA10046_XTAL_4M, | ||
843 | .agc_config = TDA10046_AGC_DEFAULT, | ||
844 | .if_freq = TDA10046_FREQ_3617, | ||
841 | .pll_init = philips_tdm1316l_pll_init, | 845 | .pll_init = philips_tdm1316l_pll_init, |
842 | .pll_set = philips_tdm1316l_pll_set, | 846 | .pll_set = philips_tdm1316l_pll_set, |
847 | .pll_sleep = NULL, | ||
843 | .request_firmware = philips_tdm1316l_request_firmware, | 848 | .request_firmware = philips_tdm1316l_request_firmware, |
844 | }; | 849 | }; |
845 | 850 | ||
@@ -865,12 +870,22 @@ static void frontend_init(struct budget_ci *budget_ci) | |||
865 | break; | 870 | break; |
866 | 871 | ||
867 | case 0x1011: // Hauppauge/TT Nova-T budget (tda10045/Philips tdm1316l(tda6651tt) + TDA9889) | 872 | case 0x1011: // Hauppauge/TT Nova-T budget (tda10045/Philips tdm1316l(tda6651tt) + TDA9889) |
873 | budget_ci->tuner_pll_address = 0x63; | ||
868 | budget_ci->budget.dvb_frontend = | 874 | budget_ci->budget.dvb_frontend = |
869 | tda10045_attach(&philips_tdm1316l_config, &budget_ci->budget.i2c_adap); | 875 | tda10045_attach(&philips_tdm1316l_config, &budget_ci->budget.i2c_adap); |
870 | if (budget_ci->budget.dvb_frontend) { | 876 | if (budget_ci->budget.dvb_frontend) { |
871 | break; | 877 | break; |
872 | } | 878 | } |
873 | break; | 879 | break; |
880 | |||
881 | case 0x1012: // Hauppauge/TT Nova-T CI budget (tda10045/Philips tdm1316l(tda6651tt) + TDA9889) | ||
882 | budget_ci->tuner_pll_address = 0x60; | ||
883 | budget_ci->budget.dvb_frontend = | ||
884 | tda10046_attach(&philips_tdm1316l_config, &budget_ci->budget.i2c_adap); | ||
885 | if (budget_ci->budget.dvb_frontend) { | ||
886 | break; | ||
887 | } | ||
888 | break; | ||
874 | } | 889 | } |
875 | 890 | ||
876 | if (budget_ci->budget.dvb_frontend == NULL) { | 891 | if (budget_ci->budget.dvb_frontend == NULL) { |
@@ -950,11 +965,13 @@ static struct saa7146_extension budget_extension; | |||
950 | 965 | ||
951 | MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC); | 966 | MAKE_BUDGET_INFO(ttbci, "TT-Budget/WinTV-NOVA-CI PCI", BUDGET_TT_HW_DISEQC); |
952 | MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); | 967 | MAKE_BUDGET_INFO(ttbt2, "TT-Budget/WinTV-NOVA-T PCI", BUDGET_TT); |
968 | MAKE_BUDGET_INFO(ttbtci, "TT-Budget-T-CI PCI", BUDGET_TT); | ||
953 | 969 | ||
954 | static struct pci_device_id pci_tbl[] = { | 970 | static struct pci_device_id pci_tbl[] = { |
955 | MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c), | 971 | MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100c), |
956 | MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f), | 972 | MAKE_EXTENSION_PCI(ttbci, 0x13c2, 0x100f), |
957 | MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011), | 973 | MAKE_EXTENSION_PCI(ttbt2, 0x13c2, 0x1011), |
974 | MAKE_EXTENSION_PCI(ttbtci, 0x13c2, 0x1012), | ||
958 | { | 975 | { |
959 | .vendor = 0, | 976 | .vendor = 0, |
960 | } | 977 | } |
diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c index 083fd44e5f90..9961917e8a7f 100644 --- a/drivers/media/dvb/ttpci/budget.c +++ b/drivers/media/dvb/ttpci/budget.c | |||
@@ -40,6 +40,7 @@ | |||
40 | #include "ves1820.h" | 40 | #include "ves1820.h" |
41 | #include "l64781.h" | 41 | #include "l64781.h" |
42 | #include "tda8083.h" | 42 | #include "tda8083.h" |
43 | #include "s5h1420.h" | ||
43 | 44 | ||
44 | static void Set22K (struct budget *budget, int state) | 45 | static void Set22K (struct budget *budget, int state) |
45 | { | 46 | { |
@@ -177,6 +178,62 @@ static int budget_diseqc_send_burst(struct dvb_frontend* fe, fe_sec_mini_cmd_t m | |||
177 | return 0; | 178 | return 0; |
178 | } | 179 | } |
179 | 180 | ||
181 | static int lnbp21_set_voltage(struct dvb_frontend* fe, fe_sec_voltage_t voltage) | ||
182 | { | ||
183 | struct budget* budget = (struct budget*) fe->dvb->priv; | ||
184 | u8 buf; | ||
185 | struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) }; | ||
186 | |||
187 | if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; | ||
188 | |||
189 | switch(voltage) { | ||
190 | case SEC_VOLTAGE_13: | ||
191 | buf = (buf & 0xf7) | 0x04; | ||
192 | break; | ||
193 | |||
194 | case SEC_VOLTAGE_18: | ||
195 | buf = (buf & 0xf7) | 0x0c; | ||
196 | break; | ||
197 | |||
198 | case SEC_VOLTAGE_OFF: | ||
199 | buf = buf & 0xf0; | ||
200 | break; | ||
201 | } | ||
202 | |||
203 | msg.flags = 0; | ||
204 | if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; | ||
205 | |||
206 | return 0; | ||
207 | } | ||
208 | |||
209 | static int lnbp21_enable_high_lnb_voltage(struct dvb_frontend* fe, int arg) | ||
210 | { | ||
211 | struct budget* budget = (struct budget*) fe->dvb->priv; | ||
212 | u8 buf; | ||
213 | struct i2c_msg msg = { .addr = 0x08, .flags = I2C_M_RD, .buf = &buf, .len = sizeof(buf) }; | ||
214 | |||
215 | if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; | ||
216 | |||
217 | if (arg) { | ||
218 | buf = buf | 0x10; | ||
219 | } else { | ||
220 | buf = buf & 0xef; | ||
221 | } | ||
222 | |||
223 | msg.flags = 0; | ||
224 | if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; | ||
225 | |||
226 | return 0; | ||
227 | } | ||
228 | |||
229 | static void lnbp21_init(struct budget* budget) | ||
230 | { | ||
231 | u8 buf = 0x00; | ||
232 | struct i2c_msg msg = { .addr = 0x08, .flags = 0, .buf = &buf, .len = sizeof(buf) }; | ||
233 | |||
234 | i2c_transfer (&budget->i2c_adap, &msg, 1); | ||
235 | } | ||
236 | |||
180 | static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) | 237 | static int alps_bsrv2_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params) |
181 | { | 238 | { |
182 | struct budget* budget = (struct budget*) fe->dvb->priv; | 239 | struct budget* budget = (struct budget*) fe->dvb->priv; |
@@ -395,6 +452,38 @@ static struct tda8083_config grundig_29504_451_config = { | |||
395 | .pll_set = grundig_29504_451_pll_set, | 452 | .pll_set = grundig_29504_451_pll_set, |
396 | }; | 453 | }; |
397 | 454 | ||
455 | static int s5h1420_pll_set(struct dvb_frontend* fe, struct dvb_frontend_parameters* params, u32* freqout) | ||
456 | { | ||
457 | struct budget* budget = (struct budget*) fe->dvb->priv; | ||
458 | u32 div; | ||
459 | u8 data[4]; | ||
460 | struct i2c_msg msg = { .addr = 0x61, .flags = 0, .buf = data, .len = sizeof(data) }; | ||
461 | |||
462 | div = params->frequency / 1000; | ||
463 | data[0] = (div >> 8) & 0x7f; | ||
464 | data[1] = div & 0xff; | ||
465 | data[2] = 0xc2; | ||
466 | |||
467 | if (div < 1450) | ||
468 | data[3] = 0x00; | ||
469 | else if (div < 1850) | ||
470 | data[3] = 0x40; | ||
471 | else if (div < 2000) | ||
472 | data[3] = 0x80; | ||
473 | else | ||
474 | data[3] = 0xc0; | ||
475 | |||
476 | if (i2c_transfer (&budget->i2c_adap, &msg, 1) != 1) return -EIO; | ||
477 | |||
478 | *freqout = div * 1000; | ||
479 | return 0; | ||
480 | } | ||
481 | |||
482 | static struct s5h1420_config s5h1420_config = { | ||
483 | .demod_address = 0x53, | ||
484 | .pll_set = s5h1420_pll_set, | ||
485 | }; | ||
486 | |||
398 | static u8 read_pwm(struct budget* budget) | 487 | static u8 read_pwm(struct budget* budget) |
399 | { | 488 | { |
400 | u8 b = 0xff; | 489 | u8 b = 0xff; |
@@ -459,6 +548,15 @@ static void frontend_init(struct budget *budget) | |||
459 | break; | 548 | break; |
460 | } | 549 | } |
461 | break; | 550 | break; |
551 | |||
552 | case 0x1016: // Hauppauge/TT Nova-S SE (samsung s5h1420/????(tda8260)) | ||
553 | budget->dvb_frontend = s5h1420_attach(&s5h1420_config, &budget->i2c_adap); | ||
554 | if (budget->dvb_frontend) { | ||
555 | budget->dvb_frontend->ops->set_voltage = lnbp21_set_voltage; | ||
556 | budget->dvb_frontend->ops->enable_high_lnb_voltage = lnbp21_enable_high_lnb_voltage; | ||
557 | lnbp21_init(budget); | ||
558 | break; | ||
559 | } | ||
462 | } | 560 | } |
463 | 561 | ||
464 | if (budget->dvb_frontend == NULL) { | 562 | if (budget->dvb_frontend == NULL) { |
@@ -532,6 +630,7 @@ static struct pci_device_id pci_tbl[] = { | |||
532 | MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), | 630 | MAKE_EXTENSION_PCI(ttbc, 0x13c2, 0x1004), |
533 | MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), | 631 | MAKE_EXTENSION_PCI(ttbt, 0x13c2, 0x1005), |
534 | MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), | 632 | MAKE_EXTENSION_PCI(satel, 0x13c2, 0x1013), |
633 | MAKE_EXTENSION_PCI(ttbs, 0x13c2, 0x1016), | ||
535 | MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), | 634 | MAKE_EXTENSION_PCI(fsacs1,0x1131, 0x4f60), |
536 | MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), | 635 | MAKE_EXTENSION_PCI(fsacs0,0x1131, 0x4f61), |
537 | { | 636 | { |