Merge tag 'regmap-v3.13-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[firefly-linux-kernel-4.4.55.git] / sound / soc / soc-core.c
index bdc1d74eb7b07168a12cb0dd9d3cb48beec1aaa9..a66783e13a9cca182e3077b3e998c804aa40ff1d 100644 (file)
@@ -662,6 +662,8 @@ int snd_soc_suspend(struct device *dev)
                                codec->cache_sync = 1;
                                if (codec->using_regmap)
                                        regcache_mark_dirty(codec->control_data);
+                               /* deactivate pins to sleep state */
+                               pinctrl_pm_select_sleep_state(codec->dev);
                                break;
                        default:
                                dev_dbg(codec->dev,
@@ -679,6 +681,9 @@ int snd_soc_suspend(struct device *dev)
 
                if (cpu_dai->driver->suspend && cpu_dai->driver->ac97_control)
                        cpu_dai->driver->suspend(cpu_dai);
+
+               /* deactivate pins to sleep state */
+               pinctrl_pm_select_sleep_state(cpu_dai->dev);
        }
 
        if (card->suspend_post)
@@ -807,6 +812,16 @@ int snd_soc_resume(struct device *dev)
        if (list_empty(&card->codec_dev_list))
                return 0;
 
+       /* activate pins from sleep state */
+       for (i = 0; i < card->num_rtd; i++) {
+               struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+               struct snd_soc_dai *codec_dai = card->rtd[i].codec_dai;
+               if (cpu_dai->active)
+                       pinctrl_pm_select_default_state(cpu_dai->dev);
+               if (codec_dai->active)
+                       pinctrl_pm_select_default_state(codec_dai->dev);
+       }
+
        /* AC97 devices might have other drivers hanging off them so
         * need to resume immediately.  Other drivers don't have that
         * problem and may take a substantial amount of time to resume
@@ -1929,6 +1944,14 @@ int snd_soc_poweroff(struct device *dev)
 
        snd_soc_dapm_shutdown(card);
 
+       /* deactivate pins to sleep state */
+       for (i = 0; i < card->num_rtd; i++) {
+               struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+               struct snd_soc_dai *codec_dai = card->rtd[i].codec_dai;
+               pinctrl_pm_select_sleep_state(codec_dai->dev);
+               pinctrl_pm_select_sleep_state(cpu_dai->dev);
+       }
+
        return 0;
 }
 EXPORT_SYMBOL_GPL(snd_soc_poweroff);
@@ -3189,11 +3212,11 @@ int snd_soc_bytes_get(struct snd_kcontrol *kcontrol,
                        break;
                case 2:
                        ((u16 *)(&ucontrol->value.bytes.data))[0]
-                               &= ~params->mask;
+                               &= cpu_to_be16(~params->mask);
                        break;
                case 4:
                        ((u32 *)(&ucontrol->value.bytes.data))[0]
-                               &= ~params->mask;
+                               &= cpu_to_be32(~params->mask);
                        break;
                default:
                        return -EINVAL;
@@ -3767,6 +3790,16 @@ int snd_soc_register_card(struct snd_soc_card *card)
        if (ret != 0)
                soc_cleanup_card_debugfs(card);
 
+       /* deactivate pins to sleep state */
+       for (i = 0; i < card->num_rtd; i++) {
+               struct snd_soc_dai *cpu_dai = card->rtd[i].cpu_dai;
+               struct snd_soc_dai *codec_dai = card->rtd[i].codec_dai;
+               if (!codec_dai->active)
+                       pinctrl_pm_select_sleep_state(codec_dai->dev);
+               if (!cpu_dai->active)
+                       pinctrl_pm_select_sleep_state(cpu_dai->dev);
+       }
+
        return ret;
 }
 EXPORT_SYMBOL_GPL(snd_soc_register_card);