aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArchit Taneja <archit@ti.com>2013-12-12 03:36:01 -0500
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-01-07 03:56:18 -0500
commit6948082d1c9d5cdebc00b317b3b290292c635d53 (patch)
tree18038ea97164b059a94bd78eb8af73a9d52524a7
parentbbee8b3933f5ddff85904aed9190eaca52c54d13 (diff)
[media] v4l: ti-vpe: create a color space converter block library
VPE and VIP IPs in DAR7x contain a color space converter(CSC) sub block. Create a library which will perform CSC related configurations and hold CSC register definitions. The functions provided by this library will be called by the vpe and vip drivers using a csc_data handle. The vpe_dev holds the csc_data handle. The handle represents an instance of the CSC hardware, and the vpe driver uses it to access the CSC register offsets or helper functions to configure these registers. The CSC register offsets are now relative to the CSC block itself, so we need to use the macro GET_OFFSET_TOP to get the CSC register offset relative to the VPE IP in the vpe driver. Signed-off-by: Archit Taneja <archit@ti.com> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
-rw-r--r--drivers/media/platform/ti-vpe/Makefile2
-rw-r--r--drivers/media/platform/ti-vpe/csc.c76
-rw-r--r--drivers/media/platform/ti-vpe/csc.h65
-rw-r--r--drivers/media/platform/ti-vpe/vpe.c31
-rw-r--r--drivers/media/platform/ti-vpe/vpe_regs.h38
5 files changed, 155 insertions, 57 deletions
diff --git a/drivers/media/platform/ti-vpe/Makefile b/drivers/media/platform/ti-vpe/Makefile
index 54c30b31c4cb..be680f839e77 100644
--- a/drivers/media/platform/ti-vpe/Makefile
+++ b/drivers/media/platform/ti-vpe/Makefile
@@ -1,5 +1,5 @@
1obj-$(CONFIG_VIDEO_TI_VPE) += ti-vpe.o 1obj-$(CONFIG_VIDEO_TI_VPE) += ti-vpe.o
2 2
3ti-vpe-y := vpe.o sc.o vpdma.o 3ti-vpe-y := vpe.o sc.o csc.o vpdma.o
4 4
5ccflags-$(CONFIG_VIDEO_TI_VPE_DEBUG) += -DDEBUG 5ccflags-$(CONFIG_VIDEO_TI_VPE_DEBUG) += -DDEBUG
diff --git a/drivers/media/platform/ti-vpe/csc.c b/drivers/media/platform/ti-vpe/csc.c
new file mode 100644
index 000000000000..62e2fecd1798
--- /dev/null
+++ b/drivers/media/platform/ti-vpe/csc.c
@@ -0,0 +1,76 @@
1/*
2 * Color space converter library
3 *
4 * Copyright (c) 2013 Texas Instruments Inc.
5 *
6 * David Griego, <dagriego@biglakesoftware.com>
7 * Dale Farnsworth, <dale@farnsworth.org>
8 * Archit Taneja, <archit@ti.com>
9 *
10 * This program is free software; you can redistribute it and/or modify it
11 * under the terms of the GNU General Public License version 2 as published by
12 * the Free Software Foundation.
13 */
14
15#include <linux/err.h>
16#include <linux/io.h>
17#include <linux/platform_device.h>
18#include <linux/slab.h>
19
20#include "csc.h"
21
22void csc_dump_regs(struct csc_data *csc)
23{
24 struct device *dev = &csc->pdev->dev;
25
26 u32 read_reg(struct csc_data *csc, int offset)
27 {
28 return ioread32(csc->base + offset);
29 }
30
31#define DUMPREG(r) dev_dbg(dev, "%-35s %08x\n", #r, read_reg(csc, CSC_##r))
32
33 DUMPREG(CSC00);
34 DUMPREG(CSC01);
35 DUMPREG(CSC02);
36 DUMPREG(CSC03);
37 DUMPREG(CSC04);
38 DUMPREG(CSC05);
39
40#undef DUMPREG
41}
42
43void csc_set_coeff_bypass(struct csc_data *csc, u32 *csc_reg5)
44{
45 *csc_reg5 |= CSC_BYPASS;
46}
47
48struct csc_data *csc_create(struct platform_device *pdev)
49{
50 struct csc_data *csc;
51
52 dev_dbg(&pdev->dev, "csc_create\n");
53
54 csc = devm_kzalloc(&pdev->dev, sizeof(*csc), GFP_KERNEL);
55 if (!csc) {
56 dev_err(&pdev->dev, "couldn't alloc csc_data\n");
57 return ERR_PTR(-ENOMEM);
58 }
59
60 csc->pdev = pdev;
61
62 csc->res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
63 "vpe_csc");
64 if (csc->res == NULL) {
65 dev_err(&pdev->dev, "missing platform resources data\n");
66 return ERR_PTR(-ENODEV);
67 }
68
69 csc->base = devm_ioremap_resource(&pdev->dev, csc->res);
70 if (!csc->base) {
71 dev_err(&pdev->dev, "failed to ioremap\n");
72 return ERR_PTR(-ENOMEM);
73 }
74
75 return csc;
76}
diff --git a/drivers/media/platform/ti-vpe/csc.h b/drivers/media/platform/ti-vpe/csc.h
new file mode 100644
index 000000000000..57b5ed600394
--- /dev/null
+++ b/drivers/media/platform/ti-vpe/csc.h
@@ -0,0 +1,65 @@
1/*
2 * Copyright (c) 2013 Texas Instruments Inc.
3 *
4 * David Griego, <dagriego@biglakesoftware.com>
5 * Dale Farnsworth, <dale@farnsworth.org>
6 * Archit Taneja, <archit@ti.com>
7 *
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License version 2 as published by
10 * the Free Software Foundation.
11 */
12#ifndef TI_CSC_H
13#define TI_CSC_H
14
15/* VPE color space converter regs */
16#define CSC_CSC00 0x00
17#define CSC_A0_MASK 0x1fff
18#define CSC_A0_SHIFT 0
19#define CSC_B0_MASK 0x1fff
20#define CSC_B0_SHIFT 16
21
22#define CSC_CSC01 0x04
23#define CSC_C0_MASK 0x1fff
24#define CSC_C0_SHIFT 0
25#define CSC_A1_MASK 0x1fff
26#define CSC_A1_SHIFT 16
27
28#define CSC_CSC02 0x08
29#define CSC_B1_MASK 0x1fff
30#define CSC_B1_SHIFT 0
31#define CSC_C1_MASK 0x1fff
32#define CSC_C1_SHIFT 16
33
34#define CSC_CSC03 0x0c
35#define CSC_A2_MASK 0x1fff
36#define CSC_A2_SHIFT 0
37#define CSC_B2_MASK 0x1fff
38#define CSC_B2_SHIFT 16
39
40#define CSC_CSC04 0x10
41#define CSC_C2_MASK 0x1fff
42#define CSC_C2_SHIFT 0
43#define CSC_D0_MASK 0x0fff
44#define CSC_D0_SHIFT 16
45
46#define CSC_CSC05 0x14
47#define CSC_D1_MASK 0x0fff
48#define CSC_D1_SHIFT 0
49#define CSC_D2_MASK 0x0fff
50#define CSC_D2_SHIFT 16
51
52#define CSC_BYPASS (1 << 28)
53
54struct csc_data {
55 void __iomem *base;
56 struct resource *res;
57
58 struct platform_device *pdev;
59};
60
61void csc_dump_regs(struct csc_data *csc);
62void csc_set_coeff_bypass(struct csc_data *csc, u32 *csc_reg5);
63struct csc_data *csc_create(struct platform_device *pdev);
64
65#endif
diff --git a/drivers/media/platform/ti-vpe/vpe.c b/drivers/media/platform/ti-vpe/vpe.c
index dc2b94cb2640..6c4db57fc0c9 100644
--- a/drivers/media/platform/ti-vpe/vpe.c
+++ b/drivers/media/platform/ti-vpe/vpe.c
@@ -44,6 +44,7 @@
44#include "vpdma.h" 44#include "vpdma.h"
45#include "vpe_regs.h" 45#include "vpe_regs.h"
46#include "sc.h" 46#include "sc.h"
47#include "csc.h"
47 48
48#define VPE_MODULE_NAME "vpe" 49#define VPE_MODULE_NAME "vpe"
49 50
@@ -330,6 +331,7 @@ struct vpe_dev {
330 struct vb2_alloc_ctx *alloc_ctx; 331 struct vb2_alloc_ctx *alloc_ctx;
331 struct vpdma_data *vpdma; /* vpdma data handle */ 332 struct vpdma_data *vpdma; /* vpdma data handle */
332 struct sc_data *sc; /* scaler data handle */ 333 struct sc_data *sc; /* scaler data handle */
334 struct csc_data *csc; /* csc data handle */
333}; 335};
334 336
335/* 337/*
@@ -475,7 +477,8 @@ static void init_adb_hdrs(struct vpe_ctx *ctx)
475 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC8)); 477 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC8));
476 VPE_SET_MMR_ADB_HDR(ctx, sc_hdr17, sc_regs17, 478 VPE_SET_MMR_ADB_HDR(ctx, sc_hdr17, sc_regs17,
477 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC17)); 479 GET_OFFSET_TOP(ctx, ctx->dev->sc, CFG_SC17));
478 VPE_SET_MMR_ADB_HDR(ctx, csc_hdr, csc_regs, VPE_CSC_CSC00); 480 VPE_SET_MMR_ADB_HDR(ctx, csc_hdr, csc_regs,
481 GET_OFFSET_TOP(ctx, ctx->dev->csc, CSC_CSC00));
479}; 482};
480 483
481/* 484/*
@@ -758,16 +761,6 @@ static void set_dei_shadow_registers(struct vpe_ctx *ctx)
758 ctx->load_mmrs = true; 761 ctx->load_mmrs = true;
759} 762}
760 763
761static void set_csc_coeff_bypass(struct vpe_ctx *ctx)
762{
763 struct vpe_mmr_adb *mmr_adb = ctx->mmr_adb.addr;
764 u32 *shadow_csc_reg5 = &mmr_adb->csc_regs[5];
765
766 *shadow_csc_reg5 |= VPE_CSC_BYPASS;
767
768 ctx->load_mmrs = true;
769}
770
771/* 764/*
772 * Set the shadow registers whose values are modified when either the 765 * Set the shadow registers whose values are modified when either the
773 * source or destination format is changed. 766 * source or destination format is changed.
@@ -819,7 +812,8 @@ static int set_srcdst_params(struct vpe_ctx *ctx)
819 812
820 set_cfg_and_line_modes(ctx); 813 set_cfg_and_line_modes(ctx);
821 set_dei_regs(ctx); 814 set_dei_regs(ctx);
822 set_csc_coeff_bypass(ctx); 815
816 csc_set_coeff_bypass(ctx->dev->csc, &mmr_adb->csc_regs[5]);
823 817
824 sc_set_hs_coeffs(ctx->dev->sc, ctx->sc_coeff_h.addr, src_w, dst_w); 818 sc_set_hs_coeffs(ctx->dev->sc, ctx->sc_coeff_h.addr, src_w, dst_w);
825 sc_set_vs_coeffs(ctx->dev->sc, ctx->sc_coeff_v.addr, src_h, dst_h); 819 sc_set_vs_coeffs(ctx->dev->sc, ctx->sc_coeff_v.addr, src_h, dst_h);
@@ -942,15 +936,10 @@ static void vpe_dump_regs(struct vpe_dev *dev)
942 DUMPREG(DEI_FMD_STATUS_R0); 936 DUMPREG(DEI_FMD_STATUS_R0);
943 DUMPREG(DEI_FMD_STATUS_R1); 937 DUMPREG(DEI_FMD_STATUS_R1);
944 DUMPREG(DEI_FMD_STATUS_R2); 938 DUMPREG(DEI_FMD_STATUS_R2);
945 DUMPREG(CSC_CSC00);
946 DUMPREG(CSC_CSC01);
947 DUMPREG(CSC_CSC02);
948 DUMPREG(CSC_CSC03);
949 DUMPREG(CSC_CSC04);
950 DUMPREG(CSC_CSC05);
951#undef DUMPREG 939#undef DUMPREG
952 940
953 sc_dump_regs(dev->sc); 941 sc_dump_regs(dev->sc);
942 csc_dump_regs(dev->csc);
954} 943}
955 944
956static void add_out_dtd(struct vpe_ctx *ctx, int port) 945static void add_out_dtd(struct vpe_ctx *ctx, int port)
@@ -2074,6 +2063,12 @@ static int vpe_probe(struct platform_device *pdev)
2074 goto runtime_put; 2063 goto runtime_put;
2075 } 2064 }
2076 2065
2066 dev->csc = csc_create(pdev);
2067 if (IS_ERR(dev->csc)) {
2068 ret = PTR_ERR(dev->csc);
2069 goto runtime_put;
2070 }
2071
2077 dev->vpdma = vpdma_create(pdev); 2072 dev->vpdma = vpdma_create(pdev);
2078 if (IS_ERR(dev->vpdma)) { 2073 if (IS_ERR(dev->vpdma)) {
2079 ret = PTR_ERR(dev->vpdma); 2074 ret = PTR_ERR(dev->vpdma);
diff --git a/drivers/media/platform/ti-vpe/vpe_regs.h b/drivers/media/platform/ti-vpe/vpe_regs.h
index d8dbdd375a7d..74283d79eae1 100644
--- a/drivers/media/platform/ti-vpe/vpe_regs.h
+++ b/drivers/media/platform/ti-vpe/vpe_regs.h
@@ -306,42 +306,4 @@
306#define VPE_FMD_FRAME_DIFF_MASK 0x000fffff 306#define VPE_FMD_FRAME_DIFF_MASK 0x000fffff
307#define VPE_FMD_FRAME_DIFF_SHIFT 0 307#define VPE_FMD_FRAME_DIFF_SHIFT 0
308 308
309/* VPE color space converter regs */
310#define VPE_CSC_CSC00 0x5700
311#define VPE_CSC_A0_MASK 0x1fff
312#define VPE_CSC_A0_SHIFT 0
313#define VPE_CSC_B0_MASK 0x1fff
314#define VPE_CSC_B0_SHIFT 16
315
316#define VPE_CSC_CSC01 0x5704
317#define VPE_CSC_C0_MASK 0x1fff
318#define VPE_CSC_C0_SHIFT 0
319#define VPE_CSC_A1_MASK 0x1fff
320#define VPE_CSC_A1_SHIFT 16
321
322#define VPE_CSC_CSC02 0x5708
323#define VPE_CSC_B1_MASK 0x1fff
324#define VPE_CSC_B1_SHIFT 0
325#define VPE_CSC_C1_MASK 0x1fff
326#define VPE_CSC_C1_SHIFT 16
327
328#define VPE_CSC_CSC03 0x570c
329#define VPE_CSC_A2_MASK 0x1fff
330#define VPE_CSC_A2_SHIFT 0
331#define VPE_CSC_B2_MASK 0x1fff
332#define VPE_CSC_B2_SHIFT 16
333
334#define VPE_CSC_CSC04 0x5710
335#define VPE_CSC_C2_MASK 0x1fff
336#define VPE_CSC_C2_SHIFT 0
337#define VPE_CSC_D0_MASK 0x0fff
338#define VPE_CSC_D0_SHIFT 16
339
340#define VPE_CSC_CSC05 0x5714
341#define VPE_CSC_D1_MASK 0x0fff
342#define VPE_CSC_D1_SHIFT 0
343#define VPE_CSC_D2_MASK 0x0fff
344#define VPE_CSC_D2_SHIFT 16
345#define VPE_CSC_BYPASS (1 << 28)
346
347#endif 309#endif