* [PATCH 0/4] VSP1: Add support for lookup tables
@ 2015-11-16 4:46 Laurent Pinchart
2015-11-16 4:46 ` [PATCH 1/4] v4l: vsp1: Fix LUT format setting Laurent Pinchart
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-16 4:46 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
Hello,
The VSP1 includes two lookup table modules, a 1D LUT and a 3D cubic lookup
table (CLU). This patch series fixes the LUT implementation and adds support
for the CLU.
The patches are based on top of
git://linuxtv.org/media_tree.git master
and have been tested on a Koelsch board.
Laurent Pinchart (4):
v4l: vsp1: Fix LUT format setting
v4l: vsp1: Add Cubic Look Up Table (CLU) support
ARM: Renesas: r8a7790: Enable CLU support in VSPS
ARM: Renesas: r8a7791: Enable CLU support in VSPS
.../devicetree/bindings/media/renesas,vsp1.txt | 3 +
arch/arm/boot/dts/r8a7790.dtsi | 1 +
arch/arm/boot/dts/r8a7791.dtsi | 1 +
drivers/media/platform/vsp1/Makefile | 3 +-
drivers/media/platform/vsp1/vsp1.h | 3 +
drivers/media/platform/vsp1/vsp1_clu.c | 288 +++++++++++++++++++++
drivers/media/platform/vsp1/vsp1_clu.h | 38 +++
drivers/media/platform/vsp1/vsp1_drv.c | 13 +
drivers/media/platform/vsp1/vsp1_entity.c | 1 +
drivers/media/platform/vsp1/vsp1_entity.h | 1 +
drivers/media/platform/vsp1/vsp1_lut.c | 1 +
drivers/media/platform/vsp1/vsp1_regs.h | 9 +
include/uapi/linux/vsp1.h | 25 ++
13 files changed, 386 insertions(+), 1 deletion(-)
create mode 100644 drivers/media/platform/vsp1/vsp1_clu.c
create mode 100644 drivers/media/platform/vsp1/vsp1_clu.h
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/4] v4l: vsp1: Fix LUT format setting
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
@ 2015-11-16 4:46 ` Laurent Pinchart
2015-11-16 4:46 ` [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support Laurent Pinchart
` (3 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-16 4:46 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
The LUT set format handler overrides the requested format by mistake.
Fix it.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
drivers/media/platform/vsp1/vsp1_lut.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/media/platform/vsp1/vsp1_lut.c b/drivers/media/platform/vsp1/vsp1_lut.c
index 656ec272a414..e2c352a7dfd5 100644
--- a/drivers/media/platform/vsp1/vsp1_lut.c
+++ b/drivers/media/platform/vsp1/vsp1_lut.c
@@ -176,6 +176,7 @@ static int lut_set_format(struct v4l2_subdev *subdev, struct v4l2_subdev_pad_con
return 0;
}
+ format->code = fmt->format.code;
format->width = clamp_t(unsigned int, fmt->format.width,
LUT_MIN_SIZE, LUT_MAX_SIZE);
format->height = clamp_t(unsigned int, fmt->format.height,
--
2.4.10
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
2015-11-16 4:46 ` [PATCH 1/4] v4l: vsp1: Fix LUT format setting Laurent Pinchart
@ 2015-11-16 4:46 ` Laurent Pinchart
2015-11-16 6:10 ` kbuild test robot
2015-11-16 4:46 ` [PATCH 3/4] ARM: Renesas: r8a7790: Enable CLU support in VSPS Laurent Pinchart
` (2 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-16 4:46 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
The CLU processing block is a 3D lookup table that converts the input
three color component data into desired three color components using a
lookup table.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
.../devicetree/bindings/media/renesas,vsp1.txt | 3 +
drivers/media/platform/vsp1/Makefile | 3 +-
drivers/media/platform/vsp1/vsp1.h | 3 +
drivers/media/platform/vsp1/vsp1_clu.c | 288 +++++++++++++++++++++
drivers/media/platform/vsp1/vsp1_clu.h | 38 +++
drivers/media/platform/vsp1/vsp1_drv.c | 13 +
drivers/media/platform/vsp1/vsp1_entity.c | 1 +
drivers/media/platform/vsp1/vsp1_entity.h | 1 +
drivers/media/platform/vsp1/vsp1_regs.h | 9 +
include/uapi/linux/vsp1.h | 25 ++
10 files changed, 383 insertions(+), 1 deletion(-)
create mode 100644 drivers/media/platform/vsp1/vsp1_clu.c
create mode 100644 drivers/media/platform/vsp1/vsp1_clu.h
diff --git a/Documentation/devicetree/bindings/media/renesas,vsp1.txt b/Documentation/devicetree/bindings/media/renesas,vsp1.txt
index 87fe08abf36d..72708515a9a6 100644
--- a/Documentation/devicetree/bindings/media/renesas,vsp1.txt
+++ b/Documentation/devicetree/bindings/media/renesas,vsp1.txt
@@ -19,6 +19,8 @@ Required properties:
Optional properties:
+ - renesas,has-clu: Boolean, indicates that the Cubic Look Up Table (CLU)
+ module is available.
- renesas,has-lif: Boolean, indicates that the LCD Interface (LIF) module is
available.
- renesas,has-lut: Boolean, indicates that the Look Up Table (LUT) module is
@@ -35,6 +37,7 @@ Example: R8A7790 (R-Car H2) VSP1-S node
interrupts = <0 267 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&mstp1_clks R8A7790_CLK_VSP1_S>;
+ renesas,has-clu;
renesas,has-lut;
renesas,has-sru;
renesas,#rpf = <5>;
diff --git a/drivers/media/platform/vsp1/Makefile b/drivers/media/platform/vsp1/Makefile
index 6a93f928dfde..ca79d37c160a 100644
--- a/drivers/media/platform/vsp1/Makefile
+++ b/drivers/media/platform/vsp1/Makefile
@@ -1,6 +1,7 @@
vsp1-y := vsp1_drv.o vsp1_entity.o vsp1_video.o
vsp1-y += vsp1_rpf.o vsp1_rwpf.o vsp1_wpf.o
-vsp1-y += vsp1_hsit.o vsp1_lif.o vsp1_lut.o
+vsp1-y += vsp1_clu.o vsp1_hsit.o vsp1_lut.o
vsp1-y += vsp1_bru.o vsp1_sru.o vsp1_uds.o
+vsp1-y += vsp1_lif.o
obj-$(CONFIG_VIDEO_RENESAS_VSP1) += vsp1.o
diff --git a/drivers/media/platform/vsp1/vsp1.h b/drivers/media/platform/vsp1/vsp1.h
index 989e96f7e360..be434b046107 100644
--- a/drivers/media/platform/vsp1/vsp1.h
+++ b/drivers/media/platform/vsp1/vsp1.h
@@ -28,6 +28,7 @@ struct device;
struct vsp1_platform_data;
struct vsp1_bru;
+struct vsp1_clu;
struct vsp1_hsit;
struct vsp1_lif;
struct vsp1_lut;
@@ -42,6 +43,7 @@ struct vsp1_uds;
#define VSP1_HAS_LIF (1 << 0)
#define VSP1_HAS_LUT (1 << 1)
#define VSP1_HAS_SRU (1 << 2)
+#define VSP1_HAS_CLU (1 << 3)
struct vsp1_platform_data {
unsigned int features;
@@ -61,6 +63,7 @@ struct vsp1_device {
int ref_count;
struct vsp1_bru *bru;
+ struct vsp1_clu *clu;
struct vsp1_hsit *hsi;
struct vsp1_hsit *hst;
struct vsp1_lif *lif;
diff --git a/drivers/media/platform/vsp1/vsp1_clu.c b/drivers/media/platform/vsp1/vsp1_clu.c
new file mode 100644
index 000000000000..87226059be65
--- /dev/null
+++ b/drivers/media/platform/vsp1/vsp1_clu.c
@@ -0,0 +1,288 @@
+/*
+ * vsp1_clu.c -- R-Car VSP1 Cubic Look-Up Table
+ *
+ * Copyright (C) 2015 Renesas Corporation
+ *
+ * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/device.h>
+#include <linux/gfp.h>
+#include <linux/vsp1.h>
+
+#include <media/v4l2-subdev.h>
+
+#include "vsp1.h"
+#include "vsp1_clu.h"
+
+#define CLU_MIN_SIZE 4U
+#define CLU_MAX_SIZE 8190U
+
+/* -----------------------------------------------------------------------------
+ * Device Access
+ */
+
+static inline void vsp1_clu_write(struct vsp1_clu *clu, u32 reg, u32 data)
+{
+ vsp1_write(clu->entity.vsp1, reg, data);
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 Subdevice Core Operations
+ */
+
+static int clu_configure(struct vsp1_clu *clu, struct vsp1_clu_config *config)
+{
+ struct vsp1_clu_entry *entries;
+ unsigned int i;
+ int ret;
+
+ if (config->nentries > 17*17*17)
+ return -EINVAL;
+
+ entries = kcalloc(config->nentries, sizeof(*entries), GFP_KERNEL);
+ if (!entries)
+ return -ENOMEM;
+
+ ret = copy_from_user(entries, config->entries,
+ config->nentries * sizeof(*entries));
+ if (ret) {
+ ret = -EFAULT;
+ goto done;
+ }
+
+ for (i = 0; i < config->nentries; ++i) {
+ u32 addr = entries[i].addr;
+ u32 value = entries[i].value;
+
+ if (((addr >> 0) & 0xff) >= 17 ||
+ ((addr >> 8) & 0xff) >= 17 ||
+ ((addr >> 16) & 0xff) >= 17 ||
+ ((addr >> 24) & 0xff) != 0 ||
+ (value & 0xff000000) != 0) {
+ ret = -EINVAL;
+ goto done;
+ }
+
+ vsp1_clu_write(clu, VI6_CLU_ADDR, addr);
+ vsp1_clu_write(clu, VI6_CLU_DATA, value);
+ }
+
+done:
+ kfree(entries);
+ return ret;
+}
+
+static long clu_ioctl(struct v4l2_subdev *subdev, unsigned int cmd, void *arg)
+{
+ struct vsp1_clu *clu = to_clu(subdev);
+
+ switch (cmd) {
+ case VIDIOC_VSP1_CLU_CONFIG:
+ return clu_configure(clu, arg);
+
+ default:
+ return -ENOIOCTLCMD;
+ }
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 Subdevice Video Operations
+ */
+
+static int clu_s_stream(struct v4l2_subdev *subdev, int enable)
+{
+ struct vsp1_clu *clu = to_clu(subdev);
+
+ if (!enable)
+ return 0;
+
+ vsp1_clu_write(clu, VI6_CLU_CTRL, VI6_CLU_CTRL_MVS | VI6_CLU_CTRL_EN);
+
+ return 0;
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 Subdevice Pad Operations
+ */
+
+static int clu_enum_mbus_code(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_mbus_code_enum *code)
+{
+ static const unsigned int codes[] = {
+ MEDIA_BUS_FMT_ARGB8888_1X32,
+ MEDIA_BUS_FMT_AHSV8888_1X32,
+ MEDIA_BUS_FMT_AYUV8_1X32,
+ };
+ struct vsp1_clu *clu = to_clu(subdev);
+ struct v4l2_mbus_framefmt *format;
+
+ if (code->pad == CLU_PAD_SINK) {
+ if (code->index >= ARRAY_SIZE(codes))
+ return -EINVAL;
+
+ code->code = codes[code->index];
+ } else {
+ /* The CLU can't perform format conversion, the sink format is
+ * always identical to the source format.
+ */
+ if (code->index)
+ return -EINVAL;
+
+ format = vsp1_entity_get_pad_format(&clu->entity, cfg,
+ CLU_PAD_SINK, code->which);
+ code->code = format->code;
+ }
+
+ return 0;
+}
+
+static int clu_enum_frame_size(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_frame_size_enum *fse)
+{
+ struct vsp1_clu *clu = to_clu(subdev);
+ struct v4l2_mbus_framefmt *format;
+
+ format = vsp1_entity_get_pad_format(&clu->entity, cfg,
+ fse->pad, fse->which);
+
+ if (fse->index || fse->code != format->code)
+ return -EINVAL;
+
+ if (fse->pad == CLU_PAD_SINK) {
+ fse->min_width = CLU_MIN_SIZE;
+ fse->max_width = CLU_MAX_SIZE;
+ fse->min_height = CLU_MIN_SIZE;
+ fse->max_height = CLU_MAX_SIZE;
+ } else {
+ /* The size on the source pad are fixed and always identical to
+ * the size on the sink pad.
+ */
+ fse->min_width = format->width;
+ fse->max_width = format->width;
+ fse->min_height = format->height;
+ fse->max_height = format->height;
+ }
+
+ return 0;
+}
+
+static int clu_get_format(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_format *fmt)
+{
+ struct vsp1_clu *clu = to_clu(subdev);
+
+ fmt->format = *vsp1_entity_get_pad_format(&clu->entity, cfg, fmt->pad,
+ fmt->which);
+
+ return 0;
+}
+
+static int clu_set_format(struct v4l2_subdev *subdev,
+ struct v4l2_subdev_pad_config *cfg,
+ struct v4l2_subdev_format *fmt)
+{
+ struct vsp1_clu *clu = to_clu(subdev);
+ struct v4l2_mbus_framefmt *format;
+
+ /* Default to YUV if the requested format is not supported. */
+ if (fmt->format.code != MEDIA_BUS_FMT_ARGB8888_1X32 &&
+ fmt->format.code != MEDIA_BUS_FMT_AHSV8888_1X32 &&
+ fmt->format.code != MEDIA_BUS_FMT_AYUV8_1X32)
+ fmt->format.code = MEDIA_BUS_FMT_AYUV8_1X32;
+
+ format = vsp1_entity_get_pad_format(&clu->entity, cfg, fmt->pad,
+ fmt->which);
+
+ if (fmt->pad == CLU_PAD_SOURCE) {
+ /* The CLU output format can't be modified. */
+ fmt->format = *format;
+ return 0;
+ }
+
+ format->code = fmt->format.code;
+ format->width = clamp_t(unsigned int, fmt->format.width,
+ CLU_MIN_SIZE, CLU_MAX_SIZE);
+ format->height = clamp_t(unsigned int, fmt->format.height,
+ CLU_MIN_SIZE, CLU_MAX_SIZE);
+ format->field = V4L2_FIELD_NONE;
+ format->colorspace = V4L2_COLORSPACE_SRGB;
+
+ fmt->format = *format;
+
+ /* Propagate the format to the source pad. */
+ format = vsp1_entity_get_pad_format(&clu->entity, cfg, CLU_PAD_SOURCE,
+ fmt->which);
+ *format = fmt->format;
+
+ return 0;
+}
+
+/* -----------------------------------------------------------------------------
+ * V4L2 Subdevice Operations
+ */
+
+static struct v4l2_subdev_core_ops clu_core_ops = {
+ .ioctl = clu_ioctl,
+};
+
+static struct v4l2_subdev_video_ops clu_video_ops = {
+ .s_stream = clu_s_stream,
+};
+
+static struct v4l2_subdev_pad_ops clu_pad_ops = {
+ .enum_mbus_code = clu_enum_mbus_code,
+ .enum_frame_size = clu_enum_frame_size,
+ .get_fmt = clu_get_format,
+ .set_fmt = clu_set_format,
+};
+
+static struct v4l2_subdev_ops clu_ops = {
+ .core = &clu_core_ops,
+ .video = &clu_video_ops,
+ .pad = &clu_pad_ops,
+};
+
+/* -----------------------------------------------------------------------------
+ * Initialization and Cleanup
+ */
+
+struct vsp1_clu *vsp1_clu_create(struct vsp1_device *vsp1)
+{
+ struct v4l2_subdev *subdev;
+ struct vsp1_clu *clu;
+ int ret;
+
+ clu = devm_kzalloc(vsp1->dev, sizeof(*clu), GFP_KERNEL);
+ if (clu == NULL)
+ return ERR_PTR(-ENOMEM);
+
+ clu->entity.type = VSP1_ENTITY_CLU;
+
+ ret = vsp1_entity_init(vsp1, &clu->entity, 2);
+ if (ret < 0)
+ return ERR_PTR(ret);
+
+ /* Initialize the V4L2 subdev. */
+ subdev = &clu->entity.subdev;
+ v4l2_subdev_init(subdev, &clu_ops);
+
+ subdev->entity.ops = &vsp1_media_ops;
+ subdev->internal_ops = &vsp1_subdev_internal_ops;
+ snprintf(subdev->name, sizeof(subdev->name), "%s clu",
+ dev_name(vsp1->dev));
+ v4l2_set_subdevdata(subdev, clu);
+ subdev->flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;
+
+ vsp1_entity_init_formats(subdev, NULL);
+
+ return clu;
+}
diff --git a/drivers/media/platform/vsp1/vsp1_clu.h b/drivers/media/platform/vsp1/vsp1_clu.h
new file mode 100644
index 000000000000..4b69b7418c69
--- /dev/null
+++ b/drivers/media/platform/vsp1/vsp1_clu.h
@@ -0,0 +1,38 @@
+/*
+ * vsp1_clu.h -- R-Car VSP1 Cubic Look-Up Table
+ *
+ * Copyright (C) 2015 Renesas Corporation
+ *
+ * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+#ifndef __VSP1_CLU_H__
+#define __VSP1_CLU_H__
+
+#include <media/media-entity.h>
+#include <media/v4l2-subdev.h>
+
+#include "vsp1_entity.h"
+
+struct vsp1_device;
+
+#define CLU_PAD_SINK 0
+#define CLU_PAD_SOURCE 1
+
+struct vsp1_clu {
+ struct vsp1_entity entity;
+ u32 clu[256];
+};
+
+static inline struct vsp1_clu *to_clu(struct v4l2_subdev *subdev)
+{
+ return container_of(subdev, struct vsp1_clu, entity.subdev);
+}
+
+struct vsp1_clu *vsp1_clu_create(struct vsp1_device *vsp1);
+
+#endif /* __VSP1_CLU_H__ */
diff --git a/drivers/media/platform/vsp1/vsp1_drv.c b/drivers/media/platform/vsp1/vsp1_drv.c
index 4e61886384e3..d0c8812fbb7a 100644
--- a/drivers/media/platform/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/vsp1/vsp1_drv.c
@@ -22,6 +22,7 @@
#include "vsp1.h"
#include "vsp1_bru.h"
+#include "vsp1_clu.h"
#include "vsp1_hsit.h"
#include "vsp1_lif.h"
#include "vsp1_lut.h"
@@ -165,6 +166,16 @@ static int vsp1_create_entities(struct vsp1_device *vsp1)
list_add_tail(&vsp1->bru->entity.list_dev, &vsp1->entities);
+ if (vsp1->pdata.features & VSP1_HAS_CLU) {
+ vsp1->clu = vsp1_clu_create(vsp1);
+ if (IS_ERR(vsp1->clu)) {
+ ret = PTR_ERR(vsp1->clu);
+ goto done;
+ }
+
+ list_add_tail(&vsp1->clu->entity.list_dev, &vsp1->entities);
+ }
+
vsp1->hsi = vsp1_hsit_create(vsp1, true);
if (IS_ERR(vsp1->hsi)) {
ret = PTR_ERR(vsp1->hsi);
@@ -440,6 +451,8 @@ static int vsp1_parse_dt(struct vsp1_device *vsp1)
struct device_node *np = vsp1->dev->of_node;
struct vsp1_platform_data *pdata = &vsp1->pdata;
+ if (of_property_read_bool(np, "renesas,has-clu"))
+ pdata->features |= VSP1_HAS_CLU;
if (of_property_read_bool(np, "renesas,has-lif"))
pdata->features |= VSP1_HAS_LIF;
if (of_property_read_bool(np, "renesas,has-lut"))
diff --git a/drivers/media/platform/vsp1/vsp1_entity.c b/drivers/media/platform/vsp1/vsp1_entity.c
index fd95a75b04f4..08cc6caec047 100644
--- a/drivers/media/platform/vsp1/vsp1_entity.c
+++ b/drivers/media/platform/vsp1/vsp1_entity.c
@@ -160,6 +160,7 @@ static const struct vsp1_route vsp1_routes[] = {
{ VSP1_ENTITY_BRU, 0, VI6_DPR_BRU_ROUTE,
{ VI6_DPR_NODE_BRU_IN(0), VI6_DPR_NODE_BRU_IN(1),
VI6_DPR_NODE_BRU_IN(2), VI6_DPR_NODE_BRU_IN(3), } },
+ { VSP1_ENTITY_CLU, 0, VI6_DPR_CLU_ROUTE, { VI6_DPR_NODE_CLU, } },
{ VSP1_ENTITY_HSI, 0, VI6_DPR_HSI_ROUTE, { VI6_DPR_NODE_HSI, } },
{ VSP1_ENTITY_HST, 0, VI6_DPR_HST_ROUTE, { VI6_DPR_NODE_HST, } },
{ VSP1_ENTITY_LIF, 0, 0, { VI6_DPR_NODE_LIF, } },
diff --git a/drivers/media/platform/vsp1/vsp1_entity.h b/drivers/media/platform/vsp1/vsp1_entity.h
index 8867a5787c28..f2f8fc7f32dc 100644
--- a/drivers/media/platform/vsp1/vsp1_entity.h
+++ b/drivers/media/platform/vsp1/vsp1_entity.h
@@ -23,6 +23,7 @@ struct vsp1_video;
enum vsp1_entity_type {
VSP1_ENTITY_BRU,
+ VSP1_ENTITY_CLU,
VSP1_ENTITY_HSI,
VSP1_ENTITY_HST,
VSP1_ENTITY_LIF,
diff --git a/drivers/media/platform/vsp1/vsp1_regs.h b/drivers/media/platform/vsp1/vsp1_regs.h
index 25b48738b147..57c66bd95bbf 100644
--- a/drivers/media/platform/vsp1/vsp1_regs.h
+++ b/drivers/media/platform/vsp1/vsp1_regs.h
@@ -434,6 +434,15 @@
*/
#define VI6_CLU_CTRL 0x2900
+#define VI6_CLU_CTRL_AAI (1 << 28)
+#define VI6_CLU_CTRL_MVS (1 << 24)
+#define VI6_CLU_CTRL_AX1I_2D (3 << 14)
+#define VI6_CLU_CTRL_AX2I_2D (1 << 12)
+#define VI6_CLU_CTRL_OS0_2D (3 << 8)
+#define VI6_CLU_CTRL_OS1_2D (1 << 6)
+#define VI6_CLU_CTRL_OS2_2D (3 << 4)
+#define VI6_CLU_CTRL_M2D (1 << 1)
+#define VI6_CLU_CTRL_EN (1 << 0)
/* -----------------------------------------------------------------------------
* HST Control Registers
diff --git a/include/uapi/linux/vsp1.h b/include/uapi/linux/vsp1.h
index 9a823696d816..f8360dca0769 100644
--- a/include/uapi/linux/vsp1.h
+++ b/include/uapi/linux/vsp1.h
@@ -22,13 +22,38 @@
* Private IOCTLs
*
* VIDIOC_VSP1_LUT_CONFIG - Configure the lookup table
+ *
+ * VIDIOC_VSP1_CLU_CONFIG - Configure the 3D lookup table
+ * @nentries: number of entries in the entries array
+ * @entries: CLU entries
+ *
+ * Each CLU entry is identified by an address and has a value. The address is
+ * split in 4 bytes ; the MSB must be set to 0 and all 3 other bytes set to
+ * values between 0 and 16 inclusive. The value must be in the range 0x00000000
+ * to 0x00ffffff.
+ *
+ * The number of entries is limited to 17*17*17. If the number of entries or the
+ * address or value of an entry is invalid the ioctl will return -EINVAL.
+ * Otherwise it will program the hardware with the entries and return 0.
*/
#define VIDIOC_VSP1_LUT_CONFIG \
_IOWR('V', BASE_VIDIOC_PRIVATE + 1, struct vsp1_lut_config)
+#define VIDIOC_VSP1_CLU_CONFIG \
+ _IOWR('V', BASE_VIDIOC_PRIVATE + 2, struct vsp1_clu_config)
struct vsp1_lut_config {
__u32 lut[256];
};
+struct vsp1_clu_entry {
+ __u32 addr;
+ __u32 value;
+};
+
+struct vsp1_clu_config {
+ __u32 nentries;
+ struct vsp1_clu_entry __user *entries;
+};
+
#endif /* __VSP1_USER_H__ */
--
2.4.10
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 3/4] ARM: Renesas: r8a7790: Enable CLU support in VSPS
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
2015-11-16 4:46 ` [PATCH 1/4] v4l: vsp1: Fix LUT format setting Laurent Pinchart
2015-11-16 4:46 ` [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support Laurent Pinchart
@ 2015-11-16 4:46 ` Laurent Pinchart
2015-11-16 4:46 ` [PATCH 4/4] ARM: Renesas: r8a7791: " Laurent Pinchart
2015-11-24 2:41 ` [PATCH 0/4] VSP1: Add support for lookup tables Simon Horman
4 siblings, 0 replies; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-16 4:46 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
The VSPS includes a CLU module, describe it in DT.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
arch/arm/boot/dts/r8a7790.dtsi | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/boot/dts/r8a7790.dtsi b/arch/arm/boot/dts/r8a7790.dtsi
index a0b2a79cbfbd..4e75b8df09e3 100644
--- a/arch/arm/boot/dts/r8a7790.dtsi
+++ b/arch/arm/boot/dts/r8a7790.dtsi
@@ -832,6 +832,7 @@
clocks = <&mstp1_clks R8A7790_CLK_VSP1_S>;
power-domains = <&cpg_clocks>;
+ renesas,has-clu;
renesas,has-lut;
renesas,has-sru;
renesas,#rpf = <5>;
--
2.4.10
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH 4/4] ARM: Renesas: r8a7791: Enable CLU support in VSPS
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
` (2 preceding siblings ...)
2015-11-16 4:46 ` [PATCH 3/4] ARM: Renesas: r8a7790: Enable CLU support in VSPS Laurent Pinchart
@ 2015-11-16 4:46 ` Laurent Pinchart
2015-11-24 2:41 ` [PATCH 0/4] VSP1: Add support for lookup tables Simon Horman
4 siblings, 0 replies; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-16 4:46 UTC (permalink / raw)
To: linux-media; +Cc: linux-sh
The VSPS includes a CLU module, describe it in DT.
Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
---
arch/arm/boot/dts/r8a7791.dtsi | 1 +
1 file changed, 1 insertion(+)
diff --git a/arch/arm/boot/dts/r8a7791.dtsi b/arch/arm/boot/dts/r8a7791.dtsi
index 831525dd39a6..fc2a1b10c1af 100644
--- a/arch/arm/boot/dts/r8a7791.dtsi
+++ b/arch/arm/boot/dts/r8a7791.dtsi
@@ -873,6 +873,7 @@
clocks = <&mstp1_clks R8A7791_CLK_VSP1_S>;
power-domains = <&cpg_clocks>;
+ renesas,has-clu;
renesas,has-lut;
renesas,has-sru;
renesas,#rpf = <5>;
--
2.4.10
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support
2015-11-16 4:46 ` [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support Laurent Pinchart
@ 2015-11-16 6:10 ` kbuild test robot
0 siblings, 0 replies; 8+ messages in thread
From: kbuild test robot @ 2015-11-16 6:10 UTC (permalink / raw)
To: Laurent Pinchart; +Cc: kbuild-all, linux-media, linux-sh
[-- Attachment #1: Type: text/plain, Size: 2498 bytes --]
Hi Laurent,
[auto build test ERROR on: renesas/next]
[also build test ERROR on: v4.4-rc1 next-20151116]
url: https://github.com/0day-ci/linux/commits/Laurent-Pinchart/VSP1-Add-support-for-lookup-tables/20151116-124808
base: https://git.kernel.org/pub/scm/linux/kernel/git/horms/renesas.git next
config: x86_64-randconfig-s5-11161354 (attached as .config)
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All error/warnings (new ones prefixed by >>):
drivers/media/platform/vsp1/vsp1_clu.c: In function 'clu_configure':
>> drivers/media/platform/vsp1/vsp1_clu.c:48:12: error: implicit declaration of function 'kcalloc' [-Werror=implicit-function-declaration]
entries = kcalloc(config->nentries, sizeof(*entries), GFP_KERNEL);
^
>> drivers/media/platform/vsp1/vsp1_clu.c:48:10: warning: assignment makes pointer from integer without a cast [-Wint-conversion]
entries = kcalloc(config->nentries, sizeof(*entries), GFP_KERNEL);
^
>> drivers/media/platform/vsp1/vsp1_clu.c:77:2: error: implicit declaration of function 'kfree' [-Werror=implicit-function-declaration]
kfree(entries);
^
cc1: some warnings being treated as errors
vim +/kcalloc +48 drivers/media/platform/vsp1/vsp1_clu.c
42 unsigned int i;
43 int ret;
44
45 if (config->nentries > 17*17*17)
46 return -EINVAL;
47
> 48 entries = kcalloc(config->nentries, sizeof(*entries), GFP_KERNEL);
49 if (!entries)
50 return -ENOMEM;
51
52 ret = copy_from_user(entries, config->entries,
53 config->nentries * sizeof(*entries));
54 if (ret) {
55 ret = -EFAULT;
56 goto done;
57 }
58
59 for (i = 0; i < config->nentries; ++i) {
60 u32 addr = entries[i].addr;
61 u32 value = entries[i].value;
62
63 if (((addr >> 0) & 0xff) >= 17 ||
64 ((addr >> 8) & 0xff) >= 17 ||
65 ((addr >> 16) & 0xff) >= 17 ||
66 ((addr >> 24) & 0xff) != 0 ||
67 (value & 0xff000000) != 0) {
68 ret = -EINVAL;
69 goto done;
70 }
71
72 vsp1_clu_write(clu, VI6_CLU_ADDR, addr);
73 vsp1_clu_write(clu, VI6_CLU_DATA, value);
74 }
75
76 done:
> 77 kfree(entries);
78 return ret;
79 }
80
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/octet-stream, Size: 22681 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/4] VSP1: Add support for lookup tables
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
` (3 preceding siblings ...)
2015-11-16 4:46 ` [PATCH 4/4] ARM: Renesas: r8a7791: " Laurent Pinchart
@ 2015-11-24 2:41 ` Simon Horman
2015-11-24 23:50 ` Laurent Pinchart
4 siblings, 1 reply; 8+ messages in thread
From: Simon Horman @ 2015-11-24 2:41 UTC (permalink / raw)
To: Laurent Pinchart; +Cc: linux-media, linux-sh
On Mon, Nov 16, 2015 at 06:46:41AM +0200, Laurent Pinchart wrote:
> Hello,
>
> The VSP1 includes two lookup table modules, a 1D LUT and a 3D cubic lookup
> table (CLU). This patch series fixes the LUT implementation and adds support
> for the CLU.
>
> The patches are based on top of
>
> git://linuxtv.org/media_tree.git master
>
> and have been tested on a Koelsch board.
>
> Laurent Pinchart (4):
> v4l: vsp1: Fix LUT format setting
> v4l: vsp1: Add Cubic Look Up Table (CLU) support
> ARM: Renesas: r8a7790: Enable CLU support in VSPS
> ARM: Renesas: r8a7791: Enable CLU support in VSPS
I marked the "ARM: Renesas:" patches as deferred pending the binding
being accepted.
I know we are moving towards "Renesas:" but could you stick to "shmobile"
for now?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH 0/4] VSP1: Add support for lookup tables
2015-11-24 2:41 ` [PATCH 0/4] VSP1: Add support for lookup tables Simon Horman
@ 2015-11-24 23:50 ` Laurent Pinchart
0 siblings, 0 replies; 8+ messages in thread
From: Laurent Pinchart @ 2015-11-24 23:50 UTC (permalink / raw)
To: Simon Horman; +Cc: Laurent Pinchart, linux-media, linux-sh
Hi Simon,
On Tuesday 24 November 2015 11:41:52 Simon Horman wrote:
> On Mon, Nov 16, 2015 at 06:46:41AM +0200, Laurent Pinchart wrote:
> > Hello,
> >
> > The VSP1 includes two lookup table modules, a 1D LUT and a 3D cubic lookup
> > table (CLU). This patch series fixes the LUT implementation and adds
> > support for the CLU.
> >
> > The patches are based on top of
> >
> > git://linuxtv.org/media_tree.git master
> >
> > and have been tested on a Koelsch board.
> >
> > Laurent Pinchart (4):
> > v4l: vsp1: Fix LUT format setting
> > v4l: vsp1: Add Cubic Look Up Table (CLU) support
> > ARM: Renesas: r8a7790: Enable CLU support in VSPS
> > ARM: Renesas: r8a7791: Enable CLU support in VSPS
>
> I marked the "ARM: Renesas:" patches as deferred pending the binding
> being accepted.
I'll resend the patches once the dependencies will be accepted.
> I know we are moving towards "Renesas:" but could you stick to "shmobile"
> for now?
Sure.
--
Regards,
Laurent Pinchart
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2015-11-24 23:50 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-11-16 4:46 [PATCH 0/4] VSP1: Add support for lookup tables Laurent Pinchart
2015-11-16 4:46 ` [PATCH 1/4] v4l: vsp1: Fix LUT format setting Laurent Pinchart
2015-11-16 4:46 ` [PATCH 2/4] v4l: vsp1: Add Cubic Look Up Table (CLU) support Laurent Pinchart
2015-11-16 6:10 ` kbuild test robot
2015-11-16 4:46 ` [PATCH 3/4] ARM: Renesas: r8a7790: Enable CLU support in VSPS Laurent Pinchart
2015-11-16 4:46 ` [PATCH 4/4] ARM: Renesas: r8a7791: " Laurent Pinchart
2015-11-24 2:41 ` [PATCH 0/4] VSP1: Add support for lookup tables Simon Horman
2015-11-24 23:50 ` Laurent Pinchart
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox