summaryrefslogtreecommitdiffstats
path: root/include/media/tegra_camera_platform.h
blob: f58cd845705419d9d35458b66c0969dba93cfd84 (plain) (blame)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
/*
 * drivers/video/tegra/camera/tegra_camera_common.h
 *
 * Copyright (c) 2015-2019, NVIDIA CORPORATION.  All rights reserved.
 *
 * This software is licensed under the terms of the GNU General Public
 * License version 2, as published by the Free Software Foundation, and
 * may be copied, distributed, and modified under those terms.
 *
 * 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 _TEGRA_CAMERA_PLATFORM_H_
#define _TEGRA_CAMERA_PLATFORM_H_

#include <uapi/media/tegra_camera_platform.h>

/* avoid overflows */
#define DEFAULT_PG_CLK_RATE (UINT_MAX - 1)

/**
 * enum tegra_camera_hw_type - camera hw engines
 */
enum tegra_camera_hw_type {
	HWTYPE_NONE = 0,
	HWTYPE_CSI,
	HWTYPE_SLVSEC,
	HWTYPE_VI,
	HWTYPE_ISPA,
	HWTYPE_ISPB,
	HWTYPE_MAX,
};

/**
 * enum tegra_camera_sensor_type - camera sensor types
 */
enum tegra_camera_sensor_type {
	SENSORTYPE_NONE = 0,
	SENSORTYPE_DPHY,
	SENSORTYPE_CPHY,
	SENSORTYPE_SLVSEC,
	SENSORTYPE_VIRTUAL,
	/* HDMI-IN or other inputs */
	SENSORTYPE_OTHER,
	SENSORTYPE_MAX,
};

/**
 * struct tegra_camera_dev_info - camera devices information
 * @priv: a unique identifier assigned during registration
 * @hw_type: type of HW engine as defined by the enum above
 * @bus_width: csi bus width for clock calculation
 * @overhead: hw/ sw overhead considered while calculations
 * @ppc: HW capability, pixels per clock
 * @clk_rate: calculated clk rate for this node
 * @actual_clk_rate: clk rate set by nvhost
 * @bw: calculated bw for this node
 * @use_max: populated by hw engine to decide it's clocking policy
 * @memory_latency: latency allowed for memory freq scaling
 * @pdev: pointer to platform_data
 * @sensor_type: type of sensor as defined by the enum above
 * @pixel_rate: pixel rate coming out of the sensor
 * @pixel_bit_depth: bits per pixel
 * @bpp: bytes per pixel
 * @stream_on: stream enabled on the channel
 * @device_node: list node
 */
struct tegra_camera_dev_info {
	void *priv;
	u32 hw_type;
	u32 bus_width;
	u32 overhead;
	u64 lane_speed;
	u32 lane_num;
	u32 ppc;
	u64 clk_rate;
	u64 pg_clk_rate;
	unsigned long actual_clk_rate;
	u64 bw;
	bool use_max;
	u32 memory_latency;
	struct platform_device *pdev;
	u32 sensor_type;
	u64 pixel_rate;
	u32 pixel_bit_depth;
	u32 bpp;
	bool stream_on;
	struct list_head device_node;
};

int tegra_camera_update_isobw(void);
int tegra_camera_emc_clk_enable(void);
int tegra_camera_emc_clk_disable(void);
int tegra_camera_device_register(struct tegra_camera_dev_info *cdev_info,
					void *priv);
int tegra_camera_device_unregister(void *priv);
int tegra_camera_get_device_list_entry(const u32 hw_type, const void *priv,
		struct tegra_camera_dev_info *cdev_info);
int tegra_camera_get_device_list_stats(u32 *n_sensors, u32 *n_hwtypes);
int tegra_camera_update_clknbw(void *priv, bool stream_on);

#endif