示例#1
0
static int msenc_dma_wait_idle(struct platform_device *dev, u32 *timeout)
{
    nvhost_dbg_fn("");

    if (!*timeout)
        *timeout = MSENC_IDLE_TIMEOUT_DEFAULT;

    do {
        u32 check = min_t(u32, MSENC_IDLE_CHECK_PERIOD, *timeout);
        u32 dmatrfcmd = host1x_readl(dev, msenc_dmatrfcmd_r());
        u32 idle_v = msenc_dmatrfcmd_idle_v(dmatrfcmd);

        if (msenc_dmatrfcmd_idle_true_v() == idle_v) {
            nvhost_dbg_fn("done");
            return 0;
        }

        udelay(MSENC_IDLE_CHECK_PERIOD);
        *timeout -= check;
    } while (*timeout);

    dev_err(&dev->dev, "dma idle timeout");

    return -1;
}
示例#2
0
int vi_disable_irq(struct vi *tegra_vi)
{
	int val;
	int err = 0;

	err = nvhost_module_busy(tegra_vi->ndev);
	if (err)
		return err;

	if (tegra_vi->ndev->id) {
		/* Disable FIFO Overflow Interrupt */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_INTERRUPT_MASK_0,
				0);

		/* Reset status register */
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_B_STATUS_0);

		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_STATUS_0,
				val);
	} else {
		/* interrupts are associated only with master dev vi.0 */
		disable_irq(tegra_vi->vi_irq);

		/* Disable FIFO Overflow Interrupt */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_INTERRUPT_MASK_0,
				0);

		/* Reset status register */
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_A_STATUS_0);

		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_STATUS_0,
				val);
	}

	nvhost_module_idle(tegra_vi->ndev);

	return 0;
}
示例#3
0
static irqreturn_t vi_isr(int irq, void *dev_id)
{
	struct vi *tegra_vi = (struct vi *)dev_id;
	int val;

	dev_dbg(&tegra_vi->ndev->dev, "%s: ++", __func__);

	if (tegra_vi->ndev->id) {
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_B_STATUS_0);

		/* changes required as per t124 register spec */
		if (val & PPB_FIFO_OVRF)
			atomic_inc(&(tegra_vi->vi_out.overflow));

		/* Reset interrupt status register */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_STATUS_0,
				val);
	} else {
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_A_STATUS_0);

		/* changes required as per t124 register spec */
		if (val & PPA_FIFO_OVRF)
			atomic_inc(&(tegra_vi->vi_out.overflow));

		/* Reset interrupt status register */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_STATUS_0,
				val);
	}

	schedule_work(&tegra_vi->stats_work);
	return IRQ_HANDLED;
}
示例#4
0
static int vic03_wait_mem_scrubbing(struct platform_device *dev)
{
	int retries = VIC_IDLE_TIMEOUT_DEFAULT / VIC_IDLE_CHECK_PERIOD;
	nvhost_dbg_fn("");

	do {
		u32 w = host1x_readl(dev, flcn_dmactl_r()) &
			(flcn_dmactl_dmem_scrubbing_m() |
			 flcn_dmactl_imem_scrubbing_m());

		if (!w) {
			nvhost_dbg_fn("done");
			return 0;
		}
		udelay(VIC_IDLE_CHECK_PERIOD);
	} while (--retries || !tegra_platform_is_silicon());

	nvhost_err(&dev->dev, "Falcon mem scrubbing timeout");
	return -ETIMEDOUT;
}
示例#5
0
static int msenc_wait_idle(struct platform_device *dev, u32 *timeout)
{
    nvhost_dbg_fn("");

    if (!*timeout)
        *timeout = MSENC_IDLE_TIMEOUT_DEFAULT;

    do {
        u32 check = min_t(u32, MSENC_IDLE_CHECK_PERIOD, *timeout);
        u32 w = host1x_readl(dev, msenc_idlestate_r());

        if (!w) {
            nvhost_dbg_fn("done");
            return 0;
        }
        udelay(MSENC_IDLE_CHECK_PERIOD);
        *timeout -= check;
    } while (*timeout);

    return -1;
}
示例#6
0
	/* note size here is a little over...*/
	fw_name = kzalloc(32, GFP_KERNEL);
	if (!fw_name)
		return NULL;

	decode_vic_ver(pdata->version, &maj, &min);
	sprintf(fw_name, "vic%02d_ucode.bin", maj);
	dev_info(&dev->dev, "fw name:%s\n", fw_name);

	return fw_name;
}

#define VIC_IDLE_TIMEOUT_DEFAULT	10000	/* 10 milliseconds */
#define VIC_IDLE_CHECK_PERIOD	10		/* 10 usec */
static int vic03_flcn_wait_idle(struct platform_device *pdev,
				u32 *timeout)
{
	nvhost_dbg_fn("");

	if (!*timeout)
		*timeout = VIC_IDLE_TIMEOUT_DEFAULT;

	do {
		u32 check = min_t(u32, VIC_IDLE_CHECK_PERIOD, *timeout);
		u32 w = host1x_readl(pdev, flcn_idlestate_r());

		if (!w) {
			nvhost_dbg_fn("done");
			return 0;
		}
		udelay(VIC_IDLE_CHECK_PERIOD);
		*timeout -= check;
	} while (*timeout);

	dev_err(&pdev->dev, "vic03 flcn idle timeout");

	return -1;
}
示例#7
0
static int vic03_flcn_dma_wait_idle(struct platform_device *pdev, u32 *timeout)
{
	nvhost_dbg_fn("");

	if (!*timeout)
		*timeout = VIC_IDLE_TIMEOUT_DEFAULT;

	do {
		u32 check = min_t(u32, VIC_IDLE_CHECK_PERIOD, *timeout);
		u32 dmatrfcmd = host1x_readl(pdev, flcn_dmatrfcmd_r());
		u32 idle_v = flcn_dmatrfcmd_idle_v(dmatrfcmd);

		if (flcn_dmatrfcmd_idle_true_v() == idle_v) {
			nvhost_dbg_fn("done");
			return 0;
		}
		udelay(VIC_IDLE_CHECK_PERIOD);
		*timeout -= check;
	} while (*timeout);

	dev_err(&pdev->dev, "vic03 dma idle timeout");

	return -1;
}