90 lines
2.1 KiB
C
90 lines
2.1 KiB
C
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||
|
/*
|
||
|
* Copyright (c) 2011-2018 Magewell Electronics Co., Ltd. (Nanjing)
|
||
|
* Author: Yong Deng <yong.deng@magewell.com>
|
||
|
* Copyright 2021-2022 Bootlin
|
||
|
* Author: Paul Kocialkowski <paul.kocialkowski@bootlin.com>
|
||
|
*/
|
||
|
|
||
|
#ifndef _SUN6I_CAPTURE_H_
|
||
|
#define _SUN6I_CAPTURE_H_
|
||
|
|
||
|
#include <media/v4l2-device.h>
|
||
|
|
||
|
#define SUN6I_CSI_CAPTURE_NAME "sun6i-csi-capture"
|
||
|
|
||
|
#define SUN6I_CSI_CAPTURE_WIDTH_MIN 32
|
||
|
#define SUN6I_CSI_CAPTURE_WIDTH_MAX 4800
|
||
|
#define SUN6I_CSI_CAPTURE_HEIGHT_MIN 32
|
||
|
#define SUN6I_CSI_CAPTURE_HEIGHT_MAX 4800
|
||
|
|
||
|
struct sun6i_csi_device;
|
||
|
|
||
|
struct sun6i_csi_capture_format {
|
||
|
u32 pixelformat;
|
||
|
u8 output_format_field;
|
||
|
u8 output_format_frame;
|
||
|
bool input_yuv_seq_invert;
|
||
|
bool input_format_raw;
|
||
|
u32 hsize_len_factor;
|
||
|
};
|
||
|
|
||
|
struct sun6i_csi_capture_format_match {
|
||
|
u32 pixelformat;
|
||
|
u32 mbus_code;
|
||
|
};
|
||
|
|
||
|
#undef current
|
||
|
struct sun6i_csi_capture_state {
|
||
|
struct list_head queue;
|
||
|
spinlock_t lock; /* Queue and buffers lock. */
|
||
|
|
||
|
struct sun6i_csi_buffer *pending;
|
||
|
struct sun6i_csi_buffer *current;
|
||
|
struct sun6i_csi_buffer *complete;
|
||
|
|
||
|
unsigned int sequence;
|
||
|
bool streaming;
|
||
|
bool setup;
|
||
|
};
|
||
|
|
||
|
struct sun6i_csi_capture {
|
||
|
struct sun6i_csi_capture_state state;
|
||
|
|
||
|
struct video_device video_dev;
|
||
|
struct vb2_queue queue;
|
||
|
struct mutex lock; /* Queue lock. */
|
||
|
struct media_pad pad;
|
||
|
|
||
|
struct v4l2_format format;
|
||
|
};
|
||
|
|
||
|
/* Helpers */
|
||
|
|
||
|
void sun6i_csi_capture_dimensions(struct sun6i_csi_device *csi_dev,
|
||
|
unsigned int *width, unsigned int *height);
|
||
|
void sun6i_csi_capture_format(struct sun6i_csi_device *csi_dev,
|
||
|
u32 *pixelformat, u32 *field);
|
||
|
|
||
|
/* Format */
|
||
|
|
||
|
const
|
||
|
struct sun6i_csi_capture_format *sun6i_csi_capture_format_find(u32 pixelformat);
|
||
|
|
||
|
/* Capture */
|
||
|
|
||
|
void sun6i_csi_capture_configure(struct sun6i_csi_device *csi_dev);
|
||
|
void sun6i_csi_capture_state_update(struct sun6i_csi_device *csi_dev);
|
||
|
|
||
|
/* State */
|
||
|
|
||
|
void sun6i_csi_capture_sync(struct sun6i_csi_device *csi_dev);
|
||
|
void sun6i_csi_capture_frame_done(struct sun6i_csi_device *csi_dev);
|
||
|
|
||
|
/* Capture */
|
||
|
|
||
|
int sun6i_csi_capture_setup(struct sun6i_csi_device *csi_dev);
|
||
|
void sun6i_csi_capture_cleanup(struct sun6i_csi_device *csi_dev);
|
||
|
|
||
|
#endif
|