@@ -1562,9 +1562,11 @@ static int qca_power_on(struct hci_dev *hdev)
1562
1562
ret = qca_wcn3990_init (hu );
1563
1563
} else {
1564
1564
qcadev = serdev_device_get_drvdata (hu -> serdev );
1565
- gpiod_set_value_cansleep (qcadev -> bt_en , 1 );
1566
- /* Controller needs time to bootup. */
1567
- msleep (150 );
1565
+ if (!IS_ERR (qcadev -> bt_en )) {
1566
+ gpiod_set_value_cansleep (qcadev -> bt_en , 1 );
1567
+ /* Controller needs time to bootup. */
1568
+ msleep (150 );
1569
+ }
1568
1570
}
1569
1571
1570
1572
return ret ;
@@ -1750,7 +1752,7 @@ static void qca_power_shutdown(struct hci_uart *hu)
1750
1752
host_set_baudrate (hu , 2400 );
1751
1753
qca_send_power_pulse (hu , false);
1752
1754
qca_regulator_disable (qcadev );
1753
- } else {
1755
+ } else if (! IS_ERR ( qcadev -> bt_en )) {
1754
1756
gpiod_set_value_cansleep (qcadev -> bt_en , 0 );
1755
1757
}
1756
1758
}
@@ -1852,6 +1854,7 @@ static int qca_serdev_probe(struct serdev_device *serdev)
1852
1854
struct hci_dev * hdev ;
1853
1855
const struct qca_vreg_data * data ;
1854
1856
int err ;
1857
+ bool power_ctrl_enabled = true;
1855
1858
1856
1859
qcadev = devm_kzalloc (& serdev -> dev , sizeof (* qcadev ), GFP_KERNEL );
1857
1860
if (!qcadev )
@@ -1901,35 +1904,37 @@ static int qca_serdev_probe(struct serdev_device *serdev)
1901
1904
qcadev -> bt_en = devm_gpiod_get (& serdev -> dev , "enable" ,
1902
1905
GPIOD_OUT_LOW );
1903
1906
if (IS_ERR (qcadev -> bt_en )) {
1904
- dev_err (& serdev -> dev , "failed to acquire enable gpio\n" );
1905
- return PTR_ERR ( qcadev -> bt_en ) ;
1907
+ dev_warn (& serdev -> dev , "failed to acquire enable gpio\n" );
1908
+ power_ctrl_enabled = false ;
1906
1909
}
1907
1910
1908
1911
qcadev -> susclk = devm_clk_get (& serdev -> dev , NULL );
1909
1912
if (IS_ERR (qcadev -> susclk )) {
1910
- dev_err (& serdev -> dev , "failed to acquire clk\n" );
1911
- return PTR_ERR (qcadev -> susclk );
1912
- }
1913
-
1914
- err = clk_set_rate (qcadev -> susclk , SUSCLK_RATE_32KHZ );
1915
- if (err )
1916
- return err ;
1913
+ dev_warn (& serdev -> dev , "failed to acquire clk\n" );
1914
+ } else {
1915
+ err = clk_set_rate (qcadev -> susclk , SUSCLK_RATE_32KHZ );
1916
+ if (err )
1917
+ return err ;
1917
1918
1918
- err = clk_prepare_enable (qcadev -> susclk );
1919
- if (err )
1920
- return err ;
1919
+ err = clk_prepare_enable (qcadev -> susclk );
1920
+ if (err )
1921
+ return err ;
1922
+ }
1921
1923
1922
1924
err = hci_uart_register_device (& qcadev -> serdev_hu , & qca_proto );
1923
1925
if (err ) {
1924
1926
BT_ERR ("Rome serdev registration failed" );
1925
- clk_disable_unprepare (qcadev -> susclk );
1927
+ if (!IS_ERR (qcadev -> susclk ))
1928
+ clk_disable_unprepare (qcadev -> susclk );
1926
1929
return err ;
1927
1930
}
1928
1931
}
1929
1932
1930
- hdev = qcadev -> serdev_hu .hdev ;
1931
- set_bit (HCI_QUIRK_NON_PERSISTENT_SETUP , & hdev -> quirks );
1932
- hdev -> shutdown = qca_power_off ;
1933
+ if (power_ctrl_enabled ) {
1934
+ hdev = qcadev -> serdev_hu .hdev ;
1935
+ set_bit (HCI_QUIRK_NON_PERSISTENT_SETUP , & hdev -> quirks );
1936
+ hdev -> shutdown = qca_power_off ;
1937
+ }
1933
1938
1934
1939
return 0 ;
1935
1940
}
@@ -1940,7 +1945,7 @@ static void qca_serdev_remove(struct serdev_device *serdev)
1940
1945
1941
1946
if (qca_is_wcn399x (qcadev -> btsoc_type ))
1942
1947
qca_power_shutdown (& qcadev -> serdev_hu );
1943
- else
1948
+ else if (! IS_ERR ( qcadev -> susclk ))
1944
1949
clk_disable_unprepare (qcadev -> susclk );
1945
1950
1946
1951
hci_uart_unregister_device (& qcadev -> serdev_hu );
0 commit comments