Initial commit: Uploaded everything from abs/core
[arch-rock.git] / base / kernel26 / hibernate-saa7134.diff
blob9564e8ad4e7b7073157c8718db164a19bbd6ce0b
1 --- drivers/media/video/saa7134/saa7134-core.c
2 +++ drivers/media/video/saa7134/saa7134-core.c
3 @@ -34,6 +34,7 @@
4 #include <linux/mutex.h>
5 #endif
6 #include <linux/dma-mapping.h>
7 +#include <linux/pm.h>
9 #include "saa7134-reg.h"
10 #include "saa7134.h"
11 @@ -475,6 +476,38 @@ void saa7134_buffer_timeout(unsigned long data)
12 spin_unlock_irqrestore(&dev->slock,flags);
15 +/* resends a current buffer in queue after resume */
17 +int saa7134_buffer_requeue(struct saa7134_dev *dev,
18 + struct saa7134_dmaqueue *q)
20 + struct saa7134_buf *buf , *next;
21 + unsigned long flags;
23 + spin_lock_irqsave(&dev->slock, flags);
25 + buf = q->curr;
26 + next = buf;
28 + dprintk("buffer_requeue\n");
30 + if (!buf) {
31 + spin_unlock_irqrestore(&dev->slock, flags);
32 + return 0;
33 + }
35 + dprintk("buffer_requeue : resending active buffers \n");
37 + if (!list_empty(&q->queue))
38 + next = list_entry(q->queue.next, struct saa7134_buf,
39 + vb.queue);
41 + buf->activate(dev, buf, next);
42 + spin_unlock_irqrestore(&dev->slock, flags);
44 + return 0;
47 /* ------------------------------------------------------------------ */
49 int saa7134_set_dmabits(struct saa7134_dev *dev)
50 @@ -738,6 +771,39 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
51 /* ------------------------------------------------------------------ */
53 /* early init (no i2c, no irq) */
55 +static int saa7134_hw_enable1(struct saa7134_dev *dev)
57 + /* RAM FIFO config */
58 + saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
59 + saa_writel(SAA7134_THRESHOULD, 0x02020202);
61 + /* enable audio + video processing */
62 + saa_writel(SAA7134_MAIN_CTRL,
63 + SAA7134_MAIN_CTRL_VPLLE |
64 + SAA7134_MAIN_CTRL_APLLE |
65 + SAA7134_MAIN_CTRL_EXOSC |
66 + SAA7134_MAIN_CTRL_EVFE1 |
67 + SAA7134_MAIN_CTRL_EVFE2 |
68 + SAA7134_MAIN_CTRL_ESFE |
69 + SAA7134_MAIN_CTRL_EBDAC);
71 + /*
72 + * Initialize OSS _after_ enabling audio clock PLL and audio processing.
73 + * OSS initialization writes to registers via the audio DSP; these
74 + * writes will fail unless the audio clock has been started. At worst,
75 + * audio will not work.
76 + */
78 + /* enable peripheral devices */
79 + saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
81 + /* set vertical line numbering start (vbi needs this) */
82 + saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
84 + return 0;
87 static int saa7134_hwinit1(struct saa7134_dev *dev)
89 dprintk("hwinit1\n");
90 @@ -754,44 +820,16 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
91 saa7134_ts_init1(dev);
92 saa7134_input_init1(dev);
94 - /* RAM FIFO config */
95 - saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
96 - saa_writel(SAA7134_THRESHOULD,0x02020202);
98 - /* enable audio + video processing */
99 - saa_writel(SAA7134_MAIN_CTRL,
100 - SAA7134_MAIN_CTRL_VPLLE |
101 - SAA7134_MAIN_CTRL_APLLE |
102 - SAA7134_MAIN_CTRL_EXOSC |
103 - SAA7134_MAIN_CTRL_EVFE1 |
104 - SAA7134_MAIN_CTRL_EVFE2 |
105 - SAA7134_MAIN_CTRL_ESFE |
106 - SAA7134_MAIN_CTRL_EBDAC);
108 - /*
109 - * Initialize OSS _after_ enabling audio clock PLL and audio processing.
110 - * OSS initialization writes to registers via the audio DSP; these
111 - * writes will fail unless the audio clock has been started. At worst,
112 - * audio will not work.
113 - */
115 - /* enable peripheral devices */
116 - saa_writeb(SAA7134_SPECIAL_MODE, 0x01);
118 - /* set vertical line numbering start (vbi needs this) */
119 - saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
120 + saa7134_hw_enable1(dev);
122 return 0;
125 /* late init (with i2c + irq) */
126 -static int saa7134_hwinit2(struct saa7134_dev *dev)
127 +static int saa7134_hw_enable2(struct saa7134_dev *dev)
129 - unsigned int irq2_mask;
130 - dprintk("hwinit2\n");
132 - saa7134_video_init2(dev);
133 - saa7134_tvaudio_init2(dev);
134 + unsigned int irq2_mask;
136 /* enable IRQ's */
137 irq2_mask =
138 @@ -817,6 +855,20 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
139 return 0;
142 +static int saa7134_hwinit2(struct saa7134_dev *dev)
145 + dprintk("hwinit2\n");
147 + saa7134_video_init2(dev);
148 + saa7134_tvaudio_init2(dev);
150 + saa7134_hw_enable2(dev);
152 + return 0;
156 /* shutdown */
157 static int saa7134_hwfini(struct saa7134_dev *dev)
159 @@ -1214,6 +1266,65 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
160 kfree(dev);
163 +static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
166 + /* Disable card's IRQs to prevent it from resuming computer */
168 + struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
170 + saa_writel(SAA7134_IRQ1, 0);
171 + saa_writel(SAA7134_IRQ2, 0);
174 + pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
175 + pci_save_state(pci_dev);
177 + return 0;
180 +static int saa7134_resume(struct pci_dev *pci_dev)
183 + struct saa7134_dev *dev = pci_get_drvdata(pci_dev);
185 + pci_restore_state(pci_dev);
186 + pci_set_power_state(pci_dev, PCI_D0);
188 + /* Do things that are done in saa7134_initdev ,
189 + except of initializing memory structures.*/
191 + saa7134_board_init1(dev);
193 + if (saa7134_boards[dev->board].video_out)
194 + saa7134_videoport_init(dev);
196 + if (card_has_mpeg(dev))
197 + saa7134_ts_init_hw(dev);
199 + saa7134_hw_enable1(dev);
201 + saa7134_set_decoder(dev);
203 + saa7134_i2c_call_clients(dev, VIDIOC_S_STD, &dev->tvnorm->id);
205 + saa7134_board_init2(dev);
206 + saa7134_hw_enable2(dev);
208 + dev->force_mute_update = 1;
209 + saa7134_tvaudio_setmute(dev);
210 + dev->force_mute_update = 0;
211 + saa7134_tvaudio_setvolume(dev, dev->ctl_volume);
212 + saa7134_enable_i2s(dev);
214 + /*recapture unfinished buffer(s)*/
215 + saa7134_buffer_requeue(dev, &dev->video_q);
216 + saa7134_buffer_requeue(dev, &dev->vbi_q);
217 + saa7134_buffer_requeue(dev, &dev->ts_q);
219 + return 0;
222 /* ----------------------------------------------------------- */
224 int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
225 @@ -1255,6 +1366,8 @@ static struct pci_driver saa7134_pci_driver = {
226 .id_table = saa7134_pci_tbl,
227 .probe = saa7134_initdev,
228 .remove = __devexit_p(saa7134_finidev),
229 + .suspend = saa7134_suspend,
230 + .resume = saa7134_resume
233 static int saa7134_init(void)
234 --- drivers/media/video/saa7134/saa7134-ts.c
235 +++ drivers/media/video/saa7134/saa7134-ts.c
236 @@ -178,6 +178,22 @@ static unsigned int ts_nr_packets = 64;
237 module_param(ts_nr_packets, int, 0444);
238 MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");
240 +int saa7134_ts_init_hw(struct saa7134_dev *dev)
242 + /* deactivate TS softreset */
243 + saa_writeb(SAA7134_TS_SERIAL1, 0x00);
244 + /* TSSOP high active, TSVAL high active, TSLOCK ignored */
245 + saa_writeb(SAA7134_TS_PARALLEL, 0xec);
246 + saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
247 + saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
248 + saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
249 + /* TSNOPIT=0, TSCOLAP=0 */
250 + saa_writeb(SAA7134_TS_DMA2,
251 + ((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00));
253 + return 0;
256 int saa7134_ts_init1(struct saa7134_dev *dev)
258 /* sanitycheck insmod options */
259 @@ -201,12 +217,7 @@ int saa7134_ts_init1(struct saa7134_dev *dev)
260 saa7134_pgtable_alloc(dev->pci,&dev->ts.pt_ts);
262 /* init TS hw */
263 - saa_writeb(SAA7134_TS_SERIAL1, 0x00); /* deactivate TS softreset */
264 - saa_writeb(SAA7134_TS_PARALLEL, 0xec); /* TSSOP high active, TSVAL high active, TSLOCK ignored */
265 - saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
266 - saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
267 - saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
268 - saa_writeb(SAA7134_TS_DMA2, ((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */
269 + saa7134_ts_init_hw(dev);
271 return 0;
273 --- drivers/media/video/saa7134/saa7134-tvaudio.c
274 +++ drivers/media/video/saa7134/saa7134-tvaudio.c
275 @@ -232,7 +232,7 @@ static void mute_input_7134(struct saa7134_dev *dev)
278 if (dev->hw_mute == mute &&
279 - dev->hw_input == in) {
280 + dev->hw_input == in && !dev->force_mute_update) {
281 dprintk("mute/input: nothing to do [mute=%d,input=%s]\n",
282 mute,in->name);
283 return;
284 @@ -928,7 +928,7 @@ static int tvaudio_thread_ddep(void *data)
285 /* ------------------------------------------------------------------ */
286 /* common stuff + external entry points */
288 -static void saa7134_enable_i2s(struct saa7134_dev *dev)
289 +void saa7134_enable_i2s(struct saa7134_dev *dev)
291 int i2s_format;
293 --- drivers/media/video/saa7134/saa7134-video.c
294 +++ drivers/media/video/saa7134/saa7134-video.c
295 @@ -541,22 +541,12 @@ void res_free(struct saa7134_dev *dev, struct saa7134_fh *fh, unsigned int bits)
297 /* ------------------------------------------------------------------ */
299 -static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
300 +void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
302 - int luma_control,sync_control,mux;
304 dprintk("set tv norm = %s\n",norm->name);
305 dev->tvnorm = norm;
307 - mux = card_in(dev,dev->ctl_input).vmux;
308 - luma_control = norm->luma_control;
309 - sync_control = norm->sync_control;
311 - if (mux > 5)
312 - luma_control |= 0x80; /* svideo */
313 - if (noninterlaced || dev->nosignal)
314 - sync_control |= 0x20;
316 /* setup cropping */
317 dev->crop_bounds.left = norm->h_start;
318 dev->crop_defrect.left = norm->h_start;
319 @@ -571,6 +561,40 @@ static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
321 dev->crop_current = dev->crop_defrect;
323 + saa7134_set_decoder(dev);
325 + if (card_in(dev, dev->ctl_input).tv) {
326 + if ((card(dev).tuner_type == TUNER_PHILIPS_TDA8290)
327 + && ((card(dev).tuner_config == 1)
328 + || (card(dev).tuner_config == 2)))
329 + saa7134_set_gpio(dev, 22, 5);
330 + saa7134_i2c_call_clients(dev, VIDIOC_S_STD, &norm->id);
334 +static void video_mux(struct saa7134_dev *dev, int input)
336 + dprintk("video input = %d [%s]\n", input, card_in(dev, input).name);
337 + dev->ctl_input = input;
338 + set_tvnorm(dev, dev->tvnorm);
339 + saa7134_tvaudio_setinput(dev, &card_in(dev, input));
342 +void saa7134_set_decoder(struct saa7134_dev *dev)
344 + int luma_control, sync_control, mux;
346 + struct saa7134_tvnorm *norm = dev->tvnorm;
347 + mux = card_in(dev, dev->ctl_input).vmux;
349 + luma_control = norm->luma_control;
350 + sync_control = norm->sync_control;
352 + if (mux > 5)
353 + luma_control |= 0x80; /* svideo */
354 + if (noninterlaced || dev->nosignal)
355 + sync_control |= 0x20;
357 /* setup video decoder */
358 saa_writeb(SAA7134_INCR_DELAY, 0x08);
359 saa_writeb(SAA7134_ANALOG_IN_CTRL1, 0xc0 | mux);
360 @@ -605,23 +629,6 @@ static void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm)
361 saa_writeb(SAA7134_MISC_VGATE_MSB, norm->vgate_misc);
362 saa_writeb(SAA7134_RAW_DATA_GAIN, 0x40);
363 saa_writeb(SAA7134_RAW_DATA_OFFSET, 0x80);
365 - /* only tell the tuner if this is a tv input */
366 - if (card_in(dev,dev->ctl_input).tv) {
367 - if ((card(dev).tuner_type == TUNER_PHILIPS_TDA8290)
368 - && ((card(dev).tuner_config == 1)
369 - || (card(dev).tuner_config == 2)))
370 - saa7134_set_gpio(dev, 22, 5);
371 - saa7134_i2c_call_clients(dev,VIDIOC_S_STD,&norm->id);
375 -static void video_mux(struct saa7134_dev *dev, int input)
377 - dprintk("video input = %d [%s]\n",input,card_in(dev,input).name);
378 - dev->ctl_input = input;
379 - set_tvnorm(dev,dev->tvnorm);
380 - saa7134_tvaudio_setinput(dev,&card_in(dev,input));
383 static void set_h_prescale(struct saa7134_dev *dev, int task, int prescale)
384 @@ -2411,34 +2418,40 @@ int saa7134_video_init1(struct saa7134_dev *dev)
385 dev->video_q.timeout.data = (unsigned long)(&dev->video_q);
386 dev->video_q.dev = dev;
388 - if (saa7134_boards[dev->board].video_out) {
389 - /* enable video output */
390 - int vo = saa7134_boards[dev->board].video_out;
391 - int video_reg;
392 - unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts;
393 - saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
394 - video_reg = video_out[vo][1];
395 - if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED)
396 - video_reg &= ~VP_T_CODE_P_INVERTED;
397 - saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg);
398 - saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
399 - saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
400 - saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
401 - video_reg = video_out[vo][5];
402 - if (vid_port_opts & SET_CLOCK_NOT_DELAYED)
403 - video_reg &= ~VP_CLK_CTRL2_DELAYED;
404 - if (vid_port_opts & SET_CLOCK_INVERTED)
405 - video_reg |= VP_CLK_CTRL1_INVERTED;
406 - saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_reg);
407 - video_reg = video_out[vo][6];
408 - if (vid_port_opts & SET_VSYNC_OFF) {
409 - video_reg &= ~VP_VS_TYPE_MASK;
410 - video_reg |= VP_VS_TYPE_OFF;
412 - saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_reg);
413 - saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
414 - saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
416 + if (saa7134_boards[dev->board].video_out)
417 + saa7134_videoport_init(dev);
419 + return 0;
422 +int saa7134_videoport_init(struct saa7134_dev *dev)
424 + /* enable video output */
425 + int vo = saa7134_boards[dev->board].video_out;
426 + int video_reg;
427 + unsigned int vid_port_opts = saa7134_boards[dev->board].vid_port_opts;
428 + saa_writeb(SAA7134_VIDEO_PORT_CTRL0, video_out[vo][0]);
429 + video_reg = video_out[vo][1];
430 + if (vid_port_opts & SET_T_CODE_POLARITY_NON_INVERTED)
431 + video_reg &= ~VP_T_CODE_P_INVERTED;
432 + saa_writeb(SAA7134_VIDEO_PORT_CTRL1, video_reg);
433 + saa_writeb(SAA7134_VIDEO_PORT_CTRL2, video_out[vo][2]);
434 + saa_writeb(SAA7134_VIDEO_PORT_CTRL3, video_out[vo][3]);
435 + saa_writeb(SAA7134_VIDEO_PORT_CTRL4, video_out[vo][4]);
436 + video_reg = video_out[vo][5];
437 + if (vid_port_opts & SET_CLOCK_NOT_DELAYED)
438 + video_reg &= ~VP_CLK_CTRL2_DELAYED;
439 + if (vid_port_opts & SET_CLOCK_INVERTED)
440 + video_reg |= VP_CLK_CTRL1_INVERTED;
441 + saa_writeb(SAA7134_VIDEO_PORT_CTRL5, video_reg);
442 + video_reg = video_out[vo][6];
443 + if (vid_port_opts & SET_VSYNC_OFF) {
444 + video_reg &= ~VP_VS_TYPE_MASK;
445 + video_reg |= VP_VS_TYPE_OFF;
447 + saa_writeb(SAA7134_VIDEO_PORT_CTRL6, video_reg);
448 + saa_writeb(SAA7134_VIDEO_PORT_CTRL7, video_out[vo][7]);
449 + saa_writeb(SAA7134_VIDEO_PORT_CTRL8, video_out[vo][8]);
451 return 0;
453 --- drivers/media/video/saa7134/saa7134.h
454 +++ drivers/media/video/saa7134/saa7134.h
455 @@ -542,6 +542,7 @@ struct saa7134_dev {
456 struct saa7134_input *input;
457 struct saa7134_input *hw_input;
458 unsigned int hw_mute;
459 + unsigned int force_mute_update;
460 int last_carrier;
461 int nosignal;
463 @@ -614,6 +615,9 @@ void saa7134_buffer_next(struct saa7134_dev *dev, struct saa7134_dmaqueue *q);
464 void saa7134_buffer_timeout(unsigned long data);
465 void saa7134_dma_free(struct videobuf_queue *q,struct saa7134_buf *buf);
467 +int saa7134_buffer_requeue(struct saa7134_dev *dev,
468 + struct saa7134_dmaqueue *q);
470 int saa7134_set_dmabits(struct saa7134_dev *dev);
472 extern int (*saa7134_dmasound_init)(struct saa7134_dev *dev);
473 @@ -646,6 +650,10 @@ void saa7134_i2c_call_clients(struct saa7134_dev *dev,
474 extern struct video_device saa7134_video_template;
475 extern struct video_device saa7134_radio_template;
477 +void set_tvnorm(struct saa7134_dev *dev, struct saa7134_tvnorm *norm);
478 +int saa7134_videoport_init(struct saa7134_dev *dev);
479 +void saa7134_set_decoder(struct saa7134_dev *dev);
481 int saa7134_common_ioctl(struct saa7134_dev *dev,
482 unsigned int cmd, void *arg);
484 @@ -669,6 +677,8 @@ void saa7134_irq_ts_done(struct saa7134_dev *dev, unsigned long status);
485 int saa7134_ts_register(struct saa7134_mpeg_ops *ops);
486 void saa7134_ts_unregister(struct saa7134_mpeg_ops *ops);
488 +int saa7134_ts_init_hw(struct saa7134_dev *dev);
490 /* ----------------------------------------------------------- */
491 /* saa7134-vbi.c */
493 @@ -697,6 +707,8 @@ int saa7134_tvaudio_do_scan(struct saa7134_dev *dev);
495 int saa_dsp_writel(struct saa7134_dev *dev, int reg, u32 value);
497 +void saa7134_enable_i2s(struct saa7134_dev *dev);
499 /* ----------------------------------------------------------- */
500 /* saa7134-oss.c */
503 1.5.2.3