OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [sound/] [vwsnd.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 * Sound driver for Silicon Graphics 320 and 540 Visual Workstations'
3
 * onboard audio.  See notes in ../../Documentation/sound/vwsnd .
4
 *
5
 * Copyright 1999 Silicon Graphics, Inc.  All rights reserved.
6
 *
7
 * This program is free software; you can redistribute it and/or modify
8
 * it under the terms of the GNU General Public License as published by
9
 * the Free Software Foundation; either version 2 of the License, or
10
 * (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20
 */
21
 
22
#undef VWSND_DEBUG                      /* define for debugging */
23
 
24
/*
25
 * XXX to do -
26
 *
27
 *      External sync.
28
 *      Rename swbuf, hwbuf, u&i, hwptr&swptr to something rational.
29
 *      Bug - if select() called before read(), pcm_setup() not called.
30
 *      Bug - output doesn't stop soon enough if process killed.
31
 */
32
 
33
/*
34
 * Things to test -
35
 *
36
 *      Will readv/writev work?  Write a test.
37
 *
38
 *      insmod/rmmod 100 million times.
39
 *
40
 *      Run I/O until int ptrs wrap around (roughly 6.2 hours @ DAT
41
 *      rate).
42
 *
43
 *      Concurrent threads banging on mixer simultaneously, both UP
44
 *      and SMP kernels.  Especially, watch for thread A changing
45
 *      OUTSRC while thread B changes gain -- both write to the same
46
 *      ad1843 register.
47
 *
48
 *      What happens if a client opens /dev/audio then forks?
49
 *      Do two procs have /dev/audio open?  Test.
50
 *
51
 *      Pump audio through the CD, MIC and line inputs and verify that
52
 *      they mix/mute into the output.
53
 *
54
 *      Apps:
55
 *              amp
56
 *              mpg123
57
 *              x11amp
58
 *              mxv
59
 *              kmedia
60
 *              esound
61
 *              need more input apps
62
 *
63
 *      Run tests while bombarding with signals.  setitimer(2) will do it...  */
64
 
65
/*
66
 * This driver is organized in nine sections.
67
 * The nine sections are:
68
 *
69
 *      debug stuff
70
 *      low level lithium access
71
 *      high level lithium access
72
 *      AD1843 access
73
 *      PCM I/O
74
 *      audio driver
75
 *      mixer driver
76
 *      probe/attach/unload
77
 *      initialization and loadable kernel module interface
78
 *
79
 * That is roughly the order of increasing abstraction, so forward
80
 * dependencies are minimal.
81
 */
82
 
83
/*
84
 * Locking Notes
85
 *
86
 *      INC_USE_COUNT and DEC_USE_COUNT keep track of the number of
87
 *      open descriptors to this driver. They store it in vwsnd_use_count.
88
 *      The global device list, vwsnd_dev_list, is immutable when the IN_USE
89
 *      is true.
90
 *
91
 *      devc->open_lock is a semaphore that is used to enforce the
92
 *      single reader/single writer rule for /dev/audio.  The rule is
93
 *      that each device may have at most one reader and one writer.
94
 *      Open will block until the previous client has closed the
95
 *      device, unless O_NONBLOCK is specified.
96
 *
97
 *      The semaphore devc->io_sema serializes PCM I/O syscalls.  This
98
 *      is unnecessary in Linux 2.2, because the kernel lock
99
 *      serializes read, write, and ioctl globally, but it's there,
100
 *      ready for the brave, new post-kernel-lock world.
101
 *
102
 *      Locking between interrupt and baselevel is handled by the
103
 *      "lock" spinlock in vwsnd_port (one lock each for read and
104
 *      write).  Each half holds the lock just long enough to see what
105
 *      area it owns and update its pointers.  See pcm_output() and
106
 *      pcm_input() for most of the gory stuff.
107
 *
108
 *      devc->mix_sema serializes all mixer ioctls.  This is also
109
 *      redundant because of the kernel lock.
110
 *
111
 *      The lowest level lock is lith->lithium_lock.  It is a
112
 *      spinlock which is held during the two-register tango of
113
 *      reading/writing an AD1843 register.  See
114
 *      li_{read,write}_ad1843_reg().
115
 */
116
 
117
/*
118
 * Sample Format Notes
119
 *
120
 *      Lithium's DMA engine has two formats: 16-bit 2's complement
121
 *      and 8-bit unsigned .  16-bit transfers the data unmodified, 2
122
 *      bytes per sample.  8-bit unsigned transfers 1 byte per sample
123
 *      and XORs each byte with 0x80.  Lithium can input or output
124
 *      either mono or stereo in either format.
125
 *
126
 *      The AD1843 has four formats: 16-bit 2's complement, 8-bit
127
 *      unsigned, 8-bit mu-Law and 8-bit A-Law.
128
 *
129
 *      This driver supports five formats: AFMT_S8, AFMT_U8,
130
 *      AFMT_MU_LAW, AFMT_A_LAW, and AFMT_S16_LE.
131
 *
132
 *      For AFMT_U8 output, we keep the AD1843 in 16-bit mode, and
133
 *      rely on Lithium's XOR to translate between U8 and S8.
134
 *
135
 *      For AFMT_S8, AFMT_MU_LAW and AFMT_A_LAW output, we have to XOR
136
 *      the 0x80 bit in software to compensate for Lithium's XOR.
137
 *      This happens in pcm_copy_{in,out}().
138
 *
139
 * Changes:
140
 * 11-10-2000   Bartlomiej Zolnierkiewicz <bkz@linux-ide.org>
141
 *              Added some __init/__exit
142
 */
143
 
144
#include <linux/module.h>
145
#include <linux/init.h>
146
 
147
#include <linux/sched.h>
148
#include <linux/semaphore.h>
149
#include <linux/stddef.h>
150
#include <linux/spinlock.h>
151
#include <linux/smp_lock.h>
152
#include <asm/fixmap.h>
153
#include <asm/cobalt.h>
154
#include <asm/semaphore.h>
155
 
156
#include "sound_config.h"
157
 
158
/*****************************************************************************/
159
/* debug stuff */
160
 
161
#ifdef VWSND_DEBUG
162
 
163
#include <linux/interrupt.h>            /* for in_interrupt() */
164
 
165
static int shut_up = 1;
166
 
167
/*
168
 * dbgassert - called when an assertion fails.
169
 */
170
 
171
static void dbgassert(const char *fcn, int line, const char *expr)
172
{
173
        if (in_interrupt())
174
                panic("ASSERTION FAILED IN INTERRUPT, %s:%s:%d %s\n",
175
                      __FILE__, fcn, line, expr);
176
        else {
177
                int x;
178
                printk(KERN_ERR "ASSERTION FAILED, %s:%s:%d %s\n",
179
                       __FILE__, fcn, line, expr);
180
                x = * (volatile int *) 0; /* force proc to exit */
181
        }
182
}
183
 
184
/*
185
 * Bunch of useful debug macros:
186
 *
187
 *      ASSERT  - print unless e nonzero (panic if in interrupt)
188
 *      DBGDO   - include arbitrary code if debugging
189
 *      DBGX    - debug print raw (w/o function name)
190
 *      DBGP    - debug print w/ function name
191
 *      DBGE    - debug print function entry
192
 *      DBGC    - debug print function call
193
 *      DBGR    - debug print function return
194
 *      DBGXV   - debug print raw when verbose
195
 *      DBGPV   - debug print when verbose
196
 *      DBGEV   - debug print function entry when verbose
197
 *      DBGRV   - debug print function return when verbose
198
 */
199
 
200
#define ASSERT(e)      ((e) ? (void) 0 : dbgassert(__FUNCTION__, __LINE__, #e))
201
#define DBGDO(x)            x
202
#define DBGX(fmt, args...)  (in_interrupt() ? 0 : printk(KERN_ERR fmt, ##args))
203
#define DBGP(fmt, args...)  (DBGX(__FUNCTION__ ": " fmt, ##args))
204
#define DBGE(fmt, args...)  (DBGX(__FUNCTION__ fmt, ##args))
205
#define DBGC(rtn)           (DBGP("calling %s\n", rtn))
206
#define DBGR()              (DBGP("returning\n"))
207
#define DBGXV(fmt, args...) (shut_up ? 0 : DBGX(fmt, ##args))
208
#define DBGPV(fmt, args...) (shut_up ? 0 : DBGP(fmt, ##args))
209
#define DBGEV(fmt, args...) (shut_up ? 0 : DBGE(fmt, ##args))
210
#define DBGCV(rtn)          (shut_up ? 0 : DBGC(rtn))
211
#define DBGRV()             (shut_up ? 0 : DBGR())
212
 
213
#else /* !VWSND_DEBUG */
214
 
215
#define ASSERT(e)           ((void) 0)
216
#define DBGDO(x)            /* don't */
217
#define DBGX(fmt, args...)  ((void) 0)
218
#define DBGP(fmt, args...)  ((void) 0)
219
#define DBGE(fmt, args...)  ((void) 0)
220
#define DBGC(rtn)           ((void) 0)
221
#define DBGR()              ((void) 0)
222
#define DBGPV(fmt, args...) ((void) 0)
223
#define DBGXV(fmt, args...) ((void) 0)
224
#define DBGEV(fmt, args...) ((void) 0)
225
#define DBGCV(rtn)          ((void) 0)
226
#define DBGRV()             ((void) 0)
227
 
228
#endif /* !VWSND_DEBUG */
229
 
230
/*****************************************************************************/
231
/* low level lithium access */
232
 
233
/*
234
 * We need to talk to Lithium registers on three pages.  Here are
235
 * the pages' offsets from the base address (0xFF001000).
236
 */
237
 
238
enum {
239
        LI_PAGE0_OFFSET = 0x01000 - 0x1000, /* FF001000 */
240
        LI_PAGE1_OFFSET = 0x0F000 - 0x1000, /* FF00F000 */
241
        LI_PAGE2_OFFSET = 0x10000 - 0x1000, /* FF010000 */
242
};
243
 
244
/* low-level lithium data */
245
 
246
typedef struct lithium {
247
        caddr_t         page0;          /* virtual addresses */
248
        caddr_t         page1;
249
        caddr_t         page2;
250
        spinlock_t      lock;           /* protects codec and UST/MSC access */
251
} lithium_t;
252
 
253
/*
254
 * li_create initializes the lithium_t structure and sets up vm mappings
255
 * to access the registers.
256
 * Returns 0 on success, -errno on failure.
257
 */
258
 
259
static int li_create(lithium_t *lith, unsigned long baseaddr)
260
{
261
        static void li_destroy(lithium_t *);
262
 
263
        lith->lock = SPIN_LOCK_UNLOCKED;
264
        lith->page0 = ioremap_nocache(baseaddr + LI_PAGE0_OFFSET, PAGE_SIZE);
265
        lith->page1 = ioremap_nocache(baseaddr + LI_PAGE1_OFFSET, PAGE_SIZE);
266
        lith->page2 = ioremap_nocache(baseaddr + LI_PAGE2_OFFSET, PAGE_SIZE);
267
        if (!lith->page0 || !lith->page1 || !lith->page2) {
268
                li_destroy(lith);
269
                return -ENOMEM;
270
        }
271
        return 0;
272
}
273
 
274
/*
275
 * li_destroy destroys the lithium_t structure and vm mappings.
276
 */
277
 
278
static void li_destroy(lithium_t *lith)
279
{
280
        if (lith->page0) {
281
                iounmap(lith->page0);
282
                lith->page0 = NULL;
283
        }
284
        if (lith->page1) {
285
                iounmap(lith->page1);
286
                lith->page1 = NULL;
287
        }
288
        if (lith->page2) {
289
                iounmap(lith->page2);
290
                lith->page2 = NULL;
291
        }
292
}
293
 
294
/*
295
 * basic register accessors - read/write long/byte
296
 */
297
 
298
static __inline__ unsigned long li_readl(lithium_t *lith, int off)
299
{
300
        return * (volatile unsigned long *) (lith->page0 + off);
301
}
302
 
303
static __inline__ unsigned char li_readb(lithium_t *lith, int off)
304
{
305
        return * (volatile unsigned char *) (lith->page0 + off);
306
}
307
 
308
static __inline__ void li_writel(lithium_t *lith, int off, unsigned long val)
309
{
310
        * (volatile unsigned long *) (lith->page0 + off) = val;
311
}
312
 
313
static __inline__ void li_writeb(lithium_t *lith, int off, unsigned char val)
314
{
315
        * (volatile unsigned char *) (lith->page0 + off) = val;
316
}
317
 
318
/*****************************************************************************/
319
/* High Level Lithium Access */
320
 
321
/*
322
 * Lithium DMA Notes
323
 *
324
 * Lithium has two dedicated DMA channels for audio.  They are known
325
 * as comm1 and comm2 (communication areas 1 and 2).  Comm1 is for
326
 * input, and comm2 is for output.  Each is controlled by three
327
 * registers: BASE (base address), CFG (config) and CCTL
328
 * (config/control).
329
 *
330
 * Each DMA channel points to a physically contiguous ring buffer in
331
 * main memory of up to 8 Kbytes.  (This driver always uses 8 Kb.)
332
 * There are three pointers into the ring buffer: read, write, and
333
 * trigger.  The pointers are 8 bits each.  Each pointer points to
334
 * 32-byte "chunks" of data.  The DMA engine moves 32 bytes at a time,
335
 * so there is no finer-granularity control.
336
 *
337
 * In comm1, the hardware updates the write ptr, and software updates
338
 * the read ptr.  In comm2, it's the opposite: hardware updates the
339
 * read ptr, and software updates the write ptr.  I designate the
340
 * hardware-updated ptr as the hwptr, and the software-updated ptr as
341
 * the swptr.
342
 *
343
 * The trigger ptr and trigger mask are used to trigger interrupts.
344
 * From the Lithium spec, section 5.6.8, revision of 12/15/1998:
345
 *
346
 *      Trigger Mask Value
347
 *
348
 *      A three bit wide field that represents a power of two mask
349
 *      that is used whenever the trigger pointer is compared to its
350
 *      respective read or write pointer.  A value of zero here
351
 *      implies a mask of 0xFF and a value of seven implies a mask
352
 *      0x01.  This value can be used to sub-divide the ring buffer
353
 *      into pie sections so that interrupts monitor the progress of
354
 *      hardware from section to section.
355
 *
356
 * My interpretation of that is, whenever the hw ptr is updated, it is
357
 * compared with the trigger ptr, and the result is masked by the
358
 * trigger mask.  (Actually, by the complement of the trigger mask.)
359
 * If the result is zero, an interrupt is triggered.  I.e., interrupt
360
 * if ((hwptr & ~mask) == (trptr & ~mask)).  The mask is formed from
361
 * the trigger register value as mask = (1 << (8 - tmreg)) - 1.
362
 *
363
 * In yet different words, setting tmreg to 0 causes an interrupt after
364
 * every 256 DMA chunks (8192 bytes) or once per traversal of the
365
 * ring buffer.  Setting it to 7 caues an interrupt every 2 DMA chunks
366
 * (64 bytes) or 128 times per traversal of the ring buffer.
367
 */
368
 
369
/* Lithium register offsets and bit definitions */
370
 
371
#define LI_HOST_CONTROLLER      0x000
372
# define LI_HC_RESET             0x00008000
373
# define LI_HC_LINK_ENABLE       0x00004000
374
# define LI_HC_LINK_FAILURE      0x00000004
375
# define LI_HC_LINK_CODEC        0x00000002
376
# define LI_HC_LINK_READY        0x00000001
377
 
378
#define LI_INTR_STATUS          0x010
379
#define LI_INTR_MASK            0x014
380
# define LI_INTR_LINK_ERR        0x00008000
381
# define LI_INTR_COMM2_TRIG      0x00000008
382
# define LI_INTR_COMM2_UNDERFLOW 0x00000004
383
# define LI_INTR_COMM1_TRIG      0x00000002
384
# define LI_INTR_COMM1_OVERFLOW  0x00000001
385
 
386
#define LI_CODEC_COMMAND        0x018
387
# define LI_CC_BUSY              0x00008000
388
# define LI_CC_DIR               0x00000080
389
#  define LI_CC_DIR_RD            LI_CC_DIR
390
#  define LI_CC_DIR_WR          (!LI_CC_DIR)
391
# define LI_CC_ADDR_MASK         0x0000007F
392
 
393
#define LI_CODEC_DATA           0x01C
394
 
395
#define LI_COMM1_BASE           0x100
396
#define LI_COMM1_CTL            0x104
397
# define LI_CCTL_RESET           0x80000000
398
# define LI_CCTL_SIZE            0x70000000
399
# define LI_CCTL_DMA_ENABLE      0x08000000
400
# define LI_CCTL_TMASK           0x07000000 /* trigger mask */
401
# define LI_CCTL_TPTR            0x00FF0000 /* trigger pointer */
402
# define LI_CCTL_RPTR            0x0000FF00
403
# define LI_CCTL_WPTR            0x000000FF
404
#define LI_COMM1_CFG            0x108
405
# define LI_CCFG_LOCK            0x00008000
406
# define LI_CCFG_SLOT            0x00000070
407
# define LI_CCFG_DIRECTION       0x00000008
408
#  define LI_CCFG_DIR_IN        (!LI_CCFG_DIRECTION)
409
#  define LI_CCFG_DIR_OUT         LI_CCFG_DIRECTION
410
# define LI_CCFG_MODE            0x00000004
411
#  define LI_CCFG_MODE_MONO     (!LI_CCFG_MODE)
412
#  define LI_CCFG_MODE_STEREO     LI_CCFG_MODE
413
# define LI_CCFG_FORMAT          0x00000003
414
#  define LI_CCFG_FMT_8BIT        0x00000000
415
#  define LI_CCFG_FMT_16BIT       0x00000001
416
#define LI_COMM2_BASE           0x10C
417
#define LI_COMM2_CTL            0x110
418
 /* bit definitions are the same as LI_COMM1_CTL */
419
#define LI_COMM2_CFG            0x114
420
 /* bit definitions are the same as LI_COMM1_CFG */
421
 
422
#define LI_UST_LOW              0x200   /* 64-bit Unadjusted System Time is */
423
#define LI_UST_HIGH             0x204   /* microseconds since boot */
424
 
425
#define LI_AUDIO1_UST           0x300   /* UST-MSC pairs */
426
#define LI_AUDIO1_MSC           0x304   /* MSC (Media Stream Counter) */
427
#define LI_AUDIO2_UST           0x308   /* counts samples actually */
428
#define LI_AUDIO2_MSC           0x30C   /* processed as of time UST */
429
 
430
/*
431
 * Lithium's DMA engine operates on chunks of 32 bytes.  We call that
432
 * a DMACHUNK.
433
 */
434
 
435
#define DMACHUNK_SHIFT 5
436
#define DMACHUNK_SIZE (1 << DMACHUNK_SHIFT)
437
#define BYTES_TO_CHUNKS(bytes) ((bytes) >> DMACHUNK_SHIFT)
438
#define CHUNKS_TO_BYTES(chunks) ((chunks) << DMACHUNK_SHIFT)
439
 
440
/*
441
 * Two convenient macros to shift bitfields into/out of position.
442
 *
443
 * Observe that (mask & -mask) is (1 << low_set_bit_of(mask)).
444
 * As long as mask is constant, we trust the compiler will change the
445
 * multipy and divide into shifts.
446
 */
447
 
448
#define SHIFT_FIELD(val, mask) (((val) * ((mask) & -(mask))) & (mask))
449
#define UNSHIFT_FIELD(val, mask) (((val) & (mask)) / ((mask) & -(mask)))
450
 
451
/*
452
 * dma_chan_desc is invariant information about a Lithium
453
 * DMA channel.  There are two instances, li_comm1 and li_comm2.
454
 *
455
 * Note that the CCTL register fields are write ptr and read ptr, but what
456
 * we care about are which pointer is updated by software and which by
457
 * hardware.
458
 */
459
 
460
typedef struct dma_chan_desc {
461
        int basereg;
462
        int cfgreg;
463
        int ctlreg;
464
        int hwptrreg;
465
        int swptrreg;
466
        int ustreg;
467
        int mscreg;
468
        unsigned long swptrmask;
469
        int ad1843_slot;
470
        int direction;                  /* LI_CCTL_DIR_IN/OUT */
471
} dma_chan_desc_t;
472
 
473
static const dma_chan_desc_t li_comm1 = {
474
        LI_COMM1_BASE,                  /* base register offset */
475
        LI_COMM1_CFG,                   /* config register offset */
476
        LI_COMM1_CTL,                   /* control register offset */
477
        LI_COMM1_CTL + 0,                /* hw ptr reg offset (write ptr) */
478
        LI_COMM1_CTL + 1,               /* sw ptr reg offset (read ptr) */
479
        LI_AUDIO1_UST,                  /* ust reg offset */
480
        LI_AUDIO1_MSC,                  /* msc reg offset */
481
        LI_CCTL_RPTR,                   /* sw ptr bitmask in ctlval */
482
        2,                              /* ad1843 serial slot */
483
        LI_CCFG_DIR_IN                  /* direction */
484
};
485
 
486
static const dma_chan_desc_t li_comm2 = {
487
        LI_COMM2_BASE,                  /* base register offset */
488
        LI_COMM2_CFG,                   /* config register offset */
489
        LI_COMM2_CTL,                   /* control register offset */
490
        LI_COMM2_CTL + 1,               /* hw ptr reg offset (read ptr) */
491
        LI_COMM2_CTL + 0,                /* sw ptr reg offset (writr ptr) */
492
        LI_AUDIO2_UST,                  /* ust reg offset */
493
        LI_AUDIO2_MSC,                  /* msc reg offset */
494
        LI_CCTL_WPTR,                   /* sw ptr bitmask in ctlval */
495
        2,                              /* ad1843 serial slot */
496
        LI_CCFG_DIR_OUT                 /* direction */
497
};
498
 
499
/*
500
 * dma_chan is variable information about a Lithium DMA channel.
501
 *
502
 * The desc field points to invariant information.
503
 * The lith field points to a lithium_t which is passed
504
 * to li_read* and li_write* to access the registers.
505
 * The *val fields shadow the lithium registers' contents.
506
 */
507
 
508
typedef struct dma_chan {
509
        const dma_chan_desc_t *desc;
510
        lithium_t      *lith;
511
        unsigned long   baseval;
512
        unsigned long   cfgval;
513
        unsigned long   ctlval;
514
} dma_chan_t;
515
 
516
/*
517
 * ustmsc is a UST/MSC pair (Unadjusted System Time/Media Stream Counter).
518
 * UST is time in microseconds since the system booted, and MSC is a
519
 * counter that increments with every audio sample.
520
 */
521
 
522
typedef struct ustmsc {
523
        unsigned long long ust;
524
        unsigned long msc;
525
} ustmsc_t;
526
 
527
/*
528
 * li_ad1843_wait waits until lithium says the AD1843 register
529
 * exchange is not busy.  Returns 0 on success, -EBUSY on timeout.
530
 *
531
 * Locking: must be called with lithium_lock held.
532
 */
533
 
534
static int li_ad1843_wait(lithium_t *lith)
535
{
536
        unsigned long later = jiffies + 2;
537
        while (li_readl(lith, LI_CODEC_COMMAND) & LI_CC_BUSY)
538
                if (time_after_eq(jiffies, later))
539
                        return -EBUSY;
540
        return 0;
541
}
542
 
543
/*
544
 * li_read_ad1843_reg returns the current contents of a 16 bit AD1843 register.
545
 *
546
 * Returns unsigned register value on success, -errno on failure.
547
 */
548
 
549
static int li_read_ad1843_reg(lithium_t *lith, int reg)
550
{
551
        int val;
552
 
553
        ASSERT(!in_interrupt());
554
        spin_lock(&lith->lock);
555
        {
556
                val = li_ad1843_wait(lith);
557
                if (val == 0) {
558
                        li_writel(lith, LI_CODEC_COMMAND, LI_CC_DIR_RD | reg);
559
                        val = li_ad1843_wait(lith);
560
                }
561
                if (val == 0)
562
                        val = li_readl(lith, LI_CODEC_DATA);
563
        }
564
        spin_unlock(&lith->lock);
565
 
566
        DBGXV("li_read_ad1843_reg(lith=0x%p, reg=%d) returns 0x%04x\n",
567
              lith, reg, val);
568
 
569
        return val;
570
}
571
 
572
/*
573
 * li_write_ad1843_reg writes the specified value to a 16 bit AD1843 register.
574
 */
575
 
576
static void li_write_ad1843_reg(lithium_t *lith, int reg, int newval)
577
{
578
        spin_lock(&lith->lock);
579
        {
580
                if (li_ad1843_wait(lith) == 0) {
581
                        li_writel(lith, LI_CODEC_DATA, newval);
582
                        li_writel(lith, LI_CODEC_COMMAND, LI_CC_DIR_WR | reg);
583
                }
584
        }
585
        spin_unlock(&lith->lock);
586
}
587
 
588
/*
589
 * li_setup_dma calculates all the register settings for DMA in a particular
590
 * mode.  It takes too many arguments.
591
 */
592
 
593
static void li_setup_dma(dma_chan_t *chan,
594
                         const dma_chan_desc_t *desc,
595
                         lithium_t *lith,
596
                         unsigned long buffer_paddr,
597
                         int bufshift,
598
                         int fragshift,
599
                         int channels,
600
                         int sampsize)
601
{
602
        unsigned long mode, format;
603
        unsigned long size, tmask;
604
 
605
        DBGEV("(chan=0x%p, desc=0x%p, lith=0x%p, buffer_paddr=0x%lx, "
606
             "bufshift=%d, fragshift=%d, channels=%d, sampsize=%d)\n",
607
             chan, desc, lith, buffer_paddr,
608
             bufshift, fragshift, channels, sampsize);
609
 
610
        /* Reset the channel first. */
611
 
612
        li_writel(lith, desc->ctlreg, LI_CCTL_RESET);
613
 
614
        ASSERT(channels == 1 || channels == 2);
615
        if (channels == 2)
616
                mode = LI_CCFG_MODE_STEREO;
617
        else
618
                mode = LI_CCFG_MODE_MONO;
619
        ASSERT(sampsize == 1 || sampsize == 2);
620
        if (sampsize == 2)
621
                format = LI_CCFG_FMT_16BIT;
622
        else
623
                format = LI_CCFG_FMT_8BIT;
624
        chan->desc = desc;
625
        chan->lith = lith;
626
 
627
        /*
628
         * Lithium DMA address register takes a 40-bit physical
629
         * address, right-shifted by 8 so it fits in 32 bits.  Bit 37
630
         * must be set -- it enables cache coherence.
631
         */
632
 
633
        ASSERT(!(buffer_paddr & 0xFF));
634
        chan->baseval = (buffer_paddr >> 8) | 1 << (37 - 8);
635
 
636
        chan->cfgval = (!LI_CCFG_LOCK |
637
                        SHIFT_FIELD(desc->ad1843_slot, LI_CCFG_SLOT) |
638
                        desc->direction |
639
                        mode |
640
                        format);
641
 
642
        size = bufshift - 6;
643
        tmask = 13 - fragshift;         /* See Lithium DMA Notes above. */
644
        ASSERT(size >= 2 && size <= 7);
645
        ASSERT(tmask >= 1 && tmask <= 7);
646
        chan->ctlval = (!LI_CCTL_RESET |
647
                        SHIFT_FIELD(size, LI_CCTL_SIZE) |
648
                        !LI_CCTL_DMA_ENABLE |
649
                        SHIFT_FIELD(tmask, LI_CCTL_TMASK) |
650
                        SHIFT_FIELD(0, LI_CCTL_TPTR));
651
 
652
        DBGPV("basereg 0x%x = 0x%lx\n", desc->basereg, chan->baseval);
653
        DBGPV("cfgreg 0x%x = 0x%lx\n", desc->cfgreg, chan->cfgval);
654
        DBGPV("ctlreg 0x%x = 0x%lx\n", desc->ctlreg, chan->ctlval);
655
 
656
        li_writel(lith, desc->basereg, chan->baseval);
657
        li_writel(lith, desc->cfgreg, chan->cfgval);
658
        li_writel(lith, desc->ctlreg, chan->ctlval);
659
 
660
        DBGRV();
661
}
662
 
663
static void li_shutdown_dma(dma_chan_t *chan)
664
{
665
        lithium_t *lith = chan->lith;
666
        caddr_t lith1 = lith->page1;
667
 
668
        DBGEV("(chan=0x%p)\n", chan);
669
 
670
        chan->ctlval &= ~LI_CCTL_DMA_ENABLE;
671
        DBGPV("ctlreg 0x%x = 0x%lx\n", chan->desc->ctlreg, chan->ctlval);
672
        li_writel(lith, chan->desc->ctlreg, chan->ctlval);
673
 
674
        /*
675
         * Offset 0x500 on Lithium page 1 is an undocumented,
676
         * unsupported register that holds the zero sample value.
677
         * Lithium is supposed to output zero samples when DMA is
678
         * inactive, and repeat the last sample when DMA underflows.
679
         * But it has a bug, where, after underflow occurs, the zero
680
         * sample is not reset.
681
         *
682
         * I expect this to break in a future rev of Lithium.
683
         */
684
 
685
        if (lith1 && chan->desc->direction == LI_CCFG_DIR_OUT)
686
                * (volatile unsigned long *) (lith1 + 0x500) = 0;
687
}
688
 
689
/*
690
 * li_activate_dma always starts dma at the beginning of the buffer.
691
 *
692
 * N.B., these may be called from interrupt.
693
 */
694
 
695
static __inline__ void li_activate_dma(dma_chan_t *chan)
696
{
697
        chan->ctlval |= LI_CCTL_DMA_ENABLE;
698
        DBGPV("ctlval = 0x%lx\n", chan->ctlval);
699
        li_writel(chan->lith, chan->desc->ctlreg, chan->ctlval);
700
}
701
 
702
static void li_deactivate_dma(dma_chan_t *chan)
703
{
704
        lithium_t *lith = chan->lith;
705
        caddr_t lith2 = lith->page2;
706
 
707
        chan->ctlval &= ~(LI_CCTL_DMA_ENABLE | LI_CCTL_RPTR | LI_CCTL_WPTR);
708
        DBGPV("ctlval = 0x%lx\n", chan->ctlval);
709
        DBGPV("ctlreg 0x%x = 0x%lx\n", chan->desc->ctlreg, chan->ctlval);
710
        li_writel(lith, chan->desc->ctlreg, chan->ctlval);
711
 
712
        /*
713
         * Offsets 0x98 and 0x9C on Lithium page 2 are undocumented,
714
         * unsupported registers that are internal copies of the DMA
715
         * read and write pointers.  Because of a Lithium bug, these
716
         * registers aren't zeroed correctly when DMA is shut off.  So
717
         * we whack them directly.
718
         *
719
         * I expect this to break in a future rev of Lithium.
720
         */
721
 
722
        if (lith2 && chan->desc->direction == LI_CCFG_DIR_OUT) {
723
                * (volatile unsigned long *) (lith2 + 0x98) = 0;
724
                * (volatile unsigned long *) (lith2 + 0x9C) = 0;
725
        }
726
}
727
 
728
/*
729
 * read/write the ring buffer pointers.  These routines' arguments and results
730
 * are byte offsets from the beginning of the ring buffer.
731
 */
732
 
733
static __inline__ int li_read_swptr(dma_chan_t *chan)
734
{
735
        const unsigned long mask = chan->desc->swptrmask;
736
 
737
        return CHUNKS_TO_BYTES(UNSHIFT_FIELD(chan->ctlval, mask));
738
}
739
 
740
static __inline__ int li_read_hwptr(dma_chan_t *chan)
741
{
742
        return CHUNKS_TO_BYTES(li_readb(chan->lith, chan->desc->hwptrreg));
743
}
744
 
745
static __inline__ void li_write_swptr(dma_chan_t *chan, int val)
746
{
747
        const unsigned long mask = chan->desc->swptrmask;
748
 
749
        ASSERT(!(val & ~CHUNKS_TO_BYTES(0xFF)));
750
        val = BYTES_TO_CHUNKS(val);
751
        chan->ctlval = (chan->ctlval & ~mask) | SHIFT_FIELD(val, mask);
752
        li_writeb(chan->lith, chan->desc->swptrreg, val);
753
}
754
 
755
/* li_read_USTMSC() returns a UST/MSC pair for the given channel. */
756
 
757
static void li_read_USTMSC(dma_chan_t *chan, ustmsc_t *ustmsc)
758
{
759
        lithium_t *lith = chan->lith;
760
        const dma_chan_desc_t *desc = chan->desc;
761
        unsigned long now_low, now_high0, now_high1, chan_ust;
762
 
763
        spin_lock(&lith->lock);
764
        {
765
                /*
766
                 * retry until we do all five reads without the
767
                 * high word changing.  (High word increments
768
                 * every 2^32 microseconds, i.e., not often)
769
                 */
770
                do {
771
                        now_high0 = li_readl(lith, LI_UST_HIGH);
772
                        now_low = li_readl(lith, LI_UST_LOW);
773
 
774
                        /*
775
                         * Lithium guarantees these two reads will be
776
                         * atomic -- ust will not increment after msc
777
                         * is read.
778
                         */
779
 
780
                        ustmsc->msc = li_readl(lith, desc->mscreg);
781
                        chan_ust = li_readl(lith, desc->ustreg);
782
 
783
                        now_high1 = li_readl(lith, LI_UST_HIGH);
784
                } while (now_high0 != now_high1);
785
        }
786
        spin_unlock(&lith->lock);
787
        ustmsc->ust = ((unsigned long long) now_high0 << 32 | chan_ust);
788
}
789
 
790
static void li_enable_interrupts(lithium_t *lith, unsigned int mask)
791
{
792
        DBGEV("(lith=0x%p, mask=0x%x)\n", lith, mask);
793
 
794
        /* clear any already-pending interrupts. */
795
 
796
        li_writel(lith, LI_INTR_STATUS, mask);
797
 
798
        /* enable the interrupts. */
799
 
800
        mask |= li_readl(lith, LI_INTR_MASK);
801
        li_writel(lith, LI_INTR_MASK, mask);
802
}
803
 
804
static void li_disable_interrupts(lithium_t *lith, unsigned int mask)
805
{
806
        unsigned int keepmask;
807
 
808
        DBGEV("(lith=0x%p, mask=0x%x)\n", lith, mask);
809
 
810
        /* disable the interrupts */
811
 
812
        keepmask = li_readl(lith, LI_INTR_MASK) & ~mask;
813
        li_writel(lith, LI_INTR_MASK, keepmask);
814
 
815
        /* clear any pending interrupts. */
816
 
817
        li_writel(lith, LI_INTR_STATUS, mask);
818
}
819
 
820
/* Get the interrupt status and clear all pending interrupts. */
821
 
822
static unsigned int li_get_clear_intr_status(lithium_t *lith)
823
{
824
        unsigned int status;
825
 
826
        status = li_readl(lith, LI_INTR_STATUS);
827
        li_writel(lith, LI_INTR_STATUS, ~0);
828
        return status & li_readl(lith, LI_INTR_MASK);
829
}
830
 
831
static int li_init(lithium_t *lith)
832
{
833
        /* 1. System power supplies stabilize. */
834
 
835
        /* 2. Assert the ~RESET signal. */
836
 
837
        li_writel(lith, LI_HOST_CONTROLLER, LI_HC_RESET);
838
        udelay(1);
839
 
840
        /* 3. Deassert the ~RESET signal and enter a wait period to allow
841
           the AD1843 internal clocks and the external crystal oscillator
842
           to stabilize. */
843
 
844
        li_writel(lith, LI_HOST_CONTROLLER, LI_HC_LINK_ENABLE);
845
        udelay(1);
846
 
847
        return 0;
848
}
849
 
850
/*****************************************************************************/
851
/* AD1843 access */
852
 
853
/*
854
 * AD1843 bitfield definitions.  All are named as in the AD1843 data
855
 * sheet, with ad1843_ prepended and individual bit numbers removed.
856
 *
857
 * E.g., bits LSS0 through LSS2 become ad1843_LSS.
858
 *
859
 * Only the bitfields we need are defined.
860
 */
861
 
862
typedef struct ad1843_bitfield {
863
        char reg;
864
        char lo_bit;
865
        char nbits;
866
} ad1843_bitfield_t;
867
 
868
static const ad1843_bitfield_t
869
        ad1843_PDNO   = {  0, 14,  1 },  /* Converter Power-Down Flag */
870
        ad1843_INIT   = {  0, 15,  1 },  /* Clock Initialization Flag */
871
        ad1843_RIG    = {  2,  0,  4 },  /* Right ADC Input Gain */
872
        ad1843_RMGE   = {  2,  4,  1 }, /* Right ADC Mic Gain Enable */
873
        ad1843_RSS    = {  2,  5,  3 }, /* Right ADC Source Select */
874
        ad1843_LIG    = {  2,  8,  4 }, /* Left ADC Input Gain */
875
        ad1843_LMGE   = {  2, 12,  1 }, /* Left ADC Mic Gain Enable */
876
        ad1843_LSS    = {  2, 13,  3 }, /* Left ADC Source Select */
877
        ad1843_RX1M   = {  4,  0,  5 },  /* Right Aux 1 Mix Gain/Atten */
878
        ad1843_RX1MM  = {  4,  7,  1 }, /* Right Aux 1 Mix Mute */
879
        ad1843_LX1M   = {  4,  8,  5 }, /* Left Aux 1 Mix Gain/Atten */
880
        ad1843_LX1MM  = {  4, 15,  1 }, /* Left Aux 1 Mix Mute */
881
        ad1843_RX2M   = {  5,  0,  5 },  /* Right Aux 2 Mix Gain/Atten */
882
        ad1843_RX2MM  = {  5,  7,  1 }, /* Right Aux 2 Mix Mute */
883
        ad1843_LX2M   = {  5,  8,  5 }, /* Left Aux 2 Mix Gain/Atten */
884
        ad1843_LX2MM  = {  5, 15,  1 }, /* Left Aux 2 Mix Mute */
885
        ad1843_RMCM   = {  7,  0,  5 },  /* Right Mic Mix Gain/Atten */
886
        ad1843_RMCMM  = {  7,  7,  1 }, /* Right Mic Mix Mute */
887
        ad1843_LMCM   = {  7,  8,  5 }, /* Left Mic Mix Gain/Atten */
888
        ad1843_LMCMM  = {  7, 15,  1 }, /* Left Mic Mix Mute */
889
        ad1843_HPOS   = {  8,  4,  1 }, /* Headphone Output Voltage Swing */
890
        ad1843_HPOM   = {  8,  5,  1 }, /* Headphone Output Mute */
891
        ad1843_RDA1G  = {  9,  0,  6 },  /* Right DAC1 Analog/Digital Gain */
892
        ad1843_RDA1GM = {  9,  7,  1 }, /* Right DAC1 Analog Mute */
893
        ad1843_LDA1G  = {  9,  8,  6 }, /* Left DAC1 Analog/Digital Gain */
894
        ad1843_LDA1GM = {  9, 15,  1 }, /* Left DAC1 Analog Mute */
895
        ad1843_RDA1AM = { 11,  7,  1 }, /* Right DAC1 Digital Mute */
896
        ad1843_LDA1AM = { 11, 15,  1 }, /* Left DAC1 Digital Mute */
897
        ad1843_ADLC   = { 15,  0,  2 },  /* ADC Left Sample Rate Source */
898
        ad1843_ADRC   = { 15,  2,  2 }, /* ADC Right Sample Rate Source */
899
        ad1843_DA1C   = { 15,  8,  2 }, /* DAC1 Sample Rate Source */
900
        ad1843_C1C    = { 17,  0, 16 },  /* Clock 1 Sample Rate Select */
901
        ad1843_C2C    = { 20,  0, 16 },  /* Clock 1 Sample Rate Select */
902
        ad1843_DAADL  = { 25,  4,  2 }, /* Digital ADC Left Source Select */
903
        ad1843_DAADR  = { 25,  6,  2 }, /* Digital ADC Right Source Select */
904
        ad1843_DRSFLT = { 25, 15,  1 }, /* Digital Reampler Filter Mode */
905
        ad1843_ADLF   = { 26,  0,  2 }, /* ADC Left Channel Data Format */
906
        ad1843_ADRF   = { 26,  2,  2 }, /* ADC Right Channel Data Format */
907
        ad1843_ADTLK  = { 26,  4,  1 }, /* ADC Transmit Lock Mode Select */
908
        ad1843_SCF    = { 26,  7,  1 }, /* SCLK Frequency Select */
909
        ad1843_DA1F   = { 26,  8,  2 }, /* DAC1 Data Format Select */
910
        ad1843_DA1SM  = { 26, 14,  1 }, /* DAC1 Stereo/Mono Mode Select */
911
        ad1843_ADLEN  = { 27,  0,  1 },  /* ADC Left Channel Enable */
912
        ad1843_ADREN  = { 27,  1,  1 }, /* ADC Right Channel Enable */
913
        ad1843_AAMEN  = { 27,  4,  1 }, /* Analog to Analog Mix Enable */
914
        ad1843_ANAEN  = { 27,  7,  1 }, /* Analog Channel Enable */
915
        ad1843_DA1EN  = { 27,  8,  1 }, /* DAC1 Enable */
916
        ad1843_DA2EN  = { 27,  9,  1 }, /* DAC2 Enable */
917
        ad1843_C1EN   = { 28, 11,  1 }, /* Clock Generator 1 Enable */
918
        ad1843_C2EN   = { 28, 12,  1 }, /* Clock Generator 2 Enable */
919
        ad1843_PDNI   = { 28, 15,  1 }; /* Converter Power Down */
920
 
921
/*
922
 * The various registers of the AD1843 use three different formats for
923
 * specifying gain.  The ad1843_gain structure parameterizes the
924
 * formats.
925
 */
926
 
927
typedef struct ad1843_gain {
928
 
929
        int     negative;               /* nonzero if gain is negative. */
930
        const ad1843_bitfield_t *lfield;
931
        const ad1843_bitfield_t *rfield;
932
 
933
} ad1843_gain_t;
934
 
935
static const ad1843_gain_t ad1843_gain_RECLEV
936
                                = { 0, &ad1843_LIG,   &ad1843_RIG };
937
static const ad1843_gain_t ad1843_gain_LINE
938
                                = { 1, &ad1843_LX1M,  &ad1843_RX1M };
939
static const ad1843_gain_t ad1843_gain_CD
940
                                = { 1, &ad1843_LX2M,  &ad1843_RX2M };
941
static const ad1843_gain_t ad1843_gain_MIC
942
                                = { 1, &ad1843_LMCM,  &ad1843_RMCM };
943
static const ad1843_gain_t ad1843_gain_PCM
944
                                = { 1, &ad1843_LDA1G, &ad1843_RDA1G };
945
 
946
/* read the current value of an AD1843 bitfield. */
947
 
948
static int ad1843_read_bits(lithium_t *lith, const ad1843_bitfield_t *field)
949
{
950
        int w = li_read_ad1843_reg(lith, field->reg);
951
        int val = w >> field->lo_bit & ((1 << field->nbits) - 1);
952
 
953
        DBGXV("ad1843_read_bits(lith=0x%p, field->{%d %d %d}) returns 0x%x\n",
954
              lith, field->reg, field->lo_bit, field->nbits, val);
955
 
956
        return val;
957
}
958
 
959
/*
960
 * write a new value to an AD1843 bitfield and return the old value.
961
 */
962
 
963
static int ad1843_write_bits(lithium_t *lith,
964
                             const ad1843_bitfield_t *field,
965
                             int newval)
966
{
967
        int w = li_read_ad1843_reg(lith, field->reg);
968
        int mask = ((1 << field->nbits) - 1) << field->lo_bit;
969
        int oldval = (w & mask) >> field->lo_bit;
970
        int newbits = (newval << field->lo_bit) & mask;
971
        w = (w & ~mask) | newbits;
972
        (void) li_write_ad1843_reg(lith, field->reg, w);
973
 
974
        DBGXV("ad1843_write_bits(lith=0x%p, field->{%d %d %d}, val=0x%x) "
975
              "returns 0x%x\n",
976
              lith, field->reg, field->lo_bit, field->nbits, newval,
977
              oldval);
978
 
979
        return oldval;
980
}
981
 
982
/*
983
 * ad1843_read_multi reads multiple bitfields from the same AD1843
984
 * register.  It uses a single read cycle to do it.  (Reading the
985
 * ad1843 requires 256 bit times at 12.288 MHz, or nearly 20
986
 * microseconds.)
987
 *
988
 * Called ike this.
989
 *
990
 *  ad1843_read_multi(lith, nfields,
991
 *                    &ad1843_FIELD1, &val1,
992
 *                    &ad1843_FIELD2, &val2, ...);
993
 */
994
 
995
static void ad1843_read_multi(lithium_t *lith, int argcount, ...)
996
{
997
        va_list ap;
998
        const ad1843_bitfield_t *fp;
999
        int w = 0, mask, *value, reg = -1;
1000
 
1001
        va_start(ap, argcount);
1002
        while (--argcount >= 0) {
1003
                fp = va_arg(ap, const ad1843_bitfield_t *);
1004
                value = va_arg(ap, int *);
1005
                if (reg == -1) {
1006
                        reg = fp->reg;
1007
                        w = li_read_ad1843_reg(lith, reg);
1008
                }
1009
                ASSERT(reg == fp->reg);
1010
                mask = (1 << fp->nbits) - 1;
1011
                *value = w >> fp->lo_bit & mask;
1012
        }
1013
        va_end(ap);
1014
}
1015
 
1016
/*
1017
 * ad1843_write_multi stores multiple bitfields into the same AD1843
1018
 * register.  It uses one read and one write cycle to do it.
1019
 *
1020
 * Called like this.
1021
 *
1022
 *  ad1843_write_multi(lith, nfields,
1023
 *                     &ad1843_FIELD1, val1,
1024
 *                     &ad1843_FIELF2, val2, ...);
1025
 */
1026
 
1027
static void ad1843_write_multi(lithium_t *lith, int argcount, ...)
1028
{
1029
        va_list ap;
1030
        int reg;
1031
        const ad1843_bitfield_t *fp;
1032
        int value;
1033
        int w, m, mask, bits;
1034
 
1035
        mask = 0;
1036
        bits = 0;
1037
        reg = -1;
1038
 
1039
        va_start(ap, argcount);
1040
        while (--argcount >= 0) {
1041
                fp = va_arg(ap, const ad1843_bitfield_t *);
1042
                value = va_arg(ap, int);
1043
                if (reg == -1)
1044
                        reg = fp->reg;
1045
                ASSERT(fp->reg == reg);
1046
                m = ((1 << fp->nbits) - 1) << fp->lo_bit;
1047
                mask |= m;
1048
                bits |= (value << fp->lo_bit) & m;
1049
        }
1050
        va_end(ap);
1051
        ASSERT(!(bits & ~mask));
1052
        if (~mask & 0xFFFF)
1053
                w = li_read_ad1843_reg(lith, reg);
1054
        else
1055
                w = 0;
1056
        w = (w & ~mask) | bits;
1057
        (void) li_write_ad1843_reg(lith, reg, w);
1058
}
1059
 
1060
/*
1061
 * ad1843_get_gain reads the specified register and extracts the gain value
1062
 * using the supplied gain type.  It returns the gain in OSS format.
1063
 */
1064
 
1065
static int ad1843_get_gain(lithium_t *lith, const ad1843_gain_t *gp)
1066
{
1067
        int lg, rg;
1068
        unsigned short mask = (1 << gp->lfield->nbits) - 1;
1069
 
1070
        ad1843_read_multi(lith, 2, gp->lfield, &lg, gp->rfield, &rg);
1071
        if (gp->negative) {
1072
                lg = mask - lg;
1073
                rg = mask - rg;
1074
        }
1075
        lg = (lg * 100 + (mask >> 1)) / mask;
1076
        rg = (rg * 100 + (mask >> 1)) / mask;
1077
        return lg << 0 | rg << 8;
1078
}
1079
 
1080
/*
1081
 * Set an audio channel's gain. Converts from OSS format to AD1843's
1082
 * format.
1083
 *
1084
 * Returns the new gain, which may be lower than the old gain.
1085
 */
1086
 
1087
static int ad1843_set_gain(lithium_t *lith,
1088
                           const ad1843_gain_t *gp,
1089
                           int newval)
1090
{
1091
        unsigned short mask = (1 << gp->lfield->nbits) - 1;
1092
 
1093
        int lg = newval >> 0 & 0xFF;
1094
        int rg = newval >> 8;
1095
        if (lg < 0 || lg > 100 || rg < 0 || rg > 100)
1096
                return -EINVAL;
1097
        lg = (lg * mask + (mask >> 1)) / 100;
1098
        rg = (rg * mask + (mask >> 1)) / 100;
1099
        if (gp->negative) {
1100
                lg = mask - lg;
1101
                rg = mask - rg;
1102
        }
1103
        ad1843_write_multi(lith, 2, gp->lfield, lg, gp->rfield, rg);
1104
        return ad1843_get_gain(lith, gp);
1105
}
1106
 
1107
/* Returns the current recording source, in OSS format. */
1108
 
1109
static int ad1843_get_recsrc(lithium_t *lith)
1110
{
1111
        int ls = ad1843_read_bits(lith, &ad1843_LSS);
1112
 
1113
        switch (ls) {
1114
        case 1:
1115
                return SOUND_MASK_MIC;
1116
        case 2:
1117
                return SOUND_MASK_LINE;
1118
        case 3:
1119
                return SOUND_MASK_CD;
1120
        case 6:
1121
                return SOUND_MASK_PCM;
1122
        default:
1123
                ASSERT(0);
1124
                return -1;
1125
        }
1126
}
1127
 
1128
/*
1129
 * Enable/disable digital resample mode in the AD1843.
1130
 *
1131
 * The AD1843 requires that ADL, ADR, DA1 and DA2 be powered down
1132
 * while switching modes.  So we save DA1's state (DA2's state is not
1133
 * interesting), power them down, switch into/out of resample mode,
1134
 * power them up, and restore state.
1135
 *
1136
 * This will cause audible glitches if D/A or A/D is going on, so the
1137
 * driver disallows that (in mixer_write_ioctl()).
1138
 *
1139
 * The open question is, is this worth doing?  I'm leaving it in,
1140
 * because it's written, but...
1141
 */
1142
 
1143
static void ad1843_set_resample_mode(lithium_t *lith, int onoff)
1144
{
1145
        /* Save DA1 mute and gain (addr 9 is DA1 analog gain/attenuation) */
1146
        int save_da1 = li_read_ad1843_reg(lith, 9);
1147
 
1148
        /* Power down A/D and D/A. */
1149
        ad1843_write_multi(lith, 4,
1150
                           &ad1843_DA1EN, 0,
1151
                           &ad1843_DA2EN, 0,
1152
                           &ad1843_ADLEN, 0,
1153
                           &ad1843_ADREN, 0);
1154
 
1155
        /* Switch mode */
1156
        ASSERT(onoff == 0 || onoff == 1);
1157
        ad1843_write_bits(lith, &ad1843_DRSFLT, onoff);
1158
 
1159
        /* Power up A/D and D/A. */
1160
        ad1843_write_multi(lith, 3,
1161
                           &ad1843_DA1EN, 1,
1162
                           &ad1843_ADLEN, 1,
1163
                           &ad1843_ADREN, 1);
1164
 
1165
        /* Restore DA1 mute and gain. */
1166
        li_write_ad1843_reg(lith, 9, save_da1);
1167
}
1168
 
1169
/*
1170
 * Set recording source.  Arg newsrc specifies an OSS channel mask.
1171
 *
1172
 * The complication is that when we switch into/out of loopback mode
1173
 * (i.e., src = SOUND_MASK_PCM), we change the AD1843 into/out of
1174
 * digital resampling mode.
1175
 *
1176
 * Returns newsrc on success, -errno on failure.
1177
 */
1178
 
1179
static int ad1843_set_recsrc(lithium_t *lith, int newsrc)
1180
{
1181
        int bits;
1182
        int oldbits;
1183
 
1184
        switch (newsrc) {
1185
        case SOUND_MASK_PCM:
1186
                bits = 6;
1187
                break;
1188
 
1189
        case SOUND_MASK_MIC:
1190
                bits = 1;
1191
                break;
1192
 
1193
        case SOUND_MASK_LINE:
1194
                bits = 2;
1195
                break;
1196
 
1197
        case SOUND_MASK_CD:
1198
                bits = 3;
1199
                break;
1200
 
1201
        default:
1202
                return -EINVAL;
1203
        }
1204
        oldbits = ad1843_read_bits(lith, &ad1843_LSS);
1205
        if (newsrc == SOUND_MASK_PCM && oldbits != 6) {
1206
                DBGP("enabling digital resample mode\n");
1207
                ad1843_set_resample_mode(lith, 1);
1208
                ad1843_write_multi(lith, 2,
1209
                                   &ad1843_DAADL, 2,
1210
                                   &ad1843_DAADR, 2);
1211
        } else if (newsrc != SOUND_MASK_PCM && oldbits == 6) {
1212
                DBGP("disabling digital resample mode\n");
1213
                ad1843_set_resample_mode(lith, 0);
1214
                ad1843_write_multi(lith, 2,
1215
                                   &ad1843_DAADL, 0,
1216
                                   &ad1843_DAADR, 0);
1217
        }
1218
        ad1843_write_multi(lith, 2, &ad1843_LSS, bits, &ad1843_RSS, bits);
1219
        return newsrc;
1220
}
1221
 
1222
/*
1223
 * Return current output sources, in OSS format.
1224
 */
1225
 
1226
static int ad1843_get_outsrc(lithium_t *lith)
1227
{
1228
        int pcm, line, mic, cd;
1229
 
1230
        pcm  = ad1843_read_bits(lith, &ad1843_LDA1GM) ? 0 : SOUND_MASK_PCM;
1231
        line = ad1843_read_bits(lith, &ad1843_LX1MM)  ? 0 : SOUND_MASK_LINE;
1232
        cd   = ad1843_read_bits(lith, &ad1843_LX2MM)  ? 0 : SOUND_MASK_CD;
1233
        mic  = ad1843_read_bits(lith, &ad1843_LMCMM)  ? 0 : SOUND_MASK_MIC;
1234
 
1235
        return pcm | line | cd | mic;
1236
}
1237
 
1238
/*
1239
 * Set output sources.  Arg is a mask of active sources in OSS format.
1240
 *
1241
 * Returns source mask on success, -errno on failure.
1242
 */
1243
 
1244
static int ad1843_set_outsrc(lithium_t *lith, int mask)
1245
{
1246
        int pcm, line, mic, cd;
1247
 
1248
        if (mask & ~(SOUND_MASK_PCM | SOUND_MASK_LINE |
1249
                     SOUND_MASK_CD | SOUND_MASK_MIC))
1250
                return -EINVAL;
1251
        pcm  = (mask & SOUND_MASK_PCM)  ? 0 : 1;
1252
        line = (mask & SOUND_MASK_LINE) ? 0 : 1;
1253
        mic  = (mask & SOUND_MASK_MIC)  ? 0 : 1;
1254
        cd   = (mask & SOUND_MASK_CD)   ? 0 : 1;
1255
 
1256
        ad1843_write_multi(lith, 2, &ad1843_LDA1GM, pcm, &ad1843_RDA1GM, pcm);
1257
        ad1843_write_multi(lith, 2, &ad1843_LX1MM, line, &ad1843_RX1MM, line);
1258
        ad1843_write_multi(lith, 2, &ad1843_LX2MM, cd,   &ad1843_RX2MM, cd);
1259
        ad1843_write_multi(lith, 2, &ad1843_LMCMM, mic,  &ad1843_RMCMM, mic);
1260
 
1261
        return mask;
1262
}
1263
 
1264
/* Setup ad1843 for D/A conversion. */
1265
 
1266
static void ad1843_setup_dac(lithium_t *lith,
1267
                             int framerate,
1268
                             int fmt,
1269
                             int channels)
1270
{
1271
        int ad_fmt = 0, ad_mode = 0;
1272
 
1273
        DBGEV("(lith=0x%p, framerate=%d, fmt=%d, channels=%d)\n",
1274
              lith, framerate, fmt, channels);
1275
 
1276
        switch (fmt) {
1277
        case AFMT_S8:           ad_fmt = 1; break;
1278
        case AFMT_U8:           ad_fmt = 1; break;
1279
        case AFMT_S16_LE:       ad_fmt = 1; break;
1280
        case AFMT_MU_LAW:       ad_fmt = 2; break;
1281
        case AFMT_A_LAW:        ad_fmt = 3; break;
1282
        default:                ASSERT(0);
1283
        }
1284
 
1285
        switch (channels) {
1286
        case 2:                 ad_mode = 0; break;
1287
        case 1:                 ad_mode = 1; break;
1288
        default:                ASSERT(0);
1289
        }
1290
 
1291
        DBGPV("ad_mode = %d, ad_fmt = %d\n", ad_mode, ad_fmt);
1292
        ASSERT(framerate >= 4000 && framerate <= 49000);
1293
        ad1843_write_bits(lith, &ad1843_C1C, framerate);
1294
        ad1843_write_multi(lith, 2,
1295
                           &ad1843_DA1SM, ad_mode, &ad1843_DA1F, ad_fmt);
1296
}
1297
 
1298
static void ad1843_shutdown_dac(lithium_t *lith)
1299
{
1300
        ad1843_write_bits(lith, &ad1843_DA1F, 1);
1301
}
1302
 
1303
static void ad1843_setup_adc(lithium_t *lith, int framerate, int fmt, int channels)
1304
{
1305
        int da_fmt = 0;
1306
 
1307
        DBGEV("(lith=0x%p, framerate=%d, fmt=%d, channels=%d)\n",
1308
              lith, framerate, fmt, channels);
1309
 
1310
        switch (fmt) {
1311
        case AFMT_S8:           da_fmt = 1; break;
1312
        case AFMT_U8:           da_fmt = 1; break;
1313
        case AFMT_S16_LE:       da_fmt = 1; break;
1314
        case AFMT_MU_LAW:       da_fmt = 2; break;
1315
        case AFMT_A_LAW:        da_fmt = 3; break;
1316
        default:                ASSERT(0);
1317
        }
1318
 
1319
        DBGPV("da_fmt = %d\n", da_fmt);
1320
        ASSERT(framerate >= 4000 && framerate <= 49000);
1321
        ad1843_write_bits(lith, &ad1843_C2C, framerate);
1322
        ad1843_write_multi(lith, 2,
1323
                           &ad1843_ADLF, da_fmt, &ad1843_ADRF, da_fmt);
1324
}
1325
 
1326
static void ad1843_shutdown_adc(lithium_t *lith)
1327
{
1328
        /* nothing to do */
1329
}
1330
 
1331
/*
1332
 * Fully initialize the ad1843.  As described in the AD1843 data
1333
 * sheet, section "START-UP SEQUENCE".  The numbered comments are
1334
 * subsection headings from the data sheet.  See the data sheet, pages
1335
 * 52-54, for more info.
1336
 *
1337
 * return 0 on success, -errno on failure.  */
1338
 
1339
static int __init ad1843_init(lithium_t *lith)
1340
{
1341
        unsigned long later;
1342
        int err;
1343
 
1344
        err = li_init(lith);
1345
        if (err)
1346
                return err;
1347
 
1348
        if (ad1843_read_bits(lith, &ad1843_INIT) != 0) {
1349
                printk(KERN_ERR "vwsnd sound: AD1843 won't initialize\n");
1350
                return -EIO;
1351
        }
1352
 
1353
        ad1843_write_bits(lith, &ad1843_SCF, 1);
1354
 
1355
        /* 4. Put the conversion resources into standby. */
1356
 
1357
        ad1843_write_bits(lith, &ad1843_PDNI, 0);
1358
        later = jiffies + HZ / 2;       /* roughly half a second */
1359
        DBGDO(shut_up++);
1360
        while (ad1843_read_bits(lith, &ad1843_PDNO)) {
1361
                if (time_after(jiffies, later)) {
1362
                        printk(KERN_ERR
1363
                               "vwsnd audio: AD1843 won't power up\n");
1364
                        return -EIO;
1365
                }
1366
                schedule();
1367
        }
1368
        DBGDO(shut_up--);
1369
 
1370
        /* 5. Power up the clock generators and enable clock output pins. */
1371
 
1372
        ad1843_write_multi(lith, 2, &ad1843_C1EN, 1, &ad1843_C2EN, 1);
1373
 
1374
        /* 6. Configure conversion resources while they are in standby. */
1375
 
1376
        /* DAC1 uses clock 1 as source, ADC uses clock 2.  Always. */
1377
 
1378
        ad1843_write_multi(lith, 3,
1379
                           &ad1843_DA1C, 1,
1380
                           &ad1843_ADLC, 2,
1381
                           &ad1843_ADRC, 2);
1382
 
1383
        /* 7. Enable conversion resources. */
1384
 
1385
        ad1843_write_bits(lith, &ad1843_ADTLK, 1);
1386
        ad1843_write_multi(lith, 5,
1387
                           &ad1843_ANAEN, 1,
1388
                           &ad1843_AAMEN, 1,
1389
                           &ad1843_DA1EN, 1,
1390
                           &ad1843_ADLEN, 1,
1391
                           &ad1843_ADREN, 1);
1392
 
1393
        /* 8. Configure conversion resources while they are enabled. */
1394
 
1395
        ad1843_write_bits(lith, &ad1843_DA1C, 1);
1396
 
1397
        /* Unmute all channels. */
1398
 
1399
        ad1843_set_outsrc(lith,
1400
                          (SOUND_MASK_PCM | SOUND_MASK_LINE |
1401
                           SOUND_MASK_MIC | SOUND_MASK_CD));
1402
        ad1843_write_multi(lith, 2, &ad1843_LDA1AM, 0, &ad1843_RDA1AM, 0);
1403
 
1404
        /* Set default recording source to Line In and set
1405
         * mic gain to +20 dB.
1406
         */
1407
 
1408
        ad1843_set_recsrc(lith, SOUND_MASK_LINE);
1409
        ad1843_write_multi(lith, 2, &ad1843_LMGE, 1, &ad1843_RMGE, 1);
1410
 
1411
        /* Set Speaker Out level to +/- 4V and unmute it. */
1412
 
1413
        ad1843_write_multi(lith, 2, &ad1843_HPOS, 1, &ad1843_HPOM, 0);
1414
 
1415
        return 0;
1416
}
1417
 
1418
/*****************************************************************************/
1419
/* PCM I/O */
1420
 
1421
#define READ_INTR_MASK  (LI_INTR_COMM1_TRIG | LI_INTR_COMM1_OVERFLOW)
1422
#define WRITE_INTR_MASK (LI_INTR_COMM2_TRIG | LI_INTR_COMM2_UNDERFLOW)
1423
 
1424
typedef enum vwsnd_port_swstate {       /* software state */
1425
        SW_OFF,
1426
        SW_INITIAL,
1427
        SW_RUN,
1428
        SW_DRAIN,
1429
} vwsnd_port_swstate_t;
1430
 
1431
typedef enum vwsnd_port_hwstate {       /* hardware state */
1432
        HW_STOPPED,
1433
        HW_RUNNING,
1434
} vwsnd_port_hwstate_t;
1435
 
1436
/*
1437
 * These flags are read by ISR, but only written at baseline.
1438
 */
1439
 
1440
typedef enum vwsnd_port_flags {
1441
        DISABLED = 1 << 0,
1442
        ERFLOWN  = 1 << 1,              /* overflown or underflown */
1443
        HW_BUSY  = 1 << 2,
1444
} vwsnd_port_flags_t;
1445
 
1446
/*
1447
 * vwsnd_port is the per-port data structure.  Each device has two
1448
 * ports, one for input and one for output.
1449
 *
1450
 * Locking:
1451
 *
1452
 *      port->lock protects: hwstate, flags, swb_[iu]_avail.
1453
 *
1454
 *      devc->io_sema protects: swstate, sw_*, swb_[iu]_idx.
1455
 *
1456
 *      everything else is only written by open/release or
1457
 *      pcm_{setup,shutdown}(), which are serialized by a
1458
 *      combination of devc->open_sema and devc->io_sema.
1459
 */
1460
 
1461
typedef struct vwsnd_port {
1462
 
1463
        spinlock_t      lock;
1464
        wait_queue_head_t queue;
1465
        vwsnd_port_swstate_t swstate;
1466
        vwsnd_port_hwstate_t hwstate;
1467
        vwsnd_port_flags_t flags;
1468
 
1469
        int             sw_channels;
1470
        int             sw_samplefmt;
1471
        int             sw_framerate;
1472
        int             sample_size;
1473
        int             frame_size;
1474
        unsigned int    zero_word;      /* zero for the sample format */
1475
 
1476
        int             sw_fragshift;
1477
        int             sw_fragcount;
1478
        int             sw_subdivshift;
1479
 
1480
        unsigned int    hw_fragshift;
1481
        unsigned int    hw_fragsize;
1482
        unsigned int    hw_fragcount;
1483
 
1484
        int             hwbuf_size;
1485
        unsigned long   hwbuf_paddr;
1486
        unsigned long   hwbuf_vaddr;
1487
        caddr_t         hwbuf;          /* hwbuf == hwbuf_vaddr */
1488
        int             hwbuf_max;      /* max bytes to preload */
1489
 
1490
        caddr_t         swbuf;
1491
        unsigned int    swbuf_size;     /* size in bytes */
1492
        unsigned int    swb_u_idx;      /* index of next user byte */
1493
        unsigned int    swb_i_idx;      /* index of next intr byte */
1494
        unsigned int    swb_u_avail;    /* # bytes avail to user */
1495
        unsigned int    swb_i_avail;    /* # bytes avail to intr */
1496
 
1497
        dma_chan_t      chan;
1498
 
1499
        /* Accounting */
1500
 
1501
        int             byte_count;
1502
        int             frag_count;
1503
        int             MSC_offset;
1504
 
1505
} vwsnd_port_t;
1506
 
1507
/* vwsnd_dev is the per-device data structure. */
1508
 
1509
typedef struct vwsnd_dev {
1510
        struct vwsnd_dev *next_dev;
1511
        int             audio_minor;    /* minor number of audio device */
1512
        int             mixer_minor;    /* minor number of mixer device */
1513
 
1514
        struct semaphore open_sema;
1515
        struct semaphore io_sema;
1516
        struct semaphore mix_sema;
1517
        mode_t          open_mode;
1518
        wait_queue_head_t open_wait;
1519
 
1520
        lithium_t       lith;
1521
 
1522
        vwsnd_port_t    rport;
1523
        vwsnd_port_t    wport;
1524
} vwsnd_dev_t;
1525
 
1526
static vwsnd_dev_t *vwsnd_dev_list;     /* linked list of all devices */
1527
 
1528
static atomic_t vwsnd_use_count = ATOMIC_INIT(0);
1529
 
1530
# define INC_USE_COUNT (atomic_inc(&vwsnd_use_count))
1531
# define DEC_USE_COUNT (atomic_dec(&vwsnd_use_count))
1532
# define IN_USE        (atomic_read(&vwsnd_use_count) != 0)
1533
 
1534
/*
1535
 * Lithium can only DMA multiples of 32 bytes.  Its DMA buffer may
1536
 * be up to 8 Kb.  This driver always uses 8 Kb.
1537
 *
1538
 * Memory bug workaround -- I'm not sure what's going on here, but
1539
 * somehow pcm_copy_out() was triggering segv's going on to the next
1540
 * page of the hw buffer.  So, I make the hw buffer one size bigger
1541
 * than we actually use.  That way, the following page is allocated
1542
 * and mapped, and no error.  I suspect that something is broken
1543
 * in Cobalt, but haven't really investigated.  HBO is the actual
1544
 * size of the buffer, and HWBUF_ORDER is what we allocate.
1545
 */
1546
 
1547
#define HWBUF_SHIFT 13
1548
#define HWBUF_SIZE (1 << HWBUF_SHIFT)
1549
# define HBO         (HWBUF_SHIFT > PAGE_SHIFT ? HWBUF_SHIFT - PAGE_SHIFT : 0)
1550
# define HWBUF_ORDER (HBO + 1)          /* next size bigger */
1551
#define MIN_SPEED 4000
1552
#define MAX_SPEED 49000
1553
 
1554
#define MIN_FRAGSHIFT                   (DMACHUNK_SHIFT + 1)
1555
#define MAX_FRAGSHIFT                   (PAGE_SHIFT)
1556
#define MIN_FRAGSIZE                    (1 << MIN_FRAGSHIFT)
1557
#define MAX_FRAGSIZE                    (1 << MAX_FRAGSHIFT)
1558
#define MIN_FRAGCOUNT(fragsize)         3
1559
#define MAX_FRAGCOUNT(fragsize)         (32 * PAGE_SIZE / (fragsize))
1560
#define DEFAULT_FRAGSHIFT               12
1561
#define DEFAULT_FRAGCOUNT               16
1562
#define DEFAULT_SUBDIVSHIFT             0
1563
 
1564
/*
1565
 * The software buffer (swbuf) is a ring buffer shared between user
1566
 * level and interrupt level.  Each level owns some of the bytes in
1567
 * the buffer, and may give bytes away by calling swb_inc_{u,i}().
1568
 * User level calls _u for user, and interrupt level calls _i for
1569
 * interrupt.
1570
 *
1571
 * port->swb_{u,i}_avail is the number of bytes available to that level.
1572
 *
1573
 * port->swb_{u,i}_idx is the index of the first available byte in the
1574
 * buffer.
1575
 *
1576
 * Each level calls swb_inc_{u,i}() to atomically increment its index,
1577
 * recalculate the number of bytes available for both sides, and
1578
 * return the number of bytes available.  Since each side can only
1579
 * give away bytes, the other side can only increase the number of
1580
 * bytes available to this side.  Each side updates its own index
1581
 * variable, swb_{u,i}_idx, so no lock is needed to read it.
1582
 *
1583
 * To query the number of bytes available, call swb_inc_{u,i} with an
1584
 * increment of zero.
1585
 */
1586
 
1587
static __inline__ unsigned int __swb_inc_u(vwsnd_port_t *port, int inc)
1588
{
1589
        if (inc) {
1590
                port->swb_u_idx += inc;
1591
                port->swb_u_idx %= port->swbuf_size;
1592
                port->swb_u_avail -= inc;
1593
                port->swb_i_avail += inc;
1594
        }
1595
        return port->swb_u_avail;
1596
}
1597
 
1598
static __inline__ unsigned int swb_inc_u(vwsnd_port_t *port, int inc)
1599
{
1600
        unsigned long flags;
1601
        unsigned int ret;
1602
 
1603
        spin_lock_irqsave(&port->lock, flags);
1604
        {
1605
                ret = __swb_inc_u(port, inc);
1606
        }
1607
        spin_unlock_irqrestore(&port->lock, flags);
1608
        return ret;
1609
}
1610
 
1611
static __inline__ unsigned int __swb_inc_i(vwsnd_port_t *port, int inc)
1612
{
1613
        if (inc) {
1614
                port->swb_i_idx += inc;
1615
                port->swb_i_idx %= port->swbuf_size;
1616
                port->swb_i_avail -= inc;
1617
                port->swb_u_avail += inc;
1618
        }
1619
        return port->swb_i_avail;
1620
}
1621
 
1622
static __inline__ unsigned int swb_inc_i(vwsnd_port_t *port, int inc)
1623
{
1624
        unsigned long flags;
1625
        unsigned int ret;
1626
 
1627
        spin_lock_irqsave(&port->lock, flags);
1628
        {
1629
                ret = __swb_inc_i(port, inc);
1630
        }
1631
        spin_unlock_irqrestore(&port->lock, flags);
1632
        return ret;
1633
}
1634
 
1635
/*
1636
 * pcm_setup - this routine initializes all port state after
1637
 * mode-setting ioctls have been done, but before the first I/O is
1638
 * done.
1639
 *
1640
 * Locking: called with devc->io_sema held.
1641
 *
1642
 * Returns 0 on success, -errno on failure.
1643
 */
1644
 
1645
static int pcm_setup(vwsnd_dev_t *devc,
1646
                     vwsnd_port_t *rport,
1647
                     vwsnd_port_t *wport)
1648
{
1649
        vwsnd_port_t *aport = rport ? rport : wport;
1650
        int sample_size;
1651
        unsigned int zero_word;
1652
 
1653
        DBGEV("(devc=0x%p, rport=0x%p, wport=0x%p)\n", devc, rport, wport);
1654
 
1655
        ASSERT(aport != NULL);
1656
        if (aport->swbuf != NULL)
1657
                return 0;
1658
        switch (aport->sw_samplefmt) {
1659
        case AFMT_MU_LAW:
1660
                sample_size = 1;
1661
                zero_word = 0xFFFFFFFF ^ 0x80808080;
1662
                break;
1663
 
1664
        case AFMT_A_LAW:
1665
                sample_size = 1;
1666
                zero_word = 0xD5D5D5D5 ^ 0x80808080;
1667
                break;
1668
 
1669
        case AFMT_U8:
1670
                sample_size = 1;
1671
                zero_word = 0x80808080;
1672
                break;
1673
 
1674
        case AFMT_S8:
1675
                sample_size = 1;
1676
                zero_word = 0x00000000;
1677
                break;
1678
 
1679
        case AFMT_S16_LE:
1680
                sample_size = 2;
1681
                zero_word = 0x00000000;
1682
                break;
1683
 
1684
        default:
1685
                sample_size = 0; /* prevent compiler warning */
1686
                zero_word = 0;
1687
                ASSERT(0);
1688
        }
1689
        aport->sample_size  = sample_size;
1690
        aport->zero_word    = zero_word;
1691
        aport->frame_size   = aport->sw_channels * aport->sample_size;
1692
        aport->hw_fragshift = aport->sw_fragshift - aport->sw_subdivshift;
1693
        aport->hw_fragsize  = 1 << aport->hw_fragshift;
1694
        aport->hw_fragcount = aport->sw_fragcount << aport->sw_subdivshift;
1695
        ASSERT(aport->hw_fragsize >= MIN_FRAGSIZE);
1696
        ASSERT(aport->hw_fragsize <= MAX_FRAGSIZE);
1697
        ASSERT(aport->hw_fragcount >= MIN_FRAGCOUNT(aport->hw_fragsize));
1698
        ASSERT(aport->hw_fragcount <= MAX_FRAGCOUNT(aport->hw_fragsize));
1699
        if (rport) {
1700
                int hwfrags, swfrags;
1701
                rport->hwbuf_max = aport->hwbuf_size - DMACHUNK_SIZE;
1702
                hwfrags = rport->hwbuf_max >> aport->hw_fragshift;
1703
                swfrags = aport->hw_fragcount - hwfrags;
1704
                if (swfrags < 2)
1705
                        swfrags = 2;
1706
                rport->swbuf_size = swfrags * aport->hw_fragsize;
1707
                DBGPV("hwfrags = %d, swfrags = %d\n", hwfrags, swfrags);
1708
                DBGPV("read hwbuf_max = %d, swbuf_size = %d\n",
1709
                     rport->hwbuf_max, rport->swbuf_size);
1710
        }
1711
        if (wport) {
1712
                int hwfrags, swfrags;
1713
                int total_bytes = aport->hw_fragcount * aport->hw_fragsize;
1714
                wport->hwbuf_max = aport->hwbuf_size - DMACHUNK_SIZE;
1715
                if (wport->hwbuf_max > total_bytes)
1716
                        wport->hwbuf_max = total_bytes;
1717
                hwfrags = wport->hwbuf_max >> aport->hw_fragshift;
1718
                DBGPV("hwfrags = %d\n", hwfrags);
1719
                swfrags = aport->hw_fragcount - hwfrags;
1720
                if (swfrags < 2)
1721
                        swfrags = 2;
1722
                wport->swbuf_size = swfrags * aport->hw_fragsize;
1723
                DBGPV("hwfrags = %d, swfrags = %d\n", hwfrags, swfrags);
1724
                DBGPV("write hwbuf_max = %d, swbuf_size = %d\n",
1725
                     wport->hwbuf_max, wport->swbuf_size);
1726
        }
1727
 
1728
        aport->swb_u_idx    = 0;
1729
        aport->swb_i_idx    = 0;
1730
        aport->byte_count   = 0;
1731
 
1732
        /*
1733
         * Is this a Cobalt bug?  We need to make this buffer extend
1734
         * one page further than we actually use -- somehow memcpy
1735
         * causes an exceptoin otherwise.  I suspect there's a bug in
1736
         * Cobalt (or somewhere) where it's generating a fault on a
1737
         * speculative load or something.  Obviously, I haven't taken
1738
         * the time to track it down.
1739
         */
1740
 
1741
        aport->swbuf        = vmalloc(aport->swbuf_size + PAGE_SIZE);
1742
        if (!aport->swbuf)
1743
                return -ENOMEM;
1744
        if (rport && wport) {
1745
                ASSERT(aport == rport);
1746
                ASSERT(wport->swbuf == NULL);
1747
                /* One extra page - see comment above. */
1748
                wport->swbuf = vmalloc(aport->swbuf_size + PAGE_SIZE);
1749
                if (!wport->swbuf) {
1750
                        vfree(aport->swbuf);
1751
                        aport->swbuf = NULL;
1752
                        return -ENOMEM;
1753
                }
1754
                wport->sample_size  = rport->sample_size;
1755
                wport->zero_word    = rport->zero_word;
1756
                wport->frame_size   = rport->frame_size;
1757
                wport->hw_fragshift = rport->hw_fragshift;
1758
                wport->hw_fragsize  = rport->hw_fragsize;
1759
                wport->hw_fragcount = rport->hw_fragcount;
1760
                wport->swbuf_size   = rport->swbuf_size;
1761
                wport->hwbuf_max    = rport->hwbuf_max;
1762
                wport->swb_u_idx    = rport->swb_u_idx;
1763
                wport->swb_i_idx    = rport->swb_i_idx;
1764
                wport->byte_count   = rport->byte_count;
1765
        }
1766
        if (rport) {
1767
                rport->swb_u_avail = 0;
1768
                rport->swb_i_avail = rport->swbuf_size;
1769
                rport->swstate = SW_RUN;
1770
                li_setup_dma(&rport->chan,
1771
                             &li_comm1,
1772
                             &devc->lith,
1773
                             rport->hwbuf_paddr,
1774
                             HWBUF_SHIFT,
1775
                             rport->hw_fragshift,
1776
                             rport->sw_channels,
1777
                             rport->sample_size);
1778
                ad1843_setup_adc(&devc->lith,
1779
                                 rport->sw_framerate,
1780
                                 rport->sw_samplefmt,
1781
                                 rport->sw_channels);
1782
                li_enable_interrupts(&devc->lith, READ_INTR_MASK);
1783
                if (!(rport->flags & DISABLED)) {
1784
                        ustmsc_t ustmsc;
1785
                        rport->hwstate = HW_RUNNING;
1786
                        li_activate_dma(&rport->chan);
1787
                        li_read_USTMSC(&rport->chan, &ustmsc);
1788
                        rport->MSC_offset = ustmsc.msc;
1789
                }
1790
        }
1791
        if (wport) {
1792
                if (wport->hwbuf_max > wport->swbuf_size)
1793
                        wport->hwbuf_max = wport->swbuf_size;
1794
                wport->flags &= ~ERFLOWN;
1795
                wport->swb_u_avail = wport->swbuf_size;
1796
                wport->swb_i_avail = 0;
1797
                wport->swstate = SW_RUN;
1798
                li_setup_dma(&wport->chan,
1799
                             &li_comm2,
1800
                             &devc->lith,
1801
                             wport->hwbuf_paddr,
1802
                             HWBUF_SHIFT,
1803
                             wport->hw_fragshift,
1804
                             wport->sw_channels,
1805
                             wport->sample_size);
1806
                ad1843_setup_dac(&devc->lith,
1807
                                 wport->sw_framerate,
1808
                                 wport->sw_samplefmt,
1809
                                 wport->sw_channels);
1810
                li_enable_interrupts(&devc->lith, WRITE_INTR_MASK);
1811
        }
1812
        DBGRV();
1813
        return 0;
1814
}
1815
 
1816
/*
1817
 * pcm_shutdown_port - shut down one port (direction) for PCM I/O.
1818
 * Only called from pcm_shutdown.
1819
 */
1820
 
1821
static void pcm_shutdown_port(vwsnd_dev_t *devc,
1822
                              vwsnd_port_t *aport,
1823
                              unsigned int mask)
1824
{
1825
        unsigned long flags;
1826
        vwsnd_port_hwstate_t hwstate;
1827
        DECLARE_WAITQUEUE(wait, current);
1828
 
1829
        aport->swstate = SW_INITIAL;
1830
        add_wait_queue(&aport->queue, &wait);
1831
        while (1) {
1832
                set_current_state(TASK_UNINTERRUPTIBLE);
1833
                spin_lock_irqsave(&aport->lock, flags);
1834
                {
1835
                        hwstate = aport->hwstate;
1836
                }
1837
                spin_unlock_irqrestore(&aport->lock, flags);
1838
                if (hwstate == HW_STOPPED)
1839
                        break;
1840
                schedule();
1841
        }
1842
        current->state = TASK_RUNNING;
1843
        remove_wait_queue(&aport->queue, &wait);
1844
        li_disable_interrupts(&devc->lith, mask);
1845
        if (aport == &devc->rport)
1846
                ad1843_shutdown_adc(&devc->lith);
1847
        else /* aport == &devc->wport) */
1848
                ad1843_shutdown_dac(&devc->lith);
1849
        li_shutdown_dma(&aport->chan);
1850
        vfree(aport->swbuf);
1851
        aport->swbuf = NULL;
1852
        aport->byte_count = 0;
1853
}
1854
 
1855
/*
1856
 * pcm_shutdown undoes what pcm_setup did.
1857
 * Also sets the ports' swstate to newstate.
1858
 */
1859
 
1860
static void pcm_shutdown(vwsnd_dev_t *devc,
1861
                         vwsnd_port_t *rport,
1862
                         vwsnd_port_t *wport)
1863
{
1864
        DBGEV("(devc=0x%p, rport=0x%p, wport=0x%p)\n", devc, rport, wport);
1865
 
1866
        if (rport && rport->swbuf) {
1867
                DBGPV("shutting down rport\n");
1868
                pcm_shutdown_port(devc, rport, READ_INTR_MASK);
1869
        }
1870
        if (wport && wport->swbuf) {
1871
                DBGPV("shutting down wport\n");
1872
                pcm_shutdown_port(devc, wport, WRITE_INTR_MASK);
1873
        }
1874
        DBGRV();
1875
}
1876
 
1877
static void pcm_copy_in(vwsnd_port_t *rport, int swidx, int hwidx, int nb)
1878
{
1879
        char *src = rport->hwbuf + hwidx;
1880
        char *dst = rport->swbuf + swidx;
1881
        int fmt = rport->sw_samplefmt;
1882
 
1883
        DBGPV("swidx = %d, hwidx = %d\n", swidx, hwidx);
1884
        ASSERT(rport->hwbuf != NULL);
1885
        ASSERT(rport->swbuf != NULL);
1886
        ASSERT(nb > 0 && (nb % 32) == 0);
1887
        ASSERT(swidx % 32 == 0 && hwidx % 32 == 0);
1888
        ASSERT(swidx >= 0 && swidx + nb <= rport->swbuf_size);
1889
        ASSERT(hwidx >= 0 && hwidx + nb <= rport->hwbuf_size);
1890
 
1891
        if (fmt == AFMT_MU_LAW || fmt == AFMT_A_LAW || fmt == AFMT_S8) {
1892
 
1893
                /* See Sample Format Notes above. */
1894
 
1895
                char *end = src + nb;
1896
                while (src < end)
1897
                        *dst++ = *src++ ^ 0x80;
1898
        } else
1899
                memcpy(dst, src, nb);
1900
}
1901
 
1902
static void pcm_copy_out(vwsnd_port_t *wport, int swidx, int hwidx, int nb)
1903
{
1904
        char *src = wport->swbuf + swidx;
1905
        char *dst = wport->hwbuf + hwidx;
1906
        int fmt = wport->sw_samplefmt;
1907
 
1908
        ASSERT(nb > 0 && (nb % 32) == 0);
1909
        ASSERT(wport->hwbuf != NULL);
1910
        ASSERT(wport->swbuf != NULL);
1911
        ASSERT(swidx % 32 == 0 && hwidx % 32 == 0);
1912
        ASSERT(swidx >= 0 && swidx + nb <= wport->swbuf_size);
1913
        ASSERT(hwidx >= 0 && hwidx + nb <= wport->hwbuf_size);
1914
        if (fmt == AFMT_MU_LAW || fmt == AFMT_A_LAW || fmt == AFMT_S8) {
1915
 
1916
                /* See Sample Format Notes above. */
1917
 
1918
                char *end = src + nb;
1919
                while (src < end)
1920
                        *dst++ = *src++ ^ 0x80;
1921
        } else
1922
                memcpy(dst, src, nb);
1923
}
1924
 
1925
/*
1926
 * pcm_output() is called both from baselevel and from interrupt level.
1927
 * This is where audio frames are copied into the hardware-accessible
1928
 * ring buffer.
1929
 *
1930
 * Locking note: The part of this routine that figures out what to do
1931
 * holds wport->lock.  The longer part releases wport->lock, but sets
1932
 * wport->flags & HW_BUSY.  Afterward, it reacquires wport->lock, and
1933
 * checks for more work to do.
1934
 *
1935
 * If another thread calls pcm_output() while HW_BUSY is set, it
1936
 * returns immediately, knowing that the thread that set HW_BUSY will
1937
 * look for more work to do before returning.
1938
 *
1939
 * This has the advantage that port->lock is held for several short
1940
 * periods instead of one long period.  Also, when pcm_output is
1941
 * called from base level, it reenables interrupts.
1942
 */
1943
 
1944
static void pcm_output(vwsnd_dev_t *devc, int erflown, int nb)
1945
{
1946
        vwsnd_port_t *wport = &devc->wport;
1947
        const int hwmax  = wport->hwbuf_max;
1948
        const int hwsize = wport->hwbuf_size;
1949
        const int swsize = wport->swbuf_size;
1950
        const int fragsize = wport->hw_fragsize;
1951
        unsigned long iflags;
1952
 
1953
        DBGEV("(devc=0x%p, erflown=%d, nb=%d)\n", devc, erflown, nb);
1954
        spin_lock_irqsave(&wport->lock, iflags);
1955
        if (erflown)
1956
                wport->flags |= ERFLOWN;
1957
        (void) __swb_inc_u(wport, nb);
1958
        if (wport->flags & HW_BUSY) {
1959
                spin_unlock_irqrestore(&wport->lock, iflags);
1960
                DBGPV("returning: HW BUSY\n");
1961
                return;
1962
        }
1963
        if (wport->flags & DISABLED) {
1964
                spin_unlock_irqrestore(&wport->lock, iflags);
1965
                DBGPV("returning: DISABLED\n");
1966
                return;
1967
        }
1968
        wport->flags |= HW_BUSY;
1969
        while (1) {
1970
                int swptr, hwptr, hw_avail, sw_avail, swidx;
1971
                vwsnd_port_hwstate_t hwstate = wport->hwstate;
1972
                vwsnd_port_swstate_t swstate = wport->swstate;
1973
                int hw_unavail;
1974
                ustmsc_t ustmsc;
1975
 
1976
                hwptr = li_read_hwptr(&wport->chan);
1977
                swptr = li_read_swptr(&wport->chan);
1978
                hw_unavail = (swptr - hwptr + hwsize) % hwsize;
1979
                hw_avail = (hwmax - hw_unavail) & -fragsize;
1980
                sw_avail = wport->swb_i_avail & -fragsize;
1981
                if (sw_avail && swstate == SW_RUN) {
1982
                        if (wport->flags & ERFLOWN) {
1983
                                wport->flags &= ~ERFLOWN;
1984
                        }
1985
                } else if (swstate == SW_INITIAL ||
1986
                         swstate == SW_OFF ||
1987
                         (swstate == SW_DRAIN &&
1988
                          !sw_avail &&
1989
                          (wport->flags & ERFLOWN))) {
1990
                        DBGP("stopping.  hwstate = %d\n", hwstate);
1991
                        if (hwstate != HW_STOPPED) {
1992
                                li_deactivate_dma(&wport->chan);
1993
                                wport->hwstate = HW_STOPPED;
1994
                        }
1995
                        wake_up(&wport->queue);
1996
                        break;
1997
                }
1998
                if (!sw_avail || !hw_avail)
1999
                        break;
2000
                spin_unlock_irqrestore(&wport->lock, iflags);
2001
 
2002
                /*
2003
                 * We gave up the port lock, but we have the HW_BUSY flag.
2004
                 * Proceed without accessing any nonlocal state.
2005
                 * Do not exit the loop -- must check for more work.
2006
                 */
2007
 
2008
                swidx = wport->swb_i_idx;
2009
                nb = hw_avail;
2010
                if (nb > sw_avail)
2011
                        nb = sw_avail;
2012
                if (nb > hwsize - swptr)
2013
                        nb = hwsize - swptr; /* don't overflow hwbuf */
2014
                if (nb > swsize - swidx)
2015
                        nb = swsize - swidx; /* don't overflow swbuf */
2016
                ASSERT(nb > 0);
2017
                if (nb % fragsize) {
2018
                        DBGP("nb = %d, fragsize = %d\n", nb, fragsize);
2019
                        DBGP("hw_avail = %d\n", hw_avail);
2020
                        DBGP("sw_avail = %d\n", sw_avail);
2021
                        DBGP("hwsize = %d, swptr = %d\n", hwsize, swptr);
2022
                        DBGP("swsize = %d, swidx = %d\n", swsize, swidx);
2023
                }
2024
                ASSERT(!(nb % fragsize));
2025
                DBGPV("copying swb[%d..%d] to hwb[%d..%d]\n",
2026
                      swidx, swidx + nb, swptr, swptr + nb);
2027
                pcm_copy_out(wport, swidx, swptr, nb);
2028
                li_write_swptr(&wport->chan, (swptr + nb) % hwsize);
2029
                spin_lock_irqsave(&wport->lock, iflags);
2030
                if (hwstate == HW_STOPPED) {
2031
                        DBGPV("starting\n");
2032
                        li_activate_dma(&wport->chan);
2033
                        wport->hwstate = HW_RUNNING;
2034
                        li_read_USTMSC(&wport->chan, &ustmsc);
2035
                        ASSERT(wport->byte_count % wport->frame_size == 0);
2036
                        wport->MSC_offset = ustmsc.msc - wport->byte_count / wport->frame_size;
2037
                }
2038
                __swb_inc_i(wport, nb);
2039
                wport->byte_count += nb;
2040
                wport->frag_count += nb / fragsize;
2041
                ASSERT(nb % fragsize == 0);
2042
                wake_up(&wport->queue);
2043
        }
2044
        wport->flags &= ~HW_BUSY;
2045
        spin_unlock_irqrestore(&wport->lock, iflags);
2046
        DBGRV();
2047
}
2048
 
2049
/*
2050
 * pcm_input() is called both from baselevel and from interrupt level.
2051
 * This is where audio frames are copied out of the hardware-accessible
2052
 * ring buffer.
2053
 *
2054
 * Locking note: The part of this routine that figures out what to do
2055
 * holds rport->lock.  The longer part releases rport->lock, but sets
2056
 * rport->flags & HW_BUSY.  Afterward, it reacquires rport->lock, and
2057
 * checks for more work to do.
2058
 *
2059
 * If another thread calls pcm_input() while HW_BUSY is set, it
2060
 * returns immediately, knowing that the thread that set HW_BUSY will
2061
 * look for more work to do before returning.
2062
 *
2063
 * This has the advantage that port->lock is held for several short
2064
 * periods instead of one long period.  Also, when pcm_input is
2065
 * called from base level, it reenables interrupts.
2066
 */
2067
 
2068
static void pcm_input(vwsnd_dev_t *devc, int erflown, int nb)
2069
{
2070
        vwsnd_port_t *rport = &devc->rport;
2071
        const int hwmax  = rport->hwbuf_max;
2072
        const int hwsize = rport->hwbuf_size;
2073
        const int swsize = rport->swbuf_size;
2074
        const int fragsize = rport->hw_fragsize;
2075
        unsigned long iflags;
2076
 
2077
        DBGEV("(devc=0x%p, erflown=%d, nb=%d)\n", devc, erflown, nb);
2078
 
2079
        spin_lock_irqsave(&rport->lock, iflags);
2080
        if (erflown)
2081
                rport->flags |= ERFLOWN;
2082
        (void) __swb_inc_u(rport, nb);
2083
        if (rport->flags & HW_BUSY || !rport->swbuf) {
2084
                spin_unlock_irqrestore(&rport->lock, iflags);
2085
                DBGPV("returning: HW BUSY or !swbuf\n");
2086
                return;
2087
        }
2088
        if (rport->flags & DISABLED) {
2089
                spin_unlock_irqrestore(&rport->lock, iflags);
2090
                DBGPV("returning: DISABLED\n");
2091
                return;
2092
        }
2093
        rport->flags |= HW_BUSY;
2094
        while (1) {
2095
                int swptr, hwptr, hw_avail, sw_avail, swidx;
2096
                vwsnd_port_hwstate_t hwstate = rport->hwstate;
2097
                vwsnd_port_swstate_t swstate = rport->swstate;
2098
 
2099
                hwptr = li_read_hwptr(&rport->chan);
2100
                swptr = li_read_swptr(&rport->chan);
2101
                hw_avail = (hwptr - swptr + hwsize) % hwsize & -fragsize;
2102
                if (hw_avail > hwmax)
2103
                        hw_avail = hwmax;
2104
                sw_avail = rport->swb_i_avail & -fragsize;
2105
                if (swstate != SW_RUN) {
2106
                        DBGP("stopping.  hwstate = %d\n", hwstate);
2107
                        if (hwstate != HW_STOPPED) {
2108
                                li_deactivate_dma(&rport->chan);
2109
                                rport->hwstate = HW_STOPPED;
2110
                        }
2111
                        wake_up(&rport->queue);
2112
                        break;
2113
                }
2114
                if (!sw_avail || !hw_avail)
2115
                        break;
2116
                spin_unlock_irqrestore(&rport->lock, iflags);
2117
 
2118
                /*
2119
                 * We gave up the port lock, but we have the HW_BUSY flag.
2120
                 * Proceed without accessing any nonlocal state.
2121
                 * Do not exit the loop -- must check for more work.
2122
                 */
2123
 
2124
                swidx = rport->swb_i_idx;
2125
                nb = hw_avail;
2126
                if (nb > sw_avail)
2127
                        nb = sw_avail;
2128
                if (nb > hwsize - swptr)
2129
                        nb = hwsize - swptr; /* don't overflow hwbuf */
2130
                if (nb > swsize - swidx)
2131
                        nb = swsize - swidx; /* don't overflow swbuf */
2132
                ASSERT(nb > 0);
2133
                if (nb % fragsize) {
2134
                        DBGP("nb = %d, fragsize = %d\n", nb, fragsize);
2135
                        DBGP("hw_avail = %d\n", hw_avail);
2136
                        DBGP("sw_avail = %d\n", sw_avail);
2137
                        DBGP("hwsize = %d, swptr = %d\n", hwsize, swptr);
2138
                        DBGP("swsize = %d, swidx = %d\n", swsize, swidx);
2139
                }
2140
                ASSERT(!(nb % fragsize));
2141
                DBGPV("copying hwb[%d..%d] to swb[%d..%d]\n",
2142
                      swptr, swptr + nb, swidx, swidx + nb);
2143
                pcm_copy_in(rport, swidx, swptr, nb);
2144
                li_write_swptr(&rport->chan, (swptr + nb) % hwsize);
2145
                spin_lock_irqsave(&rport->lock, iflags);
2146
                __swb_inc_i(rport, nb);
2147
                rport->byte_count += nb;
2148
                rport->frag_count += nb / fragsize;
2149
                ASSERT(nb % fragsize == 0);
2150
                wake_up(&rport->queue);
2151
        }
2152
        rport->flags &= ~HW_BUSY;
2153
        spin_unlock_irqrestore(&rport->lock, iflags);
2154
        DBGRV();
2155
}
2156
 
2157
/*
2158
 * pcm_flush_frag() writes zero samples to fill the current fragment,
2159
 * then flushes it to the hardware.
2160
 *
2161
 * It is only meaningful to flush output, not input.
2162
 */
2163
 
2164
static void pcm_flush_frag(vwsnd_dev_t *devc)
2165
{
2166
        vwsnd_port_t *wport = &devc->wport;
2167
 
2168
        DBGPV("swstate = %d\n", wport->swstate);
2169
        if (wport->swstate == SW_RUN) {
2170
                int idx = wport->swb_u_idx;
2171
                int end = (idx + wport->hw_fragsize - 1)
2172
                        >> wport->hw_fragshift
2173
                        << wport->hw_fragshift;
2174
                int nb = end - idx;
2175
                DBGPV("clearing %d bytes\n", nb);
2176
                if (nb)
2177
                        memset(wport->swbuf + idx,
2178
                               (char) wport->zero_word,
2179
                               nb);
2180
                wport->swstate = SW_DRAIN;
2181
                pcm_output(devc, 0, nb);
2182
        }
2183
        DBGRV();
2184
}
2185
 
2186
/*
2187
 * Wait for output to drain.  This sleeps uninterruptibly because
2188
 * there is nothing intelligent we can do if interrupted.  This
2189
 * means the process will be delayed in responding to the signal.
2190
 */
2191
 
2192
static void pcm_write_sync(vwsnd_dev_t *devc)
2193
{
2194
        vwsnd_port_t *wport = &devc->wport;
2195
        DECLARE_WAITQUEUE(wait, current);
2196
        unsigned long flags;
2197
        vwsnd_port_hwstate_t hwstate;
2198
 
2199
        DBGEV("(devc=0x%p)\n", devc);
2200
        add_wait_queue(&wport->queue, &wait);
2201
        while (1) {
2202
                set_current_state(TASK_UNINTERRUPTIBLE);
2203
                spin_lock_irqsave(&wport->lock, flags);
2204
                {
2205
                        hwstate = wport->hwstate;
2206
                }
2207
                spin_unlock_irqrestore(&wport->lock, flags);
2208
                if (hwstate == HW_STOPPED)
2209
                        break;
2210
                schedule();
2211
        }
2212
        current->state = TASK_RUNNING;
2213
        remove_wait_queue(&wport->queue, &wait);
2214
        DBGPV("swstate = %d, hwstate = %d\n", wport->swstate, wport->hwstate);
2215
        DBGRV();
2216
}
2217
 
2218
/*****************************************************************************/
2219
/* audio driver */
2220
 
2221
/*
2222
 * seek on an audio device always fails.
2223
 */
2224
 
2225
static void vwsnd_audio_read_intr(vwsnd_dev_t *devc, unsigned int status)
2226
{
2227
        int overflown = status & LI_INTR_COMM1_OVERFLOW;
2228
 
2229
        if (status & READ_INTR_MASK)
2230
                pcm_input(devc, overflown, 0);
2231
}
2232
 
2233
static void vwsnd_audio_write_intr(vwsnd_dev_t *devc, unsigned int status)
2234
{
2235
        int underflown = status & LI_INTR_COMM2_UNDERFLOW;
2236
 
2237
        if (status & WRITE_INTR_MASK)
2238
                pcm_output(devc, underflown, 0);
2239
}
2240
 
2241
static void vwsnd_audio_intr(int irq, void *dev_id, struct pt_regs *regs)
2242
{
2243
        vwsnd_dev_t *devc = (vwsnd_dev_t *) dev_id;
2244
        unsigned int status;
2245
 
2246
        DBGEV("(irq=%d, dev_id=0x%p, regs=0x%p)\n", irq, dev_id, regs);
2247
 
2248
        status = li_get_clear_intr_status(&devc->lith);
2249
        vwsnd_audio_read_intr(devc, status);
2250
        vwsnd_audio_write_intr(devc, status);
2251
}
2252
 
2253
static ssize_t vwsnd_audio_do_read(struct file *file,
2254
                                   char *buffer,
2255
                                   size_t count,
2256
                                   loff_t *ppos)
2257
{
2258
        vwsnd_dev_t *devc = file->private_data;
2259
        vwsnd_port_t *rport = ((file->f_mode & FMODE_READ) ?
2260
                               &devc->rport : NULL);
2261
        int ret, nb;
2262
 
2263
        DBGEV("(file=0x%p, buffer=0x%p, count=%d, ppos=0x%p)\n",
2264
             file, buffer, count, ppos);
2265
 
2266
        if (!rport)
2267
                return -EINVAL;
2268
 
2269
        if (rport->swbuf == NULL) {
2270
                vwsnd_port_t *wport = (file->f_mode & FMODE_WRITE) ?
2271
                        &devc->wport : NULL;
2272
                ret = pcm_setup(devc, rport, wport);
2273
                if (ret < 0)
2274
                        return ret;
2275
        }
2276
 
2277
        if (!access_ok(VERIFY_READ, buffer, count))
2278
                return -EFAULT;
2279
        ret = 0;
2280
        while (count) {
2281
                DECLARE_WAITQUEUE(wait, current);
2282
                add_wait_queue(&rport->queue, &wait);
2283
                while ((nb = swb_inc_u(rport, 0)) == 0) {
2284
                        DBGPV("blocking\n");
2285
                        set_current_state(TASK_INTERRUPTIBLE);
2286
                        if (rport->flags & DISABLED ||
2287
                            file->f_flags & O_NONBLOCK) {
2288
                                current->state = TASK_RUNNING;
2289
                                remove_wait_queue(&rport->queue, &wait);
2290
                                return ret ? ret : -EAGAIN;
2291
                        }
2292
                        schedule();
2293
                        if (signal_pending(current)) {
2294
                                current->state = TASK_RUNNING;
2295
                                remove_wait_queue(&rport->queue, &wait);
2296
                                return ret ? ret : -ERESTARTSYS;
2297
                        }
2298
                }
2299
                current->state = TASK_RUNNING;
2300
                remove_wait_queue(&rport->queue, &wait);
2301
                pcm_input(devc, 0, 0);
2302
                /* nb bytes are available in userbuf. */
2303
                if (nb > count)
2304
                        nb = count;
2305
                DBGPV("nb = %d\n", nb);
2306
                copy_to_user(buffer, rport->swbuf + rport->swb_u_idx, nb);
2307
                (void) swb_inc_u(rport, nb);
2308
                buffer += nb;
2309
                count -= nb;
2310
                ret += nb;
2311
        }
2312
        DBGPV("returning %d\n", ret);
2313
        return ret;
2314
}
2315
 
2316
static ssize_t vwsnd_audio_read(struct file *file,
2317
                                char *buffer,
2318
                                size_t count,
2319
                                loff_t *ppos)
2320
{
2321
        vwsnd_dev_t *devc = file->private_data;
2322
        ssize_t ret;
2323
 
2324
        down(&devc->io_sema);
2325
        ret = vwsnd_audio_do_read(file, buffer, count, ppos);
2326
        up(&devc->io_sema);
2327
        return ret;
2328
}
2329
 
2330
static ssize_t vwsnd_audio_do_write(struct file *file,
2331
                                    const char *buffer,
2332
                                    size_t count,
2333
                                    loff_t *ppos)
2334
{
2335
        vwsnd_dev_t *devc = file->private_data;
2336
        vwsnd_port_t *wport = ((file->f_mode & FMODE_WRITE) ?
2337
                               &devc->wport : NULL);
2338
        int ret, nb;
2339
 
2340
        DBGEV("(file=0x%p, buffer=0x%p, count=%d, ppos=0x%p)\n",
2341
              file, buffer, count, ppos);
2342
 
2343
        if (!wport)
2344
                return -EINVAL;
2345
 
2346
        if (wport->swbuf == NULL) {
2347
                vwsnd_port_t *rport = (file->f_mode & FMODE_READ) ?
2348
                        &devc->rport : NULL;
2349
                ret = pcm_setup(devc, rport, wport);
2350
                if (ret < 0)
2351
                        return ret;
2352
        }
2353
        if (!access_ok(VERIFY_WRITE, buffer, count))
2354
                return -EFAULT;
2355
        ret = 0;
2356
        while (count) {
2357
                DECLARE_WAITQUEUE(wait, current);
2358
                add_wait_queue(&wport->queue, &wait);
2359
                while ((nb = swb_inc_u(wport, 0)) == 0) {
2360
                        set_current_state(TASK_INTERRUPTIBLE);
2361
                        if (wport->flags & DISABLED ||
2362
                            file->f_flags & O_NONBLOCK) {
2363
                                current->state = TASK_RUNNING;
2364
                                remove_wait_queue(&wport->queue, &wait);
2365
                                return ret ? ret : -EAGAIN;
2366
                        }
2367
                        schedule();
2368
                        if (signal_pending(current)) {
2369
                                current->state = TASK_RUNNING;
2370
                                remove_wait_queue(&wport->queue, &wait);
2371
                                return ret ? ret : -ERESTARTSYS;
2372
                        }
2373
                }
2374
                current->state = TASK_RUNNING;
2375
                remove_wait_queue(&wport->queue, &wait);
2376
                /* nb bytes are available in userbuf. */
2377
                if (nb > count)
2378
                        nb = count;
2379
                DBGPV("nb = %d\n", nb);
2380
                copy_from_user(wport->swbuf + wport->swb_u_idx, buffer, nb);
2381
                pcm_output(devc, 0, nb);
2382
                buffer += nb;
2383
                count -= nb;
2384
                ret += nb;
2385
        }
2386
        DBGPV("returning %d\n", ret);
2387
        return ret;
2388
}
2389
 
2390
static ssize_t vwsnd_audio_write(struct file *file,
2391
                                 const char *buffer,
2392
                                 size_t count,
2393
                                 loff_t *ppos)
2394
{
2395
        vwsnd_dev_t *devc = file->private_data;
2396
        ssize_t ret;
2397
 
2398
        down(&devc->io_sema);
2399
        ret = vwsnd_audio_do_write(file, buffer, count, ppos);
2400
        up(&devc->io_sema);
2401
        return ret;
2402
}
2403
 
2404
/* No kernel lock - fine */
2405
static unsigned int vwsnd_audio_poll(struct file *file,
2406
                                     struct poll_table_struct *wait)
2407
{
2408
        vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
2409
        vwsnd_port_t *rport = (file->f_mode & FMODE_READ) ?
2410
                &devc->rport : NULL;
2411
        vwsnd_port_t *wport = (file->f_mode & FMODE_WRITE) ?
2412
                &devc->wport : NULL;
2413
        unsigned int mask = 0;
2414
 
2415
        DBGEV("(file=0x%p, wait=0x%p)\n", file, wait);
2416
 
2417
        ASSERT(rport || wport);
2418
        if (rport) {
2419
                poll_wait(file, &rport->queue, wait);
2420
                if (swb_inc_u(rport, 0))
2421
                        mask |= (POLLIN | POLLRDNORM);
2422
        }
2423
        if (wport) {
2424
                poll_wait(file, &wport->queue, wait);
2425
                if (wport->swbuf == NULL || swb_inc_u(wport, 0))
2426
                        mask |= (POLLOUT | POLLWRNORM);
2427
        }
2428
 
2429
        DBGPV("returning 0x%x\n", mask);
2430
        return mask;
2431
}
2432
 
2433
static int vwsnd_audio_do_ioctl(struct inode *inode,
2434
                                struct file *file,
2435
                                unsigned int cmd,
2436
                                unsigned long arg)
2437
{
2438
        vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
2439
        vwsnd_port_t *rport = (file->f_mode & FMODE_READ) ?
2440
                &devc->rport : NULL;
2441
        vwsnd_port_t *wport = (file->f_mode & FMODE_WRITE) ?
2442
                &devc->wport : NULL;
2443
        vwsnd_port_t *aport = rport ? rport : wport;
2444
        struct audio_buf_info buf_info;
2445
        struct count_info info;
2446
        unsigned long flags;
2447
        int ival;
2448
 
2449
 
2450
        DBGEV("(inode=0x%p, file=0x%p, cmd=0x%x, arg=0x%lx)\n",
2451
              inode, file, cmd, arg);
2452
        switch (cmd) {
2453
        case OSS_GETVERSION:            /* _SIOR ('M', 118, int) */
2454
                DBGX("OSS_GETVERSION\n");
2455
                ival = SOUND_VERSION;
2456
                return put_user(ival, (int *) arg);
2457
 
2458
        case SNDCTL_DSP_GETCAPS:        /* _SIOR ('P',15, int) */
2459
                DBGX("SNDCTL_DSP_GETCAPS\n");
2460
                ival = DSP_CAP_DUPLEX | DSP_CAP_REALTIME | DSP_CAP_TRIGGER;
2461
                return put_user(ival, (int *) arg);
2462
 
2463
        case SNDCTL_DSP_GETFMTS:        /* _SIOR ('P',11, int) */
2464
                DBGX("SNDCTL_DSP_GETFMTS\n");
2465
                ival = (AFMT_S16_LE | AFMT_MU_LAW | AFMT_A_LAW |
2466
                        AFMT_U8 | AFMT_S8);
2467
                return put_user(ival, (int *) arg);
2468
                break;
2469
 
2470
        case SOUND_PCM_READ_RATE:       /* _SIOR ('P', 2, int) */
2471
                DBGX("SOUND_PCM_READ_RATE\n");
2472
                ival = aport->sw_framerate;
2473
                return put_user(ival, (int *) arg);
2474
 
2475
        case SOUND_PCM_READ_CHANNELS:   /* _SIOR ('P', 6, int) */
2476
                DBGX("SOUND_PCM_READ_CHANNELS\n");
2477
                ival = aport->sw_channels;
2478
                return put_user(ival, (int *) arg);
2479
 
2480
        case SNDCTL_DSP_SPEED:          /* _SIOWR('P', 2, int) */
2481
                if (get_user(ival, (int *) arg))
2482
                        return -EFAULT;
2483
                DBGX("SNDCTL_DSP_SPEED %d\n", ival);
2484
                if (ival) {
2485
                        if (aport->swstate != SW_INITIAL) {
2486
                                DBGX("SNDCTL_DSP_SPEED failed: swstate = %d\n",
2487
                                     aport->swstate);
2488
                                return -EINVAL;
2489
                        }
2490
                        if (ival < MIN_SPEED)
2491
                                ival = MIN_SPEED;
2492
                        if (ival > MAX_SPEED)
2493
                                ival = MAX_SPEED;
2494
                        if (rport)
2495
                                rport->sw_framerate = ival;
2496
                        if (wport)
2497
                                wport->sw_framerate = ival;
2498
                } else
2499
                        ival = aport->sw_framerate;
2500
                return put_user(ival, (int *) arg);
2501
 
2502
        case SNDCTL_DSP_STEREO:         /* _SIOWR('P', 3, int) */
2503
                if (get_user(ival, (int *) arg))
2504
                        return -EFAULT;
2505
                DBGX("SNDCTL_DSP_STEREO %d\n", ival);
2506
                if (ival != 0 && ival != 1)
2507
                        return -EINVAL;
2508
                if (aport->swstate != SW_INITIAL)
2509
                        return -EINVAL;
2510
                if (rport)
2511
                        rport->sw_channels = ival + 1;
2512
                if (wport)
2513
                        wport->sw_channels = ival + 1;
2514
                return put_user(ival, (int *) arg);
2515
 
2516
        case SNDCTL_DSP_CHANNELS:       /* _SIOWR('P', 6, int) */
2517
                if (get_user(ival, (int *) arg))
2518
                        return -EFAULT;
2519
                DBGX("SNDCTL_DSP_CHANNELS %d\n", ival);
2520
                if (ival != 1 && ival != 2)
2521
                        return -EINVAL;
2522
                if (aport->swstate != SW_INITIAL)
2523
                        return -EINVAL;
2524
                if (rport)
2525
                        rport->sw_channels = ival;
2526
                if (wport)
2527
                        wport->sw_channels = ival;
2528
                return put_user(ival, (int *) arg);
2529
 
2530
        case SNDCTL_DSP_GETBLKSIZE:     /* _SIOWR('P', 4, int) */
2531
                ival = pcm_setup(devc, rport, wport);
2532
                if (ival < 0) {
2533
                        DBGX("SNDCTL_DSP_GETBLKSIZE failed, errno %d\n", ival);
2534
                        return ival;
2535
                }
2536
                ival = 1 << aport->sw_fragshift;
2537
                DBGX("SNDCTL_DSP_GETBLKSIZE returning %d\n", ival);
2538
                return put_user(ival, (int *) arg);
2539
 
2540
        case SNDCTL_DSP_SETFRAGMENT:    /* _SIOWR('P',10, int) */
2541
                if (get_user(ival, (int *) arg))
2542
                        return -EFAULT;
2543
                DBGX("SNDCTL_DSP_SETFRAGMENT %d:%d\n",
2544
                     ival >> 16, ival & 0xFFFF);
2545
                if (aport->swstate != SW_INITIAL)
2546
                        return -EINVAL;
2547
                {
2548
                        int sw_fragshift = ival & 0xFFFF;
2549
                        int sw_subdivshift = aport->sw_subdivshift;
2550
                        int hw_fragshift = sw_fragshift - sw_subdivshift;
2551
                        int sw_fragcount = (ival >> 16) & 0xFFFF;
2552
                        int hw_fragsize;
2553
                        if (hw_fragshift < MIN_FRAGSHIFT)
2554
                                hw_fragshift = MIN_FRAGSHIFT;
2555
                        if (hw_fragshift > MAX_FRAGSHIFT)
2556
                                hw_fragshift = MAX_FRAGSHIFT;
2557
                        sw_fragshift = hw_fragshift + aport->sw_subdivshift;
2558
                        hw_fragsize = 1 << hw_fragshift;
2559
                        if (sw_fragcount < MIN_FRAGCOUNT(hw_fragsize))
2560
                                sw_fragcount = MIN_FRAGCOUNT(hw_fragsize);
2561
                        if (sw_fragcount > MAX_FRAGCOUNT(hw_fragsize))
2562
                                sw_fragcount = MAX_FRAGCOUNT(hw_fragsize);
2563
                        DBGPV("sw_fragshift = %d\n", sw_fragshift);
2564
                        DBGPV("rport = 0x%p, wport = 0x%p\n", rport, wport);
2565
                        if (rport) {
2566
                                rport->sw_fragshift = sw_fragshift;
2567
                                rport->sw_fragcount = sw_fragcount;
2568
                        }
2569
                        if (wport) {
2570
                                wport->sw_fragshift = sw_fragshift;
2571
                                wport->sw_fragcount = sw_fragcount;
2572
                        }
2573
                        ival = sw_fragcount << 16 | sw_fragshift;
2574
                }
2575
                DBGX("SNDCTL_DSP_SETFRAGMENT returns %d:%d\n",
2576
                      ival >> 16, ival & 0xFFFF);
2577
                return put_user(ival, (int *) arg);
2578
 
2579
        case SNDCTL_DSP_SUBDIVIDE:      /* _SIOWR('P', 9, int) */
2580
                if (get_user(ival, (int *) arg))
2581
                        return -EFAULT;
2582
                DBGX("SNDCTL_DSP_SUBDIVIDE %d\n", ival);
2583
                if (aport->swstate != SW_INITIAL)
2584
                        return -EINVAL;
2585
                {
2586
                        int subdivshift;
2587
                        int hw_fragshift, hw_fragsize, hw_fragcount;
2588
                        switch (ival) {
2589
                        case 1: subdivshift = 0; break;
2590
                        case 2: subdivshift = 1; break;
2591
                        case 4: subdivshift = 2; break;
2592
                        default: return -EINVAL;
2593
                        }
2594
                        hw_fragshift = aport->sw_fragshift - subdivshift;
2595
                        if (hw_fragshift < MIN_FRAGSHIFT ||
2596
                            hw_fragshift > MAX_FRAGSHIFT)
2597
                                return -EINVAL;
2598
                        hw_fragsize = 1 << hw_fragshift;
2599
                        hw_fragcount = aport->sw_fragcount >> subdivshift;
2600
                        if (hw_fragcount < MIN_FRAGCOUNT(hw_fragsize) ||
2601
                            hw_fragcount > MAX_FRAGCOUNT(hw_fragsize))
2602
                                return -EINVAL;
2603
                        if (rport)
2604
                                rport->sw_subdivshift = subdivshift;
2605
                        if (wport)
2606
                                wport->sw_subdivshift = subdivshift;
2607
                }
2608
                return 0;
2609
 
2610
        case SNDCTL_DSP_SETFMT:         /* _SIOWR('P',5, int) */
2611
                if (get_user(ival, (int *) arg))
2612
                        return -EFAULT;
2613
                DBGX("SNDCTL_DSP_SETFMT %d\n", ival);
2614
                if (ival != AFMT_QUERY) {
2615
                        if (aport->swstate != SW_INITIAL) {
2616
                                DBGP("SETFMT failed, swstate = %d\n",
2617
                                     aport->swstate);
2618
                                return -EINVAL;
2619
                        }
2620
                        switch (ival) {
2621
                        case AFMT_MU_LAW:
2622
                        case AFMT_A_LAW:
2623
                        case AFMT_U8:
2624
                        case AFMT_S8:
2625
                        case AFMT_S16_LE:
2626
                                if (rport)
2627
                                        rport->sw_samplefmt = ival;
2628
                                if (wport)
2629
                                        wport->sw_samplefmt = ival;
2630
                                break;
2631
                        default:
2632
                                return -EINVAL;
2633
                        }
2634
                }
2635
                ival = aport->sw_samplefmt;
2636
                return put_user(ival, (int *) arg);
2637
 
2638
        case SNDCTL_DSP_GETOSPACE:      /* _SIOR ('P',12, audio_buf_info) */
2639
                DBGXV("SNDCTL_DSP_GETOSPACE\n");
2640
                if (!wport)
2641
                        return -EINVAL;
2642
                ival = pcm_setup(devc, rport, wport);
2643
                if (ival < 0)
2644
                        return ival;
2645
                ival = swb_inc_u(wport, 0);
2646
                buf_info.fragments = ival >> wport->sw_fragshift;
2647
                buf_info.fragstotal = wport->sw_fragcount;
2648
                buf_info.fragsize = 1 << wport->sw_fragshift;
2649
                buf_info.bytes = ival;
2650
                DBGXV("SNDCTL_DSP_GETOSPACE returns { %d %d %d %d }\n",
2651
                     buf_info.fragments, buf_info.fragstotal,
2652
                     buf_info.fragsize, buf_info.bytes);
2653
                return copy_to_user((void *) arg, &buf_info, sizeof buf_info) ? -EFAULT : 0;
2654
 
2655
        case SNDCTL_DSP_GETISPACE:      /* _SIOR ('P',13, audio_buf_info) */
2656
                DBGX("SNDCTL_DSP_GETISPACE\n");
2657
                if (!rport)
2658
                        return -EINVAL;
2659
                ival = pcm_setup(devc, rport, wport);
2660
                if (ival < 0)
2661
                        return ival;
2662
                ival = swb_inc_u(rport, 0);
2663
                buf_info.fragments = ival >> rport->sw_fragshift;
2664
                buf_info.fragstotal = rport->sw_fragcount;
2665
                buf_info.fragsize = 1 << rport->sw_fragshift;
2666
                buf_info.bytes = ival;
2667
                DBGX("SNDCTL_DSP_GETISPACE returns { %d %d %d %d }\n",
2668
                     buf_info.fragments, buf_info.fragstotal,
2669
                     buf_info.fragsize, buf_info.bytes);
2670
                return copy_to_user((void *) arg, &buf_info, sizeof buf_info) ? -EFAULT : 0;
2671
 
2672
        case SNDCTL_DSP_NONBLOCK:       /* _SIO  ('P',14) */
2673
                DBGX("SNDCTL_DSP_NONBLOCK\n");
2674
                file->f_flags |= O_NONBLOCK;
2675
                return 0;
2676
 
2677
        case SNDCTL_DSP_RESET:          /* _SIO  ('P', 0) */
2678
                DBGX("SNDCTL_DSP_RESET\n");
2679
                /*
2680
                 * Nothing special needs to be done for input.  Input
2681
                 * samples sit in swbuf, but it will be reinitialized
2682
                 * to empty when pcm_setup() is called.
2683
                 */
2684
                if (wport && wport->swbuf) {
2685
                        wport->swstate = SW_INITIAL;
2686
                        pcm_output(devc, 0, 0);
2687
                        pcm_write_sync(devc);
2688
                }
2689
                pcm_shutdown(devc, rport, wport);
2690
                return 0;
2691
 
2692
        case SNDCTL_DSP_SYNC:           /* _SIO  ('P', 1) */
2693
                DBGX("SNDCTL_DSP_SYNC\n");
2694
                if (wport) {
2695
                        pcm_flush_frag(devc);
2696
                        pcm_write_sync(devc);
2697
                }
2698
                pcm_shutdown(devc, rport, wport);
2699
                return 0;
2700
 
2701
        case SNDCTL_DSP_POST:           /* _SIO  ('P', 8) */
2702
                DBGX("SNDCTL_DSP_POST\n");
2703
                if (!wport)
2704
                        return -EINVAL;
2705
                pcm_flush_frag(devc);
2706
                return 0;
2707
 
2708
        case SNDCTL_DSP_GETIPTR:        /* _SIOR ('P', 17, count_info) */
2709
                DBGX("SNDCTL_DSP_GETIPTR\n");
2710
                if (!rport)
2711
                        return -EINVAL;
2712
                spin_lock_irqsave(&rport->lock, flags);
2713
                {
2714
                        ustmsc_t ustmsc;
2715
                        if (rport->hwstate == HW_RUNNING) {
2716
                                ASSERT(rport->swstate == SW_RUN);
2717
                                li_read_USTMSC(&rport->chan, &ustmsc);
2718
                                info.bytes = ustmsc.msc - rport->MSC_offset;
2719
                                info.bytes *= rport->frame_size;
2720
                        } else {
2721
                                info.bytes = rport->byte_count;
2722
                        }
2723
                        info.blocks = rport->frag_count;
2724
                        info.ptr = 0;    /* not implemented */
2725
                        rport->frag_count = 0;
2726
                }
2727
                spin_unlock_irqrestore(&rport->lock, flags);
2728
                return copy_to_user((void *) arg, &info, sizeof info) ? -EFAULT : 0;
2729
 
2730
        case SNDCTL_DSP_GETOPTR:        /* _SIOR ('P',18, count_info) */
2731
                DBGX("SNDCTL_DSP_GETOPTR\n");
2732
                if (!wport)
2733
                        return -EINVAL;
2734
                spin_lock_irqsave(&wport->lock, flags);
2735
                {
2736
                        ustmsc_t ustmsc;
2737
                        if (wport->hwstate == HW_RUNNING) {
2738
                                ASSERT(wport->swstate == SW_RUN);
2739
                                li_read_USTMSC(&wport->chan, &ustmsc);
2740
                                info.bytes = ustmsc.msc - wport->MSC_offset;
2741
                                info.bytes *= wport->frame_size;
2742
                        } else {
2743
                                info.bytes = wport->byte_count;
2744
                        }
2745
                        info.blocks = wport->frag_count;
2746
                        info.ptr = 0;    /* not implemented */
2747
                        wport->frag_count = 0;
2748
                }
2749
                spin_unlock_irqrestore(&wport->lock, flags);
2750
                return copy_to_user((void *) arg, &info, sizeof info) ? -EFAULT : 0;
2751
 
2752
        case SNDCTL_DSP_GETODELAY:      /* _SIOR ('P', 23, int) */
2753
                DBGX("SNDCTL_DSP_GETODELAY\n");
2754
                if (!wport)
2755
                        return -EINVAL;
2756
                spin_lock_irqsave(&wport->lock, flags);
2757
                {
2758
                        int fsize = wport->frame_size;
2759
                        ival = wport->swb_i_avail / fsize;
2760
                        if (wport->hwstate == HW_RUNNING) {
2761
                                int swptr, hwptr, hwframes, hwbytes, hwsize;
2762
                                int totalhwbytes;
2763
                                ustmsc_t ustmsc;
2764
 
2765
                                hwsize = wport->hwbuf_size;
2766
                                swptr = li_read_swptr(&wport->chan);
2767
                                li_read_USTMSC(&wport->chan, &ustmsc);
2768
                                hwframes = ustmsc.msc - wport->MSC_offset;
2769
                                totalhwbytes = hwframes * fsize;
2770
                                hwptr = totalhwbytes % hwsize;
2771
                                hwbytes = (swptr - hwptr + hwsize) % hwsize;
2772
                                ival += hwbytes / fsize;
2773
                        }
2774
                }
2775
                spin_unlock_irqrestore(&wport->lock, flags);
2776
                return put_user(ival, (int *) arg);
2777
 
2778
        case SNDCTL_DSP_PROFILE:        /* _SIOW ('P', 23, int) */
2779
                DBGX("SNDCTL_DSP_PROFILE\n");
2780
 
2781
                /*
2782
                 * Thomas Sailer explains SNDCTL_DSP_PROFILE
2783
                 * (private email, March 24, 1999):
2784
                 *
2785
                 *     This gives the sound driver a hint on what it
2786
                 *     should do with partial fragments
2787
                 *     (i.e. fragments partially filled with write).
2788
                 *     This can direct the driver to zero them or
2789
                 *     leave them alone.  But don't ask me what this
2790
                 *     is good for, my driver just zeroes the last
2791
                 *     fragment before the receiver stops, no idea
2792
                 *     what good for any other behaviour could
2793
                 *     be. Implementing it as NOP seems safe.
2794
                 */
2795
 
2796
                break;
2797
 
2798
        case SNDCTL_DSP_GETTRIGGER:     /* _SIOR ('P',16, int) */
2799
                DBGX("SNDCTL_DSP_GETTRIGGER\n");
2800
                ival = 0;
2801
                if (rport) {
2802
                        spin_lock_irqsave(&rport->lock, flags);
2803
                        {
2804
                                if (!(rport->flags & DISABLED))
2805
                                        ival |= PCM_ENABLE_INPUT;
2806
                        }
2807
                        spin_unlock_irqrestore(&rport->lock, flags);
2808
                }
2809
                if (wport) {
2810
                        spin_lock_irqsave(&wport->lock, flags);
2811
                        {
2812
                                if (!(wport->flags & DISABLED))
2813
                                        ival |= PCM_ENABLE_OUTPUT;
2814
                        }
2815
                        spin_unlock_irqrestore(&wport->lock, flags);
2816
                }
2817
                return put_user(ival, (int *) arg);
2818
 
2819
        case SNDCTL_DSP_SETTRIGGER:     /* _SIOW ('P',16, int) */
2820
                if (get_user(ival, (int *) arg))
2821
                        return -EFAULT;
2822
                DBGX("SNDCTL_DSP_SETTRIGGER %d\n", ival);
2823
 
2824
                /*
2825
                 * If user is disabling I/O and port is not in initial
2826
                 * state, fail with EINVAL.
2827
                 */
2828
 
2829
                if (((rport && !(ival & PCM_ENABLE_INPUT)) ||
2830
                     (wport && !(ival & PCM_ENABLE_OUTPUT))) &&
2831
                    aport->swstate != SW_INITIAL)
2832
                        return -EINVAL;
2833
 
2834
                if (rport) {
2835
                        vwsnd_port_hwstate_t hwstate;
2836
                        spin_lock_irqsave(&rport->lock, flags);
2837
                        {
2838
                                hwstate = rport->hwstate;
2839
                                if (ival & PCM_ENABLE_INPUT)
2840
                                        rport->flags &= ~DISABLED;
2841
                                else
2842
                                        rport->flags |= DISABLED;
2843
                        }
2844
                        spin_unlock_irqrestore(&rport->lock, flags);
2845
                        if (hwstate != HW_RUNNING && ival & PCM_ENABLE_INPUT) {
2846
 
2847
                                if (rport->swstate == SW_INITIAL)
2848
                                        pcm_setup(devc, rport, wport);
2849
                                else
2850
                                        li_activate_dma(&rport->chan);
2851
                        }
2852
                }
2853
                if (wport) {
2854
                        vwsnd_port_flags_t pflags;
2855
                        spin_lock_irqsave(&wport->lock, flags);
2856
                        {
2857
                                pflags = wport->flags;
2858
                                if (ival & PCM_ENABLE_OUTPUT)
2859
                                        wport->flags &= ~DISABLED;
2860
                                else
2861
                                        wport->flags |= DISABLED;
2862
                        }
2863
                        spin_unlock_irqrestore(&wport->lock, flags);
2864
                        if (pflags & DISABLED && ival & PCM_ENABLE_OUTPUT) {
2865
                                if (wport->swstate == SW_RUN)
2866
                                        pcm_output(devc, 0, 0);
2867
                        }
2868
                }
2869
                return 0;
2870
 
2871
        default:
2872
                DBGP("unknown ioctl 0x%x\n", cmd);
2873
                return -EINVAL;
2874
        }
2875
        DBGP("unimplemented ioctl 0x%x\n", cmd);
2876
        return -EINVAL;
2877
}
2878
 
2879
static int vwsnd_audio_ioctl(struct inode *inode,
2880
                                struct file *file,
2881
                                unsigned int cmd,
2882
                                unsigned long arg)
2883
{
2884
        vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
2885
        int ret;
2886
 
2887
        down(&devc->io_sema);
2888
        ret = vwsnd_audio_do_ioctl(inode, file, cmd, arg);
2889
        up(&devc->io_sema);
2890
        return ret;
2891
}
2892
 
2893
/* No mmap. */
2894
 
2895
static int vwsnd_audio_mmap(struct file *file, struct vm_area_struct *vma)
2896
{
2897
        DBGE("(file=0x%p, vma=0x%p)\n", file, vma);
2898
        return -ENODEV;
2899
}
2900
 
2901
/*
2902
 * Open the audio device for read and/or write.
2903
 *
2904
 * Returns 0 on success, -errno on failure.
2905
 */
2906
 
2907
static int vwsnd_audio_open(struct inode *inode, struct file *file)
2908
{
2909
        vwsnd_dev_t *devc;
2910
        dev_t minor = MINOR(inode->i_rdev);
2911
        int sw_samplefmt;
2912
 
2913
        DBGE("(inode=0x%p, file=0x%p)\n", inode, file);
2914
 
2915
        INC_USE_COUNT;
2916
        for (devc = vwsnd_dev_list; devc; devc = devc->next_dev)
2917
                if ((devc->audio_minor & ~0x0F) == (minor & ~0x0F))
2918
                        break;
2919
 
2920
        if (devc == NULL) {
2921
                DEC_USE_COUNT;
2922
                return -ENODEV;
2923
        }
2924
 
2925
        down(&devc->open_sema);
2926
        while (devc->open_mode & file->f_mode) {
2927
                up(&devc->open_sema);
2928
                if (file->f_flags & O_NONBLOCK) {
2929
                        DEC_USE_COUNT;
2930
                        return -EBUSY;
2931
                }
2932
                interruptible_sleep_on(&devc->open_wait);
2933
                if (signal_pending(current)) {
2934
                        DEC_USE_COUNT;
2935
                        return -ERESTARTSYS;
2936
                }
2937
                down(&devc->open_sema);
2938
        }
2939
        devc->open_mode |= file->f_mode & (FMODE_READ | FMODE_WRITE);
2940
        up(&devc->open_sema);
2941
 
2942
        /* get default sample format from minor number. */
2943
 
2944
        sw_samplefmt = 0;
2945
        if ((minor & 0xF) == SND_DEV_DSP)
2946
                sw_samplefmt = AFMT_U8;
2947
        else if ((minor & 0xF) == SND_DEV_AUDIO)
2948
                sw_samplefmt = AFMT_MU_LAW;
2949
        else if ((minor & 0xF) == SND_DEV_DSP16)
2950
                sw_samplefmt = AFMT_S16_LE;
2951
        else
2952
                ASSERT(0);
2953
 
2954
        /* Initialize vwsnd_ports. */
2955
 
2956
        down(&devc->io_sema);
2957
        {
2958
                if (file->f_mode & FMODE_READ) {
2959
                        devc->rport.swstate        = SW_INITIAL;
2960
                        devc->rport.flags          = 0;
2961
                        devc->rport.sw_channels    = 1;
2962
                        devc->rport.sw_samplefmt   = sw_samplefmt;
2963
                        devc->rport.sw_framerate   = 8000;
2964
                        devc->rport.sw_fragshift   = DEFAULT_FRAGSHIFT;
2965
                        devc->rport.sw_fragcount   = DEFAULT_FRAGCOUNT;
2966
                        devc->rport.sw_subdivshift = DEFAULT_SUBDIVSHIFT;
2967
                        devc->rport.byte_count     = 0;
2968
                        devc->rport.frag_count     = 0;
2969
                }
2970
                if (file->f_mode & FMODE_WRITE) {
2971
                        devc->wport.swstate        = SW_INITIAL;
2972
                        devc->wport.flags          = 0;
2973
                        devc->wport.sw_channels    = 1;
2974
                        devc->wport.sw_samplefmt   = sw_samplefmt;
2975
                        devc->wport.sw_framerate   = 8000;
2976
                        devc->wport.sw_fragshift   = DEFAULT_FRAGSHIFT;
2977
                        devc->wport.sw_fragcount   = DEFAULT_FRAGCOUNT;
2978
                        devc->wport.sw_subdivshift = DEFAULT_SUBDIVSHIFT;
2979
                        devc->wport.byte_count     = 0;
2980
                        devc->wport.frag_count     = 0;
2981
                }
2982
        }
2983
        up(&devc->io_sema);
2984
 
2985
        file->private_data = devc;
2986
        DBGRV();
2987
        return 0;
2988
}
2989
 
2990
/*
2991
 * Release (close) the audio device.
2992
 */
2993
 
2994
static int vwsnd_audio_release(struct inode *inode, struct file *file)
2995
{
2996
        vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
2997
        vwsnd_port_t *wport = NULL, *rport = NULL;
2998
        int err = 0;
2999
 
3000
        lock_kernel();
3001
        down(&devc->io_sema);
3002
        {
3003
                DBGEV("(inode=0x%p, file=0x%p)\n", inode, file);
3004
 
3005
                if (file->f_mode & FMODE_READ)
3006
                        rport = &devc->rport;
3007
                if (file->f_mode & FMODE_WRITE) {
3008
                        wport = &devc->wport;
3009
                        pcm_flush_frag(devc);
3010
                        pcm_write_sync(devc);
3011
                }
3012
                pcm_shutdown(devc, rport, wport);
3013
                if (rport)
3014
                        rport->swstate = SW_OFF;
3015
                if (wport)
3016
                        wport->swstate = SW_OFF;
3017
        }
3018
        up(&devc->io_sema);
3019
 
3020
        down(&devc->open_sema);
3021
        {
3022
                devc->open_mode &= ~file->f_mode;
3023
        }
3024
        up(&devc->open_sema);
3025
        wake_up(&devc->open_wait);
3026
        DEC_USE_COUNT;
3027
        DBGR();
3028
        unlock_kernel();
3029
        return err;
3030
}
3031
 
3032
static struct file_operations vwsnd_audio_fops = {
3033
        owner:          THIS_MODULE,
3034
        llseek:         no_llseek,
3035
        read:           vwsnd_audio_read,
3036
        write:          vwsnd_audio_write,
3037
        poll:           vwsnd_audio_poll,
3038
        ioctl:          vwsnd_audio_ioctl,
3039
        mmap:           vwsnd_audio_mmap,
3040
        open:           vwsnd_audio_open,
3041
        release:        vwsnd_audio_release,
3042
};
3043
 
3044
/*****************************************************************************/
3045
/* mixer driver */
3046
 
3047
/* open the mixer device. */
3048
 
3049
static int vwsnd_mixer_open(struct inode *inode, struct file *file)
3050
{
3051
        vwsnd_dev_t *devc;
3052
 
3053
        DBGEV("(inode=0x%p, file=0x%p)\n", inode, file);
3054
 
3055
        INC_USE_COUNT;
3056
        for (devc = vwsnd_dev_list; devc; devc = devc->next_dev)
3057
                if (devc->mixer_minor == MINOR(inode->i_rdev))
3058
                        break;
3059
 
3060
        if (devc == NULL) {
3061
                DEC_USE_COUNT;
3062
                return -ENODEV;
3063
        }
3064
        file->private_data = devc;
3065
        return 0;
3066
}
3067
 
3068
/* release (close) the mixer device. */
3069
 
3070
static int vwsnd_mixer_release(struct inode *inode, struct file *file)
3071
{
3072
        DBGEV("(inode=0x%p, file=0x%p)\n", inode, file);
3073
        DEC_USE_COUNT;
3074
        return 0;
3075
}
3076
 
3077
/* mixer_read_ioctl handles all read ioctls on the mixer device. */
3078
 
3079
static int mixer_read_ioctl(vwsnd_dev_t *devc, unsigned int nr, caddr_t arg)
3080
{
3081
        int val = -1;
3082
 
3083
        DBGEV("(devc=0x%p, nr=0x%x, arg=0x%p)\n", devc, nr, arg);
3084
 
3085
        switch (nr) {
3086
        case SOUND_MIXER_CAPS:
3087
                val = SOUND_CAP_EXCL_INPUT;
3088
                break;
3089
 
3090
        case SOUND_MIXER_DEVMASK:
3091
                val = (SOUND_MASK_PCM | SOUND_MASK_LINE |
3092
                       SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_RECLEV);
3093
                break;
3094
 
3095
        case SOUND_MIXER_STEREODEVS:
3096
                val = (SOUND_MASK_PCM | SOUND_MASK_LINE |
3097
                       SOUND_MASK_MIC | SOUND_MASK_CD | SOUND_MASK_RECLEV);
3098
                break;
3099
 
3100
        case SOUND_MIXER_OUTMASK:
3101
                val = (SOUND_MASK_PCM | SOUND_MASK_LINE |
3102
                       SOUND_MASK_MIC | SOUND_MASK_CD);
3103
                break;
3104
 
3105
        case SOUND_MIXER_RECMASK:
3106
                val = (SOUND_MASK_PCM | SOUND_MASK_LINE |
3107
                       SOUND_MASK_MIC | SOUND_MASK_CD);
3108
                break;
3109
 
3110
        case SOUND_MIXER_PCM:
3111
                val = ad1843_get_gain(&devc->lith, &ad1843_gain_PCM);
3112
                break;
3113
 
3114
        case SOUND_MIXER_LINE:
3115
                val = ad1843_get_gain(&devc->lith, &ad1843_gain_LINE);
3116
                break;
3117
 
3118
        case SOUND_MIXER_MIC:
3119
                val = ad1843_get_gain(&devc->lith, &ad1843_gain_MIC);
3120
                break;
3121
 
3122
        case SOUND_MIXER_CD:
3123
                val = ad1843_get_gain(&devc->lith, &ad1843_gain_CD);
3124
                break;
3125
 
3126
        case SOUND_MIXER_RECLEV:
3127
                val = ad1843_get_gain(&devc->lith, &ad1843_gain_RECLEV);
3128
                break;
3129
 
3130
        case SOUND_MIXER_RECSRC:
3131
                val = ad1843_get_recsrc(&devc->lith);
3132
                break;
3133
 
3134
        case SOUND_MIXER_OUTSRC:
3135
                val = ad1843_get_outsrc(&devc->lith);
3136
                break;
3137
 
3138
        default:
3139
                return -EINVAL;
3140
        }
3141
        return put_user(val, (int *) arg);
3142
}
3143
 
3144
/* mixer_write_ioctl handles all write ioctls on the mixer device. */
3145
 
3146
static int mixer_write_ioctl(vwsnd_dev_t *devc, unsigned int nr, caddr_t arg)
3147
{
3148
        int val;
3149
        int err;
3150
 
3151
        DBGEV("(devc=0x%p, nr=0x%x, arg=0x%p)\n", devc, nr, arg);
3152
 
3153
        err = get_user(val, (int *) arg);
3154
        if (err)
3155
                return -EFAULT;
3156
        switch (nr) {
3157
        case SOUND_MIXER_PCM:
3158
                val = ad1843_set_gain(&devc->lith, &ad1843_gain_PCM, val);
3159
                break;
3160
 
3161
        case SOUND_MIXER_LINE:
3162
                val = ad1843_set_gain(&devc->lith, &ad1843_gain_LINE, val);
3163
                break;
3164
 
3165
        case SOUND_MIXER_MIC:
3166
                val = ad1843_set_gain(&devc->lith, &ad1843_gain_MIC, val);
3167
                break;
3168
 
3169
        case SOUND_MIXER_CD:
3170
                val = ad1843_set_gain(&devc->lith, &ad1843_gain_CD, val);
3171
                break;
3172
 
3173
        case SOUND_MIXER_RECLEV:
3174
                val = ad1843_set_gain(&devc->lith, &ad1843_gain_RECLEV, val);
3175
                break;
3176
 
3177
        case SOUND_MIXER_RECSRC:
3178
                if (devc->rport.swbuf || devc->wport.swbuf)
3179
                        return -EBUSY;  /* can't change recsrc while running */
3180
                val = ad1843_set_recsrc(&devc->lith, val);
3181
                break;
3182
 
3183
        case SOUND_MIXER_OUTSRC:
3184
                val = ad1843_set_outsrc(&devc->lith, val);
3185
                break;
3186
 
3187
        default:
3188
                return -EINVAL;
3189
        }
3190
        if (val < 0)
3191
                return val;
3192
        return put_user(val, (int *) arg);
3193
}
3194
 
3195
/* This is the ioctl entry to the mixer driver. */
3196
 
3197
static int vwsnd_mixer_ioctl(struct inode *ioctl,
3198
                              struct file *file,
3199
                              unsigned int cmd,
3200
                              unsigned long arg)
3201
{
3202
        vwsnd_dev_t *devc = (vwsnd_dev_t *) file->private_data;
3203
        const unsigned int nrmask = _IOC_NRMASK << _IOC_NRSHIFT;
3204
        const unsigned int nr = (cmd & nrmask) >> _IOC_NRSHIFT;
3205
        int retval;
3206
 
3207
        DBGEV("(devc=0x%p, cmd=0x%x, arg=0x%lx)\n", devc, cmd, arg);
3208
 
3209
        down(&devc->mix_sema);
3210
        {
3211
                if ((cmd & ~nrmask) == MIXER_READ(0))
3212
                        retval = mixer_read_ioctl(devc, nr, (caddr_t) arg);
3213
                else if ((cmd & ~nrmask) == MIXER_WRITE(0))
3214
                        retval = mixer_write_ioctl(devc, nr, (caddr_t) arg);
3215
                else
3216
                        retval = -EINVAL;
3217
        }
3218
        up(&devc->mix_sema);
3219
        return retval;
3220
}
3221
 
3222
static struct file_operations vwsnd_mixer_fops = {
3223
        owner:          THIS_MODULE,
3224
        llseek:         no_llseek,
3225
        ioctl:          vwsnd_mixer_ioctl,
3226
        open:           vwsnd_mixer_open,
3227
        release:        vwsnd_mixer_release,
3228
};
3229
 
3230
/*****************************************************************************/
3231
/* probe/attach/unload */
3232
 
3233
/* driver probe routine.  Return nonzero if hardware is found. */
3234
 
3235
static int __init probe_vwsnd(struct address_info *hw_config)
3236
{
3237
        lithium_t lith;
3238
        int w;
3239
        unsigned long later;
3240
 
3241
        DBGEV("(hw_config=0x%p)\n", hw_config);
3242
 
3243
        /* XXX verify lithium present (to prevent crash on non-vw) */
3244
 
3245
        if (li_create(&lith, hw_config->io_base) != 0) {
3246
                printk(KERN_WARNING "probe_vwsnd: can't map lithium\n");
3247
                return 0;
3248
        }
3249
        later = jiffies + 2;
3250
        li_writel(&lith, LI_HOST_CONTROLLER, LI_HC_LINK_ENABLE);
3251
        do {
3252
                w = li_readl(&lith, LI_HOST_CONTROLLER);
3253
        } while (w == LI_HC_LINK_ENABLE && jiffies < later);
3254
 
3255
        li_destroy(&lith);
3256
 
3257
        DBGPV("HC = 0x%04x\n", w);
3258
 
3259
        if ((w == LI_HC_LINK_ENABLE) || (w & LI_HC_LINK_CODEC)) {
3260
 
3261
                /* This may indicate a beta machine with no audio,
3262
                 * or a future machine with different audio.
3263
                 * On beta-release 320 w/ no audio, HC == 0x4000 */
3264
 
3265
                printk(KERN_WARNING "probe_vwsnd: audio codec not found\n");
3266
                return 0;
3267
        }
3268
 
3269
        if (w & LI_HC_LINK_FAILURE) {
3270
                printk(KERN_WARNING "probe_vwsnd: can't init audio codec\n");
3271
                return 0;
3272
        }
3273
 
3274
        printk(KERN_INFO "probe_vwsnd: lithium audio found\n");
3275
 
3276
        return 1;
3277
}
3278
 
3279
/*
3280
 * driver attach routine.  Initialize driver data structures and
3281
 * initialize hardware.  A new vwsnd_dev_t is allocated and put
3282
 * onto the global list, vwsnd_dev_list.
3283
 *
3284
 * Return +minor_dev on success, -errno on failure.
3285
 */
3286
 
3287
static int __init attach_vwsnd(struct address_info *hw_config)
3288
{
3289
        vwsnd_dev_t *devc = NULL;
3290
        int err = -ENOMEM;
3291
 
3292
        DBGEV("(hw_config=0x%p)\n", hw_config);
3293
 
3294
        devc = kmalloc(sizeof (vwsnd_dev_t), GFP_KERNEL);
3295
        if (devc == NULL)
3296
                goto fail0;
3297
 
3298
        err = li_create(&devc->lith, hw_config->io_base);
3299
        if (err)
3300
                goto fail1;
3301
 
3302
        init_waitqueue(&devc->open_wait);
3303
 
3304
        devc->rport.hwbuf_size = HWBUF_SIZE;
3305
        devc->rport.hwbuf_vaddr = __get_free_pages(GFP_KERNEL, HWBUF_ORDER);
3306
        if (!devc->rport.hwbuf_vaddr)
3307
                goto fail2;
3308
        devc->rport.hwbuf = (caddr_t) devc->rport.hwbuf_vaddr;
3309
        devc->rport.hwbuf_paddr = virt_to_phys(devc->rport.hwbuf);
3310
 
3311
        /*
3312
         * Quote from the NT driver:
3313
         *
3314
         * // WARNING!!! HACK to setup output dma!!!
3315
         * // This is required because even on output there is some data
3316
         * // trickling into the input DMA channel.  This is a bug in the
3317
         * // Lithium microcode.
3318
         * // --sde
3319
         *
3320
         * We set the input side's DMA base address here.  It will remain
3321
         * valid until the driver is unloaded.
3322
         */
3323
 
3324
        li_writel(&devc->lith, LI_COMM1_BASE,
3325
                  devc->rport.hwbuf_paddr >> 8 | 1 << (37 - 8));
3326
 
3327
        devc->wport.hwbuf_size = HWBUF_SIZE;
3328
        devc->wport.hwbuf_vaddr = __get_free_pages(GFP_KERNEL, HWBUF_ORDER);
3329
        if (!devc->wport.hwbuf_vaddr)
3330
                goto fail3;
3331
        devc->wport.hwbuf = (caddr_t) devc->wport.hwbuf_vaddr;
3332
        devc->wport.hwbuf_paddr = virt_to_phys(devc->wport.hwbuf);
3333
        DBGP("wport hwbuf = 0x%p\n", devc->wport.hwbuf);
3334
 
3335
        DBGDO(shut_up++);
3336
        err = ad1843_init(&devc->lith);
3337
        DBGDO(shut_up--);
3338
        if (err)
3339
                goto fail4;
3340
 
3341
        /* install interrupt handler */
3342
 
3343
        err = request_irq(hw_config->irq, vwsnd_audio_intr, 0, "vwsnd", devc);
3344
        if (err)
3345
                goto fail5;
3346
 
3347
        /* register this device's drivers. */
3348
 
3349
        devc->audio_minor = register_sound_dsp(&vwsnd_audio_fops, -1);
3350
        if ((err = devc->audio_minor) < 0) {
3351
                DBGDO(printk(KERN_WARNING
3352
                             "attach_vwsnd: register_sound_dsp error %d\n",
3353
                             err));
3354
                goto fail6;
3355
        }
3356
        devc->mixer_minor = register_sound_mixer(&vwsnd_mixer_fops,
3357
                                                 devc->audio_minor >> 4);
3358
        if ((err = devc->mixer_minor) < 0) {
3359
                DBGDO(printk(KERN_WARNING
3360
                             "attach_vwsnd: register_sound_mixer error %d\n",
3361
                             err));
3362
                goto fail7;
3363
        }
3364
 
3365
        /* Squirrel away device indices for unload routine. */
3366
 
3367
        hw_config->slots[0] = devc->audio_minor;
3368
 
3369
        /* Initialize as much of *devc as possible */
3370
 
3371
        devc->open_sema = MUTEX;
3372
        devc->io_sema = MUTEX;
3373
        devc->mix_sema = MUTEX;
3374
        devc->open_mode = 0;
3375
        devc->rport.lock = SPIN_LOCK_UNLOCKED;
3376
        init_waitqueue(&devc->rport.queue);
3377
        devc->rport.swstate = SW_OFF;
3378
        devc->rport.hwstate = HW_STOPPED;
3379
        devc->rport.flags = 0;
3380
        devc->rport.swbuf = NULL;
3381
        devc->wport.lock = SPIN_LOCK_UNLOCKED;
3382
        init_waitqueue(&devc->wport.queue);
3383
        devc->wport.swstate = SW_OFF;
3384
        devc->wport.hwstate = HW_STOPPED;
3385
        devc->wport.flags = 0;
3386
        devc->wport.swbuf = NULL;
3387
 
3388
        /* Success.  Link us onto the local device list. */
3389
 
3390
        devc->next_dev = vwsnd_dev_list;
3391
        vwsnd_dev_list = devc;
3392
        return devc->audio_minor;
3393
 
3394
        /* So many ways to fail.  Undo what we did. */
3395
 
3396
 fail7:
3397
        unregister_sound_dsp(devc->audio_minor);
3398
 fail6:
3399
        free_irq(hw_config->irq, devc);
3400
 fail5:
3401
 fail4:
3402
        free_pages(devc->wport.hwbuf_vaddr, HWBUF_ORDER);
3403
 fail3:
3404
        free_pages(devc->rport.hwbuf_vaddr, HWBUF_ORDER);
3405
 fail2:
3406
        li_destroy(&devc->lith);
3407
 fail1:
3408
        kfree(devc);
3409
 fail0:
3410
        return err;
3411
}
3412
 
3413
static int __exit unload_vwsnd(struct address_info *hw_config)
3414
{
3415
        vwsnd_dev_t *devc, **devcp;
3416
 
3417
        DBGE("()\n");
3418
 
3419
        devcp = &vwsnd_dev_list;
3420
        while ((devc = *devcp)) {
3421
                if (devc->audio_minor == hw_config->slots[0]) {
3422
                        *devcp = devc->next_dev;
3423
                        break;
3424
                }
3425
                devcp = &devc->next_dev;
3426
        }
3427
 
3428
        if (!devc)
3429
                return -ENODEV;
3430
 
3431
        unregister_sound_mixer(devc->mixer_minor);
3432
        unregister_sound_dsp(devc->audio_minor);
3433
        free_irq(hw_config->irq, devc);
3434
        free_pages(devc->wport.hwbuf_vaddr, HWBUF_ORDER);
3435
        free_pages(devc->rport.hwbuf_vaddr, HWBUF_ORDER);
3436
        li_destroy(&devc->lith);
3437
        kfree(devc);
3438
 
3439
        return 0;
3440
}
3441
 
3442
/*****************************************************************************/
3443
/* initialization and loadable kernel module interface */
3444
 
3445
static struct address_info the_hw_config = {
3446
        0xFF001000,                     /* lithium phys addr  */
3447
        CO_IRQ(CO_APIC_LI_AUDIO)        /* irq */
3448
};
3449
 
3450
MODULE_DESCRIPTION("SGI Visual Workstation sound module");
3451
MODULE_AUTHOR("Bob Miller <kbob@sgi.com>");
3452
MODULE_LICENSE("GPL");
3453
 
3454
static int __init init_vwsnd(void)
3455
{
3456
        int err;
3457
 
3458
        DBGXV("\n");
3459
        DBGXV("sound::vwsnd::init_module()\n");
3460
 
3461
        if(!probe_vwsnd(&the_hw_config))
3462
                return -ENODEV;
3463
        err = attach_vwsnd(&the_hw_config);
3464
        if (err < 0)
3465
                return err;
3466
        return 0;
3467
}
3468
 
3469
static void __exit cleanup_vwsnd(void)
3470
{
3471
        DBGX("sound::vwsnd::cleanup_module()\n");
3472
 
3473
        unload_vwsnd(&the_hw_config);
3474
}
3475
 
3476
module_init(init_vwsnd);
3477
module_exit(cleanup_vwsnd);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.