| /* |
| * Copyright 2017 NXP |
| */ |
| /* |
| * The code contained herein is licensed under the GNU General Public |
| * License. You may obtain a copy of the GNU General Public License |
| * Version 2 or later at the following locations: |
| * |
| * http://www.opensource.org/licenses/gpl-license.html |
| * http://www.gnu.org/copyleft/gpl.html |
| */ |
| |
| #ifndef MXC_MEDIA_DEV_H_ |
| #define MXC_MEDIA_DEV_H_ |
| |
| #include <linux/module.h> |
| #include <linux/kernel.h> |
| #include <linux/types.h> |
| #include <linux/errno.h> |
| #include <linux/bug.h> |
| #include <linux/interrupt.h> |
| #include <linux/device.h> |
| #include <linux/platform_device.h> |
| #include <linux/pm_runtime.h> |
| #include <linux/list.h> |
| #include <linux/mfd/syscon.h> |
| #include <linux/io.h> |
| #include <linux/of.h> |
| #include <linux/of_device.h> |
| #include <linux/slab.h> |
| #include <linux/clk.h> |
| #include <media/media-device.h> |
| #include <media/media-entity.h> |
| #include <media/v4l2-subdev.h> |
| #include <media/v4l2-ioctl.h> |
| #include <media/v4l2-mem2mem.h> |
| #include <media/videobuf2-core.h> |
| |
| #include "mxc-mipi-csi2.h" |
| #include "mxc-isi-core.h" |
| #include "mxc-isi-hw.h" |
| #include "hdmi/mxc-hdmi-rx.h" |
| |
| #define MXC_MD_DRIVER_NAME "mxc-md" |
| #define MXC_MAX_SENSORS 3 |
| |
| #define MJPEG_DEC_OF_NODE_NAME "jpegdec" |
| #define MJPEG_ENC_OF_NODE_NAME "jpegenc" |
| |
| /* |
| * The subdevices' group IDs. |
| */ |
| #define GRP_ID_MXC_SENSOR (1 << 8) |
| #define GRP_ID_MXC_ISI (1 << 9) |
| #define GRP_ID_MXC_MIPI_CSI2 (1 << 11) |
| #define GRP_ID_MXC_HDMI_RX (1 << 12) |
| #define GRP_ID_MXC_MJPEG_DEC (1 << 13) |
| #define GRP_ID_MXC_MJPEG_ENC (1 << 14) |
| #define GRP_ID_MXC_PARALLEL_CSI (1 << 15) |
| |
| enum mxc_subdev_index { |
| IDX_SENSOR, |
| IDX_ISI, |
| IDX_MIPI_CSI2, |
| IDX_HDMI_RX, |
| IDX_MJPEG_ENC, |
| IDX_MJPEG_DEC, |
| IDX_PARALLEL_CSI, |
| IDX_MAX, |
| }; |
| |
| struct mxc_sensor_info { |
| int id; |
| struct v4l2_subdev *sd; |
| struct v4l2_async_subdev asd; |
| bool mipi_mode; |
| /* struct mxc_isi_dev *host; */ |
| }; |
| |
| struct mxc_mjpeg_dec{ |
| struct v4l2_device *v4l2_dev; |
| struct v4l2_subdev sd; |
| }; |
| |
| struct mxc_mjpeg_enc{ |
| struct v4l2_device *v4l2_dev; |
| struct v4l2_subdev sd; |
| }; |
| |
| struct mxc_md { |
| struct mxc_isi_dev *mxc_isi[MXC_ISI_MAX_DEVS]; |
| struct mxc_hdmi_rx_dev *hdmi_rx; |
| struct mxc_parallel_csi_dev *pcsidev; |
| struct mxc_mipi_csi2_dev *mipi_csi2[MXC_MIPI_CSI2_MAX_DEVS]; |
| struct mxc_sensor_info sensor[MXC_MAX_SENSORS]; |
| struct mxc_mjpeg_dec *mjpeg_dec; |
| struct mxc_mjpeg_enc *mjpeg_enc; |
| |
| int link_status; |
| int num_sensors; |
| unsigned int nr_isi; |
| bool parallel_csi; |
| |
| struct media_device media_dev; |
| struct v4l2_device v4l2_dev; |
| struct platform_device *pdev; |
| |
| struct v4l2_async_notifier subdev_notifier; |
| struct v4l2_async_subdev *async_subdevs[MXC_MAX_SENSORS]; |
| }; |
| |
| static inline struct mxc_md *notifier_to_mxc_md(struct v4l2_async_notifier *n) |
| { |
| return container_of(n, struct mxc_md, subdev_notifier); |
| }; |
| |
| int mxc_isi_initialize_capture_subdev(struct mxc_isi_dev *mxc_isi); |
| void mxc_isi_unregister_capture_subdev(struct mxc_isi_dev *mxc_isi); |
| int mxc_isi_register_m2m_device(struct mxc_isi_dev *mxc_isi, |
| struct v4l2_device *v4l2_dev); |
| void mxc_sensor_notify(struct v4l2_subdev *sd, unsigned int notification, |
| void *arg); |
| void mxc_isi_unregister_m2m_device(struct mxc_isi_dev *mxc_isi); |
| int mxc_isi_register_driver(void); |
| void mxc_isi_unregister_driver(void); |
| #endif |