Lines Matching refs:qmp

51 	struct qmp *qmp;  member
69 struct qmp { struct
89 struct qmp *qmp; argument
95 static void qmp_kick(struct qmp *qmp) in qmp_kick() argument
97 mbox_send_message(qmp->mbox_chan, NULL); in qmp_kick()
98 mbox_client_txdone(qmp->mbox_chan, 0); in qmp_kick()
101 static bool qmp_magic_valid(struct qmp *qmp) in qmp_magic_valid() argument
103 return readl(qmp->msgram + QMP_DESC_MAGIC) == QMP_MAGIC; in qmp_magic_valid()
106 static bool qmp_link_acked(struct qmp *qmp) in qmp_link_acked() argument
108 return readl(qmp->msgram + QMP_DESC_MCORE_LINK_STATE_ACK) == QMP_STATE_UP; in qmp_link_acked()
111 static bool qmp_mcore_channel_acked(struct qmp *qmp) in qmp_mcore_channel_acked() argument
113 return readl(qmp->msgram + QMP_DESC_MCORE_CH_STATE_ACK) == QMP_STATE_UP; in qmp_mcore_channel_acked()
116 static bool qmp_ucore_channel_up(struct qmp *qmp) in qmp_ucore_channel_up() argument
118 return readl(qmp->msgram + QMP_DESC_UCORE_CH_STATE) == QMP_STATE_UP; in qmp_ucore_channel_up()
121 static int qmp_open(struct qmp *qmp) in qmp_open() argument
126 if (!qmp_magic_valid(qmp)) { in qmp_open()
127 dev_err(qmp->dev, "QMP magic doesn't match\n"); in qmp_open()
131 val = readl(qmp->msgram + QMP_DESC_VERSION); in qmp_open()
133 dev_err(qmp->dev, "unsupported QMP version %d\n", val); in qmp_open()
137 qmp->offset = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_OFFSET); in qmp_open()
138 qmp->size = readl(qmp->msgram + QMP_DESC_MCORE_MBOX_SIZE); in qmp_open()
139 if (!qmp->size) { in qmp_open()
140 dev_err(qmp->dev, "invalid mailbox size\n"); in qmp_open()
145 val = readl(qmp->msgram + QMP_DESC_UCORE_LINK_STATE); in qmp_open()
146 writel(val, qmp->msgram + QMP_DESC_UCORE_LINK_STATE_ACK); in qmp_open()
149 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_LINK_STATE); in qmp_open()
151 qmp_kick(qmp); in qmp_open()
153 ret = wait_event_timeout(qmp->event, qmp_link_acked(qmp), HZ); in qmp_open()
155 dev_err(qmp->dev, "ucore didn't ack link\n"); in qmp_open()
159 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_MCORE_CH_STATE); in qmp_open()
161 qmp_kick(qmp); in qmp_open()
163 ret = wait_event_timeout(qmp->event, qmp_ucore_channel_up(qmp), HZ); in qmp_open()
165 dev_err(qmp->dev, "ucore didn't open channel\n"); in qmp_open()
170 writel(QMP_STATE_UP, qmp->msgram + QMP_DESC_UCORE_CH_STATE_ACK); in qmp_open()
172 qmp_kick(qmp); in qmp_open()
174 ret = wait_event_timeout(qmp->event, qmp_mcore_channel_acked(qmp), HZ); in qmp_open()
176 dev_err(qmp->dev, "ucore didn't ack channel\n"); in qmp_open()
183 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE); in qmp_open()
186 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE); in qmp_open()
187 qmp_kick(qmp); in qmp_open()
192 static void qmp_close(struct qmp *qmp) in qmp_close() argument
194 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_CH_STATE); in qmp_close()
195 writel(QMP_STATE_DOWN, qmp->msgram + QMP_DESC_MCORE_LINK_STATE); in qmp_close()
196 qmp_kick(qmp); in qmp_close()
201 struct qmp *qmp = data; in qmp_intr() local
203 wake_up_all(&qmp->event); in qmp_intr()
208 static bool qmp_message_empty(struct qmp *qmp) in qmp_message_empty() argument
210 return readl(qmp->msgram + qmp->offset) == 0; in qmp_message_empty()
225 static int qmp_send(struct qmp *qmp, const void *data, size_t len) in qmp_send() argument
231 if (WARN_ON(len + sizeof(u32) > qmp->size)) in qmp_send()
237 mutex_lock(&qmp->tx_lock); in qmp_send()
240 __iowrite32_copy(qmp->msgram + qmp->offset + sizeof(u32), in qmp_send()
242 writel(len, qmp->msgram + qmp->offset); in qmp_send()
245 tlen = readl(qmp->msgram + qmp->offset); in qmp_send()
246 qmp_kick(qmp); in qmp_send()
248 time_left = wait_event_interruptible_timeout(qmp->event, in qmp_send()
249 qmp_message_empty(qmp), HZ); in qmp_send()
251 dev_err(qmp->dev, "ucore did not ack channel\n"); in qmp_send()
255 writel(0, qmp->msgram + qmp->offset); in qmp_send()
260 mutex_unlock(&qmp->tx_lock); in qmp_send()
268 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk); in qmp_qdss_clk_prepare() local
270 return qmp_send(qmp, buf, sizeof(buf)); in qmp_qdss_clk_prepare()
276 struct qmp *qmp = container_of(hw, struct qmp, qdss_clk); in qmp_qdss_clk_unprepare() local
278 qmp_send(qmp, buf, sizeof(buf)); in qmp_qdss_clk_unprepare()
286 static int qmp_qdss_clk_add(struct qmp *qmp) in qmp_qdss_clk_add() argument
294 qmp->qdss_clk.init = &qdss_init; in qmp_qdss_clk_add()
295 ret = clk_hw_register(qmp->dev, &qmp->qdss_clk); in qmp_qdss_clk_add()
297 dev_err(qmp->dev, "failed to register qdss clock\n"); in qmp_qdss_clk_add()
301 ret = of_clk_add_hw_provider(qmp->dev->of_node, of_clk_hw_simple_get, in qmp_qdss_clk_add()
302 &qmp->qdss_clk); in qmp_qdss_clk_add()
304 dev_err(qmp->dev, "unable to register of clk hw provider\n"); in qmp_qdss_clk_add()
305 clk_hw_unregister(&qmp->qdss_clk); in qmp_qdss_clk_add()
311 static void qmp_qdss_clk_remove(struct qmp *qmp) in qmp_qdss_clk_remove() argument
313 of_clk_del_provider(qmp->dev->of_node); in qmp_qdss_clk_remove()
314 clk_hw_unregister(&qmp->qdss_clk); in qmp_qdss_clk_remove()
324 return qmp_send(res->qmp, buf, sizeof(buf)); in qmp_pd_power_toggle()
346 static int qmp_pd_add(struct qmp *qmp) in qmp_pd_add() argument
348 struct genpd_onecell_data *data = &qmp->pd_data; in qmp_pd_add()
349 struct device *dev = qmp->dev; in qmp_pd_add()
365 res[i].qmp = qmp; in qmp_pd_add()
394 static void qmp_pd_remove(struct qmp *qmp) in qmp_pd_remove() argument
396 struct genpd_onecell_data *data = &qmp->pd_data; in qmp_pd_remove()
397 struct device *dev = qmp->dev; in qmp_pd_remove()
441 ret = qmp_send(qmp_cdev->qmp, buf, sizeof(buf)); in qmp_cdev_set_cur_state()
455 static int qmp_cooling_device_add(struct qmp *qmp, in qmp_cooling_device_add() argument
461 qmp_cdev->qmp = qmp; in qmp_cooling_device_add()
465 (qmp->dev, node, in qmp_cooling_device_add()
470 dev_err(qmp->dev, "unable to register %s cooling device\n", in qmp_cooling_device_add()
476 static int qmp_cooling_devices_register(struct qmp *qmp) in qmp_cooling_devices_register() argument
482 np = qmp->dev->of_node; in qmp_cooling_devices_register()
484 qmp->cooling_devs = devm_kcalloc(qmp->dev, count, in qmp_cooling_devices_register()
485 sizeof(*qmp->cooling_devs), in qmp_cooling_devices_register()
488 if (!qmp->cooling_devs) in qmp_cooling_devices_register()
494 ret = qmp_cooling_device_add(qmp, &qmp->cooling_devs[count++], in qmp_cooling_devices_register()
505 (qmp->cooling_devs[count].cdev); in qmp_cooling_devices_register()
510 static void qmp_cooling_devices_remove(struct qmp *qmp) in qmp_cooling_devices_remove() argument
515 thermal_cooling_device_unregister(qmp->cooling_devs[i].cdev); in qmp_cooling_devices_remove()
521 struct qmp *qmp; in qmp_probe() local
525 qmp = devm_kzalloc(&pdev->dev, sizeof(*qmp), GFP_KERNEL); in qmp_probe()
526 if (!qmp) in qmp_probe()
529 qmp->dev = &pdev->dev; in qmp_probe()
530 init_waitqueue_head(&qmp->event); in qmp_probe()
531 mutex_init(&qmp->tx_lock); in qmp_probe()
534 qmp->msgram = devm_ioremap_resource(&pdev->dev, res); in qmp_probe()
535 if (IS_ERR(qmp->msgram)) in qmp_probe()
536 return PTR_ERR(qmp->msgram); in qmp_probe()
538 qmp->mbox_client.dev = &pdev->dev; in qmp_probe()
539 qmp->mbox_client.knows_txdone = true; in qmp_probe()
540 qmp->mbox_chan = mbox_request_channel(&qmp->mbox_client, 0); in qmp_probe()
541 if (IS_ERR(qmp->mbox_chan)) { in qmp_probe()
543 return PTR_ERR(qmp->mbox_chan); in qmp_probe()
548 "aoss-qmp", qmp); in qmp_probe()
554 ret = qmp_open(qmp); in qmp_probe()
558 ret = qmp_qdss_clk_add(qmp); in qmp_probe()
562 ret = qmp_pd_add(qmp); in qmp_probe()
566 ret = qmp_cooling_devices_register(qmp); in qmp_probe()
570 platform_set_drvdata(pdev, qmp); in qmp_probe()
575 qmp_qdss_clk_remove(qmp); in qmp_probe()
577 qmp_close(qmp); in qmp_probe()
579 mbox_free_channel(qmp->mbox_chan); in qmp_probe()
586 struct qmp *qmp = platform_get_drvdata(pdev); in qmp_remove() local
588 qmp_qdss_clk_remove(qmp); in qmp_remove()
589 qmp_pd_remove(qmp); in qmp_remove()
590 qmp_cooling_devices_remove(qmp); in qmp_remove()
592 qmp_close(qmp); in qmp_remove()
593 mbox_free_channel(qmp->mbox_chan); in qmp_remove()