1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * media.h - Media Controller specific ALSA driver code
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * Copyright (c) 2019 Shuah Khan <shuah@kernel.org>
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun */
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun /*
10*4882a593Smuzhiyun * This file adds Media Controller support to the ALSA driver
11*4882a593Smuzhiyun * to use the Media Controller API to share the tuner with DVB
12*4882a593Smuzhiyun * and V4L2 drivers that control the media device.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * The media device is created based on the existing quirks framework.
15*4882a593Smuzhiyun * Using this approach, the media controller API usage can be added for
16*4882a593Smuzhiyun * a specific device.
17*4882a593Smuzhiyun */
18*4882a593Smuzhiyun #ifndef __MEDIA_H
19*4882a593Smuzhiyun
20*4882a593Smuzhiyun #ifdef CONFIG_SND_USB_AUDIO_USE_MEDIA_CONTROLLER
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun #include <linux/media.h>
23*4882a593Smuzhiyun #include <media/media-device.h>
24*4882a593Smuzhiyun #include <media/media-entity.h>
25*4882a593Smuzhiyun #include <media/media-dev-allocator.h>
26*4882a593Smuzhiyun #include <sound/asound.h>
27*4882a593Smuzhiyun
28*4882a593Smuzhiyun struct media_ctl {
29*4882a593Smuzhiyun struct media_device *media_dev;
30*4882a593Smuzhiyun struct media_entity media_entity;
31*4882a593Smuzhiyun struct media_intf_devnode *intf_devnode;
32*4882a593Smuzhiyun struct media_link *intf_link;
33*4882a593Smuzhiyun struct media_pad media_pad;
34*4882a593Smuzhiyun struct media_pipeline media_pipe;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /*
38*4882a593Smuzhiyun * One source pad each for SNDRV_PCM_STREAM_CAPTURE and
39*4882a593Smuzhiyun * SNDRV_PCM_STREAM_PLAYBACK. One for sink pad to link
40*4882a593Smuzhiyun * to AUDIO Source
41*4882a593Smuzhiyun */
42*4882a593Smuzhiyun #define MEDIA_MIXER_PAD_MAX (SNDRV_PCM_STREAM_LAST + 2)
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun struct media_mixer_ctl {
45*4882a593Smuzhiyun struct media_device *media_dev;
46*4882a593Smuzhiyun struct media_entity media_entity;
47*4882a593Smuzhiyun struct media_intf_devnode *intf_devnode;
48*4882a593Smuzhiyun struct media_link *intf_link;
49*4882a593Smuzhiyun struct media_pad media_pad[MEDIA_MIXER_PAD_MAX];
50*4882a593Smuzhiyun struct media_pipeline media_pipe;
51*4882a593Smuzhiyun };
52*4882a593Smuzhiyun
53*4882a593Smuzhiyun int snd_media_device_create(struct snd_usb_audio *chip,
54*4882a593Smuzhiyun struct usb_interface *iface);
55*4882a593Smuzhiyun void snd_media_device_delete(struct snd_usb_audio *chip);
56*4882a593Smuzhiyun int snd_media_stream_init(struct snd_usb_substream *subs, struct snd_pcm *pcm,
57*4882a593Smuzhiyun int stream);
58*4882a593Smuzhiyun void snd_media_stream_delete(struct snd_usb_substream *subs);
59*4882a593Smuzhiyun int snd_media_start_pipeline(struct snd_usb_substream *subs);
60*4882a593Smuzhiyun void snd_media_stop_pipeline(struct snd_usb_substream *subs);
61*4882a593Smuzhiyun #else
snd_media_device_create(struct snd_usb_audio * chip,struct usb_interface * iface)62*4882a593Smuzhiyun static inline int snd_media_device_create(struct snd_usb_audio *chip,
63*4882a593Smuzhiyun struct usb_interface *iface)
64*4882a593Smuzhiyun { return 0; }
snd_media_device_delete(struct snd_usb_audio * chip)65*4882a593Smuzhiyun static inline void snd_media_device_delete(struct snd_usb_audio *chip) { }
snd_media_stream_init(struct snd_usb_substream * subs,struct snd_pcm * pcm,int stream)66*4882a593Smuzhiyun static inline int snd_media_stream_init(struct snd_usb_substream *subs,
67*4882a593Smuzhiyun struct snd_pcm *pcm, int stream)
68*4882a593Smuzhiyun { return 0; }
snd_media_stream_delete(struct snd_usb_substream * subs)69*4882a593Smuzhiyun static inline void snd_media_stream_delete(struct snd_usb_substream *subs) { }
snd_media_start_pipeline(struct snd_usb_substream * subs)70*4882a593Smuzhiyun static inline int snd_media_start_pipeline(struct snd_usb_substream *subs)
71*4882a593Smuzhiyun { return 0; }
snd_media_stop_pipeline(struct snd_usb_substream * subs)72*4882a593Smuzhiyun static inline void snd_media_stop_pipeline(struct snd_usb_substream *subs) { }
73*4882a593Smuzhiyun #endif
74*4882a593Smuzhiyun #endif /* __MEDIA_H */
75