Re: [RFC 2/3] rcar_vin: add devicetree support

2014-03-31 Thread Sergei Shtylyov

Hello.

On 31-03-2014 1:26, Ben Dooks wrote:


Add support for devicetree probe for the rcar-vin
driver.



Signed-off-by: Ben Dooks ben.do...@codethink.co.uk
---
  .../devicetree/bindings/media/rcar_vin.txt | 79 ++
  drivers/media/platform/soc_camera/rcar_vin.c   | 67 --
  2 files changed, 140 insertions(+), 6 deletions(-)
  create mode 100644 Documentation/devicetree/bindings/media/rcar_vin.txt



diff --git a/Documentation/devicetree/bindings/media/rcar_vin.txt 
b/Documentation/devicetree/bindings/media/rcar_vin.txt
new file mode 100644
index 000..105b8de
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/rcar_vin.txt
@@ -0,0 +1,79 @@
+Renesas RCar Video Input driver (rcar_vin)
+--
+
+The rcar_vin device provides video input capabilities for the Renesas R-Car
+family of devices. The current blocks are always slaves and suppot one input
+channel which can be either RGB, YUYV or BT656.
+
+ - compatible: Must be one of the following
+   - renesas,vin-r8a7791 for the R8A7791 device
+   - renesas,vin-r8a7790 for the R8A7790 device
+   - renesas,vin-r8a7779 for the R8A7779 device
+   - renesas,vin-r8a7778 for the R8A7778 device
+ - reg: the register base and size for the device registers


   Register base of the registers?

[...]

+/* composite video input */
+vin1 {
+pinctrl-0 = vin1_pins;
+pinctrl-names = default;
+
+status = ok;
+
+port {
+#address-cells = 1;


   Where is this used? I don't see reg prop in the sub-node...


+#size-cells = 0;
+
+vin1ep0: endpoint {
+remote-endpoint = adv7180_1;
+bus-width = 8;
+};
+};
+};
+
+
+
+[1] video-interfaces.txt common video media interface
diff --git a/drivers/media/platform/soc_camera/rcar_vin.c 
b/drivers/media/platform/soc_camera/rcar_vin.c
index 47516df..73c56c7 100644
--- a/drivers/media/platform/soc_camera/rcar_vin.c
+++ b/drivers/media/platform/soc_camera/rcar_vin.c

[...]

@@ -1392,6 +1395,17 @@ static struct soc_camera_host_ops rcar_vin_host_ops = {
.init_videobuf2 = rcar_vin_init_videobuf2,
  };

+#ifdef CONFIG_OF


   I don't think it's worth using this #ifdef -- the OF code is not under 
#ifdef anyway...



+static struct of_device_id rcar_vin_of_table[] = {
+   { .compatible = renesas,vin-r8a7791, .data = (void *)RCAR_GEN2 },
+   { .compatible = renesas,vin-r8a7790, .data = (void *)RCAR_GEN2 },
+   { .compatible = renesas,vin-r8a7779, .data = (void *)RCAR_H1 },
+   { .compatible = renesas,vin-r8a7778, .data = (void *)RCAR_M1 },
+   { },
+};
+MODULE_DEVICE_TABLE(of, rcar_vin_of_table);
+#endif
+
  static struct platform_device_id rcar_vin_id_table[] = {
{ r8a7791-vin,  RCAR_GEN2 },
{ r8a7790-vin,  RCAR_GEN2 },
@@ -1404,15 +1418,50 @@ MODULE_DEVICE_TABLE(platform, rcar_vin_id_table);

  static int rcar_vin_probe(struct platform_device *pdev)
  {
+   const struct of_device_id *match = NULL;
struct rcar_vin_priv *priv;
struct resource *mem;
struct rcar_vin_platform_data *pdata;
+   unsigned int pdata_flags;
int irq, ret;

-   pdata = pdev-dev.platform_data;
-   if (!pdata || !pdata-flags) {
-   dev_err(pdev-dev, platform data not set\n);
-   return -EINVAL;
+   if (pdev-dev.of_node) {
+   struct v4l2_of_endpoint ep;
+   struct device_node *np;
+
+   match = of_match_device(of_match_ptr(rcar_vin_of_table),
+   pdev-dev);
+
+   np = v4l2_of_get_next_endpoint(pdev-dev.of_node, NULL);
+   if (!np) {
+   dev_err(pdev-dev, could not find endpoint\n);
+   return -EINVAL;
+   }
+
+   ret = v4l2_of_parse_endpoint(np, ep);
+   if (ret) {
+   dev_err(pdev-dev, could not parse endpoint\n);
+   return ret;
+   }
+
+   if (ep.bus_type == V4L2_MBUS_BT656)
+   pdata_flags = RCAR_VIN_BT656;
+   else {


   Need {} in all arms of this *if* statement.

[...]

@@ -1447,8 +1496,13 @@ static int rcar_vin_probe(struct platform_device *pdev)
priv-ici.drv_name = dev_name(pdev-dev);
priv-ici.ops = rcar_vin_host_ops;

-   priv-pdata_flags = pdata-flags;
-   priv-chip = pdev-id_entry-driver_data;
+   priv-pdata_flags = pdata_flags;
+   if (!match)
+   priv-chip = pdev-id_entry-driver_data;
+   else
+   priv-chip = (enum chip_id)match-data;
+
+


   Too many empty lines.


@@ -1489,6 +1543,7 @@ static struct platform_driver rcar_vin_driver = {
.driver = {
.name   = DRV_NAME,
.owner  = THIS_MODULE,
+   .of_match_table = 

[RFC 2/3] rcar_vin: add devicetree support

2014-03-30 Thread Ben Dooks
Add support for devicetree probe for the rcar-vin
driver.

Signed-off-by: Ben Dooks ben.do...@codethink.co.uk
---
 .../devicetree/bindings/media/rcar_vin.txt | 79 ++
 drivers/media/platform/soc_camera/rcar_vin.c   | 67 --
 2 files changed, 140 insertions(+), 6 deletions(-)
 create mode 100644 Documentation/devicetree/bindings/media/rcar_vin.txt

diff --git a/Documentation/devicetree/bindings/media/rcar_vin.txt 
b/Documentation/devicetree/bindings/media/rcar_vin.txt
new file mode 100644
index 000..105b8de
--- /dev/null
+++ b/Documentation/devicetree/bindings/media/rcar_vin.txt
@@ -0,0 +1,79 @@
+Renesas RCar Video Input driver (rcar_vin)
+--
+
+The rcar_vin device provides video input capabilities for the Renesas R-Car
+family of devices. The current blocks are always slaves and suppot one input
+channel which can be either RGB, YUYV or BT656.
+
+ - compatible: Must be one of the following
+   - renesas,vin-r8a7791 for the R8A7791 device
+   - renesas,vin-r8a7790 for the R8A7790 device
+   - renesas,vin-r8a7779 for the R8A7779 device
+   - renesas,vin-r8a7778 for the R8A7778 device
+ - reg: the register base and size for the device registers
+ - interrupts: the interrupt for the device
+ - clocks: Reference to the parent clock
+
+The per-board settings:
+ - port sub-node describing a single endpoint connected to the vin
+   as described in video-interfaces.txt[1]. Only the first one will
+   be considered as each vin interface has one input port.
+
+   These settings are used to work out video input format and widths
+   into the system.
+
+
+Device node example
+---
+
+vin0: vin@0xe6ef {
+compatible = renesas,vin-r8a7790;
+clocks = mstp8_clks R8A7790_CLK_VIN0;
+reg = 0 0xe6ef 0 0x1000;
+interrupts = 0 188 IRQ_TYPE_LEVEL_HIGH;
+status = disabled;
+};
+
+Board setup example (vin1 composite video input)
+
+
+i2c2   {
+status = ok;
+pinctrl-0 = i2c2_pins;
+pinctrl-names = default;
+
+adv7180: adv7180@0x20 {
+compatible = adi,adv7180;
+reg = 0x20;
+remote = vin1;
+
+port {
+adv7180_1: endpoint {
+bus-width = 8;
+remote-endpoint = vin1ep0;
+};
+};
+};
+};
+
+/* composite video input */
+vin1 {
+pinctrl-0 = vin1_pins;
+pinctrl-names = default;
+
+status = ok;
+
+port {
+#address-cells = 1;
+#size-cells = 0;
+
+vin1ep0: endpoint {
+remote-endpoint = adv7180_1;
+bus-width = 8;
+};
+};
+};
+
+
+
+[1] video-interfaces.txt common video media interface
diff --git a/drivers/media/platform/soc_camera/rcar_vin.c 
b/drivers/media/platform/soc_camera/rcar_vin.c
index 47516df..73c56c7 100644
--- a/drivers/media/platform/soc_camera/rcar_vin.c
+++ b/drivers/media/platform/soc_camera/rcar_vin.c
@@ -24,6 +24,8 @@
 #include linux/pm_runtime.h
 #include linux/slab.h
 #include linux/videodev2.h
+#include linux/of.h
+#include linux/of_device.h
 
 #include media/soc_camera.h
 #include media/soc_mediabus.h
@@ -32,6 +34,7 @@
 #include media/v4l2-device.h
 #include media/v4l2-mediabus.h
 #include media/v4l2-subdev.h
+#include media/v4l2-of.h
 #include media/videobuf2-dma-contig.h
 
 #include soc_scale_crop.h
@@ -1392,6 +1395,17 @@ static struct soc_camera_host_ops rcar_vin_host_ops = {
.init_videobuf2 = rcar_vin_init_videobuf2,
 };
 
+#ifdef CONFIG_OF
+static struct of_device_id rcar_vin_of_table[] = {
+   { .compatible = renesas,vin-r8a7791, .data = (void *)RCAR_GEN2 },
+   { .compatible = renesas,vin-r8a7790, .data = (void *)RCAR_GEN2 },
+   { .compatible = renesas,vin-r8a7779, .data = (void *)RCAR_H1 },
+   { .compatible = renesas,vin-r8a7778, .data = (void *)RCAR_M1 },
+   { },
+};
+MODULE_DEVICE_TABLE(of, rcar_vin_of_table);
+#endif
+
 static struct platform_device_id rcar_vin_id_table[] = {
{ r8a7791-vin,  RCAR_GEN2 },
{ r8a7790-vin,  RCAR_GEN2 },
@@ -1404,15 +1418,50 @@ MODULE_DEVICE_TABLE(platform, rcar_vin_id_table);
 
 static int rcar_vin_probe(struct platform_device *pdev)
 {
+   const struct of_device_id *match = NULL;
struct rcar_vin_priv *priv;
struct resource *mem;
struct rcar_vin_platform_data *pdata;
+   unsigned int pdata_flags;
int irq, ret;
 
-   pdata = pdev-dev.platform_data;
-   if (!pdata || !pdata-flags) {
-   dev_err(pdev-dev, platform data not set\n);
-   return -EINVAL;
+   if (pdev-dev.of_node) {
+   struct v4l2_of_endpoint ep;
+   

Re: [RFC 2/3] rcar_vin: add devicetree support

2014-03-30 Thread Ben Dooks

On 30/03/14 22:26, Ben Dooks wrote:

Add support for devicetree probe for the rcar-vin
driver.


Sorry, this was an older branch and needed
a fix for the pdev-id field.


--
Ben Dooks   http://www.codethink.co.uk/
Senior Engineer Codethink - Providing Genius
--
To unsubscribe from this list: send the line unsubscribe linux-media in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html