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, 2481c5ab2dcSPierre-Louis Bossart .get_mailbox_offset = atom_get_mailbox_offset, 2491c5ab2dcSPierre-Louis Bossart .get_window_offset = atom_get_window_offset, 2509e42c5caSLiam Girdwood 25197e22cbdSBud Liviu-Alexandru .ipc_msg_data = sof_ipc_msg_data, 252cf73363eSPeter Ujfalusi .set_stream_data_offset = sof_set_stream_data_offset, 2539e42c5caSLiam Girdwood 254285880a2SDaniel Baluta /* machine driver */ 2551c5ab2dcSPierre-Louis Bossart .machine_select = atom_machine_select, 256285880a2SDaniel Baluta .machine_register = sof_machine_register, 257285880a2SDaniel Baluta .machine_unregister = sof_machine_unregister, 2581c5ab2dcSPierre-Louis Bossart .set_mach_params = atom_set_mach_params, 259285880a2SDaniel Baluta 2609e42c5caSLiam Girdwood /* debug */ 2619e42c5caSLiam Girdwood .debug_map = byt_debugfs, 2629e42c5caSLiam Girdwood .debug_map_count = ARRAY_SIZE(byt_debugfs), 2631c5ab2dcSPierre-Louis Bossart .dbg_dump = atom_dump, 264fe509b34SPeter Ujfalusi .debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem, 2659e42c5caSLiam Girdwood 2669e42c5caSLiam Girdwood /* stream callbacks */ 26797e22cbdSBud Liviu-Alexandru .pcm_open = sof_stream_pcm_open, 26897e22cbdSBud Liviu-Alexandru .pcm_close = sof_stream_pcm_close, 2699e42c5caSLiam Girdwood 2709e42c5caSLiam Girdwood /*Firmware loading */ 2719e42c5caSLiam Girdwood .load_firmware = snd_sof_load_firmware_memcpy, 2729e42c5caSLiam Girdwood 273ddcccd54SRanjani Sridharan /* PM */ 274ddcccd54SRanjani Sridharan .suspend = byt_suspend, 275ddcccd54SRanjani Sridharan .resume = byt_resume, 276ddcccd54SRanjani Sridharan 2779e42c5caSLiam Girdwood /* DAI drivers */ 2781c5ab2dcSPierre-Louis Bossart .drv = atom_dai, 2799e42c5caSLiam Girdwood .num_drv = 3, /* we have only 3 SSPs on byt*/ 28027e322faSPierre-Louis Bossart 28127e322faSPierre-Louis Bossart /* ALSA HW info flags */ 28227e322faSPierre-Louis Bossart .hw_info = SNDRV_PCM_INFO_MMAP | 28327e322faSPierre-Louis Bossart SNDRV_PCM_INFO_MMAP_VALID | 28427e322faSPierre-Louis Bossart SNDRV_PCM_INFO_INTERLEAVED | 28527e322faSPierre-Louis Bossart SNDRV_PCM_INFO_PAUSE | 2864c02a7bdSPierre-Louis Bossart SNDRV_PCM_INFO_BATCH, 2870f501c7cSPierre-Louis Bossart 2880ed66cb7SPeter Ujfalusi .dsp_arch_ops = &sof_xtensa_arch_ops, 2899e42c5caSLiam Girdwood }; 2909e42c5caSLiam Girdwood 2918a49cd11SArnd Bergmann static const struct sof_intel_dsp_desc byt_chip_info = { 2929e42c5caSLiam Girdwood .cores_num = 1, 29364b96917SRanjani Sridharan .host_managed_cores_mask = 1, 29403cf7262SPierre-Louis Bossart .hw_ip_version = SOF_INTEL_BAYTRAIL, 2959e42c5caSLiam Girdwood }; 2969e42c5caSLiam Girdwood 2979e42c5caSLiam Girdwood /* cherrytrail and braswell ops */ 298856601e5SPierre-Louis Bossart static struct snd_sof_dsp_ops sof_cht_ops = { 2999e42c5caSLiam Girdwood /* device init */ 3009e42c5caSLiam Girdwood .probe = byt_acpi_probe, 301c691f0c6SRanjani Sridharan .remove = byt_remove, 3029e42c5caSLiam Girdwood 3039e42c5caSLiam Girdwood /* DSP core boot / reset */ 3041c5ab2dcSPierre-Louis Bossart .run = atom_run, 3051c5ab2dcSPierre-Louis Bossart .reset = atom_reset, 3069e42c5caSLiam Girdwood 3079e42c5caSLiam Girdwood /* Register IO */ 3089e42c5caSLiam Girdwood .write = sof_io_write, 3099e42c5caSLiam Girdwood .read = sof_io_read, 3109e42c5caSLiam Girdwood .write64 = sof_io_write64, 3119e42c5caSLiam Girdwood .read64 = sof_io_read64, 3129e42c5caSLiam Girdwood 3139e42c5caSLiam Girdwood /* Block IO */ 3149e42c5caSLiam Girdwood .block_read = sof_block_read, 3159e42c5caSLiam Girdwood .block_write = sof_block_write, 3169e42c5caSLiam Girdwood 317f71f59ddSDaniel Baluta /* Mailbox IO */ 318f71f59ddSDaniel Baluta .mailbox_read = sof_mailbox_read, 319f71f59ddSDaniel Baluta .mailbox_write = sof_mailbox_write, 320f71f59ddSDaniel Baluta 3219e42c5caSLiam Girdwood /* doorbell */ 3221c5ab2dcSPierre-Louis Bossart .irq_handler = atom_irq_handler, 3231c5ab2dcSPierre-Louis Bossart .irq_thread = atom_irq_thread, 3249e42c5caSLiam Girdwood 3259e42c5caSLiam Girdwood /* ipc */ 3261c5ab2dcSPierre-Louis Bossart .send_msg = atom_send_msg, 3271c5ab2dcSPierre-Louis Bossart .get_mailbox_offset = atom_get_mailbox_offset, 3281c5ab2dcSPierre-Louis Bossart .get_window_offset = atom_get_window_offset, 3299e42c5caSLiam Girdwood 33097e22cbdSBud Liviu-Alexandru .ipc_msg_data = sof_ipc_msg_data, 331cf73363eSPeter Ujfalusi .set_stream_data_offset = sof_set_stream_data_offset, 3329e42c5caSLiam Girdwood 333285880a2SDaniel Baluta /* machine driver */ 3341c5ab2dcSPierre-Louis Bossart .machine_select = atom_machine_select, 335285880a2SDaniel Baluta .machine_register = sof_machine_register, 336285880a2SDaniel Baluta .machine_unregister = sof_machine_unregister, 3371c5ab2dcSPierre-Louis Bossart .set_mach_params = atom_set_mach_params, 338285880a2SDaniel Baluta 3399e42c5caSLiam Girdwood /* debug */ 3409e42c5caSLiam Girdwood .debug_map = cht_debugfs, 3419e42c5caSLiam Girdwood .debug_map_count = ARRAY_SIZE(cht_debugfs), 3421c5ab2dcSPierre-Louis Bossart .dbg_dump = atom_dump, 343fe509b34SPeter Ujfalusi .debugfs_add_region_item = snd_sof_debugfs_add_region_item_iomem, 3449e42c5caSLiam Girdwood 3459e42c5caSLiam Girdwood /* stream callbacks */ 34697e22cbdSBud Liviu-Alexandru .pcm_open = sof_stream_pcm_open, 34797e22cbdSBud Liviu-Alexandru .pcm_close = sof_stream_pcm_close, 3489e42c5caSLiam Girdwood 3499e42c5caSLiam Girdwood /*Firmware loading */ 3509e42c5caSLiam Girdwood .load_firmware = snd_sof_load_firmware_memcpy, 3519e42c5caSLiam Girdwood 352ddcccd54SRanjani Sridharan /* PM */ 353ddcccd54SRanjani Sridharan .suspend = byt_suspend, 354ddcccd54SRanjani Sridharan .resume = byt_resume, 355ddcccd54SRanjani Sridharan 3569e42c5caSLiam Girdwood /* DAI drivers */ 3571c5ab2dcSPierre-Louis Bossart .drv = atom_dai, 3589e42c5caSLiam Girdwood /* all 6 SSPs may be available for cherrytrail */ 3591c5ab2dcSPierre-Louis Bossart .num_drv = 6, 36027e322faSPierre-Louis Bossart 36127e322faSPierre-Louis Bossart /* ALSA HW info flags */ 36227e322faSPierre-Louis Bossart .hw_info = SNDRV_PCM_INFO_MMAP | 36327e322faSPierre-Louis Bossart SNDRV_PCM_INFO_MMAP_VALID | 36427e322faSPierre-Louis Bossart SNDRV_PCM_INFO_INTERLEAVED | 36527e322faSPierre-Louis Bossart SNDRV_PCM_INFO_PAUSE | 3664c02a7bdSPierre-Louis Bossart SNDRV_PCM_INFO_BATCH, 3670f501c7cSPierre-Louis Bossart 3680ed66cb7SPeter Ujfalusi .dsp_arch_ops = &sof_xtensa_arch_ops, 3699e42c5caSLiam Girdwood }; 3709e42c5caSLiam Girdwood 3718a49cd11SArnd Bergmann static const struct sof_intel_dsp_desc cht_chip_info = { 3729e42c5caSLiam Girdwood .cores_num = 1, 37364b96917SRanjani Sridharan .host_managed_cores_mask = 1, 37403cf7262SPierre-Louis Bossart .hw_ip_version = SOF_INTEL_BAYTRAIL, 3759e42c5caSLiam Girdwood }; 3768a49cd11SArnd Bergmann 3778a49cd11SArnd Bergmann /* BYTCR uses different IRQ index */ 3788a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_baytrailcr_desc = { 3798a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_baytrail_machines, 3808a49cd11SArnd Bergmann .resindex_lpe_base = 0, 3818a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 3828a49cd11SArnd Bergmann .resindex_imr_base = 2, 3838a49cd11SArnd Bergmann .irqindex_host_ipc = 0, 3848a49cd11SArnd Bergmann .chip_info = &byt_chip_info, 3850cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 3860cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 387a3757915SPierre-Louis Bossart .default_fw_path = { 388a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 389a3757915SPierre-Louis Bossart }, 390a3757915SPierre-Louis Bossart .default_tplg_path = { 391a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 392a3757915SPierre-Louis Bossart }, 393a97abb3cSPierre-Louis Bossart .default_fw_filename = { 394a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-byt.ri", 395a97abb3cSPierre-Louis Bossart }, 3968a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-byt-nocodec.tplg", 3978a49cd11SArnd Bergmann .ops = &sof_byt_ops, 3988a49cd11SArnd Bergmann }; 3998a49cd11SArnd Bergmann 4008a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_baytrail_desc = { 4018a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_baytrail_machines, 4028a49cd11SArnd Bergmann .resindex_lpe_base = 0, 4038a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 4048a49cd11SArnd Bergmann .resindex_imr_base = 2, 4058a49cd11SArnd Bergmann .irqindex_host_ipc = 5, 4068a49cd11SArnd Bergmann .chip_info = &byt_chip_info, 4070cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 4080cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 409a3757915SPierre-Louis Bossart .default_fw_path = { 410a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 411a3757915SPierre-Louis Bossart }, 412a3757915SPierre-Louis Bossart .default_tplg_path = { 413a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 414a3757915SPierre-Louis Bossart }, 415a97abb3cSPierre-Louis Bossart .default_fw_filename = { 416a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-byt.ri", 417a97abb3cSPierre-Louis Bossart }, 4188a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-byt-nocodec.tplg", 4198a49cd11SArnd Bergmann .ops = &sof_byt_ops, 4208a49cd11SArnd Bergmann }; 4218a49cd11SArnd Bergmann 4228a49cd11SArnd Bergmann static const struct sof_dev_desc sof_acpi_cherrytrail_desc = { 4238a49cd11SArnd Bergmann .machines = snd_soc_acpi_intel_cherrytrail_machines, 4248a49cd11SArnd Bergmann .resindex_lpe_base = 0, 4258a49cd11SArnd Bergmann .resindex_pcicfg_base = 1, 4268a49cd11SArnd Bergmann .resindex_imr_base = 2, 4278a49cd11SArnd Bergmann .irqindex_host_ipc = 5, 4288a49cd11SArnd Bergmann .chip_info = &cht_chip_info, 4290cf8ff05SPierre-Louis Bossart .ipc_supported_mask = BIT(SOF_IPC), 4300cf8ff05SPierre-Louis Bossart .ipc_default = SOF_IPC, 431a3757915SPierre-Louis Bossart .default_fw_path = { 432a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof", 433a3757915SPierre-Louis Bossart }, 434a3757915SPierre-Louis Bossart .default_tplg_path = { 435a3757915SPierre-Louis Bossart [SOF_IPC] = "intel/sof-tplg", 436a3757915SPierre-Louis Bossart }, 437a97abb3cSPierre-Louis Bossart .default_fw_filename = { 438a97abb3cSPierre-Louis Bossart [SOF_IPC] = "sof-cht.ri", 439a97abb3cSPierre-Louis Bossart }, 4408a49cd11SArnd Bergmann .nocodec_tplg_filename = "sof-cht-nocodec.tplg", 4418a49cd11SArnd Bergmann .ops = &sof_cht_ops, 4428a49cd11SArnd Bergmann }; 4438a49cd11SArnd Bergmann 4448a49cd11SArnd Bergmann static const struct acpi_device_id sof_baytrail_match[] = { 4458a49cd11SArnd Bergmann { "80860F28", (unsigned long)&sof_acpi_baytrail_desc }, 4468a49cd11SArnd Bergmann { "808622A8", (unsigned long)&sof_acpi_cherrytrail_desc }, 4478a49cd11SArnd Bergmann { } 4488a49cd11SArnd Bergmann }; 4498a49cd11SArnd Bergmann MODULE_DEVICE_TABLE(acpi, sof_baytrail_match); 4508a49cd11SArnd Bergmann 4518a49cd11SArnd Bergmann static int sof_baytrail_probe(struct platform_device *pdev) 4528a49cd11SArnd Bergmann { 4538a49cd11SArnd Bergmann struct device *dev = &pdev->dev; 4548a49cd11SArnd Bergmann const struct sof_dev_desc *desc; 4558a49cd11SArnd Bergmann const struct acpi_device_id *id; 4568a49cd11SArnd Bergmann int ret; 4578a49cd11SArnd Bergmann 4588a49cd11SArnd Bergmann id = acpi_match_device(dev->driver->acpi_match_table, dev); 4598a49cd11SArnd Bergmann if (!id) 4608a49cd11SArnd Bergmann return -ENODEV; 4618a49cd11SArnd Bergmann 4628a49cd11SArnd Bergmann ret = snd_intel_acpi_dsp_driver_probe(dev, id->id); 4638a49cd11SArnd Bergmann if (ret != SND_INTEL_DSP_DRIVER_ANY && ret != SND_INTEL_DSP_DRIVER_SOF) { 4648a49cd11SArnd Bergmann dev_dbg(dev, "SOF ACPI driver not selected, aborting probe\n"); 4658a49cd11SArnd Bergmann return -ENODEV; 4668a49cd11SArnd Bergmann } 4678a49cd11SArnd Bergmann 468*65b6851dSAndy Shevchenko desc = (const struct sof_dev_desc *)id->driver_data; 4698a49cd11SArnd Bergmann if (desc == &sof_acpi_baytrail_desc && soc_intel_is_byt_cr(pdev)) 4708a49cd11SArnd Bergmann desc = &sof_acpi_baytrailcr_desc; 4718a49cd11SArnd Bergmann 4728a49cd11SArnd Bergmann return sof_acpi_probe(pdev, desc); 4738a49cd11SArnd Bergmann } 4748a49cd11SArnd Bergmann 4758a49cd11SArnd Bergmann /* acpi_driver definition */ 4768a49cd11SArnd Bergmann static struct platform_driver snd_sof_acpi_intel_byt_driver = { 4778a49cd11SArnd Bergmann .probe = sof_baytrail_probe, 4788a49cd11SArnd Bergmann .remove = sof_acpi_remove, 4798a49cd11SArnd Bergmann .driver = { 4808a49cd11SArnd Bergmann .name = "sof-audio-acpi-intel-byt", 4818a49cd11SArnd Bergmann .pm = &sof_acpi_pm, 4828a49cd11SArnd Bergmann .acpi_match_table = sof_baytrail_match, 4838a49cd11SArnd Bergmann }, 4848a49cd11SArnd Bergmann }; 4858a49cd11SArnd Bergmann module_platform_driver(snd_sof_acpi_intel_byt_driver); 4869e42c5caSLiam Girdwood 4879e42c5caSLiam Girdwood MODULE_LICENSE("Dual BSD/GPL"); 488f4483a0fSPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_HIFI_EP_IPC); 489068ac0dbSPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_XTENSA); 4908a49cd11SArnd Bergmann MODULE_IMPORT_NS(SND_SOC_SOF_ACPI_DEV); 49147fad239SPierre-Louis Bossart MODULE_IMPORT_NS(SND_SOC_SOF_INTEL_ATOM_HIFI_EP); 492