diff options
| author | jmcneill <jmcneill@NetBSD.org> | 2008-06-02 11:33:22 +0000 |
|---|---|---|
| committer | jmcneill <jmcneill@NetBSD.org> | 2008-06-02 11:33:22 +0000 |
| commit | cec27ea38cc071c5b0c2aaab5d84b8a148f65b69 (patch) | |
| tree | 72aa6f13c895be169bad55882392caa271edec8b /sys/dev | |
| parent | 6dd8a2b97b36d7627a6cbafd75d010683f1acfab (diff) | |
Allow azalia to be built as a module.
Diffstat (limited to 'sys/dev')
| -rw-r--r-- | sys/dev/pci/azalia.c | 70 |
1 files changed, 68 insertions, 2 deletions
diff --git a/sys/dev/pci/azalia.c b/sys/dev/pci/azalia.c index d203deb2692..4bd29fb5383 100644 --- a/sys/dev/pci/azalia.c +++ b/sys/dev/pci/azalia.c @@ -1,4 +1,4 @@ -/* $NetBSD: azalia.c,v 1.57 2008/05/13 20:21:19 mjf Exp $ */ +/* $NetBSD: azalia.c,v 1.58 2008/06/02 11:33:22 jmcneill Exp $ */ /*- * Copyright (c) 2005 The NetBSD Foundation, Inc. @@ -41,13 +41,14 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: azalia.c,v 1.57 2008/05/13 20:21:19 mjf Exp $"); +__KERNEL_RCSID(0, "$NetBSD: azalia.c,v 1.58 2008/06/02 11:33:22 jmcneill Exp $"); #include <sys/param.h> #include <sys/device.h> #include <sys/fcntl.h> #include <sys/malloc.h> #include <sys/systm.h> +#include <sys/module.h> #include <dev/audio_if.h> #include <dev/auconv.h> #include <dev/pci/pcidevs.h> @@ -2408,3 +2409,68 @@ azalia_params2fmt(const audio_params_t *param, uint16_t *fmt) *fmt = ret; return 0; } + +#ifdef _MODULE + +MODULE(MODULE_CLASS_DRIVER, azalia, NULL); + +static const struct cfiattrdata audiobuscf_iattrdata = { + "audiobus", 0, { { NULL, NULL, 0 }, } +}; +static const struct cfiattrdata * const azalia_attrs[] = { + &audiobuscf_iattrdata, NULL +}; +CFDRIVER_DECL(azalia, DV_DULL, azalia_attrs); +extern struct cfattach azalia_ca; +static int azalialoc[] = { -1, -1 }; +static struct cfparent pciparent = { + "pci", "pci", DVUNIT_ANY +}; +static struct cfdata azalia_cfdata[] = { + { + .cf_name = "azalia", + .cf_atname = "azalia", + .cf_unit = 0, + .cf_fstate = FSTATE_STAR, + .cf_loc = azalialoc, + .cf_flags = 0, + .cf_pspec = &pciparent, + }, + { NULL } +}; + +static int +azalia_modcmd(modcmd_t cmd, void *arg) +{ + int err; + + switch (cmd) { + case MODULE_CMD_INIT: + err = config_cfdriver_attach(&azalia_cd); + if (err) + return err; + err = config_cfattach_attach("azalia", &azalia_ca); + if (err) { + config_cfdriver_detach(&azalia_cd); + return err; + } + err = config_cfdata_attach(azalia_cfdata, 1); + if (err) { + config_cfattach_detach("azalia", &azalia_ca); + config_cfdriver_detach(&azalia_cd); + return err; + } + return 0; + case MODULE_CMD_FINI: + err = config_cfdriver_detach(&azalia_cd); + if (err) + return err; + config_cfattach_detach("azalia", &azalia_ca); + config_cfdriver_detach(&azalia_cd); + return 0; + default: + return ENOTTY; + } +} + +#endif |
