1
2
3
4#ifndef __SOUND_ARM_BCM2835_H
5#define __SOUND_ARM_BCM2835_H
6
7#include <linux/device.h>
8#include <linux/wait.h>
9#include <sound/core.h>
10#include <sound/pcm.h>
11#include <sound/pcm-indirect.h>
12#include "interface/vchi/vchi.h"
13
14#define MAX_SUBSTREAMS (8)
15#define AVAIL_SUBSTREAMS_MASK (0xff)
16
17enum {
18 CTRL_VOL_MUTE,
19 CTRL_VOL_UNMUTE
20};
21
22
23
24
25#define alsa2chip(vol) (uint)(-(((vol) << 8) / 100))
26
27
28#define chip2alsa(vol) -(((vol) * 100) >> 8)
29
30#define CHIP_MIN_VOLUME 26214
31
32
33enum snd_bcm2835_route {
34 AUDIO_DEST_AUTO = 0,
35 AUDIO_DEST_HEADPHONES = 1,
36 AUDIO_DEST_HDMI = 2,
37 AUDIO_DEST_MAX,
38};
39
40enum snd_bcm2835_ctrl {
41 PCM_PLAYBACK_VOLUME,
42 PCM_PLAYBACK_MUTE,
43 PCM_PLAYBACK_DEVICE,
44};
45
46struct bcm2835_vchi_ctx {
47 VCHI_INSTANCE_T vchi_instance;
48};
49
50
51struct bcm2835_chip {
52 struct snd_card *card;
53 struct snd_pcm *pcm;
54 struct snd_pcm *pcm_spdif;
55 struct device *dev;
56 struct bcm2835_alsa_stream *alsa_stream[MAX_SUBSTREAMS];
57
58 int volume;
59 int dest;
60 int mute;
61
62 unsigned int opened;
63 unsigned int spdif_status;
64 struct mutex audio_mutex;
65
66 struct bcm2835_vchi_ctx *vchi_ctx;
67};
68
69struct bcm2835_alsa_stream {
70 struct bcm2835_chip *chip;
71 struct snd_pcm_substream *substream;
72 struct snd_pcm_indirect pcm_indirect;
73
74 int draining;
75
76 atomic_t pos;
77 unsigned int period_offset;
78 unsigned int buffer_size;
79 unsigned int period_size;
80 ktime_t interpolate_start;
81
82 struct bcm2835_audio_instance *instance;
83 int idx;
84};
85
86int snd_bcm2835_new_ctl(struct bcm2835_chip *chip);
87int snd_bcm2835_new_pcm(struct bcm2835_chip *chip, const char *name,
88 int idx, enum snd_bcm2835_route route,
89 u32 numchannels, bool spdif);
90
91int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip);
92int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip);
93
94int bcm2835_new_vchi_ctx(struct device *dev, struct bcm2835_vchi_ctx *vchi_ctx);
95void bcm2835_free_vchi_ctx(struct bcm2835_vchi_ctx *vchi_ctx);
96
97int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream);
98int bcm2835_audio_close(struct bcm2835_alsa_stream *alsa_stream);
99int bcm2835_audio_set_params(struct bcm2835_alsa_stream *alsa_stream,
100 unsigned int channels, unsigned int samplerate,
101 unsigned int bps);
102int bcm2835_audio_start(struct bcm2835_alsa_stream *alsa_stream);
103int bcm2835_audio_stop(struct bcm2835_alsa_stream *alsa_stream);
104int bcm2835_audio_drain(struct bcm2835_alsa_stream *alsa_stream);
105int bcm2835_audio_set_ctls(struct bcm2835_alsa_stream *alsa_stream);
106int bcm2835_audio_write(struct bcm2835_alsa_stream *alsa_stream,
107 unsigned int count,
108 void *src);
109void bcm2835_playback_fifo(struct bcm2835_alsa_stream *alsa_stream,
110 unsigned int size);
111unsigned int bcm2835_audio_retrieve_buffers(struct bcm2835_alsa_stream *alsa_stream);
112
113#endif
114