1 /* SPDX-License-Identifier: GPL-2.0+ */ 2 /* 3 * Copyright 2021-2022 Bootlin 4 * Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com> 5 */ 6 7 #ifndef _SUN6I_CSI_BRIDGE_H_ 8 #define _SUN6I_CSI_BRIDGE_H_ 9 10 #include <media/v4l2-device.h> 11 #include <media/v4l2-fwnode.h> 12 13 #define SUN6I_CSI_BRIDGE_NAME "sun6i-csi-bridge" 14 15 enum sun6i_csi_bridge_pad { 16 SUN6I_CSI_BRIDGE_PAD_SINK = 0, 17 SUN6I_CSI_BRIDGE_PAD_SOURCE = 1, 18 SUN6I_CSI_BRIDGE_PAD_COUNT = 2, 19 }; 20 21 struct sun6i_csi_device; 22 23 struct sun6i_csi_bridge_source { 24 struct v4l2_subdev *subdev; 25 struct v4l2_fwnode_endpoint endpoint; 26 bool expected; 27 }; 28 29 struct sun6i_csi_bridge_async_subdev { 30 struct v4l2_async_subdev async_subdev; 31 struct sun6i_csi_bridge_source *source; 32 }; 33 34 struct sun6i_csi_bridge { 35 struct v4l2_subdev subdev; 36 struct v4l2_async_notifier notifier; 37 struct media_pad pads[2]; 38 struct v4l2_mbus_framefmt mbus_format; 39 struct mutex lock; /* Mbus format lock. */ 40 41 struct sun6i_csi_bridge_source source_parallel; 42 }; 43 44 /* Helpers */ 45 46 void sun6i_csi_bridge_dimensions(struct sun6i_csi_device *csi_dev, 47 unsigned int *width, unsigned int *height); 48 void sun6i_csi_bridge_format(struct sun6i_csi_device *csi_dev, 49 u32 *mbus_code, u32 *field); 50 51 /* Bridge */ 52 53 int sun6i_csi_bridge_setup(struct sun6i_csi_device *csi_dev); 54 void sun6i_csi_bridge_cleanup(struct sun6i_csi_device *csi_dev); 55 56 #endif 57