Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 16043
b: refs/heads/master
c: a381a7a
h: refs/heads/master
i:
  16041: ea1833d
  16039: baf8bbe
v: v3
  • Loading branch information
Takashi Iwai authored and Jaroslav Kysela committed Jan 3, 2006
1 parent 87b6330 commit cc500ce
Show file tree
Hide file tree
Showing 6 changed files with 4 additions and 301 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: fd66e0d0591dd12eb0bea1e9f3aa194bb93cebbd
refs/heads/master: a381a7a66486f11606eccb8866e29848f995278f
28 changes: 0 additions & 28 deletions trunk/include/sound/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -134,14 +134,8 @@ struct snd_card {
wait_queue_head_t shutdown_sleep;
struct work_struct free_workq; /* for free in workqueue */
struct device *dev;
#ifdef CONFIG_SND_GENERIC_DRIVER
struct snd_generic_device *generic_dev;
#endif

#ifdef CONFIG_PM
int (*pm_suspend)(struct snd_card *card, pm_message_t state);
int (*pm_resume)(struct snd_card *card);
void *pm_private_data;
unsigned int power_state; /* power state */
struct semaphore power_lock; /* power lock */
wait_queue_head_t power_sleep;
Expand Down Expand Up @@ -178,33 +172,13 @@ static inline void snd_power_change_state(struct snd_card *card, unsigned int st
/* init.c */
int snd_power_wait(struct snd_card *card, unsigned int power_state, struct file *file);

int snd_card_set_pm_callback(struct snd_card *card,
int (*suspend)(struct snd_card *, pm_message_t),
int (*resume)(struct snd_card *),
void *private_data);
int snd_card_set_generic_pm_callback(struct snd_card *card,
int (*suspend)(struct snd_card *, pm_message_t),
int (*resume)(struct snd_card *),
void *private_data);
#define snd_card_set_isa_pm_callback(card,suspend,resume,data) \
snd_card_set_generic_pm_callback(card, suspend, resume, data)
struct pci_dev;
int snd_card_pci_suspend(struct pci_dev *dev, pm_message_t state);
int snd_card_pci_resume(struct pci_dev *dev);
#define SND_PCI_PM_CALLBACKS \
.suspend = snd_card_pci_suspend, .resume = snd_card_pci_resume

#else /* ! CONFIG_PM */

#define snd_power_lock(card) do { (void)(card); } while (0)
#define snd_power_unlock(card) do { (void)(card); } while (0)
static inline int snd_power_wait(struct snd_card *card, unsigned int state, struct file *file) { return 0; }
#define snd_power_get_state(card) SNDRV_CTL_POWER_D0
#define snd_power_change_state(card, state) do { (void)(card); } while (0)
#define snd_card_set_pm_callback(card,suspend,resume,data)
#define snd_card_set_generic_pm_callback(card,suspend,resume,data)
#define snd_card_set_isa_pm_callback(card,suspend,resume,data)
#define SND_PCI_PM_CALLBACKS

#endif /* CONFIG_PM */

Expand Down Expand Up @@ -280,8 +254,6 @@ int snd_card_file_remove(struct snd_card *card, struct file *file);
#ifndef snd_card_set_dev
#define snd_card_set_dev(card,devptr) ((card)->dev = (devptr))
#endif
/* register a generic device (for ISA, etc) */
int snd_card_set_generic_dev(struct snd_card *card);

/* device.c */

Expand Down
4 changes: 0 additions & 4 deletions trunk/sound/core/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,3 @@ config SND_DEBUG_DETECT
help
Say Y here to enable extra-verbose log messages printed when
detecting devices.

config SND_GENERIC_DRIVER
bool
depends on SND
44 changes: 1 addition & 43 deletions trunk/sound/core/control.c
Original file line number Diff line number Diff line change
Expand Up @@ -1023,36 +1023,6 @@ static int snd_ctl_subscribe_events(struct snd_ctl_file *file, int __user *ptr)
return 0;
}

#ifdef CONFIG_PM
/*
* change the power state
*/
static int snd_ctl_set_power_state(struct snd_card *card, unsigned int power_state)
{
switch (power_state) {
case SNDRV_CTL_POWER_D0:
if (card->power_state != power_state) {
card->pm_resume(card);
snd_power_change_state(card, power_state);
}
break;
case SNDRV_CTL_POWER_D3hot:
if (card->power_state != power_state) {
card->pm_suspend(card, PMSG_SUSPEND);
snd_power_change_state(card, power_state);
}
break;
case SNDRV_CTL_POWER_D1:
case SNDRV_CTL_POWER_D2:
case SNDRV_CTL_POWER_D3cold:
/* not supported yet */
default:
return -EINVAL;
}
return 0;
}
#endif

static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
struct snd_ctl_file *ctl;
Expand Down Expand Up @@ -1092,19 +1062,7 @@ static long snd_ctl_ioctl(struct file *file, unsigned int cmd, unsigned long arg
case SNDRV_CTL_IOCTL_SUBSCRIBE_EVENTS:
return snd_ctl_subscribe_events(ctl, ip);
case SNDRV_CTL_IOCTL_POWER:
if (get_user(err, ip))
return -EFAULT;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
#ifdef CONFIG_PM
if (card->pm_suspend && card->pm_resume) {
snd_power_lock(card);
err = snd_ctl_set_power_state(card, err);
snd_power_unlock(card);
} else
#endif
err = -ENOPROTOOPT;
return err;
return -ENOPROTOOPT;
case SNDRV_CTL_IOCTL_POWER_STATE:
#ifdef CONFIG_PM
return put_user(card->power_state, ip) ? -EFAULT : 0;
Expand Down
205 changes: 2 additions & 203 deletions trunk/sound/core/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@
#include <linux/ctype.h>
#include <linux/pci.h>
#include <linux/pm.h>
#include <linux/platform_device.h>

#include <sound/core.h>
#include <sound/control.h>
Expand Down Expand Up @@ -229,12 +228,6 @@ int snd_card_disconnect(struct snd_card *card)
return 0;
}

#ifdef CONFIG_SND_GENERIC_DRIVER
static void snd_generic_device_unregister(struct snd_card *card);
#else
#define snd_generic_device_unregister(x) /*NOP*/
#endif

/**
* snd_card_free - frees given soundcard structure
* @card: soundcard structure
Expand Down Expand Up @@ -286,7 +279,6 @@ int snd_card_free(struct snd_card *card)
snd_printk(KERN_WARNING "unable to free card info\n");
/* Not fatal error */
}
snd_generic_device_unregister(card);
while (card->s_f_ops) {
s_f_ops = card->s_f_ops;
card->s_f_ops = s_f_ops->next;
Expand Down Expand Up @@ -459,7 +451,8 @@ int snd_card_register(struct snd_card *card)

static struct snd_info_entry *snd_card_info_entry = NULL;

static void snd_card_info_read(struct snd_info_entry *entry, struct snd_info_buffer *buffer)
static void snd_card_info_read(struct snd_info_entry *entry,
struct snd_info_buffer *buffer)
{
int idx, count;
struct snd_card *card;
Expand Down Expand Up @@ -666,97 +659,6 @@ int snd_card_file_remove(struct snd_card *card, struct file *file)
return 0;
}

#ifdef CONFIG_SND_GENERIC_DRIVER
/*
* generic device without a proper bus using platform_device
* (e.g. ISA)
*/
struct snd_generic_device {
struct platform_device pdev;
struct snd_card *card;
};

#define get_snd_generic_card(dev) container_of(dev, struct snd_generic_device, pdev)->card

#define SND_GENERIC_NAME "snd_generic"

#ifdef CONFIG_PM
static int snd_generic_suspend(struct platform_device *dev, pm_message_t state);
static int snd_generic_resume(struct platform_device *dev);
#endif

/* initialized in sound.c */
struct platform_driver snd_generic_driver = {
#ifdef CONFIG_PM
.suspend = snd_generic_suspend,
.resume = snd_generic_resume,
#endif
.driver = {
.name = SND_GENERIC_NAME,
},
};

void snd_generic_device_release(struct device *dev)
{
}

static int snd_generic_device_register(struct snd_card *card)
{
struct snd_generic_device *dev;
int err;

if (card->generic_dev)
return 0; /* already registered */

dev = kzalloc(sizeof(*dev), GFP_KERNEL);
if (! dev) {
snd_printk(KERN_ERR "can't allocate generic_device\n");
return -ENOMEM;
}

dev->pdev.name = SND_GENERIC_NAME;
dev->pdev.id = card->number;
dev->pdev.dev.release = snd_generic_device_release;
dev->card = card;
if ((err = platform_device_register(&dev->pdev)) < 0) {
kfree(dev);
return err;
}
card->generic_dev = dev;
return 0;
}

static void snd_generic_device_unregister(struct snd_card *card)
{
struct snd_generic_device *dev = card->generic_dev;
if (dev) {
platform_device_unregister(&dev->pdev);
kfree(dev);
card->generic_dev = NULL;
}
}

/**
* snd_card_set_generic_dev - assign the generic device to the card
* @card: soundcard structure
*
* Assigns a generic device to the card. This function is provided as the
* last resort, for devices without any proper bus. Thus this won't override
* the device already assigned to the card.
*
* Returns zero if successful, or a negative error code.
*/
int snd_card_set_generic_dev(struct snd_card *card)
{
int err;
if ((err = snd_generic_device_register(card)) < 0)
return err;
if (! card->dev)
snd_card_set_dev(card, &card->generic_dev->pdev.dev);
return 0;
}
#endif /* CONFIG_SND_GENERIC_DRIVER */

#ifdef CONFIG_PM
/**
* snd_power_wait - wait until the power-state is changed.
Expand Down Expand Up @@ -800,107 +702,4 @@ int snd_power_wait(struct snd_card *card, unsigned int power_state, struct file
return result;
}

/**
* snd_card_set_pm_callback - set the PCI power-management callbacks
* @card: soundcard structure
* @suspend: suspend callback function
* @resume: resume callback function
* @private_data: private data to pass to the callback functions
*
* Sets the power-management callback functions of the card.
* These callbacks are called from ALSA's common PCI suspend/resume
* handler and from the control API.
*/
int snd_card_set_pm_callback(struct snd_card *card,
int (*suspend)(struct snd_card *, pm_message_t),
int (*resume)(struct snd_card *),
void *private_data)
{
card->pm_suspend = suspend;
card->pm_resume = resume;
card->pm_private_data = private_data;
return 0;
}

#ifdef CONFIG_SND_GENERIC_DRIVER
/* suspend/resume callbacks for snd_generic platform device */
static int snd_generic_suspend(struct platform_device *dev, pm_message_t state)
{
struct snd_card *card;

card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D3hot)
return 0;
if (card->pm_suspend)
card->pm_suspend(card, PMSG_SUSPEND);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
return 0;
}

static int snd_generic_resume(struct platform_device *dev)
{
struct snd_card *card;

card = get_snd_generic_card(dev);
if (card->power_state == SNDRV_CTL_POWER_D0)
return 0;
if (card->pm_resume)
card->pm_resume(card);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}

/**
* snd_card_set_generic_pm_callback - set the generic power-management callbacks
* @card: soundcard structure
* @suspend: suspend callback function
* @resume: resume callback function
* @private_data: private data to pass to the callback functions
*
* Registers the power-management and sets the lowlevel callbacks for
* the given card. These callbacks are called from the ALSA's common
* PM handler and from the control API.
*/
int snd_card_set_generic_pm_callback(struct snd_card *card,
int (*suspend)(struct snd_card *, pm_message_t),
int (*resume)(struct snd_card *),
void *private_data)
{
int err;
if ((err = snd_generic_device_register(card)) < 0)
return err;
return snd_card_set_pm_callback(card, suspend, resume, private_data);
}
#endif /* CONFIG_SND_GENERIC_DRIVER */

#ifdef CONFIG_PCI
int snd_card_pci_suspend(struct pci_dev *dev, pm_message_t state)
{
struct snd_card *card = pci_get_drvdata(dev);
int err;
if (! card || ! card->pm_suspend)
return 0;
if (card->power_state == SNDRV_CTL_POWER_D3hot)
return 0;
err = card->pm_suspend(card, PMSG_SUSPEND);
pci_save_state(dev);
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
return err;
}

int snd_card_pci_resume(struct pci_dev *dev)
{
struct snd_card *card = pci_get_drvdata(dev);
if (! card || ! card->pm_resume)
return 0;
if (card->power_state == SNDRV_CTL_POWER_D0)
return 0;
/* restore the PCI config space */
pci_restore_state(dev);
card->pm_resume(card);
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
return 0;
}
#endif

#endif /* CONFIG_PM */
Loading

0 comments on commit cc500ce

Please sign in to comment.