Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 65934
b: refs/heads/master
c: cb71201
h: refs/heads/master
v: v3
  • Loading branch information
Maxim Levitsky authored and Mauro Carvalho Chehab committed Oct 10, 2007
1 parent 36c6f15 commit 64adeb0
Show file tree
Hide file tree
Showing 6 changed files with 245 additions and 96 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: f5a1ac64cc444cf19c8817d61a410b70bbb619d9
refs/heads/master: cb71201f20e43581857043a1f856fb61ce44bdf8
175 changes: 144 additions & 31 deletions trunk/drivers/media/video/saa7134/saa7134-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#include <linux/delay.h>
#include <linux/mutex.h>
#include <linux/dma-mapping.h>
#include <linux/pm.h>

#include "saa7134-reg.h"
#include "saa7134.h"
Expand Down Expand Up @@ -392,6 +393,38 @@ void saa7134_buffer_timeout(unsigned long data)
spin_unlock_irqrestore(&dev->slock,flags);
}

/* resends a current buffer in queue after resume */

int saa7134_buffer_requeue(struct saa7134_dev *dev,
struct saa7134_dmaqueue *q)
{
struct saa7134_buf *buf , *next;
unsigned long flags;

spin_lock_irqsave(&dev->slock, flags);

buf = q->curr;
next = buf;

dprintk("buffer_requeue\n");

if (!buf) {
spin_unlock_irqrestore(&dev->slock, flags);
return 0;
}

dprintk("buffer_requeue : resending active buffers \n");

if (!list_empty(&q->queue))
next = list_entry(q->queue.next, struct saa7134_buf,
vb.queue);

buf->activate(dev, buf, next);
spin_unlock_irqrestore(&dev->slock, flags);

return 0;
}

/* ------------------------------------------------------------------ */

int saa7134_set_dmabits(struct saa7134_dev *dev)
Expand Down Expand Up @@ -647,6 +680,39 @@ static irqreturn_t saa7134_irq(int irq, void *dev_id)
/* ------------------------------------------------------------------ */

/* early init (no i2c, no irq) */

static int saa7134_hw_enable1(struct saa7134_dev *dev)
{
/* RAM FIFO config */
saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
saa_writel(SAA7134_THRESHOULD, 0x02020202);

/* enable audio + video processing */
saa_writel(SAA7134_MAIN_CTRL,
SAA7134_MAIN_CTRL_VPLLE |
SAA7134_MAIN_CTRL_APLLE |
SAA7134_MAIN_CTRL_EXOSC |
SAA7134_MAIN_CTRL_EVFE1 |
SAA7134_MAIN_CTRL_EVFE2 |
SAA7134_MAIN_CTRL_ESFE |
SAA7134_MAIN_CTRL_EBDAC);

/*
* Initialize OSS _after_ enabling audio clock PLL and audio processing.
* OSS initialization writes to registers via the audio DSP; these
* writes will fail unless the audio clock has been started. At worst,
* audio will not work.
*/

/* enable peripheral devices */
saa_writeb(SAA7134_SPECIAL_MODE, 0x01);

/* set vertical line numbering start (vbi needs this) */
saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);

return 0;
}

static int saa7134_hwinit1(struct saa7134_dev *dev)
{
dprintk("hwinit1\n");
Expand All @@ -663,44 +729,16 @@ static int saa7134_hwinit1(struct saa7134_dev *dev)
saa7134_ts_init1(dev);
saa7134_input_init1(dev);

/* RAM FIFO config */
saa_writel(SAA7134_FIFO_SIZE, 0x08070503);
saa_writel(SAA7134_THRESHOULD,0x02020202);

/* enable audio + video processing */
saa_writel(SAA7134_MAIN_CTRL,
SAA7134_MAIN_CTRL_VPLLE |
SAA7134_MAIN_CTRL_APLLE |
SAA7134_MAIN_CTRL_EXOSC |
SAA7134_MAIN_CTRL_EVFE1 |
SAA7134_MAIN_CTRL_EVFE2 |
SAA7134_MAIN_CTRL_ESFE |
SAA7134_MAIN_CTRL_EBDAC);

/*
* Initialize OSS _after_ enabling audio clock PLL and audio processing.
* OSS initialization writes to registers via the audio DSP; these
* writes will fail unless the audio clock has been started. At worst,
* audio will not work.
*/

/* enable peripheral devices */
saa_writeb(SAA7134_SPECIAL_MODE, 0x01);

/* set vertical line numbering start (vbi needs this) */
saa_writeb(SAA7134_SOURCE_TIMING2, 0x20);
saa7134_hw_enable1(dev);

return 0;
}

/* late init (with i2c + irq) */
static int saa7134_hwinit2(struct saa7134_dev *dev)
static int saa7134_hw_enable2(struct saa7134_dev *dev)
{
unsigned int irq2_mask;
dprintk("hwinit2\n");

saa7134_video_init2(dev);
saa7134_tvaudio_init2(dev);
unsigned int irq2_mask;

/* enable IRQ's */
irq2_mask =
Expand All @@ -726,6 +764,20 @@ static int saa7134_hwinit2(struct saa7134_dev *dev)
return 0;
}

static int saa7134_hwinit2(struct saa7134_dev *dev)
{

dprintk("hwinit2\n");

saa7134_video_init2(dev);
saa7134_tvaudio_init2(dev);

saa7134_hw_enable2(dev);

return 0;
}


/* shutdown */
static int saa7134_hwfini(struct saa7134_dev *dev)
{
Expand Down Expand Up @@ -1118,6 +1170,65 @@ static void __devexit saa7134_finidev(struct pci_dev *pci_dev)
kfree(dev);
}

static int saa7134_suspend(struct pci_dev *pci_dev , pm_message_t state)
{

/* Disable card's IRQs to prevent it from resuming computer */

struct saa7134_dev *dev = pci_get_drvdata(pci_dev);

saa_writel(SAA7134_IRQ1, 0);
saa_writel(SAA7134_IRQ2, 0);


pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
pci_save_state(pci_dev);

return 0;
}

static int saa7134_resume(struct pci_dev *pci_dev)
{

struct saa7134_dev *dev = pci_get_drvdata(pci_dev);

pci_restore_state(pci_dev);
pci_set_power_state(pci_dev, PCI_D0);

/* Do things that are done in saa7134_initdev ,
except of initializing memory structures.*/

saa7134_board_init1(dev);

if (saa7134_boards[dev->board].video_out)
saa7134_videoport_init(dev);

if (card_has_mpeg(dev))
saa7134_ts_init_hw(dev);

saa7134_hw_enable1(dev);

saa7134_set_decoder(dev);

saa7134_i2c_call_clients(dev, VIDIOC_S_STD, &dev->tvnorm->id);

saa7134_board_init2(dev);
saa7134_hw_enable2(dev);

dev->force_mute_update = 1;
saa7134_tvaudio_setmute(dev);
dev->force_mute_update = 0;
saa7134_tvaudio_setvolume(dev, dev->ctl_volume);
saa7134_enable_i2s(dev);

/*recapture unfinished buffer(s)*/
saa7134_buffer_requeue(dev, &dev->video_q);
saa7134_buffer_requeue(dev, &dev->vbi_q);
saa7134_buffer_requeue(dev, &dev->ts_q);

return 0;
}

/* ----------------------------------------------------------- */

int saa7134_ts_register(struct saa7134_mpeg_ops *ops)
Expand Down Expand Up @@ -1159,6 +1270,8 @@ static struct pci_driver saa7134_pci_driver = {
.id_table = saa7134_pci_tbl,
.probe = saa7134_initdev,
.remove = __devexit_p(saa7134_finidev),
.suspend = saa7134_suspend,
.resume = saa7134_resume
};

static int saa7134_init(void)
Expand Down
23 changes: 17 additions & 6 deletions trunk/drivers/media/video/saa7134/saa7134-ts.c
Original file line number Diff line number Diff line change
Expand Up @@ -177,6 +177,22 @@ static unsigned int ts_nr_packets = 64;
module_param(ts_nr_packets, int, 0444);
MODULE_PARM_DESC(ts_nr_packets,"size of a ts buffers (in ts packets)");

int saa7134_ts_init_hw(struct saa7134_dev *dev)
{
/* deactivate TS softreset */
saa_writeb(SAA7134_TS_SERIAL1, 0x00);
/* TSSOP high active, TSVAL high active, TSLOCK ignored */
saa_writeb(SAA7134_TS_PARALLEL, 0xec);
saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
/* TSNOPIT=0, TSCOLAP=0 */
saa_writeb(SAA7134_TS_DMA2,
((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00));

return 0;
}

int saa7134_ts_init1(struct saa7134_dev *dev)
{
/* sanitycheck insmod options */
Expand All @@ -200,12 +216,7 @@ int saa7134_ts_init1(struct saa7134_dev *dev)
saa7134_pgtable_alloc(dev->pci,&dev->ts.pt_ts);

/* init TS hw */
saa_writeb(SAA7134_TS_SERIAL1, 0x00); /* deactivate TS softreset */
saa_writeb(SAA7134_TS_PARALLEL, 0xec); /* TSSOP high active, TSVAL high active, TSLOCK ignored */
saa_writeb(SAA7134_TS_PARALLEL_SERIAL, (TS_PACKET_SIZE-1));
saa_writeb(SAA7134_TS_DMA0, ((dev->ts.nr_packets-1)&0xff));
saa_writeb(SAA7134_TS_DMA1, (((dev->ts.nr_packets-1)>>8)&0xff));
saa_writeb(SAA7134_TS_DMA2, ((((dev->ts.nr_packets-1)>>16)&0x3f) | 0x00)); /* TSNOPIT=0, TSCOLAP=0 */
saa7134_ts_init_hw(dev);

return 0;
}
Expand Down
4 changes: 2 additions & 2 deletions trunk/drivers/media/video/saa7134/saa7134-tvaudio.c
Original file line number Diff line number Diff line change
Expand Up @@ -231,7 +231,7 @@ static void mute_input_7134(struct saa7134_dev *dev)
}

if (dev->hw_mute == mute &&
dev->hw_input == in) {
dev->hw_input == in && !dev->force_mute_update) {
dprintk("mute/input: nothing to do [mute=%d,input=%s]\n",
mute,in->name);
return;
Expand Down Expand Up @@ -876,7 +876,7 @@ static int tvaudio_thread_ddep(void *data)
/* ------------------------------------------------------------------ */
/* common stuff + external entry points */

static void saa7134_enable_i2s(struct saa7134_dev *dev)
void saa7134_enable_i2s(struct saa7134_dev *dev)
{
int i2s_format;

Expand Down
Loading

0 comments on commit 64adeb0

Please sign in to comment.