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