Hello,
Gentle ping. I'll send a pull request in a week if I don't receive any comment
on the DT bindings in the meantime.
On Wednesday 05 March 2014 20:30:27 Laurent Pinchart wrote:
Signed-off-by: Laurent Pinchart laurent.pinchart+rene...@ideasonboard.com
---
.../devicetree/bindings/media/renesas,vsp1.txt | 51 +++
drivers/media/platform/vsp1/vsp1_drv.c | 52 +++
2 files changed, 95 insertions(+), 8 deletions(-)
create mode 100644 Documentation/devicetree/bindings/media/renesas,vsp1.txt
(With the DT mailing list CC'ed this time, sorry about that)
diff --git a/Documentation/devicetree/bindings/media/renesas,vsp1.txt
b/Documentation/devicetree/bindings/media/renesas,vsp1.txt new file mode
100644
index 000..3b828d4
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/renesas,vsp1.txt
@@ -0,0 +1,51 @@
+* Renesas VSP1 Video Processing Engine
+
+The VSP1 is a video processing engine that supports up-/down-scaling, alpha
+blending, color space conversion and various other image processing
features.
+It can be found in the Renesas R-Car second generation SoCs.
+
+Required properties:
+
+ - compatible: Must contain renesas,vsp1
+
+ - reg: Base address and length of the registers block for the VSP1.
+ - interrupt-parent, interrupts: Specifier for the VSP1 interrupt.
+
+ - clocks: A list of phandle + clock-specifier pairs for the main VSP1
clock
+and the optional auxiliary RT clock if needed. VSP1 instances that need
an
+auxiliary RT clock must specify the clock-names property.
+
+ - renesas,#rpf: Number of Read Pixel Formatter (RPF) modules in the VSP1.
+ - renesas,#uds: Number of Up Down Scaler (UDS) modules in the VSP1.
+ - renesas,#wpf: Number of Write Pixel Formatter (WPF) modules in the
VSP1.
+
+
+Optional properties:
+
+ - clock-names: When the VSP1 requires an auxiliary RT clock this property
+must be present and must contain , rt.
+
+ - 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
+available.
+ - renesas,has-sru: Boolean, indicates that the Super Resolution Unit
(SRU)
+module is available.
+
+
+Example: R8A7790 (R-Car H2) VSP1-S node
+
+ vsp1@fe928000 {
+ compatible = renesas,vsp1;
+ reg = 0 0xfe928000 0 0x8000;
+ interrupts = 0 267 IRQ_TYPE_LEVEL_HIGH;
+ clocks = mstp1_clks R8A7790_CLK_VSP1_SY,
+ mstp1_clks R8A7790_CLK_VSP1_RT;
+ clock-names = , rt;
+
+ renesas,has-lut;
+ renesas,has-sru;
+ renesas,#rpf = 5;
+ renesas,#uds = 3;
+ renesas,#wpf = 4;
+ };
diff --git a/drivers/media/platform/vsp1/vsp1_drv.c
b/drivers/media/platform/vsp1/vsp1_drv.c index 5f774cc..b75ca84 100644
--- a/drivers/media/platform/vsp1/vsp1_drv.c
+++ b/drivers/media/platform/vsp1/vsp1_drv.c
@@ -16,6 +16,7 @@
#include linux/device.h
#include linux/interrupt.h
#include linux/module.h
+#include linux/of.h
#include linux/platform_device.h
#include linux/videodev2.h
@@ -458,34 +459,59 @@ static const struct dev_pm_ops vsp1_pm_ops = {
* Platform Driver
*/
-static struct vsp1_platform_data *
-vsp1_get_platform_data(struct platform_device *pdev)
+static int vsp1_validate_platform_data(struct platform_device *pdev,
+struct vsp1_platform_data *pdata)
{
- struct vsp1_platform_data *pdata = pdev-dev.platform_data;
-
if (pdata == NULL) {
dev_err(pdev-dev, missing platform data\n);
- return NULL;
+ return -EINVAL;
}
if (pdata-rpf_count = 0 || pdata-rpf_count VPS1_MAX_RPF) {
dev_err(pdev-dev, invalid number of RPF (%u)\n,
pdata-rpf_count);
- return NULL;
+ return -EINVAL;
}
if (pdata-uds_count = 0 || pdata-uds_count VPS1_MAX_UDS) {
dev_err(pdev-dev, invalid number of UDS (%u)\n,
pdata-uds_count);
- return NULL;
+ return -EINVAL;
}
if (pdata-wpf_count = 0 || pdata-wpf_count VPS1_MAX_WPF) {
dev_err(pdev-dev, invalid number of WPF (%u)\n,
pdata-wpf_count);
- return NULL;
+ return -EINVAL;
}
+ return 0;
+}
+
+static struct vsp1_platform_data *
+vsp1_get_platform_data(struct platform_device *pdev)
+{
+ struct device_node *np = pdev-dev.of_node;
+ struct vsp1_platform_data *pdata;
+
+ if (!IS_ENABLED(CONFIG_OF) || np == NULL)
+ return pdev-dev.platform_data;
+
+ pdata = devm_kzalloc(pdev-dev, sizeof(*pdata), GFP_KERNEL);
+ if (pdata == NULL)
+ return NULL;
+
+ if