Lines Matching refs:qmp
5 #include <dt-bindings/power/qcom-aoss-qmp.h>
51 struct qmp *qmp;
57 * struct qmp - driver state for QMP implementation
69 struct qmp {
89 struct qmp *qmp;
95 static void qmp_kick(struct qmp *qmp)
97 mbox_send_message(qmp->mbox_chan, NULL);
98 mbox_client_txdone(qmp->mbox_chan, 0);
101 static bool qmp_magic_valid(struct qmp *qmp)
103 return readl(qmp->msgram + QMP_DESC_MAGIC) == QMP_MAGIC;
106 static bool qmp_link_acked(struct qmp *qmp)
108 return readl(qmp->msgram + QMP_DESC_MCORE_LINK_STATE_ACK) == QMP_STATE_UP;
111 static bool qmp_mcore_channel_acked(struct qmp *qmp)
113 return readl(qmp->msgram + QMP_DESC_MCORE_CH_STATE_ACK) == QMP_STATE_UP;
116 static bool qmp_ucore_channel_up(struct qmp *qmp)
118 return readl(qmp->msgram + QMP_DESC_UCORE_CH_STATE) == QMP_STATE_UP;
121 static int qmp_open(struct qmp *qmp)
126 if (!qmp_magic_valid(qmp)) {
127 dev_err(qmp->dev, "QMP magic doesn't match\n");
131 val = readl(qmp->msgram + QMP_DESC_VERSION);
133 dev_err(qmp->dev, "unsupported QMP version %d\n", val);
137 qmp->offset = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_OFFSET);
138 qmp->size = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_SIZE);
139 if (!qmp->size) {
140 dev_err(qmp->dev, "invalid mailbox size\n");
145 val = readl(qmp->msgram + QMP_DESC_UCORE_LINK_STATE);
146 writel(val, qmp->msgram + QMP_DESC_UCORE_LINK_STATE_ACK);
149 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
151 qmp_kick(qmp);
153 ret = wait_event_timeout(qmp->event, qmp_link_acked(qmp), HZ);
155 dev_err(qmp->dev, "ucore didn't ack link\n");
159 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
161 qmp_kick(qmp);
163 ret = wait_event_timeout(qmp->event, qmp_ucore_channel_up(qmp), HZ);
165 dev_err(qmp->dev, "ucore didn't open channel\n");
170 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_UCORE_CH_STATE_ACK);
172 qmp_kick(qmp);
174 ret = wait_event_timeout(qmp->event, qmp_mcore_channel_acked(qmp), HZ);
176 dev_err(qmp->dev, "ucore didn't ack channel\n");
183 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
186 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
187 qmp_kick(qmp);
192 static void qmp_close(struct qmp *qmp)
194 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
195 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
196 qmp_kick(qmp);
201 struct qmp *qmp = data;
203 wake_up_all(&qmp->event);
208 static bool qmp_message_empty(struct qmp *qmp)
210 return readl(qmp->msgram + qmp->offset) == 0;
215 * @qmp: qmp context
225 static int qmp_send(struct qmp *qmp, const void *data, size_t len)
231 if (WARN_ON(len + sizeof(u32) > qmp->size))
237 mutex_lock(&qmp->tx_lock);
240 __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32),
242 writel(len, qmp->msgram + qmp->offset);
245 tlen = readl(qmp->msgram + qmp->offset);
246 qmp_kick(qmp);
248 time_left = wait_event_interruptible_timeout(qmp->event,
249 qmp_message_empty(qmp), HZ);
251 dev_err(qmp->dev, "ucore did not ack channel\n");
255 writel(0, qmp->msgram + qmp->offset);
260 mutex_unlock(&qmp->tx_lock);
268 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
270 return qmp_send(qmp, buf, sizeof(buf));
276 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
278 qmp_send(qmp, buf, sizeof(buf));
286 static int qmp_qdss_clk_add(struct qmp *qmp)
294 qmp->qdss_clk.init = &qdss_init;
295 ret = clk_hw_register(qmp->dev, &qmp->qdss_clk);
297 dev_err(qmp->dev, "failed to register qdss clock\n");
301 ret = of_clk_add_hw_provider(qmp->dev->of_node, of_clk_hw_simple_get,
302 &qmp->qdss_clk);
304 dev_err(qmp->dev, "unable to register of clk hw provider\n");
305 clk_hw_unregister(&qmp->qdss_clk);
311 static void qmp_qdss_clk_remove(struct qmp *qmp)
313 of_clk_del_provider(qmp->dev->of_node);
314 clk_hw_unregister(&qmp->qdss_clk);
324 return qmp_send(res->qmp, buf, sizeof(buf));
346 static int qmp_pd_add(struct qmp *qmp)
348 struct genpd_onecell_data *data = &qmp->pd_data;
349 struct device *dev = qmp->dev;
365 res[i].qmp = qmp;
394 static void qmp_pd_remove(struct qmp *qmp)
396 struct genpd_onecell_data *data = &qmp->pd_data;
397 struct device *dev = qmp->dev;
441 ret = qmp_send(qmp_cdev->qmp, buf, sizeof(buf));
455 static int qmp_cooling_device_add(struct qmp *qmp,
461 qmp_cdev->qmp = qmp;
465 (qmp->dev, node,
470 dev_err(qmp->dev, "unable to register %s cooling device\n",
476 static int qmp_cooling_devices_register(struct qmp *qmp)
482 np = qmp->dev->of_node;
484 qmp->cooling_devs = devm_kcalloc(qmp->dev, QMP_NUM_COOLING_RESOURCES,
485 sizeof(*qmp->cooling_devs),
488 if (!qmp->cooling_devs)
494 ret = qmp_cooling_device_add(qmp, &qmp->cooling_devs[count++],
503 devm_kfree(qmp->dev, qmp->cooling_devs);
510 (qmp->cooling_devs[count].cdev);
511 devm_kfree(qmp->dev, qmp->cooling_devs);
516 static void qmp_cooling_devices_remove(struct qmp *qmp)
521 thermal_cooling_device_unregister(qmp->cooling_devs[i].cdev);
527 struct qmp *qmp;
531 qmp = devm_kzalloc(&pdev->dev, sizeof(*qmp), GFP_KERNEL);
532 if (!qmp)
535 qmp->dev = &pdev->dev;
536 init_waitqueue_head(&qmp->event);
537 mutex_init(&qmp->tx_lock);
540 qmp->msgram = devm_ioremap_resource(&pdev->dev, res);
541 if (IS_ERR(qmp->msgram))
542 return PTR_ERR(qmp->msgram);
544 qmp->mbox_client.dev = &pdev->dev;
545 qmp->mbox_client.knows_txdone = true;
546 qmp->mbox_chan = mbox_request_channel(&qmp->mbox_client, 0);
547 if (IS_ERR(qmp->mbox_chan)) {
549 return PTR_ERR(qmp->mbox_chan);
554 "aoss-qmp", qmp);
560 ret = qmp_open(qmp);
564 ret = qmp_qdss_clk_add(qmp);
568 ret = qmp_pd_add(qmp);
572 ret = qmp_cooling_devices_register(qmp);
576 platform_set_drvdata(pdev, qmp);
581 qmp_qdss_clk_remove(qmp);
583 qmp_close(qmp);
585 mbox_free_channel(qmp->mbox_chan);
592 struct qmp *qmp = platform_get_drvdata(pdev);
594 qmp_qdss_clk_remove(qmp);
595 qmp_pd_remove(qmp);
596 qmp_cooling_devices_remove(qmp);
598 qmp_close(qmp);
599 mbox_free_channel(qmp->mbox_chan);
605 { .compatible = "qcom,sc7180-aoss-qmp", },
606 { .compatible = "qcom,sdm845-aoss-qmp", },
607 { .compatible = "qcom,sm8150-aoss-qmp", },
608 { .compatible = "qcom,sm8250-aoss-qmp", },