Merge tag 'asoc-v4.2-rc8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
authorTakashi Iwai <tiwai@suse.de>
Mon, 31 Aug 2015 14:25:22 +0000 (16:25 +0200)
committerTakashi Iwai <tiwai@suse.de>
Mon, 31 Aug 2015 14:25:22 +0000 (16:25 +0200)
ASoC: Updates for v4.3

Not many updates to the core here, but an awful lot of driver updates
this time round:

 - Factoring out of AC'97 reset code into the core
 - New drivers for Cirrus CS4349, GTM601, InvenSense ICS43432, Realtek
   RT298 and ST STI controllers.
 - Machine drivers for Rockchip systems with MAX98090 and RT5645 and
   RT5650.
 - Initial driver support for Intel Skylake devices.
 - A large number of cleanups for Lars-Peter Clausen and Axel Lin.

1  2 
sound/ac97_bus.c

diff --combined sound/ac97_bus.c
index 57a6dfc4b6947e2b4f545f8e4a2dec6e22ce17c7,55791a0b3943c81f5dc5c65133bcc5a8d0d07827..52e4bc54c9acac2264be07b2b517e9fbb1608333
  #include <linux/string.h>
  #include <sound/ac97_codec.h>
  
+ /*
+  * snd_ac97_check_id() - Reads and checks the vendor ID of the device
+  * @ac97: The AC97 device to check
+  * @id: The ID to compare to
+  * @id_mask: Mask that is applied to the device ID before comparing to @id
+  *
+  * If @id is 0 this function returns true if the read device vendor ID is
+  * a valid ID. If @id is non 0 this functions returns true if @id
+  * matches the read vendor ID. Otherwise the function returns false.
+  */
+ static bool snd_ac97_check_id(struct snd_ac97 *ac97, unsigned int id,
+       unsigned int id_mask)
+ {
+       ac97->id = ac97->bus->ops->read(ac97, AC97_VENDOR_ID1) << 16;
+       ac97->id |= ac97->bus->ops->read(ac97, AC97_VENDOR_ID2);
+       if (ac97->id == 0x0 || ac97->id == 0xffffffff)
+               return false;
+       if (id != 0 && id != (ac97->id & id_mask))
+               return false;
+       return true;
+ }
+ /**
+  * snd_ac97_reset() - Reset AC'97 device
+  * @ac97: The AC'97 device to reset
+  * @try_warm: Try a warm reset first
+  * @id: Expected device vendor ID
+  * @id_mask: Mask that is applied to the device ID before comparing to @id
+  *
+  * This function resets the AC'97 device. If @try_warm is true the function
+  * first performs a warm reset. If the warm reset is successful the function
+  * returns 1. Otherwise or if @try_warm is false the function issues cold reset
+  * followed by a warm reset. If this is successful the function returns 0,
+  * otherwise a negative error code. If @id is 0 any valid device ID will be
+  * accepted, otherwise only the ID that matches @id and @id_mask is accepted.
+  */
+ int snd_ac97_reset(struct snd_ac97 *ac97, bool try_warm, unsigned int id,
+       unsigned int id_mask)
+ {
+       struct snd_ac97_bus_ops *ops = ac97->bus->ops;
+       if (try_warm && ops->warm_reset) {
+               ops->warm_reset(ac97);
+               if (snd_ac97_check_id(ac97, id, id_mask))
+                       return 1;
+       }
+       if (ops->reset)
+               ops->reset(ac97);
+       if (ops->warm_reset)
+               ops->warm_reset(ac97);
+       if (snd_ac97_check_id(ac97, id, id_mask))
+               return 0;
+       return -ENODEV;
+ }
+ EXPORT_SYMBOL_GPL(snd_ac97_reset);
  /*
   * Let drivers decide whether they want to support given codec from their
   * probe method. Drivers have direct access to the struct snd_ac97
@@@ -27,9 -89,35 +89,9 @@@ static int ac97_bus_match(struct devic
        return 1;
  }
  
 -#ifdef CONFIG_PM
 -static int ac97_bus_suspend(struct device *dev, pm_message_t state)
 -{
 -      int ret = 0;
 -
 -      if (dev->driver && dev->driver->suspend)
 -              ret = dev->driver->suspend(dev, state);
 -
 -      return ret;
 -}
 -
 -static int ac97_bus_resume(struct device *dev)
 -{
 -      int ret = 0;
 -
 -      if (dev->driver && dev->driver->resume)
 -              ret = dev->driver->resume(dev);
 -
 -      return ret;
 -}
 -#endif /* CONFIG_PM */
 -
  struct bus_type ac97_bus_type = {
        .name           = "ac97",
        .match          = ac97_bus_match,
 -#ifdef CONFIG_PM
 -      .suspend        = ac97_bus_suspend,
 -      .resume         = ac97_bus_resume,
 -#endif /* CONFIG_PM */
  };
  
  static int __init ac97_bus_init(void)