Commit 7df8d5cf authored by Deborah Brouwer's avatar Deborah Brouwer Committed by Mauro Carvalho Chehab
Browse files

media: bttv: refactor bttv_set_dma()



Break bttv_set_dma() into several smaller, separate functions so it is
easier to read the risc and dma code. Replace numeric values with
descriptive macros. Also remove the unused field btv->cap_ctl.

Signed-off-by: default avatarDeborah Brouwer <deborah.brouwer@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
parent c9c0df31
Loading
Loading
Loading
Loading
+71 −40
Original line number Diff line number Diff line
@@ -360,56 +360,87 @@ bttv_apply_geo(struct bttv *btv, struct bttv_geometry *geo, int odd)
/* ---------------------------------------------------------- */
/* risc group / risc main loop / dma management               */

void
bttv_set_dma(struct bttv *btv, int override)
static void bttv_set_risc_status(struct bttv *btv)
{
	unsigned long cmd;
	int capctl;

	btv->cap_ctl = 0;
	if (NULL != btv->curr.top)      btv->cap_ctl |= 0x02;
	if (NULL != btv->curr.bottom)   btv->cap_ctl |= 0x01;
	if (NULL != btv->cvbi)          btv->cap_ctl |= 0x0c;

	capctl  = 0;
	capctl |= (btv->cap_ctl & 0x03) ? 0x03 : 0x00;  /* capture  */
	capctl |= (btv->cap_ctl & 0x0c) ? 0x0c : 0x00;  /* vbi data */
	capctl |= override;

	d2printk("%d: capctl=%x lirq=%d top=%08llx/%08llx even=%08llx/%08llx\n",
		 btv->c.nr,capctl,btv->loop_irq,
		 btv->cvbi         ? (unsigned long long)btv->cvbi->top.dma            : 0,
		 btv->curr.top     ? (unsigned long long)btv->curr.top->top.dma        : 0,
		 btv->cvbi         ? (unsigned long long)btv->cvbi->bottom.dma         : 0,
		 btv->curr.bottom  ? (unsigned long long)btv->curr.bottom->bottom.dma  : 0);

	cmd = BT848_RISC_JUMP;
	unsigned long cmd = BT848_RISC_JUMP;
	/*
	 * The value of btv->loop_irq sets or resets the RISC_STATUS for video
	 * and/or vbi by setting the value of bits [23:16] in the first dword
	 * of the JUMP instruction:
	 * video risc: set (1) and reset (~1)
	 * vbi risc: set(4) and reset (~4)
	 */
	if (btv->loop_irq) {
		cmd |= BT848_RISC_IRQ;
		cmd |= (btv->loop_irq  & 0x0f) << 16;
		cmd |= (~btv->loop_irq & 0x0f) << 20;
	}
	if (btv->curr.frame_irq || btv->loop_irq || btv->cvbi) {
	btv->main.cpu[RISC_SLOT_LOOP] = cpu_to_le32(cmd);
}

static void bttv_set_irq_timer(struct bttv *btv)
{
	if (btv->curr.frame_irq || btv->loop_irq || btv->cvbi)
		mod_timer(&btv->timeout, jiffies + BTTV_TIMEOUT);
	} else {
	else
		del_timer(&btv->timeout);
}
	btv->main.cpu[RISC_SLOT_LOOP] = cpu_to_le32(cmd);

static int bttv_set_capture_control(struct bttv *btv, int start_capture)
{
	int capctl = 0;

	if (btv->curr.top || btv->curr.bottom)
		capctl = BT848_CAP_CTL_CAPTURE_ODD |
			 BT848_CAP_CTL_CAPTURE_EVEN;

	if (btv->cvbi)
		capctl |= BT848_CAP_CTL_CAPTURE_VBI_ODD |
			  BT848_CAP_CTL_CAPTURE_VBI_EVEN;

	capctl |= start_capture;

	btaor(capctl, ~0x0f, BT848_CAP_CTL);
	if (capctl) {

	return capctl;
}

static void bttv_start_dma(struct bttv *btv)
{
	if (btv->dma_on)
		return;
	btwrite(btv->main.dma, BT848_RISC_STRT_ADD);
		btor(3, BT848_GPIO_DMA_CTL);
	btor(0x3, BT848_GPIO_DMA_CTL);
	btv->dma_on = 1;
	} else {
}

static void bttv_stop_dma(struct bttv *btv)
{
	if (!btv->dma_on)
		return;
		btand(~3, BT848_GPIO_DMA_CTL);
	btand(~0x3, BT848_GPIO_DMA_CTL);
	btv->dma_on = 0;
}
	return;

void bttv_set_dma(struct bttv *btv, int start_capture)
{
	int capctl = 0;

	bttv_set_risc_status(btv);
	bttv_set_irq_timer(btv);
	capctl = bttv_set_capture_control(btv, start_capture);

	if (capctl)
		bttv_start_dma(btv);
	else
		bttv_stop_dma(btv);

	d2printk("%d: capctl=%x lirq=%d top=%08llx/%08llx even=%08llx/%08llx\n",
		 btv->c.nr,capctl,btv->loop_irq,
		 btv->cvbi         ? (unsigned long long)btv->cvbi->top.dma            : 0,
		 btv->curr.top     ? (unsigned long long)btv->curr.top->top.dma        : 0,
		 btv->cvbi         ? (unsigned long long)btv->cvbi->bottom.dma         : 0,
		 btv->curr.bottom  ? (unsigned long long)btv->curr.bottom->bottom.dma  : 0);
}

int
+0 −1
Original line number Diff line number Diff line
@@ -430,7 +430,6 @@ struct bttv {
	int                     loop_irq;
	int                     new_input;

	unsigned long cap_ctl;
	unsigned long dma_on;
	struct timer_list timeout;
	struct bttv_suspend_state state;