18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2020, The Linux Foundation. All rights reserved. 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * lpass-sc7180.c -- ALSA SoC platform-machine driver for QTi LPASS 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#include <linux/clk.h> 98c2ecf20Sopenharmony_ci#include <linux/device.h> 108c2ecf20Sopenharmony_ci#include <linux/err.h> 118c2ecf20Sopenharmony_ci#include <linux/kernel.h> 128c2ecf20Sopenharmony_ci#include <linux/module.h> 138c2ecf20Sopenharmony_ci#include <linux/of.h> 148c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 158c2ecf20Sopenharmony_ci#include <dt-bindings/sound/sc7180-lpass.h> 168c2ecf20Sopenharmony_ci#include <sound/pcm.h> 178c2ecf20Sopenharmony_ci#include <sound/soc.h> 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci#include "lpass-lpaif-reg.h" 208c2ecf20Sopenharmony_ci#include "lpass.h" 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_cistatic struct snd_soc_dai_driver sc7180_lpass_cpu_dai_driver[] = { 238c2ecf20Sopenharmony_ci { 248c2ecf20Sopenharmony_ci .id = MI2S_PRIMARY, 258c2ecf20Sopenharmony_ci .name = "Primary MI2S", 268c2ecf20Sopenharmony_ci .playback = { 278c2ecf20Sopenharmony_ci .stream_name = "Primary Playback", 288c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S16, 298c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 308c2ecf20Sopenharmony_ci .rate_min = 48000, 318c2ecf20Sopenharmony_ci .rate_max = 48000, 328c2ecf20Sopenharmony_ci .channels_min = 2, 338c2ecf20Sopenharmony_ci .channels_max = 2, 348c2ecf20Sopenharmony_ci }, 358c2ecf20Sopenharmony_ci .capture = { 368c2ecf20Sopenharmony_ci .stream_name = "Primary Capture", 378c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S16, 388c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 398c2ecf20Sopenharmony_ci .rate_min = 48000, 408c2ecf20Sopenharmony_ci .rate_max = 48000, 418c2ecf20Sopenharmony_ci .channels_min = 2, 428c2ecf20Sopenharmony_ci .channels_max = 2, 438c2ecf20Sopenharmony_ci }, 448c2ecf20Sopenharmony_ci .probe = &asoc_qcom_lpass_cpu_dai_probe, 458c2ecf20Sopenharmony_ci .ops = &asoc_qcom_lpass_cpu_dai_ops, 468c2ecf20Sopenharmony_ci }, { 478c2ecf20Sopenharmony_ci .id = MI2S_SECONDARY, 488c2ecf20Sopenharmony_ci .name = "Secondary MI2S", 498c2ecf20Sopenharmony_ci .playback = { 508c2ecf20Sopenharmony_ci .stream_name = "Secondary Playback", 518c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S16, 528c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 538c2ecf20Sopenharmony_ci .rate_min = 48000, 548c2ecf20Sopenharmony_ci .rate_max = 48000, 558c2ecf20Sopenharmony_ci .channels_min = 2, 568c2ecf20Sopenharmony_ci .channels_max = 2, 578c2ecf20Sopenharmony_ci }, 588c2ecf20Sopenharmony_ci .probe = &asoc_qcom_lpass_cpu_dai_probe, 598c2ecf20Sopenharmony_ci .ops = &asoc_qcom_lpass_cpu_dai_ops, 608c2ecf20Sopenharmony_ci }, { 618c2ecf20Sopenharmony_ci .id = LPASS_DP_RX, 628c2ecf20Sopenharmony_ci .name = "Hdmi", 638c2ecf20Sopenharmony_ci .playback = { 648c2ecf20Sopenharmony_ci .stream_name = "Hdmi Playback", 658c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S24, 668c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 678c2ecf20Sopenharmony_ci .rate_min = 48000, 688c2ecf20Sopenharmony_ci .rate_max = 48000, 698c2ecf20Sopenharmony_ci .channels_min = 2, 708c2ecf20Sopenharmony_ci .channels_max = 2, 718c2ecf20Sopenharmony_ci }, 728c2ecf20Sopenharmony_ci .ops = &asoc_qcom_lpass_hdmi_dai_ops, 738c2ecf20Sopenharmony_ci }, 748c2ecf20Sopenharmony_ci}; 758c2ecf20Sopenharmony_ci 768c2ecf20Sopenharmony_cistatic int sc7180_lpass_alloc_dma_channel(struct lpass_data *drvdata, 778c2ecf20Sopenharmony_ci int direction, unsigned int dai_id) 788c2ecf20Sopenharmony_ci{ 798c2ecf20Sopenharmony_ci struct lpass_variant *v = drvdata->variant; 808c2ecf20Sopenharmony_ci int chan = 0; 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci if (dai_id == LPASS_DP_RX) { 838c2ecf20Sopenharmony_ci if (direction == SNDRV_PCM_STREAM_PLAYBACK) { 848c2ecf20Sopenharmony_ci chan = find_first_zero_bit(&drvdata->hdmi_dma_ch_bit_map, 858c2ecf20Sopenharmony_ci v->hdmi_rdma_channels); 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci if (chan >= v->hdmi_rdma_channels) 888c2ecf20Sopenharmony_ci return -EBUSY; 898c2ecf20Sopenharmony_ci } 908c2ecf20Sopenharmony_ci set_bit(chan, &drvdata->hdmi_dma_ch_bit_map); 918c2ecf20Sopenharmony_ci } else { 928c2ecf20Sopenharmony_ci if (direction == SNDRV_PCM_STREAM_PLAYBACK) { 938c2ecf20Sopenharmony_ci chan = find_first_zero_bit(&drvdata->dma_ch_bit_map, 948c2ecf20Sopenharmony_ci v->rdma_channels); 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci if (chan >= v->rdma_channels) 978c2ecf20Sopenharmony_ci return -EBUSY; 988c2ecf20Sopenharmony_ci } else { 998c2ecf20Sopenharmony_ci chan = find_next_zero_bit(&drvdata->dma_ch_bit_map, 1008c2ecf20Sopenharmony_ci v->wrdma_channel_start + 1018c2ecf20Sopenharmony_ci v->wrdma_channels, 1028c2ecf20Sopenharmony_ci v->wrdma_channel_start); 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci if (chan >= v->wrdma_channel_start + v->wrdma_channels) 1058c2ecf20Sopenharmony_ci return -EBUSY; 1068c2ecf20Sopenharmony_ci } 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci set_bit(chan, &drvdata->dma_ch_bit_map); 1098c2ecf20Sopenharmony_ci } 1108c2ecf20Sopenharmony_ci return chan; 1118c2ecf20Sopenharmony_ci} 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_cistatic int sc7180_lpass_free_dma_channel(struct lpass_data *drvdata, int chan, unsigned int dai_id) 1148c2ecf20Sopenharmony_ci{ 1158c2ecf20Sopenharmony_ci if (dai_id == LPASS_DP_RX) 1168c2ecf20Sopenharmony_ci clear_bit(chan, &drvdata->hdmi_dma_ch_bit_map); 1178c2ecf20Sopenharmony_ci else 1188c2ecf20Sopenharmony_ci clear_bit(chan, &drvdata->dma_ch_bit_map); 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci return 0; 1218c2ecf20Sopenharmony_ci} 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_cistatic int sc7180_lpass_init(struct platform_device *pdev) 1248c2ecf20Sopenharmony_ci{ 1258c2ecf20Sopenharmony_ci struct lpass_data *drvdata = platform_get_drvdata(pdev); 1268c2ecf20Sopenharmony_ci struct lpass_variant *variant = drvdata->variant; 1278c2ecf20Sopenharmony_ci struct device *dev = &pdev->dev; 1288c2ecf20Sopenharmony_ci int ret, i; 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci drvdata->clks = devm_kcalloc(dev, variant->num_clks, 1318c2ecf20Sopenharmony_ci sizeof(*drvdata->clks), GFP_KERNEL); 1328c2ecf20Sopenharmony_ci if (!drvdata->clks) 1338c2ecf20Sopenharmony_ci return -ENOMEM; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci drvdata->num_clks = variant->num_clks; 1368c2ecf20Sopenharmony_ci 1378c2ecf20Sopenharmony_ci for (i = 0; i < drvdata->num_clks; i++) 1388c2ecf20Sopenharmony_ci drvdata->clks[i].id = variant->clk_name[i]; 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci ret = devm_clk_bulk_get(dev, drvdata->num_clks, drvdata->clks); 1418c2ecf20Sopenharmony_ci if (ret) { 1428c2ecf20Sopenharmony_ci dev_err(dev, "Failed to get clocks %d\n", ret); 1438c2ecf20Sopenharmony_ci return ret; 1448c2ecf20Sopenharmony_ci } 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_ci ret = clk_bulk_prepare_enable(drvdata->num_clks, drvdata->clks); 1478c2ecf20Sopenharmony_ci if (ret) { 1488c2ecf20Sopenharmony_ci dev_err(dev, "sc7180 clk_enable failed\n"); 1498c2ecf20Sopenharmony_ci return ret; 1508c2ecf20Sopenharmony_ci } 1518c2ecf20Sopenharmony_ci 1528c2ecf20Sopenharmony_ci return 0; 1538c2ecf20Sopenharmony_ci} 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_cistatic int sc7180_lpass_exit(struct platform_device *pdev) 1568c2ecf20Sopenharmony_ci{ 1578c2ecf20Sopenharmony_ci struct lpass_data *drvdata = platform_get_drvdata(pdev); 1588c2ecf20Sopenharmony_ci 1598c2ecf20Sopenharmony_ci clk_bulk_disable_unprepare(drvdata->num_clks, drvdata->clks); 1608c2ecf20Sopenharmony_ci 1618c2ecf20Sopenharmony_ci return 0; 1628c2ecf20Sopenharmony_ci} 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_cistatic struct lpass_variant sc7180_data = { 1658c2ecf20Sopenharmony_ci .i2sctrl_reg_base = 0x1000, 1668c2ecf20Sopenharmony_ci .i2sctrl_reg_stride = 0x1000, 1678c2ecf20Sopenharmony_ci .i2s_ports = 3, 1688c2ecf20Sopenharmony_ci .irq_reg_base = 0x9000, 1698c2ecf20Sopenharmony_ci .irq_reg_stride = 0x1000, 1708c2ecf20Sopenharmony_ci .irq_ports = 3, 1718c2ecf20Sopenharmony_ci .rdma_reg_base = 0xC000, 1728c2ecf20Sopenharmony_ci .rdma_reg_stride = 0x1000, 1738c2ecf20Sopenharmony_ci .rdma_channels = 5, 1748c2ecf20Sopenharmony_ci .hdmi_rdma_reg_base = 0x64000, 1758c2ecf20Sopenharmony_ci .hdmi_rdma_reg_stride = 0x1000, 1768c2ecf20Sopenharmony_ci .hdmi_rdma_channels = 4, 1778c2ecf20Sopenharmony_ci .dmactl_audif_start = 1, 1788c2ecf20Sopenharmony_ci .wrdma_reg_base = 0x18000, 1798c2ecf20Sopenharmony_ci .wrdma_reg_stride = 0x1000, 1808c2ecf20Sopenharmony_ci .wrdma_channel_start = 5, 1818c2ecf20Sopenharmony_ci .wrdma_channels = 4, 1828c2ecf20Sopenharmony_ci 1838c2ecf20Sopenharmony_ci .loopback = REG_FIELD_ID(0x1000, 17, 17, 3, 0x1000), 1848c2ecf20Sopenharmony_ci .spken = REG_FIELD_ID(0x1000, 16, 16, 3, 0x1000), 1858c2ecf20Sopenharmony_ci .spkmode = REG_FIELD_ID(0x1000, 11, 15, 3, 0x1000), 1868c2ecf20Sopenharmony_ci .spkmono = REG_FIELD_ID(0x1000, 10, 10, 3, 0x1000), 1878c2ecf20Sopenharmony_ci .micen = REG_FIELD_ID(0x1000, 9, 9, 3, 0x1000), 1888c2ecf20Sopenharmony_ci .micmode = REG_FIELD_ID(0x1000, 4, 8, 3, 0x1000), 1898c2ecf20Sopenharmony_ci .micmono = REG_FIELD_ID(0x1000, 3, 3, 3, 0x1000), 1908c2ecf20Sopenharmony_ci .wssrc = REG_FIELD_ID(0x1000, 2, 2, 3, 0x1000), 1918c2ecf20Sopenharmony_ci .bitwidth = REG_FIELD_ID(0x1000, 0, 1, 3, 0x1000), 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci .rdma_dyncclk = REG_FIELD_ID(0xC000, 21, 21, 5, 0x1000), 1948c2ecf20Sopenharmony_ci .rdma_bursten = REG_FIELD_ID(0xC000, 20, 20, 5, 0x1000), 1958c2ecf20Sopenharmony_ci .rdma_wpscnt = REG_FIELD_ID(0xC000, 16, 19, 5, 0x1000), 1968c2ecf20Sopenharmony_ci .rdma_intf = REG_FIELD_ID(0xC000, 12, 15, 5, 0x1000), 1978c2ecf20Sopenharmony_ci .rdma_fifowm = REG_FIELD_ID(0xC000, 1, 5, 5, 0x1000), 1988c2ecf20Sopenharmony_ci .rdma_enable = REG_FIELD_ID(0xC000, 0, 0, 5, 0x1000), 1998c2ecf20Sopenharmony_ci 2008c2ecf20Sopenharmony_ci .wrdma_dyncclk = REG_FIELD_ID(0x18000, 22, 22, 4, 0x1000), 2018c2ecf20Sopenharmony_ci .wrdma_bursten = REG_FIELD_ID(0x18000, 21, 21, 4, 0x1000), 2028c2ecf20Sopenharmony_ci .wrdma_wpscnt = REG_FIELD_ID(0x18000, 17, 20, 4, 0x1000), 2038c2ecf20Sopenharmony_ci .wrdma_intf = REG_FIELD_ID(0x18000, 12, 16, 4, 0x1000), 2048c2ecf20Sopenharmony_ci .wrdma_fifowm = REG_FIELD_ID(0x18000, 1, 5, 4, 0x1000), 2058c2ecf20Sopenharmony_ci .wrdma_enable = REG_FIELD_ID(0x18000, 0, 0, 4, 0x1000), 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci .hdmi_tx_ctl_addr = 0x1000, 2088c2ecf20Sopenharmony_ci .hdmi_legacy_addr = 0x1008, 2098c2ecf20Sopenharmony_ci .hdmi_vbit_addr = 0x610c0, 2108c2ecf20Sopenharmony_ci .hdmi_ch_lsb_addr = 0x61048, 2118c2ecf20Sopenharmony_ci .hdmi_ch_msb_addr = 0x6104c, 2128c2ecf20Sopenharmony_ci .ch_stride = 0x8, 2138c2ecf20Sopenharmony_ci .hdmi_parity_addr = 0x61034, 2148c2ecf20Sopenharmony_ci .hdmi_dmactl_addr = 0x61038, 2158c2ecf20Sopenharmony_ci .hdmi_dma_stride = 0x4, 2168c2ecf20Sopenharmony_ci .hdmi_DP_addr = 0x610c8, 2178c2ecf20Sopenharmony_ci .hdmi_sstream_addr = 0x6101c, 2188c2ecf20Sopenharmony_ci .hdmi_irq_reg_base = 0x63000, 2198c2ecf20Sopenharmony_ci .hdmi_irq_ports = 1, 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_ci .hdmi_rdma_dyncclk = REG_FIELD_ID(0x64000, 14, 14, 4, 0x1000), 2228c2ecf20Sopenharmony_ci .hdmi_rdma_bursten = REG_FIELD_ID(0x64000, 13, 13, 4, 0x1000), 2238c2ecf20Sopenharmony_ci .hdmi_rdma_burst8 = REG_FIELD_ID(0x64000, 15, 15, 4, 0x1000), 2248c2ecf20Sopenharmony_ci .hdmi_rdma_burst16 = REG_FIELD_ID(0x64000, 16, 16, 4, 0x1000), 2258c2ecf20Sopenharmony_ci .hdmi_rdma_dynburst = REG_FIELD_ID(0x64000, 18, 18, 4, 0x1000), 2268c2ecf20Sopenharmony_ci .hdmi_rdma_wpscnt = REG_FIELD_ID(0x64000, 10, 12, 4, 0x1000), 2278c2ecf20Sopenharmony_ci .hdmi_rdma_fifowm = REG_FIELD_ID(0x64000, 1, 5, 4, 0x1000), 2288c2ecf20Sopenharmony_ci .hdmi_rdma_enable = REG_FIELD_ID(0x64000, 0, 0, 4, 0x1000), 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_ci .sstream_en = REG_FIELD(0x6101c, 0, 0), 2318c2ecf20Sopenharmony_ci .dma_sel = REG_FIELD(0x6101c, 1, 2), 2328c2ecf20Sopenharmony_ci .auto_bbit_en = REG_FIELD(0x6101c, 3, 3), 2338c2ecf20Sopenharmony_ci .layout = REG_FIELD(0x6101c, 4, 4), 2348c2ecf20Sopenharmony_ci .layout_sp = REG_FIELD(0x6101c, 5, 8), 2358c2ecf20Sopenharmony_ci .set_sp_on_en = REG_FIELD(0x6101c, 10, 10), 2368c2ecf20Sopenharmony_ci .dp_audio = REG_FIELD(0x6101c, 11, 11), 2378c2ecf20Sopenharmony_ci .dp_staffing_en = REG_FIELD(0x6101c, 12, 12), 2388c2ecf20Sopenharmony_ci .dp_sp_b_hw_en = REG_FIELD(0x6101c, 13, 13), 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci .mute = REG_FIELD(0x610c8, 0, 0), 2418c2ecf20Sopenharmony_ci .as_sdp_cc = REG_FIELD(0x610c8, 1, 3), 2428c2ecf20Sopenharmony_ci .as_sdp_ct = REG_FIELD(0x610c8, 4, 7), 2438c2ecf20Sopenharmony_ci .aif_db4 = REG_FIELD(0x610c8, 8, 15), 2448c2ecf20Sopenharmony_ci .frequency = REG_FIELD(0x610c8, 16, 21), 2458c2ecf20Sopenharmony_ci .mst_index = REG_FIELD(0x610c8, 28, 29), 2468c2ecf20Sopenharmony_ci .dptx_index = REG_FIELD(0x610c8, 30, 31), 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_ci .soft_reset = REG_FIELD(0x1000, 31, 31), 2498c2ecf20Sopenharmony_ci .force_reset = REG_FIELD(0x1000, 30, 30), 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci .use_hw_chs = REG_FIELD(0x61038, 0, 0), 2528c2ecf20Sopenharmony_ci .use_hw_usr = REG_FIELD(0x61038, 1, 1), 2538c2ecf20Sopenharmony_ci .hw_chs_sel = REG_FIELD(0x61038, 2, 4), 2548c2ecf20Sopenharmony_ci .hw_usr_sel = REG_FIELD(0x61038, 5, 6), 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci .replace_vbit = REG_FIELD(0x610c0, 0, 0), 2578c2ecf20Sopenharmony_ci .vbit_stream = REG_FIELD(0x610c0, 1, 1), 2588c2ecf20Sopenharmony_ci 2598c2ecf20Sopenharmony_ci .legacy_en = REG_FIELD(0x1008, 0, 0), 2608c2ecf20Sopenharmony_ci .calc_en = REG_FIELD(0x61034, 0, 0), 2618c2ecf20Sopenharmony_ci .lsb_bits = REG_FIELD(0x61048, 0, 31), 2628c2ecf20Sopenharmony_ci .msb_bits = REG_FIELD(0x6104c, 0, 31), 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_ci .clk_name = (const char*[]) { 2668c2ecf20Sopenharmony_ci "pcnoc-sway-clk", 2678c2ecf20Sopenharmony_ci "audio-core", 2688c2ecf20Sopenharmony_ci "pcnoc-mport-clk", 2698c2ecf20Sopenharmony_ci }, 2708c2ecf20Sopenharmony_ci .num_clks = 3, 2718c2ecf20Sopenharmony_ci .dai_driver = sc7180_lpass_cpu_dai_driver, 2728c2ecf20Sopenharmony_ci .num_dai = ARRAY_SIZE(sc7180_lpass_cpu_dai_driver), 2738c2ecf20Sopenharmony_ci .dai_osr_clk_names = (const char *[]) { 2748c2ecf20Sopenharmony_ci "mclk0", 2758c2ecf20Sopenharmony_ci "null", 2768c2ecf20Sopenharmony_ci }, 2778c2ecf20Sopenharmony_ci .dai_bit_clk_names = (const char *[]) { 2788c2ecf20Sopenharmony_ci "mi2s-bit-clk0", 2798c2ecf20Sopenharmony_ci "mi2s-bit-clk1", 2808c2ecf20Sopenharmony_ci }, 2818c2ecf20Sopenharmony_ci .init = sc7180_lpass_init, 2828c2ecf20Sopenharmony_ci .exit = sc7180_lpass_exit, 2838c2ecf20Sopenharmony_ci .alloc_dma_channel = sc7180_lpass_alloc_dma_channel, 2848c2ecf20Sopenharmony_ci .free_dma_channel = sc7180_lpass_free_dma_channel, 2858c2ecf20Sopenharmony_ci}; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_cistatic const struct of_device_id sc7180_lpass_cpu_device_id[] = { 2888c2ecf20Sopenharmony_ci {.compatible = "qcom,sc7180-lpass-cpu", .data = &sc7180_data}, 2898c2ecf20Sopenharmony_ci {} 2908c2ecf20Sopenharmony_ci}; 2918c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, sc7180_lpass_cpu_device_id); 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_cistatic struct platform_driver sc7180_lpass_cpu_platform_driver = { 2948c2ecf20Sopenharmony_ci .driver = { 2958c2ecf20Sopenharmony_ci .name = "sc7180-lpass-cpu", 2968c2ecf20Sopenharmony_ci .of_match_table = of_match_ptr(sc7180_lpass_cpu_device_id), 2978c2ecf20Sopenharmony_ci }, 2988c2ecf20Sopenharmony_ci .probe = asoc_qcom_lpass_cpu_platform_probe, 2998c2ecf20Sopenharmony_ci .remove = asoc_qcom_lpass_cpu_platform_remove, 3008c2ecf20Sopenharmony_ci}; 3018c2ecf20Sopenharmony_ci 3028c2ecf20Sopenharmony_cimodule_platform_driver(sc7180_lpass_cpu_platform_driver); 3038c2ecf20Sopenharmony_ci 3048c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("SC7180 LPASS CPU DRIVER"); 3058c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 306