Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 657eee7d authored by Philipp Zabel's avatar Philipp Zabel Committed by Linus Torvalds
Browse files

media: coda: use genalloc API



This patch depends on "genalloc: add devres support, allow to find a
managed pool by device", which provides the of_get_named_gen_pool and
dev_get_gen_pool functions.

Signed-off-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Acked-by: default avatarJavier Martin <javier.martin@vista-silicon.com>
Acked-by: default avatarGrant Likely <grant.likely@secretlab.ca>
Cc: Michal Simek <monstr@monstr.eu>
Cc: Dong Aisheng <dong.aisheng@linaro.org>
Cc: Fabio Estevam <fabio.estevam@freescale.com>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Huang Shijie <shijie8@gmail.com>
Cc: Matt Porter <mporter@ti.com>
Cc: Paul Gortmaker <paul.gortmaker@windriver.com>
Cc: Rob Herring <rob.herring@calxeda.com>
Cc: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 4984c6f5
Loading
Loading
Loading
Loading
+30 −0
Original line number Original line Diff line number Diff line
Chips&Media Coda multi-standard codec IP
========================================

Coda codec IPs are present in i.MX SoCs in various versions,
called VPU (Video Processing Unit).

Required properties:
- compatible : should be "fsl,<chip>-src" for i.MX SoCs:
  (a) "fsl,imx27-vpu" for CodaDx6 present in i.MX27
  (b) "fsl,imx53-vpu" for CODA7541 present in i.MX53
  (c) "fsl,imx6q-vpu" for CODA960 present in i.MX6q
- reg: should be register base and length as documented in the
  SoC reference manual
- interrupts : Should contain the VPU interrupt. For CODA960,
  a second interrupt is needed for the MJPEG unit.
- clocks : Should contain the ahb and per clocks, in the order
  determined by the clock-names property.
- clock-names : Should be "ahb", "per"
- iram : phandle pointing to the SRAM device node

Example:

vpu: vpu@63ff4000 {
	compatible = "fsl,imx53-vpu";
	reg = <0x63ff4000 0x1000>;
	interrupts = <9>;
	clocks = <&clks 63>, <&clks 63>;
	clock-names = "ahb", "per";
	iram = <&ocram>;
};
+0 −1
Original line number Original line Diff line number Diff line
@@ -145,7 +145,6 @@ config VIDEO_CODA
	depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
	depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC
	select VIDEOBUF2_DMA_CONTIG
	select VIDEOBUF2_DMA_CONTIG
	select V4L2_MEM2MEM_DEV
	select V4L2_MEM2MEM_DEV
	select IRAM_ALLOC if SOC_IMX53
	---help---
	---help---
	   Coda is a range of video codec IPs that supports
	   Coda is a range of video codec IPs that supports
	   H.264, MPEG-4, and other video formats.
	   H.264, MPEG-4, and other video formats.
+31 −14
Original line number Original line Diff line number Diff line
@@ -14,6 +14,7 @@
#include <linux/clk.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/delay.h>
#include <linux/firmware.h>
#include <linux/firmware.h>
#include <linux/genalloc.h>
#include <linux/interrupt.h>
#include <linux/interrupt.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/irq.h>
#include <linux/irq.h>
@@ -23,7 +24,7 @@
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/videodev2.h>
#include <linux/videodev2.h>
#include <linux/of.h>
#include <linux/of.h>
#include <linux/platform_data/imx-iram.h>
#include <linux/platform_data/coda.h>


#include <media/v4l2-ctrls.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>
#include <media/v4l2-device.h>
@@ -43,6 +44,7 @@
#define CODA7_WORK_BUF_SIZE	(512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
#define CODA7_WORK_BUF_SIZE	(512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
#define CODA_PARA_BUF_SIZE	(10 * 1024)
#define CODA_PARA_BUF_SIZE	(10 * 1024)
#define CODA_ISRAM_SIZE	(2048 * 2)
#define CODA_ISRAM_SIZE	(2048 * 2)
#define CODADX6_IRAM_SIZE	0xb000
#define CODA7_IRAM_SIZE		0x14000 /* 81920 bytes */
#define CODA7_IRAM_SIZE		0x14000 /* 81920 bytes */


#define CODA_MAX_FRAMEBUFFERS	2
#define CODA_MAX_FRAMEBUFFERS	2
@@ -128,7 +130,10 @@ struct coda_dev {


	struct coda_aux_buf	codebuf;
	struct coda_aux_buf	codebuf;
	struct coda_aux_buf	workbuf;
	struct coda_aux_buf	workbuf;
	struct gen_pool		*iram_pool;
	long unsigned int	iram_vaddr;
	long unsigned int	iram_paddr;
	long unsigned int	iram_paddr;
	unsigned long		iram_size;


	spinlock_t		irqlock;
	spinlock_t		irqlock;
	struct mutex		dev_mutex;
	struct mutex		dev_mutex;
@@ -1926,6 +1931,9 @@ static int coda_probe(struct platform_device *pdev)
	const struct of_device_id *of_id =
	const struct of_device_id *of_id =
			of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
			of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev);
	const struct platform_device_id *pdev_id;
	const struct platform_device_id *pdev_id;
	struct coda_platform_data *pdata = pdev->dev.platform_data;
	struct device_node *np = pdev->dev.of_node;
	struct gen_pool *pool;
	struct coda_dev *dev;
	struct coda_dev *dev;
	struct resource *res;
	struct resource *res;
	int ret, irq;
	int ret, irq;
@@ -1988,6 +1996,16 @@ static int coda_probe(struct platform_device *pdev)
		return -ENOENT;
		return -ENOENT;
	}
	}


	/* Get IRAM pool from device tree or platform data */
	pool = of_get_named_gen_pool(np, "iram", 0);
	if (!pool && pdata)
		pool = dev_get_gen_pool(pdata->iram_dev);
	if (!pool) {
		dev_err(&pdev->dev, "iram pool not available\n");
		return -ENOMEM;
	}
	dev->iram_pool = pool;

	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
	ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
	if (ret)
	if (ret)
		return ret;
		return ret;
@@ -2022,18 +2040,17 @@ static int coda_probe(struct platform_device *pdev)
		return -ENOMEM;
		return -ENOMEM;
	}
	}


	if (dev->devtype->product == CODA_DX6) {
	if (dev->devtype->product == CODA_DX6)
		dev->iram_paddr = 0xffff4c00;
		dev->iram_size = CODADX6_IRAM_SIZE;
	} else {
	else
		void __iomem *iram_vaddr;
		dev->iram_size = CODA7_IRAM_SIZE;

	dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, dev->iram_size);
		iram_vaddr = iram_alloc(CODA7_IRAM_SIZE,
	if (!dev->iram_vaddr) {
					&dev->iram_paddr);
		if (!iram_vaddr) {
		dev_err(&pdev->dev, "unable to alloc iram\n");
		dev_err(&pdev->dev, "unable to alloc iram\n");
		return -ENOMEM;
		return -ENOMEM;
	}
	}
	}
	dev->iram_paddr = gen_pool_virt_to_phys(dev->iram_pool,
						dev->iram_vaddr);


	platform_set_drvdata(pdev, dev);
	platform_set_drvdata(pdev, dev);


@@ -2050,8 +2067,8 @@ static int coda_remove(struct platform_device *pdev)
	if (dev->alloc_ctx)
	if (dev->alloc_ctx)
		vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
		vb2_dma_contig_cleanup_ctx(dev->alloc_ctx);
	v4l2_device_unregister(&dev->v4l2_dev);
	v4l2_device_unregister(&dev->v4l2_dev);
	if (dev->iram_paddr)
	if (dev->iram_vaddr)
		iram_free(dev->iram_paddr, CODA7_IRAM_SIZE);
		gen_pool_free(dev->iram_pool, dev->iram_vaddr, dev->iram_size);
	if (dev->codebuf.vaddr)
	if (dev->codebuf.vaddr)
		dma_free_coherent(&pdev->dev, dev->codebuf.size,
		dma_free_coherent(&pdev->dev, dev->codebuf.size,
				  &dev->codebuf.vaddr, dev->codebuf.paddr);
				  &dev->codebuf.vaddr, dev->codebuf.paddr);
+18 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2013 Philipp Zabel, Pengutronix
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */
#ifndef PLATFORM_CODA_H
#define PLATFORM_CODA_H

struct device;

struct coda_platform_data {
	struct device *iram_dev;
};

#endif