18413b9e0SKatsuhiro Suzuki // SPDX-License-Identifier: GPL-2.0 28413b9e0SKatsuhiro Suzuki // 38413b9e0SKatsuhiro Suzuki // Socionext UniPhier AIO ALSA driver for PXs2. 48413b9e0SKatsuhiro Suzuki // 58413b9e0SKatsuhiro Suzuki // Copyright (c) 2018 Socionext Inc. 68413b9e0SKatsuhiro Suzuki 78413b9e0SKatsuhiro Suzuki #include <linux/module.h> 88413b9e0SKatsuhiro Suzuki 98413b9e0SKatsuhiro Suzuki #include "aio.h" 108413b9e0SKatsuhiro Suzuki 118413b9e0SKatsuhiro Suzuki static const struct uniphier_aio_spec uniphier_aio_pxs2[] = { 128413b9e0SKatsuhiro Suzuki /* for Line PCM In, Pin:AI1Dx */ 138413b9e0SKatsuhiro Suzuki { 148413b9e0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN1, 158413b9e0SKatsuhiro Suzuki .gname = AUD_GNAME_LINE, 168413b9e0SKatsuhiro Suzuki .swm = { 178413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 188413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 198413b9e0SKatsuhiro Suzuki .rb = { 16, 11, }, 208413b9e0SKatsuhiro Suzuki .ch = { 16, 11, }, 218413b9e0SKatsuhiro Suzuki .iif = { 0, 0, }, 228413b9e0SKatsuhiro Suzuki .iport = { 0, AUD_HW_PCMIN1, }, 238413b9e0SKatsuhiro Suzuki }, 248413b9e0SKatsuhiro Suzuki }, 258413b9e0SKatsuhiro Suzuki 268413b9e0SKatsuhiro Suzuki /* for Speaker/Headphone/Mic PCM In, Pin:AI2Dx */ 278413b9e0SKatsuhiro Suzuki { 288413b9e0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN2, 298413b9e0SKatsuhiro Suzuki .gname = AUD_GNAME_AUX, 308413b9e0SKatsuhiro Suzuki .swm = { 318413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 328413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 338413b9e0SKatsuhiro Suzuki .rb = { 17, 12, }, 348413b9e0SKatsuhiro Suzuki .ch = { 17, 12, }, 358413b9e0SKatsuhiro Suzuki .iif = { 1, 1, }, 368413b9e0SKatsuhiro Suzuki .iport = { 1, AUD_HW_PCMIN2, }, 378413b9e0SKatsuhiro Suzuki }, 388413b9e0SKatsuhiro Suzuki }, 398413b9e0SKatsuhiro Suzuki 408413b9e0SKatsuhiro Suzuki /* for HDMI PCM Out, Pin:AO1Dx (inner) */ 418413b9e0SKatsuhiro Suzuki { 428413b9e0SKatsuhiro Suzuki .name = AUD_NAME_HPCMOUT1, 438413b9e0SKatsuhiro Suzuki .gname = AUD_GNAME_HDMI, 448413b9e0SKatsuhiro Suzuki .swm = { 458413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 468413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 478413b9e0SKatsuhiro Suzuki .rb = { 0, 0, }, 488413b9e0SKatsuhiro Suzuki .ch = { 0, 0, }, 498413b9e0SKatsuhiro Suzuki .oif = { 0, 0, }, 508413b9e0SKatsuhiro Suzuki .oport = { 3, AUD_HW_HPCMOUT1, }, 518413b9e0SKatsuhiro Suzuki }, 528413b9e0SKatsuhiro Suzuki }, 538413b9e0SKatsuhiro Suzuki 548413b9e0SKatsuhiro Suzuki /* for Line PCM Out, Pin:AO2Dx */ 558413b9e0SKatsuhiro Suzuki { 568413b9e0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT1, 578413b9e0SKatsuhiro Suzuki .gname = AUD_GNAME_LINE, 588413b9e0SKatsuhiro Suzuki .swm = { 598413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 608413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 618413b9e0SKatsuhiro Suzuki .rb = { 1, 1, }, 628413b9e0SKatsuhiro Suzuki .ch = { 1, 1, }, 638413b9e0SKatsuhiro Suzuki .oif = { 1, 1, }, 648413b9e0SKatsuhiro Suzuki .oport = { 0, AUD_HW_PCMOUT1, }, 658413b9e0SKatsuhiro Suzuki }, 668413b9e0SKatsuhiro Suzuki }, 678413b9e0SKatsuhiro Suzuki 688413b9e0SKatsuhiro Suzuki /* for Speaker/Headphone/Mic PCM Out, Pin:AO3Dx */ 698413b9e0SKatsuhiro Suzuki { 708413b9e0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT2, 718413b9e0SKatsuhiro Suzuki .gname = AUD_GNAME_AUX, 728413b9e0SKatsuhiro Suzuki .swm = { 738413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 748413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 758413b9e0SKatsuhiro Suzuki .rb = { 2, 2, }, 768413b9e0SKatsuhiro Suzuki .ch = { 2, 2, }, 778413b9e0SKatsuhiro Suzuki .oif = { 2, 2, }, 788413b9e0SKatsuhiro Suzuki .oport = { 1, AUD_HW_PCMOUT2, }, 798413b9e0SKatsuhiro Suzuki }, 808413b9e0SKatsuhiro Suzuki }, 818413b9e0SKatsuhiro Suzuki 828413b9e0SKatsuhiro Suzuki /* for HDMI Out, Pin:AO1IEC */ 838413b9e0SKatsuhiro Suzuki { 848413b9e0SKatsuhiro Suzuki .name = AUD_NAME_HIECOUT1, 858413b9e0SKatsuhiro Suzuki .swm = { 868413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 878413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 888413b9e0SKatsuhiro Suzuki .rb = { 6, 4, }, 898413b9e0SKatsuhiro Suzuki .ch = { 6, 4, }, 908413b9e0SKatsuhiro Suzuki .oif = { 6, 4, }, 918413b9e0SKatsuhiro Suzuki .oport = { 12, AUD_HW_HIECOUT1, }, 928413b9e0SKatsuhiro Suzuki }, 938413b9e0SKatsuhiro Suzuki }, 948413b9e0SKatsuhiro Suzuki 958413b9e0SKatsuhiro Suzuki /* for HDMI Out, Pin:AO1IEC, Compress */ 968413b9e0SKatsuhiro Suzuki { 978413b9e0SKatsuhiro Suzuki .name = AUD_NAME_HIECCOMPOUT1, 988413b9e0SKatsuhiro Suzuki .swm = { 998413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 1008413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 1018413b9e0SKatsuhiro Suzuki .rb = { 6, 4, }, 1028413b9e0SKatsuhiro Suzuki .ch = { 6, 4, }, 1038413b9e0SKatsuhiro Suzuki .oif = { 6, 4, }, 1048413b9e0SKatsuhiro Suzuki .oport = { 12, AUD_HW_HIECOUT1, }, 1058413b9e0SKatsuhiro Suzuki }, 1068413b9e0SKatsuhiro Suzuki }, 1078413b9e0SKatsuhiro Suzuki 1088413b9e0SKatsuhiro Suzuki /* for S/PDIF Out, Pin:AO2IEC */ 1098413b9e0SKatsuhiro Suzuki { 1108413b9e0SKatsuhiro Suzuki .name = AUD_NAME_IECOUT1, 1118413b9e0SKatsuhiro Suzuki .swm = { 1128413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 1138413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 1148413b9e0SKatsuhiro Suzuki .rb = { 7, 5, }, 1158413b9e0SKatsuhiro Suzuki .ch = { 7, 5, }, 1168413b9e0SKatsuhiro Suzuki .oif = { 7, 5, }, 1178413b9e0SKatsuhiro Suzuki .oport = { 13, AUD_HW_IECOUT1, }, 1188413b9e0SKatsuhiro Suzuki }, 1198413b9e0SKatsuhiro Suzuki }, 1208413b9e0SKatsuhiro Suzuki 1218413b9e0SKatsuhiro Suzuki /* for S/PDIF Out, Pin:AO2IEC */ 1228413b9e0SKatsuhiro Suzuki { 1238413b9e0SKatsuhiro Suzuki .name = AUD_NAME_IECCOMPOUT1, 1248413b9e0SKatsuhiro Suzuki .swm = { 1258413b9e0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 1268413b9e0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 1278413b9e0SKatsuhiro Suzuki .rb = { 7, 5, }, 1288413b9e0SKatsuhiro Suzuki .ch = { 7, 5, }, 1298413b9e0SKatsuhiro Suzuki .oif = { 7, 5, }, 1308413b9e0SKatsuhiro Suzuki .oport = { 13, AUD_HW_IECOUT1, }, 1318413b9e0SKatsuhiro Suzuki }, 1328413b9e0SKatsuhiro Suzuki }, 1338413b9e0SKatsuhiro Suzuki }; 1348413b9e0SKatsuhiro Suzuki 1358413b9e0SKatsuhiro Suzuki static const struct uniphier_aio_pll uniphier_aio_pll_pxs2[] = { 1368413b9e0SKatsuhiro Suzuki [AUD_PLL_A1] = { .enable = true, }, 1378413b9e0SKatsuhiro Suzuki [AUD_PLL_F1] = { .enable = true, }, 1388413b9e0SKatsuhiro Suzuki [AUD_PLL_A2] = { .enable = true, }, 1398413b9e0SKatsuhiro Suzuki [AUD_PLL_F2] = { .enable = true, }, 1408413b9e0SKatsuhiro Suzuki [AUD_PLL_APLL] = { .enable = true, }, 1418413b9e0SKatsuhiro Suzuki [AUD_PLL_HSC0] = { .enable = true, }, 1428413b9e0SKatsuhiro Suzuki }; 1438413b9e0SKatsuhiro Suzuki 1448413b9e0SKatsuhiro Suzuki static struct snd_soc_dai_driver uniphier_aio_dai_pxs2[] = { 1458413b9e0SKatsuhiro Suzuki { 1468413b9e0SKatsuhiro Suzuki .name = AUD_GNAME_HDMI, 1478413b9e0SKatsuhiro Suzuki .playback = { 1488413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_HPCMOUT1, 1498413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1508413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1518413b9e0SKatsuhiro Suzuki .channels_min = 2, 1528413b9e0SKatsuhiro Suzuki .channels_max = 2, 1538413b9e0SKatsuhiro Suzuki }, 15489621b57SKuninori Morimoto .ops = &uniphier_aio_i2s_pxs2_ops, 1558413b9e0SKatsuhiro Suzuki }, 1568413b9e0SKatsuhiro Suzuki { 1578413b9e0SKatsuhiro Suzuki .name = AUD_GNAME_LINE, 1588413b9e0SKatsuhiro Suzuki .playback = { 1598413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMOUT1, 1608413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1618413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1628413b9e0SKatsuhiro Suzuki .channels_min = 2, 1638413b9e0SKatsuhiro Suzuki .channels_max = 2, 1648413b9e0SKatsuhiro Suzuki }, 1658413b9e0SKatsuhiro Suzuki .capture = { 1668413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMIN1, 1678413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1688413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1698413b9e0SKatsuhiro Suzuki .channels_min = 2, 1708413b9e0SKatsuhiro Suzuki .channels_max = 2, 1718413b9e0SKatsuhiro Suzuki }, 17289621b57SKuninori Morimoto .ops = &uniphier_aio_i2s_pxs2_ops, 1738413b9e0SKatsuhiro Suzuki }, 1748413b9e0SKatsuhiro Suzuki { 1758413b9e0SKatsuhiro Suzuki .name = AUD_GNAME_AUX, 1768413b9e0SKatsuhiro Suzuki .playback = { 1778413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMOUT2, 1788413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1798413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1808413b9e0SKatsuhiro Suzuki .channels_min = 2, 1818413b9e0SKatsuhiro Suzuki .channels_max = 2, 1828413b9e0SKatsuhiro Suzuki }, 1838413b9e0SKatsuhiro Suzuki .capture = { 1848413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMIN2, 1858413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1868413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1878413b9e0SKatsuhiro Suzuki .channels_min = 2, 1888413b9e0SKatsuhiro Suzuki .channels_max = 2, 1898413b9e0SKatsuhiro Suzuki }, 19089621b57SKuninori Morimoto .ops = &uniphier_aio_i2s_pxs2_ops, 1918413b9e0SKatsuhiro Suzuki }, 1928413b9e0SKatsuhiro Suzuki { 1938413b9e0SKatsuhiro Suzuki .name = AUD_NAME_HIECOUT1, 1948413b9e0SKatsuhiro Suzuki .playback = { 1958413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_HIECOUT1, 1968413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 1978413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 1988413b9e0SKatsuhiro Suzuki .channels_min = 2, 1998413b9e0SKatsuhiro Suzuki .channels_max = 2, 2008413b9e0SKatsuhiro Suzuki }, 20189621b57SKuninori Morimoto .ops = &uniphier_aio_spdif_pxs2_ops, 2028413b9e0SKatsuhiro Suzuki }, 2038413b9e0SKatsuhiro Suzuki { 2048413b9e0SKatsuhiro Suzuki .name = AUD_NAME_IECOUT1, 2058413b9e0SKatsuhiro Suzuki .playback = { 2068413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_IECOUT1, 2078413b9e0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 2088413b9e0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 2098413b9e0SKatsuhiro Suzuki .channels_min = 2, 2108413b9e0SKatsuhiro Suzuki .channels_max = 2, 2118413b9e0SKatsuhiro Suzuki }, 21289621b57SKuninori Morimoto .ops = &uniphier_aio_spdif_pxs2_ops, 2138413b9e0SKatsuhiro Suzuki }, 2148413b9e0SKatsuhiro Suzuki { 2158413b9e0SKatsuhiro Suzuki .name = AUD_NAME_HIECCOMPOUT1, 2168413b9e0SKatsuhiro Suzuki .playback = { 2178413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_HIECCOMPOUT1, 2188413b9e0SKatsuhiro Suzuki .channels_min = 1, 2198413b9e0SKatsuhiro Suzuki .channels_max = 1, 2208413b9e0SKatsuhiro Suzuki }, 22189621b57SKuninori Morimoto .ops = &uniphier_aio_spdif_pxs2_ops2, 2228413b9e0SKatsuhiro Suzuki }, 2238413b9e0SKatsuhiro Suzuki { 2248413b9e0SKatsuhiro Suzuki .name = AUD_NAME_IECCOMPOUT1, 2258413b9e0SKatsuhiro Suzuki .playback = { 2268413b9e0SKatsuhiro Suzuki .stream_name = AUD_NAME_IECCOMPOUT1, 2278413b9e0SKatsuhiro Suzuki .channels_min = 1, 2288413b9e0SKatsuhiro Suzuki .channels_max = 1, 2298413b9e0SKatsuhiro Suzuki }, 23089621b57SKuninori Morimoto .ops = &uniphier_aio_spdif_pxs2_ops2, 2318413b9e0SKatsuhiro Suzuki }, 2328413b9e0SKatsuhiro Suzuki }; 2338413b9e0SKatsuhiro Suzuki 2348413b9e0SKatsuhiro Suzuki static const struct uniphier_aio_chip_spec uniphier_aio_pxs2_spec = { 2358413b9e0SKatsuhiro Suzuki .specs = uniphier_aio_pxs2, 2368413b9e0SKatsuhiro Suzuki .num_specs = ARRAY_SIZE(uniphier_aio_pxs2), 2378413b9e0SKatsuhiro Suzuki .dais = uniphier_aio_dai_pxs2, 2388413b9e0SKatsuhiro Suzuki .num_dais = ARRAY_SIZE(uniphier_aio_dai_pxs2), 2398413b9e0SKatsuhiro Suzuki .plls = uniphier_aio_pll_pxs2, 2408413b9e0SKatsuhiro Suzuki .num_plls = ARRAY_SIZE(uniphier_aio_pll_pxs2), 2418413b9e0SKatsuhiro Suzuki .addr_ext = 0, 2428413b9e0SKatsuhiro Suzuki }; 2438413b9e0SKatsuhiro Suzuki 244c0b7cf59SKrzysztof Kozlowski static const struct of_device_id uniphier_aio_of_match[] __maybe_unused = { 2458413b9e0SKatsuhiro Suzuki { 2468413b9e0SKatsuhiro Suzuki .compatible = "socionext,uniphier-pxs2-aio", 2478413b9e0SKatsuhiro Suzuki .data = &uniphier_aio_pxs2_spec, 2488413b9e0SKatsuhiro Suzuki }, 2498413b9e0SKatsuhiro Suzuki {}, 2508413b9e0SKatsuhiro Suzuki }; 2518413b9e0SKatsuhiro Suzuki MODULE_DEVICE_TABLE(of, uniphier_aio_of_match); 2528413b9e0SKatsuhiro Suzuki 2538413b9e0SKatsuhiro Suzuki static struct platform_driver uniphier_aio_driver = { 2548413b9e0SKatsuhiro Suzuki .driver = { 2558413b9e0SKatsuhiro Suzuki .name = "snd-uniphier-aio-pxs2", 2568413b9e0SKatsuhiro Suzuki .of_match_table = of_match_ptr(uniphier_aio_of_match), 2578413b9e0SKatsuhiro Suzuki }, 2588413b9e0SKatsuhiro Suzuki .probe = uniphier_aio_probe, 259130af75bSUwe Kleine-König .remove = uniphier_aio_remove, 2608413b9e0SKatsuhiro Suzuki }; 2618413b9e0SKatsuhiro Suzuki module_platform_driver(uniphier_aio_driver); 2628413b9e0SKatsuhiro Suzuki 2638413b9e0SKatsuhiro Suzuki MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); 2648413b9e0SKatsuhiro Suzuki MODULE_DESCRIPTION("UniPhier PXs2 AIO driver."); 2658413b9e0SKatsuhiro Suzuki MODULE_LICENSE("GPL v2"); 266