2
* Purpose: OSS module wrapper for Solaris
4
* This file will be included from the auto-generated drv_cfg.c files. Under
5
* Solaris this file will be compiled in the development system.
9
* This file is part of Open Sound System.
11
* Copyright (C) 4Front Technologies 1996-2008.
13
* This this source file is released under GPL v2 license (no other versions).
14
* See the COPYING file included in the main directory of this source
15
* distribution for the license terms and conditions.
18
#include <sys/types.h>
19
#include <sys/modctl.h>
23
#include <sys/sunddi.h>
25
static int ossdrv_getinfo (dev_info_t *, ddi_info_cmd_t, void *, void **);
26
static int ossdrv_attach (dev_info_t *, ddi_attach_cmd_t);
27
static int ossdrv_detach (dev_info_t *, ddi_detach_cmd_t);
29
#ifdef OSS_POWER_MANAGE
30
static int ossdrv_power (dev_info_t *, int component, int level);
33
/* Entry points structure */
34
#if DRIVER_TYPE!=DRV_STREAMS
36
static struct cb_ops ossdrv_cb_ops = {
39
nodev, /* not a block driver */
40
nodev, /* no print routine */
41
nodev, /* no dump routine */
45
#ifdef ALLOW_BUFFER_MAPPING
48
nodev, /* no devmap routine */
51
nodev, /* no segmap routine */
52
oss_chpoll, /* no chpoll routine */
54
0, /* not a STREAMS driver */
55
D_NEW | D_MP | D_64BIT, /* safe for multi-thread/multi-processor */
59
extern struct streamtab DRIVER_STR_INFO;
61
struct cb_ops ossdrv_streams_cb_ops = {
64
nodev, /* not a block driver */
65
nodev, /* no print routine */
66
nodev, /* no dump routine */
70
nodev, /* no devmap routine */
72
nodev, /* no segmap routine */
73
nochpoll, /* no chpoll routine */
75
&DRIVER_STR_INFO, /* cb_str */
76
D_NEW | D_MP | D_64BIT, /* safe for multi-thread/multi-processor */
79
nodev, /* cb_awrite */
83
static struct dev_ops ossdrv_dev_ops = {
84
DEVO_REV, /* devo_rev */
86
ossdrv_getinfo, /* devo_getinfo */
87
nulldev, /* devo_identify - obsolete */
88
#if DRIVER_TYPE==DRV_ISA
91
nulldev, /* devo_probe */
93
ossdrv_attach, /* devo_attach */
94
ossdrv_detach, /* devo_detach */
95
nodev, /* devo_reset */
96
#if DRIVER_TYPE==DRV_STREAMS
97
&ossdrv_streams_cb_ops, /* devi_cb_ops */
99
&ossdrv_cb_ops, /* devi_cb_ops */
101
NULL, /* devo_bus_ops */
102
#ifdef OSS_POWER_MANAGE
105
NULL /* devo_power */
109
static struct modldrv ossdrv_modldrv = {
110
&mod_driverops, /* drv_modops */
111
"OSS " OSS_VERSION_STRING,
112
&ossdrv_dev_ops, /* drv_dev_ops */
115
static struct modlinkage ossdrv_modlinkage = {
116
MODREV_1, /* ml_rev */
117
(void *) &ossdrv_modldrv, /* ml_linkage */
118
NULL /* NULL terminates the list */
122
* _init, _info, and _fini support loading and unloading the driver.
129
error = mod_install (&ossdrv_modlinkage);
139
error = mod_remove (&ossdrv_modlinkage);
144
_info (struct modinfo *modinfop)
148
error = mod_info (&ossdrv_modlinkage, modinfop);
155
ossdrv_getinfo (dev_info_t * dontcare_dip, ddi_info_cmd_t cmd, void *arg,
168
minor = getminor (dev);
170
if (minor >= oss_num_cdevs)
176
if ((cdev = oss_cdevs[minor]) == NULL || cdev->osdev == NULL)
182
dip = cdev->osdev->dip;
189
/* cmn_err (CE_WARN, "ossdrv_getinfo: dip==NULL\n"); */
193
instance = ddi_get_instance (dip);
197
case DDI_INFO_DEVT2DEVINFO:
201
case DDI_INFO_DEVT2INSTANCE:
202
*result = (void *) (long)instance;
210
DDB (cmn_err (CE_CONT,
211
"oss_getinfo: returns %d, result=%lx instance=%d dev=%x\n",
212
error, (unsigned long)*result, instance, (unsigned int)dev));
217
ossdrv_attach (dev_info_t * dip, ddi_attach_cmd_t cmd)
222
#ifdef OSS_SUSPEND_RESUME
223
if (cmd != DDI_RESUME) /* Allow resume */
225
if (cmd != DDI_ATTACH)
227
cmn_err (CE_WARN, "bad attach cmd %d\n", cmd);
233
cmn_err (CE_WARN, "ossdrv_attach: dip==NULL\n");
237
#ifdef OSS_SUSPEND_RESUME
238
if (cmd == DDI_RESUME)
240
if ((osdev = (oss_device_t *) ddi_get_driver_private (dip)) == NULL)
242
cmn_err (CE_WARN, "ddi_get_driver_private() failed\n");
245
if (!DRIVER_RESUME(osdev))
252
instance = ddi_get_instance (dip);
254
(CE_CONT, "Attach started " DRIVER_NICK "%d (%s)\n", instance,
255
ddi_get_name (dip)));
258
osdev_create (dip, DRIVER_TYPE, instance, DRIVER_NICK, NULL)) == NULL)
263
oss_load_options (osdev, oss_global_options);
264
oss_load_options (osdev, local_driver_options);
266
#if DRIVER_TYPE==DRV_PCI || DRIVER_TYPE == DRV_ISA
270
ddi_get_iblock_cookie (dip, 0, &osdev->iblock_cookie)) != DDI_SUCCESS)
272
cmn_err (CE_WARN, "Cannot get iblock cookie (%d)\n", err);
277
/* NOTE! The USB driver (actually udi.c) will call usb_get_data() to obtain */
278
/* the iblock_cookie. There is no need to do that here. */
279
osdev->iblock_cookie = 0;
282
if (!DRIVER_ATTACH (osdev))
284
cmn_err (CE_WARN, "Attach failed\n");
285
osdev_delete (osdev);
289
ddi_set_driver_private (dip, (caddr_t) osdev);
290
ddi_report_dev (dip);
291
#if DRIVER_TYPE != DRV_USB
292
oss_audio_delayed_attach ();
295
DDB (cmn_err (CE_CONT, "Attach done " DRIVER_NICK "%d\n", instance));
301
ossdrv_detach (dev_info_t * dip, ddi_detach_cmd_t cmd)
305
#ifdef OSS_SUSPEND_RESUME
306
if (cmd != DDI_SUSPEND) /* Allow suspend */
308
if (cmd != DDI_DETACH)
310
cmn_err (CE_WARN, "bad detach cmd %d\n", cmd);
316
cmn_err (CE_WARN, "ossdrv_detach: dip==NULL\n");
319
//cmn_err(CE_CONT, "Detach started " DRIVER_NICK "\n");
322
(CE_CONT, "Detach started " DRIVER_NICK "(%s)\n", ddi_get_name (dip)));
323
if ((osdev = (oss_device_t *) ddi_get_driver_private (dip)) == NULL)
325
cmn_err (CE_WARN, "ddi_get_driver_private() failed\n");
331
cmn_err (CE_WARN, "Driver osdev==NULL - cannot detach\n");
335
#ifdef OSS_SUSPEND_RESUME
336
if (cmd == DDI_SUSPEND)
338
if (!DRIVER_SUSPEND(osdev))
344
if (DRIVER_DETACH (osdev) <= 0)
346
cmn_err (CE_WARN, "Driver busy - cannot detach\n");
350
#if DRIVER_TYPE!=DRV_VMIX
351
osdev_delete (osdev);
354
DDB (cmn_err (CE_CONT, "Detach done " DRIVER_NICK "\n"));
358
#ifdef OSS_POWER_MANAGE
360
ossdrv_power (dev_info_t *dip, int component, int level)
366
cmn_err (CE_WARN, "ossdrv_detach: dip==NULL\n");
371
(CE_CONT, "ossdrv_power " DRIVER_NICK "(%s, %d, %d)\n", ddi_get_name (dip), component, level));
372
if ((osdev = (oss_device_t *) ddi_get_driver_private (dip)) == NULL)
374
cmn_err (CE_WARN, "ddi_get_driver_private() failed\n");
380
cmn_err (CE_WARN, "Driver osdev==NULL - cannot detach\n");
384
if (!DRIVER_POWER(osdev, component, level))