Lines Matching refs:m3_ipc
97 static unsigned long wkup_m3_copy_aux_data(struct wkup_m3_ipc *m3_ipc, in wkup_m3_copy_aux_data() argument
104 aux_data_addr = rproc_da_to_va(m3_ipc->rproc, in wkup_m3_copy_aux_data()
117 struct wkup_m3_ipc *m3_ipc = context; in wkup_m3_scale_data_fw_cb() local
118 struct device *dev = m3_ipc->dev; in wkup_m3_scale_data_fw_cb()
132 aux_base = wkup_m3_copy_aux_data(m3_ipc, fw->data + sizeof(hdr), in wkup_m3_scale_data_fw_cb()
138 m3_ipc->volt_scale_offsets = val; in wkup_m3_scale_data_fw_cb()
144 static int wkup_m3_init_scale_data(struct wkup_m3_ipc *m3_ipc, in wkup_m3_init_scale_data() argument
154 if (!m3_ipc->sd_fw_name) in wkup_m3_init_scale_data()
158 m3_ipc->sd_fw_name, dev, GFP_ATOMIC, in wkup_m3_init_scale_data()
159 m3_ipc, wkup_m3_scale_data_fw_cb); in wkup_m3_init_scale_data()
201 static int wkup_m3_ipc_dbg_init(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_dbg_init() argument
203 m3_ipc->dbg_path = debugfs_create_dir("wkup_m3_ipc", NULL); in wkup_m3_ipc_dbg_init()
205 if (!m3_ipc->dbg_path) in wkup_m3_ipc_dbg_init()
209 m3_ipc->dbg_path, in wkup_m3_ipc_dbg_init()
210 &m3_ipc->halt, in wkup_m3_ipc_dbg_init()
216 static inline void wkup_m3_ipc_dbg_destroy(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_dbg_destroy() argument
218 debugfs_remove_recursive(m3_ipc->dbg_path); in wkup_m3_ipc_dbg_destroy()
221 static inline int wkup_m3_ipc_dbg_init(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_dbg_init() argument
226 static inline void wkup_m3_ipc_dbg_destroy(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_dbg_destroy() argument
231 static void am33xx_txev_eoi(struct wkup_m3_ipc *m3_ipc) in am33xx_txev_eoi() argument
234 m3_ipc->ipc_mem_base + AM33XX_CONTROL_M3_TXEV_EOI); in am33xx_txev_eoi()
237 static void am33xx_txev_enable(struct wkup_m3_ipc *m3_ipc) in am33xx_txev_enable() argument
240 m3_ipc->ipc_mem_base + AM33XX_CONTROL_M3_TXEV_EOI); in am33xx_txev_enable()
243 static void wkup_m3_ctrl_ipc_write(struct wkup_m3_ipc *m3_ipc, in wkup_m3_ctrl_ipc_write() argument
250 writel(val, m3_ipc->ipc_mem_base + in wkup_m3_ctrl_ipc_write()
254 static unsigned int wkup_m3_ctrl_ipc_read(struct wkup_m3_ipc *m3_ipc, in wkup_m3_ctrl_ipc_read() argument
261 return readl(m3_ipc->ipc_mem_base + in wkup_m3_ctrl_ipc_read()
265 static int wkup_m3_fw_version_read(struct wkup_m3_ipc *m3_ipc) in wkup_m3_fw_version_read() argument
269 val = wkup_m3_ctrl_ipc_read(m3_ipc, 2); in wkup_m3_fw_version_read()
276 struct wkup_m3_ipc *m3_ipc = ipc_data; in wkup_m3_txev_handler() local
277 struct device *dev = m3_ipc->dev; in wkup_m3_txev_handler()
280 am33xx_txev_eoi(m3_ipc); in wkup_m3_txev_handler()
282 switch (m3_ipc->state) { in wkup_m3_txev_handler()
284 ver = wkup_m3_fw_version_read(m3_ipc); in wkup_m3_txev_handler()
294 m3_ipc->state = M3_STATE_INITED; in wkup_m3_txev_handler()
295 wkup_m3_init_scale_data(m3_ipc, dev); in wkup_m3_txev_handler()
296 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
299 m3_ipc->state = M3_STATE_INITED; in wkup_m3_txev_handler()
300 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
303 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
309 am33xx_txev_enable(m3_ipc); in wkup_m3_txev_handler()
314 static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ping() argument
316 struct device *dev = m3_ipc->dev; in wkup_m3_ping()
320 if (!m3_ipc->mbox) { in wkup_m3_ping()
333 ret = mbox_send_message(m3_ipc->mbox, &dummy_msg); in wkup_m3_ping()
340 ret = wait_for_completion_timeout(&m3_ipc->sync_complete, in wkup_m3_ping()
344 m3_ipc->state = M3_STATE_UNKNOWN; in wkup_m3_ping()
348 mbox_client_txdone(m3_ipc->mbox, 0); in wkup_m3_ping()
352 static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ping_noirq() argument
354 struct device *dev = m3_ipc->dev; in wkup_m3_ping_noirq()
358 if (!m3_ipc->mbox) { in wkup_m3_ping_noirq()
364 ret = mbox_send_message(m3_ipc->mbox, &dummy_msg); in wkup_m3_ping_noirq()
371 mbox_client_txdone(m3_ipc->mbox, 0); in wkup_m3_ping_noirq()
375 static int wkup_m3_is_available(struct wkup_m3_ipc *m3_ipc) in wkup_m3_is_available() argument
377 return ((m3_ipc->state != M3_STATE_RESET) && in wkup_m3_is_available()
378 (m3_ipc->state != M3_STATE_UNKNOWN)); in wkup_m3_is_available()
381 static void wkup_m3_set_vtt_gpio(struct wkup_m3_ipc *m3_ipc, int gpio) in wkup_m3_set_vtt_gpio() argument
383 m3_ipc->vtt_conf = (1 << IPC_VTT_STAT_SHIFT) | in wkup_m3_set_vtt_gpio()
387 static void wkup_m3_set_io_isolation(struct wkup_m3_ipc *m3_ipc) in wkup_m3_set_io_isolation() argument
389 m3_ipc->isolation_conf = (1 << IPC_IO_ISOLATION_STAT_SHIFT); in wkup_m3_set_io_isolation()
401 static void wkup_m3_set_mem_type(struct wkup_m3_ipc *m3_ipc, int mem_type) in wkup_m3_set_mem_type() argument
403 m3_ipc->mem_type = mem_type; in wkup_m3_set_mem_type()
411 static void wkup_m3_set_resume_address(struct wkup_m3_ipc *m3_ipc, void *addr) in wkup_m3_set_resume_address() argument
413 m3_ipc->resume_addr = (unsigned long)addr; in wkup_m3_set_resume_address()
424 static int wkup_m3_request_pm_status(struct wkup_m3_ipc *m3_ipc) in wkup_m3_request_pm_status() argument
429 val = wkup_m3_ctrl_ipc_read(m3_ipc, 1); in wkup_m3_request_pm_status()
445 static int wkup_m3_prepare_low_power(struct wkup_m3_ipc *m3_ipc, int state) in wkup_m3_prepare_low_power() argument
447 struct device *dev = m3_ipc->dev; in wkup_m3_prepare_low_power()
451 if (!wkup_m3_is_available(m3_ipc)) in wkup_m3_prepare_low_power()
457 wkup_m3_ctrl_ipc_write(m3_ipc, m3_ipc->volt_scale_offsets, 5); in wkup_m3_prepare_low_power()
461 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 5); in wkup_m3_prepare_low_power()
465 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 5); in wkup_m3_prepare_low_power()
472 wkup_m3_ctrl_ipc_write(m3_ipc, m3_ipc->resume_addr, 0); in wkup_m3_prepare_low_power()
473 wkup_m3_ctrl_ipc_write(m3_ipc, m3_power_state, 1); in wkup_m3_prepare_low_power()
474 wkup_m3_ctrl_ipc_write(m3_ipc, m3_ipc->mem_type | in wkup_m3_prepare_low_power()
475 m3_ipc->vtt_conf | in wkup_m3_prepare_low_power()
476 m3_ipc->isolation_conf | in wkup_m3_prepare_low_power()
477 m3_ipc->halt, 4); in wkup_m3_prepare_low_power()
479 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 2); in wkup_m3_prepare_low_power()
480 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 3); in wkup_m3_prepare_low_power()
481 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 6); in wkup_m3_prepare_low_power()
482 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 7); in wkup_m3_prepare_low_power()
484 m3_ipc->state = M3_STATE_MSG_FOR_LP; in wkup_m3_prepare_low_power()
487 ret = wkup_m3_ping_noirq(m3_ipc); in wkup_m3_prepare_low_power()
489 ret = wkup_m3_ping(m3_ipc); in wkup_m3_prepare_low_power()
505 static int wkup_m3_finish_low_power(struct wkup_m3_ipc *m3_ipc) in wkup_m3_finish_low_power() argument
507 struct device *dev = m3_ipc->dev; in wkup_m3_finish_low_power()
510 if (!wkup_m3_is_available(m3_ipc)) in wkup_m3_finish_low_power()
513 wkup_m3_ctrl_ipc_write(m3_ipc, IPC_CMD_RESET, 1); in wkup_m3_finish_low_power()
514 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 2); in wkup_m3_finish_low_power()
516 m3_ipc->state = M3_STATE_MSG_FOR_RESET; in wkup_m3_finish_low_power()
518 ret = wkup_m3_ping(m3_ipc); in wkup_m3_finish_low_power()
531 static const char *wkup_m3_request_wake_src(struct wkup_m3_ipc *m3_ipc) in wkup_m3_request_wake_src() argument
536 val = wkup_m3_ctrl_ipc_read(m3_ipc, 6); in wkup_m3_request_wake_src()
551 static void wkup_m3_set_rtc_only(struct wkup_m3_ipc *m3_ipc) in wkup_m3_set_rtc_only() argument
588 void wkup_m3_ipc_put(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_put() argument
597 struct wkup_m3_ipc *m3_ipc = arg; in wkup_m3_rproc_boot_thread() local
598 struct device *dev = m3_ipc->dev; in wkup_m3_rproc_boot_thread()
601 init_completion(&m3_ipc->sync_complete); in wkup_m3_rproc_boot_thread()
603 ret = rproc_boot(m3_ipc->rproc); in wkup_m3_rproc_boot_thread()
607 m3_ipc_state = m3_ipc; in wkup_m3_rproc_boot_thread()
620 struct wkup_m3_ipc *m3_ipc; in wkup_m3_ipc_probe() local
623 m3_ipc = devm_kzalloc(dev, sizeof(*m3_ipc), GFP_KERNEL); in wkup_m3_ipc_probe()
624 if (!m3_ipc) in wkup_m3_ipc_probe()
628 m3_ipc->ipc_mem_base = devm_ioremap_resource(dev, res); in wkup_m3_ipc_probe()
629 if (IS_ERR(m3_ipc->ipc_mem_base)) in wkup_m3_ipc_probe()
630 return PTR_ERR(m3_ipc->ipc_mem_base); in wkup_m3_ipc_probe()
637 0, "wkup_m3_txev", m3_ipc); in wkup_m3_ipc_probe()
643 m3_ipc->mbox_client.dev = dev; in wkup_m3_ipc_probe()
644 m3_ipc->mbox_client.tx_done = NULL; in wkup_m3_ipc_probe()
645 m3_ipc->mbox_client.tx_prepare = NULL; in wkup_m3_ipc_probe()
646 m3_ipc->mbox_client.rx_callback = NULL; in wkup_m3_ipc_probe()
647 m3_ipc->mbox_client.tx_block = false; in wkup_m3_ipc_probe()
648 m3_ipc->mbox_client.knows_txdone = false; in wkup_m3_ipc_probe()
650 m3_ipc->mbox = mbox_request_channel(&m3_ipc->mbox_client, 0); in wkup_m3_ipc_probe()
652 if (IS_ERR(m3_ipc->mbox)) { in wkup_m3_ipc_probe()
654 PTR_ERR(m3_ipc->mbox)); in wkup_m3_ipc_probe()
655 return PTR_ERR(m3_ipc->mbox); in wkup_m3_ipc_probe()
671 m3_ipc->rproc = m3_rproc; in wkup_m3_ipc_probe()
672 m3_ipc->dev = dev; in wkup_m3_ipc_probe()
673 m3_ipc->state = M3_STATE_RESET; in wkup_m3_ipc_probe()
675 m3_ipc->ops = &ipc_ops; in wkup_m3_ipc_probe()
679 wkup_m3_set_vtt_gpio(m3_ipc, temp); in wkup_m3_ipc_probe()
685 wkup_m3_set_io_isolation(m3_ipc); in wkup_m3_ipc_probe()
688 &m3_ipc->sd_fw_name); in wkup_m3_ipc_probe()
698 task = kthread_run(wkup_m3_rproc_boot_thread, m3_ipc, in wkup_m3_ipc_probe()
707 wkup_m3_ipc_dbg_init(m3_ipc); in wkup_m3_ipc_probe()
714 mbox_free_channel(m3_ipc->mbox); in wkup_m3_ipc_probe()