Linux-libre 5.4.49-gnu
[librecmc/linux-libre.git] / drivers / staging / vc04_services / bcm2835-audio / bcm2835.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 /* Copyright 2011 Broadcom Corporation.  All rights reserved. */
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
17 enum {
18         CTRL_VOL_MUTE,
19         CTRL_VOL_UNMUTE
20 };
21
22 /* macros for alsa2chip and chip2alsa, instead of functions */
23
24 // convert alsa to chip volume (defined as macro rather than function call)
25 #define alsa2chip(vol) (uint)(-(((vol) << 8) / 100))
26
27 // convert chip to alsa volume
28 #define chip2alsa(vol) -(((vol) * 100) >> 8)
29
30 #define CHIP_MIN_VOLUME         26214 /* minimum level aka mute */
31
32 /* Some constants for values .. */
33 enum snd_bcm2835_route {
34         AUDIO_DEST_AUTO = 0,
35         AUDIO_DEST_HEADPHONES = 1,
36         AUDIO_DEST_HDMI = 2,
37         AUDIO_DEST_MAX,
38 };
39
40 enum snd_bcm2835_ctrl {
41         PCM_PLAYBACK_VOLUME,
42         PCM_PLAYBACK_MUTE,
43         PCM_PLAYBACK_DEVICE,
44 };
45
46 struct bcm2835_vchi_ctx {
47         VCHI_INSTANCE_T vchi_instance;
48 };
49
50 /* definition of the chip-specific record */
51 struct 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
69 struct 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
86 int snd_bcm2835_new_ctl(struct bcm2835_chip *chip);
87 int 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
91 int snd_bcm2835_new_hdmi_ctl(struct bcm2835_chip *chip);
92 int snd_bcm2835_new_headphones_ctl(struct bcm2835_chip *chip);
93
94 int bcm2835_new_vchi_ctx(struct device *dev, struct bcm2835_vchi_ctx *vchi_ctx);
95 void bcm2835_free_vchi_ctx(struct bcm2835_vchi_ctx *vchi_ctx);
96
97 int bcm2835_audio_open(struct bcm2835_alsa_stream *alsa_stream);
98 int bcm2835_audio_close(struct bcm2835_alsa_stream *alsa_stream);
99 int bcm2835_audio_set_params(struct bcm2835_alsa_stream *alsa_stream,
100                              unsigned int channels, unsigned int samplerate,
101                              unsigned int bps);
102 int bcm2835_audio_start(struct bcm2835_alsa_stream *alsa_stream);
103 int bcm2835_audio_stop(struct bcm2835_alsa_stream *alsa_stream);
104 int bcm2835_audio_drain(struct bcm2835_alsa_stream *alsa_stream);
105 int bcm2835_audio_set_ctls(struct bcm2835_alsa_stream *alsa_stream);
106 int bcm2835_audio_write(struct bcm2835_alsa_stream *alsa_stream,
107                         unsigned int count,
108                         void *src);
109 void bcm2835_playback_fifo(struct bcm2835_alsa_stream *alsa_stream,
110                            unsigned int size);
111 unsigned int bcm2835_audio_retrieve_buffers(struct bcm2835_alsa_stream *alsa_stream);
112
113 #endif /* __SOUND_ARM_BCM2835_H */