aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/devicetree/bindings/mfd/arizona.txt62
-rw-r--r--drivers/mfd/arizona-core.c234
-rw-r--r--drivers/mfd/arizona-i2c.c10
-rw-r--r--drivers/mfd/arizona-spi.c10
-rw-r--r--drivers/mfd/arizona.h12
-rw-r--r--drivers/mfd/wm5102-tables.c9
-rw-r--r--drivers/mfd/wm5110-tables.c8
-rw-r--r--include/linux/mfd/arizona/core.h2
-rw-r--r--include/linux/mfd/arizona/pdata.h2
-rw-r--r--include/linux/mfd/arizona/registers.h47
-rw-r--r--sound/soc/codecs/arizona.c7
-rw-r--r--sound/soc/codecs/arizona.h3
-rw-r--r--sound/soc/codecs/wm5102.c205
-rw-r--r--sound/soc/codecs/wm5110.c192
14 files changed, 762 insertions, 41 deletions
diff --git a/Documentation/devicetree/bindings/mfd/arizona.txt b/Documentation/devicetree/bindings/mfd/arizona.txt
new file mode 100644
index 000000000000..0e295c9d8937
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/arizona.txt
@@ -0,0 +1,62 @@
1Wolfson Arizona class audio SoCs
2
3These devices are audio SoCs with extensive digital capabilites and a range
4of analogue I/O.
5
6Required properties:
7
8 - compatible : one of the following chip-specific strings:
9 "wlf,wm5102"
10 "wlf,wm5110"
11 - reg : I2C slave address when connected using I2C, chip select number when
12 using SPI.
13
14 - interrupts : The interrupt line the /IRQ signal for the device is
15 connected to.
16 - interrupt-controller : Arizona class devices contain interrupt controllers
17 and may provide interrupt services to other devices.
18 - interrupt-parent : The parent interrupt controller.
19 - #interrupt-cells: the number of cells to describe an IRQ, this should be 2.
20 The first cell is the IRQ number.
21 The second cell is the flags, encoded as the trigger masks from
22 Documentation/devicetree/bindings/interrupts.txt
23
24 - gpio-controller : Indicates this device is a GPIO controller.
25 - #gpio-cells : Must be 2. The first cell is the pin number and the
26 second cell is used to specify optional parameters (currently unused).
27
28 - AVDD1-supply, DBVDD1-supply, DBVDD2-supply, DBVDD3-supply, CPVDD-supply,
29 SPKVDDL-supply, SPKVDDR-supply : power supplies for the device, as covered
30 in Documentation/devicetree/bindings/regulator/regulator.txt
31
32Optional properties:
33
34 - wlf,reset : GPIO specifier for the GPIO controlling /RESET
35 - wlf,ldoena : GPIO specifier for the GPIO controlling LDOENA
36
37 - wlf,gpio-defaults : A list of GPIO configuration register values. If
38 absent, no configuration of these registers is performed. If any
39 entry has a value that is out of range for a 16 bit register then
40 the chip default will be used. If present exactly five values must
41 be specified.
42
43Example:
44
45codec: wm5102@1a {
46 compatible = "wlf,wm5102";
47 reg = <0x1a>;
48 interrupts = <347>;
49 #interrupt-cells = <2>;
50 interrupt-parent = <&gic>;
51
52 gpio-controller;
53 #gpio-cells = <2>;
54
55 wlf,gpio-defaults = <
56 0x00000000, /* AIF1TXLRCLK */
57 0xffffffff,
58 0xffffffff,
59 0xffffffff,
60 0xffffffff,
61 >;
62};
diff --git a/drivers/mfd/arizona-core.c b/drivers/mfd/arizona-core.c
index 6ab03043fd60..74b4481754fd 100644
--- a/drivers/mfd/arizona-core.c
+++ b/drivers/mfd/arizona-core.c
@@ -16,9 +16,13 @@
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/mfd/core.h> 17#include <linux/mfd/core.h>
18#include <linux/module.h> 18#include <linux/module.h>
19#include <linux/of.h>
20#include <linux/of_device.h>
21#include <linux/of_gpio.h>
19#include <linux/pm_runtime.h> 22#include <linux/pm_runtime.h>
20#include <linux/regmap.h> 23#include <linux/regmap.h>
21#include <linux/regulator/consumer.h> 24#include <linux/regulator/consumer.h>
25#include <linux/regulator/machine.h>
22#include <linux/slab.h> 26#include <linux/slab.h>
23 27
24#include <linux/mfd/arizona/core.h> 28#include <linux/mfd/arizona/core.h>
@@ -344,6 +348,17 @@ static int arizona_runtime_resume(struct device *dev)
344 348
345 switch (arizona->type) { 349 switch (arizona->type) {
346 case WM5102: 350 case WM5102:
351 if (arizona->external_dcvdd) {
352 ret = regmap_update_bits(arizona->regmap,
353 ARIZONA_ISOLATION_CONTROL,
354 ARIZONA_ISOLATE_DCVDD1, 0);
355 if (ret != 0) {
356 dev_err(arizona->dev,
357 "Failed to connect DCVDD: %d\n", ret);
358 goto err;
359 }
360 }
361
347 ret = wm5102_patch(arizona); 362 ret = wm5102_patch(arizona);
348 if (ret != 0) { 363 if (ret != 0) {
349 dev_err(arizona->dev, "Failed to apply patch: %d\n", 364 dev_err(arizona->dev, "Failed to apply patch: %d\n",
@@ -365,6 +380,28 @@ static int arizona_runtime_resume(struct device *dev)
365 goto err; 380 goto err;
366 } 381 }
367 382
383 if (arizona->external_dcvdd) {
384 ret = regmap_update_bits(arizona->regmap,
385 ARIZONA_ISOLATION_CONTROL,
386 ARIZONA_ISOLATE_DCVDD1, 0);
387 if (ret != 0) {
388 dev_err(arizona->dev,
389 "Failed to connect DCVDD: %d\n", ret);
390 goto err;
391 }
392 }
393 break;
394 }
395
396 switch (arizona->type) {
397 case WM5102:
398 ret = wm5102_patch(arizona);
399 if (ret != 0) {
400 dev_err(arizona->dev, "Failed to apply patch: %d\n",
401 ret);
402 goto err;
403 }
404 default:
368 break; 405 break;
369 } 406 }
370 407
@@ -385,9 +422,22 @@ err:
385static int arizona_runtime_suspend(struct device *dev) 422static int arizona_runtime_suspend(struct device *dev)
386{ 423{
387 struct arizona *arizona = dev_get_drvdata(dev); 424 struct arizona *arizona = dev_get_drvdata(dev);
425 int ret;
388 426
389 dev_dbg(arizona->dev, "Entering AoD mode\n"); 427 dev_dbg(arizona->dev, "Entering AoD mode\n");
390 428
429 if (arizona->external_dcvdd) {
430 ret = regmap_update_bits(arizona->regmap,
431 ARIZONA_ISOLATION_CONTROL,
432 ARIZONA_ISOLATE_DCVDD1,
433 ARIZONA_ISOLATE_DCVDD1);
434 if (ret != 0) {
435 dev_err(arizona->dev, "Failed to isolate DCVDD: %d\n",
436 ret);
437 return ret;
438 }
439 }
440
391 regulator_disable(arizona->dcvdd); 441 regulator_disable(arizona->dcvdd);
392 regcache_cache_only(arizona->regmap, true); 442 regcache_cache_only(arizona->regmap, true);
393 regcache_mark_dirty(arizona->regmap); 443 regcache_mark_dirty(arizona->regmap);
@@ -397,6 +447,26 @@ static int arizona_runtime_suspend(struct device *dev)
397#endif 447#endif
398 448
399#ifdef CONFIG_PM_SLEEP 449#ifdef CONFIG_PM_SLEEP
450static int arizona_suspend(struct device *dev)
451{
452 struct arizona *arizona = dev_get_drvdata(dev);
453
454 dev_dbg(arizona->dev, "Suspend, disabling IRQ\n");
455 disable_irq(arizona->irq);
456
457 return 0;
458}
459
460static int arizona_suspend_late(struct device *dev)
461{
462 struct arizona *arizona = dev_get_drvdata(dev);
463
464 dev_dbg(arizona->dev, "Late suspend, reenabling IRQ\n");
465 enable_irq(arizona->irq);
466
467 return 0;
468}
469
400static int arizona_resume_noirq(struct device *dev) 470static int arizona_resume_noirq(struct device *dev)
401{ 471{
402 struct arizona *arizona = dev_get_drvdata(dev); 472 struct arizona *arizona = dev_get_drvdata(dev);
@@ -422,13 +492,78 @@ const struct dev_pm_ops arizona_pm_ops = {
422 SET_RUNTIME_PM_OPS(arizona_runtime_suspend, 492 SET_RUNTIME_PM_OPS(arizona_runtime_suspend,
423 arizona_runtime_resume, 493 arizona_runtime_resume,
424 NULL) 494 NULL)
425 SET_SYSTEM_SLEEP_PM_OPS(NULL, arizona_resume) 495 SET_SYSTEM_SLEEP_PM_OPS(arizona_suspend, arizona_resume)
426#ifdef CONFIG_PM_SLEEP 496#ifdef CONFIG_PM_SLEEP
497 .suspend_late = arizona_suspend_late,
427 .resume_noirq = arizona_resume_noirq, 498 .resume_noirq = arizona_resume_noirq,
428#endif 499#endif
429}; 500};
430EXPORT_SYMBOL_GPL(arizona_pm_ops); 501EXPORT_SYMBOL_GPL(arizona_pm_ops);
431 502
503#ifdef CONFIG_OF
504int arizona_of_get_type(struct device *dev)
505{
506 const struct of_device_id *id = of_match_device(arizona_of_match, dev);
507
508 if (id)
509 return (int)id->data;
510 else
511 return 0;
512}
513EXPORT_SYMBOL_GPL(arizona_of_get_type);
514
515static int arizona_of_get_core_pdata(struct arizona *arizona)
516{
517 int ret, i;
518
519 arizona->pdata.reset = of_get_named_gpio(arizona->dev->of_node,
520 "wlf,reset", 0);
521 if (arizona->pdata.reset < 0)
522 arizona->pdata.reset = 0;
523
524 arizona->pdata.ldoena = of_get_named_gpio(arizona->dev->of_node,
525 "wlf,ldoena", 0);
526 if (arizona->pdata.ldoena < 0)
527 arizona->pdata.ldoena = 0;
528
529 ret = of_property_read_u32_array(arizona->dev->of_node,
530 "wlf,gpio-defaults",
531 arizona->pdata.gpio_defaults,
532 ARRAY_SIZE(arizona->pdata.gpio_defaults));
533 if (ret >= 0) {
534 /*
535 * All values are literal except out of range values
536 * which are chip default, translate into platform
537 * data which uses 0 as chip default and out of range
538 * as zero.
539 */
540 for (i = 0; i < ARRAY_SIZE(arizona->pdata.gpio_defaults); i++) {
541 if (arizona->pdata.gpio_defaults[i] > 0xffff)
542 arizona->pdata.gpio_defaults[i] = 0;
543 if (arizona->pdata.gpio_defaults[i] == 0)
544 arizona->pdata.gpio_defaults[i] = 0x10000;
545 }
546 } else {
547 dev_err(arizona->dev, "Failed to parse GPIO defaults: %d\n",
548 ret);
549 }
550
551 return 0;
552}
553
554const struct of_device_id arizona_of_match[] = {
555 { .compatible = "wlf,wm5102", .data = (void *)WM5102 },
556 { .compatible = "wlf,wm5110", .data = (void *)WM5110 },
557 {},
558};
559EXPORT_SYMBOL_GPL(arizona_of_match);
560#else
561static inline int arizona_of_get_core_pdata(struct arizona *arizona)
562{
563 return 0;
564}
565#endif
566
432static struct mfd_cell early_devs[] = { 567static struct mfd_cell early_devs[] = {
433 { .name = "arizona-ldo1" }, 568 { .name = "arizona-ldo1" },
434}; 569};
@@ -462,6 +597,8 @@ int arizona_dev_init(struct arizona *arizona)
462 dev_set_drvdata(arizona->dev, arizona); 597 dev_set_drvdata(arizona->dev, arizona);
463 mutex_init(&arizona->clk_lock); 598 mutex_init(&arizona->clk_lock);
464 599
600 arizona_of_get_core_pdata(arizona);
601
465 if (dev_get_platdata(arizona->dev)) 602 if (dev_get_platdata(arizona->dev))
466 memcpy(&arizona->pdata, dev_get_platdata(arizona->dev), 603 memcpy(&arizona->pdata, dev_get_platdata(arizona->dev),
467 sizeof(arizona->pdata)); 604 sizeof(arizona->pdata));
@@ -536,51 +673,22 @@ int arizona_dev_init(struct arizona *arizona)
536 673
537 regcache_cache_only(arizona->regmap, false); 674 regcache_cache_only(arizona->regmap, false);
538 675
676 /* Verify that this is a chip we know about */
539 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg); 677 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
540 if (ret != 0) { 678 if (ret != 0) {
541 dev_err(dev, "Failed to read ID register: %d\n", ret); 679 dev_err(dev, "Failed to read ID register: %d\n", ret);
542 goto err_reset; 680 goto err_reset;
543 } 681 }
544 682
545 ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
546 &arizona->rev);
547 if (ret != 0) {
548 dev_err(dev, "Failed to read revision register: %d\n", ret);
549 goto err_reset;
550 }
551 arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
552
553 switch (reg) { 683 switch (reg) {
554#ifdef CONFIG_MFD_WM5102
555 case 0x5102: 684 case 0x5102:
556 type_name = "WM5102";
557 if (arizona->type != WM5102) {
558 dev_err(arizona->dev, "WM5102 registered as %d\n",
559 arizona->type);
560 arizona->type = WM5102;
561 }
562 apply_patch = wm5102_patch;
563 arizona->rev &= 0x7;
564 break;
565#endif
566#ifdef CONFIG_MFD_WM5110
567 case 0x5110: 685 case 0x5110:
568 type_name = "WM5110";
569 if (arizona->type != WM5110) {
570 dev_err(arizona->dev, "WM5110 registered as %d\n",
571 arizona->type);
572 arizona->type = WM5110;
573 }
574 apply_patch = wm5110_patch;
575 break; 686 break;
576#endif
577 default: 687 default:
578 dev_err(arizona->dev, "Unknown device ID %x\n", reg); 688 dev_err(arizona->dev, "Unknown device ID: %x\n", reg);
579 goto err_reset; 689 goto err_reset;
580 } 690 }
581 691
582 dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
583
584 /* If we have a /RESET GPIO we'll already be reset */ 692 /* If we have a /RESET GPIO we'll already be reset */
585 if (!arizona->pdata.reset) { 693 if (!arizona->pdata.reset) {
586 regcache_mark_dirty(arizona->regmap); 694 regcache_mark_dirty(arizona->regmap);
@@ -600,6 +708,7 @@ int arizona_dev_init(struct arizona *arizona)
600 } 708 }
601 } 709 }
602 710
711 /* Ensure device startup is complete */
603 switch (arizona->type) { 712 switch (arizona->type) {
604 case WM5102: 713 case WM5102:
605 ret = regmap_read(arizona->regmap, 0x19, &val); 714 ret = regmap_read(arizona->regmap, 0x19, &val);
@@ -620,6 +729,52 @@ int arizona_dev_init(struct arizona *arizona)
620 break; 729 break;
621 } 730 }
622 731
732 /* Read the device ID information & do device specific stuff */
733 ret = regmap_read(arizona->regmap, ARIZONA_SOFTWARE_RESET, &reg);
734 if (ret != 0) {
735 dev_err(dev, "Failed to read ID register: %d\n", ret);
736 goto err_reset;
737 }
738
739 ret = regmap_read(arizona->regmap, ARIZONA_DEVICE_REVISION,
740 &arizona->rev);
741 if (ret != 0) {
742 dev_err(dev, "Failed to read revision register: %d\n", ret);
743 goto err_reset;
744 }
745 arizona->rev &= ARIZONA_DEVICE_REVISION_MASK;
746
747 switch (reg) {
748#ifdef CONFIG_MFD_WM5102
749 case 0x5102:
750 type_name = "WM5102";
751 if (arizona->type != WM5102) {
752 dev_err(arizona->dev, "WM5102 registered as %d\n",
753 arizona->type);
754 arizona->type = WM5102;
755 }
756 apply_patch = wm5102_patch;
757 arizona->rev &= 0x7;
758 break;
759#endif
760#ifdef CONFIG_MFD_WM5110
761 case 0x5110:
762 type_name = "WM5110";
763 if (arizona->type != WM5110) {
764 dev_err(arizona->dev, "WM5110 registered as %d\n",
765 arizona->type);
766 arizona->type = WM5110;
767 }
768 apply_patch = wm5110_patch;
769 break;
770#endif
771 default:
772 dev_err(arizona->dev, "Unknown device ID %x\n", reg);
773 goto err_reset;
774 }
775
776 dev_info(dev, "%s revision %c\n", type_name, arizona->rev + 'A');
777
623 if (apply_patch) { 778 if (apply_patch) {
624 ret = apply_patch(arizona); 779 ret = apply_patch(arizona);
625 if (ret != 0) { 780 if (ret != 0) {
@@ -651,6 +806,14 @@ int arizona_dev_init(struct arizona *arizona)
651 arizona->pdata.gpio_defaults[i]); 806 arizona->pdata.gpio_defaults[i]);
652 } 807 }
653 808
809 /*
810 * LDO1 can only be used to supply DCVDD so if it has no
811 * consumers then DCVDD is supplied externally.
812 */
813 if (arizona->pdata.ldo1 &&
814 arizona->pdata.ldo1->num_consumer_supplies == 0)
815 arizona->external_dcvdd = true;
816
654 pm_runtime_set_autosuspend_delay(arizona->dev, 100); 817 pm_runtime_set_autosuspend_delay(arizona->dev, 100);
655 pm_runtime_use_autosuspend(arizona->dev); 818 pm_runtime_use_autosuspend(arizona->dev);
656 pm_runtime_enable(arizona->dev); 819 pm_runtime_enable(arizona->dev);
@@ -697,7 +860,7 @@ int arizona_dev_init(struct arizona *arizona)
697 if (arizona->pdata.micbias[i].discharge) 860 if (arizona->pdata.micbias[i].discharge)
698 val |= ARIZONA_MICB1_DISCH; 861 val |= ARIZONA_MICB1_DISCH;
699 862
700 if (arizona->pdata.micbias[i].fast_start) 863 if (arizona->pdata.micbias[i].soft_start)
701 val |= ARIZONA_MICB1_RATE; 864 val |= ARIZONA_MICB1_RATE;
702 865
703 if (arizona->pdata.micbias[i].bypass) 866 if (arizona->pdata.micbias[i].bypass)
@@ -809,6 +972,11 @@ int arizona_dev_exit(struct arizona *arizona)
809 arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona); 972 arizona_free_irq(arizona, ARIZONA_IRQ_CLKGEN_ERR, arizona);
810 pm_runtime_disable(arizona->dev); 973 pm_runtime_disable(arizona->dev);
811 arizona_irq_exit(arizona); 974 arizona_irq_exit(arizona);
975 if (arizona->pdata.reset)
976 gpio_set_value_cansleep(arizona->pdata.reset, 0);
977 regulator_disable(arizona->dcvdd);
978 regulator_bulk_disable(ARRAY_SIZE(arizona->core_supplies),
979 arizona->core_supplies);
812 return 0; 980 return 0;
813} 981}
814EXPORT_SYMBOL_GPL(arizona_dev_exit); 982EXPORT_SYMBOL_GPL(arizona_dev_exit);
diff --git a/drivers/mfd/arizona-i2c.c b/drivers/mfd/arizona-i2c.c
index 44a1bb969841..deb267ebf84e 100644
--- a/drivers/mfd/arizona-i2c.c
+++ b/drivers/mfd/arizona-i2c.c
@@ -27,9 +27,14 @@ static int arizona_i2c_probe(struct i2c_client *i2c,
27{ 27{
28 struct arizona *arizona; 28 struct arizona *arizona;
29 const struct regmap_config *regmap_config; 29 const struct regmap_config *regmap_config;
30 int ret; 30 int ret, type;
31 31
32 switch (id->driver_data) { 32 if (i2c->dev.of_node)
33 type = arizona_of_get_type(&i2c->dev);
34 else
35 type = id->driver_data;
36
37 switch (type) {
33#ifdef CONFIG_MFD_WM5102 38#ifdef CONFIG_MFD_WM5102
34 case WM5102: 39 case WM5102:
35 regmap_config = &wm5102_i2c_regmap; 40 regmap_config = &wm5102_i2c_regmap;
@@ -84,6 +89,7 @@ static struct i2c_driver arizona_i2c_driver = {
84 .name = "arizona", 89 .name = "arizona",
85 .owner = THIS_MODULE, 90 .owner = THIS_MODULE,
86 .pm = &arizona_pm_ops, 91 .pm = &arizona_pm_ops,
92 .of_match_table = of_match_ptr(arizona_of_match),
87 }, 93 },
88 .probe = arizona_i2c_probe, 94 .probe = arizona_i2c_probe,
89 .remove = arizona_i2c_remove, 95 .remove = arizona_i2c_remove,
diff --git a/drivers/mfd/arizona-spi.c b/drivers/mfd/arizona-spi.c
index b57e642d2b4a..47be7b35b5c5 100644
--- a/drivers/mfd/arizona-spi.c
+++ b/drivers/mfd/arizona-spi.c
@@ -27,9 +27,14 @@ static int arizona_spi_probe(struct spi_device *spi)
27 const struct spi_device_id *id = spi_get_device_id(spi); 27 const struct spi_device_id *id = spi_get_device_id(spi);
28 struct arizona *arizona; 28 struct arizona *arizona;
29 const struct regmap_config *regmap_config; 29 const struct regmap_config *regmap_config;
30 int ret; 30 int ret, type;
31 31
32 switch (id->driver_data) { 32 if (spi->dev.of_node)
33 type = arizona_of_get_type(&spi->dev);
34 else
35 type = id->driver_data;
36
37 switch (type) {
33#ifdef CONFIG_MFD_WM5102 38#ifdef CONFIG_MFD_WM5102
34 case WM5102: 39 case WM5102:
35 regmap_config = &wm5102_spi_regmap; 40 regmap_config = &wm5102_spi_regmap;
@@ -84,6 +89,7 @@ static struct spi_driver arizona_spi_driver = {
84 .name = "arizona", 89 .name = "arizona",
85 .owner = THIS_MODULE, 90 .owner = THIS_MODULE,
86 .pm = &arizona_pm_ops, 91 .pm = &arizona_pm_ops,
92 .of_match_table = of_match_ptr(arizona_of_match),
87 }, 93 },
88 .probe = arizona_spi_probe, 94 .probe = arizona_spi_probe,
89 .remove = arizona_spi_remove, 95 .remove = arizona_spi_remove,
diff --git a/drivers/mfd/arizona.h b/drivers/mfd/arizona.h
index 9798ae5da67b..db55d9854a55 100644
--- a/drivers/mfd/arizona.h
+++ b/drivers/mfd/arizona.h
@@ -13,6 +13,7 @@
13#ifndef _WM5102_H 13#ifndef _WM5102_H
14#define _WM5102_H 14#define _WM5102_H
15 15
16#include <linux/of.h>
16#include <linux/regmap.h> 17#include <linux/regmap.h>
17#include <linux/pm.h> 18#include <linux/pm.h>
18 19
@@ -26,6 +27,8 @@ extern const struct regmap_config wm5110_spi_regmap;
26 27
27extern const struct dev_pm_ops arizona_pm_ops; 28extern const struct dev_pm_ops arizona_pm_ops;
28 29
30extern const struct of_device_id arizona_of_match[];
31
29extern const struct regmap_irq_chip wm5102_aod; 32extern const struct regmap_irq_chip wm5102_aod;
30extern const struct regmap_irq_chip wm5102_irq; 33extern const struct regmap_irq_chip wm5102_irq;
31 34
@@ -37,4 +40,13 @@ int arizona_dev_exit(struct arizona *arizona);
37int arizona_irq_init(struct arizona *arizona); 40int arizona_irq_init(struct arizona *arizona);
38int arizona_irq_exit(struct arizona *arizona); 41int arizona_irq_exit(struct arizona *arizona);
39 42
43#ifdef CONFIG_OF
44int arizona_of_get_type(struct device *dev);
45#else
46static inline int arizona_of_get_type(struct device *dev)
47{
48 return 0;
49}
50#endif
51
40#endif 52#endif
diff --git a/drivers/mfd/wm5102-tables.c b/drivers/mfd/wm5102-tables.c
index 155c4a1a6a99..802dd3cb18cf 100644
--- a/drivers/mfd/wm5102-tables.c
+++ b/drivers/mfd/wm5102-tables.c
@@ -65,7 +65,8 @@ static const struct reg_default wm5102_revb_patch[] = {
65 { 0x418, 0xa080 }, 65 { 0x418, 0xa080 },
66 { 0x420, 0xa080 }, 66 { 0x420, 0xa080 },
67 { 0x428, 0xe000 }, 67 { 0x428, 0xe000 },
68 { 0x443, 0xDC1A }, 68 { 0x442, 0x3F0A },
69 { 0x443, 0xDC1F },
69 { 0x4B0, 0x0066 }, 70 { 0x4B0, 0x0066 },
70 { 0x458, 0x000b }, 71 { 0x458, 0x000b },
71 { 0x212, 0x0000 }, 72 { 0x212, 0x0000 },
@@ -424,6 +425,9 @@ static const struct reg_default wm5102_reg_default[] = {
424 { 0x00000435, 0x0180 }, /* R1077 - DAC Digital Volume 5R */ 425 { 0x00000435, 0x0180 }, /* R1077 - DAC Digital Volume 5R */
425 { 0x00000436, 0x0081 }, /* R1078 - DAC Volume Limit 5R */ 426 { 0x00000436, 0x0081 }, /* R1078 - DAC Volume Limit 5R */
426 { 0x00000437, 0x0200 }, /* R1079 - Noise Gate Select 5R */ 427 { 0x00000437, 0x0200 }, /* R1079 - Noise Gate Select 5R */
428 { 0x00000440, 0x8FFF }, /* R1088 - DRE Enable */
429 { 0x00000442, 0x3F0A }, /* R1090 - DRE Control 2 */
430 { 0x00000443, 0xDC1F }, /* R1090 - DRE Control 3 */
427 { 0x00000450, 0x0000 }, /* R1104 - DAC AEC Control 1 */ 431 { 0x00000450, 0x0000 }, /* R1104 - DAC AEC Control 1 */
428 { 0x00000458, 0x000B }, /* R1112 - Noise Gate Control */ 432 { 0x00000458, 0x000B }, /* R1112 - Noise Gate Control */
429 { 0x00000490, 0x0069 }, /* R1168 - PDM SPK1 CTRL 1 */ 433 { 0x00000490, 0x0069 }, /* R1168 - PDM SPK1 CTRL 1 */
@@ -1197,6 +1201,9 @@ static bool wm5102_readable_register(struct device *dev, unsigned int reg)
1197 case ARIZONA_DAC_DIGITAL_VOLUME_5R: 1201 case ARIZONA_DAC_DIGITAL_VOLUME_5R:
1198 case ARIZONA_DAC_VOLUME_LIMIT_5R: 1202 case ARIZONA_DAC_VOLUME_LIMIT_5R:
1199 case ARIZONA_NOISE_GATE_SELECT_5R: 1203 case ARIZONA_NOISE_GATE_SELECT_5R:
1204 case ARIZONA_DRE_ENABLE:
1205 case ARIZONA_DRE_CONTROL_2:
1206 case ARIZONA_DRE_CONTROL_3:
1200 case ARIZONA_DAC_AEC_CONTROL_1: 1207 case ARIZONA_DAC_AEC_CONTROL_1:
1201 case ARIZONA_NOISE_GATE_CONTROL: 1208 case ARIZONA_NOISE_GATE_CONTROL:
1202 case ARIZONA_PDM_SPK1_CTRL_1: 1209 case ARIZONA_PDM_SPK1_CTRL_1:
diff --git a/drivers/mfd/wm5110-tables.c b/drivers/mfd/wm5110-tables.c
index c41599815299..2a7972349159 100644
--- a/drivers/mfd/wm5110-tables.c
+++ b/drivers/mfd/wm5110-tables.c
@@ -2273,18 +2273,22 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
2273 case ARIZONA_DSP1_CLOCKING_1: 2273 case ARIZONA_DSP1_CLOCKING_1:
2274 case ARIZONA_DSP1_STATUS_1: 2274 case ARIZONA_DSP1_STATUS_1:
2275 case ARIZONA_DSP1_STATUS_2: 2275 case ARIZONA_DSP1_STATUS_2:
2276 case ARIZONA_DSP1_STATUS_3:
2276 case ARIZONA_DSP2_CONTROL_1: 2277 case ARIZONA_DSP2_CONTROL_1:
2277 case ARIZONA_DSP2_CLOCKING_1: 2278 case ARIZONA_DSP2_CLOCKING_1:
2278 case ARIZONA_DSP2_STATUS_1: 2279 case ARIZONA_DSP2_STATUS_1:
2279 case ARIZONA_DSP2_STATUS_2: 2280 case ARIZONA_DSP2_STATUS_2:
2281 case ARIZONA_DSP2_STATUS_3:
2280 case ARIZONA_DSP3_CONTROL_1: 2282 case ARIZONA_DSP3_CONTROL_1:
2281 case ARIZONA_DSP3_CLOCKING_1: 2283 case ARIZONA_DSP3_CLOCKING_1:
2282 case ARIZONA_DSP3_STATUS_1: 2284 case ARIZONA_DSP3_STATUS_1:
2283 case ARIZONA_DSP3_STATUS_2: 2285 case ARIZONA_DSP3_STATUS_2:
2286 case ARIZONA_DSP3_STATUS_3:
2284 case ARIZONA_DSP4_CONTROL_1: 2287 case ARIZONA_DSP4_CONTROL_1:
2285 case ARIZONA_DSP4_CLOCKING_1: 2288 case ARIZONA_DSP4_CLOCKING_1:
2286 case ARIZONA_DSP4_STATUS_1: 2289 case ARIZONA_DSP4_STATUS_1:
2287 case ARIZONA_DSP4_STATUS_2: 2290 case ARIZONA_DSP4_STATUS_2:
2291 case ARIZONA_DSP4_STATUS_3:
2288 return true; 2292 return true;
2289 default: 2293 default:
2290 return false; 2294 return false;
@@ -2334,12 +2338,16 @@ static bool wm5110_volatile_register(struct device *dev, unsigned int reg)
2334 case ARIZONA_DSP1_CLOCKING_1: 2338 case ARIZONA_DSP1_CLOCKING_1:
2335 case ARIZONA_DSP1_STATUS_1: 2339 case ARIZONA_DSP1_STATUS_1:
2336 case ARIZONA_DSP1_STATUS_2: 2340 case ARIZONA_DSP1_STATUS_2:
2341 case ARIZONA_DSP1_STATUS_3:
2337 case ARIZONA_DSP2_STATUS_1: 2342 case ARIZONA_DSP2_STATUS_1:
2338 case ARIZONA_DSP2_STATUS_2: 2343 case ARIZONA_DSP2_STATUS_2:
2344 case ARIZONA_DSP2_STATUS_3:
2339 case ARIZONA_DSP3_STATUS_1: 2345 case ARIZONA_DSP3_STATUS_1:
2340 case ARIZONA_DSP3_STATUS_2: 2346 case ARIZONA_DSP3_STATUS_2:
2347 case ARIZONA_DSP3_STATUS_3:
2341 case ARIZONA_DSP4_STATUS_1: 2348 case ARIZONA_DSP4_STATUS_1:
2342 case ARIZONA_DSP4_STATUS_2: 2349 case ARIZONA_DSP4_STATUS_2:
2350 case ARIZONA_DSP4_STATUS_3:
2343 return true; 2351 return true;
2344 default: 2352 default:
2345 return false; 2353 return false;
diff --git a/include/linux/mfd/arizona/core.h b/include/linux/mfd/arizona/core.h
index cc281368dc55..f797bb9b8b56 100644
--- a/include/linux/mfd/arizona/core.h
+++ b/include/linux/mfd/arizona/core.h
@@ -95,6 +95,8 @@ struct arizona {
95 95
96 struct arizona_pdata pdata; 96 struct arizona_pdata pdata;
97 97
98 unsigned int external_dcvdd:1;
99
98 int irq; 100 int irq;
99 struct irq_domain *virq; 101 struct irq_domain *virq;
100 struct regmap_irq_chip_data *aod_irq_chip; 102 struct regmap_irq_chip_data *aod_irq_chip;
diff --git a/include/linux/mfd/arizona/pdata.h b/include/linux/mfd/arizona/pdata.h
index 80dead1f7100..12a5c135c746 100644
--- a/include/linux/mfd/arizona/pdata.h
+++ b/include/linux/mfd/arizona/pdata.h
@@ -77,7 +77,7 @@ struct arizona_micbias {
77 int mV; /** Regulated voltage */ 77 int mV; /** Regulated voltage */
78 unsigned int ext_cap:1; /** External capacitor fitted */ 78 unsigned int ext_cap:1; /** External capacitor fitted */
79 unsigned int discharge:1; /** Actively discharge */ 79 unsigned int discharge:1; /** Actively discharge */
80 unsigned int fast_start:1; /** Enable aggressive startup ramp rate */ 80 unsigned int soft_start:1; /** Disable aggressive startup ramp rate */
81 unsigned int bypass:1; /** Use bypass mode */ 81 unsigned int bypass:1; /** Use bypass mode */
82}; 82};
83 83
diff --git a/include/linux/mfd/arizona/registers.h b/include/linux/mfd/arizona/registers.h
index 715b6ba3d52a..4706d3d46e56 100644
--- a/include/linux/mfd/arizona/registers.h
+++ b/include/linux/mfd/arizona/registers.h
@@ -215,6 +215,9 @@
215#define ARIZONA_DAC_DIGITAL_VOLUME_6R 0x43D 215#define ARIZONA_DAC_DIGITAL_VOLUME_6R 0x43D
216#define ARIZONA_DAC_VOLUME_LIMIT_6R 0x43E 216#define ARIZONA_DAC_VOLUME_LIMIT_6R 0x43E
217#define ARIZONA_NOISE_GATE_SELECT_6R 0x43F 217#define ARIZONA_NOISE_GATE_SELECT_6R 0x43F
218#define ARIZONA_DRE_ENABLE 0x440
219#define ARIZONA_DRE_CONTROL_2 0x442
220#define ARIZONA_DRE_CONTROL_3 0x443
218#define ARIZONA_DAC_AEC_CONTROL_1 0x450 221#define ARIZONA_DAC_AEC_CONTROL_1 0x450
219#define ARIZONA_NOISE_GATE_CONTROL 0x458 222#define ARIZONA_NOISE_GATE_CONTROL 0x458
220#define ARIZONA_PDM_SPK1_CTRL_1 0x490 223#define ARIZONA_PDM_SPK1_CTRL_1 0x490
@@ -1002,6 +1005,7 @@
1002#define ARIZONA_DSP2_CLOCKING_1 0x1201 1005#define ARIZONA_DSP2_CLOCKING_1 0x1201
1003#define ARIZONA_DSP2_STATUS_1 0x1204 1006#define ARIZONA_DSP2_STATUS_1 0x1204
1004#define ARIZONA_DSP2_STATUS_2 0x1205 1007#define ARIZONA_DSP2_STATUS_2 0x1205
1008#define ARIZONA_DSP2_STATUS_3 0x1206
1005#define ARIZONA_DSP2_SCRATCH_0 0x1240 1009#define ARIZONA_DSP2_SCRATCH_0 0x1240
1006#define ARIZONA_DSP2_SCRATCH_1 0x1241 1010#define ARIZONA_DSP2_SCRATCH_1 0x1241
1007#define ARIZONA_DSP2_SCRATCH_2 0x1242 1011#define ARIZONA_DSP2_SCRATCH_2 0x1242
@@ -1010,6 +1014,7 @@
1010#define ARIZONA_DSP3_CLOCKING_1 0x1301 1014#define ARIZONA_DSP3_CLOCKING_1 0x1301
1011#define ARIZONA_DSP3_STATUS_1 0x1304 1015#define ARIZONA_DSP3_STATUS_1 0x1304
1012#define ARIZONA_DSP3_STATUS_2 0x1305 1016#define ARIZONA_DSP3_STATUS_2 0x1305
1017#define ARIZONA_DSP3_STATUS_3 0x1306
1013#define ARIZONA_DSP3_SCRATCH_0 0x1340 1018#define ARIZONA_DSP3_SCRATCH_0 0x1340
1014#define ARIZONA_DSP3_SCRATCH_1 0x1341 1019#define ARIZONA_DSP3_SCRATCH_1 0x1341
1015#define ARIZONA_DSP3_SCRATCH_2 0x1342 1020#define ARIZONA_DSP3_SCRATCH_2 0x1342
@@ -1018,6 +1023,7 @@
1018#define ARIZONA_DSP4_CLOCKING_1 0x1401 1023#define ARIZONA_DSP4_CLOCKING_1 0x1401
1019#define ARIZONA_DSP4_STATUS_1 0x1404 1024#define ARIZONA_DSP4_STATUS_1 0x1404
1020#define ARIZONA_DSP4_STATUS_2 0x1405 1025#define ARIZONA_DSP4_STATUS_2 0x1405
1026#define ARIZONA_DSP4_STATUS_3 0x1406
1021#define ARIZONA_DSP4_SCRATCH_0 0x1440 1027#define ARIZONA_DSP4_SCRATCH_0 0x1440
1022#define ARIZONA_DSP4_SCRATCH_1 0x1441 1028#define ARIZONA_DSP4_SCRATCH_1 0x1441
1023#define ARIZONA_DSP4_SCRATCH_2 0x1442 1029#define ARIZONA_DSP4_SCRATCH_2 0x1442
@@ -3130,6 +3136,47 @@
3130#define ARIZONA_OUT6R_NGATE_SRC_WIDTH 12 /* OUT6R_NGATE_SRC - [11:0] */ 3136#define ARIZONA_OUT6R_NGATE_SRC_WIDTH 12 /* OUT6R_NGATE_SRC - [11:0] */
3131 3137
3132/* 3138/*
3139 * R1088 (0x440) - DRE Enable
3140 */
3141#define ARIZONA_DRE3L_ENA 0x0010 /* DRE3L_ENA */
3142#define ARIZONA_DRE3L_ENA_MASK 0x0010 /* DRE3L_ENA */
3143#define ARIZONA_DRE3L_ENA_SHIFT 4 /* DRE3L_ENA */
3144#define ARIZONA_DRE3L_ENA_WIDTH 1 /* DRE3L_ENA */
3145#define ARIZONA_DRE2R_ENA 0x0008 /* DRE2R_ENA */
3146#define ARIZONA_DRE2R_ENA_MASK 0x0008 /* DRE2R_ENA */
3147#define ARIZONA_DRE2R_ENA_SHIFT 3 /* DRE2R_ENA */
3148#define ARIZONA_DRE2R_ENA_WIDTH 1 /* DRE2R_ENA */
3149#define ARIZONA_DRE2L_ENA 0x0004 /* DRE2L_ENA */
3150#define ARIZONA_DRE2L_ENA_MASK 0x0004 /* DRE2L_ENA */
3151#define ARIZONA_DRE2L_ENA_SHIFT 2 /* DRE2L_ENA */
3152#define ARIZONA_DRE2L_ENA_WIDTH 1 /* DRE2L_ENA */
3153#define ARIZONA_DRE1R_ENA 0x0002 /* DRE1R_ENA */
3154#define ARIZONA_DRE1R_ENA_MASK 0x0002 /* DRE1R_ENA */
3155#define ARIZONA_DRE1R_ENA_SHIFT 1 /* DRE1R_ENA */
3156#define ARIZONA_DRE1R_ENA_WIDTH 1 /* DRE1R_ENA */
3157#define ARIZONA_DRE1L_ENA 0x0001 /* DRE1L_ENA */
3158#define ARIZONA_DRE1L_ENA_MASK 0x0001 /* DRE1L_ENA */
3159#define ARIZONA_DRE1L_ENA_SHIFT 0 /* DRE1L_ENA */
3160#define ARIZONA_DRE1L_ENA_WIDTH 1 /* DRE1L_ENA */
3161
3162/*
3163 * R1090 (0x442) - DRE Control 2
3164 */
3165#define ARIZONA_DRE_T_LOW_MASK 0x3F00 /* DRE_T_LOW - [13:8] */
3166#define ARIZONA_DRE_T_LOW_SHIFT 8 /* DRE_T_LOW - [13:8] */
3167#define ARIZONA_DRE_T_LOW_WIDTH 6 /* DRE_T_LOW - [13:8] */
3168
3169/*
3170 * R1091 (0x443) - DRE Control 3
3171 */
3172#define ARIZONA_DRE_GAIN_SHIFT_MASK 0xC000 /* DRE_GAIN_SHIFT - [15:14] */
3173#define ARIZONA_DRE_GAIN_SHIFT_SHIFT 14 /* DRE_GAIN_SHIFT - [15:14] */
3174#define ARIZONA_DRE_GAIN_SHIFT_WIDTH 2 /* DRE_GAIN_SHIFT - [15:14] */
3175#define ARIZONA_DRE_LOW_LEVEL_ABS_MASK 0x000F /* LOW_LEVEL_ABS - [3:0] */
3176#define ARIZONA_DRE_LOW_LEVEL_ABS_SHIFT 0 /* LOW_LEVEL_ABS - [3:0] */
3177#define ARIZONA_DRE_LOW_LEVEL_ABS_WIDTH 4 /* LOW_LEVEL_ABS - [3:0] */
3178
3179/*
3133 * R1104 (0x450) - DAC AEC Control 1 3180 * R1104 (0x450) - DAC AEC Control 1
3134 */ 3181 */
3135#define ARIZONA_AEC_LOOPBACK_SRC_MASK 0x003C /* AEC_LOOPBACK_SRC - [5:2] */ 3182#define ARIZONA_AEC_LOOPBACK_SRC_MASK 0x003C /* AEC_LOOPBACK_SRC - [5:2] */
diff --git a/sound/soc/codecs/arizona.c b/sound/soc/codecs/arizona.c
index 389f23253831..de625813c0e6 100644
--- a/sound/soc/codecs/arizona.c
+++ b/sound/soc/codecs/arizona.c
@@ -1198,6 +1198,13 @@ const struct snd_soc_dai_ops arizona_dai_ops = {
1198}; 1198};
1199EXPORT_SYMBOL_GPL(arizona_dai_ops); 1199EXPORT_SYMBOL_GPL(arizona_dai_ops);
1200 1200
1201const struct snd_soc_dai_ops arizona_simple_dai_ops = {
1202 .startup = arizona_startup,
1203 .hw_params = arizona_hw_params_rate,
1204 .set_sysclk = arizona_dai_set_sysclk,
1205};
1206EXPORT_SYMBOL_GPL(arizona_simple_dai_ops);
1207
1201int arizona_init_dai(struct arizona_priv *priv, int id) 1208int arizona_init_dai(struct arizona_priv *priv, int id)
1202{ 1209{
1203 struct arizona_dai_priv *dai_priv = &priv->dai[id]; 1210 struct arizona_dai_priv *dai_priv = &priv->dai[id];
diff --git a/sound/soc/codecs/arizona.h b/sound/soc/codecs/arizona.h
index af39f1006427..b60b08ccc1d0 100644
--- a/sound/soc/codecs/arizona.h
+++ b/sound/soc/codecs/arizona.h
@@ -57,7 +57,7 @@
57#define ARIZONA_CLK_98MHZ 5 57#define ARIZONA_CLK_98MHZ 5
58#define ARIZONA_CLK_147MHZ 6 58#define ARIZONA_CLK_147MHZ 6
59 59
60#define ARIZONA_MAX_DAI 4 60#define ARIZONA_MAX_DAI 6
61#define ARIZONA_MAX_ADSP 4 61#define ARIZONA_MAX_ADSP 4
62 62
63struct arizona; 63struct arizona;
@@ -213,6 +213,7 @@ extern int arizona_set_sysclk(struct snd_soc_codec *codec, int clk_id,
213 int source, unsigned int freq, int dir); 213 int source, unsigned int freq, int dir);
214 214
215extern const struct snd_soc_dai_ops arizona_dai_ops; 215extern const struct snd_soc_dai_ops arizona_dai_ops;
216extern const struct snd_soc_dai_ops arizona_simple_dai_ops;
216 217
217#define ARIZONA_FLL_NAME_LEN 20 218#define ARIZONA_FLL_NAME_LEN 20
218 219
diff --git a/sound/soc/codecs/wm5102.c b/sound/soc/codecs/wm5102.c
index 100fdadda56a..282fd232cdf7 100644
--- a/sound/soc/codecs/wm5102.c
+++ b/sound/soc/codecs/wm5102.c
@@ -814,7 +814,20 @@ SOC_DOUBLE_R_TLV("SPKDAT1 Digital Volume", ARIZONA_DAC_DIGITAL_VOLUME_5L,
814 814
815SOC_VALUE_ENUM("HPOUT1 OSR", wm5102_hpout_osr[0]), 815SOC_VALUE_ENUM("HPOUT1 OSR", wm5102_hpout_osr[0]),
816SOC_VALUE_ENUM("HPOUT2 OSR", wm5102_hpout_osr[1]), 816SOC_VALUE_ENUM("HPOUT2 OSR", wm5102_hpout_osr[1]),
817SOC_VALUE_ENUM("HPOUT3 OSR", wm5102_hpout_osr[2]), 817SOC_VALUE_ENUM("EPOUT OSR", wm5102_hpout_osr[2]),
818
819SOC_DOUBLE("HPOUT1 DRE Switch", ARIZONA_DRE_ENABLE,
820 ARIZONA_DRE1L_ENA_SHIFT, ARIZONA_DRE1R_ENA_SHIFT, 1, 0),
821SOC_DOUBLE("HPOUT2 DRE Switch", ARIZONA_DRE_ENABLE,
822 ARIZONA_DRE2L_ENA_SHIFT, ARIZONA_DRE2R_ENA_SHIFT, 1, 0),
823SOC_SINGLE("EPOUT DRE Switch", ARIZONA_DRE_ENABLE,
824 ARIZONA_DRE3L_ENA_SHIFT, 1, 0),
825
826SOC_SINGLE("DRE Threshold", ARIZONA_DRE_CONTROL_2,
827 ARIZONA_DRE_T_LOW_SHIFT, 63, 0),
828
829SOC_SINGLE("DRE Low Level ABS", ARIZONA_DRE_CONTROL_3,
830 ARIZONA_DRE_LOW_LEVEL_ABS_SHIFT, 15, 0),
818 831
819SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp), 832SOC_ENUM("Output Ramp Up", arizona_out_vi_ramp),
820SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp), 833SOC_ENUM("Output Ramp Down", arizona_out_vd_ramp),
@@ -852,6 +865,15 @@ ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
852 865
853ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE), 866ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
854ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), 867ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
868
869ARIZONA_MIXER_CONTROLS("SLIMTX1", ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE),
870ARIZONA_MIXER_CONTROLS("SLIMTX2", ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE),
871ARIZONA_MIXER_CONTROLS("SLIMTX3", ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE),
872ARIZONA_MIXER_CONTROLS("SLIMTX4", ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE),
873ARIZONA_MIXER_CONTROLS("SLIMTX5", ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE),
874ARIZONA_MIXER_CONTROLS("SLIMTX6", ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE),
875ARIZONA_MIXER_CONTROLS("SLIMTX7", ARIZONA_SLIMTX7MIX_INPUT_1_SOURCE),
876ARIZONA_MIXER_CONTROLS("SLIMTX8", ARIZONA_SLIMTX8MIX_INPUT_1_SOURCE),
855}; 877};
856 878
857ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); 879ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
@@ -898,6 +920,15 @@ ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
898ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE); 920ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
899ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE); 921ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
900 922
923ARIZONA_MIXER_ENUMS(SLIMTX1, ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE);
924ARIZONA_MIXER_ENUMS(SLIMTX2, ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE);
925ARIZONA_MIXER_ENUMS(SLIMTX3, ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE);
926ARIZONA_MIXER_ENUMS(SLIMTX4, ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE);
927ARIZONA_MIXER_ENUMS(SLIMTX5, ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE);
928ARIZONA_MIXER_ENUMS(SLIMTX6, ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE);
929ARIZONA_MIXER_ENUMS(SLIMTX7, ARIZONA_SLIMTX7MIX_INPUT_1_SOURCE);
930ARIZONA_MIXER_ENUMS(SLIMTX8, ARIZONA_SLIMTX8MIX_INPUT_1_SOURCE);
931
901ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE); 932ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
902ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE); 933ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
903ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE); 934ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
@@ -1117,6 +1148,56 @@ SND_SOC_DAPM_AIF_IN("AIF3RX1", NULL, 0,
1117SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0, 1148SND_SOC_DAPM_AIF_IN("AIF3RX2", NULL, 0,
1118 ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0), 1149 ARIZONA_AIF3_RX_ENABLES, ARIZONA_AIF3RX2_ENA_SHIFT, 0),
1119 1150
1151SND_SOC_DAPM_AIF_OUT("SLIMTX1", NULL, 0,
1152 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1153 ARIZONA_SLIMTX1_ENA_SHIFT, 0),
1154SND_SOC_DAPM_AIF_OUT("SLIMTX2", NULL, 0,
1155 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1156 ARIZONA_SLIMTX2_ENA_SHIFT, 0),
1157SND_SOC_DAPM_AIF_OUT("SLIMTX3", NULL, 0,
1158 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1159 ARIZONA_SLIMTX3_ENA_SHIFT, 0),
1160SND_SOC_DAPM_AIF_OUT("SLIMTX4", NULL, 0,
1161 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1162 ARIZONA_SLIMTX4_ENA_SHIFT, 0),
1163SND_SOC_DAPM_AIF_OUT("SLIMTX5", NULL, 0,
1164 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1165 ARIZONA_SLIMTX5_ENA_SHIFT, 0),
1166SND_SOC_DAPM_AIF_OUT("SLIMTX6", NULL, 0,
1167 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1168 ARIZONA_SLIMTX6_ENA_SHIFT, 0),
1169SND_SOC_DAPM_AIF_OUT("SLIMTX7", NULL, 0,
1170 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1171 ARIZONA_SLIMTX7_ENA_SHIFT, 0),
1172SND_SOC_DAPM_AIF_OUT("SLIMTX8", NULL, 0,
1173 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
1174 ARIZONA_SLIMTX8_ENA_SHIFT, 0),
1175
1176SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,
1177 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1178 ARIZONA_SLIMRX1_ENA_SHIFT, 0),
1179SND_SOC_DAPM_AIF_IN("SLIMRX2", NULL, 0,
1180 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1181 ARIZONA_SLIMRX2_ENA_SHIFT, 0),
1182SND_SOC_DAPM_AIF_IN("SLIMRX3", NULL, 0,
1183 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1184 ARIZONA_SLIMRX3_ENA_SHIFT, 0),
1185SND_SOC_DAPM_AIF_IN("SLIMRX4", NULL, 0,
1186 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1187 ARIZONA_SLIMRX4_ENA_SHIFT, 0),
1188SND_SOC_DAPM_AIF_IN("SLIMRX5", NULL, 0,
1189 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1190 ARIZONA_SLIMRX5_ENA_SHIFT, 0),
1191SND_SOC_DAPM_AIF_IN("SLIMRX6", NULL, 0,
1192 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1193 ARIZONA_SLIMRX6_ENA_SHIFT, 0),
1194SND_SOC_DAPM_AIF_IN("SLIMRX7", NULL, 0,
1195 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1196 ARIZONA_SLIMRX7_ENA_SHIFT, 0),
1197SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0,
1198 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
1199 ARIZONA_SLIMRX8_ENA_SHIFT, 0),
1200
1120ARIZONA_DSP_WIDGETS(DSP1, "DSP1"), 1201ARIZONA_DSP_WIDGETS(DSP1, "DSP1"),
1121 1202
1122SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1, 1203SND_SOC_DAPM_VALUE_MUX("AEC Loopback", ARIZONA_DAC_AEC_CONTROL_1,
@@ -1189,6 +1270,15 @@ ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
1189ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"), 1270ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
1190ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"), 1271ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
1191 1272
1273ARIZONA_MIXER_WIDGETS(SLIMTX1, "SLIMTX1"),
1274ARIZONA_MIXER_WIDGETS(SLIMTX2, "SLIMTX2"),
1275ARIZONA_MIXER_WIDGETS(SLIMTX3, "SLIMTX3"),
1276ARIZONA_MIXER_WIDGETS(SLIMTX4, "SLIMTX4"),
1277ARIZONA_MIXER_WIDGETS(SLIMTX5, "SLIMTX5"),
1278ARIZONA_MIXER_WIDGETS(SLIMTX6, "SLIMTX6"),
1279ARIZONA_MIXER_WIDGETS(SLIMTX7, "SLIMTX7"),
1280ARIZONA_MIXER_WIDGETS(SLIMTX8, "SLIMTX8"),
1281
1192ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"), 1282ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
1193ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"), 1283ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
1194ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"), 1284ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
@@ -1249,6 +1339,14 @@ SND_SOC_DAPM_OUTPUT("MICSUPP"),
1249 { name, "AIF2RX2", "AIF2RX2" }, \ 1339 { name, "AIF2RX2", "AIF2RX2" }, \
1250 { name, "AIF3RX1", "AIF3RX1" }, \ 1340 { name, "AIF3RX1", "AIF3RX1" }, \
1251 { name, "AIF3RX2", "AIF3RX2" }, \ 1341 { name, "AIF3RX2", "AIF3RX2" }, \
1342 { name, "SLIMRX1", "SLIMRX1" }, \
1343 { name, "SLIMRX2", "SLIMRX2" }, \
1344 { name, "SLIMRX3", "SLIMRX3" }, \
1345 { name, "SLIMRX4", "SLIMRX4" }, \
1346 { name, "SLIMRX5", "SLIMRX5" }, \
1347 { name, "SLIMRX6", "SLIMRX6" }, \
1348 { name, "SLIMRX7", "SLIMRX7" }, \
1349 { name, "SLIMRX8", "SLIMRX8" }, \
1252 { name, "EQ1", "EQ1" }, \ 1350 { name, "EQ1", "EQ1" }, \
1253 { name, "EQ2", "EQ2" }, \ 1351 { name, "EQ2", "EQ2" }, \
1254 { name, "EQ3", "EQ3" }, \ 1352 { name, "EQ3", "EQ3" }, \
@@ -1304,10 +1402,21 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
1304 { "OUT5L", NULL, "SYSCLK" }, 1402 { "OUT5L", NULL, "SYSCLK" },
1305 { "OUT5R", NULL, "SYSCLK" }, 1403 { "OUT5R", NULL, "SYSCLK" },
1306 1404
1405 { "IN1L", NULL, "SYSCLK" },
1406 { "IN1R", NULL, "SYSCLK" },
1407 { "IN2L", NULL, "SYSCLK" },
1408 { "IN2R", NULL, "SYSCLK" },
1409 { "IN3L", NULL, "SYSCLK" },
1410 { "IN3R", NULL, "SYSCLK" },
1411
1307 { "MICBIAS1", NULL, "MICVDD" }, 1412 { "MICBIAS1", NULL, "MICVDD" },
1308 { "MICBIAS2", NULL, "MICVDD" }, 1413 { "MICBIAS2", NULL, "MICVDD" },
1309 { "MICBIAS3", NULL, "MICVDD" }, 1414 { "MICBIAS3", NULL, "MICVDD" },
1310 1415
1416 { "Noise Generator", NULL, "SYSCLK" },
1417 { "Tone Generator 1", NULL, "SYSCLK" },
1418 { "Tone Generator 2", NULL, "SYSCLK" },
1419
1311 { "Noise Generator", NULL, "NOISE" }, 1420 { "Noise Generator", NULL, "NOISE" },
1312 { "Tone Generator 1", NULL, "TONE" }, 1421 { "Tone Generator 1", NULL, "TONE" },
1313 { "Tone Generator 2", NULL, "TONE" }, 1422 { "Tone Generator 2", NULL, "TONE" },
@@ -1345,13 +1454,41 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
1345 { "AIF3RX1", NULL, "AIF3 Playback" }, 1454 { "AIF3RX1", NULL, "AIF3 Playback" },
1346 { "AIF3RX2", NULL, "AIF3 Playback" }, 1455 { "AIF3RX2", NULL, "AIF3 Playback" },
1347 1456
1457 { "Slim1 Capture", NULL, "SLIMTX1" },
1458 { "Slim1 Capture", NULL, "SLIMTX2" },
1459 { "Slim1 Capture", NULL, "SLIMTX3" },
1460 { "Slim1 Capture", NULL, "SLIMTX4" },
1461
1462 { "SLIMRX1", NULL, "Slim1 Playback" },
1463 { "SLIMRX2", NULL, "Slim1 Playback" },
1464 { "SLIMRX3", NULL, "Slim1 Playback" },
1465 { "SLIMRX4", NULL, "Slim1 Playback" },
1466
1467 { "Slim2 Capture", NULL, "SLIMTX5" },
1468 { "Slim2 Capture", NULL, "SLIMTX6" },
1469
1470 { "SLIMRX5", NULL, "Slim2 Playback" },
1471 { "SLIMRX6", NULL, "Slim2 Playback" },
1472
1473 { "Slim3 Capture", NULL, "SLIMTX7" },
1474 { "Slim3 Capture", NULL, "SLIMTX8" },
1475
1476 { "SLIMRX7", NULL, "Slim3 Playback" },
1477 { "SLIMRX8", NULL, "Slim3 Playback" },
1478
1348 { "AIF1 Playback", NULL, "SYSCLK" }, 1479 { "AIF1 Playback", NULL, "SYSCLK" },
1349 { "AIF2 Playback", NULL, "SYSCLK" }, 1480 { "AIF2 Playback", NULL, "SYSCLK" },
1350 { "AIF3 Playback", NULL, "SYSCLK" }, 1481 { "AIF3 Playback", NULL, "SYSCLK" },
1482 { "Slim1 Playback", NULL, "SYSCLK" },
1483 { "Slim2 Playback", NULL, "SYSCLK" },
1484 { "Slim3 Playback", NULL, "SYSCLK" },
1351 1485
1352 { "AIF1 Capture", NULL, "SYSCLK" }, 1486 { "AIF1 Capture", NULL, "SYSCLK" },
1353 { "AIF2 Capture", NULL, "SYSCLK" }, 1487 { "AIF2 Capture", NULL, "SYSCLK" },
1354 { "AIF3 Capture", NULL, "SYSCLK" }, 1488 { "AIF3 Capture", NULL, "SYSCLK" },
1489 { "Slim1 Capture", NULL, "SYSCLK" },
1490 { "Slim2 Capture", NULL, "SYSCLK" },
1491 { "Slim3 Capture", NULL, "SYSCLK" },
1355 1492
1356 { "IN1L PGA", NULL, "IN1L" }, 1493 { "IN1L PGA", NULL, "IN1L" },
1357 { "IN1R PGA", NULL, "IN1R" }, 1494 { "IN1R PGA", NULL, "IN1R" },
@@ -1408,6 +1545,15 @@ static const struct snd_soc_dapm_route wm5102_dapm_routes[] = {
1408 ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"), 1545 ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
1409 ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"), 1546 ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
1410 1547
1548 ARIZONA_MIXER_ROUTES("SLIMTX1", "SLIMTX1"),
1549 ARIZONA_MIXER_ROUTES("SLIMTX2", "SLIMTX2"),
1550 ARIZONA_MIXER_ROUTES("SLIMTX3", "SLIMTX3"),
1551 ARIZONA_MIXER_ROUTES("SLIMTX4", "SLIMTX4"),
1552 ARIZONA_MIXER_ROUTES("SLIMTX5", "SLIMTX5"),
1553 ARIZONA_MIXER_ROUTES("SLIMTX6", "SLIMTX6"),
1554 ARIZONA_MIXER_ROUTES("SLIMTX7", "SLIMTX7"),
1555 ARIZONA_MIXER_ROUTES("SLIMTX8", "SLIMTX8"),
1556
1411 ARIZONA_MIXER_ROUTES("EQ1", "EQ1"), 1557 ARIZONA_MIXER_ROUTES("EQ1", "EQ1"),
1412 ARIZONA_MIXER_ROUTES("EQ2", "EQ2"), 1558 ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
1413 ARIZONA_MIXER_ROUTES("EQ3", "EQ3"), 1559 ARIZONA_MIXER_ROUTES("EQ3", "EQ3"),
@@ -1560,6 +1706,63 @@ static struct snd_soc_dai_driver wm5102_dai[] = {
1560 .ops = &arizona_dai_ops, 1706 .ops = &arizona_dai_ops,
1561 .symmetric_rates = 1, 1707 .symmetric_rates = 1,
1562 }, 1708 },
1709 {
1710 .name = "wm5102-slim1",
1711 .id = 4,
1712 .playback = {
1713 .stream_name = "Slim1 Playback",
1714 .channels_min = 1,
1715 .channels_max = 4,
1716 .rates = WM5102_RATES,
1717 .formats = WM5102_FORMATS,
1718 },
1719 .capture = {
1720 .stream_name = "Slim1 Capture",
1721 .channels_min = 1,
1722 .channels_max = 4,
1723 .rates = WM5102_RATES,
1724 .formats = WM5102_FORMATS,
1725 },
1726 .ops = &arizona_simple_dai_ops,
1727 },
1728 {
1729 .name = "wm5102-slim2",
1730 .id = 5,
1731 .playback = {
1732 .stream_name = "Slim2 Playback",
1733 .channels_min = 1,
1734 .channels_max = 2,
1735 .rates = WM5102_RATES,
1736 .formats = WM5102_FORMATS,
1737 },
1738 .capture = {
1739 .stream_name = "Slim2 Capture",
1740 .channels_min = 1,
1741 .channels_max = 2,
1742 .rates = WM5102_RATES,
1743 .formats = WM5102_FORMATS,
1744 },
1745 .ops = &arizona_simple_dai_ops,
1746 },
1747 {
1748 .name = "wm5102-slim3",
1749 .id = 6,
1750 .playback = {
1751 .stream_name = "Slim3 Playback",
1752 .channels_min = 1,
1753 .channels_max = 2,
1754 .rates = WM5102_RATES,
1755 .formats = WM5102_FORMATS,
1756 },
1757 .capture = {
1758 .stream_name = "Slim3 Capture",
1759 .channels_min = 1,
1760 .channels_max = 2,
1761 .rates = WM5102_RATES,
1762 .formats = WM5102_FORMATS,
1763 },
1764 .ops = &arizona_simple_dai_ops,
1765 },
1563}; 1766};
1564 1767
1565static int wm5102_codec_probe(struct snd_soc_codec *codec) 1768static int wm5102_codec_probe(struct snd_soc_codec *codec)
diff --git a/sound/soc/codecs/wm5110.c b/sound/soc/codecs/wm5110.c
index 88ad7db52dde..2e7cb4ba161a 100644
--- a/sound/soc/codecs/wm5110.c
+++ b/sound/soc/codecs/wm5110.c
@@ -309,6 +309,15 @@ ARIZONA_MIXER_CONTROLS("AIF2TX2", ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE),
309 309
310ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE), 310ARIZONA_MIXER_CONTROLS("AIF3TX1", ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE),
311ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE), 311ARIZONA_MIXER_CONTROLS("AIF3TX2", ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE),
312
313ARIZONA_MIXER_CONTROLS("SLIMTX1", ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE),
314ARIZONA_MIXER_CONTROLS("SLIMTX2", ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE),
315ARIZONA_MIXER_CONTROLS("SLIMTX3", ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE),
316ARIZONA_MIXER_CONTROLS("SLIMTX4", ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE),
317ARIZONA_MIXER_CONTROLS("SLIMTX5", ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE),
318ARIZONA_MIXER_CONTROLS("SLIMTX6", ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE),
319ARIZONA_MIXER_CONTROLS("SLIMTX7", ARIZONA_SLIMTX7MIX_INPUT_1_SOURCE),
320ARIZONA_MIXER_CONTROLS("SLIMTX8", ARIZONA_SLIMTX8MIX_INPUT_1_SOURCE),
312}; 321};
313 322
314ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE); 323ARIZONA_MIXER_ENUMS(EQ1, ARIZONA_EQ1MIX_INPUT_1_SOURCE);
@@ -360,6 +369,15 @@ ARIZONA_MIXER_ENUMS(AIF2TX2, ARIZONA_AIF2TX2MIX_INPUT_1_SOURCE);
360ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE); 369ARIZONA_MIXER_ENUMS(AIF3TX1, ARIZONA_AIF3TX1MIX_INPUT_1_SOURCE);
361ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE); 370ARIZONA_MIXER_ENUMS(AIF3TX2, ARIZONA_AIF3TX2MIX_INPUT_1_SOURCE);
362 371
372ARIZONA_MIXER_ENUMS(SLIMTX1, ARIZONA_SLIMTX1MIX_INPUT_1_SOURCE);
373ARIZONA_MIXER_ENUMS(SLIMTX2, ARIZONA_SLIMTX2MIX_INPUT_1_SOURCE);
374ARIZONA_MIXER_ENUMS(SLIMTX3, ARIZONA_SLIMTX3MIX_INPUT_1_SOURCE);
375ARIZONA_MIXER_ENUMS(SLIMTX4, ARIZONA_SLIMTX4MIX_INPUT_1_SOURCE);
376ARIZONA_MIXER_ENUMS(SLIMTX5, ARIZONA_SLIMTX5MIX_INPUT_1_SOURCE);
377ARIZONA_MIXER_ENUMS(SLIMTX6, ARIZONA_SLIMTX6MIX_INPUT_1_SOURCE);
378ARIZONA_MIXER_ENUMS(SLIMTX7, ARIZONA_SLIMTX7MIX_INPUT_1_SOURCE);
379ARIZONA_MIXER_ENUMS(SLIMTX8, ARIZONA_SLIMTX8MIX_INPUT_1_SOURCE);
380
363ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE); 381ARIZONA_MUX_ENUMS(ASRC1L, ARIZONA_ASRC1LMIX_INPUT_1_SOURCE);
364ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE); 382ARIZONA_MUX_ENUMS(ASRC1R, ARIZONA_ASRC1RMIX_INPUT_1_SOURCE);
365ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE); 383ARIZONA_MUX_ENUMS(ASRC2L, ARIZONA_ASRC2LMIX_INPUT_1_SOURCE);
@@ -550,6 +568,56 @@ SND_SOC_DAPM_AIF_IN("AIF2RX1", NULL, 0,
550SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0, 568SND_SOC_DAPM_AIF_IN("AIF2RX2", NULL, 0,
551 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0), 569 ARIZONA_AIF2_RX_ENABLES, ARIZONA_AIF2RX2_ENA_SHIFT, 0),
552 570
571SND_SOC_DAPM_AIF_IN("SLIMRX1", NULL, 0,
572 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
573 ARIZONA_SLIMRX1_ENA_SHIFT, 0),
574SND_SOC_DAPM_AIF_IN("SLIMRX2", NULL, 0,
575 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
576 ARIZONA_SLIMRX2_ENA_SHIFT, 0),
577SND_SOC_DAPM_AIF_IN("SLIMRX3", NULL, 0,
578 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
579 ARIZONA_SLIMRX3_ENA_SHIFT, 0),
580SND_SOC_DAPM_AIF_IN("SLIMRX4", NULL, 0,
581 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
582 ARIZONA_SLIMRX4_ENA_SHIFT, 0),
583SND_SOC_DAPM_AIF_IN("SLIMRX5", NULL, 0,
584 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
585 ARIZONA_SLIMRX5_ENA_SHIFT, 0),
586SND_SOC_DAPM_AIF_IN("SLIMRX6", NULL, 0,
587 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
588 ARIZONA_SLIMRX6_ENA_SHIFT, 0),
589SND_SOC_DAPM_AIF_IN("SLIMRX7", NULL, 0,
590 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
591 ARIZONA_SLIMRX7_ENA_SHIFT, 0),
592SND_SOC_DAPM_AIF_IN("SLIMRX8", NULL, 0,
593 ARIZONA_SLIMBUS_RX_CHANNEL_ENABLE,
594 ARIZONA_SLIMRX8_ENA_SHIFT, 0),
595
596SND_SOC_DAPM_AIF_OUT("SLIMTX1", NULL, 0,
597 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
598 ARIZONA_SLIMTX1_ENA_SHIFT, 0),
599SND_SOC_DAPM_AIF_OUT("SLIMTX2", NULL, 0,
600 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
601 ARIZONA_SLIMTX2_ENA_SHIFT, 0),
602SND_SOC_DAPM_AIF_OUT("SLIMTX3", NULL, 0,
603 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
604 ARIZONA_SLIMTX3_ENA_SHIFT, 0),
605SND_SOC_DAPM_AIF_OUT("SLIMTX4", NULL, 0,
606 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
607 ARIZONA_SLIMTX4_ENA_SHIFT, 0),
608SND_SOC_DAPM_AIF_OUT("SLIMTX5", NULL, 0,
609 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
610 ARIZONA_SLIMTX5_ENA_SHIFT, 0),
611SND_SOC_DAPM_AIF_OUT("SLIMTX6", NULL, 0,
612 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
613 ARIZONA_SLIMTX6_ENA_SHIFT, 0),
614SND_SOC_DAPM_AIF_OUT("SLIMTX7", NULL, 0,
615 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
616 ARIZONA_SLIMTX7_ENA_SHIFT, 0),
617SND_SOC_DAPM_AIF_OUT("SLIMTX8", NULL, 0,
618 ARIZONA_SLIMBUS_TX_CHANNEL_ENABLE,
619 ARIZONA_SLIMTX8_ENA_SHIFT, 0),
620
553SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0, 621SND_SOC_DAPM_AIF_OUT("AIF3TX1", NULL, 0,
554 ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0), 622 ARIZONA_AIF3_TX_ENABLES, ARIZONA_AIF3TX1_ENA_SHIFT, 0),
555SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 0, 623SND_SOC_DAPM_AIF_OUT("AIF3TX2", NULL, 0,
@@ -640,6 +708,15 @@ ARIZONA_MIXER_WIDGETS(AIF2TX2, "AIF2TX2"),
640ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"), 708ARIZONA_MIXER_WIDGETS(AIF3TX1, "AIF3TX1"),
641ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"), 709ARIZONA_MIXER_WIDGETS(AIF3TX2, "AIF3TX2"),
642 710
711ARIZONA_MIXER_WIDGETS(SLIMTX1, "SLIMTX1"),
712ARIZONA_MIXER_WIDGETS(SLIMTX2, "SLIMTX2"),
713ARIZONA_MIXER_WIDGETS(SLIMTX3, "SLIMTX3"),
714ARIZONA_MIXER_WIDGETS(SLIMTX4, "SLIMTX4"),
715ARIZONA_MIXER_WIDGETS(SLIMTX5, "SLIMTX5"),
716ARIZONA_MIXER_WIDGETS(SLIMTX6, "SLIMTX6"),
717ARIZONA_MIXER_WIDGETS(SLIMTX7, "SLIMTX7"),
718ARIZONA_MIXER_WIDGETS(SLIMTX8, "SLIMTX8"),
719
643ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"), 720ARIZONA_MUX_WIDGETS(ASRC1L, "ASRC1L"),
644ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"), 721ARIZONA_MUX_WIDGETS(ASRC1R, "ASRC1R"),
645ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"), 722ARIZONA_MUX_WIDGETS(ASRC2L, "ASRC2L"),
@@ -690,6 +767,14 @@ SND_SOC_DAPM_OUTPUT("MICSUPP"),
690 { name, "AIF2RX2", "AIF2RX2" }, \ 767 { name, "AIF2RX2", "AIF2RX2" }, \
691 { name, "AIF3RX1", "AIF3RX1" }, \ 768 { name, "AIF3RX1", "AIF3RX1" }, \
692 { name, "AIF3RX2", "AIF3RX2" }, \ 769 { name, "AIF3RX2", "AIF3RX2" }, \
770 { name, "SLIMRX1", "SLIMRX1" }, \
771 { name, "SLIMRX2", "SLIMRX2" }, \
772 { name, "SLIMRX3", "SLIMRX3" }, \
773 { name, "SLIMRX4", "SLIMRX4" }, \
774 { name, "SLIMRX5", "SLIMRX5" }, \
775 { name, "SLIMRX6", "SLIMRX6" }, \
776 { name, "SLIMRX7", "SLIMRX7" }, \
777 { name, "SLIMRX8", "SLIMRX8" }, \
693 { name, "EQ1", "EQ1" }, \ 778 { name, "EQ1", "EQ1" }, \
694 { name, "EQ2", "EQ2" }, \ 779 { name, "EQ2", "EQ2" }, \
695 { name, "EQ3", "EQ3" }, \ 780 { name, "EQ3", "EQ3" }, \
@@ -736,10 +821,23 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
736 { "OUT6L", NULL, "SYSCLK" }, 821 { "OUT6L", NULL, "SYSCLK" },
737 { "OUT6R", NULL, "SYSCLK" }, 822 { "OUT6R", NULL, "SYSCLK" },
738 823
824 { "IN1L", NULL, "SYSCLK" },
825 { "IN1R", NULL, "SYSCLK" },
826 { "IN2L", NULL, "SYSCLK" },
827 { "IN2R", NULL, "SYSCLK" },
828 { "IN3L", NULL, "SYSCLK" },
829 { "IN3R", NULL, "SYSCLK" },
830 { "IN4L", NULL, "SYSCLK" },
831 { "IN4R", NULL, "SYSCLK" },
832
739 { "MICBIAS1", NULL, "MICVDD" }, 833 { "MICBIAS1", NULL, "MICVDD" },
740 { "MICBIAS2", NULL, "MICVDD" }, 834 { "MICBIAS2", NULL, "MICVDD" },
741 { "MICBIAS3", NULL, "MICVDD" }, 835 { "MICBIAS3", NULL, "MICVDD" },
742 836
837 { "Noise Generator", NULL, "SYSCLK" },
838 { "Tone Generator 1", NULL, "SYSCLK" },
839 { "Tone Generator 2", NULL, "SYSCLK" },
840
743 { "Noise Generator", NULL, "NOISE" }, 841 { "Noise Generator", NULL, "NOISE" },
744 { "Tone Generator 1", NULL, "TONE" }, 842 { "Tone Generator 1", NULL, "TONE" },
745 { "Tone Generator 2", NULL, "TONE" }, 843 { "Tone Generator 2", NULL, "TONE" },
@@ -777,13 +875,41 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
777 { "AIF3RX1", NULL, "AIF3 Playback" }, 875 { "AIF3RX1", NULL, "AIF3 Playback" },
778 { "AIF3RX2", NULL, "AIF3 Playback" }, 876 { "AIF3RX2", NULL, "AIF3 Playback" },
779 877
878 { "Slim1 Capture", NULL, "SLIMTX1" },
879 { "Slim1 Capture", NULL, "SLIMTX2" },
880 { "Slim1 Capture", NULL, "SLIMTX3" },
881 { "Slim1 Capture", NULL, "SLIMTX4" },
882
883 { "SLIMRX1", NULL, "Slim1 Playback" },
884 { "SLIMRX2", NULL, "Slim1 Playback" },
885 { "SLIMRX3", NULL, "Slim1 Playback" },
886 { "SLIMRX4", NULL, "Slim1 Playback" },
887
888 { "Slim2 Capture", NULL, "SLIMTX5" },
889 { "Slim2 Capture", NULL, "SLIMTX6" },
890
891 { "SLIMRX5", NULL, "Slim2 Playback" },
892 { "SLIMRX6", NULL, "Slim2 Playback" },
893
894 { "Slim3 Capture", NULL, "SLIMTX7" },
895 { "Slim3 Capture", NULL, "SLIMTX8" },
896
897 { "SLIMRX7", NULL, "Slim3 Playback" },
898 { "SLIMRX8", NULL, "Slim3 Playback" },
899
780 { "AIF1 Playback", NULL, "SYSCLK" }, 900 { "AIF1 Playback", NULL, "SYSCLK" },
781 { "AIF2 Playback", NULL, "SYSCLK" }, 901 { "AIF2 Playback", NULL, "SYSCLK" },
782 { "AIF3 Playback", NULL, "SYSCLK" }, 902 { "AIF3 Playback", NULL, "SYSCLK" },
903 { "Slim1 Playback", NULL, "SYSCLK" },
904 { "Slim2 Playback", NULL, "SYSCLK" },
905 { "Slim3 Playback", NULL, "SYSCLK" },
783 906
784 { "AIF1 Capture", NULL, "SYSCLK" }, 907 { "AIF1 Capture", NULL, "SYSCLK" },
785 { "AIF2 Capture", NULL, "SYSCLK" }, 908 { "AIF2 Capture", NULL, "SYSCLK" },
786 { "AIF3 Capture", NULL, "SYSCLK" }, 909 { "AIF3 Capture", NULL, "SYSCLK" },
910 { "Slim1 Capture", NULL, "SYSCLK" },
911 { "Slim2 Capture", NULL, "SYSCLK" },
912 { "Slim3 Capture", NULL, "SYSCLK" },
787 913
788 { "IN1L PGA", NULL, "IN1L" }, 914 { "IN1L PGA", NULL, "IN1L" },
789 { "IN1R PGA", NULL, "IN1R" }, 915 { "IN1R PGA", NULL, "IN1R" },
@@ -829,6 +955,15 @@ static const struct snd_soc_dapm_route wm5110_dapm_routes[] = {
829 ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"), 955 ARIZONA_MIXER_ROUTES("AIF3TX1", "AIF3TX1"),
830 ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"), 956 ARIZONA_MIXER_ROUTES("AIF3TX2", "AIF3TX2"),
831 957
958 ARIZONA_MIXER_ROUTES("SLIMTX1", "SLIMTX1"),
959 ARIZONA_MIXER_ROUTES("SLIMTX2", "SLIMTX2"),
960 ARIZONA_MIXER_ROUTES("SLIMTX3", "SLIMTX3"),
961 ARIZONA_MIXER_ROUTES("SLIMTX4", "SLIMTX4"),
962 ARIZONA_MIXER_ROUTES("SLIMTX5", "SLIMTX5"),
963 ARIZONA_MIXER_ROUTES("SLIMTX6", "SLIMTX6"),
964 ARIZONA_MIXER_ROUTES("SLIMTX7", "SLIMTX7"),
965 ARIZONA_MIXER_ROUTES("SLIMTX8", "SLIMTX8"),
966
832 ARIZONA_MIXER_ROUTES("EQ1", "EQ1"), 967 ARIZONA_MIXER_ROUTES("EQ1", "EQ1"),
833 ARIZONA_MIXER_ROUTES("EQ2", "EQ2"), 968 ARIZONA_MIXER_ROUTES("EQ2", "EQ2"),
834 ARIZONA_MIXER_ROUTES("EQ3", "EQ3"), 969 ARIZONA_MIXER_ROUTES("EQ3", "EQ3"),
@@ -963,6 +1098,63 @@ static struct snd_soc_dai_driver wm5110_dai[] = {
963 .ops = &arizona_dai_ops, 1098 .ops = &arizona_dai_ops,
964 .symmetric_rates = 1, 1099 .symmetric_rates = 1,
965 }, 1100 },
1101 {
1102 .name = "wm5110-slim1",
1103 .id = 4,
1104 .playback = {
1105 .stream_name = "Slim1 Playback",
1106 .channels_min = 1,
1107 .channels_max = 4,
1108 .rates = WM5110_RATES,
1109 .formats = WM5110_FORMATS,
1110 },
1111 .capture = {
1112 .stream_name = "Slim1 Capture",
1113 .channels_min = 1,
1114 .channels_max = 4,
1115 .rates = WM5110_RATES,
1116 .formats = WM5110_FORMATS,
1117 },
1118 .ops = &arizona_simple_dai_ops,
1119 },
1120 {
1121 .name = "wm5110-slim2",
1122 .id = 5,
1123 .playback = {
1124 .stream_name = "Slim2 Playback",
1125 .channels_min = 1,
1126 .channels_max = 2,
1127 .rates = WM5110_RATES,
1128 .formats = WM5110_FORMATS,
1129 },
1130 .capture = {
1131 .stream_name = "Slim2 Capture",
1132 .channels_min = 1,
1133 .channels_max = 2,
1134 .rates = WM5110_RATES,
1135 .formats = WM5110_FORMATS,
1136 },
1137 .ops = &arizona_simple_dai_ops,
1138 },
1139 {
1140 .name = "wm5110-slim3",
1141 .id = 6,
1142 .playback = {
1143 .stream_name = "Slim3 Playback",
1144 .channels_min = 1,
1145 .channels_max = 2,
1146 .rates = WM5110_RATES,
1147 .formats = WM5110_FORMATS,
1148 },
1149 .capture = {
1150 .stream_name = "Slim3 Capture",
1151 .channels_min = 1,
1152 .channels_max = 2,
1153 .rates = WM5110_RATES,
1154 .formats = WM5110_FORMATS,
1155 },
1156 .ops = &arizona_simple_dai_ops,
1157 },
966}; 1158};
967 1159
968static int wm5110_codec_probe(struct snd_soc_codec *codec) 1160static int wm5110_codec_probe(struct snd_soc_codec *codec)