1e149ca29SPierre-Louis Bossart // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) 29e42c5caSLiam Girdwood // 39e42c5caSLiam Girdwood // This file is provided under a dual BSD/GPLv2 license. When using or 49e42c5caSLiam Girdwood // redistributing this file, you may do so under either license. 59e42c5caSLiam Girdwood // 69e42c5caSLiam Girdwood // Copyright(c) 2018 Intel Corporation. All rights reserved. 79e42c5caSLiam Girdwood // 89e42c5caSLiam Girdwood // Author: Liam Girdwood <liam.r.girdwood@linux.intel.com> 99e42c5caSLiam Girdwood // 109e42c5caSLiam Girdwood 119e42c5caSLiam Girdwood /* 129e42c5caSLiam Girdwood * Hardware interface for audio DSP on Baytrail, Braswell and Cherrytrail. 139e42c5caSLiam Girdwood */ 149e42c5caSLiam Girdwood 159e42c5caSLiam Girdwood #include <linux/module.h> 169e42c5caSLiam Girdwood #include <sound/sof.h> 179e42c5caSLiam Girdwood #include <sound/sof/xtensa.h> 188a49cd11SArnd Bergmann #include <sound/soc-acpi.h> 198a49cd11SArnd Bergmann #include <sound/soc-acpi-intel-match.h> 208a49cd11SArnd Bergmann #include <sound/intel-dsp-config.h> 219e42c5caSLiam Girdwood #include "../ops.h" 2247fad239SPierre-Louis Bossart #include "atom.h" 239e42c5caSLiam Girdwood #include "shim.h" 248a49cd11SArnd Bergmann #include "../sof-acpi-dev.h" 25285880a2SDaniel Baluta #include "../sof-audio.h" 262aae447aSPierre-Louis Bossart #include "../../intel/common/soc-intel-quirks.h" 279e42c5caSLiam Girdwood 289e42c5caSLiam Girdwood static const struct snd_sof_debugfs_map byt_debugfs[] = { 291c5ab2dcSPierre-Louis Bossart {"dmac0", DSP_BAR, DMAC0_OFFSET, DMAC_SIZE, 309e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 311c5ab2dcSPierre-Louis Bossart {"dmac1", DSP_BAR, DMAC1_OFFSET, DMAC_SIZE, 329e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 331c5ab2dcSPierre-Louis Bossart {"ssp0", DSP_BAR, SSP0_OFFSET, SSP_SIZE, 349e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 351c5ab2dcSPierre-Louis Bossart {"ssp1", DSP_BAR, SSP1_OFFSET, SSP_SIZE, 369e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 371c5ab2dcSPierre-Louis Bossart {"ssp2", DSP_BAR, SSP2_OFFSET, SSP_SIZE, 389e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 391c5ab2dcSPierre-Louis Bossart {"iram", DSP_BAR, IRAM_OFFSET, IRAM_SIZE, 409e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_D0_ONLY}, 411c5ab2dcSPierre-Louis Bossart {"dram", DSP_BAR, DRAM_OFFSET, DRAM_SIZE, 429e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_D0_ONLY}, 431c5ab2dcSPierre-Louis Bossart {"shim", DSP_BAR, SHIM_OFFSET, SHIM_SIZE_BYT, 449e42c5caSLiam Girdwood SOF_DEBUGFS_ACCESS_ALWAYS}, 459e42c5caSLiam Girdwood }; 469e42c5caSLiam Girdwood 4747fad239SPierre-Louis Bossart static const struct snd_sof_debugfs_map cht_debugfs[] = { 481c5ab2dcSPierre-Louis Bossart {"dmac0", DSP_BAR, DMAC0_OFFSET, DMAC_SIZE, 491c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 501c5ab2dcSPierre-Louis Bossart {"dmac1", DSP_BAR, DMAC1_OFFSET, DMAC_SIZE, 511c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 5247fad239SPierre-Louis Bossart {"dmac2", DSP_BAR, DMAC2_OFFSET, DMAC_SIZE, 5347fad239SPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 541c5ab2dcSPierre-Louis Bossart {"ssp0", DSP_BAR, SSP0_OFFSET, SSP_SIZE, 551c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 561c5ab2dcSPierre-Louis Bossart {"ssp1", DSP_BAR, SSP1_OFFSET, SSP_SIZE, 571c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 581c5ab2dcSPierre-Louis Bossart {"ssp2", DSP_BAR, SSP2_OFFSET, SSP_SIZE, 591c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 6047fad239SPierre-Louis Bossart {"ssp3", DSP_BAR, SSP3_OFFSET, SSP_SIZE, 6147fad239SPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 6247fad239SPierre-Louis Bossart {"ssp4", DSP_BAR, SSP4_OFFSET, SSP_SIZE, 6347fad239SPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 6447fad239SPierre-Louis Bossart {"ssp5", DSP_BAR, SSP5_OFFSET, SSP_SIZE, 6547fad239SPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 661c5ab2dcSPierre-Louis Bossart {"iram", DSP_BAR, IRAM_OFFSET, IRAM_SIZE, 671c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_D0_ONLY}, 681c5ab2dcSPierre-Louis Bossart {"dram", DSP_BAR, DRAM_OFFSET, DRAM_SIZE, 691c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_D0_ONLY}, 7047fad239SPierre-Louis Bossart {"shim", DSP_BAR, SHIM_OFFSET, SHIM_SIZE_CHT, 711c5ab2dcSPierre-Louis Bossart SOF_DEBUGFS_ACCESS_ALWAYS}, 721c5ab2dcSPierre-Louis Bossart }; 731c5ab2dcSPierre-Louis Bossart 74af89e7daSPierre-Louis Bossart static void byt_reset_dsp_disable_int(struct snd_sof_dev *sdev) 75af89e7daSPierre-Louis Bossart { 76af89e7daSPierre-Louis Bossart /* Disable Interrupt from both sides */ 771c5ab2dcSPierre-Louis Bossart snd_sof_dsp_update_bits64(sdev, DSP_BAR, SHIM_IMRX, 0x3, 0x3); 781c5ab2dcSPierre-Louis Bossart snd_sof_dsp_update_bits64(sdev, DSP_BAR, SHIM_IMRD, 0x3, 0x3); 79af89e7daSPierre-Louis Bossart 80af89e7daSPierre-Louis Bossart /* Put DSP into reset, set reset vector */ 811c5ab2dcSPierre-Louis Bossart snd_sof_dsp_update_bits64(sdev, DSP_BAR, SHIM_CSR, 82af89e7daSPierre-Louis Bossart SHIM_BYT_CSR_RST | SHIM_BYT_CSR_VECTOR_SEL, 83af89e7daSPierre-Louis Bossart SHIM_BYT_CSR_RST | SHIM_BYT_CSR_VECTOR_SEL); 84af89e7daSPierre-Louis Bossart } 85af89e7daSPierre-Louis Bossart 86af89e7daSPierre-Louis Bossart static int byt_suspend(struct snd_sof_dev *sdev, u32 target_state) 87af89e7daSPierre-Louis Bossart { 88af89e7daSPierre-Louis Bossart byt_reset_dsp_disable_int(sdev); 89af89e7daSPierre-Louis Bossart 90af89e7daSPierre-Louis Bossart return 0; 91af89e7daSPierre-Louis Bossart } 92af89e7daSPierre-Louis Bossart 93af89e7daSPierre-Louis Bossart static int byt_resume(struct snd_sof_dev *sdev) 94af89e7daSPierre-Louis Bossart { 95af89e7daSPierre-Louis Bossart /* enable BUSY and disable DONE Interrupt by default */ 961c5ab2dcSPierre-Louis Bossart snd_sof_dsp_update_bits64(sdev, DSP_BAR, SHIM_IMRX, 97af89e7daSPierre-Louis Bossart SHIM_IMRX_BUSY | SHIM_IMRX_DONE, 98af89e7daSPierre-Louis Bossart SHIM_IMRX_DONE); 99af89e7daSPierre-Louis Bossart 100af89e7daSPierre-Louis Bossart return 0; 101af89e7daSPierre-Louis Bossart } 102af89e7daSPierre-Louis Bossart 103af89e7daSPierre-Louis Bossart static int byt_remove(struct snd_sof_dev *sdev) 104af89e7daSPierre-Louis Bossart { 105af89e7daSPierre-Louis Bossart byt_reset_dsp_disable_int(sdev); 106af89e7daSPierre-Louis Bossart 107af89e7daSPierre-Louis Bossart return 0; 108af89e7daSPierre-Louis Bossart } 109af89e7daSPierre-Louis Bossart 1109e42c5caSLiam Girdwood static int byt_acpi_probe(struct snd_sof_dev *sdev) 1119e42c5caSLiam Girdwood { 1129e42c5caSLiam Girdwood struct snd_sof_pdata *pdata = sdev->pdata; 1139e42c5caSLiam Girdwood const struct sof_dev_desc *desc = pdata->desc; 1149e42c5caSLiam Girdwood struct platform_device *pdev = 1159e42c5caSLiam Girdwood container_of(sdev->dev, struct platform_device, dev); 1165974f684SRanjani Sridharan const struct sof_intel_dsp_desc *chip; 1179e42c5caSLiam Girdwood struct resource *mmio; 1189e42c5caSLiam Girdwood u32 base, size; 1199e42c5caSLiam Girdwood int ret; 1209e42c5caSLiam Girdwood 1215974f684SRanjani Sridharan chip = get_chip_info(sdev->pdata); 1225974f684SRanjani Sridharan if (!chip) { 1235974f684SRanjani Sridharan dev_err(sdev->dev, "error: no such device supported\n"); 1245974f684SRanjani Sridharan return -EIO; 1255974f684SRanjani Sridharan } 1265974f684SRanjani Sridharan 1275974f684SRanjani Sridharan sdev->num_cores = chip->cores_num; 1285974f684SRanjani Sridharan 1299e42c5caSLiam Girdwood /* DSP DMA can only access low 31 bits of host memory */ 1309e42c5caSLiam Girdwood ret = dma_coerce_mask_and_coherent(sdev->dev, DMA_BIT_MASK(31)); 1319e42c5caSLiam Girdwood if (ret < 0) { 1329e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to set DMA mask %d\n", ret); 1339e42c5caSLiam Girdwood return ret; 1349e42c5caSLiam Girdwood } 1359e42c5caSLiam Girdwood 1369e42c5caSLiam Girdwood /* LPE base */ 1379e42c5caSLiam Girdwood mmio = platform_get_resource(pdev, IORESOURCE_MEM, 1389e42c5caSLiam Girdwood desc->resindex_lpe_base); 1399e42c5caSLiam Girdwood if (mmio) { 1409e42c5caSLiam Girdwood base = mmio->start; 1419e42c5caSLiam Girdwood size = resource_size(mmio); 1429e42c5caSLiam Girdwood } else { 1439e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to get LPE base at idx %d\n", 1449e42c5caSLiam Girdwood desc->resindex_lpe_base); 1459e42c5caSLiam Girdwood return -EINVAL; 1469e42c5caSLiam Girdwood } 1479e42c5caSLiam Girdwood 1489e42c5caSLiam Girdwood dev_dbg(sdev->dev, "LPE PHY base at 0x%x size 0x%x", base, size); 1491c5ab2dcSPierre-Louis Bossart sdev->bar[DSP_BAR] = devm_ioremap(sdev->dev, base, size); 1501c5ab2dcSPierre-Louis Bossart if (!sdev->bar[DSP_BAR]) { 1519e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to ioremap LPE base 0x%x size 0x%x\n", 1529e42c5caSLiam Girdwood base, size); 1539e42c5caSLiam Girdwood return -ENODEV; 1549e42c5caSLiam Girdwood } 1551c5ab2dcSPierre-Louis Bossart dev_dbg(sdev->dev, "LPE VADDR %p\n", sdev->bar[DSP_BAR]); 1569e42c5caSLiam Girdwood 1579e42c5caSLiam Girdwood /* TODO: add offsets */ 1581c5ab2dcSPierre-Louis Bossart sdev->mmio_bar = DSP_BAR; 1591c5ab2dcSPierre-Louis Bossart sdev->mailbox_bar = DSP_BAR; 1609e42c5caSLiam Girdwood 1619e42c5caSLiam Girdwood /* IMR base - optional */ 1629e42c5caSLiam Girdwood if (desc->resindex_imr_base == -1) 1639e42c5caSLiam Girdwood goto irq; 1649e42c5caSLiam Girdwood 1659e42c5caSLiam Girdwood mmio = platform_get_resource(pdev, IORESOURCE_MEM, 1669e42c5caSLiam Girdwood desc->resindex_imr_base); 1679e42c5caSLiam Girdwood if (mmio) { 1689e42c5caSLiam Girdwood base = mmio->start; 1699e42c5caSLiam Girdwood size = resource_size(mmio); 1709e42c5caSLiam Girdwood } else { 1719e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to get IMR base at idx %d\n", 1729e42c5caSLiam Girdwood desc->resindex_imr_base); 1739e42c5caSLiam Girdwood return -ENODEV; 1749e42c5caSLiam Girdwood } 1759e42c5caSLiam Girdwood 1769e42c5caSLiam Girdwood /* some BIOSes don't map IMR */ 1779e42c5caSLiam Girdwood if (base == 0x55aa55aa || base == 0x0) { 1789e42c5caSLiam Girdwood dev_info(sdev->dev, "IMR not set by BIOS. Ignoring\n"); 1799e42c5caSLiam Girdwood goto irq; 1809e42c5caSLiam Girdwood } 1819e42c5caSLiam Girdwood 1829e42c5caSLiam Girdwood dev_dbg(sdev->dev, "IMR base at 0x%x size 0x%x", base, size); 1831c5ab2dcSPierre-Louis Bossart sdev->bar[IMR_BAR] = devm_ioremap(sdev->dev, base, size); 1841c5ab2dcSPierre-Louis Bossart if (!sdev->bar[IMR_BAR]) { 1859e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to ioremap IMR base 0x%x size 0x%x\n", 1869e42c5caSLiam Girdwood base, size); 1879e42c5caSLiam Girdwood return -ENODEV; 1889e42c5caSLiam Girdwood } 1891c5ab2dcSPierre-Louis Bossart dev_dbg(sdev->dev, "IMR VADDR %p\n", sdev->bar[IMR_BAR]); 1909e42c5caSLiam Girdwood 1919e42c5caSLiam Girdwood irq: 1929e42c5caSLiam Girdwood /* register our IRQ */ 1939e42c5caSLiam Girdwood sdev->ipc_irq = platform_get_irq(pdev, desc->irqindex_host_ipc); 194cf9441adSStephen Boyd if (sdev->ipc_irq < 0) 1959e42c5caSLiam Girdwood return sdev->ipc_irq; 1969e42c5caSLiam Girdwood 1979e42c5caSLiam Girdwood dev_dbg(sdev->dev, "using IRQ %d\n", sdev->ipc_irq); 1989e42c5caSLiam Girdwood ret = devm_request_threaded_irq(sdev->dev, sdev->ipc_irq, 1991c5ab2dcSPierre-Louis Bossart atom_irq_handler, atom_irq_thread, 2009e42c5caSLiam Girdwood IRQF_SHARED, "AudioDSP", sdev); 2019e42c5caSLiam Girdwood if (ret < 0) { 2029e42c5caSLiam Girdwood dev_err(sdev->dev, "error: failed to register IRQ %d\n", 2039e42c5caSLiam Girdwood sdev->ipc_irq); 2049e42c5caSLiam Girdwood return ret; 2059e42c5caSLiam Girdwood } 2069e42c5caSLiam Girdwood 2073d2e5c48SKeyon Jie /* enable BUSY and disable DONE Interrupt by default */ 2081c5ab2dcSPierre-Louis Bossart snd_sof_dsp_update_bits64(sdev, DSP_BAR, SHIM_IMRX, 2093d2e5c48SKeyon Jie SHIM_IMRX_BUSY | SHIM_IMRX_DONE, 2103d2e5c48SKeyon Jie SHIM_IMRX_DONE); 2119e42c5caSLiam Girdwood 2129e42c5caSLiam Girdwood /* set default mailbox offset for FW ready message */ 2139e42c5caSLiam Girdwood sdev->dsp_box.offset = MBOX_OFFSET; 2149e42c5caSLiam Girdwood 2159e42c5caSLiam Girdwood return ret; 2169e42c5caSLiam Girdwood } 2179e42c5caSLiam Girdwood 2189e42c5caSLiam Girdwood /* baytrail ops */ 219856601e5SPierre-Louis Bossart static struct snd_sof_dsp_ops sof_byt_ops = { 2209e42c5caSLiam Girdwood /* device init */ 2219e42c5caSLiam Girdwood .probe = byt_acpi_probe, 222c691f0c6SRanjani Sridharan .remove = byt_remove, 2239e42c5caSLiam Girdwood 2249e42c5caSLiam Girdwood /* DSP core boot / reset */ 2251c5ab2dcSPierre-Louis Bossart .run = atom_run, 2261c5ab2dcSPierre-Louis Bossart .reset = atom_reset, 2279e42c5caSLiam Girdwood 2289e42c5caSLiam Girdwood /* Register IO */ 2299e42c5caSLiam Girdwood .write = sof_io_write, 2309e42c5caSLiam Girdwood .read = sof_io_read, 2319e42c5caSLiam Girdwood .write64 = sof_io_write64, 2329e42c5caSLiam Girdwood .read64 = sof_io_read64, 2339e42c5caSLiam Girdwood 2349e42c5caSLiam Girdwood /* Block IO */ 2359e42c5caSLiam Girdwood .block_read = sof_block_read, 2369e42c5caSLiam Girdwood .block_write = sof_block_write, 2379e42c5caSLiam Girdwood 238f71f59ddSDaniel Baluta /* Mailbox IO */ 239f71f59ddSDaniel Baluta .mailbox_read = sof_mailbox_read, 240f71f59ddSDaniel Baluta .mailbox_write = sof_mailbox_write, 241f71f59ddSDaniel Baluta 2429e42c5caSLiam Girdwood /* doorbell */ 2431c5ab2dcSPierre-Louis Bossart .irq_handler = atom_irq_handler, 2441c5ab2dcSPierre-Louis Bossart .irq_thread = atom_irq_thread, 2459e42c5caSLiam Girdwood 2469e42c5caSLiam Girdwood /* ipc */ 2471c5ab2dcSPierre-Louis Bossart .send_msg = atom_send_msg, 24883ee7ab1SDaniel Baluta .fw_ready = sof_fw_ready, 2491c5ab2dcSPierre-Louis Bossart .get_mailbox_offset = atom_get_mailbox_offset, 2501c5ab2dcSPierre-Louis Bossart .get_window_offset = atom_get_window_offset, 2519e42c5caSLiam Girdwood 25297e22cbdSBud Liviu-Alexandru .ipc_msg_data = sof_ipc_msg_data, 253cf73363eSPeter Ujfalusi .set_stream_data_offset = sof_set_stream_data_offset, 2549e42c5caSLiam Girdwood 255285880a2SDaniel Baluta /* machine driver */ 2561c5ab2dcSPierre-Louis Bossart .machine_select = atom_machine_select, 257285880a2SDaniel Baluta .machine_register = sof_machine_register, 258285880a2SDaniel Baluta .machine_unregister = sof_machine_unregister, 2591c5ab2dcSPierre-Louis Bossart .set_mach_params = atom_set_mach_params, 260285880a2SDaniel Baluta 2619e42c5caSLiam Girdwood /* debug */ 2629e42c5caSLiam Girdwood .debug_map = byt_debugfs, 2639e42c5caSLiam Girdwood .debug_map_count = ARRAY_SIZE(byt_debugfs), 2641c5ab2dcSPierre-Louis Bossart .dbg_dump = atom_dump, 265fe509b34SPeter Ujfalusi .debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem, 2669e42c5caSLiam Girdwood 2679e42c5caSLiam Girdwood /* stream callbacks */ 26897e22cbdSBud Liviu-Alexandru .pcm_open = sof_stream_pcm_open, 26997e22cbdSBud Liviu-Alexandru .pcm_close = sof_stream_pcm_close, 2709e42c5caSLiam Girdwood 2719e42c5caSLiam Girdwood /* module loading */ 2729e42c5caSLiam Girdwood .load_module = snd_sof_parse_module_memcpy, 2739e42c5caSLiam Girdwood 2749e42c5caSLiam Girdwood /*Firmware loading */ 2759e42c5caSLiam Girdwood .load_firmware = snd_sof_load_firmware_memcpy, 2769e42c5caSLiam Girdwood 277ddcccd54SRanjani Sridharan /* PM */ 278ddcccd54SRanjani Sridharan .suspend = byt_suspend, 279ddcccd54SRanjani Sridharan .resume = byt_resume, 280ddcccd54SRanjani Sridharan 2819e42c5caSLiam Girdwood /* DAI drivers */ 2821c5ab2dcSPierre-Louis Bossart .drv = atom_dai, 2839e42c5caSLiam Girdwood .num_drv = 3, /* we have only 3 SSPs on byt*/ 28427e322faSPierre-Louis Bossart 28527e322faSPierre-Louis Bossart /* ALSA HW info flags */ 28627e322faSPierre-Louis Bossart .hw_info = SNDRV_PCM_INFO_MMAP | 28727e322faSPierre-Louis Bossart SNDRV_PCM_INFO_MMAP_VALID | 28827e322faSPierre-Louis Bossart SNDRV_PCM_INFO_INTERLEAVED | 28927e322faSPierre-Louis Bossart SNDRV_PCM_INFO_PAUSE | 2904c02a7bdSPierre-Louis Bossart SNDRV_PCM_INFO_BATCH, 2910f501c7cSPierre-Louis Bossart 2920ed66cb7SPeter Ujfalusi .dsp_arch_ops = &sof_xtensa_arch_ops, 2939e42c5caSLiam Girdwood }; 2949e42c5caSLiam Girdwood 2958a49cd11SArnd Bergmann static const struct sof_intel_dsp_desc byt_chip_info = { 2969e42c5caSLiam Girdwood .cores_num = 1, 29764b96917SRanjani Sridharan .host_managed_cores_mask = 1, 298*03cf7262SPierre-Louis Bossart .hw_ip_version = SOF_INTEL_BAYTRAIL, 2999e42c5caSLiam Girdwood }; 3009e42c5caSLiam Girdwood 3019e42c5caSLiam Girdwood /* cherrytrail and braswell ops */ 302856601e5SPierre-Louis Bossart static struct snd_sof_dsp_ops sof_cht_ops = { 3039e42c5caSLiam Girdwood /* device init */ 3049e42c5caSLiam Girdwood .probe = byt_acpi_probe, 305c691f0c6SRanjani Sridharan .remove = byt_remove, 3069e42c5caSLiam Girdwood 3079e42c5caSLiam Girdwood /* DSP core boot / reset */ 3081c5ab2dcSPierre-Louis Bossart .run = atom_run, 3091c5ab2dcSPierre-Louis Bossart .reset = atom_reset, 3109e42c5caSLiam Girdwood 3119e42c5caSLiam Girdwood /* Register IO */ 3129e42c5caSLiam Girdwood .write = sof_io_write, 3139e42c5caSLiam Girdwood .read = sof_io_read, 3149e42c5caSLiam Girdwood .write64 = sof_io_write64, 3159e42c5caSLiam Girdwood .read64 = sof_io_read64, 3169e42c5caSLiam Girdwood 3179e42c5caSLiam Girdwood /* Block IO */ 3189e42c5caSLiam Girdwood .block_read = sof_block_read, 3199e42c5caSLiam Girdwood .block_write = sof_block_write, 3209e42c5caSLiam Girdwood 321f71f59ddSDaniel Baluta /* Mailbox IO */ 322f71f59ddSDaniel Baluta .mailbox_read = sof_mailbox_read, 323f71f59ddSDaniel Baluta .mailbox_write = sof_mailbox_write, 324f71f59ddSDaniel Baluta 3259e42c5caSLiam Girdwood /* doorbell */ 3261c5ab2dcSPierre-Louis Bossart .irq_handler = atom_irq_handler, 3271c5ab2dcSPierre-Louis Bossart .irq_thread = atom_irq_thread, 3289e42c5caSLiam Girdwood 3299e42c5caSLiam Girdwood /* ipc */ 3301c5ab2dcSPierre-Louis Bossart .send_msg = atom_send_msg, 33183ee7ab1SDaniel Baluta .fw_ready = sof_fw_ready, 3321c5ab2dcSPierre-Louis Bossart .get_mailbox_offset = atom_get_mailbox_offset, 3331c5ab2dcSPierre-Louis Bossart .get_window_offset = atom_get_window_offset, 3349e42c5caSLiam Girdwood 33597e22cbdSBud Liviu-Alexandru .ipc_msg_data = sof_ipc_msg_data, 336cf73363eSPeter Ujfalusi .set_stream_data_offset = sof_set_stream_data_offset, 3379e42c5caSLiam Girdwood 338285880a2SDaniel Baluta /* machine driver */ 3391c5ab2dcSPierre-Louis Bossart .machine_select = atom_machine_select, 340285880a2SDaniel Baluta .machine_register = sof_machine_register, 341285880a2SDaniel Baluta .machine_unregister = sof_machine_unregister, 3421c5ab2dcSPierre-Louis Bossart .set_mach_params = atom_set_mach_params, 343285880a2SDaniel Baluta 3449e42c5caSLiam Girdwood /* debug */ 3459e42c5caSLiam Girdwood .debug_map = cht_debugfs, 3469e42c5caSLiam Girdwood .debug_map_count = ARRAY_SIZE(cht_debugfs), 3471c5ab2dcSPierre-Louis Bossart .dbg_dump = atom_dump, 348fe509b34SPeter Ujfalusi .debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem, 3499e42c5caSLiam Girdwood 3509e42c5caSLiam Girdwood /* stream callbacks */ 35197e22cbdSBud Liviu-Alexandru .pcm_open = sof_stream_pcm_open, 35297e22cbdSBud Liviu-Alexandru .pcm_close = sof_stream_pcm_close, 3539e42c5caSLiam Girdwood 3549e42c5caSLiam Girdwood /* module loading */ 3559e42c5caSLiam Girdwood .load_module = snd_sof_parse_module_memcpy, 3569e42c5caSLiam Girdwood 3579e42c5caSLiam Girdwood /*Firmware loading */ 3589e42c5caSLiam Girdwood .load_firmware = snd_sof_load_firmware_memcpy, 3599e42c5caSLiam Girdwood 360ddcccd54SRanjani Sridharan /* PM */ 361ddcccd54SRanjani Sridharan .suspend = byt_suspend, 362ddcccd54SRanjani Sridharan .resume = byt_resume, 363ddcccd54SRanjani Sridharan 3649e42c5caSLiam Girdwood /* DAI drivers */ 3651c5ab2dcSPierre-Louis Bossart .drv = atom_dai, 3669e42c5caSLiam Girdwood /* all 6 SSPs may be available for cherrytrail */ 3671c5ab2dcSPierre-Louis Bossart .num_drv = 6, 36827e322faSPierre-Louis Bossart 36927e322faSPierre-Louis Bossart /* ALSA HW info flags */ 37027e322faSPierre-Louis Bossart .hw_info = SNDRV_PCM_INFO_MMAP | 37127e322faSPierre-Louis Bossart SNDRV_PCM_INFO_MMAP_VALID | 37227e322faSPierre-Louis Bossart SNDRV_PCM_INFO_INTERLEAVED | 37327e322faSPierre-Louis Bossart SNDRV_PCM_INFO_PAUSE | 3744c02a7bdSPierre-Louis Bossart SNDRV_PCM_INFO_BATCH, 3750f501c7cSPierre-Louis Bossart 3760ed66cb7SPeter Ujfalusi .dsp_arch_ops = &sof_xtensa_arch_ops, 3779e42c5caSLiam Girdwood }; 3789e42c5caSLiam Girdwood 3798a49cd11SArnd Bergmann static const struct sof_intel_dsp_desc cht_chip_info = { 3809e42c5caSLiam Girdwood .cores_num = 1, 38164b96917SRanjani Sridharan .host_managed_cores_mask = 1, 382*03cf7262SPierre-Louis Bossart .hw_ip_version = SOF_INTEL_BAYTRAIL, 3839e42c5caSLiam Girdwood }; 3848a49cd11SArnd Bergmann 3858a49cd11SArnd Bergmann /* BYTCR uses different IRQ index */ 3868a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_baytrailcr_desc = { 3878a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_baytrail_machines, 3888a49cd11SArnd Bergmann .resindex_lpe_base = 0, 3898a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 3908a49cd11SArnd Bergmann .resindex_imr_base = 2, 3918a49cd11SArnd Bergmann .irqindex_host_ipc = 0, 3928a49cd11SArnd Bergmann .chip_info = &byt_chip_info, 3930cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 3940cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 395a3757915SPierre-Louis Bossart .default_fw_path = { 396a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 397a3757915SPierre-Louis Bossart }, 398a3757915SPierre-Louis Bossart .default_tplg_path = { 399a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 400a3757915SPierre-Louis Bossart }, 401a97abb3cSPierre-Louis Bossart .default_fw_filename = { 402a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-byt.ri", 403a97abb3cSPierre-Louis Bossart }, 4048a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-byt-nocodec.tplg", 4058a49cd11SArnd Bergmann .ops = &sof_byt_ops, 4068a49cd11SArnd Bergmann }; 4078a49cd11SArnd Bergmann 4088a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_baytrail_desc = { 4098a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_baytrail_machines, 4108a49cd11SArnd Bergmann .resindex_lpe_base = 0, 4118a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 4128a49cd11SArnd Bergmann .resindex_imr_base = 2, 4138a49cd11SArnd Bergmann .irqindex_host_ipc = 5, 4148a49cd11SArnd Bergmann .chip_info = &byt_chip_info, 4150cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 4160cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 417a3757915SPierre-Louis Bossart .default_fw_path = { 418a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 419a3757915SPierre-Louis Bossart }, 420a3757915SPierre-Louis Bossart .default_tplg_path = { 421a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 422a3757915SPierre-Louis Bossart }, 423a97abb3cSPierre-Louis Bossart .default_fw_filename = { 424a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-byt.ri", 425a97abb3cSPierre-Louis Bossart }, 4268a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-byt-nocodec.tplg", 4278a49cd11SArnd Bergmann .ops = &sof_byt_ops, 4288a49cd11SArnd Bergmann }; 4298a49cd11SArnd Bergmann 4308a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_cherrytrail_desc = { 4318a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_cherrytrail_machines, 4328a49cd11SArnd Bergmann .resindex_lpe_base = 0, 4338a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 4348a49cd11SArnd Bergmann .resindex_imr_base = 2, 4358a49cd11SArnd Bergmann .irqindex_host_ipc = 5, 4368a49cd11SArnd Bergmann .chip_info = &cht_chip_info, 4370cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 4380cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 439a3757915SPierre-Louis Bossart .default_fw_path = { 440a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 441a3757915SPierre-Louis Bossart }, 442a3757915SPierre-Louis Bossart .default_tplg_path = { 443a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 444a3757915SPierre-Louis Bossart }, 445a97abb3cSPierre-Louis Bossart .default_fw_filename = { 446a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-cht.ri", 447a97abb3cSPierre-Louis Bossart }, 4488a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-cht-nocodec.tplg", 4498a49cd11SArnd Bergmann .ops = &sof_cht_ops, 4508a49cd11SArnd Bergmann }; 4518a49cd11SArnd Bergmann 4528a49cd11SArnd Bergmann static const struct acpi_device_id sof_baytrail_match[] = { 4538a49cd11SArnd Bergmann { "80860F28", (unsigned long)&sof_acpi_baytrail_desc }, 4548a49cd11SArnd Bergmann { "808622A8", (unsigned long)&sof_acpi_cherrytrail_desc }, 4558a49cd11SArnd Bergmann { } 4568a49cd11SArnd Bergmann }; 4578a49cd11SArnd Bergmann MODULE_DEVICE_TABLE(acpi, sof_baytrail_match); 4588a49cd11SArnd Bergmann 4598a49cd11SArnd Bergmann static int sof_baytrail_probe(struct platform_device *pdev) 4608a49cd11SArnd Bergmann { 4618a49cd11SArnd Bergmann struct device *dev = &pdev->dev; 4628a49cd11SArnd Bergmann const struct sof_dev_desc *desc; 4638a49cd11SArnd Bergmann const struct acpi_device_id *id; 4648a49cd11SArnd Bergmann int ret; 4658a49cd11SArnd Bergmann 4668a49cd11SArnd Bergmann id = acpi_match_device(dev->driver->acpi_match_table, dev); 4678a49cd11SArnd Bergmann if (!id) 4688a49cd11SArnd Bergmann return -ENODEV; 4698a49cd11SArnd Bergmann 4708a49cd11SArnd Bergmann ret = snd_intel_acpi_dsp_driver_probe(dev, id->id); 4718a49cd11SArnd Bergmann if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) { 4728a49cd11SArnd Bergmann dev_dbg(dev, "SOF ACPI driver not selected, aborting probe\n"); 4738a49cd11SArnd Bergmann return -ENODEV; 4748a49cd11SArnd Bergmann } 4758a49cd11SArnd Bergmann 4768a49cd11SArnd Bergmann desc = device_get_match_data(&pdev->dev); 4778a49cd11SArnd Bergmann if (!desc) 4788a49cd11SArnd Bergmann return -ENODEV; 4798a49cd11SArnd Bergmann 4808a49cd11SArnd Bergmann if (desc == &sof_acpi_baytrail_desc && soc_intel_is_byt_cr(pdev)) 4818a49cd11SArnd Bergmann desc = &sof_acpi_baytrailcr_desc; 4828a49cd11SArnd Bergmann 4838a49cd11SArnd Bergmann return sof_acpi_probe(pdev, desc); 4848a49cd11SArnd Bergmann } 4858a49cd11SArnd Bergmann 4868a49cd11SArnd Bergmann /* acpi_driver definition */ 4878a49cd11SArnd Bergmann static struct platform_driver snd_sof_acpi_intel_byt_driver = { 4888a49cd11SArnd Bergmann .probe = sof_baytrail_probe, 4898a49cd11SArnd Bergmann .remove = sof_acpi_remove, 4908a49cd11SArnd Bergmann .driver = { 4918a49cd11SArnd Bergmann .name = "sof-audio-acpi-intel-byt", 4928a49cd11SArnd Bergmann .pm = &sof_acpi_pm, 4938a49cd11SArnd Bergmann .acpi_match_table = sof_baytrail_match, 4948a49cd11SArnd Bergmann }, 4958a49cd11SArnd Bergmann }; 4968a49cd11SArnd Bergmann module_platform_driver(snd_sof_acpi_intel_byt_driver); 4979e42c5caSLiam Girdwood 4989e42c5caSLiam Girdwood MODULE_LICENSE("Dual BSD/GPL"); 499f4483a0fSPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC); 500068ac0dbSPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA); 5018a49cd11SArnd Bergmann MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV); 50247fad239SPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_ATOM_HIFI_EP); 503