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

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [sound/] [oss/] [vwsnd.c] - Blame information for rev 3

Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

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