Skip to content

Commit 89f9ace

Browse files
SPadmana95andrestraker
authored andcommitted
drivers: adsd3500: nvidia: L4T_36_4_4: Add ADSD3500 I2C driver and device tree support for L4T 36.4.4
ADSD3500 I2C camera driver source file and corresponding device tree source (DTS) entries for NVIDIA Jetson platforms running Linux for Tegra (L4T) release 36.4.4. The driver provides sensor initialization, streaming control, and basic V4L2 integration. Signed-off-by: Sivasubramaniyan-Padmanaban_adi <[email protected]>
1 parent e1864eb commit 89f9ace

7 files changed

+7255
-0
lines changed
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
From 6eaf23f40338d4ff356a1e1ae949329c4eb1195c Mon Sep 17 00:00:00 2001
2+
From: Bogdan Togorean <[email protected]>
3+
Date: Fri, 20 Jan 2023 11:26:59 +0200
4+
Subject: [PATCH 1/5] drivers: media: platform: tegra: camera: vi: Add Embedded
5+
Header support
6+
7+
Signed-off-by: Bogdan Togorean <[email protected]>
8+
---
9+
.../media/platform/tegra/camera/vi/channel.c | 31 +++++++++++++++++--
10+
.../media/platform/tegra/camera/vi/vi5_fops.c | 4 ++-
11+
2 files changed, 32 insertions(+), 3 deletions(-)
12+
13+
diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c
14+
index 91f8d5f8..3b307bf1 100644
15+
--- a/drivers/media/platform/tegra/camera/vi/channel.c
16+
+++ b/drivers/media/platform/tegra/camera/vi/channel.c
17+
@@ -247,6 +247,33 @@ static void tegra_channel_set_interlace_mode(struct tegra_channel *chan)
18+
}
19+
}
20+
21+
+static int tegra_channel_get_embedded_data_height(struct tegra_channel *chan)
22+
+{
23+
+ struct v4l2_subdev *sd = NULL;
24+
+ struct camera_common_data *s_data = NULL;
25+
+ struct device_node *node = NULL;
26+
+ struct sensor_mode_properties *s_mode = NULL;
27+
+ int emb_meta_height = 0;
28+
+
29+
+ if (chan->subdev_on_csi) {
30+
+ sd = chan->subdev_on_csi;
31+
+ s_data = to_camera_common_data(sd->dev);
32+
+ node = sd->dev->of_node;
33+
+ }
34+
+
35+
+ if (s_data != NULL && node != NULL) {
36+
+ int idx = s_data->mode_prop_idx;
37+
+
38+
+ if (idx < s_data->sensor_props.num_modes) {
39+
+ s_mode = &s_data->sensor_props.sensor_modes[idx];
40+
+ emb_meta_height = s_mode->image_properties.\
41+
+ embedded_metadata_height;
42+
+ }
43+
+ }
44+
+
45+
+ return emb_meta_height;
46+
+}
47+
+
48+
static void tegra_channel_update_format(struct tegra_channel *chan,
49+
u32 width, u32 height, u32 fourcc,
50+
const struct tegra_frac *bpp,
51+
@@ -277,8 +304,8 @@ static void tegra_channel_update_format(struct tegra_channel *chan,
52+
&chan->format.bytesperline);
53+
54+
/* Calculate the sizeimage per plane */
55+
- chan->format.sizeimage = get_aligned_buffer_size(chan,
56+
- chan->format.bytesperline, chan->format.height);
57+
+ chan->format.sizeimage = get_aligned_buffer_size(chan, chan->format.bytesperline,
58+
+ chan->format.height + tegra_channel_get_embedded_data_height(chan));
59+
60+
tegra_channel_set_interlace_mode(chan);
61+
/* Double the size of allocated buffer for interlaced sensor modes */
62+
diff --git a/drivers/media/platform/tegra/camera/vi/vi5_fops.c b/drivers/media/platform/tegra/camera/vi/vi5_fops.c
63+
index 7b16dcaf..a20558fa 100644
64+
--- a/drivers/media/platform/tegra/camera/vi/vi5_fops.c
65+
+++ b/drivers/media/platform/tegra/camera/vi/vi5_fops.c
66+
@@ -414,7 +414,7 @@ static void vi5_setup_surface(struct tegra_channel *chan,
67+
desc->ch_cfg.frame.embed_y = chan->embedded_data_height;
68+
69+
desc_memoryinfo->surface[VI_ATOMP_SURFACE_EMBEDDED].base_address
70+
- = chan->emb_buf;
71+
+ = offset + (chan->format.bytesperline * height);
72+
desc_memoryinfo->surface[VI_ATOMP_SURFACE_EMBEDDED].size
73+
= desc->ch_cfg.frame.embed_x * desc->ch_cfg.frame.embed_y;
74+
75+
@@ -865,6 +865,7 @@ static int vi5_channel_start_streaming(struct vb2_queue *vq, u32 count)
76+
BPP_MEM, PAGE_SIZE);
77+
}
78+
}
79+
+#if 0
80+
/* Allocate buffer for Embedded Data if need to*/
81+
if (emb_buf_size > chan->emb_buf_size) {
82+
struct device *vi_unit_dev;
83+
@@ -897,6 +898,7 @@ static int vi5_channel_start_streaming(struct vb2_queue *vq, u32 count)
84+
}
85+
chan->emb_buf_size = emb_buf_size;
86+
}
87+
+#endif
88+
}
89+
ret = tegra_channel_capture_setup(chan, vi_port);
90+
if (ret < 0)
91+
--
92+
2.34.1
93+
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
From 6eaf23f40338d4ff356a1e1ae949329c4eb1195c Mon Sep 17 00:00:00 2001
2+
From: Bogdan Togorean <[email protected]>
3+
Date: Fri, 20 Jan 2023 11:26:59 +0200
4+
Subject: [PATCH 1/5] drivers: media: platform: tegra: camera: vi: Add Embedded
5+
Header support
6+
7+
Signed-off-by: Bogdan Togorean <[email protected]>
8+
---
9+
.../media/platform/tegra/camera/vi/channel.c | 31 +++++++++++++++++--
10+
.../media/platform/tegra/camera/vi/vi5_fops.c | 4 ++-
11+
2 files changed, 32 insertions(+), 3 deletions(-)
12+
13+
diff --git a/drivers/media/platform/tegra/camera/vi/channel.c b/drivers/media/platform/tegra/camera/vi/channel.c
14+
index 91f8d5f8..3b307bf1 100644
15+
--- a/drivers/media/platform/tegra/camera/vi/channel.c
16+
+++ b/drivers/media/platform/tegra/camera/vi/channel.c
17+
@@ -247,6 +247,33 @@ static void tegra_channel_set_interlace_mode(struct tegra_channel *chan)
18+
}
19+
}
20+
21+
+static int tegra_channel_get_embedded_data_height(struct tegra_channel *chan)
22+
+{
23+
+ struct v4l2_subdev *sd = NULL;
24+
+ struct camera_common_data *s_data = NULL;
25+
+ struct device_node *node = NULL;
26+
+ struct sensor_mode_properties *s_mode = NULL;
27+
+ int emb_meta_height = 0;
28+
+
29+
+ if (chan->subdev_on_csi) {
30+
+ sd = chan->subdev_on_csi;
31+
+ s_data = to_camera_common_data(sd->dev);
32+
+ node = sd->dev->of_node;
33+
+ }
34+
+
35+
+ if (s_data != NULL && node != NULL) {
36+
+ int idx = s_data->mode_prop_idx;
37+
+
38+
+ if (idx < s_data->sensor_props.num_modes) {
39+
+ s_mode = &s_data->sensor_props.sensor_modes[idx];
40+
+ emb_meta_height = s_mode->image_properties.\
41+
+ embedded_metadata_height;
42+
+ }
43+
+ }
44+
+
45+
+ return emb_meta_height;
46+
+}
47+
+
48+
static void tegra_channel_update_format(struct tegra_channel *chan,
49+
u32 width, u32 height, u32 fourcc,
50+
const struct tegra_frac *bpp,
51+
@@ -277,8 +304,8 @@ static void tegra_channel_update_format(struct tegra_channel *chan,
52+
&chan->format.bytesperline);
53+
54+
/* Calculate the sizeimage per plane */
55+
- chan->format.sizeimage = get_aligned_buffer_size(chan,
56+
- chan->format.bytesperline, chan->format.height);
57+
+ chan->format.sizeimage = get_aligned_buffer_size(chan, chan->format.bytesperline,
58+
+ chan->format.height + tegra_channel_get_embedded_data_height(chan));
59+
60+
tegra_channel_set_interlace_mode(chan);
61+
/* Double the size of allocated buffer for interlaced sensor modes */
62+
diff --git a/drivers/media/platform/tegra/camera/vi/vi5_fops.c b/drivers/media/platform/tegra/camera/vi/vi5_fops.c
63+
index 7b16dcaf..a20558fa 100644
64+
--- a/drivers/media/platform/tegra/camera/vi/vi5_fops.c
65+
+++ b/drivers/media/platform/tegra/camera/vi/vi5_fops.c
66+
@@ -414,7 +414,7 @@ static void vi5_setup_surface(struct tegra_channel *chan,
67+
desc->ch_cfg.frame.embed_y = chan->embedded_data_height;
68+
69+
desc_memoryinfo->surface[VI_ATOMP_SURFACE_EMBEDDED].base_address
70+
- = chan->emb_buf;
71+
+ = offset + (chan->format.bytesperline * height);
72+
desc_memoryinfo->surface[VI_ATOMP_SURFACE_EMBEDDED].size
73+
= desc->ch_cfg.frame.embed_x * desc->ch_cfg.frame.embed_y;
74+
75+
@@ -865,6 +865,7 @@ static int vi5_channel_start_streaming(struct vb2_queue *vq, u32 count)
76+
BPP_MEM, PAGE_SIZE);
77+
}
78+
}
79+
+#if 0
80+
/* Allocate buffer for Embedded Data if need to*/
81+
if (emb_buf_size > chan->emb_buf_size) {
82+
struct device *vi_unit_dev;
83+
@@ -897,6 +898,7 @@ static int vi5_channel_start_streaming(struct vb2_queue *vq, u32 count)
84+
}
85+
chan->emb_buf_size = emb_buf_size;
86+
}
87+
+#endif
88+
}
89+
ret = tegra_channel_capture_setup(chan, vi_port);
90+
if (ret < 0)
91+
--
92+
2.34.1
93+
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#ifndef __ADSD3500_I2C_TABLES__
2+
#define __ADSD3500_I2C_TABLES__
3+
4+
enum {
5+
ADSD3500_MODE_512x512_30FPS,
6+
ADSD3500_MODE_1024x512_30FPS,
7+
ADSD3500_MODE_1024x4096_30FPS,
8+
ADSD3500_MODE_1536x512_30FPS,
9+
ADSD3500_MODE_1792x512_30FPS,
10+
ADSD3500_MODE_2048x512_30FPS,
11+
ADSD3500_MODE_2048x2048_30FPS,
12+
ADSD3500_MODE_2304x512_30FPS,
13+
ADSD3500_MODE_2560x512_30FPS,
14+
ADSD3500_MODE_512x640_30FPS,
15+
ADSD3500_MODE_1024x640_30FPS,
16+
ADSD3500_MODE_1536x640_30FPS,
17+
ADSD3500_MODE_2048x640_30FPS,
18+
ADSD3500_MODE_2560x640_30FPS,
19+
ADSD3500_MODE_256x320_30FPS,
20+
ADSD3500_MODE_512x320_30FPS,
21+
ADSD3500_MODE_768x320_30FPS,
22+
ADSD3500_MODE_1024x320_30FPS,
23+
ADSD3500_MODE_1280x320_30FPS,
24+
ADSD3500_MODE_2048x3328_30FPS,
25+
ADSD3500_MODE_1024x1664_30FPS,
26+
ADSD3500_MODE_1024x2080_30FPS,
27+
ADSD3500_MODE_512x1040_30FPS,
28+
ADSD3500_MODE_2048x2560_30FPS,
29+
ADSD3500_MODE_1024x1280_30FPS,
30+
ADSD3500_MODE_1024x1600_30FPS,
31+
ADSD3500_MODE_512x800_30FPS,
32+
ADSD3500_MODE_2048x4096_30FPS,
33+
ADSD3500_MODE_1024x2048_30FPS,
34+
ADSD3500_MODE_1024x2560_30FPS,
35+
ADSD3500_MODE_512x1280_30FPS,
36+
ADSD3500_MODE_2048x3072_30FPS,
37+
ADSD3500_MODE_1024x1536_30FPS,
38+
ADSD3500_MODE_1024x1920_30FPS,
39+
ADSD3500_MODE_512x960_30FPS,
40+
ADSD3500_MODE_3584x3072_30FPS,
41+
ADSD3500_MODE_1792x1536_30FPS,
42+
ADSD3500_MODE_1792x1920_30FPS,
43+
ADSD3500_MODE_896x960_30FPS,
44+
ADSD3500_MODE_3584x2048_30FPS,
45+
ADSD3500_MODE_1792x1024_30FPS,
46+
ADSD3500_MODE_1792x1280_30FPS,
47+
ADSD3500_MODE_896x640_30FPS,
48+
ADSD3500_MODE_4096x3072_30FPS,
49+
ADSD3500_MODE_2048x1536_30FPS,
50+
ADSD3500_MODE_2048x1920_30FPS,
51+
ADSD3500_MODE_1024x960_30FPS,
52+
ADSD3500_MODE_2048x6144_30FPS,
53+
ADSD3500_MODE_3072x3072_30FPS,
54+
ADSD3500_MODE_3072x3840_30FPS,
55+
ADSD3500_MODE_512x1920_30FPS,
56+
ADSD3500_MODE_1536x1920_30FPS,
57+
ADSD3500_MODE_2048x4608_30FPS,
58+
ADSD3500_MODE_1024x2304_30FPS,
59+
ADSD3500_MODE_1024x2880_30FPS,
60+
ADSD3500_MODE_512x1440_30FPS,
61+
ADSD3500_MODE_1024x1024_30FPS,
62+
ADSD3500_MODE_1024x3072_30FPS,
63+
ADSD3500_MODE_2048x5376_30FPS,
64+
ADSD3500_MODE_2048x3584_30FPS,
65+
};
66+
67+
static const int adsd3500_30fps[] = {
68+
30,
69+
};
70+
71+
/*
72+
* WARNING: frmfmt ordering need to match mode definition in
73+
* device tree!
74+
*/
75+
static const struct camera_common_frmfmt adsd3500_frmfmt[] = {
76+
{{512, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x512_30FPS},
77+
{{1024, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x512_30FPS},
78+
{{1024, 4096}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x4096_30FPS},
79+
{{1536, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1536x512_30FPS},
80+
{{1792, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1792x512_30FPS},
81+
{{2048, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x512_30FPS},
82+
{{2048, 2048}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x2048_30FPS},
83+
{{2304, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2304x512_30FPS},
84+
{{2560, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2560x512_30FPS},
85+
{{512, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x640_30FPS},
86+
{{1024, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x640_30FPS},
87+
{{1536, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1536x640_30FPS},
88+
{{2048, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x640_30FPS},
89+
{{2560, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2560x640_30FPS},
90+
{{256, 320}, adsd3500_30fps, 1, 0, ADSD3500_MODE_256x320_30FPS},
91+
{{512, 320}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x320_30FPS},
92+
{{768, 320}, adsd3500_30fps, 1, 0, ADSD3500_MODE_768x320_30FPS},
93+
{{1024, 320}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x320_30FPS},
94+
{{1280, 320}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1280x320_30FPS},
95+
{{2048, 3328}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x3328_30FPS},
96+
{{1024, 1664}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1664_30FPS},
97+
{{1024, 2080}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x2080_30FPS},
98+
{{512, 1040}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x1040_30FPS},
99+
{{2048, 2560}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x2560_30FPS},
100+
{{1024, 1280}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1280_30FPS},
101+
{{1024, 1600}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1600_30FPS},
102+
{{512, 800}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x800_30FPS},
103+
{{2048, 4096}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x4096_30FPS},
104+
{{1024, 2048}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x2048_30FPS},
105+
{{1024, 2560}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x2560_30FPS},
106+
{{512, 1280}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x1280_30FPS},
107+
{{2048, 3072}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x3072_30FPS},
108+
{{1024, 1536}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1536_30FPS},
109+
{{1024, 1920}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1920_30FPS},
110+
{{512, 960}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x960_30FPS},
111+
{{3584, 3072}, adsd3500_30fps, 1, 0, ADSD3500_MODE_3584x3072_30FPS},
112+
{{1792, 1536}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1792x1536_30FPS},
113+
{{1792, 1920}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1792x1920_30FPS},
114+
{{896, 960}, adsd3500_30fps, 1, 0, ADSD3500_MODE_896x960_30FPS},
115+
{{3584, 2048}, adsd3500_30fps, 1, 0, ADSD3500_MODE_3584x2048_30FPS},
116+
{{1792, 1024}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1792x1024_30FPS},
117+
{{1792, 1280}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1792x1280_30FPS},
118+
{{896, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_896x640_30FPS},
119+
{{4096, 3072}, adsd3500_30fps, 1, 0, ADSD3500_MODE_4096x3072_30FPS},
120+
{{2048, 1536}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x1536_30FPS},
121+
{{2048, 1920}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x1920_30FPS},
122+
{{1024, 960}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x960_30FPS},
123+
{{2048, 6144}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x6144_30FPS},
124+
{{3072, 3072}, adsd3500_30fps, 1, 0, ADSD3500_MODE_3072x3072_30FPS},
125+
{{3072, 3840}, adsd3500_30fps, 1, 0, ADSD3500_MODE_3072x3840_30FPS},
126+
{{512, 1920}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x1920_30FPS},
127+
{{1536, 1920}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1536x1920_30FPS},
128+
{{2048, 4608}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x4608_30FPS},
129+
{{1024, 2304}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x2304_30FPS},
130+
{{1024, 2880}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x2880_30FPS},
131+
{{512, 1440}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x1440_30FPS},
132+
{{512, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x512_30FPS},
133+
{{512, 640}, adsd3500_30fps, 1, 0, ADSD3500_MODE_512x640_30FPS},
134+
{{2048, 512}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x512_30FPS},
135+
{{1024, 1024}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x1024_30FPS},
136+
{{1024, 3072}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x3072_30FPS},
137+
{{1024, 4096}, adsd3500_30fps, 1, 0, ADSD3500_MODE_1024x4096_30FPS},
138+
{{2048, 5376}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x5376_30FPS},
139+
{{2048, 3584}, adsd3500_30fps, 1, 0, ADSD3500_MODE_2048x3584_30FPS},
140+
/* Add modes with no device tree support after below */
141+
};
142+
143+
#endif /* __ADSD3500_I2C_TABLES__ */

0 commit comments

Comments
 (0)