* [PATCH 0/4] bluetooth: qca: enable WCN7850 support
@ 2023-06-20 15:19 Neil Armstrong
2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw)
To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann,
Johan Hedberg, Luiz Augusto von Dentz, Andy Gross,
Bjorn Andersson, Konrad Dybcio
Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm,
Neil Armstrong
This serie enables WCN7850 on the Qualcomm SM8550 QRD
reference platform.
The WCN7850 is close to the WCN6855 but uses different
firmware names.
Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
---
Neil Armstrong (4):
dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset
bluetooth: qca: add support for WCN7850
arm64: dts: qcom: sm8550: add UART14 nodes
arm64: dts: qcom: sm8550-qrd: add bluetooth support
.../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 +++++++++++
arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 43 +++++++++++++++++++
arch/arm64/boot/dts/qcom/sm8550.dtsi | 30 ++++++++++++++
drivers/bluetooth/btqca.c | 7 ++++
drivers/bluetooth/btqca.h | 10 +++++
drivers/bluetooth/hci_qca.c | 48 +++++++++++++++++-----
6 files changed, 150 insertions(+), 11 deletions(-)
---
base-commit: 9dbf40840551df336c95ce2a3adbdd25ed53c0ef
change-id: 20230620-topic-sm8550-upstream-bt-dfc4305f9c14
Best regards,
--
Neil Armstrong <neil.armstrong@linaro.org>
^ permalink raw reply [flat|nested] 9+ messages in thread* [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset 2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong @ 2023-06-20 15:19 ` Neil Armstrong 2023-06-22 1:54 ` Rob Herring 2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw) To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, Andy Gross, Bjorn Andersson, Konrad Dybcio Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm, Neil Armstrong Document the WCN7850 Bluetooth chipset. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- .../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml index 28296b6d35b2..abc81d0a706e 100644 --- a/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml +++ b/Documentation/devicetree/bindings/net/bluetooth/qualcomm-bluetooth.yaml @@ -25,6 +25,7 @@ properties: - qcom,qca6390-bt - qcom,wcn6750-bt - qcom,wcn6855-bt + - qcom,wcn7850-bt enable-gpios: maxItems: 1 @@ -54,6 +55,9 @@ properties: vddaon-supply: description: VDD_AON supply regulator handle + vdddig-supply: + description: VDD_DIG supply regulator handle + vddbtcxmx-supply: description: VDD_BT_CXMX supply regulator handle @@ -69,6 +73,9 @@ properties: vddrfa1p2-supply: description: VDD_RFA_1P2 supply regulator handle + vddrfa1p9-supply: + description: VDD_RFA_1P9 supply regulator handle + vddrfa2p2-supply: description: VDD_RFA_2P2 supply regulator handle @@ -152,6 +159,22 @@ allOf: - vddrfa0p8-supply - vddrfa1p2-supply - vddrfa1p7-supply + - if: + properties: + compatible: + contains: + enum: + - qcom,wcn7850-bt + then: + required: + - enable-gpios + - swctrl-gpios + - vddio-supply + - vddaon-supply + - vdddig-supply + - vddrfa0p8-supply + - vddrfa1p2-supply + - vddrfa1p9-supply examples: - | -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset 2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong @ 2023-06-22 1:54 ` Rob Herring 0 siblings, 0 replies; 9+ messages in thread From: Rob Herring @ 2023-06-22 1:54 UTC (permalink / raw) To: Neil Armstrong Cc: netdev, Balakrishna Godavarthi, David S. Miller, Bjorn Andersson, Andy Gross, linux-bluetooth, Conor Dooley, linux-kernel, Jakub Kicinski, Johan Hedberg, Luiz Augusto von Dentz, devicetree, Rob Herring, Rocky Liao, linux-arm-msm, Eric Dumazet, Marcel Holtmann, Krzysztof Kozlowski, Konrad Dybcio, Paolo Abeni On Tue, 20 Jun 2023 17:19:36 +0200, Neil Armstrong wrote: > Document the WCN7850 Bluetooth chipset. > > Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> > --- > .../bindings/net/bluetooth/qualcomm-bluetooth.yaml | 23 ++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > Reviewed-by: Rob Herring <robh@kernel.org> ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 2/4] bluetooth: qca: add support for WCN7850 2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong 2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong @ 2023-06-20 15:19 ` Neil Armstrong 2023-06-20 15:43 ` Konrad Dybcio 2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong 2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong 3 siblings, 1 reply; 9+ messages in thread From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw) To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, Andy Gross, Bjorn Andersson, Konrad Dybcio Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm, Neil Armstrong Add support for the WCN7850 Bluetooth chipset. Tested on the SM8550 QRD platform. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- drivers/bluetooth/btqca.c | 7 +++++++ drivers/bluetooth/btqca.h | 10 ++++++++++ drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++----------- 3 files changed, 54 insertions(+), 11 deletions(-) diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c index e7e58a956d15..037146b476ff 100644 --- a/drivers/bluetooth/btqca.c +++ b/drivers/bluetooth/btqca.c @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, } else if (soc_type == QCA_WCN6855) { snprintf(config.fwname, sizeof(config.fwname), "qca/hpbtfw%02x.tlv", rom_ver); + } else if (soc_type == QCA_WCN7850) { + snprintf(config.fwname, sizeof(config.fwname), + "qca/hmtbtfw%02x.tlv", rom_ver); } else { snprintf(config.fwname, sizeof(config.fwname), "qca/rampatch_%08x.bin", soc_ver); @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, else if (soc_type == QCA_WCN6855) snprintf(config.fwname, sizeof(config.fwname), "qca/hpnv%02x.bin", rom_ver); + else if (soc_type == QCA_WCN7850) + snprintf(config.fwname, sizeof(config.fwname), + "qca/hmtnv%02x.bin", rom_ver); else snprintf(config.fwname, sizeof(config.fwname), "qca/nvm_%08x.bin", soc_ver); @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, case QCA_WCN3991: case QCA_WCN6750: case QCA_WCN6855: + case QCA_WCN7850: /* get fw build info */ err = qca_read_fw_build_info(hdev); if (err < 0) diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h index b884095bcd9d..ff1850e984fe 100644 --- a/drivers/bluetooth/btqca.h +++ b/drivers/bluetooth/btqca.h @@ -148,6 +148,7 @@ enum qca_btsoc_type { QCA_QCA6390, QCA_WCN6750, QCA_WCN6855, + QCA_WCN7850, }; #if IS_ENABLED(CONFIG_BT_QCA) @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) { return soc_type == QCA_WCN6855; } +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) +{ + return soc_type == QCA_WCN7850; +} #else @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) return false; } +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) +{ + return false; +} + static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev) { return -EOPNOTSUPP; diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c index e30c979535b1..49b8d75d271e 100644 --- a/drivers/bluetooth/hci_qca.c +++ b/drivers/bluetooth/hci_qca.c @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) /* Give the controller time to process the request */ if (qca_is_wcn399x(qca_soc_type(hu)) || qca_is_wcn6750(qca_soc_type(hu)) || - qca_is_wcn6855(qca_soc_type(hu))) + qca_is_wcn6855(qca_soc_type(hu)) || + qca_is_wcn7850(qca_soc_type(hu))) usleep_range(1000, 10000); else msleep(300); @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu) { if (qca_is_wcn399x(qca_soc_type(hu)) || qca_is_wcn6750(qca_soc_type(hu)) || - qca_is_wcn6855(qca_soc_type(hu))) { + qca_is_wcn6855(qca_soc_type(hu)) || + qca_is_wcn7850(qca_soc_type(hu))) { if (!qca_get_speed(hu, QCA_INIT_SPEED) && !qca_get_speed(hu, QCA_OPER_SPEED)) return -EINVAL; @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) */ if (qca_is_wcn399x(soc_type) || qca_is_wcn6750(soc_type) || - qca_is_wcn6855(soc_type)) + qca_is_wcn6855(soc_type) || + qca_is_wcn7850(soc_type)) hci_uart_set_flow_control(hu, true); if (soc_type == QCA_WCN3990) { @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) error: if (qca_is_wcn399x(soc_type) || qca_is_wcn6750(soc_type) || - qca_is_wcn6855(soc_type)) + qca_is_wcn6855(soc_type) || + qca_is_wcn7850(soc_type)) hci_uart_set_flow_control(hu, false); if (soc_type == QCA_WCN3990) { @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev) if (qca_is_wcn399x(soc_type) || qca_is_wcn6750(soc_type) || - qca_is_wcn6855(soc_type)) { + qca_is_wcn6855(soc_type) || + qca_is_wcn7850(soc_type)) { ret = qca_regulator_init(hu); } else { qcadev = serdev_device_get_drvdata(hu->serdev); @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu) bt_dev_info(hdev, "setting up %s", qca_is_wcn399x(soc_type) ? "wcn399x" : (soc_type == QCA_WCN6750) ? "wcn6750" : - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390"); + (soc_type == QCA_WCN6855) ? "wcn6855" : + (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390"); qca->memdump_state = QCA_MEMDUMP_IDLE; @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu) if (qca_is_wcn399x(soc_type) || qca_is_wcn6750(soc_type) || - qca_is_wcn6855(soc_type)) { + qca_is_wcn6855(soc_type) || + qca_is_wcn7850(soc_type)) { set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); hci_set_aosp_capable(hdev); @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu) if (!(qca_is_wcn399x(soc_type) || qca_is_wcn6750(soc_type) || - qca_is_wcn6855(soc_type))) { + qca_is_wcn6855(soc_type) || + qca_is_wcn7850(soc_type))) { /* Get QCA version information */ ret = qca_read_soc_version(hdev, &ver, soc_type); if (ret) @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = { .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, }; +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = { + .soc_type = QCA_WCN7850, + .vregs = (struct qca_vreg []) { + { "vddio", 5000 }, + { "vddaon", 26000 }, + { "vdddig", 126000 }, + { "vddrfa0p8", 102000 }, + { "vddrfa1p2", 257000 }, + { "vddrfa1p9", 302000 }, + }, + .num_vregs = 6, + .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, +}; + static void qca_power_shutdown(struct hci_uart *hu) { struct qca_serdev *qcadev; @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) if (data && (qca_is_wcn399x(data->soc_type) || qca_is_wcn6750(data->soc_type) || - qca_is_wcn6855(data->soc_type))) { + qca_is_wcn6855(data->soc_type) || + qca_is_wcn7850(data->soc_type))) { qcadev->btsoc_type = data->soc_type; qcadev->bt_power = devm_kzalloc(&serdev->dev, sizeof(struct qca_power), @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) GPIOD_IN); if (IS_ERR_OR_NULL(qcadev->sw_ctrl) && (data->soc_type == QCA_WCN6750 || - data->soc_type == QCA_WCN6855)) + data->soc_type == QCA_WCN6855 || + data->soc_type == QCA_WCN7850)) dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n"); qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev) if ((qca_is_wcn399x(qcadev->btsoc_type) || qca_is_wcn6750(qcadev->btsoc_type) || - qca_is_wcn6855(qcadev->btsoc_type)) && + qca_is_wcn6855(qcadev->btsoc_type) || + qca_is_wcn7850(qcadev->btsoc_type)) && power->vregs_on) qca_power_shutdown(&qcadev->serdev_hu); else if (qcadev->susclk) @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = { { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998}, { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750}, { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855}, + { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850}, { /* sentinel */ } }; MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match); -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850 2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong @ 2023-06-20 15:43 ` Konrad Dybcio 2023-06-22 19:54 ` Luiz Augusto von Dentz 0 siblings, 1 reply; 9+ messages in thread From: Konrad Dybcio @ 2023-06-20 15:43 UTC (permalink / raw) To: Neil Armstrong, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, Andy Gross, Bjorn Andersson Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm On 20.06.2023 17:19, Neil Armstrong wrote: > Add support for the WCN7850 Bluetooth chipset. > > Tested on the SM8550 QRD platform. > > Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> > --- I don't have comments for this patch specifically, but: > drivers/bluetooth/btqca.c | 7 +++++++ > drivers/bluetooth/btqca.h | 10 ++++++++++ > drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++----------- > 3 files changed, 54 insertions(+), 11 deletions(-) > > diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c > index e7e58a956d15..037146b476ff 100644 > --- a/drivers/bluetooth/btqca.c > +++ b/drivers/bluetooth/btqca.c > @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > } else if (soc_type == QCA_WCN6855) { > snprintf(config.fwname, sizeof(config.fwname), > "qca/hpbtfw%02x.tlv", rom_ver); > + } else if (soc_type == QCA_WCN7850) { > + snprintf(config.fwname, sizeof(config.fwname), > + "qca/hmtbtfw%02x.tlv", rom_ver); > } else { > snprintf(config.fwname, sizeof(config.fwname), > "qca/rampatch_%08x.bin", soc_ver); > @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > else if (soc_type == QCA_WCN6855) > snprintf(config.fwname, sizeof(config.fwname), > "qca/hpnv%02x.bin", rom_ver); > + else if (soc_type == QCA_WCN7850) > + snprintf(config.fwname, sizeof(config.fwname), > + "qca/hmtnv%02x.bin", rom_ver); > else > snprintf(config.fwname, sizeof(config.fwname), > "qca/nvm_%08x.bin", soc_ver); The above changes should probably be made switch statements as well > @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > case QCA_WCN3991: > case QCA_WCN6750: > case QCA_WCN6855: > + case QCA_WCN7850: > /* get fw build info */ > err = qca_read_fw_build_info(hdev); > if (err < 0) > diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h > index b884095bcd9d..ff1850e984fe 100644 > --- a/drivers/bluetooth/btqca.h > +++ b/drivers/bluetooth/btqca.h > @@ -148,6 +148,7 @@ enum qca_btsoc_type { > QCA_QCA6390, > QCA_WCN6750, > QCA_WCN6855, > + QCA_WCN7850, > }; > > #if IS_ENABLED(CONFIG_BT_QCA) > @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) > { > return soc_type == QCA_WCN6855; > } > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) > +{ > + return soc_type == QCA_WCN7850; > +} > > #else > > @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) > return false; > } > > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) > +{ > + return false; > +} > + > static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev) > { > return -EOPNOTSUPP; > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c > index e30c979535b1..49b8d75d271e 100644 > --- a/drivers/bluetooth/hci_qca.c > +++ b/drivers/bluetooth/hci_qca.c > @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) > /* Give the controller time to process the request */ > if (qca_is_wcn399x(qca_soc_type(hu)) || > qca_is_wcn6750(qca_soc_type(hu)) || > - qca_is_wcn6855(qca_soc_type(hu))) > + qca_is_wcn6855(qca_soc_type(hu)) || > + qca_is_wcn7850(qca_soc_type(hu))) > usleep_range(1000, 10000); Separate topic, but I see usages of the helper and raw comparisons everywhere.. I'd vote for switch everywhere Konrad > else > msleep(300); > @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu) > { > if (qca_is_wcn399x(qca_soc_type(hu)) || > qca_is_wcn6750(qca_soc_type(hu)) || > - qca_is_wcn6855(qca_soc_type(hu))) { > + qca_is_wcn6855(qca_soc_type(hu)) || > + qca_is_wcn7850(qca_soc_type(hu))) { > if (!qca_get_speed(hu, QCA_INIT_SPEED) && > !qca_get_speed(hu, QCA_OPER_SPEED)) > return -EINVAL; > @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) > */ > if (qca_is_wcn399x(soc_type) || > qca_is_wcn6750(soc_type) || > - qca_is_wcn6855(soc_type)) > + qca_is_wcn6855(soc_type) || > + qca_is_wcn7850(soc_type)) > hci_uart_set_flow_control(hu, true); > > if (soc_type == QCA_WCN3990) { > @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) > error: > if (qca_is_wcn399x(soc_type) || > qca_is_wcn6750(soc_type) || > - qca_is_wcn6855(soc_type)) > + qca_is_wcn6855(soc_type) || > + qca_is_wcn7850(soc_type)) > hci_uart_set_flow_control(hu, false); > > if (soc_type == QCA_WCN3990) { > @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev) > > if (qca_is_wcn399x(soc_type) || > qca_is_wcn6750(soc_type) || > - qca_is_wcn6855(soc_type)) { > + qca_is_wcn6855(soc_type) || > + qca_is_wcn7850(soc_type)) { > ret = qca_regulator_init(hu); > } else { > qcadev = serdev_device_get_drvdata(hu->serdev); > @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu) > bt_dev_info(hdev, "setting up %s", > qca_is_wcn399x(soc_type) ? "wcn399x" : > (soc_type == QCA_WCN6750) ? "wcn6750" : > - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390"); > + (soc_type == QCA_WCN6855) ? "wcn6855" : > + (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390"); > > qca->memdump_state = QCA_MEMDUMP_IDLE; > > @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu) > > if (qca_is_wcn399x(soc_type) || > qca_is_wcn6750(soc_type) || > - qca_is_wcn6855(soc_type)) { > + qca_is_wcn6855(soc_type) || > + qca_is_wcn7850(soc_type)) { > set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); > hci_set_aosp_capable(hdev); > > @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu) > > if (!(qca_is_wcn399x(soc_type) || > qca_is_wcn6750(soc_type) || > - qca_is_wcn6855(soc_type))) { > + qca_is_wcn6855(soc_type) || > + qca_is_wcn7850(soc_type))) { > /* Get QCA version information */ > ret = qca_read_soc_version(hdev, &ver, soc_type); > if (ret) > @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = { > .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, > }; > > +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = { > + .soc_type = QCA_WCN7850, > + .vregs = (struct qca_vreg []) { > + { "vddio", 5000 }, > + { "vddaon", 26000 }, > + { "vdddig", 126000 }, > + { "vddrfa0p8", 102000 }, > + { "vddrfa1p2", 257000 }, > + { "vddrfa1p9", 302000 }, > + }, > + .num_vregs = 6, > + .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, > +}; > + > static void qca_power_shutdown(struct hci_uart *hu) > { > struct qca_serdev *qcadev; > @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) > if (data && > (qca_is_wcn399x(data->soc_type) || > qca_is_wcn6750(data->soc_type) || > - qca_is_wcn6855(data->soc_type))) { > + qca_is_wcn6855(data->soc_type) || > + qca_is_wcn7850(data->soc_type))) { > qcadev->btsoc_type = data->soc_type; > qcadev->bt_power = devm_kzalloc(&serdev->dev, > sizeof(struct qca_power), > @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) > GPIOD_IN); > if (IS_ERR_OR_NULL(qcadev->sw_ctrl) && > (data->soc_type == QCA_WCN6750 || > - data->soc_type == QCA_WCN6855)) > + data->soc_type == QCA_WCN6855 || > + data->soc_type == QCA_WCN7850)) > dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n"); > > qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); > @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev) > > if ((qca_is_wcn399x(qcadev->btsoc_type) || > qca_is_wcn6750(qcadev->btsoc_type) || > - qca_is_wcn6855(qcadev->btsoc_type)) && > + qca_is_wcn6855(qcadev->btsoc_type) || > + qca_is_wcn7850(qcadev->btsoc_type)) && > power->vregs_on) > qca_power_shutdown(&qcadev->serdev_hu); > else if (qcadev->susclk) > @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = { > { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998}, > { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750}, > { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855}, > + { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850}, > { /* sentinel */ } > }; > MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match); > ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850 2023-06-20 15:43 ` Konrad Dybcio @ 2023-06-22 19:54 ` Luiz Augusto von Dentz 2023-06-23 12:52 ` Neil Armstrong 0 siblings, 1 reply; 9+ messages in thread From: Luiz Augusto von Dentz @ 2023-06-22 19:54 UTC (permalink / raw) To: Konrad Dybcio Cc: Neil Armstrong, David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Andy Gross, Bjorn Andersson, netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm Hi Neil On Tue, Jun 20, 2023 at 8:43 AM Konrad Dybcio <konrad.dybcio@linaro.org> wrote: > > On 20.06.2023 17:19, Neil Armstrong wrote: > > Add support for the WCN7850 Bluetooth chipset. > > > > Tested on the SM8550 QRD platform. > > > > Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> > > --- > I don't have comments for this patch specifically, but: > > > > drivers/bluetooth/btqca.c | 7 +++++++ > > drivers/bluetooth/btqca.h | 10 ++++++++++ > > drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++----------- > > 3 files changed, 54 insertions(+), 11 deletions(-) > > > > diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c > > index e7e58a956d15..037146b476ff 100644 > > --- a/drivers/bluetooth/btqca.c > > +++ b/drivers/bluetooth/btqca.c > > @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > > } else if (soc_type == QCA_WCN6855) { > > snprintf(config.fwname, sizeof(config.fwname), > > "qca/hpbtfw%02x.tlv", rom_ver); > > + } else if (soc_type == QCA_WCN7850) { > > + snprintf(config.fwname, sizeof(config.fwname), > > + "qca/hmtbtfw%02x.tlv", rom_ver); > > } else { > > snprintf(config.fwname, sizeof(config.fwname), > > "qca/rampatch_%08x.bin", soc_ver); > > @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > > else if (soc_type == QCA_WCN6855) > > snprintf(config.fwname, sizeof(config.fwname), > > "qca/hpnv%02x.bin", rom_ver); > > + else if (soc_type == QCA_WCN7850) > > + snprintf(config.fwname, sizeof(config.fwname), > > + "qca/hmtnv%02x.bin", rom_ver); > > else > > snprintf(config.fwname, sizeof(config.fwname), > > "qca/nvm_%08x.bin", soc_ver); > The above changes should probably be made switch statements as well > > > @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, > > case QCA_WCN3991: > > case QCA_WCN6750: > > case QCA_WCN6855: > > + case QCA_WCN7850: > > /* get fw build info */ > > err = qca_read_fw_build_info(hdev); > > if (err < 0) > > diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h > > index b884095bcd9d..ff1850e984fe 100644 > > --- a/drivers/bluetooth/btqca.h > > +++ b/drivers/bluetooth/btqca.h > > @@ -148,6 +148,7 @@ enum qca_btsoc_type { > > QCA_QCA6390, > > QCA_WCN6750, > > QCA_WCN6855, > > + QCA_WCN7850, > > }; > > > > #if IS_ENABLED(CONFIG_BT_QCA) > > @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) > > { > > return soc_type == QCA_WCN6855; > > } > > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) > > +{ > > + return soc_type == QCA_WCN7850; > > +} > > > > #else > > > > @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) > > return false; > > } > > > > +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) > > +{ > > + return false; > > +} > > + > > static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev) > > { > > return -EOPNOTSUPP; > > diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c > > index e30c979535b1..49b8d75d271e 100644 > > --- a/drivers/bluetooth/hci_qca.c > > +++ b/drivers/bluetooth/hci_qca.c > > @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) > > /* Give the controller time to process the request */ > > if (qca_is_wcn399x(qca_soc_type(hu)) || > > qca_is_wcn6750(qca_soc_type(hu)) || > > - qca_is_wcn6855(qca_soc_type(hu))) > > + qca_is_wcn6855(qca_soc_type(hu)) || > > + qca_is_wcn7850(qca_soc_type(hu))) > > usleep_range(1000, 10000); > Separate topic, but I see usages of the helper and raw comparisons > everywhere.. I'd vote for switch everywhere +1, most of the time it is preferable to go with switches which makes the code cleaner/more readable, Im fine not requiring it in this set but I hope someone looks into doing some cleanup in this code. > Konrad > > else > > msleep(300); > > @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu) > > { > > if (qca_is_wcn399x(qca_soc_type(hu)) || > > qca_is_wcn6750(qca_soc_type(hu)) || > > - qca_is_wcn6855(qca_soc_type(hu))) { > > + qca_is_wcn6855(qca_soc_type(hu)) || > > + qca_is_wcn7850(qca_soc_type(hu))) { > > if (!qca_get_speed(hu, QCA_INIT_SPEED) && > > !qca_get_speed(hu, QCA_OPER_SPEED)) > > return -EINVAL; > > @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) > > */ > > if (qca_is_wcn399x(soc_type) || > > qca_is_wcn6750(soc_type) || > > - qca_is_wcn6855(soc_type)) > > + qca_is_wcn6855(soc_type) || > > + qca_is_wcn7850(soc_type)) > > hci_uart_set_flow_control(hu, true); > > > > if (soc_type == QCA_WCN3990) { > > @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) > > error: > > if (qca_is_wcn399x(soc_type) || > > qca_is_wcn6750(soc_type) || > > - qca_is_wcn6855(soc_type)) > > + qca_is_wcn6855(soc_type) || > > + qca_is_wcn7850(soc_type)) > > hci_uart_set_flow_control(hu, false); > > > > if (soc_type == QCA_WCN3990) { > > @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev) > > > > if (qca_is_wcn399x(soc_type) || > > qca_is_wcn6750(soc_type) || > > - qca_is_wcn6855(soc_type)) { > > + qca_is_wcn6855(soc_type) || > > + qca_is_wcn7850(soc_type)) { > > ret = qca_regulator_init(hu); > > } else { > > qcadev = serdev_device_get_drvdata(hu->serdev); > > @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu) > > bt_dev_info(hdev, "setting up %s", > > qca_is_wcn399x(soc_type) ? "wcn399x" : > > (soc_type == QCA_WCN6750) ? "wcn6750" : > > - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390"); > > + (soc_type == QCA_WCN6855) ? "wcn6855" : > > + (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390"); > > > > qca->memdump_state = QCA_MEMDUMP_IDLE; > > > > @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu) > > > > if (qca_is_wcn399x(soc_type) || > > qca_is_wcn6750(soc_type) || > > - qca_is_wcn6855(soc_type)) { > > + qca_is_wcn6855(soc_type) || > > + qca_is_wcn7850(soc_type)) { > > set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); > > hci_set_aosp_capable(hdev); > > > > @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu) > > > > if (!(qca_is_wcn399x(soc_type) || > > qca_is_wcn6750(soc_type) || > > - qca_is_wcn6855(soc_type))) { > > + qca_is_wcn6855(soc_type) || > > + qca_is_wcn7850(soc_type))) { > > /* Get QCA version information */ > > ret = qca_read_soc_version(hdev, &ver, soc_type); > > if (ret) > > @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = { > > .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, > > }; > > > > +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = { > > + .soc_type = QCA_WCN7850, > > + .vregs = (struct qca_vreg []) { > > + { "vddio", 5000 }, > > + { "vddaon", 26000 }, > > + { "vdddig", 126000 }, > > + { "vddrfa0p8", 102000 }, > > + { "vddrfa1p2", 257000 }, > > + { "vddrfa1p9", 302000 }, > > + }, > > + .num_vregs = 6, > > + .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, > > +}; > > + > > static void qca_power_shutdown(struct hci_uart *hu) > > { > > struct qca_serdev *qcadev; > > @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) > > if (data && > > (qca_is_wcn399x(data->soc_type) || > > qca_is_wcn6750(data->soc_type) || > > - qca_is_wcn6855(data->soc_type))) { > > + qca_is_wcn6855(data->soc_type) || > > + qca_is_wcn7850(data->soc_type))) { > > qcadev->btsoc_type = data->soc_type; > > qcadev->bt_power = devm_kzalloc(&serdev->dev, > > sizeof(struct qca_power), > > @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) > > GPIOD_IN); > > if (IS_ERR_OR_NULL(qcadev->sw_ctrl) && > > (data->soc_type == QCA_WCN6750 || > > - data->soc_type == QCA_WCN6855)) > > + data->soc_type == QCA_WCN6855 || > > + data->soc_type == QCA_WCN7850)) > > dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n"); > > > > qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); > > @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev) > > > > if ((qca_is_wcn399x(qcadev->btsoc_type) || > > qca_is_wcn6750(qcadev->btsoc_type) || > > - qca_is_wcn6855(qcadev->btsoc_type)) && > > + qca_is_wcn6855(qcadev->btsoc_type) || > > + qca_is_wcn7850(qcadev->btsoc_type)) && > > power->vregs_on) > > qca_power_shutdown(&qcadev->serdev_hu); > > else if (qcadev->susclk) > > @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = { > > { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998}, > > { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750}, > > { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855}, > > + { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850}, > > { /* sentinel */ } > > }; > > MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match); > > -- Luiz Augusto von Dentz ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 2/4] bluetooth: qca: add support for WCN7850 2023-06-22 19:54 ` Luiz Augusto von Dentz @ 2023-06-23 12:52 ` Neil Armstrong 0 siblings, 0 replies; 9+ messages in thread From: Neil Armstrong @ 2023-06-23 12:52 UTC (permalink / raw) To: Luiz Augusto von Dentz, Konrad Dybcio Cc: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Andy Gross, Bjorn Andersson, netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm Hi Luiz, On 22/06/2023 21:54, Luiz Augusto von Dentz wrote: > Hi Neil > > On Tue, Jun 20, 2023 at 8:43 AM Konrad Dybcio <konrad.dybcio@linaro.org> wrote: >> >> On 20.06.2023 17:19, Neil Armstrong wrote: >>> Add support for the WCN7850 Bluetooth chipset. >>> >>> Tested on the SM8550 QRD platform. >>> >>> Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> >>> --- >> I don't have comments for this patch specifically, but: >> >> >>> drivers/bluetooth/btqca.c | 7 +++++++ >>> drivers/bluetooth/btqca.h | 10 ++++++++++ >>> drivers/bluetooth/hci_qca.c | 48 ++++++++++++++++++++++++++++++++++----------- >>> 3 files changed, 54 insertions(+), 11 deletions(-) >>> >>> diff --git a/drivers/bluetooth/btqca.c b/drivers/bluetooth/btqca.c >>> index e7e58a956d15..037146b476ff 100644 >>> --- a/drivers/bluetooth/btqca.c >>> +++ b/drivers/bluetooth/btqca.c >>> @@ -617,6 +617,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, >>> } else if (soc_type == QCA_WCN6855) { >>> snprintf(config.fwname, sizeof(config.fwname), >>> "qca/hpbtfw%02x.tlv", rom_ver); >>> + } else if (soc_type == QCA_WCN7850) { >>> + snprintf(config.fwname, sizeof(config.fwname), >>> + "qca/hmtbtfw%02x.tlv", rom_ver); >>> } else { >>> snprintf(config.fwname, sizeof(config.fwname), >>> "qca/rampatch_%08x.bin", soc_ver); >>> @@ -654,6 +657,9 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, >>> else if (soc_type == QCA_WCN6855) >>> snprintf(config.fwname, sizeof(config.fwname), >>> "qca/hpnv%02x.bin", rom_ver); >>> + else if (soc_type == QCA_WCN7850) >>> + snprintf(config.fwname, sizeof(config.fwname), >>> + "qca/hmtnv%02x.bin", rom_ver); >>> else >>> snprintf(config.fwname, sizeof(config.fwname), >>> "qca/nvm_%08x.bin", soc_ver); >> The above changes should probably be made switch statements as well >> >>> @@ -695,6 +701,7 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, >>> case QCA_WCN3991: >>> case QCA_WCN6750: >>> case QCA_WCN6855: >>> + case QCA_WCN7850: >>> /* get fw build info */ >>> err = qca_read_fw_build_info(hdev); >>> if (err < 0) >>> diff --git a/drivers/bluetooth/btqca.h b/drivers/bluetooth/btqca.h >>> index b884095bcd9d..ff1850e984fe 100644 >>> --- a/drivers/bluetooth/btqca.h >>> +++ b/drivers/bluetooth/btqca.h >>> @@ -148,6 +148,7 @@ enum qca_btsoc_type { >>> QCA_QCA6390, >>> QCA_WCN6750, >>> QCA_WCN6855, >>> + QCA_WCN7850, >>> }; >>> >>> #if IS_ENABLED(CONFIG_BT_QCA) >>> @@ -173,6 +174,10 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) >>> { >>> return soc_type == QCA_WCN6855; >>> } >>> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) >>> +{ >>> + return soc_type == QCA_WCN7850; >>> +} >>> >>> #else >>> >>> @@ -216,6 +221,11 @@ static inline bool qca_is_wcn6855(enum qca_btsoc_type soc_type) >>> return false; >>> } >>> >>> +static inline bool qca_is_wcn7850(enum qca_btsoc_type soc_type) >>> +{ >>> + return false; >>> +} >>> + >>> static inline int qca_send_pre_shutdown_cmd(struct hci_dev *hdev) >>> { >>> return -EOPNOTSUPP; >>> diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c >>> index e30c979535b1..49b8d75d271e 100644 >>> --- a/drivers/bluetooth/hci_qca.c >>> +++ b/drivers/bluetooth/hci_qca.c >>> @@ -1322,7 +1322,8 @@ static int qca_set_baudrate(struct hci_dev *hdev, uint8_t baudrate) >>> /* Give the controller time to process the request */ >>> if (qca_is_wcn399x(qca_soc_type(hu)) || >>> qca_is_wcn6750(qca_soc_type(hu)) || >>> - qca_is_wcn6855(qca_soc_type(hu))) >>> + qca_is_wcn6855(qca_soc_type(hu)) || >>> + qca_is_wcn7850(qca_soc_type(hu))) >>> usleep_range(1000, 10000); >> Separate topic, but I see usages of the helper and raw comparisons >> everywhere.. I'd vote for switch everywhere > > +1, most of the time it is preferable to go with switches which makes > the code cleaner/more readable, Im fine not requiring it in this set > but I hope someone looks into doing some cleanup in this code. Since we have time until the end of the v6.5 merge window I'll add an intermediate change adding switch/case for v2. Thanks, Neil > >> Konrad >>> else >>> msleep(300); >>> @@ -1400,7 +1401,8 @@ static int qca_check_speeds(struct hci_uart *hu) >>> { >>> if (qca_is_wcn399x(qca_soc_type(hu)) || >>> qca_is_wcn6750(qca_soc_type(hu)) || >>> - qca_is_wcn6855(qca_soc_type(hu))) { >>> + qca_is_wcn6855(qca_soc_type(hu)) || >>> + qca_is_wcn7850(qca_soc_type(hu))) { >>> if (!qca_get_speed(hu, QCA_INIT_SPEED) && >>> !qca_get_speed(hu, QCA_OPER_SPEED)) >>> return -EINVAL; >>> @@ -1435,7 +1437,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) >>> */ >>> if (qca_is_wcn399x(soc_type) || >>> qca_is_wcn6750(soc_type) || >>> - qca_is_wcn6855(soc_type)) >>> + qca_is_wcn6855(soc_type) || >>> + qca_is_wcn7850(soc_type)) >>> hci_uart_set_flow_control(hu, true); >>> >>> if (soc_type == QCA_WCN3990) { >>> @@ -1454,7 +1457,8 @@ static int qca_set_speed(struct hci_uart *hu, enum qca_speed_type speed_type) >>> error: >>> if (qca_is_wcn399x(soc_type) || >>> qca_is_wcn6750(soc_type) || >>> - qca_is_wcn6855(soc_type)) >>> + qca_is_wcn6855(soc_type) || >>> + qca_is_wcn7850(soc_type)) >>> hci_uart_set_flow_control(hu, false); >>> >>> if (soc_type == QCA_WCN3990) { >>> @@ -1691,7 +1695,8 @@ static int qca_power_on(struct hci_dev *hdev) >>> >>> if (qca_is_wcn399x(soc_type) || >>> qca_is_wcn6750(soc_type) || >>> - qca_is_wcn6855(soc_type)) { >>> + qca_is_wcn6855(soc_type) || >>> + qca_is_wcn7850(soc_type)) { >>> ret = qca_regulator_init(hu); >>> } else { >>> qcadev = serdev_device_get_drvdata(hu->serdev); >>> @@ -1733,7 +1738,8 @@ static int qca_setup(struct hci_uart *hu) >>> bt_dev_info(hdev, "setting up %s", >>> qca_is_wcn399x(soc_type) ? "wcn399x" : >>> (soc_type == QCA_WCN6750) ? "wcn6750" : >>> - (soc_type == QCA_WCN6855) ? "wcn6855" : "ROME/QCA6390"); >>> + (soc_type == QCA_WCN6855) ? "wcn6855" : >>> + (soc_type == QCA_WCN7850) ? "wcn7850" : "ROME/QCA6390"); >>> >>> qca->memdump_state = QCA_MEMDUMP_IDLE; >>> >>> @@ -1746,7 +1752,8 @@ static int qca_setup(struct hci_uart *hu) >>> >>> if (qca_is_wcn399x(soc_type) || >>> qca_is_wcn6750(soc_type) || >>> - qca_is_wcn6855(soc_type)) { >>> + qca_is_wcn6855(soc_type) || >>> + qca_is_wcn7850(soc_type)) { >>> set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); >>> hci_set_aosp_capable(hdev); >>> >>> @@ -1769,7 +1776,8 @@ static int qca_setup(struct hci_uart *hu) >>> >>> if (!(qca_is_wcn399x(soc_type) || >>> qca_is_wcn6750(soc_type) || >>> - qca_is_wcn6855(soc_type))) { >>> + qca_is_wcn6855(soc_type) || >>> + qca_is_wcn7850(soc_type))) { >>> /* Get QCA version information */ >>> ret = qca_read_soc_version(hdev, &ver, soc_type); >>> if (ret) >>> @@ -1909,6 +1917,20 @@ static const struct qca_device_data qca_soc_data_wcn6855 __maybe_unused = { >>> .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, >>> }; >>> >>> +static const struct qca_device_data qca_soc_data_wcn7850 __maybe_unused = { >>> + .soc_type = QCA_WCN7850, >>> + .vregs = (struct qca_vreg []) { >>> + { "vddio", 5000 }, >>> + { "vddaon", 26000 }, >>> + { "vdddig", 126000 }, >>> + { "vddrfa0p8", 102000 }, >>> + { "vddrfa1p2", 257000 }, >>> + { "vddrfa1p9", 302000 }, >>> + }, >>> + .num_vregs = 6, >>> + .capabilities = QCA_CAP_WIDEBAND_SPEECH | QCA_CAP_VALID_LE_STATES, >>> +}; >>> + >>> static void qca_power_shutdown(struct hci_uart *hu) >>> { >>> struct qca_serdev *qcadev; >>> @@ -2074,7 +2096,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) >>> if (data && >>> (qca_is_wcn399x(data->soc_type) || >>> qca_is_wcn6750(data->soc_type) || >>> - qca_is_wcn6855(data->soc_type))) { >>> + qca_is_wcn6855(data->soc_type) || >>> + qca_is_wcn7850(data->soc_type))) { >>> qcadev->btsoc_type = data->soc_type; >>> qcadev->bt_power = devm_kzalloc(&serdev->dev, >>> sizeof(struct qca_power), >>> @@ -2105,7 +2128,8 @@ static int qca_serdev_probe(struct serdev_device *serdev) >>> GPIOD_IN); >>> if (IS_ERR_OR_NULL(qcadev->sw_ctrl) && >>> (data->soc_type == QCA_WCN6750 || >>> - data->soc_type == QCA_WCN6855)) >>> + data->soc_type == QCA_WCN6855 || >>> + data->soc_type == QCA_WCN7850)) >>> dev_warn(&serdev->dev, "failed to acquire SW_CTRL gpio\n"); >>> >>> qcadev->susclk = devm_clk_get_optional(&serdev->dev, NULL); >>> @@ -2182,7 +2206,8 @@ static void qca_serdev_remove(struct serdev_device *serdev) >>> >>> if ((qca_is_wcn399x(qcadev->btsoc_type) || >>> qca_is_wcn6750(qcadev->btsoc_type) || >>> - qca_is_wcn6855(qcadev->btsoc_type)) && >>> + qca_is_wcn6855(qcadev->btsoc_type) || >>> + qca_is_wcn7850(qcadev->btsoc_type)) && >>> power->vregs_on) >>> qca_power_shutdown(&qcadev->serdev_hu); >>> else if (qcadev->susclk) >>> @@ -2368,6 +2393,7 @@ static const struct of_device_id qca_bluetooth_of_match[] = { >>> { .compatible = "qcom,wcn3998-bt", .data = &qca_soc_data_wcn3998}, >>> { .compatible = "qcom,wcn6750-bt", .data = &qca_soc_data_wcn6750}, >>> { .compatible = "qcom,wcn6855-bt", .data = &qca_soc_data_wcn6855}, >>> + { .compatible = "qcom,wcn7850-bt", .data = &qca_soc_data_wcn7850}, >>> { /* sentinel */ } >>> }; >>> MODULE_DEVICE_TABLE(of, qca_bluetooth_of_match); >>> > > > ^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes 2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong 2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong 2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong @ 2023-06-20 15:19 ` Neil Armstrong 2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong 3 siblings, 0 replies; 9+ messages in thread From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw) To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, Andy Gross, Bjorn Andersson, Konrad Dybcio Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm, Neil Armstrong Add the Geni High Speed UART QUP instance 2 element 6 node and associated default pinctrl. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- arch/arm64/boot/dts/qcom/sm8550.dtsi | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8550.dtsi b/arch/arm64/boot/dts/qcom/sm8550.dtsi index 41d60af93692..25dfc5fc5580 100644 --- a/arch/arm64/boot/dts/qcom/sm8550.dtsi +++ b/arch/arm64/boot/dts/qcom/sm8550.dtsi @@ -1053,6 +1053,20 @@ spi13: spi@894000 { status = "disabled"; }; + uart14: uart@898000 { + compatible = "qcom,geni-uart"; + reg = <0 0x898000 0 0x4000>; + clock-names = "se"; + clocks = <&gcc GCC_QUPV3_WRAP2_S6_CLK>; + pinctrl-names = "default"; + pinctrl-0 = <&qup_uart14_default>, <&qup_uart14_cts_rts>; + interrupts = <GIC_SPI 461 IRQ_TYPE_LEVEL_HIGH>; + interconnects = <&clk_virt MASTER_QUP_CORE_2 0 &clk_virt SLAVE_QUP_CORE_2 0>, + <&gem_noc MASTER_APPSS_PROC 0 &config_noc SLAVE_QUP_2 0>; + interconnect-names = "qup-core", "qup-config"; + status = "disabled"; + }; + i2c15: i2c@89c000 { compatible = "qcom,geni-i2c"; reg = <0 0x0089c000 0 0x4000>; @@ -3471,6 +3485,22 @@ qup_uart7_default: qup-uart7-default-state { bias-disable; }; + qup_uart14_default: qup-uart14-default-state { + /* TX, RX */ + pins = "gpio78", "gpio79"; + function = "qup2_se6"; + drive-strength = <2>; + bias-pull-up; + }; + + qup_uart14_cts_rts: qup-uart14-cts-rts-state { + /* CTS, RTS */ + pins = "gpio76", "gpio77"; + function = "qup2_se6"; + drive-strength = <2>; + bias-pull-down; + }; + sdc2_sleep: sdc2-sleep-state { clk-pins { pins = "sdc2_clk"; -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support 2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong ` (2 preceding siblings ...) 2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong @ 2023-06-20 15:19 ` Neil Armstrong 3 siblings, 0 replies; 9+ messages in thread From: Neil Armstrong @ 2023-06-20 15:19 UTC (permalink / raw) To: David S. Miller, Eric Dumazet, Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley, Balakrishna Godavarthi, Rocky Liao, Marcel Holtmann, Johan Hedberg, Luiz Augusto von Dentz, Andy Gross, Bjorn Andersson, Konrad Dybcio Cc: netdev, devicetree, linux-kernel, linux-bluetooth, linux-arm-msm, Neil Armstrong Enable the WCN7850 bluetooth over the UART14 link. Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org> --- arch/arm64/boot/dts/qcom/sm8550-qrd.dts | 43 +++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts index ec4feee6837d..5191fdbe72cb 100644 --- a/arch/arm64/boot/dts/qcom/sm8550-qrd.dts +++ b/arch/arm64/boot/dts/qcom/sm8550-qrd.dts @@ -22,6 +22,7 @@ / { aliases { serial0 = &uart7; + serial1 = &uart14; }; wcd938x: audio-codec { @@ -691,6 +692,10 @@ &qupv3_id_0 { status = "okay"; }; +&qupv3_id_1 { + status = "okay"; +}; + &remoteproc_adsp { firmware-name = "qcom/sm8550/adsp.mbn", "qcom/sm8550/adsp_dtb.mbn"; @@ -768,6 +773,21 @@ wcd_tx: codec@0,3 { &tlmm { gpio-reserved-ranges = <32 8>; + bt_default: bt-default-state { + bt-en-pins { + pins = "gpio81"; + function = "gpio"; + drive-strength = <16>; + bias-disable; + }; + + sw-ctrl-pins { + pins = "gpio82"; + function = "gpio"; + bias-pull-down; + }; + }; + sde_dsi_active: sde-dsi-active-state { pins = "gpio133"; function = "gpio"; @@ -809,6 +829,29 @@ &uart7 { status = "okay"; }; +&uart14 { + status = "okay"; + + bluetooth { + compatible = "qcom,wcn7850-bt"; + + vddio-supply = <&vreg_l15b_1p8>; + vddaon-supply = <&vreg_s4e_0p95>; + vdddig-supply = <&vreg_s4e_0p95>; + vddrfa0p8-supply = <&vreg_s4e_0p95>; + vddrfa1p2-supply = <&vreg_s4g_1p25>; + vddrfa1p9-supply = <&vreg_s6g_1p86>; + + max-speed = <3200000>; + + enable-gpios = <&tlmm 81 GPIO_ACTIVE_HIGH>; + swctrl-gpios = <&tlmm 82 GPIO_ACTIVE_HIGH>; + + pinctrl-0 = <&bt_default>; + pinctrl-names = "default"; + }; +}; + &ufs_mem_hc { reset-gpios = <&tlmm 210 GPIO_ACTIVE_LOW>; vcc-supply = <&vreg_l17b_2p5>; -- 2.34.1 ^ permalink raw reply related [flat|nested] 9+ messages in thread
end of thread, other threads:[~2023-06-23 12:53 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2023-06-20 15:19 [PATCH 0/4] bluetooth: qca: enable WCN7850 support Neil Armstrong 2023-06-20 15:19 ` [PATCH 1/4] dt-bindings: net: bluetooth: qualcomm: document WCN7850 chipset Neil Armstrong 2023-06-22 1:54 ` Rob Herring 2023-06-20 15:19 ` [PATCH 2/4] bluetooth: qca: add support for WCN7850 Neil Armstrong 2023-06-20 15:43 ` Konrad Dybcio 2023-06-22 19:54 ` Luiz Augusto von Dentz 2023-06-23 12:52 ` Neil Armstrong 2023-06-20 15:19 ` [PATCH 3/4] arm64: dts: qcom: sm8550: add UART14 nodes Neil Armstrong 2023-06-20 15:19 ` [PATCH 4/4] arm64: dts: qcom: sm8550-qrd: add bluetooth support Neil Armstrong
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).