vsp1_histo.h 2.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/*
 * vsp1_histo.h  --  R-Car VSP1 Histogram API
 *
 * Copyright (C) 2016 Renesas Electronics Corporation
 * Copyright (C) 2016 Laurent Pinchart
 *
 * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */
#ifndef __VSP1_HISTO_H__
#define __VSP1_HISTO_H__

#include <linux/list.h>
#include <linux/mutex.h>
#include <linux/spinlock.h>

#include <media/media-entity.h>
#include <media/v4l2-dev.h>
#include <media/videobuf2-v4l2.h>

#include "vsp1_entity.h"

struct vsp1_device;
struct vsp1_pipeline;

#define HISTO_PAD_SINK				0
#define HISTO_PAD_SOURCE			1

struct vsp1_histogram_buffer {
	struct vb2_v4l2_buffer buf;
	struct list_head queue;
	void *addr;
};

struct vsp1_histogram {
	struct vsp1_pipeline *pipe;

	struct vsp1_entity entity;
	struct video_device video;
	struct media_pad pad;

	const u32 *formats;
	unsigned int num_formats;
	size_t data_size;
	u32 meta_format;

	struct mutex lock;
	struct vb2_queue queue;

	spinlock_t irqlock;
	struct list_head irqqueue;

	wait_queue_head_t wait_queue;
	bool readout;
};

static inline struct vsp1_histogram *vdev_to_histo(struct video_device *vdev)
{
	return container_of(vdev, struct vsp1_histogram, video);
}

static inline struct vsp1_histogram *subdev_to_histo(struct v4l2_subdev *subdev)
{
	return container_of(subdev, struct vsp1_histogram, entity.subdev);
}

int vsp1_histogram_init(struct vsp1_device *vsp1, struct vsp1_histogram *histo,
			enum vsp1_entity_type type, const char *name,
			const struct vsp1_entity_operations *ops,
			const unsigned int *formats, unsigned int num_formats,
			size_t data_size, u32 meta_format);
void vsp1_histogram_destroy(struct vsp1_entity *entity);

struct vsp1_histogram_buffer *
vsp1_histogram_buffer_get(struct vsp1_histogram *histo);
void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo,
				    struct vsp1_histogram_buffer *buf,
				    size_t size);

#endif /* __VSP1_HISTO_H__ */