Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 6506
b: refs/heads/master
c: 0ca06a0
h: refs/heads/master
v: v3
  • Loading branch information
Liam Girdwood authored and Jaroslav Kysela committed Aug 30, 2005
1 parent 96c25d2 commit bdde393
Show file tree
Hide file tree
Showing 6 changed files with 130 additions and 4 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: 67ed4161f60d76b3b27efc085b36357a6a90768c
refs/heads/master: 0ca06a00e206b963587ac471e6d1c52bf33b9a18
6 changes: 6 additions & 0 deletions trunk/include/sound/ac97_codec.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
*/

#include <linux/bitops.h>
#include <linux/device.h>
#include "pcm.h"
#include "control.h"
#include "info.h"
Expand Down Expand Up @@ -523,6 +524,7 @@ struct _snd_ac97 {
/* jack-sharing info */
unsigned char indep_surround;
unsigned char channel_mode;
struct device dev;
};

/* conditions */
Expand Down Expand Up @@ -602,4 +604,8 @@ struct ac97_enum {
unsigned short mask;
const char **texts;
};

/* ad hoc AC97 device driver access */
extern struct bus_type ac97_bus_type;

#endif /* __SOUND_AC97_CODEC_H */
10 changes: 7 additions & 3 deletions trunk/sound/pci/Kconfig
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
# ALSA PCI drivers

menu "PCI devices"
depends on SND!=n && PCI

config SND_AC97_CODEC
tristate
select SND_PCM
select SND_AC97_BUS

config SND_AC97_BUS
tristate

menu "PCI devices"
depends on SND!=n && PCI

config SND_ALI5451
tristate "ALi M5451 PCI Audio Controller"
Expand Down
2 changes: 2 additions & 0 deletions trunk/sound/pci/ac97/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@ snd-ac97-codec-objs += ac97_proc.o
endif

snd-ak4531-codec-objs := ak4531_codec.o
snd-ac97-bus-objs := ac97_bus.o

# Toplevel Module Dependency
obj-$(CONFIG_SND_AC97_CODEC) += snd-ac97-codec.o
obj-$(CONFIG_SND_ENS1370) += snd-ak4531-codec.o
obj-$(CONFIG_SND_AC97_BUS) += snd-ac97-bus.o

obj-m := $(sort $(obj-m))
79 changes: 79 additions & 0 deletions trunk/sound/pci/ac97/ac97_bus.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Linux driver model AC97 bus interface
*
* Author: Nicolas Pitre
* Created: Jan 14, 2005
* Copyright: (C) MontaVista Software Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*/

#include <linux/module.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/string.h>

/*
* Codec families have names seperated by commas, so we search for an
* individual codec name within the family string.
*/
static int ac97_bus_match(struct device *dev, struct device_driver *drv)
{
return (strstr(dev->bus_id, drv->name) != NULL);
}

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, SUSPEND_DISABLE);
if (ret == 0)
ret = dev->driver->suspend(dev, state, SUSPEND_SAVE_STATE);
if (ret == 0)
ret = dev->driver->suspend(dev, state, SUSPEND_POWER_DOWN);
}
return ret;
}

static int ac97_bus_resume(struct device *dev)
{
int ret = 0;

if (dev->driver && dev->driver->resume) {
ret = dev->driver->resume(dev, RESUME_POWER_ON);
if (ret == 0)
ret = dev->driver->resume(dev, RESUME_RESTORE_STATE);
if (ret == 0)
ret = dev->driver->resume(dev, RESUME_ENABLE);
}
return ret;
}

struct bus_type ac97_bus_type = {
.name = "ac97",
.match = ac97_bus_match,
.suspend = ac97_bus_suspend,
.resume = ac97_bus_resume,
};

static int __init ac97_bus_init(void)
{
return bus_register(&ac97_bus_type);
}

subsys_initcall(ac97_bus_init);

static void __exit ac97_bus_exit(void)
{
bus_unregister(&ac97_bus_type);
}

module_exit(ac97_bus_exit);

EXPORT_SYMBOL(ac97_bus_type);

MODULE_LICENSE("GPL");
35 changes: 35 additions & 0 deletions trunk/sound/pci/ac97/ac97_codec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1813,6 +1813,39 @@ int snd_ac97_bus(snd_card_t *card, int num, ac97_bus_ops_t *ops,
return 0;
}

/* stop no dev release warning */
static void ac97_device_release(struct device * dev)
{
}

/* register ac97 codec to bus */
static int snd_ac97_dev_register(snd_device_t *device)
{
ac97_t *ac97 = device->device_data;
int err;

ac97->dev.bus = &ac97_bus_type;
ac97->dev.parent = ac97->bus->card->dev;
ac97->dev.platform_data = ac97;
ac97->dev.release = ac97_device_release;
strncpy(ac97->dev.bus_id, snd_ac97_get_short_name(ac97), BUS_ID_SIZE);
if ((err = device_register(&ac97->dev)) < 0) {
snd_printk(KERN_ERR "Can't register ac97 bus\n");
ac97->dev.bus = NULL;
return err;
}
return 0;
}

/* unregister ac97 codec */
static int snd_ac97_dev_unregister(snd_device_t *device)
{
ac97_t *ac97 = device->device_data;
if (ac97->dev.bus)
device_unregister(&ac97->dev);
return snd_ac97_free(ac97);
}

/* build_ops to do nothing */
static struct snd_ac97_build_ops null_build_ops;

Expand Down Expand Up @@ -1846,6 +1879,8 @@ int snd_ac97_mixer(ac97_bus_t *bus, ac97_template_t *template, ac97_t **rac97)
const ac97_codec_id_t *pid;
static snd_device_ops_t ops = {
.dev_free = snd_ac97_dev_free,
.dev_register = snd_ac97_dev_register,
.dev_unregister = snd_ac97_dev_unregister,
};

snd_assert(rac97 != NULL, return -EINVAL);
Expand Down

0 comments on commit bdde393

Please sign in to comment.