diff --git a/arch/arm64/boot/dts/google/gs101-oriole-camera.dtsi b/arch/arm64/boot/dts/google/gs101-oriole-camera.dtsi
index 7c19938ce5cdee625504dae3d24339836ad4b5d8..1ecc1de4aba8f4d01ec4cd2ca72fba3f7cf36a7b 100644
--- a/arch/arm64/boot/dts/google/gs101-oriole-camera.dtsi
+++ b/arch/arm64/boot/dts/google/gs101-oriole-camera.dtsi
@@ -99,10 +99,11 @@
 	status = "okay";
 	clock-frequency = <370000>;
 
-	pinctrl-names = "default","on_i2c","off_i2c";
+	pinctrl-names = "default","on_i2c","off_i2c","recovery";
 	pinctrl-0 = <&hsi2c7_bus &spi14_cs2>;
 	pinctrl-1 = <&hsi2c7_bus>;
 	pinctrl-2 = <&hsi2c7_bus>;
+	pinctrl-3 = <>;
 };
 
 &sensor_mclk2_fn {
diff --git a/arch/arm64/boot/dts/google/gs101-raven-camera.dtsi b/arch/arm64/boot/dts/google/gs101-raven-camera.dtsi
index 898234cdd90db27faae51f93a495bf7ba2bbb980..04560c4dabe8856a596dc7df454382b792f96101 100644
--- a/arch/arm64/boot/dts/google/gs101-raven-camera.dtsi
+++ b/arch/arm64/boot/dts/google/gs101-raven-camera.dtsi
@@ -124,10 +124,11 @@
 	status = "okay";
 	clock-frequency = <370000>;
 
-	pinctrl-names = "default","on_i2c","off_i2c";
+	pinctrl-names = "default","on_i2c","off_i2c","recovery";
 	pinctrl-0 = <&hsi2c7_bus &spi14_cs2>;
 	pinctrl-1 = <&hsi2c7_bus>;
 	pinctrl-2 = <&hsi2c7_bus>;
+	pinctrl-3 = <>;
 };
 
 / {
diff --git a/arch/arm64/boot/dts/google/gs101-usi.dtsi b/arch/arm64/boot/dts/google/gs101-usi.dtsi
index b820f3b3a31fc9b951dc5dabb128b26e9a593b75..9c4cf6e71c6a5edf5098e61307ef28ce78b0ca83 100644
--- a/arch/arm64/boot/dts/google/gs101-usi.dtsi
+++ b/arch/arm64/boot/dts/google/gs101-usi.dtsi
@@ -206,8 +206,9 @@
 		samsung,scl-clk-stretching;
 		samsung,usi-i2c-v2;
 		interrupts = <GIC_SPI IRQ_USI7_USI_PERIC0 ITLH>;
-		pinctrl-names = "default";
+		pinctrl-names = "default", "recovery";
 		pinctrl-0 = <&hsi2c7_bus>;
+		pinctrl-1 = <>;
 		clocks = <&clock VDOUT_CLK_PERIC0_USI7_USI>, <&clock GATE_PERIC0_TOP0_USI7_USI>;
 		clock-names = "ipclk_hsi2c", "gate_hsi2c_clk";
 		gpio_scl= <&gpp14 0 0x1>;
diff --git a/arch/arm64/boot/dts/google/gs201-cs40l26a-config.dtsi b/arch/arm64/boot/dts/google/gs201-cs40l26a-config.dtsi
index 110391c6630e14ee97d0a3ebf4d59529224b63e7..eb771743662542e157f6a81db3ae6475513cdfd9 100644
--- a/arch/arm64/boot/dts/google/gs201-cs40l26a-config.dtsi
+++ b/arch/arm64/boot/dts/google/gs201-cs40l26a-config.dtsi
@@ -68,9 +68,6 @@
 	#size-cells = <0>;
 	status = "okay";
 
-	pinctrl-names = "default";
-	pinctrl-0 = <&hsi2c8_bus>;
-
 	clock-frequency = <400000>;
 
 	cs40l26a_haptics: cs40l26a@43 {
diff --git a/arch/arm64/boot/dts/google/gs201-usi.dtsi b/arch/arm64/boot/dts/google/gs201-usi.dtsi
index 1c96a5ea1700c486c199d61af2ce7142c89e6884..933def870fea73eaff98e8e3a4b9c3d4d250470b 100644
--- a/arch/arm64/boot/dts/google/gs201-usi.dtsi
+++ b/arch/arm64/boot/dts/google/gs201-usi.dtsi
@@ -234,8 +234,9 @@
 		samsung,no_lose_arbitration;
 		samsung,usi-i2c-v2;
 		interrupts = <GIC_SPI IRQ_USI8_USI_PERIC0 ITLH>;
-		pinctrl-names = "default";
+		pinctrl-names = "default", "recovery";
 		pinctrl-0 = <&hsi2c8_bus>;
+		pinctrl-1 = <>;
 		clocks = <&clock VDOUT_CLK_PERIC0_USI8_USI>, <&clock GATE_PERIC0_TOP0_USI8_USI>;
 		clock-names = "ipclk_hsi2c", "gate_hsi2c_clk";
 		gpio_scl= <&gpp16 0 0x1>;
diff --git a/drivers/firmware/arm_scmi/smc.c b/drivers/firmware/arm_scmi/smc.c
index 7f68f4da4b07519c3de384f517e870d4e224a4db..4c713592c6f4ceb42a42f6da88100225fb4293bd 100644
--- a/drivers/firmware/arm_scmi/smc.c
+++ b/drivers/firmware/arm_scmi/smc.c
@@ -145,12 +145,12 @@ static int smc_send_message(struct scmi_chan_info *cinfo,
 
 	shmem_tx_prepare(scmi_info->shmem, xfer);
 
-	if (scmi_info->irq)
+	if (scmi_info->irq > 0)
 		reinit_completion(&scmi_info->tx_complete);
 
 	arm_smccc_1_1_invoke(scmi_info->func_id, 0, 0, 0, 0, 0, 0, 0, &res);
 
-	if (scmi_info->irq)
+	if (scmi_info->irq > 0)
 		wait_for_completion(&scmi_info->tx_complete);
 
 	scmi_rx_callback(scmi_info->cinfo, shmem_read_header(scmi_info->shmem));
diff --git a/drivers/misc/eeprom/at24.c b/drivers/misc/eeprom/at24.c
index 305ffad131a2997bd70e72184a06374b20b8cdcc..02bea443694352eb49f7bac8aac35b1482754b8e 100644
--- a/drivers/misc/eeprom/at24.c
+++ b/drivers/misc/eeprom/at24.c
@@ -585,6 +585,31 @@ static unsigned int at24_get_offset_adj(u8 flags, unsigned int byte_len)
 	}
 }
 
+static void at24_probe_temp_sensor(struct i2c_client *client)
+{
+	struct at24_data *at24 = i2c_get_clientdata(client);
+	struct i2c_board_info info = { .type = "jc42" };
+	int ret;
+	u8 val;
+
+	/*
+	 * Byte 2 has value 11 for DDR3, earlier versions don't
+	 * support the thermal sensor present flag
+	 */
+	ret = at24_read(at24, 2, &val, 1);
+	if (ret || val != 11)
+		return;
+
+	/* Byte 32, bit 7 is set if temp sensor is present */
+	ret = at24_read(at24, 32, &val, 1);
+	if (ret || !(val & BIT(7)))
+		return;
+
+	info.addr = 0x18 | (client->addr & 7);
+
+	i2c_new_client_device(client->adapter, &info);
+}
+
 static int at24_probe(struct i2c_client *client)
 {
 	struct regmap_config regmap_config = { };
@@ -757,14 +782,6 @@ static int at24_probe(struct i2c_client *client)
 	pm_runtime_set_active(dev);
 	pm_runtime_enable(dev);
 
-	at24->nvmem = devm_nvmem_register(dev, &nvmem_config);
-	if (IS_ERR(at24->nvmem)) {
-		pm_runtime_disable(dev);
-		if (!pm_runtime_status_suspended(dev))
-			regulator_disable(at24->vcc_reg);
-		return PTR_ERR(at24->nvmem);
-	}
-
 	/*
 	 * Perform a one-byte test read to verify that the
 	 * chip is functional.
@@ -777,6 +794,19 @@ static int at24_probe(struct i2c_client *client)
 		return -ENODEV;
 	}
 
+	at24->nvmem = devm_nvmem_register(dev, &nvmem_config);
+	if (IS_ERR(at24->nvmem)) {
+		pm_runtime_disable(dev);
+		if (!pm_runtime_status_suspended(dev))
+			regulator_disable(at24->vcc_reg);
+		return dev_err_probe(dev, PTR_ERR(at24->nvmem),
+				     "failed to register nvmem\n");
+	}
+
+	/* If this a SPD EEPROM, probe for DDR3 thermal sensor */
+	if (cdata == &at24_data_spd)
+		at24_probe_temp_sensor(client);
+
 	pm_runtime_idle(dev);
 
 	if (writable)