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)