Lines Matching refs:qmp

51 	struct qmp *qmp;
57 * struct qmp - driver state for QMP implementation
69 struct qmp {
87 static void qmp_kick(struct qmp *qmp)
89 mbox_send_message(qmp->mbox_chan, NULL);
90 mbox_client_txdone(qmp->mbox_chan, 0);
93 static bool qmp_magic_valid(struct qmp *qmp)
95 return readl(qmp->msgram + QMP_DESC_MAGIC) == QMP_MAGIC;
98 static bool qmp_link_acked(struct qmp *qmp)
100 return readl(qmp->msgram + QMP_DESC_MCORE_LINK_STATE_ACK) == QMP_STATE_UP;
103 static bool qmp_mcore_channel_acked(struct qmp *qmp)
105 return readl(qmp->msgram + QMP_DESC_MCORE_CH_STATE_ACK) == QMP_STATE_UP;
108 static bool qmp_ucore_channel_up(struct qmp *qmp)
110 return readl(qmp->msgram + QMP_DESC_UCORE_CH_STATE) == QMP_STATE_UP;
113 static int qmp_open(struct qmp *qmp)
118 if (!qmp_magic_valid(qmp)) {
119 dev_err(qmp->dev, "QMP magic doesn't match\n");
123 val = readl(qmp->msgram + QMP_DESC_VERSION);
125 dev_err(qmp->dev, "unsupported QMP version %d\n", val);
129 qmp->offset = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_OFFSET);
130 qmp->size = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_SIZE);
131 if (!qmp->size) {
132 dev_err(qmp->dev, "invalid mailbox size\n");
137 val = readl(qmp->msgram + QMP_DESC_UCORE_LINK_STATE);
138 writel(val, qmp->msgram + QMP_DESC_UCORE_LINK_STATE_ACK);
141 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
143 qmp_kick(qmp);
145 ret = wait_event_timeout(qmp->event, qmp_link_acked(qmp), HZ);
147 dev_err(qmp->dev, "ucore didn't ack link\n");
151 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
153 qmp_kick(qmp);
155 ret = wait_event_timeout(qmp->event, qmp_ucore_channel_up(qmp), HZ);
157 dev_err(qmp->dev, "ucore didn't open channel\n");
162 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_UCORE_CH_STATE_ACK);
164 qmp_kick(qmp);
166 ret = wait_event_timeout(qmp->event, qmp_mcore_channel_acked(qmp), HZ);
168 dev_err(qmp->dev, "ucore didn't ack channel\n");
175 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
178 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
179 qmp_kick(qmp);
184 static void qmp_close(struct qmp *qmp)
186 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE);
187 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE);
188 qmp_kick(qmp);
193 struct qmp *qmp = data;
195 wake_up_all(&qmp->event);
200 static bool qmp_message_empty(struct qmp *qmp)
202 return readl(qmp->msgram + qmp->offset) == 0;
207 * @qmp: qmp context
217 int qmp_send(struct qmp *qmp, const char *fmt, ...)
225 if (WARN_ON(IS_ERR_OR_NULL(qmp) || !fmt))
236 mutex_lock(&qmp->tx_lock);
239 __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32),
241 writel(sizeof(buf), qmp->msgram + qmp->offset);
244 readl(qmp->msgram + qmp->offset);
245 qmp_kick(qmp);
247 time_left = wait_event_interruptible_timeout(qmp->event,
248 qmp_message_empty(qmp), HZ);
250 dev_err(qmp->dev, "ucore did not ack channel\n");
254 writel(0, qmp->msgram + qmp->offset);
259 mutex_unlock(&qmp->tx_lock);
268 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
270 return qmp_send(qmp, buf);
276 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk);
278 qmp_send(qmp, 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);
346 ret = qmp_send(qmp_cdev->qmp, "{class: volt_flr, event:zero_temp, res:%s, value:%s}",
360 static int qmp_cooling_device_add(struct qmp *qmp,
366 qmp_cdev->qmp = qmp;
370 (qmp->dev, node,
375 dev_err(qmp->dev, "unable to register %s cooling device\n",
381 static int qmp_cooling_devices_register(struct qmp *qmp)
387 np = qmp->dev->of_node;
389 qmp->cooling_devs = devm_kcalloc(qmp->dev, QMP_NUM_COOLING_RESOURCES,
390 sizeof(*qmp->cooling_devs),
393 if (!qmp->cooling_devs)
399 ret = qmp_cooling_device_add(qmp, &qmp->cooling_devs[count++],
408 devm_kfree(qmp->dev, qmp->cooling_devs);
415 (qmp->cooling_devs[count].cdev);
416 devm_kfree(qmp->dev, qmp->cooling_devs);
421 static void qmp_cooling_devices_remove(struct qmp *qmp)
426 thermal_cooling_device_unregister(qmp->cooling_devs[i].cdev);
430 * qmp_get() - get a qmp handle from a device
433 * Return: handle to qmp device on success, ERR_PTR() on failure
435 struct qmp *qmp_get(struct device *dev)
439 struct qmp *qmp;
444 np = of_parse_phandle(dev->of_node, "qcom,qmp", 0);
453 qmp = platform_get_drvdata(pdev);
455 if (!qmp) {
459 return qmp;
464 * qmp_put() - release a qmp handle
465 * @qmp: qmp handle obtained from qmp_get()
467 void qmp_put(struct qmp *qmp)
473 if (!IS_ERR_OR_NULL(qmp))
474 put_device(qmp->dev);
480 struct qmp *qmp;
484 qmp = devm_kzalloc(&pdev->dev, sizeof(*qmp), GFP_KERNEL);
485 if (!qmp)
488 qmp->dev = &pdev->dev;
489 init_waitqueue_head(&qmp->event);
490 mutex_init(&qmp->tx_lock);
492 qmp->msgram = devm_platform_ioremap_resource(pdev, 0);
493 if (IS_ERR(qmp->msgram))
494 return PTR_ERR(qmp->msgram);
496 qmp->mbox_client.dev = &pdev->dev;
497 qmp->mbox_client.knows_txdone = true;
498 qmp->mbox_chan = mbox_request_channel(&qmp->mbox_client, 0);
499 if (IS_ERR(qmp->mbox_chan)) {
501 return PTR_ERR(qmp->mbox_chan);
506 "aoss-qmp", qmp);
512 ret = qmp_open(qmp);
516 ret = qmp_qdss_clk_add(qmp);
520 ret = qmp_cooling_devices_register(qmp);
524 platform_set_drvdata(pdev, qmp);
529 qmp_close(qmp);
531 mbox_free_channel(qmp->mbox_chan);
538 struct qmp *qmp = platform_get_drvdata(pdev);
540 qmp_qdss_clk_remove(qmp);
541 qmp_cooling_devices_remove(qmp);
543 qmp_close(qmp);
544 mbox_free_channel(qmp->mbox_chan);
550 { .compatible = "qcom,sc7180-aoss-qmp", },
551 { .compatible = "qcom,sc7280-aoss-qmp", },
552 { .compatible = "qcom,sdm845-aoss-qmp", },
553 { .compatible = "qcom,sm8150-aoss-qmp", },
554 { .compatible = "qcom,sm8250-aoss-qmp", },
555 { .compatible = "qcom,sm8350-aoss-qmp", },
556 { .compatible = "qcom,aoss-qmp", },