H A D | sst-baytrail-ipc.c | 158 struct sst_byt *byt; member in struct:sst_byt_stream 213 static struct sst_byt_stream *sst_byt_get_stream(struct sst_byt *byt, sst_byt_get_stream() argument 218 list_for_each_entry(stream, &byt->stream_list, node) { sst_byt_get_stream() 226 static void sst_byt_stream_update(struct sst_byt *byt, struct ipc_message *msg) sst_byt_stream_update() argument 233 stream = sst_byt_get_stream(byt, stream_id); sst_byt_stream_update() 250 static int sst_byt_process_reply(struct sst_byt *byt, u64 header) sst_byt_process_reply() argument 254 msg = sst_ipc_reply_find_msg(&byt->ipc, header); sst_byt_process_reply() 260 sst_dsp_inbox_read(byt->dsp, msg->rx_data, msg->rx_size); sst_byt_process_reply() 264 sst_byt_stream_update(byt, msg); sst_byt_process_reply() 268 sst_ipc_tx_msg_reply_complete(&byt->ipc, msg); sst_byt_process_reply() 273 static void sst_byt_fw_ready(struct sst_byt *byt, u64 header) sst_byt_fw_ready() argument 275 dev_dbg(byt->dev, "ipc: DSP is ready 0x%llX\n", header); sst_byt_fw_ready() 277 byt->boot_complete = true; sst_byt_fw_ready() 278 wake_up(&byt->boot_wait); sst_byt_fw_ready() 281 static int sst_byt_process_notification(struct sst_byt *byt, sst_byt_process_notification() argument 284 struct sst_dsp *sst = byt->dsp; sst_byt_process_notification() 296 stream = sst_byt_get_stream(byt, stream_id); sst_byt_process_notification() 304 sst_byt_fw_ready(byt, header); sst_byt_process_notification() 314 struct sst_byt *byt = sst_dsp_get_thread_context(sst); sst_byt_irq_thread() local 315 struct sst_generic_ipc *ipc = &byt->ipc; sst_byt_irq_thread() 325 sst_byt_process_notification(byt, &flags); sst_byt_irq_thread() 328 sst_byt_process_reply(byt, header); sst_byt_irq_thread() 353 struct sst_byt_stream *sst_byt_stream_new(struct sst_byt *byt, int id, sst_byt_stream_new() argument 358 struct sst_dsp *sst = byt->dsp; sst_byt_stream_new() 366 list_add(&stream->node, &byt->stream_list); sst_byt_stream_new() 369 stream->byt = byt; sst_byt_stream_new() 376 int sst_byt_stream_set_bits(struct sst_byt *byt, struct sst_byt_stream *stream, sst_byt_stream_set_bits() argument 383 int sst_byt_stream_set_channels(struct sst_byt *byt, sst_byt_stream_set_channels() argument 390 int sst_byt_stream_set_rate(struct sst_byt *byt, struct sst_byt_stream *stream, sst_byt_stream_set_rate() argument 398 int sst_byt_stream_type(struct sst_byt *byt, struct sst_byt_stream *stream, sst_byt_stream_type() argument 409 int sst_byt_stream_buffer(struct sst_byt *byt, struct sst_byt_stream *stream, sst_byt_stream_buffer() argument 424 int sst_byt_stream_commit(struct sst_byt *byt, struct sst_byt_stream *stream) sst_byt_stream_commit() argument 434 ret = sst_ipc_tx_message_wait(&byt->ipc, header, str_req, sst_byt_stream_commit() 438 dev_err(byt->dev, "ipc: error stream commit failed\n"); sst_byt_stream_commit() 447 int sst_byt_stream_free(struct sst_byt *byt, struct sst_byt_stream *stream) sst_byt_stream_free() argument 451 struct sst_dsp *sst = byt->dsp; sst_byt_stream_free() 458 ret = sst_ipc_tx_message_wait(&byt->ipc, header, NULL, 0, NULL, 0); sst_byt_stream_free() 460 dev_err(byt->dev, "ipc: free stream %d failed\n", sst_byt_stream_free() 475 static int sst_byt_stream_operations(struct sst_byt *byt, int type, sst_byt_stream_operations() argument 482 return sst_ipc_tx_message_wait(&byt->ipc, header, NULL, sst_byt_stream_operations() 485 return sst_ipc_tx_message_nowait(&byt->ipc, header, sst_byt_stream_operations() 490 int sst_byt_stream_start(struct sst_byt *byt, struct sst_byt_stream *stream, sst_byt_stream_start() argument 506 ret = sst_ipc_tx_message_nowait(&byt->ipc, header, tx_msg, size); sst_byt_stream_start() 508 dev_err(byt->dev, "ipc: error failed to start stream %d\n", sst_byt_stream_start() 514 int sst_byt_stream_stop(struct sst_byt *byt, struct sst_byt_stream *stream) sst_byt_stream_stop() argument 522 ret = sst_byt_stream_operations(byt, IPC_IA_DROP_STREAM, sst_byt_stream_stop() 525 dev_err(byt->dev, "ipc: error failed to stop stream %d\n", sst_byt_stream_stop() 530 int sst_byt_stream_pause(struct sst_byt *byt, struct sst_byt_stream *stream) sst_byt_stream_pause() argument 534 ret = sst_byt_stream_operations(byt, IPC_IA_PAUSE_STREAM, sst_byt_stream_pause() 537 dev_err(byt->dev, "ipc: error failed to pause stream %d\n", sst_byt_stream_pause() 543 int sst_byt_stream_resume(struct sst_byt *byt, struct sst_byt_stream *stream) sst_byt_stream_resume() argument 547 ret = sst_byt_stream_operations(byt, IPC_IA_RESUME_STREAM, sst_byt_stream_resume() 550 dev_err(byt->dev, "ipc: error failed to resume stream %d\n", sst_byt_stream_resume() 556 int sst_byt_get_dsp_position(struct sst_byt *byt, sst_byt_get_dsp_position() argument 559 struct sst_dsp *sst = byt->dsp; sst_byt_get_dsp_position() 571 struct sst_dsp *sst_byt_get_dsp(struct sst_byt *byt) sst_byt_get_dsp() argument 573 return byt->dsp; sst_byt_get_dsp() 583 struct sst_byt *byt = pdata->dsp; sst_byt_dsp_suspend_late() local 585 dev_dbg(byt->dev, "dsp reset\n"); sst_byt_dsp_suspend_late() 586 sst_dsp_reset(byt->dsp); sst_byt_dsp_suspend_late() 587 sst_ipc_drop_all(&byt->ipc); sst_byt_dsp_suspend_late() 588 dev_dbg(byt->dev, "dsp in reset\n"); sst_byt_dsp_suspend_late() 590 dev_dbg(byt->dev, "free all blocks and unload fw\n"); sst_byt_dsp_suspend_late() 591 sst_fw_unload(byt->fw); sst_byt_dsp_suspend_late() 599 struct sst_byt *byt = pdata->dsp; sst_byt_dsp_boot() local 602 dev_dbg(byt->dev, "reload dsp fw\n"); sst_byt_dsp_boot() 604 sst_dsp_reset(byt->dsp); sst_byt_dsp_boot() 606 ret = sst_fw_reload(byt->fw); sst_byt_dsp_boot() 613 byt->boot_complete = false; sst_byt_dsp_boot() 614 sst_dsp_boot(byt->dsp); sst_byt_dsp_boot() 615 dev_dbg(byt->dev, "dsp booting...\n"); sst_byt_dsp_boot() 623 struct sst_byt *byt = pdata->dsp; sst_byt_dsp_wait_for_ready() local 626 dev_dbg(byt->dev, "wait for dsp reboot\n"); sst_byt_dsp_wait_for_ready() 628 err = wait_event_timeout(byt->boot_wait, byt->boot_complete, sst_byt_dsp_wait_for_ready() 631 dev_err(byt->dev, "ipc: error DSP boot timeout\n"); sst_byt_dsp_wait_for_ready() 635 dev_dbg(byt->dev, "dsp rebooted\n"); sst_byt_dsp_wait_for_ready() 692 struct sst_byt *byt; sst_byt_dsp_init() local 700 byt = devm_kzalloc(dev, sizeof(*byt), GFP_KERNEL); sst_byt_dsp_init() 701 if (byt == NULL) sst_byt_dsp_init() 704 byt->dev = dev; sst_byt_dsp_init() 706 ipc = &byt->ipc; sst_byt_dsp_init() 720 INIT_LIST_HEAD(&byt->stream_list); sst_byt_dsp_init() 721 init_waitqueue_head(&byt->boot_wait); sst_byt_dsp_init() 722 byt_dev.thread_context = byt; sst_byt_dsp_init() 725 byt->dsp = sst_dsp_new(dev, &byt_dev, pdata); sst_byt_dsp_init() 726 if (byt->dsp == NULL) { sst_byt_dsp_init() 731 ipc->dsp = byt->dsp; sst_byt_dsp_init() 734 sst_dsp_reset(byt->dsp); sst_byt_dsp_init() 736 byt_sst_fw = sst_fw_new(byt->dsp, pdata->fw, byt); sst_byt_dsp_init() 744 sst_dsp_boot(byt->dsp); sst_byt_dsp_init() 745 err = wait_event_timeout(byt->boot_wait, byt->boot_complete, sst_byt_dsp_init() 749 dev_err(byt->dev, "ipc: error DSP boot timeout\n"); sst_byt_dsp_init() 754 sst_dsp_inbox_read(byt->dsp, &init, sizeof(init)); sst_byt_dsp_init() 755 dev_info(byt->dev, "FW version: %02x.%02x.%02x.%02x\n", sst_byt_dsp_init() 758 dev_info(byt->dev, "Build type: %x\n", init.fw_version.type); sst_byt_dsp_init() 759 dev_info(byt->dev, "Build date: %s %s\n", sst_byt_dsp_init() 762 pdata->dsp = byt; sst_byt_dsp_init() 763 byt->fw = byt_sst_fw; sst_byt_dsp_init() 768 sst_dsp_reset(byt->dsp); sst_byt_dsp_init() 771 sst_dsp_free(byt->dsp); sst_byt_dsp_init() 782 struct sst_byt *byt = pdata->dsp; sst_byt_dsp_free() local 784 sst_dsp_reset(byt->dsp); sst_byt_dsp_free() 785 sst_fw_free_all(byt->dsp); sst_byt_dsp_free() 786 sst_dsp_free(byt->dsp); sst_byt_dsp_free() 787 sst_ipc_fini(&byt->ipc); sst_byt_dsp_free()
|