aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2019-01-14 13:24:36 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2019-01-14 13:24:36 -0500
commit9deb9e1637761cc4e6df5104a34197ef0bae1358 (patch)
treebdde775e7893fc00b800ba916fac3ddcd5c78bd2
parent3a73e73a10a791344587103a1adbe0c5f02fedeb (diff)
parent3f2d347e851ef4464dea49504cde85e5eef67b2d (diff)
Merge tag 'mfd-next-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd
Pull MFD updates from Lee Jones: "New Device Support - Add support for Power Supply to AXP813 - Add support for GPIO, ADC, AC and Battery Power Supply to AXP803 - Add support for UART to Exynos LPASS Fix-ups: - Use supplied MACROS; ti_am335x_tscadc - Trivial spelling/whitespace/alignment; tmio, axp20x, rave-sp - Regmap changes; bd9571mwv, wm5110-tables - Kconfig dependencies; MFD_AT91_USART - Supply shared data for child-devices; madera-core - Use new of_node_name_eq() API call; max77620, stmpe - Use managed resources (devm_*); tps65218 - Comment descriptions; ingenic-tcu - Coding style; madera-core Bug Fixes: - Fix section mismatches; twl-core, db8500-prcmu - Correct error path related issues; mt6397-core, ab8500-core, mc13xxx-core - IRQ related fixes; tps6586x - Ensure proper initialisation sequence; qcom_rpm - Repair potential memory leak; cros_ec_dev" * tag 'mfd-next-4.21' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (25 commits) mfd: exynos-lpass: Enable UART module support mfd: mc13xxx: Fix a missing check of a register-read failure mfd: cros_ec: Add commands to control codec mfd: madera: Remove spurious semicolon in while loop mfd: rave-sp: Fix typo in rave_sp_checksum comment mfd: ingenic-tcu: Fix bit field description in header mfd: tps65218: Use devm_regmap_add_irq_chip and clean up error path in probe() mfd: Use of_node_name_eq() for node name comparisons mfd: cros_ec_dev: Add missing mfd_remove_devices() call in remove mfd: axp20x: Add supported cells for AXP803 mfd: axp20x: Re-align MFD cell entries mfd: axp20x: Add AC power supply cell for AXP813 mfd: wm5110: Add missing ASRC rate register mfd: qcom_rpm: write fw_version to CTRL_REG mfd: tps6586x: Handle interrupts on suspend mfd: madera: Add shared data for accessory detection mfd: at91-usart: Add platform dependency mfd: bd9571mwv: Add volatile register to make DVFS work mfd: ab8500-core: Return zero in get_register_interruptible() mfd: tmio: Typo s/use use/use/ ...
-rw-r--r--drivers/iio/adc/ti_am335x_adc.c5
-rw-r--r--drivers/mfd/Kconfig1
-rw-r--r--drivers/mfd/ab8500-core.c2
-rw-r--r--drivers/mfd/axp20x.c126
-rw-r--r--drivers/mfd/bd9571mwv.c1
-rw-r--r--drivers/mfd/cros_ec_dev.c1
-rw-r--r--drivers/mfd/db8500-prcmu.c4
-rw-r--r--drivers/mfd/exynos-lpass.c4
-rw-r--r--drivers/mfd/madera-core.c5
-rw-r--r--drivers/mfd/max77620.c2
-rw-r--r--drivers/mfd/mc13xxx-core.c4
-rw-r--r--drivers/mfd/mt6397-core.c3
-rw-r--r--drivers/mfd/qcom_rpm.c4
-rw-r--r--drivers/mfd/rave-sp.c2
-rw-r--r--drivers/mfd/stmpe.c12
-rw-r--r--drivers/mfd/ti_am335x_tscadc.c5
-rw-r--r--drivers/mfd/tps65218.c24
-rw-r--r--drivers/mfd/tps6586x.c24
-rw-r--r--drivers/mfd/twl-core.c4
-rw-r--r--drivers/mfd/wm5110-tables.c2
-rw-r--r--include/linux/mfd/cros_ec_commands.h94
-rw-r--r--include/linux/mfd/ingenic-tcu.h2
-rw-r--r--include/linux/mfd/madera/core.h7
-rw-r--r--include/linux/mfd/ti_am335x_tscadc.h4
-rw-r--r--include/linux/mfd/tmio.h2
25 files changed, 244 insertions, 100 deletions
diff --git a/drivers/iio/adc/ti_am335x_adc.c b/drivers/iio/adc/ti_am335x_adc.c
index cafb1dcadc48..9d984f2a8ba7 100644
--- a/drivers/iio/adc/ti_am335x_adc.c
+++ b/drivers/iio/adc/ti_am335x_adc.c
@@ -142,7 +142,10 @@ static void tiadc_step_config(struct iio_dev *indio_dev)
142 stepconfig |= STEPCONFIG_MODE_SWCNT; 142 stepconfig |= STEPCONFIG_MODE_SWCNT;
143 143
144 tiadc_writel(adc_dev, REG_STEPCONFIG(steps), 144 tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
145 stepconfig | STEPCONFIG_INP(chan)); 145 stepconfig | STEPCONFIG_INP(chan) |
146 STEPCONFIG_INM_ADCREFM |
147 STEPCONFIG_RFP_VREFP |
148 STEPCONFIG_RFM_VREFN);
146 149
147 if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK) { 150 if (adc_dev->open_delay[i] > STEPDELAY_OPEN_MASK) {
148 dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n", 151 dev_warn(dev, "chan %d open delay truncating to 0x3FFFF\n",
diff --git a/drivers/mfd/Kconfig b/drivers/mfd/Kconfig
index 8c5dfdce4326..f461460a2aeb 100644
--- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig
@@ -102,6 +102,7 @@ config MFD_AAT2870_CORE
102config MFD_AT91_USART 102config MFD_AT91_USART
103 tristate "AT91 USART Driver" 103 tristate "AT91 USART Driver"
104 select MFD_CORE 104 select MFD_CORE
105 depends on ARCH_AT91 || COMPILE_TEST
105 help 106 help
106 Select this to get support for AT91 USART IP. This is a wrapper 107 Select this to get support for AT91 USART IP. This is a wrapper
107 over at91-usart-serial driver and usart-spi-driver. Only one function 108 over at91-usart-serial driver and usart-spi-driver. Only one function
diff --git a/drivers/mfd/ab8500-core.c b/drivers/mfd/ab8500-core.c
index 30d09d177171..11ab17f64c64 100644
--- a/drivers/mfd/ab8500-core.c
+++ b/drivers/mfd/ab8500-core.c
@@ -261,7 +261,7 @@ static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
261 mutex_unlock(&ab8500->lock); 261 mutex_unlock(&ab8500->lock);
262 dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret); 262 dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
263 263
264 return ret; 264 return (ret < 0) ? ret : 0;
265} 265}
266 266
267static int ab8500_get_register(struct device *dev, u8 bank, 267static int ab8500_get_register(struct device *dev, u8 bank,
diff --git a/drivers/mfd/axp20x.c b/drivers/mfd/axp20x.c
index e1450a56fc07..3c97f2c0fdfe 100644
--- a/drivers/mfd/axp20x.c
+++ b/drivers/mfd/axp20x.c
@@ -641,9 +641,9 @@ static const struct mfd_cell axp221_cells[] = {
641 641
642static const struct mfd_cell axp223_cells[] = { 642static const struct mfd_cell axp223_cells[] = {
643 { 643 {
644 .name = "axp221-pek", 644 .name = "axp221-pek",
645 .num_resources = ARRAY_SIZE(axp22x_pek_resources), 645 .num_resources = ARRAY_SIZE(axp22x_pek_resources),
646 .resources = axp22x_pek_resources, 646 .resources = axp22x_pek_resources,
647 }, { 647 }, {
648 .name = "axp22x-adc", 648 .name = "axp22x-adc",
649 .of_compatible = "x-powers,axp221-adc", 649 .of_compatible = "x-powers,axp221-adc",
@@ -651,7 +651,7 @@ static const struct mfd_cell axp223_cells[] = {
651 .name = "axp20x-battery-power-supply", 651 .name = "axp20x-battery-power-supply",
652 .of_compatible = "x-powers,axp221-battery-power-supply", 652 .of_compatible = "x-powers,axp221-battery-power-supply",
653 }, { 653 }, {
654 .name = "axp20x-regulator", 654 .name = "axp20x-regulator",
655 }, { 655 }, {
656 .name = "axp20x-ac-power-supply", 656 .name = "axp20x-ac-power-supply",
657 .of_compatible = "x-powers,axp221-ac-power-supply", 657 .of_compatible = "x-powers,axp221-ac-power-supply",
@@ -667,9 +667,9 @@ static const struct mfd_cell axp223_cells[] = {
667 667
668static const struct mfd_cell axp152_cells[] = { 668static const struct mfd_cell axp152_cells[] = {
669 { 669 {
670 .name = "axp20x-pek", 670 .name = "axp20x-pek",
671 .num_resources = ARRAY_SIZE(axp152_pek_resources), 671 .num_resources = ARRAY_SIZE(axp152_pek_resources),
672 .resources = axp152_pek_resources, 672 .resources = axp152_pek_resources,
673 }, 673 },
674}; 674};
675 675
@@ -698,87 +698,101 @@ static const struct resource axp288_charger_resources[] = {
698 698
699static const struct mfd_cell axp288_cells[] = { 699static const struct mfd_cell axp288_cells[] = {
700 { 700 {
701 .name = "axp288_adc", 701 .name = "axp288_adc",
702 .num_resources = ARRAY_SIZE(axp288_adc_resources), 702 .num_resources = ARRAY_SIZE(axp288_adc_resources),
703 .resources = axp288_adc_resources, 703 .resources = axp288_adc_resources,
704 }, 704 }, {
705 { 705 .name = "axp288_extcon",
706 .name = "axp288_extcon", 706 .num_resources = ARRAY_SIZE(axp288_extcon_resources),
707 .num_resources = ARRAY_SIZE(axp288_extcon_resources), 707 .resources = axp288_extcon_resources,
708 .resources = axp288_extcon_resources, 708 }, {
709 }, 709 .name = "axp288_charger",
710 { 710 .num_resources = ARRAY_SIZE(axp288_charger_resources),
711 .name = "axp288_charger", 711 .resources = axp288_charger_resources,
712 .num_resources = ARRAY_SIZE(axp288_charger_resources), 712 }, {
713 .resources = axp288_charger_resources, 713 .name = "axp288_fuel_gauge",
714 }, 714 .num_resources = ARRAY_SIZE(axp288_fuel_gauge_resources),
715 { 715 .resources = axp288_fuel_gauge_resources,
716 .name = "axp288_fuel_gauge", 716 }, {
717 .num_resources = ARRAY_SIZE(axp288_fuel_gauge_resources), 717 .name = "axp221-pek",
718 .resources = axp288_fuel_gauge_resources, 718 .num_resources = ARRAY_SIZE(axp288_power_button_resources),
719 }, 719 .resources = axp288_power_button_resources,
720 { 720 }, {
721 .name = "axp221-pek", 721 .name = "axp288_pmic_acpi",
722 .num_resources = ARRAY_SIZE(axp288_power_button_resources),
723 .resources = axp288_power_button_resources,
724 },
725 {
726 .name = "axp288_pmic_acpi",
727 }, 722 },
728}; 723};
729 724
730static const struct mfd_cell axp803_cells[] = { 725static const struct mfd_cell axp803_cells[] = {
731 { 726 {
732 .name = "axp221-pek", 727 .name = "axp221-pek",
733 .num_resources = ARRAY_SIZE(axp803_pek_resources), 728 .num_resources = ARRAY_SIZE(axp803_pek_resources),
734 .resources = axp803_pek_resources, 729 .resources = axp803_pek_resources,
730 }, {
731 .name = "axp20x-gpio",
732 .of_compatible = "x-powers,axp813-gpio",
733 }, {
734 .name = "axp813-adc",
735 .of_compatible = "x-powers,axp813-adc",
736 }, {
737 .name = "axp20x-battery-power-supply",
738 .of_compatible = "x-powers,axp813-battery-power-supply",
739 }, {
740 .name = "axp20x-ac-power-supply",
741 .of_compatible = "x-powers,axp813-ac-power-supply",
742 .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
743 .resources = axp20x_ac_power_supply_resources,
735 }, 744 },
736 { .name = "axp20x-regulator" }, 745 { .name = "axp20x-regulator" },
737}; 746};
738 747
739static const struct mfd_cell axp806_self_working_cells[] = { 748static const struct mfd_cell axp806_self_working_cells[] = {
740 { 749 {
741 .name = "axp221-pek", 750 .name = "axp221-pek",
742 .num_resources = ARRAY_SIZE(axp806_pek_resources), 751 .num_resources = ARRAY_SIZE(axp806_pek_resources),
743 .resources = axp806_pek_resources, 752 .resources = axp806_pek_resources,
744 }, 753 },
745 { .name = "axp20x-regulator" }, 754 { .name = "axp20x-regulator" },
746}; 755};
747 756
748static const struct mfd_cell axp806_cells[] = { 757static const struct mfd_cell axp806_cells[] = {
749 { 758 {
750 .id = 2, 759 .id = 2,
751 .name = "axp20x-regulator", 760 .name = "axp20x-regulator",
752 }, 761 },
753}; 762};
754 763
755static const struct mfd_cell axp809_cells[] = { 764static const struct mfd_cell axp809_cells[] = {
756 { 765 {
757 .name = "axp221-pek", 766 .name = "axp221-pek",
758 .num_resources = ARRAY_SIZE(axp809_pek_resources), 767 .num_resources = ARRAY_SIZE(axp809_pek_resources),
759 .resources = axp809_pek_resources, 768 .resources = axp809_pek_resources,
760 }, { 769 }, {
761 .id = 1, 770 .id = 1,
762 .name = "axp20x-regulator", 771 .name = "axp20x-regulator",
763 }, 772 },
764}; 773};
765 774
766static const struct mfd_cell axp813_cells[] = { 775static const struct mfd_cell axp813_cells[] = {
767 { 776 {
768 .name = "axp221-pek", 777 .name = "axp221-pek",
769 .num_resources = ARRAY_SIZE(axp803_pek_resources), 778 .num_resources = ARRAY_SIZE(axp803_pek_resources),
770 .resources = axp803_pek_resources, 779 .resources = axp803_pek_resources,
771 }, { 780 }, {
772 .name = "axp20x-regulator", 781 .name = "axp20x-regulator",
773 }, { 782 }, {
774 .name = "axp20x-gpio", 783 .name = "axp20x-gpio",
775 .of_compatible = "x-powers,axp813-gpio", 784 .of_compatible = "x-powers,axp813-gpio",
776 }, { 785 }, {
777 .name = "axp813-adc", 786 .name = "axp813-adc",
778 .of_compatible = "x-powers,axp813-adc", 787 .of_compatible = "x-powers,axp813-adc",
779 }, { 788 }, {
780 .name = "axp20x-battery-power-supply", 789 .name = "axp20x-battery-power-supply",
781 .of_compatible = "x-powers,axp813-battery-power-supply", 790 .of_compatible = "x-powers,axp813-battery-power-supply",
791 }, {
792 .name = "axp20x-ac-power-supply",
793 .of_compatible = "x-powers,axp813-ac-power-supply",
794 .num_resources = ARRAY_SIZE(axp20x_ac_power_supply_resources),
795 .resources = axp20x_ac_power_supply_resources,
782 }, 796 },
783}; 797};
784 798
diff --git a/drivers/mfd/bd9571mwv.c b/drivers/mfd/bd9571mwv.c
index 503979c81dae..fab3cdc27ed6 100644
--- a/drivers/mfd/bd9571mwv.c
+++ b/drivers/mfd/bd9571mwv.c
@@ -59,6 +59,7 @@ static const struct regmap_access_table bd9571mwv_writable_table = {
59}; 59};
60 60
61static const struct regmap_range bd9571mwv_volatile_yes_ranges[] = { 61static const struct regmap_range bd9571mwv_volatile_yes_ranges[] = {
62 regmap_reg_range(BD9571MWV_DVFS_MONIVDAC, BD9571MWV_DVFS_MONIVDAC),
62 regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN), 63 regmap_reg_range(BD9571MWV_GPIO_IN, BD9571MWV_GPIO_IN),
63 regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT), 64 regmap_reg_range(BD9571MWV_GPIO_INT, BD9571MWV_GPIO_INT),
64 regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ), 65 regmap_reg_range(BD9571MWV_INT_INTREQ, BD9571MWV_INT_INTREQ),
diff --git a/drivers/mfd/cros_ec_dev.c b/drivers/mfd/cros_ec_dev.c
index b99a194ce5a4..2d0fee488c5a 100644
--- a/drivers/mfd/cros_ec_dev.c
+++ b/drivers/mfd/cros_ec_dev.c
@@ -499,6 +499,7 @@ static int ec_device_remove(struct platform_device *pdev)
499 499
500 cros_ec_debugfs_remove(ec); 500 cros_ec_debugfs_remove(ec);
501 501
502 mfd_remove_devices(ec->dev);
502 cdev_del(&ec->cdev); 503 cdev_del(&ec->cdev);
503 device_unregister(&ec->class_dev); 504 device_unregister(&ec->class_dev);
504 return 0; 505 return 0;
diff --git a/drivers/mfd/db8500-prcmu.c b/drivers/mfd/db8500-prcmu.c
index 5970b8def548..aec20e1c7d3d 100644
--- a/drivers/mfd/db8500-prcmu.c
+++ b/drivers/mfd/db8500-prcmu.c
@@ -2584,7 +2584,7 @@ static struct irq_chip prcmu_irq_chip = {
2584 .irq_unmask = prcmu_irq_unmask, 2584 .irq_unmask = prcmu_irq_unmask,
2585}; 2585};
2586 2586
2587static __init char *fw_project_name(u32 project) 2587static char *fw_project_name(u32 project)
2588{ 2588{
2589 switch (project) { 2589 switch (project) {
2590 case PRCMU_FW_PROJECT_U8500: 2590 case PRCMU_FW_PROJECT_U8500:
@@ -2732,7 +2732,7 @@ void __init db8500_prcmu_early_init(u32 phy_base, u32 size)
2732 INIT_WORK(&mb0_transfer.mask_work, prcmu_mask_work); 2732 INIT_WORK(&mb0_transfer.mask_work, prcmu_mask_work);
2733} 2733}
2734 2734
2735static void __init init_prcm_registers(void) 2735static void init_prcm_registers(void)
2736{ 2736{
2737 u32 val; 2737 u32 val;
2738 2738
diff --git a/drivers/mfd/exynos-lpass.c b/drivers/mfd/exynos-lpass.c
index ca829f85672f..2713de989f05 100644
--- a/drivers/mfd/exynos-lpass.c
+++ b/drivers/mfd/exynos-lpass.c
@@ -82,11 +82,13 @@ static void exynos_lpass_enable(struct exynos_lpass *lpass)
82 LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S); 82 LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S);
83 83
84 regmap_write(lpass->top, SFR_LPASS_INTR_CPU_MASK, 84 regmap_write(lpass->top, SFR_LPASS_INTR_CPU_MASK,
85 LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S); 85 LPASS_INTR_SFR | LPASS_INTR_DMA | LPASS_INTR_I2S |
86 LPASS_INTR_UART);
86 87
87 exynos_lpass_core_sw_reset(lpass, LPASS_I2S_SW_RESET); 88 exynos_lpass_core_sw_reset(lpass, LPASS_I2S_SW_RESET);
88 exynos_lpass_core_sw_reset(lpass, LPASS_DMA_SW_RESET); 89 exynos_lpass_core_sw_reset(lpass, LPASS_DMA_SW_RESET);
89 exynos_lpass_core_sw_reset(lpass, LPASS_MEM_SW_RESET); 90 exynos_lpass_core_sw_reset(lpass, LPASS_MEM_SW_RESET);
91 exynos_lpass_core_sw_reset(lpass, LPASS_UART_SW_RESET);
90} 92}
91 93
92static void exynos_lpass_disable(struct exynos_lpass *lpass) 94static void exynos_lpass_disable(struct exynos_lpass *lpass)
diff --git a/drivers/mfd/madera-core.c b/drivers/mfd/madera-core.c
index 440030cecbbd..2a77988d0462 100644
--- a/drivers/mfd/madera-core.c
+++ b/drivers/mfd/madera-core.c
@@ -15,6 +15,7 @@
15#include <linux/gpio.h> 15#include <linux/gpio.h>
16#include <linux/mfd/core.h> 16#include <linux/mfd/core.h>
17#include <linux/module.h> 17#include <linux/module.h>
18#include <linux/mutex.h>
18#include <linux/notifier.h> 19#include <linux/notifier.h>
19#include <linux/of.h> 20#include <linux/of.h>
20#include <linux/of_gpio.h> 21#include <linux/of_gpio.h>
@@ -155,7 +156,7 @@ static int madera_wait_for_boot(struct madera *madera)
155 usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2, 156 usleep_range(MADERA_BOOT_POLL_INTERVAL_USEC / 2,
156 MADERA_BOOT_POLL_INTERVAL_USEC); 157 MADERA_BOOT_POLL_INTERVAL_USEC);
157 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val); 158 regmap_read(madera->regmap, MADERA_IRQ1_RAW_STATUS_1, &val);
158 }; 159 }
159 160
160 if (!(val & MADERA_BOOT_DONE_STS1)) { 161 if (!(val & MADERA_BOOT_DONE_STS1)) {
161 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n"); 162 dev_err(madera->dev, "Polling BOOT_DONE_STS timed out\n");
@@ -357,6 +358,8 @@ int madera_dev_init(struct madera *madera)
357 358
358 dev_set_drvdata(madera->dev, madera); 359 dev_set_drvdata(madera->dev, madera);
359 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier); 360 BLOCKING_INIT_NOTIFIER_HEAD(&madera->notifier);
361 mutex_init(&madera->dapm_ptr_lock);
362
360 madera_set_micbias_info(madera); 363 madera_set_micbias_info(madera);
361 364
362 /* 365 /*
diff --git a/drivers/mfd/max77620.c b/drivers/mfd/max77620.c
index d8217366ed36..d8ddd1a6f304 100644
--- a/drivers/mfd/max77620.c
+++ b/drivers/mfd/max77620.c
@@ -280,7 +280,7 @@ static int max77620_config_fps(struct max77620_chip *chip,
280 280
281 for (fps_id = 0; fps_id < MAX77620_FPS_COUNT; fps_id++) { 281 for (fps_id = 0; fps_id < MAX77620_FPS_COUNT; fps_id++) {
282 sprintf(fps_name, "fps%d", fps_id); 282 sprintf(fps_name, "fps%d", fps_id);
283 if (!strcmp(fps_np->name, fps_name)) 283 if (of_node_name_eq(fps_np, fps_name))
284 break; 284 break;
285 } 285 }
286 286
diff --git a/drivers/mfd/mc13xxx-core.c b/drivers/mfd/mc13xxx-core.c
index f475e848252f..d0bf50e3568d 100644
--- a/drivers/mfd/mc13xxx-core.c
+++ b/drivers/mfd/mc13xxx-core.c
@@ -274,7 +274,9 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
274 274
275 mc13xxx->adcflags |= MC13XXX_ADC_WORKING; 275 mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
276 276
277 mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0); 277 ret = mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
278 if (ret)
279 goto out;
278 280
279 adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2 | 281 adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2 |
280 MC13XXX_ADC0_CHRGRAWDIV; 282 MC13XXX_ADC0_CHRGRAWDIV;
diff --git a/drivers/mfd/mt6397-core.c b/drivers/mfd/mt6397-core.c
index 77b64bd64df3..ab24e176ef44 100644
--- a/drivers/mfd/mt6397-core.c
+++ b/drivers/mfd/mt6397-core.c
@@ -329,8 +329,7 @@ static int mt6397_probe(struct platform_device *pdev)
329 329
330 default: 330 default:
331 dev_err(&pdev->dev, "unsupported chip: %d\n", id); 331 dev_err(&pdev->dev, "unsupported chip: %d\n", id);
332 ret = -ENODEV; 332 return -ENODEV;
333 break;
334 } 333 }
335 334
336 if (ret) { 335 if (ret) {
diff --git a/drivers/mfd/qcom_rpm.c b/drivers/mfd/qcom_rpm.c
index 52fafea06067..8d420c37b2a6 100644
--- a/drivers/mfd/qcom_rpm.c
+++ b/drivers/mfd/qcom_rpm.c
@@ -638,6 +638,10 @@ static int qcom_rpm_probe(struct platform_device *pdev)
638 return -EFAULT; 638 return -EFAULT;
639 } 639 }
640 640
641 writel(fw_version[0], RPM_CTRL_REG(rpm, 0));
642 writel(fw_version[1], RPM_CTRL_REG(rpm, 1));
643 writel(fw_version[2], RPM_CTRL_REG(rpm, 2));
644
641 dev_info(&pdev->dev, "RPM firmware %u.%u.%u\n", fw_version[0], 645 dev_info(&pdev->dev, "RPM firmware %u.%u.%u\n", fw_version[0],
642 fw_version[1], 646 fw_version[1],
643 fw_version[2]); 647 fw_version[2]);
diff --git a/drivers/mfd/rave-sp.c b/drivers/mfd/rave-sp.c
index 2a8369657e38..26c7b63e008a 100644
--- a/drivers/mfd/rave-sp.c
+++ b/drivers/mfd/rave-sp.c
@@ -109,7 +109,7 @@ struct rave_sp_reply {
109/** 109/**
110 * struct rave_sp_checksum - Variant specific checksum implementation details 110 * struct rave_sp_checksum - Variant specific checksum implementation details
111 * 111 *
112 * @length: Caculated checksum length 112 * @length: Calculated checksum length
113 * @subroutine: Utilized checksum algorithm implementation 113 * @subroutine: Utilized checksum algorithm implementation
114 */ 114 */
115struct rave_sp_checksum { 115struct rave_sp_checksum {
diff --git a/drivers/mfd/stmpe.c b/drivers/mfd/stmpe.c
index 566caca4efd8..7569a4be0608 100644
--- a/drivers/mfd/stmpe.c
+++ b/drivers/mfd/stmpe.c
@@ -1302,17 +1302,17 @@ static void stmpe_of_probe(struct stmpe_platform_data *pdata,
1302 pdata->autosleep = (pdata->autosleep_timeout) ? true : false; 1302 pdata->autosleep = (pdata->autosleep_timeout) ? true : false;
1303 1303
1304 for_each_child_of_node(np, child) { 1304 for_each_child_of_node(np, child) {
1305 if (!strcmp(child->name, "stmpe_gpio")) { 1305 if (of_node_name_eq(child, "stmpe_gpio")) {
1306 pdata->blocks |= STMPE_BLOCK_GPIO; 1306 pdata->blocks |= STMPE_BLOCK_GPIO;
1307 } else if (!strcmp(child->name, "stmpe_keypad")) { 1307 } else if (of_node_name_eq(child, "stmpe_keypad")) {
1308 pdata->blocks |= STMPE_BLOCK_KEYPAD; 1308 pdata->blocks |= STMPE_BLOCK_KEYPAD;
1309 } else if (!strcmp(child->name, "stmpe_touchscreen")) { 1309 } else if (of_node_name_eq(child, "stmpe_touchscreen")) {
1310 pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN; 1310 pdata->blocks |= STMPE_BLOCK_TOUCHSCREEN;
1311 } else if (!strcmp(child->name, "stmpe_adc")) { 1311 } else if (of_node_name_eq(child, "stmpe_adc")) {
1312 pdata->blocks |= STMPE_BLOCK_ADC; 1312 pdata->blocks |= STMPE_BLOCK_ADC;
1313 } else if (!strcmp(child->name, "stmpe_pwm")) { 1313 } else if (of_node_name_eq(child, "stmpe_pwm")) {
1314 pdata->blocks |= STMPE_BLOCK_PWM; 1314 pdata->blocks |= STMPE_BLOCK_PWM;
1315 } else if (!strcmp(child->name, "stmpe_rotator")) { 1315 } else if (of_node_name_eq(child, "stmpe_rotator")) {
1316 pdata->blocks |= STMPE_BLOCK_ROTATOR; 1316 pdata->blocks |= STMPE_BLOCK_ROTATOR;
1317 } 1317 }
1318 } 1318 }
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index c2d47d78705b..fd111296b959 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -264,8 +264,9 @@ static int ti_tscadc_probe(struct platform_device *pdev)
264 cell->pdata_size = sizeof(tscadc); 264 cell->pdata_size = sizeof(tscadc);
265 } 265 }
266 266
267 err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells, 267 err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,
268 tscadc->used_cells, NULL, 0, NULL); 268 tscadc->cells, tscadc->used_cells, NULL,
269 0, NULL);
269 if (err < 0) 270 if (err < 0)
270 goto err_disable_clk; 271 goto err_disable_clk;
271 272
diff --git a/drivers/mfd/tps65218.c b/drivers/mfd/tps65218.c
index 910f569ff77c..8bcdecf494d0 100644
--- a/drivers/mfd/tps65218.c
+++ b/drivers/mfd/tps65218.c
@@ -235,9 +235,9 @@ static int tps65218_probe(struct i2c_client *client,
235 235
236 mutex_init(&tps->tps_lock); 236 mutex_init(&tps->tps_lock);
237 237
238 ret = regmap_add_irq_chip(tps->regmap, tps->irq, 238 ret = devm_regmap_add_irq_chip(&client->dev, tps->regmap, tps->irq,
239 IRQF_ONESHOT, 0, &tps65218_irq_chip, 239 IRQF_ONESHOT, 0, &tps65218_irq_chip,
240 &tps->irq_data); 240 &tps->irq_data);
241 if (ret < 0) 241 if (ret < 0)
242 return ret; 242 return ret;
243 243
@@ -253,26 +253,9 @@ static int tps65218_probe(struct i2c_client *client,
253 ARRAY_SIZE(tps65218_cells), NULL, 0, 253 ARRAY_SIZE(tps65218_cells), NULL, 0,
254 regmap_irq_get_domain(tps->irq_data)); 254 regmap_irq_get_domain(tps->irq_data));
255 255
256 if (ret < 0)
257 goto err_irq;
258
259 return 0;
260
261err_irq:
262 regmap_del_irq_chip(tps->irq, tps->irq_data);
263
264 return ret; 256 return ret;
265} 257}
266 258
267static int tps65218_remove(struct i2c_client *client)
268{
269 struct tps65218 *tps = i2c_get_clientdata(client);
270
271 regmap_del_irq_chip(tps->irq, tps->irq_data);
272
273 return 0;
274}
275
276static const struct i2c_device_id tps65218_id_table[] = { 259static const struct i2c_device_id tps65218_id_table[] = {
277 { "tps65218", TPS65218 }, 260 { "tps65218", TPS65218 },
278 { }, 261 { },
@@ -285,7 +268,6 @@ static struct i2c_driver tps65218_driver = {
285 .of_match_table = of_tps65218_match_table, 268 .of_match_table = of_tps65218_match_table,
286 }, 269 },
287 .probe = tps65218_probe, 270 .probe = tps65218_probe,
288 .remove = tps65218_remove,
289 .id_table = tps65218_id_table, 271 .id_table = tps65218_id_table,
290}; 272};
291 273
diff --git a/drivers/mfd/tps6586x.c b/drivers/mfd/tps6586x.c
index b89379782741..9c7925ca13cf 100644
--- a/drivers/mfd/tps6586x.c
+++ b/drivers/mfd/tps6586x.c
@@ -592,6 +592,29 @@ static int tps6586x_i2c_remove(struct i2c_client *client)
592 return 0; 592 return 0;
593} 593}
594 594
595static int __maybe_unused tps6586x_i2c_suspend(struct device *dev)
596{
597 struct tps6586x *tps6586x = dev_get_drvdata(dev);
598
599 if (tps6586x->client->irq)
600 disable_irq(tps6586x->client->irq);
601
602 return 0;
603}
604
605static int __maybe_unused tps6586x_i2c_resume(struct device *dev)
606{
607 struct tps6586x *tps6586x = dev_get_drvdata(dev);
608
609 if (tps6586x->client->irq)
610 enable_irq(tps6586x->client->irq);
611
612 return 0;
613}
614
615static SIMPLE_DEV_PM_OPS(tps6586x_pm_ops, tps6586x_i2c_suspend,
616 tps6586x_i2c_resume);
617
595static const struct i2c_device_id tps6586x_id_table[] = { 618static const struct i2c_device_id tps6586x_id_table[] = {
596 { "tps6586x", 0 }, 619 { "tps6586x", 0 },
597 { }, 620 { },
@@ -602,6 +625,7 @@ static struct i2c_driver tps6586x_driver = {
602 .driver = { 625 .driver = {
603 .name = "tps6586x", 626 .name = "tps6586x",
604 .of_match_table = of_match_ptr(tps6586x_of_match), 627 .of_match_table = of_match_ptr(tps6586x_of_match),
628 .pm = &tps6586x_pm_ops,
605 }, 629 },
606 .probe = tps6586x_i2c_probe, 630 .probe = tps6586x_i2c_probe,
607 .remove = tps6586x_i2c_remove, 631 .remove = tps6586x_i2c_remove,
diff --git a/drivers/mfd/twl-core.c b/drivers/mfd/twl-core.c
index 4be3d239da9e..299016bc46d9 100644
--- a/drivers/mfd/twl-core.c
+++ b/drivers/mfd/twl-core.c
@@ -979,7 +979,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base,
979 * letting it generate the right frequencies for USB, MADC, and 979 * letting it generate the right frequencies for USB, MADC, and
980 * other purposes. 980 * other purposes.
981 */ 981 */
982static inline int __init protect_pm_master(void) 982static inline int protect_pm_master(void)
983{ 983{
984 int e = 0; 984 int e = 0;
985 985
@@ -988,7 +988,7 @@ static inline int __init protect_pm_master(void)
988 return e; 988 return e;
989} 989}
990 990
991static inline int __init unprotect_pm_master(void) 991static inline int unprotect_pm_master(void)
992{ 992{
993 int e = 0; 993 int e = 0;
994 994
diff --git a/drivers/mfd/wm5110-tables.c b/drivers/mfd/wm5110-tables.c
index 1ee68bd440fb..16c6e2accfaa 100644
--- a/drivers/mfd/wm5110-tables.c
+++ b/drivers/mfd/wm5110-tables.c
@@ -1618,6 +1618,7 @@ static const struct reg_default wm5110_reg_default[] = {
1618 { 0x00000ECD, 0x0000 }, /* R3789 - HPLPF4_2 */ 1618 { 0x00000ECD, 0x0000 }, /* R3789 - HPLPF4_2 */
1619 { 0x00000EE0, 0x0000 }, /* R3808 - ASRC_ENABLE */ 1619 { 0x00000EE0, 0x0000 }, /* R3808 - ASRC_ENABLE */
1620 { 0x00000EE2, 0x0000 }, /* R3810 - ASRC_RATE1 */ 1620 { 0x00000EE2, 0x0000 }, /* R3810 - ASRC_RATE1 */
1621 { 0x00000EE3, 0x4000 }, /* R3811 - ASRC_RATE2 */
1621 { 0x00000EF0, 0x0000 }, /* R3824 - ISRC 1 CTRL 1 */ 1622 { 0x00000EF0, 0x0000 }, /* R3824 - ISRC 1 CTRL 1 */
1622 { 0x00000EF1, 0x0000 }, /* R3825 - ISRC 1 CTRL 2 */ 1623 { 0x00000EF1, 0x0000 }, /* R3825 - ISRC 1 CTRL 2 */
1623 { 0x00000EF2, 0x0000 }, /* R3826 - ISRC 1 CTRL 3 */ 1624 { 0x00000EF2, 0x0000 }, /* R3826 - ISRC 1 CTRL 3 */
@@ -2869,6 +2870,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
2869 case ARIZONA_ASRC_ENABLE: 2870 case ARIZONA_ASRC_ENABLE:
2870 case ARIZONA_ASRC_STATUS: 2871 case ARIZONA_ASRC_STATUS:
2871 case ARIZONA_ASRC_RATE1: 2872 case ARIZONA_ASRC_RATE1:
2873 case ARIZONA_ASRC_RATE2:
2872 case ARIZONA_ISRC_1_CTRL_1: 2874 case ARIZONA_ISRC_1_CTRL_1:
2873 case ARIZONA_ISRC_1_CTRL_2: 2875 case ARIZONA_ISRC_1_CTRL_2:
2874 case ARIZONA_ISRC_1_CTRL_3: 2876 case ARIZONA_ISRC_1_CTRL_3:
diff --git a/include/linux/mfd/cros_ec_commands.h b/include/linux/mfd/cros_ec_commands.h
index 9a9631f0559e..fc91082d4c35 100644
--- a/include/linux/mfd/cros_ec_commands.h
+++ b/include/linux/mfd/cros_ec_commands.h
@@ -2791,6 +2791,100 @@ struct ec_response_battery_vendor_param {
2791} __packed; 2791} __packed;
2792 2792
2793/*****************************************************************************/ 2793/*****************************************************************************/
2794/* Commands for I2S recording on audio codec. */
2795
2796#define EC_CMD_CODEC_I2S 0x00BC
2797
2798enum ec_codec_i2s_subcmd {
2799 EC_CODEC_SET_SAMPLE_DEPTH = 0x0,
2800 EC_CODEC_SET_GAIN = 0x1,
2801 EC_CODEC_GET_GAIN = 0x2,
2802 EC_CODEC_I2S_ENABLE = 0x3,
2803 EC_CODEC_I2S_SET_CONFIG = 0x4,
2804 EC_CODEC_I2S_SET_TDM_CONFIG = 0x5,
2805 EC_CODEC_I2S_SET_BCLK = 0x6,
2806};
2807
2808enum ec_sample_depth_value {
2809 EC_CODEC_SAMPLE_DEPTH_16 = 0,
2810 EC_CODEC_SAMPLE_DEPTH_24 = 1,
2811};
2812
2813enum ec_i2s_config {
2814 EC_DAI_FMT_I2S = 0,
2815 EC_DAI_FMT_RIGHT_J = 1,
2816 EC_DAI_FMT_LEFT_J = 2,
2817 EC_DAI_FMT_PCM_A = 3,
2818 EC_DAI_FMT_PCM_B = 4,
2819 EC_DAI_FMT_PCM_TDM = 5,
2820};
2821
2822struct ec_param_codec_i2s {
2823 /*
2824 * enum ec_codec_i2s_subcmd
2825 */
2826 uint8_t cmd;
2827 union {
2828 /*
2829 * EC_CODEC_SET_SAMPLE_DEPTH
2830 * Value should be one of ec_sample_depth_value.
2831 */
2832 uint8_t depth;
2833
2834 /*
2835 * EC_CODEC_SET_GAIN
2836 * Value should be 0~43 for both channels.
2837 */
2838 struct ec_param_codec_i2s_set_gain {
2839 uint8_t left;
2840 uint8_t right;
2841 } __packed gain;
2842
2843 /*
2844 * EC_CODEC_I2S_ENABLE
2845 * 1 to enable, 0 to disable.
2846 */
2847 uint8_t i2s_enable;
2848
2849 /*
2850 * EC_CODEC_I2S_SET_COFNIG
2851 * Value should be one of ec_i2s_config.
2852 */
2853 uint8_t i2s_config;
2854
2855 /*
2856 * EC_CODEC_I2S_SET_TDM_CONFIG
2857 * Value should be one of ec_i2s_config.
2858 */
2859 struct ec_param_codec_i2s_tdm {
2860 /*
2861 * 0 to 496
2862 */
2863 int16_t ch0_delay;
2864 /*
2865 * -1 to 496
2866 */
2867 int16_t ch1_delay;
2868 uint8_t adjacent_to_ch0;
2869 uint8_t adjacent_to_ch1;
2870 } __packed tdm_param;
2871
2872 /*
2873 * EC_CODEC_I2S_SET_BCLK
2874 */
2875 uint32_t bclk;
2876 };
2877} __packed;
2878
2879/*
2880 * For subcommand EC_CODEC_GET_GAIN.
2881 */
2882struct ec_response_codec_gain {
2883 uint8_t left;
2884 uint8_t right;
2885} __packed;
2886
2887/*****************************************************************************/
2794/* System commands */ 2888/* System commands */
2795 2889
2796/* 2890/*
diff --git a/include/linux/mfd/ingenic-tcu.h b/include/linux/mfd/ingenic-tcu.h
index ab16ad283def..2083fa20821d 100644
--- a/include/linux/mfd/ingenic-tcu.h
+++ b/include/linux/mfd/ingenic-tcu.h
@@ -41,7 +41,7 @@
41#define TCU_TCSR_PRESCALE_LSB 3 41#define TCU_TCSR_PRESCALE_LSB 3
42#define TCU_TCSR_PRESCALE_MASK 0x38 42#define TCU_TCSR_PRESCALE_MASK 0x38
43 43
44#define TCU_TCSR_PWM_SD BIT(9) /* 0: Shutdown abruptly 1: gracefully */ 44#define TCU_TCSR_PWM_SD BIT(9) /* 0: Shutdown gracefully 1: abruptly */
45#define TCU_TCSR_PWM_INITL_HIGH BIT(8) /* Sets the initial output level */ 45#define TCU_TCSR_PWM_INITL_HIGH BIT(8) /* Sets the initial output level */
46#define TCU_TCSR_PWM_EN BIT(7) /* PWM pin output enable */ 46#define TCU_TCSR_PWM_EN BIT(7) /* PWM pin output enable */
47 47
diff --git a/include/linux/mfd/madera/core.h b/include/linux/mfd/madera/core.h
index fe69c0f4398f..4d5d51a9c8a6 100644
--- a/include/linux/mfd/madera/core.h
+++ b/include/linux/mfd/madera/core.h
@@ -15,6 +15,7 @@
15#include <linux/gpio/consumer.h> 15#include <linux/gpio/consumer.h>
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/mfd/madera/pdata.h> 17#include <linux/mfd/madera/pdata.h>
18#include <linux/mutex.h>
18#include <linux/notifier.h> 19#include <linux/notifier.h>
19#include <linux/regmap.h> 20#include <linux/regmap.h>
20#include <linux/regulator/consumer.h> 21#include <linux/regulator/consumer.h>
@@ -37,6 +38,8 @@ enum madera_type {
37 38
38#define MADERA_MAX_MICBIAS 4 39#define MADERA_MAX_MICBIAS 4
39 40
41#define MADERA_MAX_HP_OUTPUT 3
42
40/* Notifier events */ 43/* Notifier events */
41#define MADERA_NOTIFY_VOICE_TRIGGER 0x1 44#define MADERA_NOTIFY_VOICE_TRIGGER 0x1
42#define MADERA_NOTIFY_HPDET 0x2 45#define MADERA_NOTIFY_HPDET 0x2
@@ -183,6 +186,10 @@ struct madera {
183 unsigned int num_childbias[MADERA_MAX_MICBIAS]; 186 unsigned int num_childbias[MADERA_MAX_MICBIAS];
184 187
185 struct snd_soc_dapm_context *dapm; 188 struct snd_soc_dapm_context *dapm;
189 struct mutex dapm_ptr_lock;
190 unsigned int hp_ena;
191 bool out_clamp[MADERA_MAX_HP_OUTPUT];
192 bool out_shorted[MADERA_MAX_HP_OUTPUT];
186 193
187 struct blocking_notifier_head notifier; 194 struct blocking_notifier_head notifier;
188}; 195};
diff --git a/include/linux/mfd/ti_am335x_tscadc.h b/include/linux/mfd/ti_am335x_tscadc.h
index b9a53e013bff..483168403ae5 100644
--- a/include/linux/mfd/ti_am335x_tscadc.h
+++ b/include/linux/mfd/ti_am335x_tscadc.h
@@ -78,6 +78,8 @@
78#define STEPCONFIG_YNN BIT(8) 78#define STEPCONFIG_YNN BIT(8)
79#define STEPCONFIG_XNP BIT(9) 79#define STEPCONFIG_XNP BIT(9)
80#define STEPCONFIG_YPN BIT(10) 80#define STEPCONFIG_YPN BIT(10)
81#define STEPCONFIG_RFP(val) ((val) << 12)
82#define STEPCONFIG_RFP_VREFP (0x3 << 12)
81#define STEPCONFIG_INM_MASK (0xF << 15) 83#define STEPCONFIG_INM_MASK (0xF << 15)
82#define STEPCONFIG_INM(val) ((val) << 15) 84#define STEPCONFIG_INM(val) ((val) << 15)
83#define STEPCONFIG_INM_ADCREFM STEPCONFIG_INM(8) 85#define STEPCONFIG_INM_ADCREFM STEPCONFIG_INM(8)
@@ -86,6 +88,8 @@
86#define STEPCONFIG_INP_AN4 STEPCONFIG_INP(4) 88#define STEPCONFIG_INP_AN4 STEPCONFIG_INP(4)
87#define STEPCONFIG_INP_ADCREFM STEPCONFIG_INP(8) 89#define STEPCONFIG_INP_ADCREFM STEPCONFIG_INP(8)
88#define STEPCONFIG_FIFO1 BIT(26) 90#define STEPCONFIG_FIFO1 BIT(26)
91#define STEPCONFIG_RFM(val) ((val) << 23)
92#define STEPCONFIG_RFM_VREFN (0x3 << 23)
89 93
90/* Delay register */ 94/* Delay register */
91#define STEPDELAY_OPEN_MASK (0x3FFFF << 0) 95#define STEPDELAY_OPEN_MASK (0x3FFFF << 0)
diff --git a/include/linux/mfd/tmio.h b/include/linux/mfd/tmio.h
index e2687a30e5a1..739b7bf37eaa 100644
--- a/include/linux/mfd/tmio.h
+++ b/include/linux/mfd/tmio.h
@@ -79,7 +79,7 @@
79/* Some controllers have a CBSY bit */ 79/* Some controllers have a CBSY bit */
80#define TMIO_MMC_HAVE_CBSY BIT(11) 80#define TMIO_MMC_HAVE_CBSY BIT(11)
81 81
82/* Some controllers that support HS400 use use 4 taps while others use 8. */ 82/* Some controllers that support HS400 use 4 taps while others use 8. */
83#define TMIO_MMC_HAVE_4TAP_HS400 BIT(13) 83#define TMIO_MMC_HAVE_4TAP_HS400 BIT(13)
84 84
85int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base); 85int tmio_core_mmc_enable(void __iomem *cnf, int shift, unsigned long base);