1414#include <linux/clk.h>
1515#include <linux/delay.h>
1616#include <linux/firmware.h>
17+ #include <linux/genalloc.h>
1718#include <linux/interrupt.h>
1819#include <linux/io.h>
1920#include <linux/irq.h>
2324#include <linux/slab.h>
2425#include <linux/videodev2.h>
2526#include <linux/of.h>
26- #include <linux/platform_data/imx-iram .h>
27+ #include <linux/platform_data/coda .h>
2728
2829#include <media/v4l2-ctrls.h>
2930#include <media/v4l2-device.h>
4344#define CODA7_WORK_BUF_SIZE (512 * 1024 + CODA_FMO_BUF_SIZE * 8 * 1024)
4445#define CODA_PARA_BUF_SIZE (10 * 1024)
4546#define CODA_ISRAM_SIZE (2048 * 2)
47+ #define CODADX6_IRAM_SIZE 0xb000
4648#define CODA7_IRAM_SIZE 0x14000 /* 81920 bytes */
4749
4850#define CODA_MAX_FRAMEBUFFERS 2
@@ -128,7 +130,10 @@ struct coda_dev {
128130
129131 struct coda_aux_buf codebuf ;
130132 struct coda_aux_buf workbuf ;
133+ struct gen_pool * iram_pool ;
134+ long unsigned int iram_vaddr ;
131135 long unsigned int iram_paddr ;
136+ unsigned long iram_size ;
132137
133138 spinlock_t irqlock ;
134139 struct mutex dev_mutex ;
@@ -1926,6 +1931,9 @@ static int coda_probe(struct platform_device *pdev)
19261931 const struct of_device_id * of_id =
19271932 of_match_device (of_match_ptr (coda_dt_ids ), & pdev -> dev );
19281933 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 ;
19291937 struct coda_dev * dev ;
19301938 struct resource * res ;
19311939 int ret , irq ;
@@ -1988,6 +1996,16 @@ static int coda_probe(struct platform_device *pdev)
19881996 return - ENOENT ;
19891997 }
19901998
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+
19912009 ret = v4l2_device_register (& pdev -> dev , & dev -> v4l2_dev );
19922010 if (ret )
19932011 return ret ;
@@ -2022,18 +2040,17 @@ static int coda_probe(struct platform_device *pdev)
20222040 return - ENOMEM ;
20232041 }
20242042
2025- if (dev -> devtype -> product == CODA_DX6 ) {
2026- dev -> iram_paddr = 0xffff4c00 ;
2027- } else {
2028- void __iomem * iram_vaddr ;
2029-
2030- iram_vaddr = iram_alloc (CODA7_IRAM_SIZE ,
2031- & dev -> iram_paddr );
2032- if (!iram_vaddr ) {
2033- dev_err (& pdev -> dev , "unable to alloc iram\n" );
2034- return - ENOMEM ;
2035- }
2043+ if (dev -> devtype -> product == CODA_DX6 )
2044+ dev -> iram_size = CODADX6_IRAM_SIZE ;
2045+ else
2046+ dev -> iram_size = CODA7_IRAM_SIZE ;
2047+ dev -> iram_vaddr = gen_pool_alloc (dev -> iram_pool , dev -> iram_size );
2048+ if (!dev -> iram_vaddr ) {
2049+ dev_err (& pdev -> dev , "unable to alloc iram\n" );
2050+ return - ENOMEM ;
20362051 }
2052+ dev -> iram_paddr = gen_pool_virt_to_phys (dev -> iram_pool ,
2053+ dev -> iram_vaddr );
20372054
20382055 platform_set_drvdata (pdev , dev );
20392056
@@ -2050,8 +2067,8 @@ static int coda_remove(struct platform_device *pdev)
20502067 if (dev -> alloc_ctx )
20512068 vb2_dma_contig_cleanup_ctx (dev -> alloc_ctx );
20522069 v4l2_device_unregister (& dev -> v4l2_dev );
2053- if (dev -> iram_paddr )
2054- iram_free (dev -> iram_paddr , CODA7_IRAM_SIZE );
2070+ if (dev -> iram_vaddr )
2071+ gen_pool_free (dev -> iram_pool , dev -> iram_vaddr , dev -> iram_size );
20552072 if (dev -> codebuf .vaddr )
20562073 dma_free_coherent (& pdev -> dev , dev -> codebuf .size ,
20572074 & dev -> codebuf .vaddr , dev -> codebuf .paddr );
0 commit comments