Samsung IOMMU videobuf2 allocator and s5p-fimc update
Subsystems (5)
Marek Szyprowski
maintainerv2 cover Samsung IOMMU videobuf2 allocator and s5p-fimc update
Hello,
This is a second version of the Samsung IOMMU driver, videobuf2 allocator for IOMMU mapped memory and FIMC driver update. The main change from the previous version is a complete rewrite of the IOMMU driver API. As suggested by Arnd Bergmann we decided to drop the custom interface and use the kernel wide, common iommu API defined in linux/include/iommu.h. This way the videobuf2 iommu allocator become much more generic framework, because it is no longer tied to any particular iommu implementation.
This patch series introduces new type of videbuf2 memory allocator - vb2-dma-iommu. This allocator can be used on the platforms that support linux/include/iommu.h style IOMMU driver. An IOMMU driver for Samsung EXYNOS4 (called SYSMMU) platform is also included. The allocator and IOMMU driver is then used by s5p-fimc driver. To make it possible some additional changes are required. Mainly the platform support for s5p-fimc for EXYNOS4 machines need to be defined. The proposed solution has been tested on Universal C210 board (Samsung S5PC210/EXYNOS4 based). This IOMMU allocator has no dependences on any external subsystems.
We also ported s5p-mfc and s5p-tv drivers to this allocator, they will be posted in separate patch series. This will enable to get them working on mainline Linux kernel for EXYNOS4 platform. Support for S5PV210/S5PC110 platform still depends on CMA allocator that needs more discussion on memory management mailing list and further development. The patches with updated s5p-mfc and s5p-tv drivers will follow.
To get FIMC module working on EXYNOS4 platform on UniversalC210 board we also added support for power domains and power gating.
This patch series contains a collection of patches for various platform subsystems. Here is a detailed list:
[PATCH 1/7] ARM: EXYNOS4: power domains: fixes and code cleanup
- adds support for block gating in Samsung power domain driver and performs some cleanup
[PATCH 2/7] ARM: Samsung: update/rewrite Samsung SYSMMU (IOMMU) driver
- a complete rewrite of sysmmu driver for Samsung platform, now uses linux/include/iommu.h api
[PATCH 3/7] v4l: videobuf2: dma-sg: move some generic functions to memops
- a little cleanup and preparations for the dma-iommu allocator
[PATCH 4/7] v4l: videobuf2: add IOMMU based DMA memory allocator
- introduces new memory allocator for videobuf2 for drivers that support iommu dma memory mappings
[PATCH 5/7] v4l: s5p-fimc: add pm_runtime support
- adds support for pm_runtime in s5p-fimc driver
[PATCH 6/7] v4l: s5p-fimc: Add support for vb2-dma-iommu allocator
- adds support for the newly introduces videbuf2-s5p-iommu allocator on EXYNOS4 platform
[PATCH 7/7] ARM: EXYNOS4: enable FIMC on Universal_C210
- adds all required machine definitions to get FIMC modules working on Universal C210 boards
Changelog:
V2:
- custom SYSMMU interface has been dropped in favour of linux/include/iommu.h and rewritten SYSMMU driver again
- added support to SYSMMU for mapping pages larger than 4Kb
- dropped ARM shared mode
- videobuf2-s5p-iommu allocator has been renamed to videobuf2-dma-iommu, because it has no dependenco on any Samsung platform specific API, the allocator still uses only 4Kb pages, but this will be changed in the next version
- dropped FIMC platform patch that have been merged mainline
- rebased all patches onto Linux kernel v2.6.39-rc1
V1: http://www.spinics.net/lists/linux-media/msg29751.html
Best regards
Signature · 55 lines
Marek Szyprowski Samsung Poland R&D Center Complete patch summary: Andrzej Pietrasiewicz (3): ARM: Samsung: update/rewrite Samsung SYSMMU (IOMMU) driver v4l: videobuf2: dma-sg: move some generic functions to memops v4l: videobuf2: add IOMMU based DMA memory allocator Marek Szyprowski (3): v4l: s5p-fimc: add pm_runtime support v4l: s5p-fimc: Add support for vb2-dma-iommu allocator ARM: EXYNOS4: enable FIMC on Universal_C210 Tomasz Stanislawski (1): ARM: EXYNOS4: power domains: fixes and code cleanup arch/arm/mach-exynos4/Kconfig | 6 + arch/arm/mach-exynos4/clock.c | 68 +- arch/arm/mach-exynos4/dev-pd.c | 93 ++- arch/arm/mach-exynos4/dev-sysmmu.c | 615 ++++++++----- arch/arm/mach-exynos4/include/mach/irqs.h | 35 +- arch/arm/mach-exynos4/include/mach/regs-clock.h | 7 + arch/arm/mach-exynos4/include/mach/sysmmu.h | 46 - arch/arm/mach-exynos4/mach-universal_c210.c | 22 + arch/arm/plat-s5p/Kconfig | 20 +- arch/arm/plat-s5p/include/plat/sysmmu.h | 165 ++-- arch/arm/plat-s5p/sysmmu.c | 1103 ++++++++++++++++------- arch/arm/plat-samsung/include/plat/devs.h | 2 +- arch/arm/plat-samsung/include/plat/pd.h | 1 + drivers/media/video/Kconfig | 11 +- drivers/media/video/Makefile | 1 + drivers/media/video/s5p-fimc/fimc-capture.c | 9 +- drivers/media/video/s5p-fimc/fimc-core.c | 38 +- drivers/media/video/s5p-fimc/fimc-core.h | 1 + drivers/media/video/s5p-fimc/fimc-mem.h | 103 +++ drivers/media/video/videobuf2-dma-iommu.c | 469 ++++++++++ drivers/media/video/videobuf2-dma-sg.c | 37 +- drivers/media/video/videobuf2-memops.c | 76 ++ include/media/videobuf2-dma-iommu.h | 48 + include/media/videobuf2-memops.h | 5 + 24 files changed, 2180 insertions(+), 801 deletions(-) rewrite arch/arm/mach-exynos4/dev-sysmmu.c (88%) delete mode 100644 arch/arm/mach-exynos4/include/mach/sysmmu.h rewrite arch/arm/plat-s5p/include/plat/sysmmu.h (83%) rewrite arch/arm/plat-s5p/sysmmu.c (87%) create mode 100644 drivers/media/video/s5p-fimc/fimc-mem.h create mode 100644 drivers/media/video/videobuf2-dma-iommu.c create mode 100644 include/media/videobuf2-dma-iommu.h -- 1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 1/7 ARM: EXYNOS4: power domains: fixes and code cleanup
From: Tomasz Stanislawski <[email protected]>
This patch extends power domain driver with support for enabling and disabling modules in S5P_CLKGATE_BLOCK register. It also performs a little code cleanup to avoid confusion between exynos4_device_pd array index and power domain id.
--- arch/arm/mach-exynos4/dev-pd.c | 93 +++++++++++++++++------ arch/arm/mach-exynos4/include/mach/regs-clock.h | 7 ++ arch/arm/plat-samsung/include/plat/pd.h | 1 + 3 files changed, 79 insertions(+), 22 deletions(-)
arch/arm/mach-exynos4/dev-pd.c +71 -22
@@ -16,13 +16,17 @@#include <linux/delay.h> #include <mach/regs-pmu.h> +#include <mach/regs-clock.h> #include <plat/pd.h> +static DEFINE_SPINLOCK (gate_block_slock); +static int exynos4_pd_enable (struct device *dev) {struct samsung_pd_info *pdata = dev->platform_data;u32 timeout; +int ret =0 ;__raw_writel (S5P_INT_LOCAL_PWR_EN , pdata->base);
@@ -31,21 +35,39 @@ static int exynos4_pd_enable(struct device *dev)while ((__raw_readl (pdata->base +0x4 ) &S5P_INT_LOCAL_PWR_EN ) !=S5P_INT_LOCAL_PWR_EN ) {if (timeout ==0 ) { -printk (KERN_ERR "Power domain %s enable failed.\n" , -dev_name (dev)); -return -ETIMEDOUT ; +dev_err (dev,"enable failed\n" ); + ret = -ETIMEDOUT ; + goto done; } timeout--;udelay (100 ); } -return 0 ; +/* configure clk gate mask if it is present */ +if (pdata->gate_mask) { +unsigned long flags; +unsigned long value; + +spin_lock_irqsave (&gate_block_slock, flags); + + value =__raw_readl (S5P_CLKGATE_BLOCK ); + value |= pdata->gate_mask; +__raw_writel (value,S5P_CLKGATE_BLOCK ); + +spin_unlock_irqrestore (&gate_block_slock, flags); + } + +done: +dev_info (dev,"enable finished\n" ); + +return ret; }static int exynos4_pd_disable (struct device *dev) {struct samsung_pd_info *pdata = dev->platform_data;u32 timeout; +int ret =0 ;__raw_writel (0 , pdata->base);
@@ -53,81 +75,108 @@ static int exynos4_pd_disable(struct device *dev) timeout =10 ;while (__raw_readl (pdata->base +0x4 ) &S5P_INT_LOCAL_PWR_EN ) {if (timeout ==0 ) { -printk (KERN_ERR "Power domain %s disable failed.\n" , -dev_name (dev)); -return -ETIMEDOUT ; +dev_err (dev,"disable failed\n" ); + ret = -ETIMEDOUT ; + goto done; } timeout--;udelay (100 ); } -return 0 ; +if (pdata->gate_mask) { +unsigned long flags; +unsigned long value; + +spin_lock_irqsave (&gate_block_slock, flags); + + value =__raw_readl (S5P_CLKGATE_BLOCK ); + value &= ~pdata->gate_mask; +__raw_writel (value,S5P_CLKGATE_BLOCK ); + +spin_unlock_irqrestore (&gate_block_slock, flags); + } +done: +dev_info (dev,"disable finished\n" ); + +return ret; }struct platform_device exynos4_device_pd[] = { - { + [PD_MFC ] = { .name ="samsung-pd" , - .id =0 , + .id =PD_MFC , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_MFC_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_MFC , }, }, - }, { + }, + [PD_G3D ] = { .name ="samsung-pd" , - .id =1 , + .id =PD_G3D , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_G3D_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_G3D , }, }, - }, { + }, + [PD_LCD0 ] = { .name ="samsung-pd" , - .id =2 , + .id =PD_LCD0 , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_LCD0_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_LCD0 , }, }, - }, { + }, + [PD_LCD1 ] = { .name ="samsung-pd" , - .id =3 , + .id =PD_LCD1 , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_LCD1_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_LCD1 , }, }, - }, { + }, + [PD_TV ] = { .name ="samsung-pd" , - .id =4 , + .id =PD_TV , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_TV_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_TV , }, }, - }, { + }, + [PD_CAM ] = { .name ="samsung-pd" , - .id =5 , + .id =PD_CAM , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable, .disable = exynos4_pd_disable, .base =S5P_PMU_CAM_CONF , + .gate_mask =S5P_CLKGATE_BLOCK_CAM , }, }, - }, { + }, + [PD_GPS ] = { .name ="samsung-pd" , - .id =6 , + .id =PD_GPS , .dev = { .platform_data = &(struct samsung_pd_info ) { .enable = exynos4_pd_enable,
arch/arm/mach-exynos4/include/mach/regs-clock.h +7 -0
@@ -171,6 +171,13 @@#define S5P_CLKDIV_BUS_GPLR_SHIFT (4)#define S5P_CLKDIV_BUS_GPLR_MASK (0x7 << S5P_CLKDIV_BUS_GPLR_SHIFT) +#define S5P_CLKGATE_BLOCK_CAM (1 << 0) +#define S5P_CLKGATE_BLOCK_TV (1 << 1) +#define S5P_CLKGATE_BLOCK_MFC (1 << 2) +#define S5P_CLKGATE_BLOCK_G3D (1 << 3) +#define S5P_CLKGATE_BLOCK_LCD0 (1 << 4) +#define S5P_CLKGATE_BLOCK_LCD1 (1 << 5) +/* Compatibility defines and inclusion */ #include <mach/regs-pmu.h>
arch/arm/plat-samsung/include/plat/pd.h +1 -0
@@ -15,6 +15,7 @@ struct samsung_pd_info {int (*enable)(struct device *dev);int (*disable)(struct device *dev);void __iomem *base; +unsigned long gate_mask; };enum exynos4_pd_block {
Signature · 1 line
1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 2/7 ARM: Samsung: update/rewrite Samsung SYSMMU (IOMMU) driver
In reply to Marek SzyprowskiFrom: Andrzej Pietrasiewicz <[email protected]>
This patch performs a complete rewrite of sysmmu driver for Samsung platform:
- simplified the resource management: no more single platform device with 32 resources is needed, better fits into linux driver model, each sysmmu instance has it's own resource definition
- the new version uses kernel wide common iommu api defined in include/iommu.h
- cleaned support for sysmmu clocks
--- arch/arm/mach-exynos4/clock.c | 68 +- arch/arm/mach-exynos4/dev-sysmmu.c | 615 ++++++++++------ arch/arm/mach-exynos4/include/mach/irqs.h | 35 +- arch/arm/mach-exynos4/include/mach/sysmmu.h | 46 -- arch/arm/plat-s5p/Kconfig | 20 +- arch/arm/plat-s5p/include/plat/sysmmu.h | 165 ++--- arch/arm/plat-s5p/sysmmu.c | 1103 +++++++++++++++++++-------- arch/arm/plat-samsung/include/plat/devs.h | 2 +- 8 files changed, 1314 insertions(+), 740 deletions(-) rewrite arch/arm/mach-exynos4/dev-sysmmu.c (88%) delete mode 100644 arch/arm/mach-exynos4/include/mach/sysmmu.h
rewrite arch/arm/plat-s5p/include/plat/sysmmu.h (83%) rewrite arch/arm/plat-s5p/sysmmu.c (87%)
arch/arm/mach-exynos4/clock.c +39 -29
@@ -20,10 +20,10 @@#include <plat/pll.h> #include <plat/s5p-clock.h> #include <plat/clock-clksrc.h> +#include <plat/sysmmu.h> #include <mach/map.h> #include <mach/regs-clock.h> -#include <mach/sysmmu.h> static struct clk clk_sclk_hdmi27m = { .name ="sclk_hdmi27m" ,
@@ -127,6 +127,11 @@ static int exynos4_clk_ip_perir_ctrl(struct clk *clk, int enable)return s5p_gatectrl (S5P_CLKGATE_IP_PERIR , clk, enable); } +static int exynos4_clk_ip_dmc_ctrl (struct clk *clk,int enable) +{ +return s5p_gatectrl (S5P_CLKGATE_IP_DMC , clk, enable); +} +/* Core list of CMU_CPU side */ static struct clksrc_clk clk_mout_apll = {
@@ -614,75 +619,80 @@ static struct clk init_clocks_off[] = { .enable = exynos4_clk_ip_peril_ctrl, .ctrlbit = (1 << 13), }, { - .name = "SYSMMU_MDMA", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_MDMA, .enable = exynos4_clk_ip_image_ctrl, .ctrlbit = (1 << 5), }, { - .name = "SYSMMU_FIMC0", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMC0, .enable = exynos4_clk_ip_cam_ctrl, .ctrlbit = (1 << 7), }, { - .name = "SYSMMU_FIMC1", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMC1, .enable = exynos4_clk_ip_cam_ctrl, .ctrlbit = (1 << 8), }, { - .name = "SYSMMU_FIMC2", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMC2, .enable = exynos4_clk_ip_cam_ctrl, .ctrlbit = (1 << 9), }, { - .name = "SYSMMU_FIMC3", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMC3, .enable = exynos4_clk_ip_cam_ctrl, .ctrlbit = (1 << 10), }, { - .name = "SYSMMU_JPEG", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_JPEG, .enable = exynos4_clk_ip_cam_ctrl, .ctrlbit = (1 << 11), }, { - .name = "SYSMMU_FIMD0", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMD0, .enable = exynos4_clk_ip_lcd0_ctrl, .ctrlbit = (1 << 4), }, { - .name = "SYSMMU_FIMD1", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_FIMD1, .enable = exynos4_clk_ip_lcd1_ctrl, .ctrlbit = (1 << 4), }, { - .name = "SYSMMU_PCIe", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_PCIe, .enable = exynos4_clk_ip_fsys_ctrl, .ctrlbit = (1 << 18), }, { - .name = "SYSMMU_G2D", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_G2D, .enable = exynos4_clk_ip_image_ctrl, .ctrlbit = (1 << 3), }, { - .name = "SYSMMU_ROTATOR", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_ROTATOR, .enable = exynos4_clk_ip_image_ctrl, .ctrlbit = (1 << 4), }, { - .name = "SYSMMU_TV", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_TV, .enable = exynos4_clk_ip_tv_ctrl, .ctrlbit = (1 << 4), }, { - .name = "SYSMMU_MFC_L", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_MFC_L, .enable = exynos4_clk_ip_mfc_ctrl, .ctrlbit = (1 << 1), }, { - .name = "SYSMMU_MFC_R", - .id = -1, + .name = "sysmmu", + .id = S5P_SYSMMU_MFC_R, .enable = exynos4_clk_ip_mfc_ctrl, .ctrlbit = (1 << 2), + }, { + .name = "sysmmu", + .id = S5P_SYSMMU_SSS, + .enable = exynos4_clk_ip_dmc_ctrl, + .ctrlbit = (1 << 12), } };
arch/arm/mach-exynos4/dev-sysmmu.c +383 -232
615 lines not on this page · raw message
arch/arm/mach-exynos4/include/mach/irqs.h +18 -17
@@ -55,23 +55,23 @@#define COMBINER_GROUP (x) ((x) * MAX_IRQ_IN_COMBINER + IRQ_SPI(64))#define COMBINER_IRQ (x, y) (COMBINER_GROUP(x) + y) -#define IRQ_SYSMMU_MDMA0_0 COMBINER_IRQ(4, 0) -#define IRQ_SYSMMU_SSS_0 COMBINER_IRQ(4, 1) -#define IRQ_SYSMMU_FIMC0_0 COMBINER_IRQ(4, 2) -#define IRQ_SYSMMU_FIMC1_0 COMBINER_IRQ(4, 3) -#define IRQ_SYSMMU_FIMC2_0 COMBINER_IRQ(4, 4) -#define IRQ_SYSMMU_FIMC3_0 COMBINER_IRQ(4, 5) -#define IRQ_SYSMMU_JPEG_0 COMBINER_IRQ(4, 6) -#define IRQ_SYSMMU_2D_0 COMBINER_IRQ(4, 7) - -#define IRQ_SYSMMU_ROTATOR_0 COMBINER_IRQ(5, 0) -#define IRQ_SYSMMU_MDMA1_0 COMBINER_IRQ(5, 1) -#define IRQ_SYSMMU_LCD0_M0_0 COMBINER_IRQ(5, 2) -#define IRQ_SYSMMU_LCD1_M1_0 COMBINER_IRQ(5, 3) -#define IRQ_SYSMMU_TV_M0_0 COMBINER_IRQ(5, 4) -#define IRQ_SYSMMU_MFC_M0_0 COMBINER_IRQ(5, 5) -#define IRQ_SYSMMU_MFC_M1_0 COMBINER_IRQ(5, 6) -#define IRQ_SYSMMU_PCIE_0 COMBINER_IRQ(5, 7) +#define IRQ_SYSMMU_MDMA0 COMBINER_IRQ(4, 0) +#define IRQ_SYSMMU_SSS COMBINER_IRQ(4, 1) +#define IRQ_SYSMMU_FIMC0 COMBINER_IRQ(4, 2) +#define IRQ_SYSMMU_FIMC1 COMBINER_IRQ(4, 3) +#define IRQ_SYSMMU_FIMC2 COMBINER_IRQ(4, 4) +#define IRQ_SYSMMU_FIMC3 COMBINER_IRQ(4, 5) +#define IRQ_SYSMMU_JPEG COMBINER_IRQ(4, 6) +#define IRQ_SYSMMU_2D COMBINER_IRQ(4, 7) + +#define IRQ_SYSMMU_ROTATOR COMBINER_IRQ(5, 0) +#define IRQ_SYSMMU_MDMA1 COMBINER_IRQ(5, 1) +#define IRQ_SYSMMU_FIMD0 COMBINER_IRQ(5, 2) +#define IRQ_SYSMMU_FIMD1 COMBINER_IRQ(5, 3) +#define IRQ_SYSMMU_TV COMBINER_IRQ(5, 4) +#define IRQ_SYSMMU_MFC_L COMBINER_IRQ(5, 5) +#define IRQ_SYSMMU_MFC_R COMBINER_IRQ(5, 6) +#define IRQ_SYSMMU_PCIE COMBINER_IRQ(5, 7)#define IRQ_PDMA0 COMBINER_IRQ(21, 0)#define IRQ_PDMA1 COMBINER_IRQ(21, 1)
@@ -157,4 +157,5 @@/* Set the default NR_IRQS */ #define NR_IRQS (IRQ_GPIO_END) +#endif /* __ASM_ARCH_IRQS_H */
arch/arm/mach-exynos4/include/mach/sysmmu.h deleted +0 -46
46 lines not on this page · raw message
arch/arm/plat-s5p/Kconfig +12 -8
@@ -42,14 +42,6 @@ config S5P_HRT help Use the High Resolution timer support -comment "System MMU" - -config S5P_SYSTEM_MMU - bool "S5P SYSTEM MMU" - depends on ARCH_EXYNOS4 - help - Say Y here if you want to enable System MMU - config S5P_DEV_FIMC0 bool help
@@ -89,3 +81,15 @@ config S5P_SETUP_MIPIPHY bool help Compile in common setup code for MIPI-CSIS and MIPI-DSIM devices + +comment "System MMU" + +config IOMMU_API + bool + +config S5P_SYSTEM_MMU + bool "S5P SYSTEM MMU" + depends on ARCH_EXYNOS4 + select IOMMU_API + help + Say Y here if you want to enable System MMU
arch/arm/plat-s5p/include/plat/sysmmu.h +70 -95
165 lines not on this page · raw message
arch/arm/plat-s5p/sysmmu.c +791 -312
1,103 lines not on this page · raw message
arch/arm/plat-samsung/include/plat/devs.h +1 -1
@@ -142,7 +142,7 @@ extern struct platform_device s5p_device_fimc3;extern struct platform_device s5p_device_mipi_csis0;extern struct platform_device s5p_device_mipi_csis1; -extern struct platform_device exynos4_device_sysmmu; +extern struct platform_device exynos4_device_sysmmu[];/* s3c2440 specific devices */
Signature · 1 line
1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 3/7 v4l: videobuf2: dma-sg: move some generic functions to memops
In reply to Marek SzyprowskiFrom: Andrzej Pietrasiewicz <[email protected]>
This patch moves some generic code to videobuf2-memops. This code will be later used by the iommu allocator. This patch adds also vma locking in user pointer mode.
--- drivers/media/video/videobuf2-dma-sg.c | 37 +++++---------- drivers/media/video/videobuf2-memops.c | 76 ++++++++++++++++++++++++++++++++ include/media/videobuf2-memops.h | 5 ++ 3 files changed, 93 insertions(+), 25 deletions(-)
drivers/media/video/videobuf2-dma-sg.c +12 -25
@@ -29,6 +29,7 @@ struct vb2_dma_sg_buf {struct vb2_dma_sg_desc sg_desc;atomic_t refcount;struct vb2_vmarea_handler handler; +struct vm_area_struct *vma; };static void vb2_dma_sg_put (void *buf_priv);
@@ -150,15 +151,9 @@ static void *vb2_dma_sg_get_userptr(void *alloc_ctx, unsigned long vaddr,if (!buf->pages) goto userptr_fail_pages_array_alloc; -down_read (¤t->mm->mmap_sem); - num_pages_from_user =get_user_pages (current, current->mm, - vaddr &PAGE_MASK , - buf->sg_desc.num_pages, - write, -1 ,/* force */ - buf->pages, -NULL ); -up_read (¤t->mm->mmap_sem); + num_pages_from_user =vb2_get_user_pages (vaddr, buf->sg_desc.num_pages, + buf->pages, write, &buf->vma); +if (num_pages_from_user != buf->sg_desc.num_pages) goto userptr_fail_get_user_pages;
@@ -177,6 +172,8 @@ userptr_fail_get_user_pages: num_pages_from_user, buf->sg_desc.num_pages);while (--num_pages_from_user >=0 )put_page (buf->pages[num_pages_from_user]); +if (buf->vma) +vb2_put_vma (buf->vma);kfree (buf->pages); userptr_fail_pages_array_alloc:
@@ -200,6 +197,8 @@ static void vb2_dma_sg_put_userptr(void *buf_priv) __func__, buf->sg_desc.num_pages);if (buf->vaddr)vm_unmap_ram (buf->vaddr, buf->sg_desc.num_pages); +if (buf->vma) +vb2_put_vma (buf->vma);while (--i >=0 ) {if (buf->write)set_page_dirty_lock (buf->pages[i]);
@@ -236,28 +235,16 @@ static unsigned int vb2_dma_sg_num_users(void *buf_priv)static int vb2_dma_sg_mmap (void *buf_priv,struct vm_area_struct *vma) {struct vb2_dma_sg_buf *buf = buf_priv; -unsigned long uaddr = vma->vm_start; -unsigned long usize = vma->vm_end - vma->vm_start; -int i =0 ; +int ret;if (!buf) {printk (KERN_ERR "No memory to map\n" );return -EINVAL ; } -do { -int ret; - - ret =vm_insert_page (vma, uaddr, buf->pages[i++]); -if (ret) { -printk (KERN_ERR "Remapping memory, error: %d\n" , ret); -return ret; - } - - uaddr +=PAGE_SIZE ; - usize -=PAGE_SIZE ; - }while (usize >0 ); - + ret =vb2_insert_pages (vma, buf->pages); +if (ret) +return ret;/* * Use common vm_area operations to track buffer refcount.
drivers/media/video/videobuf2-memops.c +76 -0
82 lines not on this page · raw message
include/media/videobuf2-memops.h +5 -0
@@ -41,5 +41,10 @@ int vb2_mmap_pfn_range(struct vm_area_struct *vma, unsigned long paddr,struct vm_area_struct *vb2_get_vma (struct vm_area_struct *vma);void vb2_put_vma (struct vm_area_struct *vma); +int vb2_get_user_pages (unsigned long vaddr,unsigned int num_pages, +struct page **pages,int write, +struct vm_area_struct **vma); + +int vb2_insert_pages (struct vm_area_struct *vma,struct page **pages);#endif
Signature · 1 line
1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 4/7 v4l: videobuf2: add IOMMU based DMA memory allocator
In reply to Marek SzyprowskiFrom: Andrzej Pietrasiewicz <[email protected]>
This patch adds new videobuf2 memory allocator dedicated to devices that supports IOMMU DMA mappings. A device with IOMMU module and a driver with include/iommu.h compatible interface is required. This allocator aquires memory with standard alloc_page() call and doesn't suffer from memory fragmentation issues.
--- drivers/media/video/Kconfig | 8 +- drivers/media/video/Makefile | 1 + drivers/media/video/videobuf2-dma-iommu.c | 469 +++++++++++++++++++++++++++++ include/media/videobuf2-dma-iommu.h | 48 +++ 4 files changed, 525 insertions(+), 1 deletions(-) create mode 100644 drivers/media/video/videobuf2-dma-iommu.c create mode 100644 include/media/videobuf2-dma-iommu.h
drivers/media/video/Kconfig +7 -1
@@ -60,12 +60,18 @@ config VIDEOBUF2_VMALLOC select VIDEOBUF2_MEMOPS tristate - config VIDEOBUF2_DMA_SG #depends on HAS_DMA select VIDEOBUF2_CORE select VIDEOBUF2_MEMOPS tristate + +config VIDEOBUF2_DMA_IOMMU + select GENERIC_ALLOCATOR + select VIDEOBUF2_CORE + select VIDEOBUF2_MEMOPS + tristate + # # Multimedia Video device configuration #
drivers/media/video/Makefile +1 -0
@@ -118,6 +118,7 @@ obj-$(CONFIG_VIDEOBUF2_MEMOPS) += videobuf2-memops.o obj-$(CONFIG_VIDEOBUF2_VMALLOC) += videobuf2-vmalloc.o obj-$(CONFIG_VIDEOBUF2_DMA_CONTIG) += videobuf2-dma-contig.o obj-$(CONFIG_VIDEOBUF2_DMA_SG) += videobuf2-dma-sg.o +obj-$(CONFIG_VIDEOBUF2_DMA_IOMMU) += videobuf2-dma-iommu.o obj-$(CONFIG_V4L2_MEM2MEM_DEV) += v4l2-mem2mem.o
drivers/media/video/videobuf2-dma-iommu.c new file +469 -0
469 lines not on this page · raw message
include/media/videobuf2-dma-iommu.h new file +48 -0
48 lines not on this page · raw message
Signature · 1 line
1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 5/7 v4l: s5p-fimc: add pm_runtime support
In reply to Marek SzyprowskiThis patch adds basic support for pm_runtime to s5p-fimc driver. PM runtime support is required to enable the driver on S5PV310 series with power domain driver enabled.
--- drivers/media/video/s5p-fimc/fimc-capture.c | 5 +++++ drivers/media/video/s5p-fimc/fimc-core.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-)
drivers/media/video/s5p-fimc/fimc-capture.c +5 -0
@@ -18,6 +18,7 @@#include <linux/interrupt.h> #include <linux/device.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/list.h> #include <linux/slab.h> #include <linux/clk.h>
@@ -398,6 +399,8 @@ static int fimc_capture_open(struct file *file)if (fimc_m2m_active (fimc))return -EBUSY ; +pm_runtime_get_sync (&fimc->pdev->dev); +if (++fimc->vid_cap.refcnt ==1 ) { ret =fimc_isp_subdev_init (fimc,0 );if (ret) {
@@ -428,6 +431,8 @@ static int fimc_capture_close(struct file *file)fimc_subdev_unregister (fimc); } +pm_runtime_put_sync (&fimc->pdev->dev); +return 0 ; }
drivers/media/video/s5p-fimc/fimc-core.c +14 -0
@@ -20,6 +20,7 @@#include <linux/interrupt.h> #include <linux/device.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/list.h> #include <linux/io.h> #include <linux/slab.h>
@@ -1410,6 +1411,8 @@ static int fimc_m2m_open(struct file *file)if (fimc->vid_cap.refcnt >0 )return -EBUSY ; +pm_runtime_get_sync (&fimc->pdev->dev); + fimc->m2m.refcnt++;set_bit (ST_OUTDMA_RUN , &fimc->state);
@@ -1452,6 +1455,8 @@ static int fimc_m2m_release(struct file *file)if (--fimc->m2m.refcnt <=0 )clear_bit (ST_OUTDMA_RUN , &fimc->state); +pm_runtime_put_sync (&fimc->pdev->dev); +return 0 ; }
@@ -1649,6 +1654,11 @@ static int fimc_probe(struct platform_device *pdev) goto err_req_region; } +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); + +pm_runtime_get_sync (&pdev->dev); + fimc->num_clocks =MAX_FIMC_CLOCKS -1 ;/* Check if a video capture node needs to be registered. */
@@ -1706,6 +1716,8 @@ static int fimc_probe(struct platform_device *pdev)dev_dbg (&pdev->dev,"%s(): fimc-%d registered successfully\n" , __func__, fimc->id); +pm_runtime_put_sync (&pdev->dev); +return 0 ; err_m2m:
@@ -1740,6 +1752,8 @@ static int __devexit fimc_remove(struct platform_device *pdev)vb2_dma_contig_cleanup_ctx (fimc->alloc_ctx); +pm_runtime_disable (&pdev->dev); +iounmap (fimc->regs);release_resource (fimc->regs_res);kfree (fimc->regs_res);
Signature · 1 line
1.7.1.569.g6f426
PATCH 5/7 v4l: s5p-fimc: add pm_runtime support
AALQBmAGkAbQBjADoAIA
BhAGQAZAAgAHAAbQBfAHIAdQBuAHQAaQBtAGUAIABzAHUAcABwAG8AcgB0AA==
x-cr-puzzleid: {0DF5696E-C27B-4620-A41E-B97F4C401FEA}
Hi Marek,
runtime_pm is used to minimize current.
In my opinion, the followings will be better.
1. Adds pm_runtime_get_sync before running of the first job. IMO, dma_run callback function is the best place for calling in case of
M2M.
2. And then in the ISR, call pm_runtime_put_sync in the ISR bottom-half if there is no remained job.
I had already implemented and tested.
But it remained code cleanup. I hope I can post it on the next week.
Best regards,
Jonghun Han
Quoted 1 line · Marek Szyprowski
This patch adds basic support for
pm_runtimeto s5p-fimc driver. PM
runtime
Quoted 1 line
support is required to enable the driver on S5PV310 series with power
domain
Quoted 73 lines
driver enabled.
Signed-off-by Marek Szyprowski <[email protected]>Signed-off-by Kyungmin Park <[email protected]>--- drivers/media/video/s5p-fimc/fimc-capture.c | 5 +++++ drivers/media/video/s5p-fimc/fimc-core.c | 14 ++++++++++++++ 2 files changed, 19 insertions(+), 0 deletions(-)drivers/media/video/s5p-fimc/fimc-capture.c +5
-0@@ -18,6 +18,7 @@#include <linux/interrupt.h> #include <linux/device.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/list.h> #include <linux/slab.h> #include <linux/clk.h> @@ -398,6 +399,8 @@ static int fimc_capture_open(struct file *file)if (fimc_m2m_active (fimc))return -EBUSY ; +pm_runtime_get_sync (&fimc->pdev->dev); +if (++fimc->vid_cap.refcnt ==1 ) { ret =fimc_isp_subdev_init (fimc,0 );if (ret) {@@ -428,6 +431,8 @@ static int fimc_capture_close(struct file *file)fimc_subdev_unregister (fimc); } +pm_runtime_put_sync (&fimc->pdev->dev); +return 0 ; }drivers/media/video/s5p-fimc/fimc-core.c +5
-0@@ -20,6 +20,7 @@#include <linux/interrupt.h> #include <linux/device.h> #include <linux/platform_device.h> +#include <linux/pm_runtime.h> #include <linux/list.h> #include <linux/io.h> #include <linux/slab.h> @@ -1410,6 +1411,8 @@ static int fimc_m2m_open(struct file *file)if (fimc->vid_cap.refcnt >0 )return -EBUSY ; +pm_runtime_get_sync (&fimc->pdev->dev); + fimc->m2m.refcnt++;set_bit (ST_OUTDMA_RUN , &fimc->state);@@ -1452,6 +1455,8 @@ static int fimc_m2m_release(struct file *file)if (--fimc->m2m.refcnt <=0 )clear_bit (ST_OUTDMA_RUN , &fimc->state); +pm_runtime_put_sync (&fimc->pdev->dev); +return 0 ; }@@ -1649,6 +1654,11 @@ static int fimc_probe(struct platform_device *pdev) goto err_req_region;
drivers/media/video/s5p-fimc/fimc-core.c static int fimc_probe(struct platform_device *pdev) · line 1664
Quoted 10 lines
drivers/media/video/s5p-fimc/fimc-core.c +5
-0} +pm_runtime_set_active (&pdev->dev); +pm_runtime_enable (&pdev->dev); + +pm_runtime_get_sync (&pdev->dev); + fimc->num_clocks =MAX_FIMC_CLOCKS -1 ; /* Check if a video capture node needs to be registered. */ @@ -
1706,6
drivers/media/video/s5p-fimc/fimc-core.c static int __devexit fimc_remove(struct
Quoted 10 lines
+1716,8 @@ static int
fimc_probe(struct platform_device *pdev)drivers/media/video/s5p-fimc/fimc-core.c +2
-0dev_dbg (&pdev->dev,"%s(): fimc-%d registered successfully\n" , __func__, fimc->id); +pm_runtime_put_sync (&pdev->dev); +return 0 ; err_m2m:@@ -1740,6 +1752,8 @@ static int __devexit fimc_remove(struct
platform_device
Quoted 8 lines
drivers/media/video/s5p-fimc/fimc-core.c +2
-0*pdev)vb2_dma_contig_cleanup_ctx (fimc->alloc_ctx); +pm_runtime_disable (&pdev->dev); +iounmap (fimc->regs);release_resource (fimc->regs_res);
Quoted 5 lines
kfree(fimc->regs_res);
--
1.7.1.569.g6f426
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the
Quoted 2 lines
body of a message to majordomo at vger.kernel.org More majordomo info at
http://vger.kernel.org/majordomo-info.html
Marek Szyprowski
maintainerPATCH v2 5/7 v4l: s5p-fimc: add pm_runtime support
Hello,
Quoted 7 lines · Jonghun Han
runtime_pmis used to minimize current.
In my opinion, the followings will be better.
1. Addspm_runtime_get_syncbefore running of the first job. IMO,dma_runcallback function is the best place for calling in case of
M2M.
2. And then in the ISR, callpm_runtime_put_syncin the ISR bottom-half if there is no remained job.
Right my pm_runtime implementation is very simple. I've just added it to test if other subsystems are working.
Best regards
--
Marek Szyprowski
Samsung Poland R&D Center
PATCH 5/7 v4l: s5p-fimc: add pm_runtime support
In reply to Jonghun HanHi Jonghun,
On 04/06/2011 02:37 AM, Jonghun Han wrote:
...
Quoted 8 lines
Hi Marek,
runtime_pmis used to minimize current.
In my opinion, the followings will be better.
1. Addspm_runtime_get_syncbefore running of the first job. IMO,dma_runcallback function is the best place for calling in case of
M2M.
Yeah, sounds reasonable.
Quoted 2 lines
2. And then in the ISR, call
pm_runtime_put_syncin the ISR bottom-half if there is no remained job.
So you are switching the clocks off in the interrupt context, I'm not sure whether this is a good idea. Perhaps we could just use pm_runtime_put() in this case?
Quoted 3 lines
I had already implemented and tested.
But it remained code cleanup. I hope I can post it on the next week.
The purpose of Marek's simple patch was to just enable the FIMC IP to illustrate the IOMMU driver's operation. I have prepared more complete patch for runtime PM and system suspend/resume in the mem-to-mem driver as well, but I want to consolidate this with the video capture driver before sending upstream.
Anyway I'm looking forward to see your patch so we can work out some common version. Also I've got a few patches for this rc period which I intend to post this week.
Regards,
Signature · 2 lines
Sylwester Nawrocki Samsung Poland R&D Center
Marek Szyprowski
maintainerPATCH v2 6/7 v4l: s5p-fimc: Add support for vb2-dma-iommu allocator
In reply to Marek SzyprowskiThis patch adds support for videobuf2-dma-iommu allocator to s5p-fimc driver. This allocator is selected only on systems that contains support for S5P SYSMMU module (like EXYNOS4 platform). Otherwise the standard videobuf2-dma-contig is used.
--- drivers/media/video/Kconfig | 3 +- drivers/media/video/s5p-fimc/fimc-capture.c | 4 +- drivers/media/video/s5p-fimc/fimc-core.c | 24 ++++--- drivers/media/video/s5p-fimc/fimc-core.h | 1 + drivers/media/video/s5p-fimc/fimc-mem.h | 103 +++++++++++++++++++++++++++ 5 files changed, 122 insertions(+), 13 deletions(-) create mode 100644 drivers/media/video/s5p-fimc/fimc-mem.h
drivers/media/video/Kconfig +2 -1
@@ -1031,7 +1031,8 @@ config VIDEO_MEM2MEM_TESTDEV config VIDEO_SAMSUNG_S5P_FIMC tristate "Samsung S5P FIMC (video postprocessor) driver" depends on VIDEO_DEV && VIDEO_V4L2 && PLAT_S5P - select VIDEOBUF2_DMA_CONTIG + select VIDEOBUF2_DMA_IOMMU if S5P_SYSTEM_MMU + select VIDEOBUF2_DMA_CONTIG if !S5P_SYSTEM_MMU select V4L2_MEM2MEM_DEV help This is a v4l2 driver for the S5P camera interface
drivers/media/video/s5p-fimc/fimc-capture.c +2 -2
@@ -29,9 +29,9 @@#include <media/v4l2-ioctl.h> #include <media/v4l2-mem2mem.h> #include <media/videobuf2-core.h> -#include <media/videobuf2-dma-contig.h> #include "fimc-core.h" +#include "fimc-mem.h" static struct v4l2_subdev *fimc_subdev_register (struct fimc_dev *fimc,struct s5p_fimc_isp_info *isp_info)
@@ -884,7 +884,7 @@ int fimc_register_capture_device(struct fimc_dev *fimc) q->io_modes =VB2_MMAP |VB2_USERPTR ; q->drv_priv = fimc->vid_cap.ctx; q->ops = &fimc_capture_qops; - q->mem_ops = &vb2_dma_contig_memops; + q->mem_ops = &fimc_vb2_allocator_memops; q->buf_struct_size =sizeof (struct fimc_vid_buffer );vb2_queue_init (q);
drivers/media/video/s5p-fimc/fimc-core.c +14 -10
@@ -27,9 +27,9 @@#include <linux/clk.h> #include <media/v4l2-ioctl.h> #include <media/videobuf2-core.h> -#include <media/videobuf2-dma-contig.h> #include "fimc-core.h" +#include "fimc-mem.h" static char *fimc_clocks[MAX_FIMC_CLOCKS ] = {"sclk_fimc" ,"fimc" ,"sclk_cam"
@@ -457,7 +457,7 @@ int fimc_prepare_addr(struct fimc_ctx *ctx, struct vb2_buffer *vb,dbg ("memplanes= %d, colplanes= %d, pix_size= %d" , frame->fmt->memplanes, frame->fmt->colplanes, pix_size); - paddr->y =vb2_dma_contig_plane_paddr (vb,0 ); + paddr->y =fimc_vb2_plane_addr (vb,0 );if (frame->fmt->memplanes ==1 ) {switch (frame->fmt->colplanes) {
@@ -485,10 +485,10 @@ int fimc_prepare_addr(struct fimc_ctx *ctx, struct vb2_buffer *vb, } }else {if (frame->fmt->memplanes >=2 ) - paddr->cb =vb2_dma_contig_plane_paddr (vb,1 ); + paddr->cb =fimc_vb2_plane_addr (vb,1 );if (frame->fmt->memplanes ==3 ) - paddr->cr =vb2_dma_contig_plane_paddr (vb,2 ); + paddr->cr =fimc_vb2_plane_addr (vb,2 ); } dbg("PHYS_ADDR: y= 0x%X cb= 0x%X cr= 0x%X ret= %d",
@@ -1378,7 +1378,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, src_vq->io_modes =VB2_MMAP |VB2_USERPTR ; src_vq->drv_priv = ctx; src_vq->ops = &fimc_qops; - src_vq->mem_ops = &vb2_dma_contig_memops; + src_vq->mem_ops = &fimc_vb2_allocator_memops; src_vq->buf_struct_size =sizeof (struct v4l2_m2m_buffer ); ret =vb2_queue_init (src_vq);
@@ -1390,7 +1390,7 @@ static int queue_init(void *priv, struct vb2_queue *src_vq, dst_vq->io_modes =VB2_MMAP |VB2_USERPTR ; dst_vq->drv_priv = ctx; dst_vq->ops = &fimc_qops; - dst_vq->mem_ops = &vb2_dma_contig_memops; + dst_vq->mem_ops = &fimc_vb2_allocator_memops; dst_vq->buf_struct_size =sizeof (struct v4l2_m2m_buffer );return vb2_queue_init (dst_vq);
@@ -1688,12 +1688,15 @@ static int fimc_probe(struct platform_device *pdev) goto err_clk; } -/* Initialize contiguous memory allocator */ - fimc->alloc_ctx =vb2_dma_contig_init_ctx (&fimc->pdev->dev); +/* Initialize memory allocator */ + fimc->alloc_ctx =fimc_vb2_allocator_init (pdev, fimc);if (IS_ERR (fimc->alloc_ctx)) { ret =PTR_ERR (fimc->alloc_ctx); goto err_irq; } + ret =fimc_vb2_allocator_enable (fimc->alloc_ctx); +if (ret) + goto err_irq; ret =fimc_register_m2m_device (fimc);if (ret)
@@ -1750,7 +1753,8 @@ static int __devexit fimc_remove(struct platform_device *pdev)fimc_clk_release (fimc); -vb2_dma_contig_cleanup_ctx (fimc->alloc_ctx); +fimc_vb2_allocator_disable (fimc->alloc_ctx); +fimc_vb2_allocator_cleanup (fimc->alloc_ctx, fimc);pm_runtime_disable (&pdev->dev);
@@ -1907,7 +1911,7 @@ static struct platform_device_id fimc_driver_ids[] = { .name = "s5pv210-fimc", .driver_data = (unsigned long)&fimc_drvdata_s5pv210, }, { - .name = "s5pv310-fimc", + .name = "exynos4-fimc", .driver_data = (unsigned long)&fimc_drvdata_s5pv310, }, {},
drivers/media/video/s5p-fimc/fimc-core.h +1 -0
@@ -423,6 +423,7 @@ struct fimc_dev {struct fimc_vid_cap vid_cap;unsigned long state;struct vb2_alloc_ctx *alloc_ctx; +struct device *iommu_dev; };/**
drivers/media/video/s5p-fimc/fimc-mem.h new file +104 -0
104 lines not on this page · raw message
Signature · 1 line
1.7.1.569.g6f426
Marek Szyprowski
maintainerPATCH v2 7/7 ARM: EXYNOS4: enable FIMC on Universal_C210
In reply to Marek SzyprowskiThis patch adds definitions to enable support for s5p-fimc driver together with required power domains and sysmmu controller on Universal C210 board.
--- arch/arm/mach-exynos4/Kconfig | 6 ++++++ arch/arm/mach-exynos4/mach-universal_c210.c | 22 ++++++++++++++++++++++ 2 files changed, 28 insertions(+), 0 deletions(-)
arch/arm/mach-exynos4/Kconfig +6 -0
@@ -148,12 +148,18 @@ config MACH_ARMLEX4210 config MACH_UNIVERSAL_C210 bool "Mobile UNIVERSAL_C210 Board" select CPU_EXYNOS4210 + select S5P_DEV_FIMC0 + select S5P_DEV_FIMC1 + select S5P_DEV_FIMC2 + select S5P_DEV_FIMC3 select S3C_DEV_HSMMC select S3C_DEV_HSMMC2 select S3C_DEV_HSMMC3 select S3C_DEV_I2C1 select S3C_DEV_I2C5 select S5P_DEV_ONENAND + select EXYNOS4_DEV_PD + select EXYNOS4_DEV_SYSMMU select EXYNOS4_SETUP_I2C1 select EXYNOS4_SETUP_I2C5 select EXYNOS4_SETUP_SDHCI
arch/arm/mach-exynos4/mach-universal_c210.c +22 -0
@@ -27,9 +27,12 @@#include <plat/cpu.h> #include <plat/devs.h> #include <plat/iic.h> +#include <plat/pd.h> #include <plat/sdhci.h> +#include <plat/sysmmu.h> #include <mach/map.h> +#include <mach/regs-clock.h> /* Following are default values for UCON, ULCON and UFCON UART registers */ #define UNIVERSAL_UCON_DEFAULT (S3C2410_UCON_TXILEVEL | \
@@ -613,6 +616,15 @@ static struct platform_device *universal_devices[] __initdata = { &s3c_device_hsmmc2, &s3c_device_hsmmc3, &s3c_device_i2c5, + &s5p_device_fimc0, + &s5p_device_fimc1, + &s5p_device_fimc2, + &s5p_device_fimc3, + &exynos4_device_pd[PD_CAM ], + &exynos4_device_sysmmu[S5P_SYSMMU_FIMC0 ], + &exynos4_device_sysmmu[S5P_SYSMMU_FIMC1 ], + &exynos4_device_sysmmu[S5P_SYSMMU_FIMC2 ], + &exynos4_device_sysmmu[S5P_SYSMMU_FIMC3 ],/* Universal Devices */ &universal_gpio_keys,
@@ -638,6 +650,16 @@ static void __init universal_machine_init(void)/* Last */ platform_add_devices (universal_devices,ARRAY_SIZE (universal_devices)); + + s5p_device_fimc0.dev.parent = &exynos4_device_pd[PD_CAM ].dev; + s5p_device_fimc1.dev.parent = &exynos4_device_pd[PD_CAM ].dev; + s5p_device_fimc2.dev.parent = &exynos4_device_pd[PD_CAM ].dev; + s5p_device_fimc3.dev.parent = &exynos4_device_pd[PD_CAM ].dev; + exynos4_device_sysmmu[S5P_SYSMMU_FIMC0 ].dev.parent = &exynos4_device_pd[PD_CAM ].dev; + exynos4_device_sysmmu[S5P_SYSMMU_FIMC1 ].dev.parent = &exynos4_device_pd[PD_CAM ].dev; + exynos4_device_sysmmu[S5P_SYSMMU_FIMC2 ].dev.parent = &exynos4_device_pd[PD_CAM ].dev; + exynos4_device_sysmmu[S5P_SYSMMU_FIMC3 ].dev.parent = &exynos4_device_pd[PD_CAM ].dev; + }MACHINE_START (UNIVERSAL_C210 ,"UNIVERSAL_C210" )
Signature · 1 line
1.7.1.569.g6f426