aboutsummaryrefslogtreecommitdiffstats
path: root/meta-rcar-gen3-adas/recipes-kernel/linux
diff options
context:
space:
mode:
Diffstat (limited to 'meta-rcar-gen3-adas/recipes-kernel/linux')
-rw-r--r--meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0030-Gen3-LVDS-cameras.patch239
-rw-r--r--meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0040-arm64-dts-renesas-add-ADAS-boards.patch357
-rw-r--r--meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas_4.9.bbappend1
3 files changed, 405 insertions, 192 deletions
diff --git a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0030-Gen3-LVDS-cameras.patch b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0030-Gen3-LVDS-cameras.patch
index aca7198..781e456 100644
--- a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0030-Gen3-LVDS-cameras.patch
+++ b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0030-Gen3-LVDS-cameras.patch
@@ -11,20 +11,20 @@ Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
---
drivers/media/i2c/soc_camera/Kconfig | 47 +
drivers/media/i2c/soc_camera/Makefile | 7 +
- drivers/media/i2c/soc_camera/ar0132.c | 548 +++++++++++
+ drivers/media/i2c/soc_camera/ar0132.c | 581 +++++++++++
drivers/media/i2c/soc_camera/ar0132.h | 213 ++++
- drivers/media/i2c/soc_camera/max9286_max9271.c | 567 +++++++++++
- drivers/media/i2c/soc_camera/max9286_max9271.h | 243 +++++
- drivers/media/i2c/soc_camera/ov10635.c | 759 ++++++++++++++
+ drivers/media/i2c/soc_camera/max9286_max9271.c | 607 ++++++++++++
+ drivers/media/i2c/soc_camera/max9286_max9271.h | 244 +++++
+ drivers/media/i2c/soc_camera/ov10635.c | 758 ++++++++++++++
drivers/media/i2c/soc_camera/ov10635.h | 1139 ++++++++++++++++++++++
drivers/media/i2c/soc_camera/ov10635_debug.h | 54 +
drivers/media/i2c/soc_camera/ov106xx.c | 106 ++
- drivers/media/i2c/soc_camera/ov490_ov10640.c | 1046 ++++++++++++++++++++
- drivers/media/i2c/soc_camera/ov490_ov10640.h | 88 ++
+ drivers/media/i2c/soc_camera/ov490_ov10640.c | 1064 ++++++++++++++++++++
+ drivers/media/i2c/soc_camera/ov490_ov10640.h | 93 ++
drivers/media/i2c/soc_camera/ov495_ov2775.c | 658 +++++++++++++
drivers/media/i2c/soc_camera/ov495_ov2775.h | 23 +
- drivers/media/i2c/soc_camera/ti954_ti9x3.c | 417 ++++++++
- drivers/media/i2c/soc_camera/ti964_ti9x3.c | 385 ++++++++
+ drivers/media/i2c/soc_camera/ti954_ti9x3.c | 431 ++++++++
+ drivers/media/i2c/soc_camera/ti964_ti9x3.c | 399 ++++++++
drivers/media/i2c/soc_camera/ti9x4_ti9x3.h | 153 +++
drivers/media/platform/soc_camera/rcar_csi2.c | 297 ++++--
drivers/media/platform/soc_camera/rcar_vin.c | 174 +++-
@@ -32,7 +32,7 @@ Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
drivers/media/platform/soc_camera/soc_mediabus.c | 16 +
include/media/drv-intf/soc_mediabus.h | 3 +
include/media/soc_camera.h | 1 +
- 23 files changed, 6852 insertions(+), 109 deletions(-)
+ 23 files changed, 6976 insertions(+), 109 deletions(-)
create mode 100644 drivers/media/i2c/soc_camera/ar0132.c
create mode 100644 drivers/media/i2c/soc_camera/ar0132.h
create mode 100644 drivers/media/i2c/soc_camera/max9286_max9271.c
@@ -129,10 +129,10 @@ index 6f994f9..7d4c1ab 100644
obj-$(CONFIG_SOC_CAMERA_OV6650) += ov6650.o
diff --git a/drivers/media/i2c/soc_camera/ar0132.c b/drivers/media/i2c/soc_camera/ar0132.c
new file mode 100644
-index 0000000..284c522
+index 0000000..decbf5f
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ar0132.c
-@@ -0,0 +1,548 @@
+@@ -0,0 +1,581 @@
+/*
+ * Aptina AR0132 sensor camera driver
+ *
@@ -177,6 +177,8 @@ index 0000000..284c522
+ int autogain;
+ int dvp_order;
+ /* serializers */
++ int max9286_addr;
++ int max9271_addr;
+ int ti964_addr;
+ int ti954_addr;
+ int ti9x3_addr;
@@ -191,6 +193,19 @@ index 0000000..284c522
+ return container_of(i2c_get_clientdata(client), struct ar0132_priv, sd);
+}
+
++static void ar0132_s_port(struct i2c_client *client, int fwd_en)
++{
++ struct ar0132_priv *priv = to_ar0132(client);
++ int tmp_addr;
++
++ if (priv->max9286_addr) {
++ tmp_addr = client->addr;
++ client->addr = priv->max9286_addr; /* Deserializer I2C address */
++ reg8_write(client, 0x0a, fwd_en ? 0x11 << priv->port : 0); /* Enable/disable reverse/forward control for this port */
++ client->addr = tmp_addr;
++ };
++}
++
+static int ar0132_set_regs(struct i2c_client *client,
+ const struct ar0132_reg *regs, int nr_regs)
+{
@@ -456,6 +471,8 @@ index 0000000..284c522
+ u16 pid = 0;
+ int ret = 0;
+
++ ar0132_s_port(client, 1);
++
+ /* check and show model ID */
+ reg16_read16(client, AR0132_PID, &pid);
+
@@ -479,6 +496,8 @@ index 0000000..284c522
+ dev_info(&client->dev, "ar0132 PID %x, res %dx%d, OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n",
+ pid, AR0132_MAX_WIDTH, AR0132_MAX_HEIGHT, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]);
+err:
++ ar0132_s_port(client, 0);
++
+ return ret;
+}
+
@@ -502,6 +521,11 @@ index 0000000..284c522
+ if (!rendpoint)
+ continue;
+
++ if (!of_property_read_u32(rendpoint, "max9271-addr", &priv->max9271_addr) &&
++ !of_property_read_u32(rendpoint->parent->parent, "reg", &priv->max9286_addr) &&
++ !kstrtouint(strrchr(rendpoint->full_name, '@') + 1, 0, &priv->port))
++ break;
++
+ if (!of_property_read_u32(rendpoint, "ti9x3-addr", &priv->ti9x3_addr) &&
+ !of_property_match_string(rendpoint->parent->parent, "compatible", "ti,ti964-ti9x3") &&
+ !of_property_read_u32(rendpoint->parent->parent, "reg", &priv->ti964_addr) &&
@@ -515,13 +539,22 @@ index 0000000..284c522
+ break;
+ }
+
-+ if (!priv->ti964_addr && !priv->ti954_addr) {
-+ dev_err(&client->dev, "deserializer does not present\n");
++ if (!priv->max9286_addr && !priv->ti964_addr && !priv->ti954_addr) {
++ dev_err(&client->dev, "deserializer does not present for AR0132\n");
+ return -EINVAL;
+ }
+
++ ar0132_s_port(client, 1);
++
+ /* setup I2C translator address */
+ tmp_addr = client->addr;
++ if (priv->max9286_addr) {
++ client->addr = priv->max9271_addr; /* Serializer I2C address */
++
++ reg8_write(client, 0x09, tmp_addr << 1); /* Sensor translated I2C address */
++ reg8_write(client, 0x0A, AR0132_I2C_ADDR << 1); /* Sensor native I2C address */
++ usleep_range(2000, 2500); /* wait 2ms */
++ };
+ if (priv->ti964_addr) {
+ client->addr = priv->ti964_addr; /* Deserializer I2C address */
+
@@ -902,10 +935,10 @@ index 0000000..055841d
+};
diff --git a/drivers/media/i2c/soc_camera/max9286_max9271.c b/drivers/media/i2c/soc_camera/max9286_max9271.c
new file mode 100644
-index 0000000..9797d24
+index 0000000..91223a0
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/max9286_max9271.c
-@@ -0,0 +1,567 @@
+@@ -0,0 +1,607 @@
+/*
+ * MAXIM max9286-max9271 GMSL driver
+ *
@@ -920,9 +953,10 @@ index 0000000..9797d24
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
++#include <linux/notifier.h>
+#include <linux/of_gpio.h>
++#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
-+#include <linux/notifier.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-device.h>
@@ -959,10 +993,12 @@ index 0000000..9797d24
+ u32 csi2_outord;
+ struct i2c_client *client;
+ int max9271_addr_map[4];
++ struct regulator *poc_supply[4]; /* PoC power supply */
+};
+
+static int force_conf_link;
-+
++static int force_poc_trig;
++#ifndef MODULE
+static __init int max9286_max9271_force_conf_link(char *str)
+{
+ /* force configuration link */
@@ -972,6 +1008,16 @@ index 0000000..9797d24
+}
+early_param("force_conf_link", max9286_max9271_force_conf_link);
+
++static __init int max9286_max9271_force_poc_trig(char *str)
++{
++ /* force PoC triggering during reverse channel setup */
++ /* to be used on systems with dedicated PoC and unstable ser-des lock */
++ force_poc_trig = 1;
++ return 0;
++}
++early_param("force_poc_trig", max9286_max9271_force_poc_trig);
++#endif
++
+static void max9286_max9271_preinit(struct i2c_client *client, int addr)
+{
+ client->addr = addr; /* MAX9286-CAMx I2C */
@@ -980,27 +1026,32 @@ index 0000000..9797d24
+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+}
+
-+static void max9286_max9271_sensor_reset(struct i2c_client *client, int addr)
++static void max9286_max9271_sensor_reset(struct i2c_client *client, int addr, int reset_on)
+{
+ struct max9286_max9271_priv *priv = i2c_get_clientdata(client);
+
+ if (priv->gpio_resetb < 1 || priv->gpio_resetb > 5)
+ return;
+
-+ /* get out from sensor reset */
++ /* sensor reset/unreset */
+ client->addr = addr; /* MAX9271-CAMx I2C */
-+ reg8_write(client, 0x0f, (0xfe & ~BIT(priv->gpio_resetb)) |
-+ (priv->active_low_resetb ? 0 : BIT(priv->gpio_resetb))); /* set GPIOn value to reset */
++ reg8_write(client, 0x0f, (0xfe & ~BIT(priv->gpio_resetb)) | /* set GPIOn value to reset/unreset */
++ ((priv->active_low_resetb ? BIT(priv->gpio_resetb) : 0) ^ reset_on));
+ reg8_write(client, 0x0e, 0x42 | BIT(priv->gpio_resetb)); /* set GPIOn direction output */
-+ usleep_range(2000, 2500); /* wait 2ms */
-+ reg8_write(client, 0x0f, (0xfe & ~BIT(priv->gpio_resetb)) |
-+ (priv->active_low_resetb ? BIT(priv->gpio_resetb) : 0)); /* set GPIOn value to un-reset */
-+ usleep_range(2000, 2500); /* wait 2ms */
+}
+
+static void max9286_max9271_postinit(struct i2c_client *client, int addr)
+{
+ struct max9286_max9271_priv *priv = i2c_get_clientdata(client);
++ int idx;
++
++ for (idx = 0; idx < priv->links; idx++) {
++ client->addr = priv->des_addr; /* MAX9286 I2C */
++ reg8_write(client, 0x0a, 0x11 << idx); /* enable reverse/forward control for CAMx */
++
++ client->addr = priv->max9271_addr_map[idx]; /* MAX9271-CAMx I2C */
++ max9286_max9271_sensor_reset(client, client->addr, 0); /* sensor unreset */
++ }
+
+ client->addr = addr; /* MAX9286 I2C */
+ reg8_write(client, 0x0a, 0x00); /* disable reverse control for all cams */
@@ -1016,6 +1067,7 @@ index 0000000..9797d24
+ struct max9286_max9271_priv *priv = i2c_get_clientdata(client);
+ u8 val = 0;
+ int timeout = priv->timeout;
++ char timeout_str[10];
+ int ret = 0;
+
+ /* Reverse channel enable */
@@ -1033,7 +1085,10 @@ index 0000000..9797d24
+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+
+ client->addr = 0x40; /* MAX9271-CAMx I2C */
++ reg8_write(client, 0x04, 0x43); /* wake-up, enable reverse_control/conf_link */
++ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+ reg8_write(client, 0x08, 0x1); /* reverse channel receiver high threshold enable */
++ reg8_write(client, 0x97, 0x5f); /* enable reverse control channel programming (MAX96705-MAX96711 only) */
+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+
+ client->addr = priv->des_addr; /* MAX9286-CAMx I2C */
@@ -1041,26 +1096,32 @@ index 0000000..9797d24
+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+
+ client->addr = 0x40; /* MAX9271-CAMx I2C */
-+ reg8_write(client, 0x04, 0x43); /* wake-up, enable reverse_control/conf_link */
-+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
-+
-+ client->addr = 0x40; /* MAX9271-CAMx I2C */
+ reg8_read(client, 0x1e, &val); /* read max9271 ID */
-+ if (val == MAX9271_ID || --timeout == 0)
++ if (val == MAX9271_ID || val == MAX96705_ID || --timeout == 0)
+ break;
+
+ /* Check if already initialized (after reboot/reset ?) */
+ client->addr = priv->max9271_addr_map[idx]; /* MAX9271-CAMx I2C */
+ reg8_read(client, 0x1e, &val); /* read max9271 ID */
-+ if (val == MAX9271_ID) {
++ if (val == MAX9271_ID || val == MAX96705_ID) {
+ reg8_write(client, 0x04, 0x43); /* enable reverse_control/conf_link */
+ usleep_range(2000, 2500); /* wait 2ms after any change of reverse channel settings */
+ ret = -EADDRINUSE;
+ break;
+ }
++
++ if (timeout == priv->timeout / 2 && force_poc_trig) {
++ if (!IS_ERR(priv->poc_supply[idx])) {
++ if (regulator_disable(priv->poc_supply[idx]))
++ dev_err(&client->dev, "fail to disable POC%d regulator\n", idx);
++ mdelay(200);
++ if (regulator_enable(priv->poc_supply[idx]))
++ dev_err(&client->dev, "fail to enable POC%d regulator\n", idx);
++ }
++ }
+ }
+
-+ max9286_max9271_sensor_reset(client, client->addr); /* sensor reset */
++ max9286_max9271_sensor_reset(client, client->addr, 1); /* sensor reset */
+
+ if (!timeout) {
+ ret = -ETIMEDOUT;
@@ -1072,9 +1133,11 @@ index 0000000..9797d24
+ priv->csi2_outord |= ((hweight8(priv->links_mask) - 1) << (idx * 2));
+
+out:
-+ dev_info(&client->dev, "link%d MAX9271 %sat 0x%x %s\n", idx,
++ sprintf(timeout_str, "retries=%d", priv->timeout - timeout);
++ dev_info(&client->dev, "link%d MAX9271 %sat 0x%x %s %s\n", idx,
+ ret == -EADDRINUSE ? "already " : "", priv->max9271_addr_map[idx],
-+ ret == -ETIMEDOUT ? "not found: timeout GMSL link establish" : "");
++ ret == -ETIMEDOUT ? "not found: timeout GMSL link establish" : "",
++ priv->timeout - timeout? timeout_str : "");
+
+ return ret;
+}
@@ -1176,6 +1239,11 @@ index 0000000..9797d24
+ max9286_max9271_initial_setup(client);
+
+ for (idx = 0; idx < priv->links; idx++) {
++ if (!IS_ERR(priv->poc_supply[idx])) {
++ if (regulator_enable(priv->poc_supply[idx]))
++ dev_err(&client->dev, "fail to enable POC%d regulator\n", idx);
++ }
++
+ ret = max9286_max9271_reverse_channel_setup(client, idx);
+ if (ret)
+ continue;
@@ -1391,6 +1459,7 @@ index 0000000..9797d24
+{
+ struct max9286_max9271_priv *priv;
+ int err, i;
++ char supply_name[10];
+
+ priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
@@ -1406,6 +1475,11 @@ index 0000000..9797d24
+ if (err)
+ goto out;
+
++ for (i = 0; i < 4; i++) {
++ sprintf(supply_name, "POC%d", i);
++ priv->poc_supply[i] = devm_regulator_get_optional(&client->dev, supply_name);
++ }
++
+ err = max9286_max9271_initialize(client);
+ if (err < 0)
+ goto out;
@@ -1428,7 +1502,6 @@ index 0000000..9797d24
+ if (err < 0)
+ goto out;
+ }
-+
+out:
+ return err;
+}
@@ -1475,10 +1548,10 @@ index 0000000..9797d24
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/i2c/soc_camera/max9286_max9271.h b/drivers/media/i2c/soc_camera/max9286_max9271.h
new file mode 100644
-index 0000000..0016f28a
+index 0000000..6c2a9e0
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/max9286_max9271.h
-@@ -0,0 +1,243 @@
+@@ -0,0 +1,244 @@
+/*
+ * MAXIM max9286-max9271 GMSL driver include file
+ *
@@ -1504,6 +1577,7 @@ index 0000000..0016f28a
+#define REG8_NUM_RETRIES 1 /* number of read/write retries */
+#define REG16_NUM_RETRIES 10 /* number of read/write retries */
+#define MAX9271_ID 0x9
++#define MAX96705_ID 0x41
+#define MAX9286_ID 0x40
+#define BROADCAST 0x6f
+
@@ -1724,10 +1798,10 @@ index 0000000..0016f28a
+#endif /* _MAX9286_MAX9271_H */
diff --git a/drivers/media/i2c/soc_camera/ov10635.c b/drivers/media/i2c/soc_camera/ov10635.c
new file mode 100644
-index 0000000..45169de
+index 0000000..6296647
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ov10635.c
-@@ -0,0 +1,759 @@
+@@ -0,0 +1,758 @@
+/*
+ * OmniVision ov10635 sensor camera driver
+ *
@@ -1798,7 +1872,7 @@ index 0000000..45169de
+
+ if (priv->max9286_addr) {
+ tmp_addr = client->addr;
-+ client->addr = priv->max9286_addr; /* Deserializer I2C address */
++ client->addr = priv->max9286_addr; /* Deserializer I2C address */
+ reg8_write(client, 0x0a, fwd_en ? 0x11 << priv->port : 0); /* Enable/disable reverse/forward control for this port */
+ client->addr = tmp_addr;
+ };
@@ -2265,7 +2339,6 @@ index 0000000..45169de
+
+ dev_info(&client->dev, "ov10635 Product ID %x Manufacturer ID %x OTP_ID %02x:%02x:%02x:%02x:%02x:%02x\n",
+ pid, ver, priv->id[0], priv->id[1], priv->id[2], priv->id[3], priv->id[4], priv->id[5]);
-+
+out:
+ ov10635_s_port(client, 0);
+
@@ -2311,7 +2384,7 @@ index 0000000..45169de
+ }
+
+ if (!priv->max9286_addr && !priv->ti964_addr && !priv->ti954_addr) {
-+ dev_err(&client->dev, "deserializer does not present\n");
++ dev_err(&client->dev, "deserializer does not present for OV10635\n");
+ return -EINVAL;
+ }
+
@@ -2489,7 +2562,7 @@ index 0000000..45169de
+#endif
diff --git a/drivers/media/i2c/soc_camera/ov10635.h b/drivers/media/i2c/soc_camera/ov10635.h
new file mode 100644
-index 0000000..66cc490
+index 0000000..a0e510d
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ov10635.h
@@ -0,0 +1,1139 @@
@@ -3806,10 +3879,10 @@ index 0000000..f2bb706
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/i2c/soc_camera/ov490_ov10640.c b/drivers/media/i2c/soc_camera/ov490_ov10640.c
new file mode 100644
-index 0000000..15acc51
+index 0000000..bee9293
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ov490_ov10640.c
-@@ -0,0 +1,1046 @@
+@@ -0,0 +1,1064 @@
+/*
+ * OmniVision ov490-ov10640 sensor camera driver
+ *
@@ -4553,10 +4626,28 @@ index 0000000..15acc51
+ reg16_write(client, 0xFFFD, 0x80);
+ reg16_write(client, 0xFFFE, 0x29);
+ usleep_range(100, 150); /* wait 100 us */
-+ timeout = 300;
-+ for (;;) {
++ for (timeout = 300; timeout > 0; timeout--) {
+ reg16_read(client, 0xd000, &val);
-+ if (val == 0x0c || --timeout == 0)
++ if (val == 0x0c)
++ break;
++ mdelay(1);
++ }
++
++ /* wait firmware apps started by reading OV10640 ID */
++ for (;timeout > 0; timeout--) {
++ reg16_write(client, 0xFFFD, 0x80);
++ reg16_write(client, 0xFFFE, 0x19);
++ usleep_range(100, 150); /* wait 100 us */
++ reg16_write(client, 0x5000, 0x01);
++ reg16_write(client, 0x5001, 0x30);
++ reg16_write(client, 0x5002, 0x0a);
++ reg16_write(client, 0xFFFE, 0x80);
++ usleep_range(100, 150); /* wait 100 us */
++ reg16_write(client, 0xC0, 0xc1);
++ reg16_write(client, 0xFFFE, 0x19);
++ usleep_range(1000, 1500); /* wait 1 ms */
++ reg16_read(client, 0x5000, &val);
++ if (val == 0xa6)
+ break;
+ mdelay(1);
+ }
@@ -4658,7 +4749,7 @@ index 0000000..15acc51
+ }
+
+ if (!priv->max9286_addr && !priv->ti964_addr && !priv->ti954_addr) {
-+ dev_err(&client->dev, "deserializer does not present\n");
++ dev_err(&client->dev, "deserializer does not present for OV490\n");
+ return -EINVAL;
+ }
+
@@ -4858,7 +4949,7 @@ index 0000000..15acc51
+#endif
diff --git a/drivers/media/i2c/soc_camera/ov490_ov10640.h b/drivers/media/i2c/soc_camera/ov490_ov10640.h
new file mode 100644
-index 0000000..d3290c7
+index 0000000..8c9ecf1
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ov490_ov10640.h
@@ -0,0 +1,93 @@
@@ -4957,7 +5048,7 @@ index 0000000..d3290c7
+};
diff --git a/drivers/media/i2c/soc_camera/ov495_ov2775.c b/drivers/media/i2c/soc_camera/ov495_ov2775.c
new file mode 100644
-index 0000000..881615e
+index 0000000..6dc0675
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ov495_ov2775.c
@@ -0,0 +1,658 @@
@@ -5447,7 +5538,7 @@ index 0000000..881615e
+ }
+
+ if (!priv->ti960_addr && !priv->ti954_addr) {
-+ dev_err(&client->dev, "deserializer does not present\n");
++ dev_err(&client->dev, "deserializer does not present for OV495\n");
+ return -EINVAL;
+ }
+
@@ -5650,10 +5741,10 @@ index 0000000..3f53689
+};
diff --git a/drivers/media/i2c/soc_camera/ti954_ti9x3.c b/drivers/media/i2c/soc_camera/ti954_ti9x3.c
new file mode 100644
-index 0000000..fc7ccda
+index 0000000..1672173
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ti954_ti9x3.c
-@@ -0,0 +1,417 @@
+@@ -0,0 +1,431 @@
+/*
+ * TI ti954-(ti913/ti953) FPDLinkIII driver
+ *
@@ -5668,9 +5759,10 @@ index 0000000..fc7ccda
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
++#include <linux/notifier.h>
+#include <linux/of_gpio.h>
++#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
-+#include <linux/notifier.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-device.h>
@@ -5692,6 +5784,7 @@ index 0000000..fc7ccda
+ struct i2c_client *client;
+ int ti9x3_addr_map[4];
+ char chip_id[6];
++ struct regulator *poc_supply[4]; /* PoC power supply */
+ int xtal_gpio;
+};
+
@@ -5824,8 +5917,14 @@ index 0000000..fc7ccda
+
+ ti954_ti9x3_initial_setup(client);
+
-+ for (idx = 0; idx < priv->links; idx++)
++ for (idx = 0; idx < priv->links; idx++) {
++ if (!IS_ERR(priv->poc_supply[idx])) {
++ if (regulator_enable(priv->poc_supply[idx]))
++ dev_err(&client->dev, "fail to enable POC%d regulator\n", idx);
++ }
++
+ ti954_ti9x3_fpdlink3_setup(client, idx);
++ }
+
+ client->addr = priv->des_addr;
+
@@ -5992,6 +6091,7 @@ index 0000000..fc7ccda
+{
+ struct ti954_ti9x3_priv *priv;
+ int err, i;
++ char supply_name[10];
+
+ priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
@@ -6006,6 +6106,11 @@ index 0000000..fc7ccda
+ if (err)
+ goto out;
+
++ for (i = 0; i < 4; i++) {
++ sprintf(supply_name, "POC%d", i);
++ priv->poc_supply[i] = devm_regulator_get_optional(&client->dev, supply_name);
++ }
++
+ err = ti954_ti9x3_initialize(client);
+ if (err < 0)
+ goto out;
@@ -6073,10 +6178,10 @@ index 0000000..fc7ccda
+MODULE_LICENSE("GPL");
diff --git a/drivers/media/i2c/soc_camera/ti964_ti9x3.c b/drivers/media/i2c/soc_camera/ti964_ti9x3.c
new file mode 100644
-index 0000000..8dd0f99
+index 0000000..770d306
--- /dev/null
+++ b/drivers/media/i2c/soc_camera/ti964_ti9x3.c
-@@ -0,0 +1,385 @@
+@@ -0,0 +1,399 @@
+/*
+ * TI (ti964/ti960)-(ti913/ti953) FPDLinkIII driver
+ *
@@ -6091,9 +6196,10 @@ index 0000000..8dd0f99
+#include <linux/delay.h>
+#include <linux/i2c.h>
+#include <linux/module.h>
++#include <linux/notifier.h>
+#include <linux/of_gpio.h>
++#include <linux/regulator/consumer.h>
+#include <linux/videodev2.h>
-+#include <linux/notifier.h>
+
+#include <media/v4l2-common.h>
+#include <media/v4l2-device.h>
@@ -6115,6 +6221,7 @@ index 0000000..8dd0f99
+ struct i2c_client *client;
+ int ti9x3_addr_map[4];
+ char chip_id[6];
++ struct regulator *poc_supply[4]; /* PoC power supply */
+};
+
+static void ti964_ti9x3_read_chipid(struct i2c_client *client)
@@ -6220,8 +6327,14 @@ index 0000000..8dd0f99
+
+ ti964_ti9x3_initial_setup(client);
+
-+ for (idx = 0; idx < priv->links; idx++)
++ for (idx = 0; idx < priv->links; idx++) {
++ if (!IS_ERR(priv->poc_supply[idx])) {
++ if (regulator_enable(priv->poc_supply[idx]))
++ dev_err(&client->dev, "fail to enable POC%d regulator\n", idx);
++ }
++
+ ti964_ti9x3_fpdlink3_setup(client, idx);
++ }
+
+ client->addr = priv->des_addr;
+
@@ -6383,6 +6496,7 @@ index 0000000..8dd0f99
+{
+ struct ti964_ti9x3_priv *priv;
+ int err, i;
++ char supply_name[10];
+
+ priv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);
+ if (!priv)
@@ -6397,6 +6511,11 @@ index 0000000..8dd0f99
+ if (err)
+ goto out;
+
++ for (i = 0; i < 4; i++) {
++ sprintf(supply_name, "POC%d", i);
++ priv->poc_supply[i] = devm_regulator_get_optional(&client->dev, supply_name);
++ }
++
+ err = ti964_ti9x3_initialize(client);
+ if (err < 0)
+ goto out;
diff --git a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0040-arm64-dts-renesas-add-ADAS-boards.patch b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0040-arm64-dts-renesas-add-ADAS-boards.patch
index b9bcc7e..20adbaf 100644
--- a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0040-arm64-dts-renesas-add-ADAS-boards.patch
+++ b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas/0040-arm64-dts-renesas-add-ADAS-boards.patch
@@ -56,19 +56,19 @@ Signed-off-by: Vladimir Barinov <vladimir.barinov@cogentembedded.com>
arch/arm64/boot/dts/renesas/r8a7796-m3ulcb-kf.dts | 40 +
.../arm64/boot/dts/renesas/r8a7796-m3ulcb-view.dts | 287 ++++
.../boot/dts/renesas/r8a7796-salvator-x-view.dts | 318 ++++
- arch/arm64/boot/dts/renesas/r8a7797-eagle.dts | 561 +++++++
+ arch/arm64/boot/dts/renesas/r8a7797-eagle.dts | 560 +++++++
arch/arm64/boot/dts/renesas/r8a7797-v3msk-kf.dts | 578 +++++++
- arch/arm64/boot/dts/renesas/r8a7797-v3msk-vbm.dts | 498 ++++++
+ arch/arm64/boot/dts/renesas/r8a7797-v3msk-vbm.dts | 518 ++++++
arch/arm64/boot/dts/renesas/r8a7797-v3msk-view.dts | 298 ++++
- arch/arm64/boot/dts/renesas/r8a7797-v3msk.dts | 313 ++++
- arch/arm64/boot/dts/renesas/ulcb-kf-cn11.dtsi | 518 ++++++
+ arch/arm64/boot/dts/renesas/r8a7797-v3msk.dts | 314 ++++
+ arch/arm64/boot/dts/renesas/ulcb-kf-cn11.dtsi | 545 ++++++
arch/arm64/boot/dts/renesas/ulcb-kf-most.dtsi | 30 +
arch/arm64/boot/dts/renesas/ulcb-kf-sd3.dtsi | 46 +
- arch/arm64/boot/dts/renesas/ulcb-kf.dtsi | 1529 +++++++++++++++++
+ arch/arm64/boot/dts/renesas/ulcb-kf.dtsi | 1554 ++++++++++++++++++
arch/arm64/boot/dts/renesas/ulcb-vb-cn12.dtsi | 515 ++++++
arch/arm64/boot/dts/renesas/ulcb-vb.dtsi | 1726 ++++++++++++++++++++
- arch/arm64/boot/dts/renesas/ulcb-vbm.dtsi | 557 +++++++
- 42 files changed, 17091 insertions(+)
+ arch/arm64/boot/dts/renesas/ulcb-vbm.dtsi | 578 +++++++
+ 42 files changed, 17184 insertions(+)
create mode 100644 arch/arm64/boot/dts/renesas/legacy/Makefile
create mode 100644 arch/arm64/boot/dts/renesas/legacy/r8a7795-es1-h3ulcb-kf-v0.dts
create mode 100644 arch/arm64/boot/dts/renesas/legacy/r8a7795-es1-h3ulcb-kf-v1.dts
@@ -10219,10 +10219,10 @@ index 0000000..cc6866c
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7797-eagle.dts b/arch/arm64/boot/dts/renesas/r8a7797-eagle.dts
new file mode 100644
-index 0000000..eef10af
+index 0000000..3fb3bf1
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r8a7797-eagle.dts
-@@ -0,0 +1,561 @@
+@@ -0,0 +1,560 @@
+/*
+ * Device Tree Source for the Eagle board
+ *
@@ -10783,7 +10783,6 @@ index 0000000..eef10af
+ };
+ };
+};
-+
diff --git a/arch/arm64/boot/dts/renesas/r8a7797-v3msk-kf.dts b/arch/arm64/boot/dts/renesas/r8a7797-v3msk-kf.dts
new file mode 100644
index 0000000..979cebe
@@ -11370,10 +11369,10 @@ index 0000000..979cebe
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7797-v3msk-vbm.dts b/arch/arm64/boot/dts/renesas/r8a7797-v3msk-vbm.dts
new file mode 100644
-index 0000000..28a0b92
+index 0000000..4292b7b
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r8a7797-v3msk-vbm.dts
-@@ -0,0 +1,498 @@
+@@ -0,0 +1,518 @@
+/*
+ * Device Tree Source for the V3MSK Videobox Mini board on r8a7797
+ *
@@ -11392,6 +11391,42 @@ index 0000000..28a0b92
+ aliases {
+ serial1 = &scif3;
+ };
++
++ pwr0: regulator-pwr0 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR0";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 8 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr1: regulator-pwr1 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR1";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 9 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr2: regulator-pwr2 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR2";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 10 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr3: regulator-pwr3 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR3";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 11 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
+};
+
+&canfd {
@@ -11447,7 +11482,7 @@ index 0000000..28a0b92
+ pinctrl-names = "default";
+ status = "okay";
+
-+ clock-frequency = <100000>;
++ clock-frequency = <400000>;
+
+ i2cswitch1: i2c-switch@74 {
+ compatible = "nxp,pca9548";
@@ -11554,6 +11589,10 @@ index 0000000..28a0b92
+ maxim,resetb-gpio = <1>;
+ maxim,fsync-mode = "automatic";
+ maxim,timeout = <100>;
++ POC0-supply = <&pwr0>;
++ POC1-supply = <&pwr1>;
++ POC2-supply = <&pwr2>;
++ POC3-supply = <&pwr3>;
+
+ port@0 {
+ max9286_des0ep0: endpoint@0 {
@@ -11593,6 +11632,10 @@ index 0000000..28a0b92
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0>;
++ POC1-supply = <&pwr1>;
++ POC2-supply = <&pwr2>;
++ POC3-supply = <&pwr3>;
+
+ port@0 {
+ ti964_des0ep0: endpoint@0 {
@@ -11640,55 +11683,31 @@ index 0000000..28a0b92
+ gpio-hog;
+ gpios = <5 GPIO_ACTIVE_HIGH>;
+ input;
-+ line-name = "Video VIRQ";
++ line-name = "VIRQ";
+ };
+ des_cfg {
+ gpio-hog;
+ gpios = <6 GPIO_ACTIVE_HIGH>;
+ input;
-+ line-name = "Video CNFG0";
++ line-name = "CNFG0";
+ };
+ pwr_shdn {
+ gpio-hog;
+ gpios = <14 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video PWR_SHDN";
-+ };
-+ cam_pwr0 {
-+ gpio-hog;
-+ gpios = <8 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR0";
-+ };
-+ cam_pwr1 {
-+ gpio-hog;
-+ gpios = <9 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR1";
-+ };
-+ cam_pwr2 {
-+ gpio-hog;
-+ gpios = <10 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR2";
-+ };
-+ cam_pwr3 {
-+ gpio-hog;
-+ gpios = <11 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR3";
++ line-name = "PWR_SHDN";
+ };
+ des_shdn {
+ gpio-hog;
+ gpios = <13 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video DES_SHDN";
++ line-name = "Des_SHDN";
+ };
+ fpdl_shdn {
+ gpio-hog;
+ gpios = <15 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video FPDL_SHDN";
++ line-name = "FPDL_SHDN";
+ };
+ };
+ };
@@ -12178,10 +12197,10 @@ index 0000000..573e2bc
+};
diff --git a/arch/arm64/boot/dts/renesas/r8a7797-v3msk.dts b/arch/arm64/boot/dts/renesas/r8a7797-v3msk.dts
new file mode 100644
-index 0000000..efb1576
+index 0000000..91d10c5
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/r8a7797-v3msk.dts
-@@ -0,0 +1,313 @@
+@@ -0,0 +1,314 @@
+/*
+ * Device Tree Source for the V3M Starter Kit board on r8a7797
+ *
@@ -12354,6 +12373,7 @@ index 0000000..efb1576
+ port@0 {
+ endpoint {
+ remote-endpoint = <&adv7511_in>;
++// remote-endpoint = <&lvds_in>;
+ };
+ };
+ };
@@ -12497,10 +12517,10 @@ index 0000000..efb1576
+};
diff --git a/arch/arm64/boot/dts/renesas/ulcb-kf-cn11.dtsi b/arch/arm64/boot/dts/renesas/ulcb-kf-cn11.dtsi
new file mode 100644
-index 0000000..4ca502f
+index 0000000..589a774
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/ulcb-kf-cn11.dtsi
-@@ -0,0 +1,518 @@
+@@ -0,0 +1,545 @@
+/*
+ * Device Tree Source for the H3ULCB Kingfisher board:
+ * this adding conflicting resource on VIN4/VIN5/VIN6/VIN7 for CN11
@@ -12514,6 +12534,44 @@ index 0000000..4ca502f
+ * kind, whether express or implied.
+ */
+
++/ {
++ pwr0B: regulator-pwr0B {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR0B";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_b_5c 8 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr1B: regulator-pwr1B {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR1B";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_b_5c 9 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr2B: regulator-pwr2B {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR2B";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_b_5c 10 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr3B: regulator-pwr3B {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR3B";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_b_5c 11 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++};
++
+&i2cswitch4 {
+ i2c@2 {
+ #address-cells = <1>;
@@ -12618,6 +12676,10 @@ index 0000000..4ca502f
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0B>;
++ POC1-supply = <&pwr1B>;
++ POC2-supply = <&pwr2B>;
++ POC3-supply = <&pwr3B>;
+
+ port@0 {
+ ti964_des1ep0: endpoint@0 {
@@ -12659,6 +12721,10 @@ index 0000000..4ca502f
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0B>;
++ POC1-supply = <&pwr1B>;
++ POC2-supply = <&pwr2B>;
++ POC3-supply = <&pwr3B>;
+
+ port@0 {
+ ti954_des1ep0: endpoint@0 {
@@ -12690,6 +12756,10 @@ index 0000000..4ca502f
+ maxim,resetb-gpio = <1>;
+ maxim,fsync-mode = "automatic";
+ maxim,timeout = <100>;
++ POC0-supply = <&pwr0B>;
++ POC1-supply = <&pwr1B>;
++ POC2-supply = <&pwr2B>;
++ POC3-supply = <&pwr3B>;
+
+ port@0 {
+ max9286_des1ep0: endpoint@0 {
@@ -12728,7 +12798,8 @@ index 0000000..4ca502f
+ reg = <6>;
+ /* Slot B (CN11) */
+
-+ video_b_ext0: pca9535@27 {
++ /* PCA9535 is a redundand/deprecated card */
++ gpio_exp_b_27: gpio@27 {
+ compatible = "nxp,pca9535";
+ reg = <0x27>;
+ gpio-controller;
@@ -12790,7 +12861,7 @@ index 0000000..4ca502f
+ };
+ };
+
-+ video_b_ext1: max7325@5c {
++ gpio_exp_b_5c: gpio@5c {
+ compatible = "maxim,max7325";
+ reg = <0x5c>;
+ gpio-controller;
@@ -12820,30 +12891,6 @@ index 0000000..4ca502f
+ output-high;
+ line-name = "Video-B PWR_SHDN";
+ };
-+ video_b_cam_pwr0 {
-+ gpio-hog;
-+ gpios = <8 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-B PWR0";
-+ };
-+ video_b_cam_pwr1 {
-+ gpio-hog;
-+ gpios = <9 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-B PWR1";
-+ };
-+ video_b_cam_pwr2 {
-+ gpio-hog;
-+ gpios = <10 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-B PWR2";
-+ };
-+ video_b_cam_pwr3 {
-+ gpio-hog;
-+ gpios = <11 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-B PWR3";
-+ };
+ video_b_des_shdn {
+ gpio-hog;
+ gpios = <13 GPIO_ACTIVE_HIGH>;
@@ -13109,10 +13156,10 @@ index 0000000..b854216
+};
diff --git a/arch/arm64/boot/dts/renesas/ulcb-kf.dtsi b/arch/arm64/boot/dts/renesas/ulcb-kf.dtsi
new file mode 100644
-index 0000000..8ffafb2
+index 0000000..917dbab
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/ulcb-kf.dtsi
-@@ -0,0 +1,1529 @@
+@@ -0,0 +1,1554 @@
+/*
+ * Device Tree Source for the ULCB Kingfisher board
+ *
@@ -13232,6 +13279,42 @@ index 0000000..8ffafb2
+ enable-active-high;
+ };
+
++ pwr0A: regulator-pwr0A {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR0A";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_a_5c 8 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr1A: regulator-pwr1A {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR1A";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_a_5c 9 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr2A: regulator-pwr2A {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR2A";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_a_5c 10 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr3A: regulator-pwr3A {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR3A";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_a_5c 11 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
+ kim {
+ compatible = "kim";
+ shutdown-gpios = <&gpio_ext_74 3 GPIO_ACTIVE_HIGH>;
@@ -13987,6 +14070,10 @@ index 0000000..8ffafb2
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0A>;
++ POC1-supply = <&pwr1A>;
++ POC2-supply = <&pwr2A>;
++ POC3-supply = <&pwr3A>;
+
+ port@0 {
+ ti964_des0ep0: endpoint@0 {
@@ -14028,6 +14115,10 @@ index 0000000..8ffafb2
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0A>;
++ POC1-supply = <&pwr1A>;
++ POC2-supply = <&pwr2A>;
++ POC3-supply = <&pwr3A>;
+
+ port@0 {
+ ti954_des0ep0: endpoint@0 {
@@ -14059,6 +14150,10 @@ index 0000000..8ffafb2
+ maxim,resetb-gpio = <1>;
+ maxim,fsync-mode = "automatic";
+ maxim,timeout = <100>;
++ POC0-supply = <&pwr0A>;
++ POC1-supply = <&pwr1A>;
++ POC2-supply = <&pwr2A>;
++ POC3-supply = <&pwr3A>;
+
+ port@0 {
+ max9286_des0ep0: endpoint@0 {
@@ -14142,7 +14237,8 @@ index 0000000..8ffafb2
+ reg = <7>;
+ /* Slot A (CN10) */
+
-+ video_a_ext0: pca9535@26 {
++ /* PCA9535 is a redundant/deprecated card */
++ gpio_exp_a_26: gpio@26 {
+ compatible = "nxp,pca9535";
+ reg = <0x26>;
+ gpio-controller;
@@ -14204,7 +14300,7 @@ index 0000000..8ffafb2
+ };
+ };
+
-+ video_a_ext1: max7325@5c {
++ gpio_exp_a_5c: gpio@5c {
+ compatible = "maxim,max7325";
+ reg = <0x5c>;
+ gpio-controller;
@@ -14234,30 +14330,6 @@ index 0000000..8ffafb2
+ output-high;
+ line-name = "Video-A PWR_SHDN";
+ };
-+ video_a_cam_pwr0 {
-+ gpio-hog;
-+ gpios = <8 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-A PWR0";
-+ };
-+ video_a_cam_pwr1 {
-+ gpio-hog;
-+ gpios = <9 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-A PWR1";
-+ };
-+ video_a_cam_pwr2 {
-+ gpio-hog;
-+ gpios = <10 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-A PWR2";
-+ };
-+ video_a_cam_pwr3 {
-+ gpio-hog;
-+ gpios = <11 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video-A PWR3";
-+ };
+ video_a_des_shdn {
+ gpio-hog;
+ gpios = <13 GPIO_ACTIVE_HIGH>;
@@ -16897,10 +16969,10 @@ index 0000000..193153e
+//#include "ulcb-vb-cn12.dtsi"
diff --git a/arch/arm64/boot/dts/renesas/ulcb-vbm.dtsi b/arch/arm64/boot/dts/renesas/ulcb-vbm.dtsi
new file mode 100644
-index 0000000..3d4bcde
+index 0000000..beb52e9
--- /dev/null
+++ b/arch/arm64/boot/dts/renesas/ulcb-vbm.dtsi
-@@ -0,0 +1,557 @@
+@@ -0,0 +1,578 @@
+/*
+ * Device Tree Source for the ULCB Videobox Mini board
+ *
@@ -16916,6 +16988,42 @@ index 0000000..3d4bcde
+ serial1 = &scif1;
+ };
+
++ pwr0: regulator-pwr0 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR0";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 8 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr1: regulator-pwr1 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR1";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 9 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr2: regulator-pwr2 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR2";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 10 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
++ pwr3: regulator-pwr3 {
++ compatible = "regulator-fixed";
++ regulator-name = "PWR3";
++ regulator-min-microvolt = <9000000>;
++ regulator-max-microvolt = <9000000>;
++ gpio = <&gpio_exp_6c 11 GPIO_ACTIVE_HIGH>;
++ enable-active-high;
++ };
++
+ lvds-encoder {
+ compatible = "thine,thc63lvdm83d";
+
@@ -17030,7 +17138,7 @@ index 0000000..3d4bcde
+ pinctrl-names = "default";
+ status = "okay";
+
-+ clock-frequency = <100000>;
++ clock-frequency = <400000>;
+
+ i2cswitch1: i2c-switch@74 {
+ compatible = "nxp,pca9548";
@@ -17137,6 +17245,10 @@ index 0000000..3d4bcde
+ maxim,resetb-gpio = <1>;
+ maxim,fsync-mode = "automatic";
+ maxim,timeout = <100>;
++ POC0-supply = <&pwr0>;
++ POC1-supply = <&pwr1>;
++ POC2-supply = <&pwr2>;
++ POC3-supply = <&pwr3>;
+
+ port@0 {
+ max9286_des0ep0: endpoint@0 {
@@ -17176,6 +17288,10 @@ index 0000000..3d4bcde
+ ti,lanes = <4>;
+ ti,forwarding-mode = "round-robin";
+ ti,cable-mode = "coax";
++ POC0-supply = <&pwr0>;
++ POC1-supply = <&pwr1>;
++ POC2-supply = <&pwr2>;
++ POC3-supply = <&pwr3>;
+
+ port@0 {
+ ti964_des0ep0: endpoint@0 {
@@ -17223,55 +17339,31 @@ index 0000000..3d4bcde
+ gpio-hog;
+ gpios = <5 GPIO_ACTIVE_HIGH>;
+ input;
-+ line-name = "Video VIRQ";
++ line-name = "VIRQ";
+ };
+ des_cfg {
+ gpio-hog;
+ gpios = <6 GPIO_ACTIVE_HIGH>;
+ input;
-+ line-name = "Video CNFG0";
++ line-name = "CNFG0";
+ };
+ pwr_shdn {
+ gpio-hog;
+ gpios = <14 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video PWR_SHDN";
-+ };
-+ cam_pwr0 {
-+ gpio-hog;
-+ gpios = <8 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR0";
-+ };
-+ cam_pwr1 {
-+ gpio-hog;
-+ gpios = <9 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR1";
-+ };
-+ cam_pwr2 {
-+ gpio-hog;
-+ gpios = <10 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR2";
-+ };
-+ cam_pwr3 {
-+ gpio-hog;
-+ gpios = <11 GPIO_ACTIVE_HIGH>;
-+ output-high;
-+ line-name = "Video PWR3";
++ line-name = "PWR_SHDN";
+ };
+ des_shdn {
+ gpio-hog;
+ gpios = <13 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video DES_SHDN";
++ line-name = "Des_SHDN";
+ };
+ fpdl_shdn {
+ gpio-hog;
+ gpios = <15 GPIO_ACTIVE_HIGH>;
+ output-high;
-+ line-name = "Video FPDL_SHDN";
++ line-name = "FPDL_SHDN";
+ };
+ };
+ };
@@ -17458,6 +17550,7 @@ index 0000000..3d4bcde
+ };
+ };
+};
++
--
1.9.1
diff --git a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas_4.9.bbappend b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas_4.9.bbappend
index bb658d1..c1b71e7 100644
--- a/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas_4.9.bbappend
+++ b/meta-rcar-gen3-adas/recipes-kernel/linux/linux-renesas_4.9.bbappend
@@ -39,6 +39,7 @@ SRC_URI_append = " \
file://0032-media-i2c-Add-ov5642-sensor.patch \
file://0033-media-soc-camera-fix-parallel-i-f-in-VIN.patch \
file://0034-media-soc_camera-Fix-VIDIOC_S_SELECTION-ioctl-miscal.patch \
+ file://0035-regulator-fixed-probe-after-i2c.patch \
file://0040-arm64-dts-renesas-add-ADAS-boards.patch \
file://0041-arm64-dts-renesas-ulcb-enlarge-cma-region.patch \
file://0042-arm64-dts-renesas-r8a7795-es1-h3ulcb-disable-eMMC.patch \