1*db4cb3d0SKatsuhiro Suzuki // SPDX-License-Identifier: GPL-2.0 2*db4cb3d0SKatsuhiro Suzuki // 3*db4cb3d0SKatsuhiro Suzuki // Socionext UniPhier AIO ALSA driver for LD11/LD20. 4*db4cb3d0SKatsuhiro Suzuki // 5*db4cb3d0SKatsuhiro Suzuki // Copyright (c) 2016-2018 Socionext Inc. 6*db4cb3d0SKatsuhiro Suzuki // 7*db4cb3d0SKatsuhiro Suzuki // This program is free software; you can redistribute it and/or 8*db4cb3d0SKatsuhiro Suzuki // modify it under the terms of the GNU General Public License 9*db4cb3d0SKatsuhiro Suzuki // as published by the Free Software Foundation; version 2 10*db4cb3d0SKatsuhiro Suzuki // of the License. 11*db4cb3d0SKatsuhiro Suzuki // 12*db4cb3d0SKatsuhiro Suzuki // This program is distributed in the hope that it will be useful, 13*db4cb3d0SKatsuhiro Suzuki // but WITHOUT ANY WARRANTY; without even the implied warranty of 14*db4cb3d0SKatsuhiro Suzuki // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*db4cb3d0SKatsuhiro Suzuki // GNU General Public License for more details. 16*db4cb3d0SKatsuhiro Suzuki // 17*db4cb3d0SKatsuhiro Suzuki // You should have received a copy of the GNU General Public License 18*db4cb3d0SKatsuhiro Suzuki // along with this program; if not, see <http://www.gnu.org/licenses/>. 19*db4cb3d0SKatsuhiro Suzuki 20*db4cb3d0SKatsuhiro Suzuki #include <linux/module.h> 21*db4cb3d0SKatsuhiro Suzuki 22*db4cb3d0SKatsuhiro Suzuki #include "aio.h" 23*db4cb3d0SKatsuhiro Suzuki 24*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_spec uniphier_aio_ld11[] = { 25*db4cb3d0SKatsuhiro Suzuki /* for HDMI PCM In, Pin:AI1Dx */ 26*db4cb3d0SKatsuhiro Suzuki { 27*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN1, 28*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_HDMI, 29*db4cb3d0SKatsuhiro Suzuki .swm = { 30*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 31*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 32*db4cb3d0SKatsuhiro Suzuki .rb = { 21, 14, }, 33*db4cb3d0SKatsuhiro Suzuki .ch = { 21, 14, }, 34*db4cb3d0SKatsuhiro Suzuki .iif = { 5, 3, }, 35*db4cb3d0SKatsuhiro Suzuki .iport = { 0, AUD_HW_PCMIN1, }, 36*db4cb3d0SKatsuhiro Suzuki }, 37*db4cb3d0SKatsuhiro Suzuki }, 38*db4cb3d0SKatsuhiro Suzuki 39*db4cb3d0SKatsuhiro Suzuki /* for SIF In, Pin:AI2Dx */ 40*db4cb3d0SKatsuhiro Suzuki { 41*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN2, 42*db4cb3d0SKatsuhiro Suzuki .swm = { 43*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 44*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 45*db4cb3d0SKatsuhiro Suzuki .rb = { 22, 15, }, 46*db4cb3d0SKatsuhiro Suzuki .ch = { 22, 15, }, 47*db4cb3d0SKatsuhiro Suzuki .iif = { 6, 4, }, 48*db4cb3d0SKatsuhiro Suzuki .iport = { 1, AUD_HW_PCMIN2, }, 49*db4cb3d0SKatsuhiro Suzuki }, 50*db4cb3d0SKatsuhiro Suzuki }, 51*db4cb3d0SKatsuhiro Suzuki 52*db4cb3d0SKatsuhiro Suzuki /* for Line In, Pin:AI3Dx */ 53*db4cb3d0SKatsuhiro Suzuki { 54*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN3, 55*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_LINE, 56*db4cb3d0SKatsuhiro Suzuki .swm = { 57*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_EVE, 58*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 59*db4cb3d0SKatsuhiro Suzuki .rb = { 23, 16, }, 60*db4cb3d0SKatsuhiro Suzuki .ch = { 23, 16, }, 61*db4cb3d0SKatsuhiro Suzuki .iif = { 7, 5, }, 62*db4cb3d0SKatsuhiro Suzuki .iport = { 2, AUD_HW_PCMIN3, }, 63*db4cb3d0SKatsuhiro Suzuki }, 64*db4cb3d0SKatsuhiro Suzuki }, 65*db4cb3d0SKatsuhiro Suzuki 66*db4cb3d0SKatsuhiro Suzuki /* for S/PDIF In, Pin:AI1IEC */ 67*db4cb3d0SKatsuhiro Suzuki { 68*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_IECIN1, 69*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_IEC, 70*db4cb3d0SKatsuhiro Suzuki .swm = { 71*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 72*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_INPUT, 73*db4cb3d0SKatsuhiro Suzuki .rb = { 26, 17, }, 74*db4cb3d0SKatsuhiro Suzuki .ch = { 26, 17, }, 75*db4cb3d0SKatsuhiro Suzuki .iif = { 10, 6, }, 76*db4cb3d0SKatsuhiro Suzuki .iport = { 3, AUD_HW_IECIN1, }, 77*db4cb3d0SKatsuhiro Suzuki }, 78*db4cb3d0SKatsuhiro Suzuki }, 79*db4cb3d0SKatsuhiro Suzuki 80*db4cb3d0SKatsuhiro Suzuki /* for Speaker, Pin:AO1Dx */ 81*db4cb3d0SKatsuhiro Suzuki { 82*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HPCMOUT1, 83*db4cb3d0SKatsuhiro Suzuki .swm = { 84*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 85*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 86*db4cb3d0SKatsuhiro Suzuki .rb = { 0, 0, }, 87*db4cb3d0SKatsuhiro Suzuki .ch = { 0, 0, }, 88*db4cb3d0SKatsuhiro Suzuki .oif = { 0, 0, }, 89*db4cb3d0SKatsuhiro Suzuki .oport = { 0, AUD_HW_HPCMOUT1, }, 90*db4cb3d0SKatsuhiro Suzuki }, 91*db4cb3d0SKatsuhiro Suzuki }, 92*db4cb3d0SKatsuhiro Suzuki 93*db4cb3d0SKatsuhiro Suzuki /* for HDMI PCM, Pin:AO2Dx */ 94*db4cb3d0SKatsuhiro Suzuki { 95*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT1, 96*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_HDMI, 97*db4cb3d0SKatsuhiro Suzuki .swm = { 98*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_I2S, 99*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 100*db4cb3d0SKatsuhiro Suzuki .rb = { 0, 0, }, 101*db4cb3d0SKatsuhiro Suzuki .ch = { 0, 0, }, 102*db4cb3d0SKatsuhiro Suzuki .oif = { 0, 0, }, 103*db4cb3d0SKatsuhiro Suzuki .oport = { 3, AUD_HW_PCMOUT1, }, 104*db4cb3d0SKatsuhiro Suzuki }, 105*db4cb3d0SKatsuhiro Suzuki }, 106*db4cb3d0SKatsuhiro Suzuki 107*db4cb3d0SKatsuhiro Suzuki /* for Line Out, Pin:LO2_x */ 108*db4cb3d0SKatsuhiro Suzuki { 109*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT2, 110*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_LINE, 111*db4cb3d0SKatsuhiro Suzuki .swm = { 112*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_EVE, 113*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 114*db4cb3d0SKatsuhiro Suzuki .rb = { 2, 2, }, 115*db4cb3d0SKatsuhiro Suzuki .ch = { 2, 2, }, 116*db4cb3d0SKatsuhiro Suzuki .oif = { 2, 2, }, 117*db4cb3d0SKatsuhiro Suzuki .oport = { 1, AUD_HW_PCMOUT2, }, 118*db4cb3d0SKatsuhiro Suzuki }, 119*db4cb3d0SKatsuhiro Suzuki }, 120*db4cb3d0SKatsuhiro Suzuki 121*db4cb3d0SKatsuhiro Suzuki /* for Headphone, Pin:HP1_x */ 122*db4cb3d0SKatsuhiro Suzuki { 123*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT3, 124*db4cb3d0SKatsuhiro Suzuki .swm = { 125*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_EVE, 126*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 127*db4cb3d0SKatsuhiro Suzuki .rb = { 3, 3, }, 128*db4cb3d0SKatsuhiro Suzuki .ch = { 3, 3, }, 129*db4cb3d0SKatsuhiro Suzuki .oif = { 3, 3, }, 130*db4cb3d0SKatsuhiro Suzuki .oport = { 2, AUD_HW_PCMOUT3, }, 131*db4cb3d0SKatsuhiro Suzuki }, 132*db4cb3d0SKatsuhiro Suzuki }, 133*db4cb3d0SKatsuhiro Suzuki 134*db4cb3d0SKatsuhiro Suzuki /* for HW Sampling Rate Converter */ 135*db4cb3d0SKatsuhiro Suzuki { 136*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_EPCMOUT2, 137*db4cb3d0SKatsuhiro Suzuki .swm = { 138*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_CONV, 139*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 140*db4cb3d0SKatsuhiro Suzuki .rb = { 7, 5, }, 141*db4cb3d0SKatsuhiro Suzuki .ch = { 7, 5, }, 142*db4cb3d0SKatsuhiro Suzuki .oif = { 7, 5, }, 143*db4cb3d0SKatsuhiro Suzuki .oport = { 6, AUD_HW_EPCMOUT2, }, 144*db4cb3d0SKatsuhiro Suzuki .och = { 17, 12, }, 145*db4cb3d0SKatsuhiro Suzuki .iif = { 1, 1, }, 146*db4cb3d0SKatsuhiro Suzuki }, 147*db4cb3d0SKatsuhiro Suzuki }, 148*db4cb3d0SKatsuhiro Suzuki 149*db4cb3d0SKatsuhiro Suzuki /* for HW Sampling Rate Converter 2 */ 150*db4cb3d0SKatsuhiro Suzuki { 151*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_EPCMOUT3, 152*db4cb3d0SKatsuhiro Suzuki .swm = { 153*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_CONV, 154*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 155*db4cb3d0SKatsuhiro Suzuki .rb = { 8, 6, }, 156*db4cb3d0SKatsuhiro Suzuki .ch = { 8, 6, }, 157*db4cb3d0SKatsuhiro Suzuki .oif = { 8, 6, }, 158*db4cb3d0SKatsuhiro Suzuki .oport = { 7, AUD_HW_EPCMOUT3, }, 159*db4cb3d0SKatsuhiro Suzuki .och = { 18, 13, }, 160*db4cb3d0SKatsuhiro Suzuki .iif = { 2, 2, }, 161*db4cb3d0SKatsuhiro Suzuki }, 162*db4cb3d0SKatsuhiro Suzuki }, 163*db4cb3d0SKatsuhiro Suzuki 164*db4cb3d0SKatsuhiro Suzuki /* for S/PDIF Out, Pin:AO1IEC */ 165*db4cb3d0SKatsuhiro Suzuki { 166*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HIECOUT1, 167*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_IEC, 168*db4cb3d0SKatsuhiro Suzuki .swm = { 169*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 170*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 171*db4cb3d0SKatsuhiro Suzuki .rb = { 1, 1, }, 172*db4cb3d0SKatsuhiro Suzuki .ch = { 1, 1, }, 173*db4cb3d0SKatsuhiro Suzuki .oif = { 1, 1, }, 174*db4cb3d0SKatsuhiro Suzuki .oport = { 12, AUD_HW_HIECOUT1, }, 175*db4cb3d0SKatsuhiro Suzuki }, 176*db4cb3d0SKatsuhiro Suzuki }, 177*db4cb3d0SKatsuhiro Suzuki 178*db4cb3d0SKatsuhiro Suzuki /* for S/PDIF Out, Pin:AO1IEC, Compress */ 179*db4cb3d0SKatsuhiro Suzuki { 180*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HIECCOMPOUT1, 181*db4cb3d0SKatsuhiro Suzuki .gname = AUD_GNAME_IEC, 182*db4cb3d0SKatsuhiro Suzuki .swm = { 183*db4cb3d0SKatsuhiro Suzuki .type = PORT_TYPE_SPDIF, 184*db4cb3d0SKatsuhiro Suzuki .dir = PORT_DIR_OUTPUT, 185*db4cb3d0SKatsuhiro Suzuki .rb = { 1, 1, }, 186*db4cb3d0SKatsuhiro Suzuki .ch = { 1, 1, }, 187*db4cb3d0SKatsuhiro Suzuki .oif = { 1, 1, }, 188*db4cb3d0SKatsuhiro Suzuki .oport = { 12, AUD_HW_HIECOUT1, }, 189*db4cb3d0SKatsuhiro Suzuki }, 190*db4cb3d0SKatsuhiro Suzuki }, 191*db4cb3d0SKatsuhiro Suzuki }; 192*db4cb3d0SKatsuhiro Suzuki 193*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_pll uniphier_aio_pll_ld11[] = { 194*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_A1] = { .enable = true, }, 195*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_F1] = { .enable = true, }, 196*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_A2] = { .enable = true, }, 197*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_F2] = { .enable = true, }, 198*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_APLL] = { .enable = true, }, 199*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_RX0] = { .enable = true, }, 200*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_USB0] = { .enable = true, }, 201*db4cb3d0SKatsuhiro Suzuki [AUD_PLL_HSC0] = { .enable = true, }, 202*db4cb3d0SKatsuhiro Suzuki }; 203*db4cb3d0SKatsuhiro Suzuki 204*db4cb3d0SKatsuhiro Suzuki static int uniphier_aio_ld11_probe(struct snd_soc_dai *dai) 205*db4cb3d0SKatsuhiro Suzuki { 206*db4cb3d0SKatsuhiro Suzuki int ret; 207*db4cb3d0SKatsuhiro Suzuki 208*db4cb3d0SKatsuhiro Suzuki ret = uniphier_aio_dai_probe(dai); 209*db4cb3d0SKatsuhiro Suzuki if (ret < 0) 210*db4cb3d0SKatsuhiro Suzuki return ret; 211*db4cb3d0SKatsuhiro Suzuki 212*db4cb3d0SKatsuhiro Suzuki ret = snd_soc_dai_set_pll(dai, AUD_PLL_A1, 0, 0, 36864000); 213*db4cb3d0SKatsuhiro Suzuki if (ret < 0) 214*db4cb3d0SKatsuhiro Suzuki return ret; 215*db4cb3d0SKatsuhiro Suzuki ret = snd_soc_dai_set_pll(dai, AUD_PLL_F1, 0, 0, 36864000); 216*db4cb3d0SKatsuhiro Suzuki if (ret < 0) 217*db4cb3d0SKatsuhiro Suzuki return ret; 218*db4cb3d0SKatsuhiro Suzuki 219*db4cb3d0SKatsuhiro Suzuki ret = snd_soc_dai_set_pll(dai, AUD_PLL_A2, 0, 0, 33868800); 220*db4cb3d0SKatsuhiro Suzuki if (ret < 0) 221*db4cb3d0SKatsuhiro Suzuki return ret; 222*db4cb3d0SKatsuhiro Suzuki ret = snd_soc_dai_set_pll(dai, AUD_PLL_F2, 0, 0, 33868800); 223*db4cb3d0SKatsuhiro Suzuki if (ret < 0) 224*db4cb3d0SKatsuhiro Suzuki return ret; 225*db4cb3d0SKatsuhiro Suzuki 226*db4cb3d0SKatsuhiro Suzuki return 0; 227*db4cb3d0SKatsuhiro Suzuki } 228*db4cb3d0SKatsuhiro Suzuki 229*db4cb3d0SKatsuhiro Suzuki static struct snd_soc_dai_driver uniphier_aio_dai_ld11[] = { 230*db4cb3d0SKatsuhiro Suzuki { 231*db4cb3d0SKatsuhiro Suzuki .name = AUD_GNAME_HDMI, 232*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 233*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 234*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 235*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 236*db4cb3d0SKatsuhiro Suzuki .playback = { 237*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMOUT1, 238*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 239*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 240*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 241*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 242*db4cb3d0SKatsuhiro Suzuki }, 243*db4cb3d0SKatsuhiro Suzuki .capture = { 244*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMIN1, 245*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 246*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000 | 247*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_44100 | 248*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_32000, 249*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 250*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 251*db4cb3d0SKatsuhiro Suzuki }, 252*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 253*db4cb3d0SKatsuhiro Suzuki }, 254*db4cb3d0SKatsuhiro Suzuki { 255*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMIN2, 256*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 257*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 258*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 259*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 260*db4cb3d0SKatsuhiro Suzuki .capture = { 261*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMIN2, 262*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 263*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 264*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 265*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 266*db4cb3d0SKatsuhiro Suzuki }, 267*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 268*db4cb3d0SKatsuhiro Suzuki }, 269*db4cb3d0SKatsuhiro Suzuki { 270*db4cb3d0SKatsuhiro Suzuki .name = AUD_GNAME_LINE, 271*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 272*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 273*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 274*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 275*db4cb3d0SKatsuhiro Suzuki .playback = { 276*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMOUT2, 277*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 278*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 279*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 280*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 281*db4cb3d0SKatsuhiro Suzuki }, 282*db4cb3d0SKatsuhiro Suzuki .capture = { 283*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMIN3, 284*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 285*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 286*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 287*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 288*db4cb3d0SKatsuhiro Suzuki }, 289*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 290*db4cb3d0SKatsuhiro Suzuki }, 291*db4cb3d0SKatsuhiro Suzuki { 292*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HPCMOUT1, 293*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 294*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 295*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 296*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 297*db4cb3d0SKatsuhiro Suzuki .playback = { 298*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_HPCMOUT1, 299*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 300*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 301*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 302*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 303*db4cb3d0SKatsuhiro Suzuki }, 304*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 305*db4cb3d0SKatsuhiro Suzuki }, 306*db4cb3d0SKatsuhiro Suzuki { 307*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_PCMOUT3, 308*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 309*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 310*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 311*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 312*db4cb3d0SKatsuhiro Suzuki .playback = { 313*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_PCMOUT3, 314*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 315*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 316*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 317*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 318*db4cb3d0SKatsuhiro Suzuki }, 319*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 320*db4cb3d0SKatsuhiro Suzuki }, 321*db4cb3d0SKatsuhiro Suzuki { 322*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HIECOUT1, 323*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 324*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 325*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 326*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 327*db4cb3d0SKatsuhiro Suzuki .playback = { 328*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_HIECOUT1, 329*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 330*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000, 331*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 332*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 333*db4cb3d0SKatsuhiro Suzuki }, 334*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_spdif_ops, 335*db4cb3d0SKatsuhiro Suzuki }, 336*db4cb3d0SKatsuhiro Suzuki { 337*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_EPCMOUT2, 338*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 339*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 340*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 341*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 342*db4cb3d0SKatsuhiro Suzuki .playback = { 343*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_EPCMOUT2, 344*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 345*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000 | 346*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_44100 | 347*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_32000, 348*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 349*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 350*db4cb3d0SKatsuhiro Suzuki }, 351*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 352*db4cb3d0SKatsuhiro Suzuki }, 353*db4cb3d0SKatsuhiro Suzuki { 354*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_EPCMOUT3, 355*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 356*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 357*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 358*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 359*db4cb3d0SKatsuhiro Suzuki .playback = { 360*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_EPCMOUT3, 361*db4cb3d0SKatsuhiro Suzuki .formats = SNDRV_PCM_FMTBIT_S32_LE, 362*db4cb3d0SKatsuhiro Suzuki .rates = SNDRV_PCM_RATE_48000 | 363*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_44100 | 364*db4cb3d0SKatsuhiro Suzuki SNDRV_PCM_RATE_32000, 365*db4cb3d0SKatsuhiro Suzuki .channels_min = 2, 366*db4cb3d0SKatsuhiro Suzuki .channels_max = 2, 367*db4cb3d0SKatsuhiro Suzuki }, 368*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_i2s_ops, 369*db4cb3d0SKatsuhiro Suzuki }, 370*db4cb3d0SKatsuhiro Suzuki { 371*db4cb3d0SKatsuhiro Suzuki .name = AUD_NAME_HIECCOMPOUT1, 372*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_ld11_probe, 373*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_dai_remove, 374*db4cb3d0SKatsuhiro Suzuki .suspend = uniphier_aio_dai_suspend, 375*db4cb3d0SKatsuhiro Suzuki .resume = uniphier_aio_dai_resume, 376*db4cb3d0SKatsuhiro Suzuki .compress_new = snd_soc_new_compress, 377*db4cb3d0SKatsuhiro Suzuki .playback = { 378*db4cb3d0SKatsuhiro Suzuki .stream_name = AUD_NAME_HIECCOMPOUT1, 379*db4cb3d0SKatsuhiro Suzuki .channels_min = 1, 380*db4cb3d0SKatsuhiro Suzuki .channels_max = 1, 381*db4cb3d0SKatsuhiro Suzuki }, 382*db4cb3d0SKatsuhiro Suzuki .ops = &uniphier_aio_spdif_ops, 383*db4cb3d0SKatsuhiro Suzuki }, 384*db4cb3d0SKatsuhiro Suzuki }; 385*db4cb3d0SKatsuhiro Suzuki 386*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_chip_spec uniphier_aio_ld11_spec = { 387*db4cb3d0SKatsuhiro Suzuki .specs = uniphier_aio_ld11, 388*db4cb3d0SKatsuhiro Suzuki .num_specs = ARRAY_SIZE(uniphier_aio_ld11), 389*db4cb3d0SKatsuhiro Suzuki .dais = uniphier_aio_dai_ld11, 390*db4cb3d0SKatsuhiro Suzuki .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), 391*db4cb3d0SKatsuhiro Suzuki .plls = uniphier_aio_pll_ld11, 392*db4cb3d0SKatsuhiro Suzuki .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), 393*db4cb3d0SKatsuhiro Suzuki .addr_ext = 0, 394*db4cb3d0SKatsuhiro Suzuki }; 395*db4cb3d0SKatsuhiro Suzuki 396*db4cb3d0SKatsuhiro Suzuki static const struct uniphier_aio_chip_spec uniphier_aio_ld20_spec = { 397*db4cb3d0SKatsuhiro Suzuki .specs = uniphier_aio_ld11, 398*db4cb3d0SKatsuhiro Suzuki .num_specs = ARRAY_SIZE(uniphier_aio_ld11), 399*db4cb3d0SKatsuhiro Suzuki .dais = uniphier_aio_dai_ld11, 400*db4cb3d0SKatsuhiro Suzuki .num_dais = ARRAY_SIZE(uniphier_aio_dai_ld11), 401*db4cb3d0SKatsuhiro Suzuki .plls = uniphier_aio_pll_ld11, 402*db4cb3d0SKatsuhiro Suzuki .num_plls = ARRAY_SIZE(uniphier_aio_pll_ld11), 403*db4cb3d0SKatsuhiro Suzuki .addr_ext = 1, 404*db4cb3d0SKatsuhiro Suzuki }; 405*db4cb3d0SKatsuhiro Suzuki 406*db4cb3d0SKatsuhiro Suzuki static const struct of_device_id uniphier_aio_of_match[] = { 407*db4cb3d0SKatsuhiro Suzuki { 408*db4cb3d0SKatsuhiro Suzuki .compatible = "socionext,uniphier-ld11-aio", 409*db4cb3d0SKatsuhiro Suzuki .data = &uniphier_aio_ld11_spec, 410*db4cb3d0SKatsuhiro Suzuki }, 411*db4cb3d0SKatsuhiro Suzuki { 412*db4cb3d0SKatsuhiro Suzuki .compatible = "socionext,uniphier-ld20-aio", 413*db4cb3d0SKatsuhiro Suzuki .data = &uniphier_aio_ld20_spec, 414*db4cb3d0SKatsuhiro Suzuki }, 415*db4cb3d0SKatsuhiro Suzuki {}, 416*db4cb3d0SKatsuhiro Suzuki }; 417*db4cb3d0SKatsuhiro Suzuki MODULE_DEVICE_TABLE(of, uniphier_aio_of_match); 418*db4cb3d0SKatsuhiro Suzuki 419*db4cb3d0SKatsuhiro Suzuki static struct platform_driver uniphier_aio_driver = { 420*db4cb3d0SKatsuhiro Suzuki .driver = { 421*db4cb3d0SKatsuhiro Suzuki .name = "snd-uniphier-aio", 422*db4cb3d0SKatsuhiro Suzuki .of_match_table = of_match_ptr(uniphier_aio_of_match), 423*db4cb3d0SKatsuhiro Suzuki }, 424*db4cb3d0SKatsuhiro Suzuki .probe = uniphier_aio_probe, 425*db4cb3d0SKatsuhiro Suzuki .remove = uniphier_aio_remove, 426*db4cb3d0SKatsuhiro Suzuki }; 427*db4cb3d0SKatsuhiro Suzuki module_platform_driver(uniphier_aio_driver); 428*db4cb3d0SKatsuhiro Suzuki 429*db4cb3d0SKatsuhiro Suzuki MODULE_AUTHOR("Katsuhiro Suzuki <suzuki.katsuhiro@socionext.com>"); 430*db4cb3d0SKatsuhiro Suzuki MODULE_DESCRIPTION("UniPhier LD11/LD20 AIO driver."); 431*db4cb3d0SKatsuhiro Suzuki MODULE_LICENSE("GPL v2"); 432