diff options
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 \ |