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