xref: /haiku/src/add-ons/kernel/drivers/audio/sb16/driver.c (revision 1e60bdeab63fa7a57bc9a55b032052e95a18bd2c)
1 #include "driver.h"
2 
3 sb16_dev_t device;
4 
5 const char* devs[2] = {
6 	NULL, NULL
7 };
8 
9 const char** publish_devices(void); /* Just to silence compiler */
10 
11 static status_t
12 extract_driver_settings(void* settings, sb16_dev_t* sb16)
13 {
14 	const char* port;
15 	const char* irq;
16 	const char* dma8;
17 	const char* dma16;
18 	const char* midiport;
19 	status_t rc;
20 
21 	if ((port=get_driver_parameter(settings, "port", "220", NULL)) != NULL &&
22 		(irq=get_driver_parameter(settings, "irq", "5", NULL)) != NULL &&
23 		(dma8=get_driver_parameter(settings, "dma8", "1", NULL)) != NULL &&
24 		(dma16=get_driver_parameter(settings, "dma16", "5", NULL)) != NULL &&
25 		(midiport=get_driver_parameter(settings, "midiport", "330", NULL)) != NULL) {
26 		sb16->port	= strtol(port, NULL, 16);
27 		sb16->irq	= strtol(irq, NULL, 16);
28 		sb16->dma8	= strtol(dma8, NULL, 16);
29 		sb16->dma16	= strtol(dma16, NULL, 16);
30 		sb16->midiport	= strtol(midiport, NULL, 16);
31 
32 		rc = B_OK;
33 	} else {
34 		rc = B_BAD_VALUE;
35 	}
36 
37 	return rc;
38 }
39 
40 //#pragma mark --
41 
42 int32 api_version = B_CUR_DRIVER_API_VERSION;
43 
44 status_t
45 init_hardware(void)
46 {
47 	return B_OK;
48 }
49 
50 status_t
51 init_driver (void)
52 {
53 	void* settings = load_driver_settings("sb16");
54 	status_t rc;
55 
56 	if (settings != NULL) {
57 		rc = extract_driver_settings(settings, &device);
58 		if (rc == B_OK) {
59 			devs[0] = DEVFS_PATH "/sb16/0";
60 			dprintf("%s: publishing %s\n", __func__, devs[0]);
61 		}
62 	} else
63 		rc = ENODEV;
64 
65 	return rc;
66 }
67 
68 void
69 uninit_driver (void)
70 {
71 }
72 
73 const char**
74 publish_devices(void)
75 {
76 	return devs;
77 }
78 
79 device_hooks*
80 find_device(const char* name)
81 {
82 	return &driver_hooks;
83 }
84