tree:
https://chromium.googlesource.com/chromiumos/third_party/kernel chromeos-4.4
head: a321cfdc9afc13deeb29da992f74141226f914c8
commit: 4aca6a37205e1af1aedd516811fa10ae8aea6b3b [60/216] UPSTREAM: media: staging:
rkisp1: add capture device for statistics
config: nios2-allyesconfig (attached as .config)
compiler: nios2-linux-gcc (GCC) 7.5.0
reproduce (this is a W=1 build):
wget
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O
~/bin/make.cross
chmod +x ~/bin/make.cross
git remote add chrome-os
https://chromium.googlesource.com/chromiumos/third_party/kernel
git fetch --no-tags chrome-os chromeos-4.4
git checkout 4aca6a37205e1af1aedd516811fa10ae8aea6b3b
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-7.5.0 make.cross ARCH=nios2
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp(a)intel.com>
Note: the chrome-os/chromeos-4.4 HEAD a321cfdc9afc13deeb29da992f74141226f914c8 builds
fine.
It only hurts bisectibility.
All error/warnings (new ones prefixed by >>):
In file included from include/linux/poll.h:5:0,
from include/media/v4l2-dev.h:12,
from include/media/v4l2-common.h:29,
from drivers/staging/media/rkisp1/rkisp1-stats.c:8:
include/linux/scatterlist.h: In function 'sg_set_buf':
arch/nios2/include/asm/page.h:90:33: warning: comparison of unsigned expression >= 0
is always true [-Wtype-limits]
# define pfn_valid(pfn) ((pfn) >= ARCH_PFN_OFFSET && \
^
include/linux/compiler.h:182:42: note: in definition of macro 'unlikely'
# define unlikely(x) __builtin_expect(!!(x), 0)
^
include/linux/scatterlist.h:140:2: note: in expansion of macro 'BUG_ON'
BUG_ON(!virt_addr_valid(buf));
^~~~~~
arch/nios2/include/asm/page.h:94:33: note: in expansion of macro 'pfn_valid'
# define virt_addr_valid(vaddr) pfn_valid(PFN_DOWN(virt_to_phys(vaddr)))
^~~~~~~~~
include/linux/scatterlist.h:140:10: note: in expansion of macro
'virt_addr_valid'
BUG_ON(!virt_addr_valid(buf));
^~~~~~~~~~~~~~~
In file included from drivers/staging/media/rkisp1/rkisp1-common.h:14:0,
from drivers/staging/media/rkisp1/rkisp1-stats.c:14:
include/linux/clk.h: At top level:
include/linux/clk.h:199:70: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
static inline int __must_check clk_bulk_prepare(int num_clks, struct clk_bulk_data
*clks)
^~~~~~~~~~~~~
include/linux/clk.h:223:60: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
static inline void clk_bulk_unprepare(int num_clks, struct clk_bulk_data *clks)
^~~~~~~~~~~~~
include/linux/clk.h:528:17: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
struct clk_bulk_data *clks)
^~~~~~~~~~~~~
include/linux/clk.h:539:15: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
struct clk_bulk_data *clks)
^~~~~~~~~~~~~
include/linux/clk.h:546:54: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
static inline void clk_bulk_put(int num_clks, struct clk_bulk_data *clks) {}
^~~~~~~~~~~~~
include/linux/clk.h:555:69: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
static inline int __must_check clk_bulk_enable(int num_clks, struct clk_bulk_data
*clks)
^~~~~~~~~~~~~
include/linux/clk.h:564:16: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
struct clk_bulk_data *clks) {}
^~~~~~~~~~~~~
include/linux/clk.h:624:13: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
struct clk_bulk_data *clks)
^~~~~~~~~~~~~
include/linux/clk.h: In function 'clk_bulk_prepare_enable':
include/linux/clk.h:628:35: warning: passing argument 2 of 'clk_bulk_prepare'
from incompatible pointer type [-Wincompatible-pointer-types]
ret = clk_bulk_prepare(num_clks, clks);
^~~~
include/linux/clk.h:199:32: note: expected 'struct clk_bulk_data *' but
argument is of type 'struct clk_bulk_data *'
static inline int __must_check clk_bulk_prepare(int num_clks, struct clk_bulk_data
*clks)
^~~~~~~~~~~~~~~~
include/linux/clk.h:631:34: warning: passing argument 2 of 'clk_bulk_enable'
from incompatible pointer type [-Wincompatible-pointer-types]
ret = clk_bulk_enable(num_clks, clks);
^~~~
include/linux/clk.h:555:32: note: expected 'struct clk_bulk_data *' but
argument is of type 'struct clk_bulk_data *'
static inline int __must_check clk_bulk_enable(int num_clks, struct clk_bulk_data
*clks)
^~~~~~~~~~~~~~~
include/linux/clk.h:633:32: warning: passing argument 2 of 'clk_bulk_unprepare'
from incompatible pointer type [-Wincompatible-pointer-types]
clk_bulk_unprepare(num_clks, clks);
^~~~
include/linux/clk.h:223:20: note: expected 'struct clk_bulk_data *' but
argument is of type 'struct clk_bulk_data *'
static inline void clk_bulk_unprepare(int num_clks, struct clk_bulk_data *clks)
^~~~~~~~~~~~~~~~~~
include/linux/clk.h: At top level:
include/linux/clk.h:639:19: warning: 'struct clk_bulk_data' declared inside
parameter list will not be visible outside of this definition or declaration
struct clk_bulk_data *clks)
^~~~~~~~~~~~~
include/linux/clk.h: In function 'clk_bulk_disable_unprepare':
include/linux/clk.h:641:29: warning: passing argument 2 of 'clk_bulk_disable'
from incompatible pointer type [-Wincompatible-pointer-types]
clk_bulk_disable(num_clks, clks);
^~~~
include/linux/clk.h:563:20: note: expected 'struct clk_bulk_data *' but
argument is of type 'struct clk_bulk_data *'
static inline void clk_bulk_disable(int num_clks,
^~~~~~~~~~~~~~~~
include/linux/clk.h:642:31: warning: passing argument 2 of 'clk_bulk_unprepare'
from incompatible pointer type [-Wincompatible-pointer-types]
clk_bulk_unprepare(num_clks, clks);
^~~~
include/linux/clk.h:223:20: note: expected 'struct clk_bulk_data *' but
argument is of type 'struct clk_bulk_data *'
static inline void clk_bulk_unprepare(int num_clks, struct clk_bulk_data *clks)
^~~~~~~~~~~~~~~~~~
In file included from drivers/staging/media/rkisp1/rkisp1-stats.c:14:0:
drivers/staging/media/rkisp1/rkisp1-common.h: At top level:
drivers/staging/media/rkisp1/rkisp1-common.h:231:23: error: array type has incomplete
element type 'struct clk_bulk_data'
struct clk_bulk_data clks[RKISP1_MAX_BUS_CLK];
^~~~
> drivers/staging/media/rkisp1/rkisp1-stats.c:189:17: warning:
initialization from incompatible pointer type [-Wincompatible-pointer-types]
.queue_setup = rkisp1_stats_vb2_queue_setup,
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
drivers/staging/media/rkisp1/rkisp1-stats.c:189:17: note: (near initialization for
'rkisp1_stats_vb2_ops.queue_setup')
drivers/staging/media/rkisp1/rkisp1-stats.c: In function
'rkisp1_stats_send_measurement':
> drivers/staging/media/rkisp1/rkisp1-stats.c:384:21: error:
'struct vb2_buffer' has no member named 'timestamp'
cur_buf->vb.vb2_buf.timestamp = timestamp;
^
drivers/staging/media/rkisp1/rkisp1-stats.c: In function
'rkisp1_stats_register':
> drivers/staging/media/rkisp1/rkisp1-stats.c:486:8: error:
implicit declaration of function 'media_entity_pads_init'; did you mean
'media_entity_init'? [-Werror=implicit-function-declaration]
ret =
media_entity_pads_init(&vdev->entity, 1, &node->pad);
^~~~~~~~~~~~~~~~~~~~~~
media_entity_init
cc1: some warnings being treated as errors
vim +384 drivers/staging/media/rkisp1/rkisp1-stats.c
187
188 static const struct vb2_ops rkisp1_stats_vb2_ops = {
189 .queue_setup = rkisp1_stats_vb2_queue_setup,
190 .buf_queue = rkisp1_stats_vb2_buf_queue,
191 .buf_prepare = rkisp1_stats_vb2_buf_prepare,
192 .wait_prepare = vb2_ops_wait_prepare,
193 .wait_finish = vb2_ops_wait_finish,
194 .stop_streaming = rkisp1_stats_vb2_stop_streaming,
195 .start_streaming = rkisp1_stats_vb2_start_streaming,
196 };
197
198 static int
199 rkisp1_stats_init_vb2_queue(struct vb2_queue *q, struct rkisp1_stats *stats)
200 {
201 struct rkisp1_vdev_node *node;
202
203 node = container_of(q, struct rkisp1_vdev_node, buf_queue);
204
205 q->type = V4L2_BUF_TYPE_META_CAPTURE;
206 q->io_modes = VB2_MMAP | VB2_USERPTR | VB2_DMABUF;
207 q->drv_priv = stats;
208 q->ops = &rkisp1_stats_vb2_ops;
209 q->mem_ops = &vb2_vmalloc_memops;
210 q->buf_struct_size = sizeof(struct rkisp1_buffer);
211 q->timestamp_flags = V4L2_BUF_FLAG_TIMESTAMP_MONOTONIC;
212 q->lock = &node->vlock;
213
214 return vb2_queue_init(q);
215 }
216
217 static void rkisp1_stats_get_awb_meas(struct rkisp1_stats *stats,
218 struct rkisp1_stat_buffer *pbuf)
219 {
220 /* Protect against concurrent access from ISR? */
221 struct rkisp1_device *rkisp1 = stats->rkisp1;
222 u32 reg_val;
223
224 pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AWB;
225 reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AWB_WHITE_CNT);
226 pbuf->params.awb.awb_mean[0].cnt =
227 RKISP1_CIF_ISP_AWB_GET_PIXEL_CNT(reg_val);
228 reg_val = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AWB_MEAN);
229
230 pbuf->params.awb.awb_mean[0].mean_cr_or_r =
231 RKISP1_CIF_ISP_AWB_GET_MEAN_CR_R(reg_val);
232 pbuf->params.awb.awb_mean[0].mean_cb_or_b =
233 RKISP1_CIF_ISP_AWB_GET_MEAN_CB_B(reg_val);
234 pbuf->params.awb.awb_mean[0].mean_y_or_g =
235 RKISP1_CIF_ISP_AWB_GET_MEAN_Y_G(reg_val);
236 }
237
238 static void rkisp1_stats_get_aec_meas(struct rkisp1_stats *stats,
239 struct rkisp1_stat_buffer *pbuf)
240 {
241 struct rkisp1_device *rkisp1 = stats->rkisp1;
242 unsigned int i;
243
244 pbuf->meas_type |= RKISP1_CIF_ISP_STAT_AUTOEXP;
245 for (i = 0; i < RKISP1_CIF_ISP_AE_MEAN_MAX; i++)
246 pbuf->params.ae.exp_mean[i] =
247 (u8)rkisp1_read(rkisp1,
248 RKISP1_CIF_ISP_EXP_MEAN_00 + i * 4);
249 }
250
251 static void rkisp1_stats_get_afc_meas(struct rkisp1_stats *stats,
252 struct rkisp1_stat_buffer *pbuf)
253 {
254 struct rkisp1_device *rkisp1 = stats->rkisp1;
255 struct rkisp1_cif_isp_af_stat *af;
256
257 pbuf->meas_type = RKISP1_CIF_ISP_STAT_AFM_FIN;
258
259 af = &pbuf->params.af;
260 af->window[0].sum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_SUM_A);
261 af->window[0].lum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_LUM_A);
262 af->window[1].sum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_SUM_B);
263 af->window[1].lum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_LUM_B);
264 af->window[2].sum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_SUM_C);
265 af->window[2].lum = rkisp1_read(rkisp1, RKISP1_CIF_ISP_AFM_LUM_C);
266 }
267
268 static void rkisp1_stats_get_hst_meas(struct rkisp1_stats *stats,
269 struct rkisp1_stat_buffer *pbuf)
270 {
271 struct rkisp1_device *rkisp1 = stats->rkisp1;
272 unsigned int i;
273
274 pbuf->meas_type |= RKISP1_CIF_ISP_STAT_HIST;
275 for (i = 0; i < RKISP1_CIF_ISP_HIST_BIN_N_MAX; i++)
276 pbuf->params.hist.hist_bins[i] =
277 (u8)rkisp1_read(rkisp1,
278 RKISP1_CIF_ISP_HIST_BIN_0 + i * 4);
279 }
280
281 static void rkisp1_stats_get_bls_meas(struct rkisp1_stats *stats,
282 struct rkisp1_stat_buffer *pbuf)
283 {
284 struct rkisp1_device *rkisp1 = stats->rkisp1;
285 const struct rkisp1_isp_mbus_info *in_fmt = rkisp1->isp.sink_fmt;
286 struct rkisp1_cif_isp_bls_meas_val *bls_val;
287
288 bls_val = &pbuf->params.ae.bls_val;
289 if (in_fmt->bayer_pat == RKISP1_RAW_BGGR) {
290 bls_val->meas_b =
291 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
292 bls_val->meas_gb =
293 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
294 bls_val->meas_gr =
295 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
296 bls_val->meas_r =
297 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
298 } else if (in_fmt->bayer_pat == RKISP1_RAW_GBRG) {
299 bls_val->meas_gb =
300 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
301 bls_val->meas_b =
302 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
303 bls_val->meas_r =
304 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
305 bls_val->meas_gr =
306 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
307 } else if (in_fmt->bayer_pat == RKISP1_RAW_GRBG) {
308 bls_val->meas_gr =
309 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
310 bls_val->meas_r =
311 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
312 bls_val->meas_b =
313 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
314 bls_val->meas_gb =
315 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
316 } else if (in_fmt->bayer_pat == RKISP1_RAW_RGGB) {
317 bls_val->meas_r =
318 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_A_MEASURED);
319 bls_val->meas_gr =
320 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_B_MEASURED);
321 bls_val->meas_gb =
322 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_C_MEASURED);
323 bls_val->meas_b =
324 rkisp1_read(rkisp1, RKISP1_CIF_ISP_BLS_D_MEASURED);
325 }
326 }
327
328 static void
329 rkisp1_stats_send_measurement(struct rkisp1_stats *stats,
330 struct rkisp1_isp_readout_work *meas_work)
331 {
332 struct rkisp1_stat_buffer *cur_stat_buf;
333 struct rkisp1_buffer *cur_buf = NULL;
334 unsigned int frame_sequence =
335 atomic_read(&stats->rkisp1->isp.frame_sequence);
336 u64 timestamp = ktime_get_ns();
337
338 if (frame_sequence != meas_work->frame_id) {
339 dev_warn(stats->rkisp1->dev,
340 "Measurement late(%d, %d)\n",
341 frame_sequence, meas_work->frame_id);
342 frame_sequence = meas_work->frame_id;
343 }
344
345 mutex_lock(&stats->wq_lock);
346 /* get one empty buffer */
347 if (!list_empty(&stats->stat)) {
348 cur_buf = list_first_entry(&stats->stat,
349 struct rkisp1_buffer, queue);
350 list_del(&cur_buf->queue);
351 }
352 mutex_unlock(&stats->wq_lock);
353
354 if (!cur_buf)
355 return;
356
357 cur_stat_buf =
358 (struct rkisp1_stat_buffer *)(cur_buf->vaddr[0]);
359
360 if (meas_work->isp_ris & RKISP1_CIF_ISP_AWB_DONE) {
361 rkisp1_stats_get_awb_meas(stats, cur_stat_buf);
362 cur_stat_buf->meas_type |= RKISP1_CIF_ISP_STAT_AWB;
363 }
364
365 if (meas_work->isp_ris & RKISP1_CIF_ISP_AFM_FIN) {
366 rkisp1_stats_get_afc_meas(stats, cur_stat_buf);
367 cur_stat_buf->meas_type |= RKISP1_CIF_ISP_STAT_AFM_FIN;
368 }
369
370 if (meas_work->isp_ris & RKISP1_CIF_ISP_EXP_END) {
371 rkisp1_stats_get_aec_meas(stats, cur_stat_buf);
372 rkisp1_stats_get_bls_meas(stats, cur_stat_buf);
373 cur_stat_buf->meas_type |= RKISP1_CIF_ISP_STAT_AUTOEXP;
374 }
375
376 if (meas_work->isp_ris & RKISP1_CIF_ISP_HIST_MEASURE_RDY) {
377 rkisp1_stats_get_hst_meas(stats, cur_stat_buf);
378 cur_stat_buf->meas_type |= RKISP1_CIF_ISP_STAT_HIST;
379 }
380
381 vb2_set_plane_payload(&cur_buf->vb.vb2_buf, 0,
382 sizeof(struct rkisp1_stat_buffer));
383 cur_buf->vb.sequence = frame_sequence;
384 cur_buf->vb.vb2_buf.timestamp = timestamp;
385 vb2_buffer_done(&cur_buf->vb.vb2_buf, VB2_BUF_STATE_DONE);
386 }
387
388 static void rkisp1_stats_readout_work(struct work_struct *work)
389 {
390 struct rkisp1_isp_readout_work *readout_work =
391 container_of(work, struct rkisp1_isp_readout_work, work);
392 struct rkisp1_stats *stats = readout_work->stats;
393
394 if (readout_work->readout == RKISP1_ISP_READOUT_MEAS)
395 rkisp1_stats_send_measurement(stats, readout_work);
396
397 kfree(readout_work);
398 }
399
400 void rkisp1_stats_isr(struct rkisp1_stats *stats, u32 isp_ris)
401 {
402 unsigned int frame_sequence =
403 atomic_read(&stats->rkisp1->isp.frame_sequence);
404 struct rkisp1_device *rkisp1 = stats->rkisp1;
405 struct rkisp1_isp_readout_work *work;
406 unsigned int isp_mis_tmp = 0;
407 u32 val;
408
409 spin_lock(&stats->irq_lock);
410
411 val = RKISP1_CIF_ISP_AWB_DONE | RKISP1_CIF_ISP_AFM_FIN |
412 RKISP1_CIF_ISP_EXP_END | RKISP1_CIF_ISP_HIST_MEASURE_RDY;
413 rkisp1_write(rkisp1, val, RKISP1_CIF_ISP_ICR);
414
415 isp_mis_tmp = rkisp1_read(rkisp1, RKISP1_CIF_ISP_MIS);
416 if (isp_mis_tmp &
417 (RKISP1_CIF_ISP_AWB_DONE | RKISP1_CIF_ISP_AFM_FIN |
418 RKISP1_CIF_ISP_EXP_END | RKISP1_CIF_ISP_HIST_MEASURE_RDY))
419 rkisp1->debug.stats_error++;
420
421 if (!stats->is_streaming)
422 goto unlock;
423 if (isp_ris & (RKISP1_CIF_ISP_AWB_DONE |
424 RKISP1_CIF_ISP_AFM_FIN |
425 RKISP1_CIF_ISP_EXP_END |
426 RKISP1_CIF_ISP_HIST_MEASURE_RDY)) {
427 work = kzalloc(sizeof(*work), GFP_ATOMIC);
428 if (work) {
429 INIT_WORK(&work->work,
430 rkisp1_stats_readout_work);
431 work->readout = RKISP1_ISP_READOUT_MEAS;
432 work->stats = stats;
433 work->frame_id = frame_sequence;
434 work->isp_ris = isp_ris;
435 if (!queue_work(stats->readout_wq,
436 &work->work))
437 kfree(work);
438 } else {
439 dev_err(stats->rkisp1->dev,
440 "Could not allocate work\n");
441 }
442 }
443
444 unlock:
445 spin_unlock(&stats->irq_lock);
446 }
447
448 static void rkisp1_init_stats(struct rkisp1_stats *stats)
449 {
450 stats->vdev_fmt.fmt.meta.dataformat =
451 V4L2_META_FMT_RK_ISP1_STAT_3A;
452 stats->vdev_fmt.fmt.meta.buffersize =
453 sizeof(struct rkisp1_stat_buffer);
454 }
455
456 int rkisp1_stats_register(struct rkisp1_stats *stats,
457 struct v4l2_device *v4l2_dev,
458 struct rkisp1_device *rkisp1)
459 {
460 struct rkisp1_vdev_node *node = &stats->vnode;
461 struct video_device *vdev = &node->vdev;
462 int ret;
463
464 stats->rkisp1 = rkisp1;
465 mutex_init(&stats->wq_lock);
466 mutex_init(&node->vlock);
467 INIT_LIST_HEAD(&stats->stat);
468 spin_lock_init(&stats->irq_lock);
469
470 strscpy(vdev->name, RKISP1_STATS_DEV_NAME, sizeof(vdev->name));
471
472 video_set_drvdata(vdev, stats);
473 vdev->ioctl_ops = &rkisp1_stats_ioctl;
474 vdev->fops = &rkisp1_stats_fops;
475 vdev->release = video_device_release_empty;
476 vdev->lock = &node->vlock;
477 vdev->v4l2_dev = v4l2_dev;
478 vdev->queue = &node->buf_queue;
479 vdev->device_caps = V4L2_CAP_META_CAPTURE | V4L2_CAP_STREAMING;
480 vdev->vfl_dir = VFL_DIR_RX;
481 rkisp1_stats_init_vb2_queue(vdev->queue, stats);
482 rkisp1_init_stats(stats);
483 video_set_drvdata(vdev, stats);
484
485 node->pad.flags = MEDIA_PAD_FL_SINK;
486 ret = media_entity_pads_init(&vdev->entity, 1,
&node->pad);
487 if (ret)
488 goto err_release_queue;
489
490 ret = video_register_device(vdev, VFL_TYPE_GRABBER, -1);
491 if (ret) {
492 dev_err(&vdev->dev,
493 "failed to register %s, ret=%d\n", vdev->name, ret);
494 goto err_cleanup_media_entity;
495 }
496
497 stats->readout_wq = alloc_workqueue("measurement_queue",
498 WQ_UNBOUND | WQ_MEM_RECLAIM,
499 1);
500
501 if (!stats->readout_wq) {
502 ret = -ENOMEM;
503 goto err_unreg_vdev;
504 }
505
506 return 0;
507
508 err_unreg_vdev:
509 video_unregister_device(vdev);
510 err_cleanup_media_entity:
511 media_entity_cleanup(&vdev->entity);
512 err_release_queue:
513 vb2_queue_release(vdev->queue);
514 mutex_destroy(&node->vlock);
515 mutex_destroy(&stats->wq_lock);
516 return ret;
517 }
518
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org