Lines Matching refs:m3_ipc
69 static void am33xx_txev_eoi(struct wkup_m3_ipc *m3_ipc) in am33xx_txev_eoi() argument
72 m3_ipc->ipc_mem_base + AM33XX_CONTROL_M3_TXEV_EOI); in am33xx_txev_eoi()
75 static void am33xx_txev_enable(struct wkup_m3_ipc *m3_ipc) in am33xx_txev_enable() argument
78 m3_ipc->ipc_mem_base + AM33XX_CONTROL_M3_TXEV_EOI); in am33xx_txev_enable()
81 static void wkup_m3_ctrl_ipc_write(struct wkup_m3_ipc *m3_ipc, in wkup_m3_ctrl_ipc_write() argument
88 writel(val, m3_ipc->ipc_mem_base + in wkup_m3_ctrl_ipc_write()
92 static unsigned int wkup_m3_ctrl_ipc_read(struct wkup_m3_ipc *m3_ipc, in wkup_m3_ctrl_ipc_read() argument
99 return readl(m3_ipc->ipc_mem_base + in wkup_m3_ctrl_ipc_read()
103 static int wkup_m3_fw_version_read(struct wkup_m3_ipc *m3_ipc) in wkup_m3_fw_version_read() argument
107 val = wkup_m3_ctrl_ipc_read(m3_ipc, 2); in wkup_m3_fw_version_read()
114 struct wkup_m3_ipc *m3_ipc = ipc_data; in wkup_m3_txev_handler() local
115 struct device *dev = m3_ipc->dev; in wkup_m3_txev_handler()
118 am33xx_txev_eoi(m3_ipc); in wkup_m3_txev_handler()
120 switch (m3_ipc->state) { in wkup_m3_txev_handler()
122 ver = wkup_m3_fw_version_read(m3_ipc); in wkup_m3_txev_handler()
132 m3_ipc->state = M3_STATE_INITED; in wkup_m3_txev_handler()
133 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
136 m3_ipc->state = M3_STATE_INITED; in wkup_m3_txev_handler()
137 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
140 complete(&m3_ipc->sync_complete); in wkup_m3_txev_handler()
146 am33xx_txev_enable(m3_ipc); in wkup_m3_txev_handler()
151 static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ping() argument
153 struct device *dev = m3_ipc->dev; in wkup_m3_ping()
157 if (!m3_ipc->mbox) { in wkup_m3_ping()
170 ret = mbox_send_message(m3_ipc->mbox, &dummy_msg); in wkup_m3_ping()
177 ret = wait_for_completion_timeout(&m3_ipc->sync_complete, in wkup_m3_ping()
181 m3_ipc->state = M3_STATE_UNKNOWN; in wkup_m3_ping()
185 mbox_client_txdone(m3_ipc->mbox, 0); in wkup_m3_ping()
189 static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ping_noirq() argument
191 struct device *dev = m3_ipc->dev; in wkup_m3_ping_noirq()
195 if (!m3_ipc->mbox) { in wkup_m3_ping_noirq()
201 ret = mbox_send_message(m3_ipc->mbox, &dummy_msg); in wkup_m3_ping_noirq()
208 mbox_client_txdone(m3_ipc->mbox, 0); in wkup_m3_ping_noirq()
212 static int wkup_m3_is_available(struct wkup_m3_ipc *m3_ipc) in wkup_m3_is_available() argument
214 return ((m3_ipc->state != M3_STATE_RESET) && in wkup_m3_is_available()
215 (m3_ipc->state != M3_STATE_UNKNOWN)); in wkup_m3_is_available()
226 static void wkup_m3_set_mem_type(struct wkup_m3_ipc *m3_ipc, int mem_type) in wkup_m3_set_mem_type() argument
228 m3_ipc->mem_type = mem_type; in wkup_m3_set_mem_type()
235 static void wkup_m3_set_resume_address(struct wkup_m3_ipc *m3_ipc, void *addr) in wkup_m3_set_resume_address() argument
237 m3_ipc->resume_addr = (unsigned long)addr; in wkup_m3_set_resume_address()
247 static int wkup_m3_request_pm_status(struct wkup_m3_ipc *m3_ipc) in wkup_m3_request_pm_status() argument
252 val = wkup_m3_ctrl_ipc_read(m3_ipc, 1); in wkup_m3_request_pm_status()
267 static int wkup_m3_prepare_low_power(struct wkup_m3_ipc *m3_ipc, int state) in wkup_m3_prepare_low_power() argument
269 struct device *dev = m3_ipc->dev; in wkup_m3_prepare_low_power()
273 if (!wkup_m3_is_available(m3_ipc)) in wkup_m3_prepare_low_power()
291 wkup_m3_ctrl_ipc_write(m3_ipc, m3_ipc->resume_addr, 0); in wkup_m3_prepare_low_power()
292 wkup_m3_ctrl_ipc_write(m3_ipc, m3_power_state, 1); in wkup_m3_prepare_low_power()
293 wkup_m3_ctrl_ipc_write(m3_ipc, m3_ipc->mem_type, 4); in wkup_m3_prepare_low_power()
295 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 2); in wkup_m3_prepare_low_power()
296 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 3); in wkup_m3_prepare_low_power()
297 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 5); in wkup_m3_prepare_low_power()
298 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 6); in wkup_m3_prepare_low_power()
299 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 7); in wkup_m3_prepare_low_power()
301 m3_ipc->state = M3_STATE_MSG_FOR_LP; in wkup_m3_prepare_low_power()
304 ret = wkup_m3_ping_noirq(m3_ipc); in wkup_m3_prepare_low_power()
306 ret = wkup_m3_ping(m3_ipc); in wkup_m3_prepare_low_power()
321 static int wkup_m3_finish_low_power(struct wkup_m3_ipc *m3_ipc) in wkup_m3_finish_low_power() argument
323 struct device *dev = m3_ipc->dev; in wkup_m3_finish_low_power()
326 if (!wkup_m3_is_available(m3_ipc)) in wkup_m3_finish_low_power()
329 wkup_m3_ctrl_ipc_write(m3_ipc, IPC_CMD_RESET, 1); in wkup_m3_finish_low_power()
330 wkup_m3_ctrl_ipc_write(m3_ipc, DS_IPC_DEFAULT, 2); in wkup_m3_finish_low_power()
332 m3_ipc->state = M3_STATE_MSG_FOR_RESET; in wkup_m3_finish_low_power()
334 ret = wkup_m3_ping(m3_ipc); in wkup_m3_finish_low_power()
347 static const char *wkup_m3_request_wake_src(struct wkup_m3_ipc *m3_ipc) in wkup_m3_request_wake_src() argument
352 val = wkup_m3_ctrl_ipc_read(m3_ipc, 6); in wkup_m3_request_wake_src()
368 static void wkup_m3_set_rtc_only(struct wkup_m3_ipc *m3_ipc) in wkup_m3_set_rtc_only() argument
405 void wkup_m3_ipc_put(struct wkup_m3_ipc *m3_ipc) in wkup_m3_ipc_put() argument
412 static void wkup_m3_rproc_boot_thread(struct wkup_m3_ipc *m3_ipc) in wkup_m3_rproc_boot_thread() argument
414 struct device *dev = m3_ipc->dev; in wkup_m3_rproc_boot_thread()
417 init_completion(&m3_ipc->sync_complete); in wkup_m3_rproc_boot_thread()
419 ret = rproc_boot(m3_ipc->rproc); in wkup_m3_rproc_boot_thread()
434 struct wkup_m3_ipc *m3_ipc; in wkup_m3_ipc_probe() local
436 m3_ipc = devm_kzalloc(dev, sizeof(*m3_ipc), GFP_KERNEL); in wkup_m3_ipc_probe()
437 if (!m3_ipc) in wkup_m3_ipc_probe()
441 m3_ipc->ipc_mem_base = devm_ioremap_resource(dev, res); in wkup_m3_ipc_probe()
442 if (IS_ERR(m3_ipc->ipc_mem_base)) { in wkup_m3_ipc_probe()
444 return PTR_ERR(m3_ipc->ipc_mem_base); in wkup_m3_ipc_probe()
454 0, "wkup_m3_txev", m3_ipc); in wkup_m3_ipc_probe()
460 m3_ipc->mbox_client.dev = dev; in wkup_m3_ipc_probe()
461 m3_ipc->mbox_client.tx_done = NULL; in wkup_m3_ipc_probe()
462 m3_ipc->mbox_client.tx_prepare = NULL; in wkup_m3_ipc_probe()
463 m3_ipc->mbox_client.rx_callback = NULL; in wkup_m3_ipc_probe()
464 m3_ipc->mbox_client.tx_block = false; in wkup_m3_ipc_probe()
465 m3_ipc->mbox_client.knows_txdone = false; in wkup_m3_ipc_probe()
467 m3_ipc->mbox = mbox_request_channel(&m3_ipc->mbox_client, 0); in wkup_m3_ipc_probe()
469 if (IS_ERR(m3_ipc->mbox)) { in wkup_m3_ipc_probe()
471 PTR_ERR(m3_ipc->mbox)); in wkup_m3_ipc_probe()
472 return PTR_ERR(m3_ipc->mbox); in wkup_m3_ipc_probe()
488 m3_ipc->rproc = m3_rproc; in wkup_m3_ipc_probe()
489 m3_ipc->dev = dev; in wkup_m3_ipc_probe()
490 m3_ipc->state = M3_STATE_RESET; in wkup_m3_ipc_probe()
492 m3_ipc->ops = &ipc_ops; in wkup_m3_ipc_probe()
499 task = kthread_run((void *)wkup_m3_rproc_boot_thread, m3_ipc, in wkup_m3_ipc_probe()
508 m3_ipc_state = m3_ipc; in wkup_m3_ipc_probe()
515 mbox_free_channel(m3_ipc->mbox); in wkup_m3_ipc_probe()