diff options
author | Stas Sergeev <stsp@aknet.ru> | 2008-03-03 04:53:54 -0500 |
---|---|---|
committer | Takashi Iwai <tiwai@suse.de> | 2008-04-24 06:00:20 -0400 |
commit | 9ab4d072ad67793d70b8707e14fb9261749c4e07 (patch) | |
tree | c6ae32f1d3d3b273fae30b0fa59b8c79bd5e8044 /sound/drivers/pcsp/pcsp.h | |
parent | 40ac8c4f208111cdc1542ccc9feb21b98a6b0219 (diff) |
[ALSA] Add PC-speaker sound driver
Added PC-speaker sound driver (snd-pcsp).
Signed-off-by: Stas Sergeev <stsp@aknet.ru>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Diffstat (limited to 'sound/drivers/pcsp/pcsp.h')
-rw-r--r-- | sound/drivers/pcsp/pcsp.h | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/sound/drivers/pcsp/pcsp.h b/sound/drivers/pcsp/pcsp.h new file mode 100644 index 000000000000..f07cc1ee1fe7 --- /dev/null +++ b/sound/drivers/pcsp/pcsp.h | |||
@@ -0,0 +1,82 @@ | |||
1 | /* | ||
2 | * PC-Speaker driver for Linux | ||
3 | * | ||
4 | * Copyright (C) 1993-1997 Michael Beck | ||
5 | * Copyright (C) 1997-2001 David Woodhouse | ||
6 | * Copyright (C) 2001-2008 Stas Sergeev | ||
7 | */ | ||
8 | |||
9 | #ifndef __PCSP_H__ | ||
10 | #define __PCSP_H__ | ||
11 | |||
12 | #include <linux/hrtimer.h> | ||
13 | #if defined(CONFIG_MIPS) || defined(CONFIG_X86) | ||
14 | /* Use the global PIT lock ! */ | ||
15 | #include <asm/i8253.h> | ||
16 | #else | ||
17 | #include <asm/8253pit.h> | ||
18 | static DEFINE_SPINLOCK(i8253_lock); | ||
19 | #endif | ||
20 | |||
21 | #define PCSP_SOUND_VERSION 0x400 /* read 4.00 */ | ||
22 | #define PCSP_DEBUG 0 | ||
23 | |||
24 | /* default timer freq for PC-Speaker: 18643 Hz */ | ||
25 | #define DIV_18KHZ 64 | ||
26 | #define MAX_DIV DIV_18KHZ | ||
27 | #define CUR_DIV() (MAX_DIV >> chip->treble) | ||
28 | #define PCSP_MAX_TREBLE 1 | ||
29 | |||
30 | /* unfortunately, with hrtimers 37KHz does not work very well :( */ | ||
31 | #define PCSP_DEFAULT_TREBLE 0 | ||
32 | #define MIN_DIV (MAX_DIV >> PCSP_MAX_TREBLE) | ||
33 | |||
34 | /* wild guess */ | ||
35 | #define PCSP_MIN_LPJ 1000000 | ||
36 | #define PCSP_DEFAULT_SDIV (DIV_18KHZ >> 1) | ||
37 | #define PCSP_DEFAULT_SRATE (PIT_TICK_RATE / PCSP_DEFAULT_SDIV) | ||
38 | #define PCSP_INDEX_INC() (1 << (PCSP_MAX_TREBLE - chip->treble)) | ||
39 | #define PCSP_RATE() (PIT_TICK_RATE / CUR_DIV()) | ||
40 | #define PCSP_MIN_RATE__1 MAX_DIV/PIT_TICK_RATE | ||
41 | #define PCSP_MAX_RATE__1 MIN_DIV/PIT_TICK_RATE | ||
42 | #define PCSP_MAX_PERIOD_NS (1000000000ULL * PCSP_MIN_RATE__1) | ||
43 | #define PCSP_MIN_PERIOD_NS (1000000000ULL * PCSP_MAX_RATE__1) | ||
44 | #define PCSP_CALC_NS(div) ({ \ | ||
45 | u64 __val = 1000000000ULL * (div); \ | ||
46 | do_div(__val, PIT_TICK_RATE); \ | ||
47 | __val; \ | ||
48 | }) | ||
49 | #define PCSP_PERIOD_NS() PCSP_CALC_NS(CUR_DIV()) | ||
50 | |||
51 | #define PCSP_MAX_PERIOD_SIZE (64*1024) | ||
52 | #define PCSP_MAX_PERIODS 512 | ||
53 | #define PCSP_BUFFER_SIZE (128*1024) | ||
54 | |||
55 | struct snd_pcsp { | ||
56 | struct snd_card *card; | ||
57 | struct snd_pcm *pcm; | ||
58 | struct input_dev *input_dev; | ||
59 | struct hrtimer timer; | ||
60 | unsigned short port, irq, dma; | ||
61 | spinlock_t substream_lock; | ||
62 | struct snd_pcm_substream *playback_substream; | ||
63 | size_t playback_ptr; | ||
64 | size_t period_ptr; | ||
65 | atomic_t timer_active; | ||
66 | int thalf; | ||
67 | u64 ns_rem; | ||
68 | unsigned char val61; | ||
69 | int enable; | ||
70 | int max_treble; | ||
71 | int treble; | ||
72 | int pcspkr; | ||
73 | }; | ||
74 | |||
75 | extern struct snd_pcsp pcsp_chip; | ||
76 | |||
77 | extern enum hrtimer_restart pcsp_do_timer(struct hrtimer *handle); | ||
78 | |||
79 | extern int snd_pcsp_new_pcm(struct snd_pcsp *chip); | ||
80 | extern int snd_pcsp_new_mixer(struct snd_pcsp *chip); | ||
81 | |||
82 | #endif | ||