File: /usr/src/linux/include/asm-sparc/audioio.h
1 /*
2 * include/asm-sparc/audioio.h
3 *
4 * Sparc Audio Midlayer
5 * Copyright (C) 1996 Thomas K. Dyas (tdyas@noc.rutgers.edu)
6 */
7
8 #ifndef _AUDIOIO_H_
9 #define _AUDIOIO_H_
10
11 /*
12 * SunOS/Solaris /dev/audio interface
13 */
14
15 #if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
16 #include <linux/types.h>
17 #include <linux/time.h>
18 #include <linux/ioctl.h>
19 #endif
20
21 /*
22 * This structure contains state information for audio device IO streams.
23 */
24 typedef struct audio_prinfo {
25 /*
26 * The following values describe the audio data encoding.
27 */
28 unsigned int sample_rate; /* samples per second */
29 unsigned int channels; /* number of interleaved channels */
30 unsigned int precision; /* bit-width of each sample */
31 unsigned int encoding; /* data encoding method */
32
33 /*
34 * The following values control audio device configuration
35 */
36 unsigned int gain; /* gain level: 0 - 255 */
37 unsigned int port; /* selected I/O port (see below) */
38 unsigned int avail_ports; /* available I/O ports (see below) */
39 unsigned int _xxx[2]; /* Reserved for future use */
40
41 unsigned int buffer_size; /* I/O buffer size */
42
43 /*
44 * The following values describe driver state
45 */
46 unsigned int samples; /* number of samples converted */
47 unsigned int eof; /* End Of File counter (play only) */
48
49 unsigned char pause; /* non-zero for pause, zero to resume */
50 unsigned char error; /* non-zero if overflow/underflow */
51 unsigned char waiting; /* non-zero if a process wants access */
52 unsigned char balance; /* stereo channel balance */
53
54 unsigned short minordev;
55
56 /*
57 * The following values are read-only state flags
58 */
59 unsigned char open; /* non-zero if open access permitted */
60 unsigned char active; /* non-zero if I/O is active */
61 } audio_prinfo_t;
62
63
64 /*
65 * This structure describes the current state of the audio device.
66 */
67 typedef struct audio_info {
68 /*
69 * Per-stream information
70 */
71 audio_prinfo_t play; /* output status information */
72 audio_prinfo_t record; /* input status information */
73
74 /*
75 * Per-unit/channel information
76 */
77 unsigned int monitor_gain; /* input to output mix: 0 - 255 */
78 unsigned char output_muted; /* non-zero if output is muted */
79 unsigned char _xxx[3]; /* Reserved for future use */
80 unsigned int _yyy[3]; /* Reserved for future use */
81 } audio_info_t;
82
83
84 /*
85 * Audio encoding types
86 */
87 #define AUDIO_ENCODING_NONE (0) /* no encoding assigned */
88 #define AUDIO_ENCODING_ULAW (1) /* u-law encoding */
89 #define AUDIO_ENCODING_ALAW (2) /* A-law encoding */
90 #define AUDIO_ENCODING_LINEAR (3) /* Linear PCM encoding */
91 #define AUDIO_ENCODING_FLOAT (4) /* IEEE float (-1. <-> +1.) */
92 #define AUDIO_ENCODING_DVI (104) /* DVI ADPCM */
93 #define AUDIO_ENCODING_LINEAR8 (105) /* 8 bit UNSIGNED */
94 #define AUDIO_ENCODING_LINEARLE (106) /* Linear PCM LE encoding */
95
96 /*
97 * These ranges apply to record, play, and monitor gain values
98 */
99 #define AUDIO_MIN_GAIN (0) /* minimum gain value */
100 #define AUDIO_MAX_GAIN (255) /* maximum gain value */
101
102 /*
103 * These values apply to the balance field to adjust channel gain values
104 */
105 #define AUDIO_LEFT_BALANCE (0) /* left channel only */
106 #define AUDIO_MID_BALANCE (32) /* equal left/right channel */
107 #define AUDIO_RIGHT_BALANCE (64) /* right channel only */
108 #define AUDIO_BALANCE_SHIFT (3)
109
110 /*
111 * Generic minimum/maximum limits for number of channels, both modes
112 */
113 #define AUDIO_MIN_PLAY_CHANNELS (1)
114 #define AUDIO_MAX_PLAY_CHANNELS (4)
115 #define AUDIO_MIN_REC_CHANNELS (1)
116 #define AUDIO_MAX_REC_CHANNELS (4)
117
118 /*
119 * Generic minimum/maximum limits for sample precision
120 */
121 #define AUDIO_MIN_PLAY_PRECISION (8)
122 #define AUDIO_MAX_PLAY_PRECISION (32)
123 #define AUDIO_MIN_REC_PRECISION (8)
124 #define AUDIO_MAX_REC_PRECISION (32)
125
126 /*
127 * Define some convenient names for typical audio ports
128 */
129 /*
130 * output ports (several may be enabled simultaneously)
131 */
132 #define AUDIO_SPEAKER 0x01 /* output to built-in speaker */
133 #define AUDIO_HEADPHONE 0x02 /* output to headphone jack */
134 #define AUDIO_LINE_OUT 0x04 /* output to line out */
135
136 /*
137 * input ports (usually only one at a time)
138 */
139 #define AUDIO_MICROPHONE 0x01 /* input from microphone */
140 #define AUDIO_LINE_IN 0x02 /* input from line in */
141 #define AUDIO_CD 0x04 /* input from on-board CD inputs */
142 #define AUDIO_INTERNAL_CD_IN AUDIO_CD /* input from internal CDROM */
143 #define AUDIO_ANALOG_LOOPBACK 0x40 /* input from output */
144
145
146 /*
147 * This macro initializes an audio_info structure to 'harmless' values.
148 * Note that (~0) might not be a harmless value for a flag that was
149 * a signed int.
150 */
151 #define AUDIO_INITINFO(i) { \
152 unsigned int *__x__; \
153 for (__x__ = (unsigned int *)(i); \
154 (char *) __x__ < (((char *)(i)) + sizeof (audio_info_t)); \
155 *__x__++ = ~0); \
156 }
157
158 /*
159 * These allow testing for what the user wants to set
160 */
161 #define AUD_INITVALUE (~0)
162 #define Modify(X) ((unsigned int)(X) != AUD_INITVALUE)
163 #define Modifys(X) ((X) != (unsigned short)AUD_INITVALUE)
164 #define Modifyc(X) ((X) != (unsigned char)AUD_INITVALUE)
165
166 /*
167 * Parameter for the AUDIO_GETDEV ioctl to determine current
168 * audio devices.
169 */
170 #define MAX_AUDIO_DEV_LEN (16)
171 typedef struct audio_device {
172 char name[MAX_AUDIO_DEV_LEN];
173 char version[MAX_AUDIO_DEV_LEN];
174 char config[MAX_AUDIO_DEV_LEN];
175 } audio_device_t;
176
177
178 /*
179 * Ioctl calls for the audio device.
180 */
181
182 /*
183 * AUDIO_GETINFO retrieves the current state of the audio device.
184 *
185 * AUDIO_SETINFO copies all fields of the audio_info structure whose
186 * values are not set to the initialized value (-1) to the device state.
187 * It performs an implicit AUDIO_GETINFO to return the new state of the
188 * device. Note that the record.samples and play.samples fields are set
189 * to the last value before the AUDIO_SETINFO took effect. This allows
190 * an application to reset the counters while atomically retrieving the
191 * last value.
192 *
193 * AUDIO_DRAIN suspends the calling process until the write buffers are
194 * empty.
195 *
196 * AUDIO_GETDEV returns a structure of type audio_device_t which contains
197 * three strings. The string "name" is a short identifying string (for
198 * example, the SBus Fcode name string), the string "version" identifies
199 * the current version of the device, and the "config" string identifies
200 * the specific configuration of the audio stream. All fields are
201 * device-dependent -- see the device specific manual pages for details.
202 *
203 * AUDIO_GETDEV_SUNOS returns a number which is an audio device defined
204 * herein (making it not too portable)
205 *
206 * AUDIO_FLUSH stops all playback and recording, clears all queued buffers,
207 * resets error counters, and restarts recording and playback as appropriate
208 * for the current sampling mode.
209 */
210 #define AUDIO_GETINFO _IOR('A', 1, audio_info_t)
211 #define AUDIO_SETINFO _IOWR('A', 2, audio_info_t)
212 #define AUDIO_DRAIN _IO('A', 3)
213 #define AUDIO_GETDEV _IOR('A', 4, audio_device_t)
214 #define AUDIO_GETDEV_SUNOS _IOR('A', 4, int)
215 #define AUDIO_FLUSH _IO('A', 5)
216
217 /* Define possible audio hardware configurations for
218 * old SunOS-style AUDIO_GETDEV ioctl */
219 #define AUDIO_DEV_UNKNOWN (0) /* not defined */
220 #define AUDIO_DEV_AMD (1) /* audioamd device */
221 #define AUDIO_DEV_SPEAKERBOX (2) /* dbri device with speakerbox */
222 #define AUDIO_DEV_CODEC (3) /* dbri device (internal speaker) */
223 #define AUDIO_DEV_CS4231 (5) /* cs4231 device */
224
225 /*
226 * The following ioctl sets the audio device into an internal loopback mode,
227 * if the hardware supports this. The argument is TRUE to set loopback,
228 * FALSE to reset to normal operation. If the hardware does not support
229 * internal loopback, the ioctl should fail with EINVAL.
230 * Causes ADC data to be digitally mixed in and sent to the DAC.
231 */
232 #define AUDIO_DIAG_LOOPBACK _IOW('A', 101, int)
233
234 /*
235 * Linux kernel internal implementation.
236 */
237
238 #ifdef __KERNEL__
239
240 #include <linux/fs.h>
241 #include <linux/tqueue.h>
242 #include <linux/wait.h>
243
244 #define SDF_OPEN_WRITE 0x00000001
245 #define SDF_OPEN_READ 0x00000002
246
247 struct sparcaudio_ringbuffer
248 {
249 __u8 *rb_start, *rb_end; /* start, end of this memory buffer */
250 __u8 *rb_in, *rb_out; /* input, output pointers */
251
252 int rb_fragsize; /* size of an audio frag */
253 int rb_numfrags; /* number of frags */
254
255 int rb_count, rb_hiwat, rb_lowat; /* bytes in use, hi/lo wat points */
256
257 int rb_bufsize; /* total size of buffer */
258 };
259
260 struct sparcaudio_driver
261 {
262 const char * name;
263 struct sparcaudio_operations *ops;
264 void *private;
265 unsigned long flags;
266 struct strevent *sd_siglist;
267 /* duplex: 0=simplex, 1=duplex, 2=loop */
268 int sd_sigflags, duplex;
269
270 /* Which audio device are we? */
271 int index;
272
273 /* This device */
274 struct sbus_dev *dev;
275
276 /* Processes blocked on open() sit here. */
277 wait_queue_head_t open_wait;
278
279 /* Task queue for this driver's bottom half. */
280 struct tq_struct tqueue;
281
282 /* Start of ring buffer support */
283 __u8 *input_buffer, *output_buffer;
284
285 /* Support for a circular queue of output buffers. */
286 __u8 **output_buffers;
287 size_t *output_sizes, output_size, output_buffer_size;
288 int num_output_buffers, output_front, output_rear, output_offset;
289 int output_count, output_active, playing_count, output_eof;
290 wait_queue_head_t output_write_wait, output_drain_wait;
291 char *output_notify;
292
293 /* Support for a circular queue of input buffers. */
294 __u8 **input_buffers;
295 size_t *input_sizes, input_size, input_buffer_size;
296 int num_input_buffers, input_front, input_rear, input_offset;
297 int input_count, input_active, recording_count;
298 wait_queue_head_t input_read_wait;
299
300 /* Hack to make it look like we support variable size buffers. */
301 int buffer_size;
302
303 int mixer_modify_counter;
304 };
305
306 struct sparcaudio_operations
307 {
308 int (*open)(struct inode *, struct file *, struct sparcaudio_driver *);
309 void (*release)(struct inode *, struct file *, struct sparcaudio_driver *);
310 int (*ioctl)(struct inode *, struct file *, unsigned int, unsigned long,
311 struct sparcaudio_driver *);
312
313 /* Ask driver to begin playing a buffer. */
314 void (*start_output)(struct sparcaudio_driver *, __u8 *, unsigned long);
315
316 /* Ask driver to stop playing a buffer. */
317 void (*stop_output)(struct sparcaudio_driver *);
318
319 /* Ask driver to begin recording into a buffer. */
320 void (*start_input)(struct sparcaudio_driver *, __u8 *, unsigned long);
321
322 /* Ask driver to stop recording. */
323 void (*stop_input)(struct sparcaudio_driver *);
324
325 /* Return driver name/version to caller. (/dev/audio specific) */
326 void (*sunaudio_getdev)(struct sparcaudio_driver *, audio_device_t *);
327
328 /* Get and set the output volume. (0-255) */
329 int (*set_output_volume)(struct sparcaudio_driver *, int);
330 int (*get_output_volume)(struct sparcaudio_driver *);
331
332 /* Get and set the input volume. (0-255) */
333 int (*set_input_volume)(struct sparcaudio_driver *, int);
334 int (*get_input_volume)(struct sparcaudio_driver *);
335
336 /* Get and set the monitor volume. (0-255) */
337 int (*set_monitor_volume)(struct sparcaudio_driver *, int);
338 int (*get_monitor_volume)(struct sparcaudio_driver *);
339
340 /* Get and set the output balance. (0-64) */
341 int (*set_output_balance)(struct sparcaudio_driver *, int);
342 int (*get_output_balance)(struct sparcaudio_driver *);
343
344 /* Get and set the input balance. (0-64) */
345 int (*set_input_balance)(struct sparcaudio_driver *, int);
346 int (*get_input_balance)(struct sparcaudio_driver *);
347
348 /* Get and set the output channels. (1-4) */
349 int (*set_output_channels)(struct sparcaudio_driver *, int);
350 int (*get_output_channels)(struct sparcaudio_driver *);
351
352 /* Get and set the input channels. (1-4) */
353 int (*set_input_channels)(struct sparcaudio_driver *, int);
354 int (*get_input_channels)(struct sparcaudio_driver *);
355
356 /* Get and set the output precision. (8-32) */
357 int (*set_output_precision)(struct sparcaudio_driver *, int);
358 int (*get_output_precision)(struct sparcaudio_driver *);
359
360 /* Get and set the input precision. (8-32) */
361 int (*set_input_precision)(struct sparcaudio_driver *, int);
362 int (*get_input_precision)(struct sparcaudio_driver *);
363
364 /* Get and set the output port. () */
365 int (*set_output_port)(struct sparcaudio_driver *, int);
366 int (*get_output_port)(struct sparcaudio_driver *);
367
368 /* Get and set the input port. () */
369 int (*set_input_port)(struct sparcaudio_driver *, int);
370 int (*get_input_port)(struct sparcaudio_driver *);
371
372 /* Get and set the output encoding. () */
373 int (*set_output_encoding)(struct sparcaudio_driver *, int);
374 int (*get_output_encoding)(struct sparcaudio_driver *);
375
376 /* Get and set the input encoding. () */
377 int (*set_input_encoding)(struct sparcaudio_driver *, int);
378 int (*get_input_encoding)(struct sparcaudio_driver *);
379
380 /* Get and set the output rate. () */
381 int (*set_output_rate)(struct sparcaudio_driver *, int);
382 int (*get_output_rate)(struct sparcaudio_driver *);
383
384 /* Get and set the input rate. () */
385 int (*set_input_rate)(struct sparcaudio_driver *, int);
386 int (*get_input_rate)(struct sparcaudio_driver *);
387
388 /* Return driver number to caller. (SunOS /dev/audio specific) */
389 int (*sunaudio_getdev_sunos)(struct sparcaudio_driver *);
390
391 /* Get available ports */
392 int (*get_output_ports)(struct sparcaudio_driver *);
393 int (*get_input_ports)(struct sparcaudio_driver *);
394
395 /* Get and set output mute */
396 int (*set_output_muted)(struct sparcaudio_driver *, int);
397 int (*get_output_muted)(struct sparcaudio_driver *);
398
399 /* Get and set output pause */
400 int (*set_output_pause)(struct sparcaudio_driver *, int);
401 int (*get_output_pause)(struct sparcaudio_driver *);
402
403 /* Get and set input pause */
404 int (*set_input_pause)(struct sparcaudio_driver *, int);
405 int (*get_input_pause)(struct sparcaudio_driver *);
406
407 /* Get and set output samples */
408 int (*set_output_samples)(struct sparcaudio_driver *, int);
409 int (*get_output_samples)(struct sparcaudio_driver *);
410
411 /* Get and set input samples */
412 int (*set_input_samples)(struct sparcaudio_driver *, int);
413 int (*get_input_samples)(struct sparcaudio_driver *);
414
415 /* Get and set output error */
416 int (*set_output_error)(struct sparcaudio_driver *, int);
417 int (*get_output_error)(struct sparcaudio_driver *);
418
419 /* Get and set input error */
420 int (*set_input_error)(struct sparcaudio_driver *, int);
421 int (*get_input_error)(struct sparcaudio_driver *);
422
423 /* Get supported encodings */
424 int (*get_formats)(struct sparcaudio_driver *);
425 };
426
427 extern int register_sparcaudio_driver(struct sparcaudio_driver *, int);
428 extern int unregister_sparcaudio_driver(struct sparcaudio_driver *, int);
429 extern void sparcaudio_output_done(struct sparcaudio_driver *, int);
430 extern void sparcaudio_input_done(struct sparcaudio_driver *, int);
431
432 #endif
433
434 /* Device minor numbers */
435
436 #define SPARCAUDIO_MIXER_MINOR 0
437 /* No sequencer (1) */
438 /* No midi (2) */
439 #define SPARCAUDIO_DSP_MINOR 3
440 #define SPARCAUDIO_AUDIO_MINOR 4
441 #define SPARCAUDIO_DSP16_MINOR 5
442 #define SPARCAUDIO_STATUS_MINOR 6
443 #define SPARCAUDIO_AUDIOCTL_MINOR 7
444 /* No sequencer l2 (8) */
445 /* No sound processor (9) */
446
447 /* allocate 2^SPARCAUDIO_DEVICE_SHIFT minors per audio device */
448 #define SPARCAUDIO_DEVICE_SHIFT 4
449
450 /* With the coming of dummy devices this should perhaps be as high as 5? */
451 #define SPARCAUDIO_MAX_DEVICES 3
452
453 /* Streams crap for realaudio */
454
455 typedef
456 struct strevent {
457 struct strevent *se_next; /* next event for this stream or NULL*/
458 struct strevent *se_prev; /* previous event for this stream or last
459 * event if this is the first one*/
460 pid_t se_pid; /* process to be signaled */
461 short se_evs; /* events wanted */
462 } strevent_t;
463
464 typedef
465 struct stdata
466 {
467 struct stdata *sd_next ; /* all stdatas are linked together */
468 struct stdata *sd_prev ;
469 struct strevent *sd_siglist; /* processes to be sent SIGPOLL */
470 int sd_sigflags; /* logical OR of all siglist events */
471 } stdata_t;
472
473 #define I_NREAD _IOR('S',01, int)
474 #define I_NREAD_SOLARIS (('S'<<8)|1)
475
476 #define I_FLUSH _IO('S',05)
477 #define I_FLUSH_SOLARIS (('S'<<8)|5)
478 #define FLUSHR 1 /* flush read queue */
479 #define FLUSHW 2 /* flush write queue */
480 #define FLUSHRW 3 /* flush both queues */
481
482 #define I_SETSIG _IO('S',011)
483 #define I_SETSIG_SOLARIS (('S'<<8)|11)
484 #define S_INPUT 0x01
485 #define S_HIPRI 0x02
486 #define S_OUTPUT 0x04
487 #define S_MSG 0x08
488 #define S_ERROR 0x0010
489 #define S_HANGUP 0x0020
490 #define S_RDNORM 0x0040
491 #define S_WRNORM S_OUTPUT
492 #define S_RDBAND 0x0080
493 #define S_WRBAND 0x0100
494 #define S_BANDURG 0x0200
495 #define S_ALL 0x03FF
496
497 #define I_GETSIG _IOR('S',012,int)
498 #define I_GETSIG_SOLARIS (('S'<<8)|12)
499
500 /* Conversion between Sun and OSS volume settings */
501 static __inline__
502 int OSS_LEFT(int value)
503 {
504 return ((value & 0xff) % 101);
505 }
506
507 static __inline__
508 int OSS_RIGHT(int value)
509 {
510 return (((value >> 8) & 0xff) % 101);
511 }
512
513 static __inline__
514 int O_TO_S(int value)
515 {
516 return value * 255 / 100;
517 }
518
519 static __inline__
520 int S_TO_O(int value)
521 {
522 return value * 100 / 255;
523 }
524
525 static __inline__
526 int OSS_TO_GAIN(int value)
527 {
528 int l = O_TO_S(OSS_LEFT(value));
529 int r = O_TO_S(OSS_RIGHT(value));
530 return ((l > r) ? l : r);
531 }
532
533 static __inline__
534 int OSS_TO_LGAIN(int value)
535 {
536 int l = O_TO_S(OSS_LEFT(value));
537 int r = O_TO_S(OSS_RIGHT(value));
538 return ((l < r) ? l : r);
539 }
540
541 static __inline__
542 int OSS_TO_BAL(int value)
543 {
544 if (!OSS_TO_GAIN(value))
545 return AUDIO_MID_BALANCE;
546 if (!OSS_TO_LGAIN(value)) {
547 if (OSS_TO_GAIN(value) == OSS_TO_GAIN(OSS_RIGHT(value)))
548 return AUDIO_RIGHT_BALANCE;
549 else
550 return AUDIO_LEFT_BALANCE;
551 }
552 if (OSS_TO_GAIN(value) == OSS_TO_GAIN(OSS_RIGHT(value)))
553 return ((OSS_TO_GAIN(value) - OSS_TO_LGAIN(value)) >> AUDIO_BALANCE_SHIFT)
554 + AUDIO_MID_BALANCE;
555 else
556 return AUDIO_MID_BALANCE - ((OSS_TO_GAIN(value) - OSS_TO_LGAIN(value))
557 >> AUDIO_BALANCE_SHIFT);
558 }
559
560 static __inline__
561 int BAL_TO_OSS(int value, unsigned char balance)
562 {
563 int l, r, adj;
564 if (balance > 63) balance = 63;
565 if (balance < AUDIO_MID_BALANCE) {
566 l = (int)value * 100 / 255 + ((value * 100 % 255) > 0);
567 adj = ((AUDIO_MID_BALANCE - balance) << AUDIO_BALANCE_SHIFT);
568 if (adj < value)
569 r = (int)(value - adj)
570 * 100 / 255;
571 else r = 0;
572 } else if (balance > AUDIO_MID_BALANCE) {
573 r = (int)value * 100 / 255 + ((value * 100 % 255) > 0);
574 adj = ((balance - AUDIO_MID_BALANCE) << AUDIO_BALANCE_SHIFT);
575 if (adj < value)
576 l = (int)(value - adj)
577 * 100 / 255;
578 else l = 0;
579 } else {
580 l = r = (int)value * 100 / 255 + ((value * 100 % 255) > 0);
581 }
582
583 return ((r << 8) + l);
584 }
585
586 #ifdef __KERNEL__
587 /* OSS mixer ioctl port handling */
588 static __inline__
589 int OSS_PORT_AUDIO(struct sparcaudio_driver *drv, unsigned int set)
590 {
591 int p;
592 if (drv->ops->get_output_port) {
593 p = drv->ops->get_output_port(drv);
594 if (p & set)
595 return 0x6464;
596 }
597 return 0;
598 }
599
600 static __inline__
601 int OSS_IPORT_AUDIO(struct sparcaudio_driver *drv, unsigned int set)
602 {
603 int p;
604 if (drv->ops->get_input_port) {
605 p = drv->ops->get_input_port(drv);
606 if (p & set)
607 return 0x6464;
608 }
609 return 0;
610 }
611
612 static __inline__
613 void OSS_TWIDDLE_PORT(struct sparcaudio_driver *drv, unsigned int ioctl,
614 unsigned int port, unsigned int set, unsigned int value)
615 {
616 if (ioctl == port) {
617 int p;
618 if (drv->ops->get_output_port && drv->ops->set_output_port) {
619 p = drv->ops->get_output_port(drv);
620 if ((value == 0) || ((p & set) && (OSS_LEFT(value) < 100)))
621 drv->ops->set_output_port(drv, p & ~(set));
622 else
623 drv->ops->set_output_port(drv, p | set);
624 }
625 }
626 }
627
628 static __inline__
629 void OSS_TWIDDLE_IPORT(struct sparcaudio_driver *drv, unsigned int ioctl,
630 unsigned int port, unsigned int set, unsigned int value)
631 {
632 if (ioctl == port) {
633 int p;
634 if (drv->ops->get_input_port && drv->ops->set_input_port) {
635 p = drv->ops->get_input_port(drv);
636 if ((value == 0) || ((p & set) && (OSS_LEFT(value) < 100)))
637 drv->ops->set_input_port(drv, p & ~(set));
638 else
639 drv->ops->set_input_port(drv, p | set);
640 }
641 }
642 }
643 #endif /* __KERNEL__ */
644 #endif /* _AUDIOIO_H_ */
645