Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ASoC: codecs: qcom add support for SM8450 and SC8280XP

Merge series from Srinivas Kandagatla <srinivas.kandagatla@linaro.org>:

This patchset adds support for SM8450 and SC8280XP SoC and also some of
the fixes requried to get stable audio on X13s.

Tested SmartSpeakers and Headset on SM8450 MTP and
Lenovo Thinkpad X13s.

+120 -71
+2
Documentation/devicetree/bindings/sound/qcom,lpass-rx-macro.yaml
··· 14 14 enum: 15 15 - qcom,sc7280-lpass-rx-macro 16 16 - qcom,sm8250-lpass-rx-macro 17 + - qcom,sm8450-lpass-rx-macro 18 + - qcom,sc8280xp-lpass-rx-macro 17 19 18 20 reg: 19 21 maxItems: 1
+2
Documentation/devicetree/bindings/sound/qcom,lpass-tx-macro.yaml
··· 14 14 enum: 15 15 - qcom,sc7280-lpass-tx-macro 16 16 - qcom,sm8250-lpass-tx-macro 17 + - qcom,sm8450-lpass-tx-macro 18 + - qcom,sc8280xp-lpass-tx-macro 17 19 18 20 reg: 19 21 maxItems: 1
+2
Documentation/devicetree/bindings/sound/qcom,lpass-va-macro.yaml
··· 14 14 enum: 15 15 - qcom,sc7280-lpass-va-macro 16 16 - qcom,sm8250-lpass-va-macro 17 + - qcom,sm8450-lpass-va-macro 18 + - qcom,sc8280xp-lpass-va-macro 17 19 18 20 reg: 19 21 maxItems: 1
+2
Documentation/devicetree/bindings/sound/qcom,lpass-wsa-macro.yaml
··· 14 14 enum: 15 15 - qcom,sc7280-lpass-wsa-macro 16 16 - qcom,sm8250-lpass-wsa-macro 17 + - qcom,sm8450-lpass-wsa-macro 18 + - qcom,sc8280xp-lpass-wsa-macro 17 19 18 20 reg: 19 21 maxItems: 1
+7 -11
sound/soc/codecs/lpass-rx-macro.c
··· 596 596 int rx_port_value[RX_MACRO_PORTS_MAX]; 597 597 u16 prim_int_users[INTERP_MAX]; 598 598 int rx_mclk_users; 599 - bool reset_swr; 600 599 int clsh_users; 601 600 int rx_mclk_cnt; 602 601 bool is_ear_mode_on; ··· 3441 3442 } 3442 3443 3443 3444 rx_macro_mclk_enable(rx, true); 3444 - if (rx->reset_swr) 3445 - regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3446 - CDC_RX_SWR_RESET_MASK, 3447 - CDC_RX_SWR_RESET); 3445 + regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3446 + CDC_RX_SWR_RESET_MASK, 3447 + CDC_RX_SWR_RESET); 3448 3448 3449 3449 regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3450 3450 CDC_RX_SWR_CLK_EN_MASK, 1); 3451 3451 3452 - if (rx->reset_swr) 3453 - regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3454 - CDC_RX_SWR_RESET_MASK, 0); 3455 - rx->reset_swr = false; 3452 + regmap_update_bits(rx->regmap, CDC_RX_CLK_RST_CTRL_SWR_CONTROL, 3453 + CDC_RX_SWR_RESET_MASK, 0); 3456 3454 3457 3455 return 0; 3458 3456 } ··· 3575 3579 3576 3580 dev_set_drvdata(dev, rx); 3577 3581 3578 - rx->reset_swr = true; 3579 3582 rx->dev = dev; 3580 3583 3581 3584 /* set MCLK and NPL rates */ ··· 3654 3659 static const struct of_device_id rx_macro_dt_match[] = { 3655 3660 { .compatible = "qcom,sc7280-lpass-rx-macro" }, 3656 3661 { .compatible = "qcom,sm8250-lpass-rx-macro" }, 3662 + { .compatible = "qcom,sm8450-lpass-rx-macro" }, 3663 + { .compatible = "qcom,sc8280xp-lpass-rx-macro" }, 3657 3664 { } 3658 3665 }; 3659 3666 MODULE_DEVICE_TABLE(of, rx_macro_dt_match); ··· 3698 3701 } 3699 3702 regcache_cache_only(rx->regmap, false); 3700 3703 regcache_sync(rx->regmap); 3701 - rx->reset_swr = true; 3702 3704 3703 3705 return 0; 3704 3706 err_fsgen:
+22 -14
sound/soc/codecs/lpass-tx-macro.c
··· 259 259 struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS]; 260 260 unsigned long active_ch_mask[TX_MACRO_MAX_DAIS]; 261 261 unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS]; 262 - unsigned long active_decimator[TX_MACRO_MAX_DAIS]; 262 + int active_decimator[TX_MACRO_MAX_DAIS]; 263 263 struct regmap *regmap; 264 264 struct clk *mclk; 265 265 struct clk *npl; ··· 268 268 struct clk *fsgen; 269 269 struct clk_hw hw; 270 270 bool dec_active[NUM_DECIMATORS]; 271 - bool reset_swr; 272 271 int tx_mclk_users; 273 272 u16 dmic_clk_div; 274 273 bool bcs_enable; ··· 822 823 struct tx_macro *tx = snd_soc_component_get_drvdata(component); 823 824 824 825 if (enable) { 826 + if (tx->active_decimator[dai_id] == dec_id) 827 + return 0; 828 + 825 829 set_bit(dec_id, &tx->active_ch_mask[dai_id]); 826 830 tx->active_ch_cnt[dai_id]++; 827 831 tx->active_decimator[dai_id] = dec_id; 828 832 } else { 833 + if (tx->active_decimator[dai_id] == -1) 834 + return 0; 835 + 829 836 tx->active_ch_cnt[dai_id]--; 830 837 clear_bit(dec_id, &tx->active_ch_mask[dai_id]); 831 838 tx->active_decimator[dai_id] = -1; 832 839 } 833 840 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update); 834 841 835 - return 0; 842 + return 1; 836 843 } 837 844 838 845 static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w, ··· 1024 1019 int path = e->shift_l; 1025 1020 struct tx_macro *tx = snd_soc_component_get_drvdata(component); 1026 1021 1022 + if (tx->dec_mode[path] == value) 1023 + return 0; 1024 + 1027 1025 tx->dec_mode[path] = value; 1028 1026 1029 - return 0; 1027 + return 1; 1030 1028 } 1031 1029 1032 1030 static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol, ··· 1125 1117 struct snd_soc_component *component = dai->component; 1126 1118 struct tx_macro *tx = snd_soc_component_get_drvdata(component); 1127 1119 u16 decimator; 1120 + 1121 + /* active decimator not set yet */ 1122 + if (tx->active_decimator[dai->id] == -1) 1123 + return 0; 1128 1124 1129 1125 decimator = tx->active_decimator[dai->id]; 1130 1126 ··· 1714 1702 } 1715 1703 1716 1704 tx_macro_mclk_enable(tx, true); 1717 - if (tx->reset_swr) 1718 - regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 1719 - CDC_TX_SWR_RESET_MASK, 1720 - CDC_TX_SWR_RESET_ENABLE); 1705 + regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 1706 + CDC_TX_SWR_RESET_MASK, CDC_TX_SWR_RESET_ENABLE); 1721 1707 1722 1708 regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 1723 1709 CDC_TX_SWR_CLK_EN_MASK, 1724 1710 CDC_TX_SWR_CLK_ENABLE); 1725 - if (tx->reset_swr) 1726 - regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 1727 - CDC_TX_SWR_RESET_MASK, 0x0); 1728 - tx->reset_swr = false; 1711 + regmap_update_bits(regmap, CDC_TX_CLK_RST_CTRL_SWR_CONTROL, 1712 + CDC_TX_SWR_RESET_MASK, 0x0); 1729 1713 1730 1714 return 0; 1731 1715 } ··· 1863 1855 1864 1856 dev_set_drvdata(dev, tx); 1865 1857 1866 - tx->reset_swr = true; 1867 1858 tx->dev = dev; 1868 1859 1869 1860 /* set MCLK and NPL rates */ ··· 1977 1970 1978 1971 regcache_cache_only(tx->regmap, false); 1979 1972 regcache_sync(tx->regmap); 1980 - tx->reset_swr = true; 1981 1973 1982 1974 return 0; 1983 1975 err_fsgen: ··· 1994 1988 static const struct of_device_id tx_macro_dt_match[] = { 1995 1989 { .compatible = "qcom,sc7280-lpass-tx-macro" }, 1996 1990 { .compatible = "qcom,sm8250-lpass-tx-macro" }, 1991 + { .compatible = "qcom,sm8450-lpass-tx-macro" }, 1992 + { .compatible = "qcom,sc8280xp-lpass-tx-macro" }, 1997 1993 { } 1998 1994 }; 1999 1995 MODULE_DEVICE_TABLE(of, tx_macro_dt_match);
+76 -6
sound/soc/codecs/lpass-va-macro.c
··· 23 23 #define CDC_VA_MCLK_CONTROL_EN BIT(0) 24 24 #define CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL (0x0004) 25 25 #define CDC_VA_FS_CONTROL_EN BIT(0) 26 + #define CDC_VA_FS_COUNTER_CLR BIT(1) 26 27 #define CDC_VA_CLK_RST_CTRL_SWR_CONTROL (0x0008) 28 + #define CDC_VA_SWR_RESET_MASK BIT(1) 29 + #define CDC_VA_SWR_RESET_ENABLE BIT(1) 30 + #define CDC_VA_SWR_CLK_EN_MASK BIT(0) 31 + #define CDC_VA_SWR_CLK_ENABLE BIT(0) 27 32 #define CDC_VA_TOP_CSR_TOP_CFG0 (0x0080) 28 33 #define CDC_VA_FS_BROADCAST_EN BIT(1) 29 34 #define CDC_VA_TOP_CSR_DMIC0_CTL (0x0084) ··· 70 65 #define CDC_VA_TOP_CSR_SWR_MIC_CTL0 (0x00D0) 71 66 #define CDC_VA_TOP_CSR_SWR_MIC_CTL1 (0x00D4) 72 67 #define CDC_VA_TOP_CSR_SWR_MIC_CTL2 (0x00D8) 68 + #define CDC_VA_SWR_MIC_CLK_SEL_0_1_MASK (0xEE) 69 + #define CDC_VA_SWR_MIC_CLK_SEL_0_1_DIV1 (0xCC) 73 70 #define CDC_VA_TOP_CSR_SWR_CTRL (0x00DC) 74 71 #define CDC_VA_INP_MUX_ADC_MUX0_CFG0 (0x0100) 75 72 #define CDC_VA_INP_MUX_ADC_MUX0_CFG1 (0x0104) ··· 200 193 unsigned long active_ch_mask[VA_MACRO_MAX_DAIS]; 201 194 unsigned long active_ch_cnt[VA_MACRO_MAX_DAIS]; 202 195 u16 dmic_clk_div; 196 + bool has_swr_master; 203 197 204 198 int dec_mode[VA_MACRO_NUM_DECIMATORS]; 205 199 struct regmap *regmap; ··· 222 214 }; 223 215 224 216 #define to_va_macro(_hw) container_of(_hw, struct va_macro, hw) 217 + 218 + struct va_macro_data { 219 + bool has_swr_master; 220 + }; 221 + 222 + static const struct va_macro_data sm8250_va_data = { 223 + .has_swr_master = false, 224 + }; 225 + 226 + static const struct va_macro_data sm8450_va_data = { 227 + .has_swr_master = true, 228 + }; 225 229 226 230 static bool va_is_volatile_register(struct device *dev, unsigned int reg) 227 231 { ··· 344 324 case CDC_VA_TOP_CSR_DMIC2_CTL: 345 325 case CDC_VA_TOP_CSR_DMIC3_CTL: 346 326 case CDC_VA_TOP_CSR_DMIC_CFG: 327 + case CDC_VA_TOP_CSR_SWR_MIC_CTL0: 328 + case CDC_VA_TOP_CSR_SWR_MIC_CTL1: 329 + case CDC_VA_TOP_CSR_SWR_MIC_CTL2: 347 330 case CDC_VA_TOP_CSR_DEBUG_BUS: 348 331 case CDC_VA_TOP_CSR_DEBUG_EN: 349 332 case CDC_VA_TOP_CSR_TX_I2S_CTL: ··· 446 423 regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_MCLK_CONTROL, 447 424 CDC_VA_MCLK_CONTROL_EN, 448 425 CDC_VA_MCLK_CONTROL_EN); 449 - 426 + /* clear the fs counter */ 450 427 regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, 451 - CDC_VA_FS_CONTROL_EN, 428 + CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR, 429 + CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR); 430 + regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_FS_CNT_CONTROL, 431 + CDC_VA_FS_CONTROL_EN | CDC_VA_FS_COUNTER_CLR, 452 432 CDC_VA_FS_CONTROL_EN); 453 433 454 434 regmap_update_bits(regmap, CDC_VA_TOP_CSR_TOP_CFG0, ··· 1328 1302 1329 1303 static int fsgen_gate_enable(struct clk_hw *hw) 1330 1304 { 1331 - return va_macro_mclk_enable(to_va_macro(hw), true); 1305 + struct va_macro *va = to_va_macro(hw); 1306 + struct regmap *regmap = va->regmap; 1307 + int ret; 1308 + 1309 + ret = va_macro_mclk_enable(va, true); 1310 + if (!va->has_swr_master) 1311 + return ret; 1312 + 1313 + regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 1314 + CDC_VA_SWR_RESET_MASK, CDC_VA_SWR_RESET_ENABLE); 1315 + 1316 + regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 1317 + CDC_VA_SWR_CLK_EN_MASK, 1318 + CDC_VA_SWR_CLK_ENABLE); 1319 + regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 1320 + CDC_VA_SWR_RESET_MASK, 0x0); 1321 + 1322 + return ret; 1332 1323 } 1333 1324 1334 1325 static void fsgen_gate_disable(struct clk_hw *hw) 1335 1326 { 1336 - va_macro_mclk_enable(to_va_macro(hw), false); 1327 + struct va_macro *va = to_va_macro(hw); 1328 + struct regmap *regmap = va->regmap; 1329 + 1330 + if (va->has_swr_master) 1331 + regmap_update_bits(regmap, CDC_VA_CLK_RST_CTRL_SWR_CONTROL, 1332 + CDC_VA_SWR_CLK_EN_MASK, 0x0); 1333 + 1334 + va_macro_mclk_enable(va, false); 1337 1335 } 1338 1336 1339 1337 static int fsgen_gate_is_enabled(struct clk_hw *hw) ··· 1451 1401 static int va_macro_probe(struct platform_device *pdev) 1452 1402 { 1453 1403 struct device *dev = &pdev->dev; 1404 + const struct va_macro_data *data; 1454 1405 struct va_macro *va; 1455 1406 void __iomem *base; 1456 1407 u32 sample_rate = 0; ··· 1506 1455 1507 1456 dev_set_drvdata(dev, va); 1508 1457 1458 + data = of_device_get_match_data(dev); 1459 + va->has_swr_master = data->has_swr_master; 1460 + 1509 1461 /* mclk rate */ 1510 1462 clk_set_rate(va->mclk, 2 * VA_MACRO_MCLK_FREQ); 1511 1463 ··· 1532 1478 if (IS_ERR(va->fsgen)) { 1533 1479 ret = PTR_ERR(va->fsgen); 1534 1480 goto err_clkout; 1481 + } 1482 + 1483 + if (va->has_swr_master) { 1484 + /* Set default CLK div to 1 */ 1485 + regmap_update_bits(va->regmap, CDC_VA_TOP_CSR_SWR_MIC_CTL0, 1486 + CDC_VA_SWR_MIC_CLK_SEL_0_1_MASK, 1487 + CDC_VA_SWR_MIC_CLK_SEL_0_1_DIV1); 1488 + regmap_update_bits(va->regmap, CDC_VA_TOP_CSR_SWR_MIC_CTL1, 1489 + CDC_VA_SWR_MIC_CLK_SEL_0_1_MASK, 1490 + CDC_VA_SWR_MIC_CLK_SEL_0_1_DIV1); 1491 + regmap_update_bits(va->regmap, CDC_VA_TOP_CSR_SWR_MIC_CTL2, 1492 + CDC_VA_SWR_MIC_CLK_SEL_0_1_MASK, 1493 + CDC_VA_SWR_MIC_CLK_SEL_0_1_DIV1); 1494 + 1535 1495 } 1536 1496 1537 1497 ret = devm_snd_soc_register_component(dev, &va_macro_component_drv, ··· 1622 1554 }; 1623 1555 1624 1556 static const struct of_device_id va_macro_dt_match[] = { 1625 - { .compatible = "qcom,sc7280-lpass-va-macro" }, 1626 - { .compatible = "qcom,sm8250-lpass-va-macro" }, 1557 + { .compatible = "qcom,sc7280-lpass-va-macro", .data = &sm8250_va_data }, 1558 + { .compatible = "qcom,sm8250-lpass-va-macro", .data = &sm8250_va_data }, 1559 + { .compatible = "qcom,sm8450-lpass-va-macro", .data = &sm8450_va_data }, 1560 + { .compatible = "qcom,sc8280xp-lpass-va-macro", .data = &sm8450_va_data }, 1627 1561 {} 1628 1562 }; 1629 1563 MODULE_DEVICE_TABLE(of, va_macro_dt_match);
+6 -13
sound/soc/codecs/lpass-wsa-macro.c
··· 338 338 int ec_hq[WSA_MACRO_RX1 + 1]; 339 339 u16 prim_int_users[WSA_MACRO_RX1 + 1]; 340 340 u16 wsa_mclk_users; 341 - bool reset_swr; 342 341 unsigned long active_ch_mask[WSA_MACRO_MAX_DAIS]; 343 342 unsigned long active_ch_cnt[WSA_MACRO_MAX_DAIS]; 344 343 int rx_port_value[WSA_MACRO_RX_MAX]; ··· 2270 2271 wsa_macro_mclk_enable(wsa, true); 2271 2272 2272 2273 /* reset swr ip */ 2273 - if (wsa->reset_swr) 2274 - regmap_update_bits(regmap, 2275 - CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2276 - CDC_WSA_SWR_RST_EN_MASK, 2277 - CDC_WSA_SWR_RST_ENABLE); 2274 + regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2275 + CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_ENABLE); 2278 2276 2279 2277 regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2280 2278 CDC_WSA_SWR_CLK_EN_MASK, 2281 2279 CDC_WSA_SWR_CLK_ENABLE); 2282 2280 2283 2281 /* Bring out of reset */ 2284 - if (wsa->reset_swr) 2285 - regmap_update_bits(regmap, 2286 - CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2287 - CDC_WSA_SWR_RST_EN_MASK, 2288 - CDC_WSA_SWR_RST_DISABLE); 2289 - wsa->reset_swr = false; 2282 + regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2283 + CDC_WSA_SWR_RST_EN_MASK, CDC_WSA_SWR_RST_DISABLE); 2290 2284 } else { 2291 2285 regmap_update_bits(regmap, CDC_WSA_CLK_RST_CTRL_SWR_CONTROL, 2292 2286 CDC_WSA_SWR_CLK_EN_MASK, 0); ··· 2423 2431 2424 2432 dev_set_drvdata(dev, wsa); 2425 2433 2426 - wsa->reset_swr = true; 2427 2434 wsa->dev = dev; 2428 2435 2429 2436 /* set MCLK and NPL rates */ ··· 2552 2561 static const struct of_device_id wsa_macro_dt_match[] = { 2553 2562 {.compatible = "qcom,sc7280-lpass-wsa-macro"}, 2554 2563 {.compatible = "qcom,sm8250-lpass-wsa-macro"}, 2564 + {.compatible = "qcom,sm8450-lpass-wsa-macro"}, 2565 + {.compatible = "qcom,sc8280xp-lpass-wsa-macro" }, 2555 2566 {} 2556 2567 }; 2557 2568 MODULE_DEVICE_TABLE(of, wsa_macro_dt_match);
+1 -27
sound/soc/codecs/wsa883x.c
··· 415 415 416 416 #define WSA883X_NUM_REGISTERS (WSA883X_EMEM_63 + 1) 417 417 #define WSA883X_MAX_REGISTER (WSA883X_NUM_REGISTERS - 1) 418 - #define WSA883X_PROBE_TIMEOUT 1000 419 418 420 419 #define WSA883X_VERSION_1_0 0 421 420 #define WSA883X_VERSION_1_1 1 ··· 1408 1409 wsa883x->sconfig.type = SDW_STREAM_PDM; 1409 1410 1410 1411 pdev->prop.sink_ports = GENMASK(WSA883X_MAX_SWR_PORTS, 0); 1412 + pdev->prop.simple_clk_stop_capable = true; 1411 1413 pdev->prop.sink_dpn_prop = wsa_sink_dpn_prop; 1412 1414 pdev->prop.scp_int1_mask = SDW_SCP_INT1_BUS_CLASH | SDW_SCP_INT1_PARITY; 1413 1415 gpiod_direction_output(wsa883x->sd_n, 1); ··· 1440 1440 static int __maybe_unused wsa883x_runtime_suspend(struct device *dev) 1441 1441 { 1442 1442 struct regmap *regmap = dev_get_regmap(dev, NULL); 1443 - struct wsa883x_priv *wsa883x = dev_get_drvdata(dev); 1444 - 1445 - gpiod_direction_output(wsa883x->sd_n, 0); 1446 1443 1447 1444 regcache_cache_only(regmap, true); 1448 1445 regcache_mark_dirty(regmap); 1449 1446 1450 - regulator_disable(wsa883x->vdd); 1451 1447 return 0; 1452 1448 } 1453 1449 1454 1450 static int __maybe_unused wsa883x_runtime_resume(struct device *dev) 1455 1451 { 1456 - struct sdw_slave *slave = dev_to_sdw_dev(dev); 1457 1452 struct regmap *regmap = dev_get_regmap(dev, NULL); 1458 - struct wsa883x_priv *wsa883x = dev_get_drvdata(dev); 1459 - unsigned long time; 1460 - int ret; 1461 1453 1462 - ret = regulator_enable(wsa883x->vdd); 1463 - if (ret) { 1464 - dev_err(dev, "Failed to enable vdd regulator (%d)\n", ret); 1465 - return ret; 1466 - } 1467 - 1468 - gpiod_direction_output(wsa883x->sd_n, 1); 1469 - 1470 - time = wait_for_completion_timeout(&slave->initialization_complete, 1471 - msecs_to_jiffies(WSA883X_PROBE_TIMEOUT)); 1472 - if (!time) { 1473 - dev_err(dev, "Initialization not complete, timed out\n"); 1474 - gpiod_direction_output(wsa883x->sd_n, 0); 1475 - regulator_disable(wsa883x->vdd); 1476 - return -ETIMEDOUT; 1477 - } 1478 - 1479 - usleep_range(20000, 20010); 1480 1454 regcache_cache_only(regmap, false); 1481 1455 regcache_sync(regmap); 1482 1456