diff options
| -rw-r--r-- | sound/soc/blackfin/Kconfig | 3 | ||||
| -rw-r--r-- | sound/soc/codecs/Kconfig | 11 | ||||
| -rw-r--r-- | sound/soc/codecs/Makefile | 4 | ||||
| -rw-r--r-- | sound/soc/codecs/ad193x-i2c.c | 54 | ||||
| -rw-r--r-- | sound/soc/codecs/ad193x-spi.c | 48 | ||||
| -rw-r--r-- | sound/soc/codecs/ad193x.c | 140 | ||||
| -rw-r--r-- | sound/soc/codecs/ad193x.h | 7 |
7 files changed, 140 insertions, 127 deletions
diff --git a/sound/soc/blackfin/Kconfig b/sound/soc/blackfin/Kconfig index 54f74f8cbb75..359136777c4d 100644 --- a/sound/soc/blackfin/Kconfig +++ b/sound/soc/blackfin/Kconfig | |||
| @@ -68,7 +68,8 @@ config SND_BF5XX_SOC_AD193X | |||
| 68 | tristate "SoC AD193X Audio support for Blackfin" | 68 | tristate "SoC AD193X Audio support for Blackfin" |
| 69 | depends on SND_BF5XX_I2S | 69 | depends on SND_BF5XX_I2S |
| 70 | select SND_BF5XX_SOC_I2S | 70 | select SND_BF5XX_SOC_I2S |
| 71 | select SND_SOC_AD193X | 71 | select SND_SOC_AD193X_I2C if I2C |
| 72 | select SND_SOC_AD193X_SPI if SPI_MASTER | ||
| 72 | help | 73 | help |
| 73 | Say Y if you want to add support for AD193X codec on Blackfin. | 74 | Say Y if you want to add support for AD193X codec on Blackfin. |
| 74 | This driver supports AD1936, AD1937, AD1938 and AD1939. | 75 | This driver supports AD1936, AD1937, AD1938 and AD1939. |
diff --git a/sound/soc/codecs/Kconfig b/sound/soc/codecs/Kconfig index 983d087aa92a..d7da6191fc55 100644 --- a/sound/soc/codecs/Kconfig +++ b/sound/soc/codecs/Kconfig | |||
| @@ -16,7 +16,8 @@ config SND_SOC_ALL_CODECS | |||
| 16 | select SND_SOC_AB8500_CODEC if ABX500_CORE | 16 | select SND_SOC_AB8500_CODEC if ABX500_CORE |
| 17 | select SND_SOC_AC97_CODEC if SND_SOC_AC97_BUS | 17 | select SND_SOC_AC97_CODEC if SND_SOC_AC97_BUS |
| 18 | select SND_SOC_AD1836 if SPI_MASTER | 18 | select SND_SOC_AD1836 if SPI_MASTER |
| 19 | select SND_SOC_AD193X if SND_SOC_I2C_AND_SPI | 19 | select SND_SOC_AD193X_SPI if SPI_MASTER |
| 20 | select SND_SOC_AD193X_I2C if I2C | ||
| 20 | select SND_SOC_AD1980 if SND_SOC_AC97_BUS | 21 | select SND_SOC_AD1980 if SND_SOC_AC97_BUS |
| 21 | select SND_SOC_AD73311 | 22 | select SND_SOC_AD73311 |
| 22 | select SND_SOC_ADAU1373 if I2C | 23 | select SND_SOC_ADAU1373 if I2C |
| @@ -182,6 +183,14 @@ config SND_SOC_AD1836 | |||
| 182 | config SND_SOC_AD193X | 183 | config SND_SOC_AD193X |
| 183 | tristate | 184 | tristate |
| 184 | 185 | ||
| 186 | config SND_SOC_AD193X_SPI | ||
| 187 | tristate | ||
| 188 | select SND_SOC_AD193X | ||
| 189 | |||
| 190 | config SND_SOC_AD193X_I2C | ||
| 191 | tristate | ||
| 192 | select SND_SOC_AD193X | ||
| 193 | |||
| 185 | config SND_SOC_AD1980 | 194 | config SND_SOC_AD1980 |
| 186 | tristate | 195 | tristate |
| 187 | 196 | ||
diff --git a/sound/soc/codecs/Makefile b/sound/soc/codecs/Makefile index bc126764a44d..7795e37d313f 100644 --- a/sound/soc/codecs/Makefile +++ b/sound/soc/codecs/Makefile | |||
| @@ -3,6 +3,8 @@ snd-soc-ab8500-codec-objs := ab8500-codec.o | |||
| 3 | snd-soc-ac97-objs := ac97.o | 3 | snd-soc-ac97-objs := ac97.o |
| 4 | snd-soc-ad1836-objs := ad1836.o | 4 | snd-soc-ad1836-objs := ad1836.o |
| 5 | snd-soc-ad193x-objs := ad193x.o | 5 | snd-soc-ad193x-objs := ad193x.o |
| 6 | snd-soc-ad193x-spi-objs := ad193x-spi.o | ||
| 7 | snd-soc-ad193x-i2c-objs := ad193x-i2c.o | ||
| 6 | snd-soc-ad1980-objs := ad1980.o | 8 | snd-soc-ad1980-objs := ad1980.o |
| 7 | snd-soc-ad73311-objs := ad73311.o | 9 | snd-soc-ad73311-objs := ad73311.o |
| 8 | snd-soc-adau1701-objs := adau1701.o | 10 | snd-soc-adau1701-objs := adau1701.o |
| @@ -134,6 +136,8 @@ obj-$(CONFIG_SND_SOC_AB8500_CODEC) += snd-soc-ab8500-codec.o | |||
| 134 | obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o | 136 | obj-$(CONFIG_SND_SOC_AC97_CODEC) += snd-soc-ac97.o |
| 135 | obj-$(CONFIG_SND_SOC_AD1836) += snd-soc-ad1836.o | 137 | obj-$(CONFIG_SND_SOC_AD1836) += snd-soc-ad1836.o |
| 136 | obj-$(CONFIG_SND_SOC_AD193X) += snd-soc-ad193x.o | 138 | obj-$(CONFIG_SND_SOC_AD193X) += snd-soc-ad193x.o |
| 139 | obj-$(CONFIG_SND_SOC_AD193X_SPI) += snd-soc-ad193x-spi.o | ||
| 140 | obj-$(CONFIG_SND_SOC_AD193X_I2C) += snd-soc-ad193x-i2c.o | ||
| 137 | obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o | 141 | obj-$(CONFIG_SND_SOC_AD1980) += snd-soc-ad1980.o |
| 138 | obj-$(CONFIG_SND_SOC_AD73311) += snd-soc-ad73311.o | 142 | obj-$(CONFIG_SND_SOC_AD73311) += snd-soc-ad73311.o |
| 139 | obj-$(CONFIG_SND_SOC_ADAU1373) += snd-soc-adau1373.o | 143 | obj-$(CONFIG_SND_SOC_ADAU1373) += snd-soc-adau1373.o |
diff --git a/sound/soc/codecs/ad193x-i2c.c b/sound/soc/codecs/ad193x-i2c.c new file mode 100644 index 000000000000..df3a1a415825 --- /dev/null +++ b/sound/soc/codecs/ad193x-i2c.c | |||
| @@ -0,0 +1,54 @@ | |||
| 1 | /* | ||
| 2 | * AD1936/AD1937 audio driver | ||
| 3 | * | ||
| 4 | * Copyright 2014 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/module.h> | ||
| 10 | #include <linux/i2c.h> | ||
| 11 | #include <linux/regmap.h> | ||
| 12 | |||
| 13 | #include <sound/soc.h> | ||
| 14 | |||
| 15 | #include "ad193x.h" | ||
| 16 | |||
| 17 | static const struct i2c_device_id ad193x_id[] = { | ||
| 18 | { "ad1936", 0 }, | ||
| 19 | { "ad1937", 0 }, | ||
| 20 | { } | ||
| 21 | }; | ||
| 22 | MODULE_DEVICE_TABLE(i2c, ad193x_id); | ||
| 23 | |||
| 24 | static int ad193x_i2c_probe(struct i2c_client *client, | ||
| 25 | const struct i2c_device_id *id) | ||
| 26 | { | ||
| 27 | struct regmap_config config; | ||
| 28 | |||
| 29 | config = ad193x_regmap_config; | ||
| 30 | config.val_bits = 8; | ||
| 31 | config.reg_bits = 8; | ||
| 32 | |||
| 33 | return ad193x_probe(&client->dev, devm_regmap_init_i2c(client, &config)); | ||
| 34 | } | ||
| 35 | |||
| 36 | static int ad193x_i2c_remove(struct i2c_client *client) | ||
| 37 | { | ||
| 38 | snd_soc_unregister_codec(&client->dev); | ||
| 39 | return 0; | ||
| 40 | } | ||
| 41 | |||
| 42 | static struct i2c_driver ad193x_i2c_driver = { | ||
| 43 | .driver = { | ||
| 44 | .name = "ad193x", | ||
| 45 | }, | ||
| 46 | .probe = ad193x_i2c_probe, | ||
| 47 | .remove = ad193x_i2c_remove, | ||
| 48 | .id_table = ad193x_id, | ||
| 49 | }; | ||
| 50 | module_i2c_driver(ad193x_i2c_driver); | ||
| 51 | |||
| 52 | MODULE_DESCRIPTION("ASoC AD1936/AD1937 audio CODEC driver"); | ||
| 53 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); | ||
| 54 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/ad193x-spi.c b/sound/soc/codecs/ad193x-spi.c new file mode 100644 index 000000000000..390cef9b9dc2 --- /dev/null +++ b/sound/soc/codecs/ad193x-spi.c | |||
| @@ -0,0 +1,48 @@ | |||
| 1 | /* | ||
| 2 | * AD1938/AD1939 audio driver | ||
| 3 | * | ||
| 4 | * Copyright 2014 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #include <linux/module.h> | ||
| 10 | #include <linux/spi/spi.h> | ||
| 11 | #include <linux/regmap.h> | ||
| 12 | |||
| 13 | #include <sound/soc.h> | ||
| 14 | |||
| 15 | #include "ad193x.h" | ||
| 16 | |||
| 17 | static int ad193x_spi_probe(struct spi_device *spi) | ||
| 18 | { | ||
| 19 | struct regmap_config config; | ||
| 20 | |||
| 21 | config = ad193x_regmap_config; | ||
| 22 | config.val_bits = 8; | ||
| 23 | config.reg_bits = 16; | ||
| 24 | config.read_flag_mask = 0x09; | ||
| 25 | config.write_flag_mask = 0x08; | ||
| 26 | |||
| 27 | return ad193x_probe(&spi->dev, devm_regmap_init_spi(spi, &config)); | ||
| 28 | } | ||
| 29 | |||
| 30 | static int ad193x_spi_remove(struct spi_device *spi) | ||
| 31 | { | ||
| 32 | snd_soc_unregister_codec(&spi->dev); | ||
| 33 | return 0; | ||
| 34 | } | ||
| 35 | |||
| 36 | static struct spi_driver ad193x_spi_driver = { | ||
| 37 | .driver = { | ||
| 38 | .name = "ad193x", | ||
| 39 | .owner = THIS_MODULE, | ||
| 40 | }, | ||
| 41 | .probe = ad193x_spi_probe, | ||
| 42 | .remove = ad193x_spi_remove, | ||
| 43 | }; | ||
| 44 | module_spi_driver(ad193x_spi_driver); | ||
| 45 | |||
| 46 | MODULE_DESCRIPTION("ASoC AD1938/AD1939 audio CODEC driver"); | ||
| 47 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); | ||
| 48 | MODULE_LICENSE("GPL"); | ||
diff --git a/sound/soc/codecs/ad193x.c b/sound/soc/codecs/ad193x.c index 5a42dca535b7..f644a34a28de 100644 --- a/sound/soc/codecs/ad193x.c +++ b/sound/soc/codecs/ad193x.c | |||
| @@ -6,12 +6,10 @@ | |||
| 6 | * Licensed under the GPL-2 or later. | 6 | * Licensed under the GPL-2 or later. |
| 7 | */ | 7 | */ |
| 8 | 8 | ||
| 9 | #include <linux/init.h> | ||
| 10 | #include <linux/module.h> | 9 | #include <linux/module.h> |
| 11 | #include <linux/kernel.h> | 10 | #include <linux/kernel.h> |
| 12 | #include <linux/device.h> | 11 | #include <linux/device.h> |
| 13 | #include <linux/i2c.h> | 12 | #include <linux/regmap.h> |
| 14 | #include <linux/spi/spi.h> | ||
| 15 | #include <linux/slab.h> | 13 | #include <linux/slab.h> |
| 16 | #include <sound/core.h> | 14 | #include <sound/core.h> |
| 17 | #include <sound/pcm.h> | 15 | #include <sound/pcm.h> |
| @@ -19,6 +17,7 @@ | |||
| 19 | #include <sound/initval.h> | 17 | #include <sound/initval.h> |
| 20 | #include <sound/soc.h> | 18 | #include <sound/soc.h> |
| 21 | #include <sound/tlv.h> | 19 | #include <sound/tlv.h> |
| 20 | |||
| 22 | #include "ad193x.h" | 21 | #include "ad193x.h" |
| 23 | 22 | ||
| 24 | /* codec private data */ | 23 | /* codec private data */ |
| @@ -320,7 +319,7 @@ static struct snd_soc_dai_driver ad193x_dai = { | |||
| 320 | .ops = &ad193x_dai_ops, | 319 | .ops = &ad193x_dai_ops, |
| 321 | }; | 320 | }; |
| 322 | 321 | ||
| 323 | static int ad193x_probe(struct snd_soc_codec *codec) | 322 | static int ad193x_codec_probe(struct snd_soc_codec *codec) |
| 324 | { | 323 | { |
| 325 | struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); | 324 | struct ad193x_priv *ad193x = snd_soc_codec_get_drvdata(codec); |
| 326 | int ret; | 325 | int ret; |
| @@ -352,7 +351,7 @@ static int ad193x_probe(struct snd_soc_codec *codec) | |||
| 352 | } | 351 | } |
| 353 | 352 | ||
| 354 | static struct snd_soc_codec_driver soc_codec_dev_ad193x = { | 353 | static struct snd_soc_codec_driver soc_codec_dev_ad193x = { |
| 355 | .probe = ad193x_probe, | 354 | .probe = ad193x_codec_probe, |
| 356 | .controls = ad193x_snd_controls, | 355 | .controls = ad193x_snd_controls, |
| 357 | .num_controls = ARRAY_SIZE(ad193x_snd_controls), | 356 | .num_controls = ARRAY_SIZE(ad193x_snd_controls), |
| 358 | .dapm_widgets = ad193x_dapm_widgets, | 357 | .dapm_widgets = ad193x_dapm_widgets, |
| @@ -366,140 +365,31 @@ static bool adau193x_reg_volatile(struct device *dev, unsigned int reg) | |||
| 366 | return false; | 365 | return false; |
| 367 | } | 366 | } |
| 368 | 367 | ||
| 369 | #if defined(CONFIG_SPI_MASTER) | 368 | const struct regmap_config ad193x_regmap_config = { |
| 370 | |||
| 371 | static const struct regmap_config ad193x_spi_regmap_config = { | ||
| 372 | .val_bits = 8, | ||
| 373 | .reg_bits = 16, | ||
| 374 | .read_flag_mask = 0x09, | ||
| 375 | .write_flag_mask = 0x08, | ||
| 376 | |||
| 377 | .max_register = AD193X_NUM_REGS - 1, | 369 | .max_register = AD193X_NUM_REGS - 1, |
| 378 | .volatile_reg = adau193x_reg_volatile, | 370 | .volatile_reg = adau193x_reg_volatile, |
| 379 | }; | 371 | }; |
| 372 | EXPORT_SYMBOL_GPL(ad193x_regmap_config); | ||
| 380 | 373 | ||
| 381 | static int ad193x_spi_probe(struct spi_device *spi) | 374 | int ad193x_probe(struct device *dev, struct regmap *regmap) |
| 382 | { | 375 | { |
| 383 | struct ad193x_priv *ad193x; | 376 | struct ad193x_priv *ad193x; |
| 384 | 377 | ||
| 385 | ad193x = devm_kzalloc(&spi->dev, sizeof(struct ad193x_priv), | 378 | if (IS_ERR(regmap)) |
| 386 | GFP_KERNEL); | 379 | return PTR_ERR(regmap); |
| 387 | if (ad193x == NULL) | ||
| 388 | return -ENOMEM; | ||
| 389 | |||
| 390 | ad193x->regmap = devm_regmap_init_spi(spi, &ad193x_spi_regmap_config); | ||
| 391 | if (IS_ERR(ad193x->regmap)) | ||
| 392 | return PTR_ERR(ad193x->regmap); | ||
| 393 | |||
| 394 | spi_set_drvdata(spi, ad193x); | ||
| 395 | |||
| 396 | return snd_soc_register_codec(&spi->dev, &soc_codec_dev_ad193x, | ||
| 397 | &ad193x_dai, 1); | ||
| 398 | } | ||
| 399 | |||
| 400 | static int ad193x_spi_remove(struct spi_device *spi) | ||
| 401 | { | ||
| 402 | snd_soc_unregister_codec(&spi->dev); | ||
| 403 | return 0; | ||
| 404 | } | ||
| 405 | |||
| 406 | static struct spi_driver ad193x_spi_driver = { | ||
| 407 | .driver = { | ||
| 408 | .name = "ad193x", | ||
| 409 | .owner = THIS_MODULE, | ||
| 410 | }, | ||
| 411 | .probe = ad193x_spi_probe, | ||
| 412 | .remove = ad193x_spi_remove, | ||
| 413 | }; | ||
| 414 | #endif | ||
| 415 | |||
| 416 | #if IS_ENABLED(CONFIG_I2C) | ||
| 417 | |||
| 418 | static const struct regmap_config ad193x_i2c_regmap_config = { | ||
| 419 | .val_bits = 8, | ||
| 420 | .reg_bits = 8, | ||
| 421 | |||
| 422 | .max_register = AD193X_NUM_REGS - 1, | ||
| 423 | .volatile_reg = adau193x_reg_volatile, | ||
| 424 | }; | ||
| 425 | |||
| 426 | static const struct i2c_device_id ad193x_id[] = { | ||
| 427 | { "ad1936", 0 }, | ||
| 428 | { "ad1937", 0 }, | ||
| 429 | { } | ||
| 430 | }; | ||
| 431 | MODULE_DEVICE_TABLE(i2c, ad193x_id); | ||
| 432 | 380 | ||
| 433 | static int ad193x_i2c_probe(struct i2c_client *client, | 381 | ad193x = devm_kzalloc(dev, sizeof(*ad193x), GFP_KERNEL); |
| 434 | const struct i2c_device_id *id) | ||
| 435 | { | ||
| 436 | struct ad193x_priv *ad193x; | ||
| 437 | |||
| 438 | ad193x = devm_kzalloc(&client->dev, sizeof(struct ad193x_priv), | ||
| 439 | GFP_KERNEL); | ||
| 440 | if (ad193x == NULL) | 382 | if (ad193x == NULL) |
| 441 | return -ENOMEM; | 383 | return -ENOMEM; |
| 442 | 384 | ||
| 443 | ad193x->regmap = devm_regmap_init_i2c(client, &ad193x_i2c_regmap_config); | 385 | ad193x->regmap = regmap; |
| 444 | if (IS_ERR(ad193x->regmap)) | ||
| 445 | return PTR_ERR(ad193x->regmap); | ||
| 446 | |||
| 447 | i2c_set_clientdata(client, ad193x); | ||
| 448 | |||
| 449 | return snd_soc_register_codec(&client->dev, &soc_codec_dev_ad193x, | ||
| 450 | &ad193x_dai, 1); | ||
| 451 | } | ||
| 452 | |||
| 453 | static int ad193x_i2c_remove(struct i2c_client *client) | ||
| 454 | { | ||
| 455 | snd_soc_unregister_codec(&client->dev); | ||
| 456 | return 0; | ||
| 457 | } | ||
| 458 | 386 | ||
| 459 | static struct i2c_driver ad193x_i2c_driver = { | 387 | dev_set_drvdata(dev, ad193x); |
| 460 | .driver = { | ||
| 461 | .name = "ad193x", | ||
| 462 | }, | ||
| 463 | .probe = ad193x_i2c_probe, | ||
| 464 | .remove = ad193x_i2c_remove, | ||
| 465 | .id_table = ad193x_id, | ||
| 466 | }; | ||
| 467 | #endif | ||
| 468 | |||
| 469 | static int __init ad193x_modinit(void) | ||
| 470 | { | ||
| 471 | int ret; | ||
| 472 | |||
| 473 | #if IS_ENABLED(CONFIG_I2C) | ||
| 474 | ret = i2c_add_driver(&ad193x_i2c_driver); | ||
| 475 | if (ret != 0) { | ||
| 476 | printk(KERN_ERR "Failed to register AD193X I2C driver: %d\n", | ||
| 477 | ret); | ||
| 478 | } | ||
| 479 | #endif | ||
| 480 | |||
| 481 | #if defined(CONFIG_SPI_MASTER) | ||
| 482 | ret = spi_register_driver(&ad193x_spi_driver); | ||
| 483 | if (ret != 0) { | ||
| 484 | printk(KERN_ERR "Failed to register AD193X SPI driver: %d\n", | ||
| 485 | ret); | ||
| 486 | } | ||
| 487 | #endif | ||
| 488 | return ret; | ||
| 489 | } | ||
| 490 | module_init(ad193x_modinit); | ||
| 491 | |||
| 492 | static void __exit ad193x_modexit(void) | ||
| 493 | { | ||
| 494 | #if defined(CONFIG_SPI_MASTER) | ||
| 495 | spi_unregister_driver(&ad193x_spi_driver); | ||
| 496 | #endif | ||
| 497 | 388 | ||
| 498 | #if IS_ENABLED(CONFIG_I2C) | 389 | return snd_soc_register_codec(dev, &soc_codec_dev_ad193x, |
| 499 | i2c_del_driver(&ad193x_i2c_driver); | 390 | &ad193x_dai, 1); |
| 500 | #endif | ||
| 501 | } | 391 | } |
| 502 | module_exit(ad193x_modexit); | 392 | EXPORT_SYMBOL_GPL(ad193x_probe); |
| 503 | 393 | ||
| 504 | MODULE_DESCRIPTION("ASoC ad193x driver"); | 394 | MODULE_DESCRIPTION("ASoC ad193x driver"); |
| 505 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); | 395 | MODULE_AUTHOR("Barry Song <21cnbao@gmail.com>"); |
diff --git a/sound/soc/codecs/ad193x.h b/sound/soc/codecs/ad193x.h index 473388049992..ab9a998f15be 100644 --- a/sound/soc/codecs/ad193x.h +++ b/sound/soc/codecs/ad193x.h | |||
| @@ -9,6 +9,13 @@ | |||
| 9 | #ifndef __AD193X_H__ | 9 | #ifndef __AD193X_H__ |
| 10 | #define __AD193X_H__ | 10 | #define __AD193X_H__ |
| 11 | 11 | ||
| 12 | #include <linux/regmap.h> | ||
| 13 | |||
| 14 | struct device; | ||
| 15 | |||
| 16 | extern const struct regmap_config ad193x_regmap_config; | ||
| 17 | int ad193x_probe(struct device *dev, struct regmap *regmap); | ||
| 18 | |||
| 12 | #define AD193X_PLL_CLK_CTRL0 0x00 | 19 | #define AD193X_PLL_CLK_CTRL0 0x00 |
| 13 | #define AD193X_PLL_POWERDOWN 0x01 | 20 | #define AD193X_PLL_POWERDOWN 0x01 |
| 14 | #define AD193X_PLL_INPUT_MASK 0x6 | 21 | #define AD193X_PLL_INPUT_MASK 0x6 |
