266 lines · c
1// SPDX-License-Identifier: GPL-2.02//3// Socionext UniPhier AIO ALSA driver for PXs2.4//5// Copyright (c) 2018 Socionext Inc.6 7#include <linux/module.h>8 9#include "aio.h"10 11static const struct uniphier_aio_spec uniphier_aio_pxs2[] = {12 /* for Line PCM In, Pin:AI1Dx */13 {14 .name = AUD_NAME_PCMIN1,15 .gname = AUD_GNAME_LINE,16 .swm = {17 .type = PORT_TYPE_I2S,18 .dir = PORT_DIR_INPUT,19 .rb = { 16, 11, },20 .ch = { 16, 11, },21 .iif = { 0, 0, },22 .iport = { 0, AUD_HW_PCMIN1, },23 },24 },25 26 /* for Speaker/Headphone/Mic PCM In, Pin:AI2Dx */27 {28 .name = AUD_NAME_PCMIN2,29 .gname = AUD_GNAME_AUX,30 .swm = {31 .type = PORT_TYPE_I2S,32 .dir = PORT_DIR_INPUT,33 .rb = { 17, 12, },34 .ch = { 17, 12, },35 .iif = { 1, 1, },36 .iport = { 1, AUD_HW_PCMIN2, },37 },38 },39 40 /* for HDMI PCM Out, Pin:AO1Dx (inner) */41 {42 .name = AUD_NAME_HPCMOUT1,43 .gname = AUD_GNAME_HDMI,44 .swm = {45 .type = PORT_TYPE_I2S,46 .dir = PORT_DIR_OUTPUT,47 .rb = { 0, 0, },48 .ch = { 0, 0, },49 .oif = { 0, 0, },50 .oport = { 3, AUD_HW_HPCMOUT1, },51 },52 },53 54 /* for Line PCM Out, Pin:AO2Dx */55 {56 .name = AUD_NAME_PCMOUT1,57 .gname = AUD_GNAME_LINE,58 .swm = {59 .type = PORT_TYPE_I2S,60 .dir = PORT_DIR_OUTPUT,61 .rb = { 1, 1, },62 .ch = { 1, 1, },63 .oif = { 1, 1, },64 .oport = { 0, AUD_HW_PCMOUT1, },65 },66 },67 68 /* for Speaker/Headphone/Mic PCM Out, Pin:AO3Dx */69 {70 .name = AUD_NAME_PCMOUT2,71 .gname = AUD_GNAME_AUX,72 .swm = {73 .type = PORT_TYPE_I2S,74 .dir = PORT_DIR_OUTPUT,75 .rb = { 2, 2, },76 .ch = { 2, 2, },77 .oif = { 2, 2, },78 .oport = { 1, AUD_HW_PCMOUT2, },79 },80 },81 82 /* for HDMI Out, Pin:AO1IEC */83 {84 .name = AUD_NAME_HIECOUT1,85 .swm = {86 .type = PORT_TYPE_SPDIF,87 .dir = PORT_DIR_OUTPUT,88 .rb = { 6, 4, },89 .ch = { 6, 4, },90 .oif = { 6, 4, },91 .oport = { 12, AUD_HW_HIECOUT1, },92 },93 },94 95 /* for HDMI Out, Pin:AO1IEC, Compress */96 {97 .name = AUD_NAME_HIECCOMPOUT1,98 .swm = {99 .type = PORT_TYPE_SPDIF,100 .dir = PORT_DIR_OUTPUT,101 .rb = { 6, 4, },102 .ch = { 6, 4, },103 .oif = { 6, 4, },104 .oport = { 12, AUD_HW_HIECOUT1, },105 },106 },107 108 /* for S/PDIF Out, Pin:AO2IEC */109 {110 .name = AUD_NAME_IECOUT1,111 .swm = {112 .type = PORT_TYPE_SPDIF,113 .dir = PORT_DIR_OUTPUT,114 .rb = { 7, 5, },115 .ch = { 7, 5, },116 .oif = { 7, 5, },117 .oport = { 13, AUD_HW_IECOUT1, },118 },119 },120 121 /* for S/PDIF Out, Pin:AO2IEC */122 {123 .name = AUD_NAME_IECCOMPOUT1,124 .swm = {125 .type = PORT_TYPE_SPDIF,126 .dir = PORT_DIR_OUTPUT,127 .rb = { 7, 5, },128 .ch = { 7, 5, },129 .oif = { 7, 5, },130 .oport = { 13, AUD_HW_IECOUT1, },131 },132 },133};134 135static const struct uniphier_aio_pll uniphier_aio_pll_pxs2[] = {136 [AUD_PLL_A1] = { .enable = true, },137 [AUD_PLL_F1] = { .enable = true, },138 [AUD_PLL_A2] = { .enable = true, },139 [AUD_PLL_F2] = { .enable = true, },140 [AUD_PLL_APLL] = { .enable = true, },141 [AUD_PLL_HSC0] = { .enable = true, },142};143 144static struct snd_soc_dai_driver uniphier_aio_dai_pxs2[] = {145 {146 .name = AUD_GNAME_HDMI,147 .playback = {148 .stream_name = AUD_NAME_HPCMOUT1,149 .formats = SNDRV_PCM_FMTBIT_S32_LE,150 .rates = SNDRV_PCM_RATE_48000,151 .channels_min = 2,152 .channels_max = 2,153 },154 .ops = &uniphier_aio_i2s_pxs2_ops,155 },156 {157 .name = AUD_GNAME_LINE,158 .playback = {159 .stream_name = AUD_NAME_PCMOUT1,160 .formats = SNDRV_PCM_FMTBIT_S32_LE,161 .rates = SNDRV_PCM_RATE_48000,162 .channels_min = 2,163 .channels_max = 2,164 },165 .capture = {166 .stream_name = AUD_NAME_PCMIN1,167 .formats = SNDRV_PCM_FMTBIT_S32_LE,168 .rates = SNDRV_PCM_RATE_48000,169 .channels_min = 2,170 .channels_max = 2,171 },172 .ops = &uniphier_aio_i2s_pxs2_ops,173 },174 {175 .name = AUD_GNAME_AUX,176 .playback = {177 .stream_name = AUD_NAME_PCMOUT2,178 .formats = SNDRV_PCM_FMTBIT_S32_LE,179 .rates = SNDRV_PCM_RATE_48000,180 .channels_min = 2,181 .channels_max = 2,182 },183 .capture = {184 .stream_name = AUD_NAME_PCMIN2,185 .formats = SNDRV_PCM_FMTBIT_S32_LE,186 .rates = SNDRV_PCM_RATE_48000,187 .channels_min = 2,188 .channels_max = 2,189 },190 .ops = &uniphier_aio_i2s_pxs2_ops,191 },192 {193 .name = AUD_NAME_HIECOUT1,194 .playback = {195 .stream_name = AUD_NAME_HIECOUT1,196 .formats = SNDRV_PCM_FMTBIT_S32_LE,197 .rates = SNDRV_PCM_RATE_48000,198 .channels_min = 2,199 .channels_max = 2,200 },201 .ops = &uniphier_aio_spdif_pxs2_ops,202 },203 {204 .name = AUD_NAME_IECOUT1,205 .playback = {206 .stream_name = AUD_NAME_IECOUT1,207 .formats = SNDRV_PCM_FMTBIT_S32_LE,208 .rates = SNDRV_PCM_RATE_48000,209 .channels_min = 2,210 .channels_max = 2,211 },212 .ops = &uniphier_aio_spdif_pxs2_ops,213 },214 {215 .name = AUD_NAME_HIECCOMPOUT1,216 .playback = {217 .stream_name = AUD_NAME_HIECCOMPOUT1,218 .channels_min = 1,219 .channels_max = 1,220 },221 .ops = &uniphier_aio_spdif_pxs2_ops2,222 },223 {224 .name = AUD_NAME_IECCOMPOUT1,225 .playback = {226 .stream_name = AUD_NAME_IECCOMPOUT1,227 .channels_min = 1,228 .channels_max = 1,229 },230 .ops = &uniphier_aio_spdif_pxs2_ops2,231 },232};233 234static const struct uniphier_aio_chip_spec uniphier_aio_pxs2_spec = {235 .specs = uniphier_aio_pxs2,236 .num_specs = ARRAY_SIZE(uniphier_aio_pxs2),237 .dais = uniphier_aio_dai_pxs2,238 .num_dais = ARRAY_SIZE(uniphier_aio_dai_pxs2),239 .plls = uniphier_aio_pll_pxs2,240 .num_plls = ARRAY_SIZE(uniphier_aio_pll_pxs2),241 .addr_ext = 0,242};243 244static const struct of_device_id uniphier_aio_of_match[] __maybe_unused = {245 {246 .compatible = "socionext,uniphier-pxs2-aio",247 .data = &uniphier_aio_pxs2_spec,248 },249 {},250};251MODULE_DEVICE_TABLE(of, uniphier_aio_of_match);252 253static struct platform_driver uniphier_aio_driver = {254 .driver = {255 .name = "snd-uniphier-aio-pxs2",256 .of_match_table = of_match_ptr(uniphier_aio_of_match),257 },258 .probe = uniphier_aio_probe,259 .remove = uniphier_aio_remove,260};261module_platform_driver(uniphier_aio_driver);262 263MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>");264MODULE_DESCRIPTION("UniPhier PXs2 AIO driver.");265MODULE_LICENSE("GPL v2");266