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