summaryrefslogtreecommitdiff
path: root/drivers/media/pci/intel/ipu6/ipu6-isys-csi2.h
blob: eba6b29386eaffb220f282b9b617df14ad050510 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* SPDX-License-Identifier: GPL-2.0-only */
/* Copyright (C) 2013--2024 Intel Corporation */

#ifndef IPU6_ISYS_CSI2_H
#define IPU6_ISYS_CSI2_H

#include <linux/container_of.h>

#include "ipu6-isys-subdev.h"
#include "ipu6-isys-video.h"

struct media_entity;
struct v4l2_mbus_frame_desc_entry;

struct ipu6_isys_video;
struct ipu6_isys;
struct ipu6_isys_csi2_pdata;
struct ipu6_isys_stream;

#define NR_OF_CSI2_VC		16
#define INVALID_VC_ID		-1
#define NR_OF_CSI2_SINK_PADS	1
#define CSI2_PAD_SINK		0
#define NR_OF_CSI2_SRC_PADS	8
#define CSI2_PAD_SRC		1
#define NR_OF_CSI2_PADS		(NR_OF_CSI2_SINK_PADS + NR_OF_CSI2_SRC_PADS)

#define CSI2_CSI_RX_DLY_CNT_TERMEN_CLANE_A		0
#define CSI2_CSI_RX_DLY_CNT_TERMEN_CLANE_B		0
#define CSI2_CSI_RX_DLY_CNT_SETTLE_CLANE_A		95
#define CSI2_CSI_RX_DLY_CNT_SETTLE_CLANE_B		-8

#define CSI2_CSI_RX_DLY_CNT_TERMEN_DLANE_A		0
#define CSI2_CSI_RX_DLY_CNT_TERMEN_DLANE_B		0
#define CSI2_CSI_RX_DLY_CNT_SETTLE_DLANE_A		85
#define CSI2_CSI_RX_DLY_CNT_SETTLE_DLANE_B		-2

struct ipu6_isys_csi2 {
	struct ipu6_isys_subdev asd;
	struct ipu6_isys_csi2_pdata *pdata;
	struct ipu6_isys *isys;
	struct ipu6_isys_video av[NR_OF_CSI2_SRC_PADS];

	void __iomem *base;
	u32 receiver_errors;
	unsigned int nlanes;
	unsigned int port;
	unsigned int stream_count;
};

struct ipu6_isys_csi2_timing {
	u32 ctermen;
	u32 csettle;
	u32 dtermen;
	u32 dsettle;
};

struct ipu6_csi2_error {
	const char *error_string;
	bool is_info_only;
};

#define ipu6_isys_subdev_to_csi2(__sd) \
	container_of(__sd, struct ipu6_isys_csi2, asd)

#define to_ipu6_isys_csi2(__asd) container_of(__asd, struct ipu6_isys_csi2, asd)

s64 ipu6_isys_csi2_get_link_freq(struct ipu6_isys_csi2 *csi2);
int ipu6_isys_csi2_init(struct ipu6_isys_csi2 *csi2, struct ipu6_isys *isys,
			void __iomem *base, unsigned int index);
void ipu6_isys_csi2_cleanup(struct ipu6_isys_csi2 *csi2);
void ipu6_isys_csi2_sof_event_by_stream(struct ipu6_isys_stream *stream);
void ipu6_isys_csi2_eof_event_by_stream(struct ipu6_isys_stream *stream);
void ipu6_isys_register_errors(struct ipu6_isys_csi2 *csi2);
void ipu6_isys_csi2_error(struct ipu6_isys_csi2 *csi2);
int ipu6_isys_csi2_get_remote_desc(u32 source_stream,
				   struct ipu6_isys_csi2 *csi2,
				   struct media_entity *source_entity,
				   struct v4l2_mbus_frame_desc_entry *entry);
void ipu6_isys_set_csi2_streams_status(struct ipu6_isys_video *av, bool status);

#endif /* IPU6_ISYS_CSI2_H */