root/sound/soc/codecs/wl1273.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. snd_wl1273_fm_set_i2s_mode
  2. snd_wl1273_fm_set_channel_number
  3. snd_wl1273_get_audio_route
  4. snd_wl1273_set_audio_route
  5. snd_wl1273_fm_audio_get
  6. snd_wl1273_fm_audio_put
  7. snd_wl1273_fm_volume_get
  8. snd_wl1273_fm_volume_put
  9. wl1273_startup
  10. wl1273_hw_params
  11. wl1273_get_format
  12. wl1273_probe
  13. wl1273_remove
  14. wl1273_platform_probe
  15. wl1273_platform_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * ALSA SoC WL1273 codec driver
   4  *
   5  * Author:      Matti Aaltonen, <matti.j.aaltonen@nokia.com>
   6  *
   7  * Copyright:   (C) 2010, 2011 Nokia Corporation
   8  */
   9 
  10 #include <linux/mfd/wl1273-core.h>
  11 #include <linux/slab.h>
  12 #include <linux/module.h>
  13 #include <sound/pcm.h>
  14 #include <sound/pcm_params.h>
  15 #include <sound/soc.h>
  16 #include <sound/initval.h>
  17 
  18 #include "wl1273.h"
  19 
  20 enum wl1273_mode { WL1273_MODE_BT, WL1273_MODE_FM_RX, WL1273_MODE_FM_TX };
  21 
  22 /* codec private data */
  23 struct wl1273_priv {
  24         enum wl1273_mode mode;
  25         struct wl1273_core *core;
  26         unsigned int channels;
  27 };
  28 
  29 static int snd_wl1273_fm_set_i2s_mode(struct wl1273_core *core,
  30                                       int rate, int width)
  31 {
  32         struct device *dev = &core->client->dev;
  33         int r = 0;
  34         u16 mode;
  35 
  36         dev_dbg(dev, "rate: %d\n", rate);
  37         dev_dbg(dev, "width: %d\n", width);
  38 
  39         mutex_lock(&core->lock);
  40 
  41         mode = core->i2s_mode & ~WL1273_IS2_WIDTH & ~WL1273_IS2_RATE;
  42 
  43         switch (rate) {
  44         case 48000:
  45                 mode |= WL1273_IS2_RATE_48K;
  46                 break;
  47         case 44100:
  48                 mode |= WL1273_IS2_RATE_44_1K;
  49                 break;
  50         case 32000:
  51                 mode |= WL1273_IS2_RATE_32K;
  52                 break;
  53         case 22050:
  54                 mode |= WL1273_IS2_RATE_22_05K;
  55                 break;
  56         case 16000:
  57                 mode |= WL1273_IS2_RATE_16K;
  58                 break;
  59         case 12000:
  60                 mode |= WL1273_IS2_RATE_12K;
  61                 break;
  62         case 11025:
  63                 mode |= WL1273_IS2_RATE_11_025;
  64                 break;
  65         case 8000:
  66                 mode |= WL1273_IS2_RATE_8K;
  67                 break;
  68         default:
  69                 dev_err(dev, "Sampling rate: %d not supported\n", rate);
  70                 r = -EINVAL;
  71                 goto out;
  72         }
  73 
  74         switch (width) {
  75         case 16:
  76                 mode |= WL1273_IS2_WIDTH_32;
  77                 break;
  78         case 20:
  79                 mode |= WL1273_IS2_WIDTH_40;
  80                 break;
  81         case 24:
  82                 mode |= WL1273_IS2_WIDTH_48;
  83                 break;
  84         case 25:
  85                 mode |= WL1273_IS2_WIDTH_50;
  86                 break;
  87         case 30:
  88                 mode |= WL1273_IS2_WIDTH_60;
  89                 break;
  90         case 32:
  91                 mode |= WL1273_IS2_WIDTH_64;
  92                 break;
  93         case 40:
  94                 mode |= WL1273_IS2_WIDTH_80;
  95                 break;
  96         case 48:
  97                 mode |= WL1273_IS2_WIDTH_96;
  98                 break;
  99         case 64:
 100                 mode |= WL1273_IS2_WIDTH_128;
 101                 break;
 102         default:
 103                 dev_err(dev, "Data width: %d not supported\n", width);
 104                 r = -EINVAL;
 105                 goto out;
 106         }
 107 
 108         dev_dbg(dev, "WL1273_I2S_DEF_MODE: 0x%04x\n",  WL1273_I2S_DEF_MODE);
 109         dev_dbg(dev, "core->i2s_mode: 0x%04x\n", core->i2s_mode);
 110         dev_dbg(dev, "mode: 0x%04x\n", mode);
 111 
 112         if (core->i2s_mode != mode) {
 113                 r = core->write(core, WL1273_I2S_MODE_CONFIG_SET, mode);
 114                 if (r)
 115                         goto out;
 116 
 117                 core->i2s_mode = mode;
 118                 r = core->write(core, WL1273_AUDIO_ENABLE,
 119                                 WL1273_AUDIO_ENABLE_I2S);
 120                 if (r)
 121                         goto out;
 122         }
 123 out:
 124         mutex_unlock(&core->lock);
 125 
 126         return r;
 127 }
 128 
 129 static int snd_wl1273_fm_set_channel_number(struct wl1273_core *core,
 130                                             int channel_number)
 131 {
 132         struct device *dev = &core->client->dev;
 133         int r = 0;
 134 
 135         dev_dbg(dev, "%s\n", __func__);
 136 
 137         mutex_lock(&core->lock);
 138 
 139         if (core->channel_number == channel_number)
 140                 goto out;
 141 
 142         if (channel_number == 1 && core->mode == WL1273_MODE_RX)
 143                 r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_MONO);
 144         else if (channel_number == 1 && core->mode == WL1273_MODE_TX)
 145                 r = core->write(core, WL1273_MONO_SET, WL1273_TX_MONO);
 146         else if (channel_number == 2 && core->mode == WL1273_MODE_RX)
 147                 r = core->write(core, WL1273_MOST_MODE_SET, WL1273_RX_STEREO);
 148         else if (channel_number == 2 && core->mode == WL1273_MODE_TX)
 149                 r = core->write(core, WL1273_MONO_SET, WL1273_TX_STEREO);
 150         else
 151                 r = -EINVAL;
 152 out:
 153         mutex_unlock(&core->lock);
 154 
 155         return r;
 156 }
 157 
 158 static int snd_wl1273_get_audio_route(struct snd_kcontrol *kcontrol,
 159                                       struct snd_ctl_elem_value *ucontrol)
 160 {
 161         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 162         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 163 
 164         ucontrol->value.enumerated.item[0] = wl1273->mode;
 165 
 166         return 0;
 167 }
 168 
 169 /*
 170  * TODO: Implement the audio routing in the driver. Now this control
 171  * only indicates the setting that has been done elsewhere (in the user
 172  * space).
 173  */
 174 static const char * const wl1273_audio_route[] = { "Bt", "FmRx", "FmTx" };
 175 
 176 static int snd_wl1273_set_audio_route(struct snd_kcontrol *kcontrol,
 177                                       struct snd_ctl_elem_value *ucontrol)
 178 {
 179         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 180         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 181 
 182         if (wl1273->mode == ucontrol->value.enumerated.item[0])
 183                 return 0;
 184 
 185         /* Do not allow changes while stream is running */
 186         if (snd_soc_component_is_active(component))
 187                 return -EPERM;
 188 
 189         if (ucontrol->value.enumerated.item[0] >=  ARRAY_SIZE(wl1273_audio_route))
 190                 return -EINVAL;
 191 
 192         wl1273->mode = ucontrol->value.enumerated.item[0];
 193 
 194         return 1;
 195 }
 196 
 197 static SOC_ENUM_SINGLE_EXT_DECL(wl1273_enum, wl1273_audio_route);
 198 
 199 static int snd_wl1273_fm_audio_get(struct snd_kcontrol *kcontrol,
 200                                    struct snd_ctl_elem_value *ucontrol)
 201 {
 202         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 203         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 204 
 205         dev_dbg(component->dev, "%s: enter.\n", __func__);
 206 
 207         ucontrol->value.enumerated.item[0] = wl1273->core->audio_mode;
 208 
 209         return 0;
 210 }
 211 
 212 static int snd_wl1273_fm_audio_put(struct snd_kcontrol *kcontrol,
 213                                    struct snd_ctl_elem_value *ucontrol)
 214 {
 215         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 216         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 217         int val, r = 0;
 218 
 219         dev_dbg(component->dev, "%s: enter.\n", __func__);
 220 
 221         val = ucontrol->value.enumerated.item[0];
 222         if (wl1273->core->audio_mode == val)
 223                 return 0;
 224 
 225         r = wl1273->core->set_audio(wl1273->core, val);
 226         if (r < 0)
 227                 return r;
 228 
 229         return 1;
 230 }
 231 
 232 static const char * const wl1273_audio_strings[] = { "Digital", "Analog" };
 233 
 234 static SOC_ENUM_SINGLE_EXT_DECL(wl1273_audio_enum, wl1273_audio_strings);
 235 
 236 static int snd_wl1273_fm_volume_get(struct snd_kcontrol *kcontrol,
 237                                     struct snd_ctl_elem_value *ucontrol)
 238 {
 239         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 240         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 241 
 242         dev_dbg(component->dev, "%s: enter.\n", __func__);
 243 
 244         ucontrol->value.integer.value[0] = wl1273->core->volume;
 245 
 246         return 0;
 247 }
 248 
 249 static int snd_wl1273_fm_volume_put(struct snd_kcontrol *kcontrol,
 250                                     struct snd_ctl_elem_value *ucontrol)
 251 {
 252         struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
 253         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 254         int r;
 255 
 256         dev_dbg(component->dev, "%s: enter.\n", __func__);
 257 
 258         r = wl1273->core->set_volume(wl1273->core,
 259                                      ucontrol->value.integer.value[0]);
 260         if (r)
 261                 return r;
 262 
 263         return 1;
 264 }
 265 
 266 static const struct snd_kcontrol_new wl1273_controls[] = {
 267         SOC_ENUM_EXT("Codec Mode", wl1273_enum,
 268                      snd_wl1273_get_audio_route, snd_wl1273_set_audio_route),
 269         SOC_ENUM_EXT("Audio Switch", wl1273_audio_enum,
 270                      snd_wl1273_fm_audio_get,  snd_wl1273_fm_audio_put),
 271         SOC_SINGLE_EXT("Volume", 0, 0, WL1273_MAX_VOLUME, 0,
 272                        snd_wl1273_fm_volume_get, snd_wl1273_fm_volume_put),
 273 };
 274 
 275 static const struct snd_soc_dapm_widget wl1273_dapm_widgets[] = {
 276         SND_SOC_DAPM_INPUT("RX"),
 277 
 278         SND_SOC_DAPM_OUTPUT("TX"),
 279 };
 280 
 281 static const struct snd_soc_dapm_route wl1273_dapm_routes[] = {
 282         { "Capture", NULL, "RX" },
 283 
 284         { "TX", NULL, "Playback" },
 285 };
 286 
 287 static int wl1273_startup(struct snd_pcm_substream *substream,
 288                           struct snd_soc_dai *dai)
 289 {
 290         struct snd_soc_component *component = dai->component;
 291         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 292 
 293         switch (wl1273->mode) {
 294         case WL1273_MODE_BT:
 295                 snd_pcm_hw_constraint_single(substream->runtime,
 296                                              SNDRV_PCM_HW_PARAM_RATE, 8000);
 297                 snd_pcm_hw_constraint_single(substream->runtime,
 298                                              SNDRV_PCM_HW_PARAM_CHANNELS, 1);
 299                 break;
 300         case WL1273_MODE_FM_RX:
 301                 if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 302                         pr_err("Cannot play in RX mode.\n");
 303                         return -EINVAL;
 304                 }
 305                 break;
 306         case WL1273_MODE_FM_TX:
 307                 if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 308                         pr_err("Cannot capture in TX mode.\n");
 309                         return -EINVAL;
 310                 }
 311                 break;
 312         default:
 313                 return -EINVAL;
 314                 break;
 315         }
 316 
 317         return 0;
 318 }
 319 
 320 static int wl1273_hw_params(struct snd_pcm_substream *substream,
 321                             struct snd_pcm_hw_params *params,
 322                             struct snd_soc_dai *dai)
 323 {
 324         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(dai->component);
 325         struct wl1273_core *core = wl1273->core;
 326         unsigned int rate, width, r;
 327 
 328         if (params_width(params) != 16) {
 329                 dev_err(dai->dev, "%d bits/sample not supported\n",
 330                         params_width(params));
 331                 return -EINVAL;
 332         }
 333 
 334         rate = params_rate(params);
 335         width =  hw_param_interval(params, SNDRV_PCM_HW_PARAM_SAMPLE_BITS)->min;
 336 
 337         if (wl1273->mode == WL1273_MODE_BT) {
 338                 if (rate != 8000) {
 339                         pr_err("Rate %d not supported.\n", params_rate(params));
 340                         return -EINVAL;
 341                 }
 342 
 343                 if (params_channels(params) != 1) {
 344                         pr_err("Only mono supported.\n");
 345                         return -EINVAL;
 346                 }
 347 
 348                 return 0;
 349         }
 350 
 351         if (wl1273->mode == WL1273_MODE_FM_TX &&
 352             substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
 353                 pr_err("Only playback supported with TX.\n");
 354                 return -EINVAL;
 355         }
 356 
 357         if (wl1273->mode == WL1273_MODE_FM_RX  &&
 358             substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
 359                 pr_err("Only capture supported with RX.\n");
 360                 return -EINVAL;
 361         }
 362 
 363         if (wl1273->mode != WL1273_MODE_FM_RX  &&
 364             wl1273->mode != WL1273_MODE_FM_TX) {
 365                 pr_err("Unexpected mode: %d.\n", wl1273->mode);
 366                 return -EINVAL;
 367         }
 368 
 369         r = snd_wl1273_fm_set_i2s_mode(core, rate, width);
 370         if (r)
 371                 return r;
 372 
 373         wl1273->channels = params_channels(params);
 374         r = snd_wl1273_fm_set_channel_number(core, wl1273->channels);
 375         if (r)
 376                 return r;
 377 
 378         return 0;
 379 }
 380 
 381 static const struct snd_soc_dai_ops wl1273_dai_ops = {
 382         .startup        = wl1273_startup,
 383         .hw_params      = wl1273_hw_params,
 384 };
 385 
 386 static struct snd_soc_dai_driver wl1273_dai = {
 387         .name = "wl1273-fm",
 388         .playback = {
 389                 .stream_name = "Playback",
 390                 .channels_min = 1,
 391                 .channels_max = 2,
 392                 .rates = SNDRV_PCM_RATE_8000_48000,
 393                 .formats = SNDRV_PCM_FMTBIT_S16_LE},
 394         .capture = {
 395                 .stream_name = "Capture",
 396                 .channels_min = 1,
 397                 .channels_max = 2,
 398                 .rates = SNDRV_PCM_RATE_8000_48000,
 399                 .formats = SNDRV_PCM_FMTBIT_S16_LE},
 400         .ops = &wl1273_dai_ops,
 401 };
 402 
 403 /* Audio interface format for the soc_card driver */
 404 int wl1273_get_format(struct snd_soc_component *component, unsigned int *fmt)
 405 {
 406         struct wl1273_priv *wl1273;
 407 
 408         if (component == NULL || fmt == NULL)
 409                 return -EINVAL;
 410 
 411         wl1273 = snd_soc_component_get_drvdata(component);
 412 
 413         switch (wl1273->mode) {
 414         case WL1273_MODE_FM_RX:
 415         case WL1273_MODE_FM_TX:
 416                 *fmt =  SND_SOC_DAIFMT_I2S |
 417                         SND_SOC_DAIFMT_NB_NF |
 418                         SND_SOC_DAIFMT_CBM_CFM;
 419 
 420                 break;
 421         case WL1273_MODE_BT:
 422                 *fmt =  SND_SOC_DAIFMT_DSP_A |
 423                         SND_SOC_DAIFMT_IB_NF |
 424                         SND_SOC_DAIFMT_CBM_CFM;
 425 
 426                 break;
 427         default:
 428                 return -EINVAL;
 429         }
 430 
 431         return 0;
 432 }
 433 EXPORT_SYMBOL_GPL(wl1273_get_format);
 434 
 435 static int wl1273_probe(struct snd_soc_component *component)
 436 {
 437         struct wl1273_core **core = component->dev->platform_data;
 438         struct wl1273_priv *wl1273;
 439 
 440         dev_dbg(component->dev, "%s.\n", __func__);
 441 
 442         if (!core) {
 443                 dev_err(component->dev, "Platform data is missing.\n");
 444                 return -EINVAL;
 445         }
 446 
 447         wl1273 = kzalloc(sizeof(struct wl1273_priv), GFP_KERNEL);
 448         if (!wl1273)
 449                 return -ENOMEM;
 450 
 451         wl1273->mode = WL1273_MODE_BT;
 452         wl1273->core = *core;
 453 
 454         snd_soc_component_set_drvdata(component, wl1273);
 455 
 456         return 0;
 457 }
 458 
 459 static void wl1273_remove(struct snd_soc_component *component)
 460 {
 461         struct wl1273_priv *wl1273 = snd_soc_component_get_drvdata(component);
 462 
 463         dev_dbg(component->dev, "%s\n", __func__);
 464         kfree(wl1273);
 465 }
 466 
 467 static const struct snd_soc_component_driver soc_component_dev_wl1273 = {
 468         .probe                  = wl1273_probe,
 469         .remove                 = wl1273_remove,
 470         .controls               = wl1273_controls,
 471         .num_controls           = ARRAY_SIZE(wl1273_controls),
 472         .dapm_widgets           = wl1273_dapm_widgets,
 473         .num_dapm_widgets       = ARRAY_SIZE(wl1273_dapm_widgets),
 474         .dapm_routes            = wl1273_dapm_routes,
 475         .num_dapm_routes        = ARRAY_SIZE(wl1273_dapm_routes),
 476         .idle_bias_on           = 1,
 477         .use_pmdown_time        = 1,
 478         .endianness             = 1,
 479         .non_legacy_dai_naming  = 1,
 480 };
 481 
 482 static int wl1273_platform_probe(struct platform_device *pdev)
 483 {
 484         return devm_snd_soc_register_component(&pdev->dev,
 485                                       &soc_component_dev_wl1273,
 486                                       &wl1273_dai, 1);
 487 }
 488 
 489 static int wl1273_platform_remove(struct platform_device *pdev)
 490 {
 491         return 0;
 492 }
 493 
 494 MODULE_ALIAS("platform:wl1273-codec");
 495 
 496 static struct platform_driver wl1273_platform_driver = {
 497         .driver         = {
 498                 .name   = "wl1273-codec",
 499         },
 500         .probe          = wl1273_platform_probe,
 501         .remove         = wl1273_platform_remove,
 502 };
 503 
 504 module_platform_driver(wl1273_platform_driver);
 505 
 506 MODULE_AUTHOR("Matti Aaltonen <matti.j.aaltonen@nokia.com>");
 507 MODULE_DESCRIPTION("ASoC WL1273 codec driver");
 508 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */