kernel: 5.15: x86-64: enable CONFIG_SLS
[openwrt/openwrt.git] / target / linux / bcm27xx / patches-5.15 / 950-0419-media-v4l2-subdev-add-subdev-wide-state-struct.patch
1 From c284f9ae98f0c853d93fb7fd3a41e457496fba41 Mon Sep 17 00:00:00 2001
2 From: Dom Cobley <popcornmix@gmail.com>
3 Date: Thu, 15 Jul 2021 15:55:22 +0100
4 Subject: [PATCH] media: v4l2-subdev: add subdev-wide state struct
5
6 Signed-off-by: Dom Cobley <popcornmix@gmail.com>
7 ---
8 drivers/media/i2c/imx290.c | 9 +++---
9 drivers/media/i2c/imx477.c | 30 ++++++++++---------
10 drivers/media/i2c/irs1125.c | 8 ++---
11 drivers/media/i2c/ov9281.c | 25 +++++++++-------
12 .../media/platform/bcm2835/bcm2835-unicam.c | 18 +++++------
13 .../platform/rockchip/rkisp1/rkisp1-isp.c | 18 +++++++++++
14 .../platform/rockchip/rkisp1/rkisp1-resizer.c | 18 +++++++++++
15 .../bcm2835-isp/bcm2835-v4l2-isp.c | 4 +--
16 8 files changed, 86 insertions(+), 44 deletions(-)
17
18 --- a/drivers/media/i2c/imx290.c
19 +++ b/drivers/media/i2c/imx290.c
20 @@ -988,12 +988,13 @@ static int imx290_write_current_format(s
21 }
22
23 static const struct v4l2_rect *
24 -__imx290_get_pad_crop(struct imx290 *imx290, struct v4l2_subdev_pad_config *cfg,
25 +__imx290_get_pad_crop(struct imx290 *imx290,
26 + struct v4l2_subdev_state *sd_state,
27 unsigned int pad, enum v4l2_subdev_format_whence which)
28 {
29 switch (which) {
30 case V4L2_SUBDEV_FORMAT_TRY:
31 - return v4l2_subdev_get_try_crop(&imx290->sd, cfg, pad);
32 + return v4l2_subdev_get_try_crop(&imx290->sd, sd_state, pad);
33 case V4L2_SUBDEV_FORMAT_ACTIVE:
34 return &imx290->current_mode->crop;
35 }
36 @@ -1002,7 +1003,7 @@ __imx290_get_pad_crop(struct imx290 *imx
37 }
38
39 static int imx290_get_selection(struct v4l2_subdev *sd,
40 - struct v4l2_subdev_pad_config *cfg,
41 + struct v4l2_subdev_state *sd_state,
42 struct v4l2_subdev_selection *sel)
43 {
44 switch (sel->target) {
45 @@ -1010,7 +1011,7 @@ static int imx290_get_selection(struct v
46 struct imx290 *imx290 = to_imx290(sd);
47
48 mutex_lock(&imx290->lock);
49 - sel->r = *__imx290_get_pad_crop(imx290, cfg, sel->pad,
50 + sel->r = *__imx290_get_pad_crop(imx290, sd_state, sel->pad,
51 sel->which);
52 mutex_unlock(&imx290->lock);
53
54 --- a/drivers/media/i2c/imx477.c
55 +++ b/drivers/media/i2c/imx477.c
56 @@ -1254,9 +1254,9 @@ static int imx477_open(struct v4l2_subde
57 {
58 struct imx477 *imx477 = to_imx477(sd);
59 struct v4l2_mbus_framefmt *try_fmt_img =
60 - v4l2_subdev_get_try_format(sd, fh->pad, IMAGE_PAD);
61 + v4l2_subdev_get_try_format(sd, fh->state, IMAGE_PAD);
62 struct v4l2_mbus_framefmt *try_fmt_meta =
63 - v4l2_subdev_get_try_format(sd, fh->pad, METADATA_PAD);
64 + v4l2_subdev_get_try_format(sd, fh->state, METADATA_PAD);
65 struct v4l2_rect *try_crop;
66
67 mutex_lock(&imx477->mutex);
68 @@ -1275,7 +1275,7 @@ static int imx477_open(struct v4l2_subde
69 try_fmt_meta->field = V4L2_FIELD_NONE;
70
71 /* Initialize try_crop */
72 - try_crop = v4l2_subdev_get_try_crop(sd, fh->pad, IMAGE_PAD);
73 + try_crop = v4l2_subdev_get_try_crop(sd, fh->state, IMAGE_PAD);
74 try_crop->left = IMX477_PIXEL_ARRAY_LEFT;
75 try_crop->top = IMX477_PIXEL_ARRAY_TOP;
76 try_crop->width = IMX477_PIXEL_ARRAY_WIDTH;
77 @@ -1403,7 +1403,7 @@ static const struct v4l2_ctrl_ops imx477
78 };
79
80 static int imx477_enum_mbus_code(struct v4l2_subdev *sd,
81 - struct v4l2_subdev_pad_config *cfg,
82 + struct v4l2_subdev_state *sd_state,
83 struct v4l2_subdev_mbus_code_enum *code)
84 {
85 struct imx477 *imx477 = to_imx477(sd);
86 @@ -1428,7 +1428,7 @@ static int imx477_enum_mbus_code(struct
87 }
88
89 static int imx477_enum_frame_size(struct v4l2_subdev *sd,
90 - struct v4l2_subdev_pad_config *cfg,
91 + struct v4l2_subdev_state *sd_state,
92 struct v4l2_subdev_frame_size_enum *fse)
93 {
94 struct imx477 *imx477 = to_imx477(sd);
95 @@ -1494,7 +1494,7 @@ static void imx477_update_metadata_pad_f
96 }
97
98 static int imx477_get_pad_format(struct v4l2_subdev *sd,
99 - struct v4l2_subdev_pad_config *cfg,
100 + struct v4l2_subdev_state *sd_state,
101 struct v4l2_subdev_format *fmt)
102 {
103 struct imx477 *imx477 = to_imx477(sd);
104 @@ -1506,7 +1506,8 @@ static int imx477_get_pad_format(struct
105
106 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
107 struct v4l2_mbus_framefmt *try_fmt =
108 - v4l2_subdev_get_try_format(&imx477->sd, cfg, fmt->pad);
109 + v4l2_subdev_get_try_format(&imx477->sd, sd_state,
110 + fmt->pad);
111 /* update the code which could change due to vflip or hflip: */
112 try_fmt->code = fmt->pad == IMAGE_PAD ?
113 imx477_get_format_code(imx477, try_fmt->code) :
114 @@ -1574,7 +1575,7 @@ static void imx477_set_framing_limits(st
115 }
116
117 static int imx477_set_pad_format(struct v4l2_subdev *sd,
118 - struct v4l2_subdev_pad_config *cfg,
119 + struct v4l2_subdev_state *sd_state,
120 struct v4l2_subdev_format *fmt)
121 {
122 struct v4l2_mbus_framefmt *framefmt;
123 @@ -1603,7 +1604,7 @@ static int imx477_set_pad_format(struct
124 fmt->format.height);
125 imx477_update_image_pad_format(imx477, mode, fmt);
126 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
127 - framefmt = v4l2_subdev_get_try_format(sd, cfg,
128 + framefmt = v4l2_subdev_get_try_format(sd, sd_state,
129 fmt->pad);
130 *framefmt = fmt->format;
131 } else {
132 @@ -1613,7 +1614,7 @@ static int imx477_set_pad_format(struct
133 }
134 } else {
135 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
136 - framefmt = v4l2_subdev_get_try_format(sd, cfg,
137 + framefmt = v4l2_subdev_get_try_format(sd, sd_state,
138 fmt->pad);
139 *framefmt = fmt->format;
140 } else {
141 @@ -1628,12 +1629,13 @@ static int imx477_set_pad_format(struct
142 }
143
144 static const struct v4l2_rect *
145 -__imx477_get_pad_crop(struct imx477 *imx477, struct v4l2_subdev_pad_config *cfg,
146 +__imx477_get_pad_crop(struct imx477 *imx477,
147 + struct v4l2_subdev_state *sd_state,
148 unsigned int pad, enum v4l2_subdev_format_whence which)
149 {
150 switch (which) {
151 case V4L2_SUBDEV_FORMAT_TRY:
152 - return v4l2_subdev_get_try_crop(&imx477->sd, cfg, pad);
153 + return v4l2_subdev_get_try_crop(&imx477->sd, sd_state, pad);
154 case V4L2_SUBDEV_FORMAT_ACTIVE:
155 return &imx477->mode->crop;
156 }
157 @@ -1642,7 +1644,7 @@ __imx477_get_pad_crop(struct imx477 *imx
158 }
159
160 static int imx477_get_selection(struct v4l2_subdev *sd,
161 - struct v4l2_subdev_pad_config *cfg,
162 + struct v4l2_subdev_state *sd_state,
163 struct v4l2_subdev_selection *sel)
164 {
165 switch (sel->target) {
166 @@ -1650,7 +1652,7 @@ static int imx477_get_selection(struct v
167 struct imx477 *imx477 = to_imx477(sd);
168
169 mutex_lock(&imx477->mutex);
170 - sel->r = *__imx477_get_pad_crop(imx477, cfg, sel->pad,
171 + sel->r = *__imx477_get_pad_crop(imx477, sd_state, sel->pad,
172 sel->which);
173 mutex_unlock(&imx477->mutex);
174
175 --- a/drivers/media/i2c/irs1125.c
176 +++ b/drivers/media/i2c/irs1125.c
177 @@ -562,8 +562,8 @@ static const struct v4l2_subdev_video_op
178 };
179
180 static int irs1125_enum_mbus_code(struct v4l2_subdev *sd,
181 - struct v4l2_subdev_pad_config *cfg,
182 - struct v4l2_subdev_mbus_code_enum *code)
183 + struct v4l2_subdev_state *sd_state,
184 + struct v4l2_subdev_mbus_code_enum *code)
185 {
186 if (code->index > 0)
187 return -EINVAL;
188 @@ -574,7 +574,7 @@ static int irs1125_enum_mbus_code(struct
189 }
190
191 static int irs1125_set_get_fmt(struct v4l2_subdev *sd,
192 - struct v4l2_subdev_pad_config *cfg,
193 + struct v4l2_subdev_state *sd_state,
194 struct v4l2_subdev_format *format)
195 {
196 struct v4l2_mbus_framefmt *fmt = &format->format;
197 @@ -930,7 +930,7 @@ static int irs1125_detect(struct v4l2_su
198 static int irs1125_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
199 {
200 struct v4l2_mbus_framefmt *format =
201 - v4l2_subdev_get_try_format(sd, fh->pad, 0);
202 + v4l2_subdev_get_try_format(sd, fh->state, 0);
203
204 format->code = MEDIA_BUS_FMT_Y12_1X12;
205 format->width = IRS1125_WINDOW_WIDTH_DEF;
206 --- a/drivers/media/i2c/ov9281.c
207 +++ b/drivers/media/i2c/ov9281.c
208 @@ -491,7 +491,7 @@ ov9281_find_best_fit(struct v4l2_subdev_
209 }
210
211 static int ov9281_set_fmt(struct v4l2_subdev *sd,
212 - struct v4l2_subdev_pad_config *cfg,
213 + struct v4l2_subdev_state *sd_state,
214 struct v4l2_subdev_format *fmt)
215 {
216 struct ov9281 *ov9281 = to_ov9281(sd);
217 @@ -516,7 +516,7 @@ static int ov9281_set_fmt(struct v4l2_su
218 V4L2_MAP_XFER_FUNC_DEFAULT(fmt->format.colorspace);
219
220 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
221 - *v4l2_subdev_get_try_format(sd, cfg, fmt->pad) = fmt->format;
222 + *v4l2_subdev_get_try_format(sd, sd_state, fmt->pad) = fmt->format;
223 } else {
224 ov9281->cur_mode = mode;
225 ov9281->code = fmt->format.code;
226 @@ -542,7 +542,7 @@ static int ov9281_set_fmt(struct v4l2_su
227 }
228
229 static int ov9281_get_fmt(struct v4l2_subdev *sd,
230 - struct v4l2_subdev_pad_config *cfg,
231 + struct v4l2_subdev_state *sd_state,
232 struct v4l2_subdev_format *fmt)
233 {
234 struct ov9281 *ov9281 = to_ov9281(sd);
235 @@ -550,7 +550,8 @@ static int ov9281_get_fmt(struct v4l2_su
236
237 mutex_lock(&ov9281->mutex);
238 if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
239 - fmt->format = *v4l2_subdev_get_try_format(sd, cfg, fmt->pad);
240 + fmt->format = *v4l2_subdev_get_try_format(sd, sd_state,
241 + fmt->pad);
242 } else {
243 fmt->format.width = mode->width;
244 fmt->format.height = mode->height;
245 @@ -572,7 +573,7 @@ static int ov9281_get_fmt(struct v4l2_su
246 }
247
248 static int ov9281_enum_mbus_code(struct v4l2_subdev *sd,
249 - struct v4l2_subdev_pad_config *cfg,
250 + struct v4l2_subdev_state *sd_state,
251 struct v4l2_subdev_mbus_code_enum *code)
252 {
253 switch (code->index) {
254 @@ -590,7 +591,7 @@ static int ov9281_enum_mbus_code(struct
255 }
256
257 static int ov9281_enum_frame_sizes(struct v4l2_subdev *sd,
258 - struct v4l2_subdev_pad_config *cfg,
259 + struct v4l2_subdev_state *sd_state,
260 struct v4l2_subdev_frame_size_enum *fse)
261 {
262 if (fse->index >= ARRAY_SIZE(supported_modes))
263 @@ -658,12 +659,14 @@ static int ov9281_set_ctrl_vflip(struct
264 }
265
266 static const struct v4l2_rect *
267 -__ov9281_get_pad_crop(struct ov9281 *ov9281, struct v4l2_subdev_pad_config *cfg,
268 +__ov9281_get_pad_crop(struct ov9281 *ov9281,
269 + struct v4l2_subdev_state *sd_state,
270 unsigned int pad, enum v4l2_subdev_format_whence which)
271 {
272 switch (which) {
273 case V4L2_SUBDEV_FORMAT_TRY:
274 - return v4l2_subdev_get_try_crop(&ov9281->subdev, cfg, pad);
275 + return v4l2_subdev_get_try_crop(&ov9281->subdev, sd_state,
276 + pad);
277 case V4L2_SUBDEV_FORMAT_ACTIVE:
278 return &ov9281->cur_mode->crop;
279 }
280 @@ -672,7 +675,7 @@ __ov9281_get_pad_crop(struct ov9281 *ov9
281 }
282
283 static int ov9281_get_selection(struct v4l2_subdev *sd,
284 - struct v4l2_subdev_pad_config *cfg,
285 + struct v4l2_subdev_state *sd_state,
286 struct v4l2_subdev_selection *sel)
287 {
288 switch (sel->target) {
289 @@ -680,7 +683,7 @@ static int ov9281_get_selection(struct v
290 struct ov9281 *ov9281 = to_ov9281(sd);
291
292 mutex_lock(&ov9281->mutex);
293 - sel->r = *__ov9281_get_pad_crop(ov9281, cfg, sel->pad,
294 + sel->r = *__ov9281_get_pad_crop(ov9281, sd_state, sel->pad,
295 sel->which);
296 mutex_unlock(&ov9281->mutex);
297
298 @@ -898,7 +901,7 @@ static int ov9281_open(struct v4l2_subde
299 {
300 struct ov9281 *ov9281 = to_ov9281(sd);
301 struct v4l2_mbus_framefmt *try_fmt =
302 - v4l2_subdev_get_try_format(sd, fh->pad, 0);
303 + v4l2_subdev_get_try_format(sd, fh->state, 0);
304 const struct ov9281_mode *def_mode = &supported_modes[0];
305
306 mutex_lock(&ov9281->mutex);
307 --- a/drivers/media/platform/bcm2835/bcm2835-unicam.c
308 +++ b/drivers/media/platform/bcm2835/bcm2835-unicam.c
309 @@ -444,7 +444,7 @@ struct unicam_device {
310 /* ptr to sub device */
311 struct v4l2_subdev *sensor;
312 /* Pad config for the sensor */
313 - struct v4l2_subdev_pad_config *sensor_config;
314 + struct v4l2_subdev_state *sensor_state;
315
316 enum v4l2_mbus_type bus_type;
317 /*
318 @@ -595,7 +595,7 @@ static int __subdev_get_format(struct un
319 };
320 int ret;
321
322 - ret = v4l2_subdev_call(dev->sensor, pad, get_fmt, dev->sensor_config,
323 + ret = v4l2_subdev_call(dev->sensor, pad, get_fmt, dev->sensor_state,
324 &sd_fmt);
325 if (ret < 0)
326 return ret;
327 @@ -619,7 +619,7 @@ static int __subdev_set_format(struct un
328
329 sd_fmt.format = *fmt;
330
331 - ret = v4l2_subdev_call(dev->sensor, pad, set_fmt, dev->sensor_config,
332 + ret = v4l2_subdev_call(dev->sensor, pad, set_fmt, dev->sensor_state,
333 &sd_fmt);
334 if (ret < 0)
335 return ret;
336 @@ -1095,7 +1095,7 @@ static int unicam_try_fmt_vid_cap(struct
337 */
338 mbus_fmt->field = V4L2_FIELD_NONE;
339
340 - ret = v4l2_subdev_call(dev->sensor, pad, set_fmt, dev->sensor_config,
341 + ret = v4l2_subdev_call(dev->sensor, pad, set_fmt, dev->sensor_state,
342 &sd_fmt);
343 if (ret && ret != -ENOIOCTLCMD && ret != -ENODEV)
344 return ret;
345 @@ -1117,7 +1117,7 @@ static int unicam_try_fmt_vid_cap(struct
346 mbus_fmt->code = fmt->code;
347
348 ret = v4l2_subdev_call(dev->sensor, pad, set_fmt,
349 - dev->sensor_config, &sd_fmt);
350 + dev->sensor_state, &sd_fmt);
351 if (ret && ret != -ENOIOCTLCMD && ret != -ENODEV)
352 return ret;
353
354 @@ -2330,8 +2330,8 @@ static void unicam_release(struct kref *
355 v4l2_ctrl_handler_free(&unicam->ctrl_handler);
356 media_device_cleanup(&unicam->mdev);
357
358 - if (unicam->sensor_config)
359 - v4l2_subdev_free_pad_config(unicam->sensor_config);
360 + if (unicam->sensor_state)
361 + v4l2_subdev_free_state(unicam->sensor_state);
362
363 kfree(unicam);
364 }
365 @@ -2593,8 +2593,8 @@ static int unicam_probe_complete(struct
366
367 unicam->v4l2_dev.notify = unicam_notify;
368
369 - unicam->sensor_config = v4l2_subdev_alloc_pad_config(unicam->sensor);
370 - if (!unicam->sensor_config)
371 + unicam->sensor_state = v4l2_subdev_alloc_state(unicam->sensor);
372 + if (!unicam->sensor_state)
373 return -ENOMEM;
374
375 unicam->sensor_embedded_data = (unicam->sensor->entity.num_pads >= 2);
376 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
377 +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c
378 @@ -214,6 +214,12 @@ rkisp1_isp_get_pad_fmt(struct rkisp1_isp
379 struct v4l2_subdev_state state = {
380 .pads = isp->pad_cfg
381 };
382 + struct v4l2_subdev_state state = {
383 + .pads = &state
384 + };
385 + struct v4l2_subdev_state state = {
386 + .pads = &state
387 + };
388 if (which == V4L2_SUBDEV_FORMAT_TRY)
389 return v4l2_subdev_get_try_format(&isp->sd, sd_state, pad);
390 else
391 @@ -228,6 +234,12 @@ rkisp1_isp_get_pad_crop(struct rkisp1_is
392 struct v4l2_subdev_state state = {
393 .pads = isp->pad_cfg
394 };
395 + struct v4l2_subdev_state state = {
396 + .pads = &state
397 + };
398 + struct v4l2_subdev_state state = {
399 + .pads = &state
400 + };
401 if (which == V4L2_SUBDEV_FORMAT_TRY)
402 return v4l2_subdev_get_try_crop(&isp->sd, sd_state, pad);
403 else
404 @@ -1053,6 +1065,12 @@ int rkisp1_isp_register(struct rkisp1_de
405 struct v4l2_subdev_state state = {
406 .pads = rkisp1->isp.pad_cfg
407 };
408 + struct v4l2_subdev_state state = {
409 + .pads = &state
410 + };
411 + struct v4l2_subdev_state state = {
412 + .pads = &state
413 + };
414 struct rkisp1_isp *isp = &rkisp1->isp;
415 struct media_pad *pads = isp->pads;
416 struct v4l2_subdev *sd = &isp->sd;
417 --- a/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
418 +++ b/drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c
419 @@ -186,6 +186,12 @@ rkisp1_rsz_get_pad_fmt(struct rkisp1_res
420 struct v4l2_subdev_state state = {
421 .pads = rsz->pad_cfg
422 };
423 + struct v4l2_subdev_state state = {
424 + .pads = &state
425 + };
426 + struct v4l2_subdev_state state = {
427 + .pads = &state
428 + };
429 if (which == V4L2_SUBDEV_FORMAT_TRY)
430 return v4l2_subdev_get_try_format(&rsz->sd, sd_state, pad);
431 else
432 @@ -200,6 +206,12 @@ rkisp1_rsz_get_pad_crop(struct rkisp1_re
433 struct v4l2_subdev_state state = {
434 .pads = rsz->pad_cfg
435 };
436 + struct v4l2_subdev_state state = {
437 + .pads = &state
438 + };
439 + struct v4l2_subdev_state state = {
440 + .pads = &state
441 + };
442 if (which == V4L2_SUBDEV_FORMAT_TRY)
443 return v4l2_subdev_get_try_crop(&rsz->sd, sd_state, pad);
444 else
445 @@ -791,6 +803,12 @@ static int rkisp1_rsz_register(struct rk
446 struct v4l2_subdev_state state = {
447 .pads = rsz->pad_cfg
448 };
449 + struct v4l2_subdev_state state = {
450 + .pads = &state
451 + };
452 + struct v4l2_subdev_state state = {
453 + .pads = &state
454 + };
455 static const char * const dev_names[] = {
456 RKISP1_RSZ_MP_DEV_NAME,
457 RKISP1_RSZ_SP_DEV_NAME
458 --- a/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
459 +++ b/drivers/staging/vc04_services/bcm2835-isp/bcm2835-v4l2-isp.c
460 @@ -1463,7 +1463,7 @@ queue_cleanup:
461 }
462
463 /* Unregister one of the /dev/video<N> nodes associated with the ISP. */
464 -static void unregister_node(struct bcm2835_isp_node *node)
465 +static void bcm2835_unregister_node(struct bcm2835_isp_node *node)
466 {
467 struct bcm2835_isp_dev *dev = node_get_dev(node);
468
469 @@ -1666,7 +1666,7 @@ static int bcm2835_isp_remove(struct pla
470 media_controller_unregister(dev);
471
472 for (i = 0; i < BCM2835_ISP_NUM_NODES; i++)
473 - unregister_node(&dev->node[i]);
474 + bcm2835_unregister_node(&dev->node[i]);
475
476 v4l2_device_unregister(&dev->v4l2_dev);
477