diff options
-rw-r--r-- | Documentation/devicetree/bindings/media/coda.txt | 30 | ||||
-rw-r--r-- | drivers/media/platform/Kconfig | 1 | ||||
-rw-r--r-- | drivers/media/platform/coda.c | 45 | ||||
-rw-r--r-- | include/linux/platform_data/coda.h | 18 |
4 files changed, 79 insertions, 15 deletions
diff --git a/Documentation/devicetree/bindings/media/coda.txt b/Documentation/devicetree/bindings/media/coda.txt new file mode 100644 index 000000000000..2865d04e4030 --- /dev/null +++ b/Documentation/devicetree/bindings/media/coda.txt | |||
@@ -0,0 +1,30 @@ | |||
1 | Chips&Media Coda multi-standard codec IP | ||
2 | ======================================== | ||
3 | |||
4 | Coda codec IPs are present in i.MX SoCs in various versions, | ||
5 | called VPU (Video Processing Unit). | ||
6 | |||
7 | Required properties: | ||
8 | - compatible : should be "fsl,<chip>-src" for i.MX SoCs: | ||
9 | (a) "fsl,imx27-vpu" for CodaDx6 present in i.MX27 | ||
10 | (b) "fsl,imx53-vpu" for CODA7541 present in i.MX53 | ||
11 | (c) "fsl,imx6q-vpu" for CODA960 present in i.MX6q | ||
12 | - reg: should be register base and length as documented in the | ||
13 | SoC reference manual | ||
14 | - interrupts : Should contain the VPU interrupt. For CODA960, | ||
15 | a second interrupt is needed for the MJPEG unit. | ||
16 | - clocks : Should contain the ahb and per clocks, in the order | ||
17 | determined by the clock-names property. | ||
18 | - clock-names : Should be "ahb", "per" | ||
19 | - iram : phandle pointing to the SRAM device node | ||
20 | |||
21 | Example: | ||
22 | |||
23 | vpu: vpu@63ff4000 { | ||
24 | compatible = "fsl,imx53-vpu"; | ||
25 | reg = <0x63ff4000 0x1000>; | ||
26 | interrupts = <9>; | ||
27 | clocks = <&clks 63>, <&clks 63>; | ||
28 | clock-names = "ahb", "per"; | ||
29 | iram = <&ocram>; | ||
30 | }; | ||
diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig index a0639e779973..26500094de7c 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig | |||
@@ -145,7 +145,6 @@ config VIDEO_CODA | |||
145 | depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC | 145 | depends on VIDEO_DEV && VIDEO_V4L2 && ARCH_MXC |
146 | select VIDEOBUF2_DMA_CONTIG | 146 | select VIDEOBUF2_DMA_CONTIG |
147 | select V4L2_MEM2MEM_DEV | 147 | select V4L2_MEM2MEM_DEV |
148 | select IRAM_ALLOC if SOC_IMX53 | ||
149 | ---help--- | 148 | ---help--- |
150 | Coda is a range of video codec IPs that supports | 149 | Coda is a range of video codec IPs that supports |
151 | H.264, MPEG-4, and other video formats. | 150 | H.264, MPEG-4, and other video formats. |
diff --git a/drivers/media/platform/coda.c b/drivers/media/platform/coda.c index 20827ba168fc..b931c2a5c7fc 100644 --- a/drivers/media/platform/coda.c +++ b/drivers/media/platform/coda.c | |||
@@ -14,6 +14,7 @@ | |||
14 | #include <linux/clk.h> | 14 | #include <linux/clk.h> |
15 | #include <linux/delay.h> | 15 | #include <linux/delay.h> |
16 | #include <linux/firmware.h> | 16 | #include <linux/firmware.h> |
17 | #include <linux/genalloc.h> | ||
17 | #include <linux/interrupt.h> | 18 | #include <linux/interrupt.h> |
18 | #include <linux/io.h> | 19 | #include <linux/io.h> |
19 | #include <linux/irq.h> | 20 | #include <linux/irq.h> |
@@ -23,7 +24,7 @@ | |||
23 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
24 | #include <linux/videodev2.h> | 25 | #include <linux/videodev2.h> |
25 | #include <linux/of.h> | 26 | #include <linux/of.h> |
26 | #include <linux/platform_data/imx-iram.h> | 27 | #include <linux/platform_data/coda.h> |
27 | 28 | ||
28 | #include <media/v4l2-ctrls.h> | 29 | #include <media/v4l2-ctrls.h> |
29 | #include <media/v4l2-device.h> | 30 | #include <media/v4l2-device.h> |
@@ -43,6 +44,7 @@ | |||
43 | #define CODA7_WORK_BUF_SIZE (512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024) | 44 | #define CODA7_WORK_BUF_SIZE (512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024) |
44 | #define CODA_PARA_BUF_SIZE (10 * 1024) | 45 | #define CODA_PARA_BUF_SIZE (10 * 1024) |
45 | #define CODA_ISRAM_SIZE (2048 * 2) | 46 | #define CODA_ISRAM_SIZE (2048 * 2) |
47 | #define CODADX6_IRAM_SIZE 0xb000 | ||
46 | #define CODA7_IRAM_SIZE 0x14000 /* 81920 bytes */ | 48 | #define CODA7_IRAM_SIZE 0x14000 /* 81920 bytes */ |
47 | 49 | ||
48 | #define CODA_MAX_FRAMEBUFFERS 2 | 50 | #define CODA_MAX_FRAMEBUFFERS 2 |
@@ -128,7 +130,10 @@ struct coda_dev { | |||
128 | 130 | ||
129 | struct coda_aux_buf codebuf; | 131 | struct coda_aux_buf codebuf; |
130 | struct coda_aux_buf workbuf; | 132 | struct coda_aux_buf workbuf; |
133 | struct gen_pool *iram_pool; | ||
134 | long unsigned int iram_vaddr; | ||
131 | long unsigned int iram_paddr; | 135 | long unsigned int iram_paddr; |
136 | unsigned long iram_size; | ||
132 | 137 | ||
133 | spinlock_t irqlock; | 138 | spinlock_t irqlock; |
134 | struct mutex dev_mutex; | 139 | struct mutex dev_mutex; |
@@ -1926,6 +1931,9 @@ static int coda_probe(struct platform_device *pdev) | |||
1926 | const struct of_device_id *of_id = | 1931 | const struct of_device_id *of_id = |
1927 | of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev); | 1932 | of_match_device(of_match_ptr(coda_dt_ids), &pdev->dev); |
1928 | const struct platform_device_id *pdev_id; | 1933 | const struct platform_device_id *pdev_id; |
1934 | struct coda_platform_data *pdata = pdev->dev.platform_data; | ||
1935 | struct device_node *np = pdev->dev.of_node; | ||
1936 | struct gen_pool *pool; | ||
1929 | struct coda_dev *dev; | 1937 | struct coda_dev *dev; |
1930 | struct resource *res; | 1938 | struct resource *res; |
1931 | int ret, irq; | 1939 | int ret, irq; |
@@ -1988,6 +1996,16 @@ static int coda_probe(struct platform_device *pdev) | |||
1988 | return -ENOENT; | 1996 | return -ENOENT; |
1989 | } | 1997 | } |
1990 | 1998 | ||
1999 | /* Get IRAM pool from device tree or platform data */ | ||
2000 | pool = of_get_named_gen_pool(np, "iram", 0); | ||
2001 | if (!pool && pdata) | ||
2002 | pool = dev_get_gen_pool(pdata->iram_dev); | ||
2003 | if (!pool) { | ||
2004 | dev_err(&pdev->dev, "iram pool not available\n"); | ||
2005 | return -ENOMEM; | ||
2006 | } | ||
2007 | dev->iram_pool = pool; | ||
2008 | |||
1991 | ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); | 2009 | ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev); |
1992 | if (ret) | 2010 | if (ret) |
1993 | return ret; | 2011 | return ret; |
@@ -2022,18 +2040,17 @@ static int coda_probe(struct platform_device *pdev) | |||
2022 | return -ENOMEM; | 2040 | return -ENOMEM; |
2023 | } | 2041 | } |
2024 | 2042 | ||
2025 | if (dev->devtype->product == CODA_DX6) { | 2043 | if (dev->devtype->product == CODA_DX6) |
2026 | dev->iram_paddr = 0xffff4c00; | 2044 | dev->iram_size = CODADX6_IRAM_SIZE; |
2027 | } else { | 2045 | else |
2028 | void __iomem *iram_vaddr; | 2046 | dev->iram_size = CODA7_IRAM_SIZE; |
2029 | 2047 | dev->iram_vaddr = gen_pool_alloc(dev->iram_pool, dev->iram_size); | |
2030 | iram_vaddr = iram_alloc(CODA7_IRAM_SIZE, | 2048 | if (!dev->iram_vaddr) { |
2031 | &dev->iram_paddr); | 2049 | dev_err(&pdev->dev, "unable to alloc iram\n"); |
2032 | if (!iram_vaddr) { | 2050 | return -ENOMEM; |
2033 | dev_err(&pdev->dev, "unable to alloc iram\n"); | ||
2034 | return -ENOMEM; | ||
2035 | } | ||
2036 | } | 2051 | } |
2052 | dev->iram_paddr = gen_pool_virt_to_phys(dev->iram_pool, | ||
2053 | dev->iram_vaddr); | ||
2037 | 2054 | ||
2038 | platform_set_drvdata(pdev, dev); | 2055 | platform_set_drvdata(pdev, dev); |
2039 | 2056 | ||
@@ -2050,8 +2067,8 @@ static int coda_remove(struct platform_device *pdev) | |||
2050 | if (dev->alloc_ctx) | 2067 | if (dev->alloc_ctx) |
2051 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); | 2068 | vb2_dma_contig_cleanup_ctx(dev->alloc_ctx); |
2052 | v4l2_device_unregister(&dev->v4l2_dev); | 2069 | v4l2_device_unregister(&dev->v4l2_dev); |
2053 | if (dev->iram_paddr) | 2070 | if (dev->iram_vaddr) |
2054 | iram_free(dev->iram_paddr, CODA7_IRAM_SIZE); | 2071 | gen_pool_free(dev->iram_pool, dev->iram_vaddr, dev->iram_size); |
2055 | if (dev->codebuf.vaddr) | 2072 | if (dev->codebuf.vaddr) |
2056 | dma_free_coherent(&pdev->dev, dev->codebuf.size, | 2073 | dma_free_coherent(&pdev->dev, dev->codebuf.size, |
2057 | &dev->codebuf.vaddr, dev->codebuf.paddr); | 2074 | &dev->codebuf.vaddr, dev->codebuf.paddr); |
diff --git a/include/linux/platform_data/coda.h b/include/linux/platform_data/coda.h new file mode 100644 index 000000000000..6ad4410d9e20 --- /dev/null +++ b/include/linux/platform_data/coda.h | |||
@@ -0,0 +1,18 @@ | |||
1 | /* | ||
2 | * Copyright (C) 2013 Philipp Zabel, Pengutronix | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or modify | ||
5 | * it under the terms of the GNU General Public License as published by | ||
6 | * the Free Software Foundation; either version 2 of the License, or | ||
7 | * (at your option) any later version. | ||
8 | */ | ||
9 | #ifndef PLATFORM_CODA_H | ||
10 | #define PLATFORM_CODA_H | ||
11 | |||
12 | struct device; | ||
13 | |||
14 | struct coda_platform_data { | ||
15 | struct device *iram_dev; | ||
16 | }; | ||
17 | |||
18 | #endif | ||