hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/slimbus/qcom-ngd-ctrl.c
....@@ -666,10 +666,12 @@
666666 struct device *dev = ctrl->dev;
667667 int ret, size;
668668
669
- ctrl->dma_rx_channel = dma_request_slave_channel(dev, "rx");
670
- if (!ctrl->dma_rx_channel) {
671
- dev_err(dev, "Failed to request dma channels");
672
- return -EINVAL;
669
+ ctrl->dma_rx_channel = dma_request_chan(dev, "rx");
670
+ if (IS_ERR(ctrl->dma_rx_channel)) {
671
+ dev_err(dev, "Failed to request RX dma channel");
672
+ ret = PTR_ERR(ctrl->dma_rx_channel);
673
+ ctrl->dma_rx_channel = NULL;
674
+ return ret;
673675 }
674676
675677 size = QCOM_SLIM_NGD_DESC_NUM * SLIM_MSGQ_BUF_LEN;
....@@ -703,10 +705,12 @@
703705 int ret = 0;
704706 int size;
705707
706
- ctrl->dma_tx_channel = dma_request_slave_channel(dev, "tx");
707
- if (!ctrl->dma_tx_channel) {
708
- dev_err(dev, "Failed to request dma channels");
709
- return -EINVAL;
708
+ ctrl->dma_tx_channel = dma_request_chan(dev, "tx");
709
+ if (IS_ERR(ctrl->dma_tx_channel)) {
710
+ dev_err(dev, "Failed to request TX dma channel");
711
+ ret = PTR_ERR(ctrl->dma_tx_channel);
712
+ ctrl->dma_tx_channel = NULL;
713
+ return ret;
710714 }
711715
712716 size = ((QCOM_SLIM_NGD_DESC_NUM + 1) * SLIM_MSGQ_BUF_LEN);
....@@ -777,9 +781,6 @@
777781 u8 la = txn->la;
778782 bool usr_msg = false;
779783
780
- if (txn->mc & SLIM_MSG_CLK_PAUSE_SEQ_FLG)
781
- return -EPROTONOSUPPORT;
782
-
783784 if (txn->mt == SLIM_MSG_MT_CORE &&
784785 (txn->mc >= SLIM_MSG_MC_BEGIN_RECONFIGURATION &&
785786 txn->mc <= SLIM_MSG_MC_RECONFIGURE_NOW))
....@@ -790,7 +791,7 @@
790791
791792 if (txn->msg->num_bytes > SLIM_MSGQ_BUF_LEN ||
792793 txn->rl > SLIM_MSGQ_BUF_LEN) {
793
- dev_err(ctrl->dev, "msg exeeds HW limit\n");
794
+ dev_err(ctrl->dev, "msg exceeds HW limit\n");
794795 return -EINVAL;
795796 }
796797
....@@ -1004,6 +1005,7 @@
10041005 struct slim_eaddr *ea, u8 *laddr)
10051006 {
10061007 struct slim_val_inf msg = {0};
1008
+ u8 failed_ea[6] = {0, 0, 0, 0, 0, 0};
10071009 struct slim_msg_txn txn;
10081010 u8 wbuf[10] = {0};
10091011 u8 rbuf[10] = {0};
....@@ -1033,6 +1035,9 @@
10331035 slim_free_txn_tid(ctrl, &txn);
10341036 return ret;
10351037 }
1038
+
1039
+ if (!memcmp(rbuf, failed_ea, 6))
1040
+ return -ENXIO;
10361041
10371042 *laddr = rbuf[6];
10381043
....@@ -1324,6 +1329,9 @@
13241329 {
13251330 .compatible = "qcom,slim-ngd-v1.5.0",
13261331 .data = &ngd_v1_5_offset_info,
1332
+ },{
1333
+ .compatible = "qcom,slim-ngd-v2.1.0",
1334
+ .data = &ngd_v1_5_offset_info,
13271335 },
13281336 {}
13291337 };
....@@ -1346,12 +1354,15 @@
13461354 continue;
13471355
13481356 ngd = kzalloc(sizeof(*ngd), GFP_KERNEL);
1349
- if (!ngd)
1357
+ if (!ngd) {
1358
+ of_node_put(node);
13501359 return -ENOMEM;
1360
+ }
13511361
13521362 ngd->pdev = platform_device_alloc(QCOM_SLIM_NGD_DRV_NAME, id);
13531363 if (!ngd->pdev) {
13541364 kfree(ngd);
1365
+ of_node_put(node);
13551366 return -ENOMEM;
13561367 }
13571368 ngd->id = id;
....@@ -1363,7 +1374,6 @@
13631374 platform_device_add(ngd->pdev);
13641375 ngd->base = ctrl->base + ngd->id * data->offset +
13651376 (ngd->id - 1) * data->size;
1366
- ctrl->ngd = ngd;
13671377
13681378 return 0;
13691379 }