|
@@ -85,10 +85,19 @@ EXPORT_SYMBOL(snd_soc_alloc_ac97_codec);
|
|
|
/**
|
|
|
* snd_soc_new_ac97_codec - initailise AC97 device
|
|
|
* @codec: audio codec
|
|
|
+ * @id: The expected device ID
|
|
|
+ * @id_mask: Mask that is applied to the device ID before comparing with @id
|
|
|
*
|
|
|
* Initialises AC97 codec resources for use by ad-hoc devices only.
|
|
|
+ *
|
|
|
+ * If @id is not 0 this function will reset the device, then read the ID from
|
|
|
+ * the device and check if it matches the expected ID. If it doesn't match an
|
|
|
+ * error will be returned and device will not be registered.
|
|
|
+ *
|
|
|
+ * Returns: A PTR_ERR() on failure or a valid snd_ac97 struct on success.
|
|
|
*/
|
|
|
-struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec)
|
|
|
+struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec,
|
|
|
+ unsigned int id, unsigned int id_mask)
|
|
|
{
|
|
|
struct snd_ac97 *ac97;
|
|
|
int ret;
|
|
@@ -97,13 +106,24 @@ struct snd_ac97 *snd_soc_new_ac97_codec(struct snd_soc_codec *codec)
|
|
|
if (IS_ERR(ac97))
|
|
|
return ac97;
|
|
|
|
|
|
- ret = device_add(&ac97->dev);
|
|
|
- if (ret) {
|
|
|
- put_device(&ac97->dev);
|
|
|
- return ERR_PTR(ret);
|
|
|
+ if (id) {
|
|
|
+ ret = snd_ac97_reset(ac97, false, id, id_mask);
|
|
|
+ if (ret < 0) {
|
|
|
+ dev_err(codec->dev, "Failed to reset AC97 device: %d\n",
|
|
|
+ ret);
|
|
|
+ goto err_put_device;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
+ ret = device_add(&ac97->dev);
|
|
|
+ if (ret)
|
|
|
+ goto err_put_device;
|
|
|
+
|
|
|
return ac97;
|
|
|
+
|
|
|
+err_put_device:
|
|
|
+ put_device(&ac97->dev);
|
|
|
+ return ERR_PTR(ret);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(snd_soc_new_ac97_codec);
|
|
|
|