/* * v4l2-mc.h - Media Controller V4L2 types and prototypes * * Copyright (C) 2016 Mauro Carvalho Chehab * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ #ifndef _V4L2_MC_H #define _V4L2_MC_H #include /** * enum tuner_pad_index - tuner pad index for MEDIA_ENT_F_TUNER * * @TUNER_PAD_RF_INPUT: Radiofrequency (RF) sink pad, usually linked to a * RF connector entity. * @TUNER_PAD_OUTPUT: Tuner video output source pad. Contains the video * chrominance and luminance or the hole bandwidth * of the signal converted to an Intermediate Frequency * (IF) or to baseband (on zero-IF tuners). * @TUNER_PAD_AUD_OUT: Tuner audio output source pad. Tuners used to decode * analog TV signals have an extra pad for audio output. * Old tuners use an analog stage with a saw filter for * the audio IF frequency. The output of the pad is, in * this case, the audio IF, with should be decoded either * by the bridge chipset (that's the case of cx2388x * chipsets) or may require an external IF sound * processor, like msp34xx. On modern silicon tuners, * the audio IF decoder is usually incorporated at the * tuner. On such case, the output of this pad is an * audio sampled data. * @TUNER_NUM_PADS: Number of pads of the tuner. */ enum tuner_pad_index { TUNER_PAD_RF_INPUT, TUNER_PAD_OUTPUT, TUNER_PAD_AUD_OUT, TUNER_NUM_PADS }; /** * enum if_vid_dec_index - video IF-PLL pad index for * MEDIA_ENT_F_IF_VID_DECODER * * @IF_VID_DEC_PAD_IF_INPUT: video Intermediate Frequency (IF) sink pad * @IF_VID_DEC_PAD_OUT: IF-PLL video output source pad. Contains the * video chrominance and luminance IF signals. * @IF_VID_DEC_PAD_NUM_PADS: Number of pads of the video IF-PLL. */ enum if_vid_dec_pad_index { IF_VID_DEC_PAD_IF_INPUT, IF_VID_DEC_PAD_OUT, IF_VID_DEC_PAD_NUM_PADS }; /** * enum if_aud_dec_index - audio/sound IF-PLL pad index for * MEDIA_ENT_F_IF_AUD_DECODER * * @IF_AUD_DEC_PAD_IF_INPUT: audio Intermediate Frequency (IF) sink pad * @IF_AUD_DEC_PAD_OUT: IF-PLL audio output source pad. Contains the * audio sampled stream data, usually connected * to the bridge bus via an Inter-IC Sound (I2S) * bus. * @IF_AUD_DEC_PAD_NUM_PADS: Number of pads of the audio IF-PLL. */ enum if_aud_dec_pad_index { IF_AUD_DEC_PAD_IF_INPUT, IF_AUD_DEC_PAD_OUT, IF_AUD_DEC_PAD_NUM_PADS }; /** * enum demod_pad_index - analog TV pad index for MEDIA_ENT_F_ATV_DECODER * * @DEMOD_PAD_IF_INPUT: IF input sink pad. * @DEMOD_PAD_VID_OUT: Video output source pad. * @DEMOD_PAD_VBI_OUT: Vertical Blank Interface (VBI) output source pad. * @DEMOD_NUM_PADS: Maximum number of output pads. */ enum demod_pad_index { DEMOD_PAD_IF_INPUT, DEMOD_PAD_VID_OUT, DEMOD_PAD_VBI_OUT, DEMOD_NUM_PADS }; /* We don't need to include pci.h or usb.h here */ struct pci_dev; struct usb_device; #ifdef CONFIG_MEDIA_CONTROLLER /** * v4l2_mc_create_media_graph() - create Media Controller links at the graph. * * @mdev: pointer to the &media_device struct. * * Add links between the entities commonly found on PC customer's hardware at * the V4L2 side: camera sensors, audio and video PLL-IF decoders, tuners, * analog TV decoder and I/O entities (video, VBI and Software Defined Radio). * NOTE: webcams are modelled on a very simple way: the sensor is * connected directly to the I/O entity. All dirty details, like * scaler and crop HW are hidden. While such mapping is enough for v4l2 * interface centric PC-consumer's hardware, V4L2 subdev centric camera * hardware should not use this routine, as it will not build the right graph. */ int v4l2_mc_create_media_graph(struct media_device *mdev); /** * v4l2_mc_pci_media_device_init() - create and initialize a * struct &media_device from a PCI device. * * @pci_dev: pointer to struct pci_dev * @name: media device name. If %NULL, the routine will use the default * name for the pci device, given by pci_name() macro. */ struct media_device *v4l2_mc_pci_media_device_init(struct pci_dev *pci_dev, const char *name); /** * __v4l2_mc_usb_media_device_init() - create and initialize a * struct &media_device from a PCI device. * * @udev: pointer to struct usb_device * @board_name: media device name. If %NULL, the routine will use the usb * product name, if available. * @driver_name: name of the driver. if %NULL, the routine will use the name * given by udev->dev->driver->name, with is usually the wrong * thing to do. * * NOTE: It is better to call v4l2_mc_usb_media_device_init() instead, as * such macro fills driver_name with %KBUILD_MODNAME. */ struct media_device *__v4l2_mc_usb_media_device_init(struct usb_device *udev, const char *board_name, const char *driver_name); #else static inline int v4l2_mc_create_media_graph(struct media_device *mdev) { return 0; } static inline struct media_device *v4l2_mc_pci_media_device_init(struct pci_dev *pci_dev, char *name) { return NULL; } static inline struct media_device *__v4l2_mc_usb_media_device_init(struct usb_device *udev, char *board_name, char *driver_name) { return NULL; } #endif #define v4l2_mc_usb_media_device_init(udev, name) \ __v4l2_mc_usb_media_device_init(udev, name, KBUILD_MODNAME) #endif