18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci// 38c2ecf20Sopenharmony_ci// Socionext UniPhier AIO ALSA driver for LD11/LD20. 48c2ecf20Sopenharmony_ci// 58c2ecf20Sopenharmony_ci// Copyright (c) 2016-2018 Socionext Inc. 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/module.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include "aio.h" 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistatic const struct uniphier_aio_spec uniphier_aio_ld11[] = { 128c2ecf20Sopenharmony_ci /* for HDMI PCM In, Pin:AI1Dx */ 138c2ecf20Sopenharmony_ci { 148c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMIN1, 158c2ecf20Sopenharmony_ci .gname = AUD_GNAME_HDMI, 168c2ecf20Sopenharmony_ci .swm = { 178c2ecf20Sopenharmony_ci .type = PORT_TYPE_I2S, 188c2ecf20Sopenharmony_ci .dir = PORT_DIR_INPUT, 198c2ecf20Sopenharmony_ci .rb = { 21, 14, }, 208c2ecf20Sopenharmony_ci .ch = { 21, 14, }, 218c2ecf20Sopenharmony_ci .iif = { 5, 3, }, 228c2ecf20Sopenharmony_ci .iport = { 0, AUD_HW_PCMIN1, }, 238c2ecf20Sopenharmony_ci }, 248c2ecf20Sopenharmony_ci }, 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci /* for SIF In, Pin:AI2Dx */ 278c2ecf20Sopenharmony_ci { 288c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMIN2, 298c2ecf20Sopenharmony_ci .swm = { 308c2ecf20Sopenharmony_ci .type = PORT_TYPE_I2S, 318c2ecf20Sopenharmony_ci .dir = PORT_DIR_INPUT, 328c2ecf20Sopenharmony_ci .rb = { 22, 15, }, 338c2ecf20Sopenharmony_ci .ch = { 22, 15, }, 348c2ecf20Sopenharmony_ci .iif = { 6, 4, }, 358c2ecf20Sopenharmony_ci .iport = { 1, AUD_HW_PCMIN2, }, 368c2ecf20Sopenharmony_ci }, 378c2ecf20Sopenharmony_ci }, 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci /* for Line In, Pin:AI3Dx */ 408c2ecf20Sopenharmony_ci { 418c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMIN3, 428c2ecf20Sopenharmony_ci .gname = AUD_GNAME_LINE, 438c2ecf20Sopenharmony_ci .swm = { 448c2ecf20Sopenharmony_ci .type = PORT_TYPE_EVE, 458c2ecf20Sopenharmony_ci .dir = PORT_DIR_INPUT, 468c2ecf20Sopenharmony_ci .rb = { 23, 16, }, 478c2ecf20Sopenharmony_ci .ch = { 23, 16, }, 488c2ecf20Sopenharmony_ci .iif = { 7, 5, }, 498c2ecf20Sopenharmony_ci .iport = { 2, AUD_HW_PCMIN3, }, 508c2ecf20Sopenharmony_ci }, 518c2ecf20Sopenharmony_ci }, 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci /* for S/PDIF In, Pin:AI1IEC */ 548c2ecf20Sopenharmony_ci { 558c2ecf20Sopenharmony_ci .name = AUD_NAME_IECIN1, 568c2ecf20Sopenharmony_ci .gname = AUD_GNAME_IEC, 578c2ecf20Sopenharmony_ci .swm = { 588c2ecf20Sopenharmony_ci .type = PORT_TYPE_SPDIF, 598c2ecf20Sopenharmony_ci .dir = PORT_DIR_INPUT, 608c2ecf20Sopenharmony_ci .rb = { 26, 17, }, 618c2ecf20Sopenharmony_ci .ch = { 26, 17, }, 628c2ecf20Sopenharmony_ci .iif = { 10, 6, }, 638c2ecf20Sopenharmony_ci .iport = { 3, AUD_HW_IECIN1, }, 648c2ecf20Sopenharmony_ci }, 658c2ecf20Sopenharmony_ci }, 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_ci /* for Speaker, Pin:AO1Dx */ 688c2ecf20Sopenharmony_ci { 698c2ecf20Sopenharmony_ci .name = AUD_NAME_HPCMOUT1, 708c2ecf20Sopenharmony_ci .swm = { 718c2ecf20Sopenharmony_ci .type = PORT_TYPE_I2S, 728c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 738c2ecf20Sopenharmony_ci .rb = { 0, 0, }, 748c2ecf20Sopenharmony_ci .ch = { 0, 0, }, 758c2ecf20Sopenharmony_ci .oif = { 0, 0, }, 768c2ecf20Sopenharmony_ci .oport = { 0, AUD_HW_HPCMOUT1, }, 778c2ecf20Sopenharmony_ci }, 788c2ecf20Sopenharmony_ci }, 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci /* for HDMI PCM, Pin:AO2Dx */ 818c2ecf20Sopenharmony_ci { 828c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMOUT1, 838c2ecf20Sopenharmony_ci .gname = AUD_GNAME_HDMI, 848c2ecf20Sopenharmony_ci .swm = { 858c2ecf20Sopenharmony_ci .type = PORT_TYPE_I2S, 868c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 878c2ecf20Sopenharmony_ci .rb = { 0, 0, }, 888c2ecf20Sopenharmony_ci .ch = { 0, 0, }, 898c2ecf20Sopenharmony_ci .oif = { 0, 0, }, 908c2ecf20Sopenharmony_ci .oport = { 3, AUD_HW_PCMOUT1, }, 918c2ecf20Sopenharmony_ci }, 928c2ecf20Sopenharmony_ci }, 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci /* for Line Out, Pin:LO2_x */ 958c2ecf20Sopenharmony_ci { 968c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMOUT2, 978c2ecf20Sopenharmony_ci .gname = AUD_GNAME_LINE, 988c2ecf20Sopenharmony_ci .swm = { 998c2ecf20Sopenharmony_ci .type = PORT_TYPE_EVE, 1008c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1018c2ecf20Sopenharmony_ci .rb = { 2, 2, }, 1028c2ecf20Sopenharmony_ci .ch = { 2, 2, }, 1038c2ecf20Sopenharmony_ci .oif = { 2, 2, }, 1048c2ecf20Sopenharmony_ci .oport = { 1, AUD_HW_PCMOUT2, }, 1058c2ecf20Sopenharmony_ci }, 1068c2ecf20Sopenharmony_ci }, 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci /* for Headphone, Pin:HP1_x */ 1098c2ecf20Sopenharmony_ci { 1108c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMOUT3, 1118c2ecf20Sopenharmony_ci .swm = { 1128c2ecf20Sopenharmony_ci .type = PORT_TYPE_EVE, 1138c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1148c2ecf20Sopenharmony_ci .rb = { 3, 3, }, 1158c2ecf20Sopenharmony_ci .ch = { 3, 3, }, 1168c2ecf20Sopenharmony_ci .oif = { 3, 3, }, 1178c2ecf20Sopenharmony_ci .oport = { 2, AUD_HW_PCMOUT3, }, 1188c2ecf20Sopenharmony_ci }, 1198c2ecf20Sopenharmony_ci }, 1208c2ecf20Sopenharmony_ci 1218c2ecf20Sopenharmony_ci /* for HW Sampling Rate Converter */ 1228c2ecf20Sopenharmony_ci { 1238c2ecf20Sopenharmony_ci .name = AUD_NAME_EPCMOUT2, 1248c2ecf20Sopenharmony_ci .swm = { 1258c2ecf20Sopenharmony_ci .type = PORT_TYPE_CONV, 1268c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1278c2ecf20Sopenharmony_ci .rb = { 7, 5, }, 1288c2ecf20Sopenharmony_ci .ch = { 7, 5, }, 1298c2ecf20Sopenharmony_ci .oif = { 7, 5, }, 1308c2ecf20Sopenharmony_ci .oport = { 6, AUD_HW_EPCMOUT2, }, 1318c2ecf20Sopenharmony_ci .och = { 17, 12, }, 1328c2ecf20Sopenharmony_ci .iif = { 1, 1, }, 1338c2ecf20Sopenharmony_ci }, 1348c2ecf20Sopenharmony_ci }, 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_ci /* for HW Sampling Rate Converter 2 */ 1378c2ecf20Sopenharmony_ci { 1388c2ecf20Sopenharmony_ci .name = AUD_NAME_EPCMOUT3, 1398c2ecf20Sopenharmony_ci .swm = { 1408c2ecf20Sopenharmony_ci .type = PORT_TYPE_CONV, 1418c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1428c2ecf20Sopenharmony_ci .rb = { 8, 6, }, 1438c2ecf20Sopenharmony_ci .ch = { 8, 6, }, 1448c2ecf20Sopenharmony_ci .oif = { 8, 6, }, 1458c2ecf20Sopenharmony_ci .oport = { 7, AUD_HW_EPCMOUT3, }, 1468c2ecf20Sopenharmony_ci .och = { 18, 13, }, 1478c2ecf20Sopenharmony_ci .iif = { 2, 2, }, 1488c2ecf20Sopenharmony_ci }, 1498c2ecf20Sopenharmony_ci }, 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci /* for S/PDIF Out, Pin:AO1IEC */ 1528c2ecf20Sopenharmony_ci { 1538c2ecf20Sopenharmony_ci .name = AUD_NAME_HIECOUT1, 1548c2ecf20Sopenharmony_ci .gname = AUD_GNAME_IEC, 1558c2ecf20Sopenharmony_ci .swm = { 1568c2ecf20Sopenharmony_ci .type = PORT_TYPE_SPDIF, 1578c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1588c2ecf20Sopenharmony_ci .rb = { 1, 1, }, 1598c2ecf20Sopenharmony_ci .ch = { 1, 1, }, 1608c2ecf20Sopenharmony_ci .oif = { 1, 1, }, 1618c2ecf20Sopenharmony_ci .oport = { 12, AUD_HW_HIECOUT1, }, 1628c2ecf20Sopenharmony_ci }, 1638c2ecf20Sopenharmony_ci }, 1648c2ecf20Sopenharmony_ci 1658c2ecf20Sopenharmony_ci /* for S/PDIF Out, Pin:AO1IEC, Compress */ 1668c2ecf20Sopenharmony_ci { 1678c2ecf20Sopenharmony_ci .name = AUD_NAME_HIECCOMPOUT1, 1688c2ecf20Sopenharmony_ci .gname = AUD_GNAME_IEC, 1698c2ecf20Sopenharmony_ci .swm = { 1708c2ecf20Sopenharmony_ci .type = PORT_TYPE_SPDIF, 1718c2ecf20Sopenharmony_ci .dir = PORT_DIR_OUTPUT, 1728c2ecf20Sopenharmony_ci .rb = { 1, 1, }, 1738c2ecf20Sopenharmony_ci .ch = { 1, 1, }, 1748c2ecf20Sopenharmony_ci .oif = { 1, 1, }, 1758c2ecf20Sopenharmony_ci .oport = { 12, AUD_HW_HIECOUT1, }, 1768c2ecf20Sopenharmony_ci }, 1778c2ecf20Sopenharmony_ci }, 1788c2ecf20Sopenharmony_ci}; 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_cistatic const struct uniphier_aio_pll uniphier_aio_pll_ld11[] = { 1818c2ecf20Sopenharmony_ci [AUD_PLL_A1] = { .enable = true, }, 1828c2ecf20Sopenharmony_ci [AUD_PLL_F1] = { .enable = true, }, 1838c2ecf20Sopenharmony_ci [AUD_PLL_A2] = { .enable = true, }, 1848c2ecf20Sopenharmony_ci [AUD_PLL_F2] = { .enable = true, }, 1858c2ecf20Sopenharmony_ci [AUD_PLL_APLL] = { .enable = true, }, 1868c2ecf20Sopenharmony_ci [AUD_PLL_RX0] = { .enable = true, }, 1878c2ecf20Sopenharmony_ci [AUD_PLL_USB0] = { .enable = true, }, 1888c2ecf20Sopenharmony_ci [AUD_PLL_HSC0] = { .enable = true, }, 1898c2ecf20Sopenharmony_ci}; 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_cistatic int uniphier_aio_ld11_probe(struct snd_soc_dai *dai) 1928c2ecf20Sopenharmony_ci{ 1938c2ecf20Sopenharmony_ci int ret; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci ret = uniphier_aio_dai_probe(dai); 1968c2ecf20Sopenharmony_ci if (ret < 0) 1978c2ecf20Sopenharmony_ci return ret; 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_pll(dai, AUD_PLL_A1, 0, 0, 36864000); 2008c2ecf20Sopenharmony_ci if (ret < 0) 2018c2ecf20Sopenharmony_ci return ret; 2028c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_pll(dai, AUD_PLL_F1, 0, 0, 36864000); 2038c2ecf20Sopenharmony_ci if (ret < 0) 2048c2ecf20Sopenharmony_ci return ret; 2058c2ecf20Sopenharmony_ci 2068c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_pll(dai, AUD_PLL_A2, 0, 0, 33868800); 2078c2ecf20Sopenharmony_ci if (ret < 0) 2088c2ecf20Sopenharmony_ci return ret; 2098c2ecf20Sopenharmony_ci ret = snd_soc_dai_set_pll(dai, AUD_PLL_F2, 0, 0, 33868800); 2108c2ecf20Sopenharmony_ci if (ret < 0) 2118c2ecf20Sopenharmony_ci return ret; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci return 0; 2148c2ecf20Sopenharmony_ci} 2158c2ecf20Sopenharmony_ci 2168c2ecf20Sopenharmony_cistatic struct snd_soc_dai_driver uniphier_aio_dai_ld11[] = { 2178c2ecf20Sopenharmony_ci { 2188c2ecf20Sopenharmony_ci .name = AUD_GNAME_HDMI, 2198c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 2208c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 2218c2ecf20Sopenharmony_ci .playback = { 2228c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMOUT1, 2238c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2248c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2258c2ecf20Sopenharmony_ci .channels_min = 2, 2268c2ecf20Sopenharmony_ci .channels_max = 2, 2278c2ecf20Sopenharmony_ci }, 2288c2ecf20Sopenharmony_ci .capture = { 2298c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMIN1, 2308c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2318c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000 | 2328c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_44100 | 2338c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_32000, 2348c2ecf20Sopenharmony_ci .channels_min = 2, 2358c2ecf20Sopenharmony_ci .channels_max = 2, 2368c2ecf20Sopenharmony_ci }, 2378c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 2388c2ecf20Sopenharmony_ci }, 2398c2ecf20Sopenharmony_ci { 2408c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMIN2, 2418c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 2428c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 2438c2ecf20Sopenharmony_ci .capture = { 2448c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMIN2, 2458c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2468c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2478c2ecf20Sopenharmony_ci .channels_min = 2, 2488c2ecf20Sopenharmony_ci .channels_max = 2, 2498c2ecf20Sopenharmony_ci }, 2508c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 2518c2ecf20Sopenharmony_ci }, 2528c2ecf20Sopenharmony_ci { 2538c2ecf20Sopenharmony_ci .name = AUD_GNAME_LINE, 2548c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 2558c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 2568c2ecf20Sopenharmony_ci .playback = { 2578c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMOUT2, 2588c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2598c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2608c2ecf20Sopenharmony_ci .channels_min = 2, 2618c2ecf20Sopenharmony_ci .channels_max = 2, 2628c2ecf20Sopenharmony_ci }, 2638c2ecf20Sopenharmony_ci .capture = { 2648c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMIN3, 2658c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2668c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2678c2ecf20Sopenharmony_ci .channels_min = 2, 2688c2ecf20Sopenharmony_ci .channels_max = 2, 2698c2ecf20Sopenharmony_ci }, 2708c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 2718c2ecf20Sopenharmony_ci }, 2728c2ecf20Sopenharmony_ci { 2738c2ecf20Sopenharmony_ci .name = AUD_NAME_HPCMOUT1, 2748c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 2758c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 2768c2ecf20Sopenharmony_ci .playback = { 2778c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_HPCMOUT1, 2788c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2798c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2808c2ecf20Sopenharmony_ci .channels_min = 2, 2818c2ecf20Sopenharmony_ci .channels_max = 8, 2828c2ecf20Sopenharmony_ci }, 2838c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 2848c2ecf20Sopenharmony_ci }, 2858c2ecf20Sopenharmony_ci { 2868c2ecf20Sopenharmony_ci .name = AUD_NAME_PCMOUT3, 2878c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 2888c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 2898c2ecf20Sopenharmony_ci .playback = { 2908c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_PCMOUT3, 2918c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 2928c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 2938c2ecf20Sopenharmony_ci .channels_min = 2, 2948c2ecf20Sopenharmony_ci .channels_max = 2, 2958c2ecf20Sopenharmony_ci }, 2968c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 2978c2ecf20Sopenharmony_ci }, 2988c2ecf20Sopenharmony_ci { 2998c2ecf20Sopenharmony_ci .name = AUD_NAME_HIECOUT1, 3008c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 3018c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 3028c2ecf20Sopenharmony_ci .playback = { 3038c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_HIECOUT1, 3048c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 3058c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000, 3068c2ecf20Sopenharmony_ci .channels_min = 2, 3078c2ecf20Sopenharmony_ci .channels_max = 2, 3088c2ecf20Sopenharmony_ci }, 3098c2ecf20Sopenharmony_ci .ops = &uniphier_aio_spdif_ops, 3108c2ecf20Sopenharmony_ci }, 3118c2ecf20Sopenharmony_ci { 3128c2ecf20Sopenharmony_ci .name = AUD_NAME_EPCMOUT2, 3138c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 3148c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 3158c2ecf20Sopenharmony_ci .playback = { 3168c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_EPCMOUT2, 3178c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 3188c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000 | 3198c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_44100 | 3208c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_32000, 3218c2ecf20Sopenharmony_ci .channels_min = 2, 3228c2ecf20Sopenharmony_ci .channels_max = 2, 3238c2ecf20Sopenharmony_ci }, 3248c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 3258c2ecf20Sopenharmony_ci }, 3268c2ecf20Sopenharmony_ci { 3278c2ecf20Sopenharmony_ci .name = AUD_NAME_EPCMOUT3, 3288c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 3298c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 3308c2ecf20Sopenharmony_ci .playback = { 3318c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_EPCMOUT3, 3328c2ecf20Sopenharmony_ci .formats = SNDRV_PCM_FMTBIT_S32_LE, 3338c2ecf20Sopenharmony_ci .rates = SNDRV_PCM_RATE_48000 | 3348c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_44100 | 3358c2ecf20Sopenharmony_ci SNDRV_PCM_RATE_32000, 3368c2ecf20Sopenharmony_ci .channels_min = 2, 3378c2ecf20Sopenharmony_ci .channels_max = 2, 3388c2ecf20Sopenharmony_ci }, 3398c2ecf20Sopenharmony_ci .ops = &uniphier_aio_i2s_ops, 3408c2ecf20Sopenharmony_ci }, 3418c2ecf20Sopenharmony_ci { 3428c2ecf20Sopenharmony_ci .name = AUD_NAME_HIECCOMPOUT1, 3438c2ecf20Sopenharmony_ci .probe = uniphier_aio_ld11_probe, 3448c2ecf20Sopenharmony_ci .remove = uniphier_aio_dai_remove, 3458c2ecf20Sopenharmony_ci .compress_new = snd_soc_new_compress, 3468c2ecf20Sopenharmony_ci .playback = { 3478c2ecf20Sopenharmony_ci .stream_name = AUD_NAME_HIECCOMPOUT1, 3488c2ecf20Sopenharmony_ci .channels_min = 1, 3498c2ecf20Sopenharmony_ci .channels_max = 1, 3508c2ecf20Sopenharmony_ci }, 3518c2ecf20Sopenharmony_ci .ops = &uniphier_aio_spdif_ops, 3528c2ecf20Sopenharmony_ci }, 3538c2ecf20Sopenharmony_ci}; 3548c2ecf20Sopenharmony_ci 3558c2ecf20Sopenharmony_cistatic const struct uniphier_aio_chip_spec uniphier_aio_ld11_spec = { 3568c2ecf20Sopenharmony_ci .specs = uniphier_aio_ld11, 3578c2ecf20Sopenharmony_ci .num_specs = ARRAY_SIZE(uniphier_aio_ld11), 3588c2ecf20Sopenharmony_ci .dais = uniphier_aio_dai_ld11, 3598c2ecf20Sopenharmony_ci .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), 3608c2ecf20Sopenharmony_ci .plls = uniphier_aio_pll_ld11, 3618c2ecf20Sopenharmony_ci .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), 3628c2ecf20Sopenharmony_ci .addr_ext = 0, 3638c2ecf20Sopenharmony_ci}; 3648c2ecf20Sopenharmony_ci 3658c2ecf20Sopenharmony_cistatic const struct uniphier_aio_chip_spec uniphier_aio_ld20_spec = { 3668c2ecf20Sopenharmony_ci .specs = uniphier_aio_ld11, 3678c2ecf20Sopenharmony_ci .num_specs = ARRAY_SIZE(uniphier_aio_ld11), 3688c2ecf20Sopenharmony_ci .dais = uniphier_aio_dai_ld11, 3698c2ecf20Sopenharmony_ci .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), 3708c2ecf20Sopenharmony_ci .plls = uniphier_aio_pll_ld11, 3718c2ecf20Sopenharmony_ci .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), 3728c2ecf20Sopenharmony_ci .addr_ext = 1, 3738c2ecf20Sopenharmony_ci}; 3748c2ecf20Sopenharmony_ci 3758c2ecf20Sopenharmony_cistatic const struct of_device_id uniphier_aio_of_match[] = { 3768c2ecf20Sopenharmony_ci { 3778c2ecf20Sopenharmony_ci .compatible = "socionext,uniphier-ld11-aio", 3788c2ecf20Sopenharmony_ci .data = &uniphier_aio_ld11_spec, 3798c2ecf20Sopenharmony_ci }, 3808c2ecf20Sopenharmony_ci { 3818c2ecf20Sopenharmony_ci .compatible = "socionext,uniphier-ld20-aio", 3828c2ecf20Sopenharmony_ci .data = &uniphier_aio_ld20_spec, 3838c2ecf20Sopenharmony_ci }, 3848c2ecf20Sopenharmony_ci {}, 3858c2ecf20Sopenharmony_ci}; 3868c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(of, uniphier_aio_of_match); 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistatic struct platform_driver uniphier_aio_driver = { 3898c2ecf20Sopenharmony_ci .driver = { 3908c2ecf20Sopenharmony_ci .name = "snd-uniphier-aio-ld11", 3918c2ecf20Sopenharmony_ci .of_match_table = of_match_ptr(uniphier_aio_of_match), 3928c2ecf20Sopenharmony_ci }, 3938c2ecf20Sopenharmony_ci .probe = uniphier_aio_probe, 3948c2ecf20Sopenharmony_ci .remove = uniphier_aio_remove, 3958c2ecf20Sopenharmony_ci}; 3968c2ecf20Sopenharmony_cimodule_platform_driver(uniphier_aio_driver); 3978c2ecf20Sopenharmony_ci 3988c2ecf20Sopenharmony_ciMODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); 3998c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("UniPhier LD11/LD20 AIO driver."); 4008c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL v2"); 401