18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * vsp1_histo.h -- R-Car VSP1 Histogram API 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Copyright (C) 2016 Renesas Electronics Corporation 68c2ecf20Sopenharmony_ci * Copyright (C) 2016 Laurent Pinchart 78c2ecf20Sopenharmony_ci * 88c2ecf20Sopenharmony_ci * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com) 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci#ifndef __VSP1_HISTO_H__ 118c2ecf20Sopenharmony_ci#define __VSP1_HISTO_H__ 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/list.h> 148c2ecf20Sopenharmony_ci#include <linux/mutex.h> 158c2ecf20Sopenharmony_ci#include <linux/spinlock.h> 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ci#include <media/media-entity.h> 188c2ecf20Sopenharmony_ci#include <media/v4l2-dev.h> 198c2ecf20Sopenharmony_ci#include <media/videobuf2-v4l2.h> 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci#include "vsp1_entity.h" 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_cistruct vsp1_device; 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define HISTO_PAD_SINK 0 268c2ecf20Sopenharmony_ci#define HISTO_PAD_SOURCE 1 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_cistruct vsp1_histogram_buffer { 298c2ecf20Sopenharmony_ci struct vb2_v4l2_buffer buf; 308c2ecf20Sopenharmony_ci struct list_head queue; 318c2ecf20Sopenharmony_ci void *addr; 328c2ecf20Sopenharmony_ci}; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_cistruct vsp1_histogram { 358c2ecf20Sopenharmony_ci struct vsp1_entity entity; 368c2ecf20Sopenharmony_ci struct video_device video; 378c2ecf20Sopenharmony_ci struct media_pad pad; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci const u32 *formats; 408c2ecf20Sopenharmony_ci unsigned int num_formats; 418c2ecf20Sopenharmony_ci size_t data_size; 428c2ecf20Sopenharmony_ci u32 meta_format; 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci struct mutex lock; 458c2ecf20Sopenharmony_ci struct vb2_queue queue; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci spinlock_t irqlock; 488c2ecf20Sopenharmony_ci struct list_head irqqueue; 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci wait_queue_head_t wait_queue; 518c2ecf20Sopenharmony_ci bool readout; 528c2ecf20Sopenharmony_ci}; 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic inline struct vsp1_histogram *vdev_to_histo(struct video_device *vdev) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci return container_of(vdev, struct vsp1_histogram, video); 578c2ecf20Sopenharmony_ci} 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_cistatic inline struct vsp1_histogram *subdev_to_histo(struct v4l2_subdev *subdev) 608c2ecf20Sopenharmony_ci{ 618c2ecf20Sopenharmony_ci return container_of(subdev, struct vsp1_histogram, entity.subdev); 628c2ecf20Sopenharmony_ci} 638c2ecf20Sopenharmony_ci 648c2ecf20Sopenharmony_ciint vsp1_histogram_init(struct vsp1_device *vsp1, struct vsp1_histogram *histo, 658c2ecf20Sopenharmony_ci enum vsp1_entity_type type, const char *name, 668c2ecf20Sopenharmony_ci const struct vsp1_entity_operations *ops, 678c2ecf20Sopenharmony_ci const unsigned int *formats, unsigned int num_formats, 688c2ecf20Sopenharmony_ci size_t data_size, u32 meta_format); 698c2ecf20Sopenharmony_civoid vsp1_histogram_destroy(struct vsp1_entity *entity); 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_cistruct vsp1_histogram_buffer * 728c2ecf20Sopenharmony_civsp1_histogram_buffer_get(struct vsp1_histogram *histo); 738c2ecf20Sopenharmony_civoid vsp1_histogram_buffer_complete(struct vsp1_histogram *histo, 748c2ecf20Sopenharmony_ci struct vsp1_histogram_buffer *buf, 758c2ecf20Sopenharmony_ci size_t size); 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci#endif /* __VSP1_HISTO_H__ */ 78