Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 342292
b: refs/heads/master
c: 2eae613
h: refs/heads/master
v: v3
  • Loading branch information
Arun Kumar K authored and Kukjin Kim committed Oct 19, 2012
1 parent c5c15c5 commit 333466f
Show file tree
Hide file tree
Showing 10 changed files with 99 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 70191db9308e33b5d0063f3a4a6ad22abf594a9d
refs/heads/master: 2eae613b95a786714bd1b5825ea3abc78d229d3f
23 changes: 23 additions & 0 deletions trunk/Documentation/devicetree/bindings/media/s5p-mfc.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
* Samsung Multi Format Codec (MFC)

Multi Format Codec (MFC) is the IP present in Samsung SoCs which
supports high resolution decoding and encoding functionalities.
The MFC device driver is a v4l2 driver which can encode/decode
video raw/elementary streams and has support for all popular
video codecs.

Required properties:
- compatible : value should be either one among the following
(a) "samsung,mfc-v5" for MFC v5 present in Exynos4 SoCs
(b) "samsung,mfc-v6" for MFC v6 present in Exynos5 SoCs

- reg : Physical base address of the IP registers and length of memory
mapped region.

- interrupts : MFC interrupt number to the CPU.

- samsung,mfc-r : Base address of the first memory bank used by MFC
for DMA contiguous memory allocation and its size.

- samsung,mfc-l : Base address of the second memory bank used by MFC
for DMA contiguous memory allocation and its size.
5 changes: 5 additions & 0 deletions trunk/arch/arm/boot/dts/exynos5250-smdk5250.dts
Original file line number Diff line number Diff line change
Expand Up @@ -166,4 +166,9 @@
spi_2: spi@12d40000 {
status = "disabled";
};

codec@11000000 {
samsung,mfc-r = <0x43000000 0x800000>;
samsung,mfc-l = <0x51000000 0x800000>;
};
};
6 changes: 6 additions & 0 deletions trunk/arch/arm/boot/dts/exynos5250.dtsi
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,12 @@
interrupts = <0 42 0>;
};

codec@11000000 {
compatible = "samsung,mfc-v6";
reg = <0x11000000 0x10000>;
interrupts = <0 96 0>;
};

rtc {
compatible = "samsung,s3c6410-rtc";
reg = <0x101E0000 0x100>;
Expand Down
1 change: 1 addition & 0 deletions trunk/arch/arm/mach-exynos/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ config SOC_EXYNOS5250
depends on ARCH_EXYNOS5
select S5P_PM if PM
select S5P_SLEEP if PM
select S5P_DEV_MFC
select SAMSUNG_DMADEV
help
Enable EXYNOS5250 SoC support
Expand Down
2 changes: 1 addition & 1 deletion trunk/arch/arm/mach-exynos/clock-exynos5.c
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ static struct clk exynos5_init_clocks_off[] = {
.ctrlbit = (1 << 25),
}, {
.name = "mfc",
.devname = "s5p-mfc",
.devname = "s5p-mfc-v6",
.enable = exynos5_clk_ip_mfc_ctrl,
.ctrlbit = (1 << 0),
}, {
Expand Down
16 changes: 16 additions & 0 deletions trunk/arch/arm/mach-exynos/mach-exynos5-dt.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,16 @@

#include <linux/of_platform.h>
#include <linux/serial_core.h>
#include <linux/memblock.h>
#include <linux/of_fdt.h>

#include <asm/mach/arch.h>
#include <asm/hardware/gic.h>
#include <mach/map.h>

#include <plat/cpu.h>
#include <plat/regs-serial.h>
#include <plat/mfc.h>

#include "common.h"

Expand Down Expand Up @@ -72,6 +75,7 @@ static const struct of_dev_auxdata exynos5250_auxdata_lookup[] __initconst = {
"exynos-gsc.2", NULL),
OF_DEV_AUXDATA("samsung,exynos5-gsc", EXYNOS5_PA_GSC3,
"exynos-gsc.3", NULL),
OF_DEV_AUXDATA("samsung,mfc-v6", 0x11000000, "s5p-mfc-v6", NULL),
{},
};

Expand All @@ -92,6 +96,17 @@ static char const *exynos5250_dt_compat[] __initdata = {
NULL
};

static void __init exynos5_reserve(void)
{
struct s5p_mfc_dt_meminfo mfc_mem;

/* Reserve memory for MFC only if it's available */
mfc_mem.compatible = "samsung,mfc-v6";
if (of_scan_flat_dt(s5p_fdt_find_mfc_mem, &mfc_mem))
s5p_mfc_reserve_mem(mfc_mem.roff, mfc_mem.rsize, mfc_mem.loff,
mfc_mem.lsize);
}

DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
/* Maintainer: Kukjin Kim <kgene.kim@samsung.com> */
.init_irq = exynos5_init_irq,
Expand All @@ -103,4 +118,5 @@ DT_MACHINE_START(EXYNOS5_DT, "SAMSUNG EXYNOS5 (Flattened Device Tree)")
.timer = &exynos4_timer,
.dt_compat = exynos5250_dt_compat,
.restart = exynos5_restart,
.reserve = exynos5_reserve,
MACHINE_END
1 change: 1 addition & 0 deletions trunk/arch/arm/plat-samsung/devs.c
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,7 @@ struct platform_device s5p_device_mfc_r = {
.coherent_dma_mask = DMA_BIT_MASK(32),
},
};

#endif /* CONFIG_S5P_DEV_MFC */

/* MIPI CSIS */
Expand Down
11 changes: 11 additions & 0 deletions trunk/arch/arm/plat-samsung/include/plat/mfc.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,14 @@
#ifndef __PLAT_SAMSUNG_MFC_H
#define __PLAT_SAMSUNG_MFC_H __FILE__

struct s5p_mfc_dt_meminfo {
unsigned long loff;
unsigned long lsize;
unsigned long roff;
unsigned long rsize;
char *compatible;
};

/**
* s5p_mfc_reserve_mem - function to early reserve memory for MFC driver
* @rbase: base address for MFC 'right' memory interface
Expand All @@ -24,4 +32,7 @@
void __init s5p_mfc_reserve_mem(phys_addr_t rbase, unsigned int rsize,
phys_addr_t lbase, unsigned int lsize);

int __init s5p_fdt_find_mfc_mem(unsigned long node, const char *uname,
int depth, void *data);

#endif /* __PLAT_SAMSUNG_MFC_H */
34 changes: 34 additions & 0 deletions trunk/arch/arm/plat-samsung/s5p-dev-mfc.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@
#include <linux/dma-mapping.h>
#include <linux/memblock.h>
#include <linux/ioport.h>
#include <linux/of_fdt.h>
#include <linux/of.h>

#include <mach/map.h>
#include <plat/devs.h>
Expand Down Expand Up @@ -69,3 +71,35 @@ static int __init s5p_mfc_memory_init(void)
return 0;
}
device_initcall(s5p_mfc_memory_init);

#ifdef CONFIG_OF
int __init s5p_fdt_find_mfc_mem(unsigned long node, const char *uname,
int depth, void *data)
{
__be32 *prop;
unsigned long len;
struct s5p_mfc_dt_meminfo *mfc_mem = data;

if (!data)
return 0;

if (!of_flat_dt_is_compatible(node, mfc_mem->compatible))
return 0;

prop = of_get_flat_dt_prop(node, "samsung,mfc-l", &len);
if (!prop || (len != 2 * sizeof(unsigned long)))
return 0;

mfc_mem->loff = be32_to_cpu(prop[0]);
mfc_mem->lsize = be32_to_cpu(prop[1]);

prop = of_get_flat_dt_prop(node, "samsung,mfc-r", &len);
if (!prop || (len != 2 * sizeof(unsigned long)))
return 0;

mfc_mem->roff = be32_to_cpu(prop[0]);
mfc_mem->rsize = be32_to_cpu(prop[1]);

return 1;
}
#endif

0 comments on commit 333466f

Please sign in to comment.