ALSA: hda - Use shutdown driver ops instead of reboot notifier
The driver shutdown ops is simpler than registering reboot notifier manually. There should be no functional change by this -- the codec driver calls its own callback while the bus driver just calls azx_stop() like before. Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
d56db741b8
commit
b2a0bafa75
|
@ -9,6 +9,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/export.h>
|
#include <linux/export.h>
|
||||||
#include <linux/pm.h>
|
#include <linux/pm.h>
|
||||||
|
#include <linux/pm_runtime.h>
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include "hda_codec.h"
|
#include "hda_codec.h"
|
||||||
#include "hda_local.h"
|
#include "hda_local.h"
|
||||||
|
@ -142,6 +143,14 @@ static int hda_codec_driver_remove(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hda_codec_driver_shutdown(struct device *dev)
|
||||||
|
{
|
||||||
|
struct hda_codec *codec = dev_to_hda_codec(dev);
|
||||||
|
|
||||||
|
if (!pm_runtime_suspended(dev) && codec->patch_ops.reboot_notify)
|
||||||
|
codec->patch_ops.reboot_notify(codec);
|
||||||
|
}
|
||||||
|
|
||||||
int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
|
int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
|
||||||
struct module *owner)
|
struct module *owner)
|
||||||
{
|
{
|
||||||
|
@ -150,6 +159,7 @@ int __hda_codec_driver_register(struct hda_codec_driver *drv, const char *name,
|
||||||
drv->driver.bus = &snd_hda_bus_type;
|
drv->driver.bus = &snd_hda_bus_type;
|
||||||
drv->driver.probe = hda_codec_driver_probe;
|
drv->driver.probe = hda_codec_driver_probe;
|
||||||
drv->driver.remove = hda_codec_driver_remove;
|
drv->driver.remove = hda_codec_driver_remove;
|
||||||
|
drv->driver.shutdown = hda_codec_driver_shutdown;
|
||||||
drv->driver.pm = &hda_codec_driver_pm;
|
drv->driver.pm = &hda_codec_driver_pm;
|
||||||
return driver_register(&drv->driver);
|
return driver_register(&drv->driver);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4941,24 +4941,6 @@ static void cleanup_dig_out_stream(struct hda_codec *codec, hda_nid_t nid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* snd_hda_bus_reboot_notify - call the reboot notifier of each codec
|
|
||||||
* @bus: HD-audio bus
|
|
||||||
*/
|
|
||||||
void snd_hda_bus_reboot_notify(struct hda_bus *bus)
|
|
||||||
{
|
|
||||||
struct hda_codec *codec;
|
|
||||||
|
|
||||||
if (!bus)
|
|
||||||
return;
|
|
||||||
list_for_each_entry(codec, &bus->codec_list, list) {
|
|
||||||
if (hda_codec_is_power_on(codec) &&
|
|
||||||
codec->patch_ops.reboot_notify)
|
|
||||||
codec->patch_ops.reboot_notify(codec);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(snd_hda_bus_reboot_notify);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* snd_hda_multi_out_dig_open - open the digital out in the exclusive mode
|
* snd_hda_multi_out_dig_open - open the digital out in the exclusive mode
|
||||||
* @codec: the HDA codec
|
* @codec: the HDA codec
|
||||||
|
|
|
@ -563,7 +563,6 @@ extern const struct snd_pcm_chmap_elem snd_pcm_2_1_chmaps[];
|
||||||
* Misc
|
* Misc
|
||||||
*/
|
*/
|
||||||
void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
|
void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
|
||||||
void snd_hda_bus_reboot_notify(struct hda_bus *bus);
|
|
||||||
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
void snd_hda_codec_set_power_to_all(struct hda_codec *codec, hda_nid_t fg,
|
||||||
unsigned int power_state);
|
unsigned int power_state);
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/reboot.h>
|
|
||||||
#include <sound/core.h>
|
#include <sound/core.h>
|
||||||
#include <sound/initval.h>
|
#include <sound/initval.h>
|
||||||
#include "hda_controller.h"
|
#include "hda_controller.h"
|
||||||
|
@ -1972,30 +1971,5 @@ int azx_init_stream(struct azx *chip)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(azx_init_stream);
|
EXPORT_SYMBOL_GPL(azx_init_stream);
|
||||||
|
|
||||||
/*
|
|
||||||
* reboot notifier for hang-up problem at power-down
|
|
||||||
*/
|
|
||||||
static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
|
|
||||||
{
|
|
||||||
struct azx *chip = container_of(nb, struct azx, reboot_notifier);
|
|
||||||
snd_hda_bus_reboot_notify(chip->bus);
|
|
||||||
azx_stop_chip(chip);
|
|
||||||
return NOTIFY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
void azx_notifier_register(struct azx *chip)
|
|
||||||
{
|
|
||||||
chip->reboot_notifier.notifier_call = azx_halt;
|
|
||||||
register_reboot_notifier(&chip->reboot_notifier);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(azx_notifier_register);
|
|
||||||
|
|
||||||
void azx_notifier_unregister(struct azx *chip)
|
|
||||||
{
|
|
||||||
if (chip->reboot_notifier.notifier_call)
|
|
||||||
unregister_reboot_notifier(&chip->reboot_notifier);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(azx_notifier_unregister);
|
|
||||||
|
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
MODULE_DESCRIPTION("Common HDA driver functions");
|
MODULE_DESCRIPTION("Common HDA driver functions");
|
||||||
|
|
|
@ -362,9 +362,6 @@ struct azx {
|
||||||
/* for debugging */
|
/* for debugging */
|
||||||
unsigned int last_cmd[AZX_MAX_CODECS];
|
unsigned int last_cmd[AZX_MAX_CODECS];
|
||||||
|
|
||||||
/* reboot notifier (for mysterious hangup problem at power-down) */
|
|
||||||
struct notifier_block reboot_notifier;
|
|
||||||
|
|
||||||
#ifdef CONFIG_SND_HDA_DSP_LOADER
|
#ifdef CONFIG_SND_HDA_DSP_LOADER
|
||||||
struct azx_dev saved_azx_dev;
|
struct azx_dev saved_azx_dev;
|
||||||
#endif
|
#endif
|
||||||
|
@ -437,7 +434,4 @@ int azx_probe_codecs(struct azx *chip, unsigned int max_slots);
|
||||||
int azx_codec_configure(struct azx *chip);
|
int azx_codec_configure(struct azx *chip);
|
||||||
int azx_init_stream(struct azx *chip);
|
int azx_init_stream(struct azx *chip);
|
||||||
|
|
||||||
void azx_notifier_register(struct azx *chip);
|
|
||||||
void azx_notifier_unregister(struct azx *chip);
|
|
||||||
|
|
||||||
#endif /* __SOUND_HDA_CONTROLLER_H */
|
#endif /* __SOUND_HDA_CONTROLLER_H */
|
||||||
|
|
|
@ -1066,8 +1066,6 @@ static int azx_free(struct azx *chip)
|
||||||
|
|
||||||
azx_del_card_list(chip);
|
azx_del_card_list(chip);
|
||||||
|
|
||||||
azx_notifier_unregister(chip);
|
|
||||||
|
|
||||||
hda->init_failed = 1; /* to be sure */
|
hda->init_failed = 1; /* to be sure */
|
||||||
complete_all(&hda->probe_wait);
|
complete_all(&hda->probe_wait);
|
||||||
|
|
||||||
|
@ -1900,7 +1898,6 @@ static int azx_probe_continue(struct azx *chip)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
chip->running = 1;
|
chip->running = 1;
|
||||||
azx_notifier_register(chip);
|
|
||||||
azx_add_card_list(chip);
|
azx_add_card_list(chip);
|
||||||
snd_hda_set_power_save(chip->bus, power_save * 1000);
|
snd_hda_set_power_save(chip->bus, power_save * 1000);
|
||||||
if (azx_has_pm_runtime(chip) || hda->use_vga_switcheroo)
|
if (azx_has_pm_runtime(chip) || hda->use_vga_switcheroo)
|
||||||
|
@ -1921,6 +1918,18 @@ static void azx_remove(struct pci_dev *pci)
|
||||||
snd_card_free(card);
|
snd_card_free(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void azx_shutdown(struct pci_dev *pci)
|
||||||
|
{
|
||||||
|
struct snd_card *card = pci_get_drvdata(pci);
|
||||||
|
struct azx *chip;
|
||||||
|
|
||||||
|
if (!card)
|
||||||
|
return;
|
||||||
|
chip = card->private_data;
|
||||||
|
if (chip && chip->running)
|
||||||
|
azx_stop_chip(chip);
|
||||||
|
}
|
||||||
|
|
||||||
/* PCI IDs */
|
/* PCI IDs */
|
||||||
static const struct pci_device_id azx_ids[] = {
|
static const struct pci_device_id azx_ids[] = {
|
||||||
/* CPT */
|
/* CPT */
|
||||||
|
@ -2143,6 +2152,7 @@ static struct pci_driver azx_driver = {
|
||||||
.id_table = azx_ids,
|
.id_table = azx_ids,
|
||||||
.probe = azx_probe,
|
.probe = azx_probe,
|
||||||
.remove = azx_remove,
|
.remove = azx_remove,
|
||||||
|
.shutdown = azx_shutdown,
|
||||||
.driver = {
|
.driver = {
|
||||||
.pm = AZX_PM_OPS,
|
.pm = AZX_PM_OPS,
|
||||||
},
|
},
|
||||||
|
|
|
@ -290,8 +290,6 @@ static int hda_tegra_dev_free(struct snd_device *device)
|
||||||
int i;
|
int i;
|
||||||
struct azx *chip = device->device_data;
|
struct azx *chip = device->device_data;
|
||||||
|
|
||||||
azx_notifier_unregister(chip);
|
|
||||||
|
|
||||||
if (chip->initialized) {
|
if (chip->initialized) {
|
||||||
for (i = 0; i < chip->num_streams; i++)
|
for (i = 0; i < chip->num_streams; i++)
|
||||||
azx_stream_stop(chip, &chip->azx_dev[i]);
|
azx_stream_stop(chip, &chip->azx_dev[i]);
|
||||||
|
@ -502,7 +500,6 @@ static int hda_tegra_probe(struct platform_device *pdev)
|
||||||
goto out_free;
|
goto out_free;
|
||||||
|
|
||||||
chip->running = 1;
|
chip->running = 1;
|
||||||
azx_notifier_register(chip);
|
|
||||||
snd_hda_set_power_save(chip->bus, power_save * 1000);
|
snd_hda_set_power_save(chip->bus, power_save * 1000);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -517,6 +514,18 @@ static int hda_tegra_remove(struct platform_device *pdev)
|
||||||
return snd_card_free(dev_get_drvdata(&pdev->dev));
|
return snd_card_free(dev_get_drvdata(&pdev->dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void hda_tegra_shutdown(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct snd_card *card = dev_get_drvdata(&pdev->dev);
|
||||||
|
struct azx *chip;
|
||||||
|
|
||||||
|
if (!card)
|
||||||
|
return;
|
||||||
|
chip = card->private_data;
|
||||||
|
if (chip && chip->running)
|
||||||
|
azx_stop_chip(chip);
|
||||||
|
}
|
||||||
|
|
||||||
static struct platform_driver tegra_platform_hda = {
|
static struct platform_driver tegra_platform_hda = {
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "tegra-hda",
|
.name = "tegra-hda",
|
||||||
|
@ -525,6 +534,7 @@ static struct platform_driver tegra_platform_hda = {
|
||||||
},
|
},
|
||||||
.probe = hda_tegra_probe,
|
.probe = hda_tegra_probe,
|
||||||
.remove = hda_tegra_remove,
|
.remove = hda_tegra_remove,
|
||||||
|
.shutdown = hda_tegra_shutdown,
|
||||||
};
|
};
|
||||||
module_platform_driver(tegra_platform_hda);
|
module_platform_driver(tegra_platform_hda);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue