/*
 * Greybus Camera protocol driver.
 *
 * Copyright 2015 Google Inc.
 *
 * Released under the GPLv2 only.
 */
#ifndef __GB_CAMERA_H
#define __GB_CAMERA_H

#include <linux/v4l2-mediabus.h>

/* Input flags need to be set from the caller */
#define GB_CAMERA_IN_FLAG_TEST		(1 << 0)
/* Output flags returned */
#define GB_CAMERA_OUT_FLAG_ADJUSTED	(1 << 0)

/**
 * struct gb_camera_stream - Represents greybus camera stream.
 * @width: Stream width in pixels.
 * @height: Stream height in pixels.
 * @pixel_code: Media bus pixel code.
 * @vc: MIPI CSI virtual channel.
 * @dt: MIPI CSI data types. Most formats use a single data type, in which case
 *      the second element will be ignored.
 * @max_size: Maximum size of a frame in bytes. The camera module guarantees
 *            that all data between the Frame Start and Frame End packet for
 *            the associated virtual channel and data type(s) will not exceed
 *            this size.
 */
struct gb_camera_stream {
	unsigned int width;
	unsigned int height;
	enum v4l2_mbus_pixelcode pixel_code;
	unsigned int vc;
	unsigned int dt[2];
	unsigned int max_size;
};

/**
 * struct gb_camera_csi_params - CSI configuration parameters
 * @num_lanes: number of CSI data lanes
 * @clk_freq: CSI clock frequency in Hz
 */
struct gb_camera_csi_params {
	unsigned int num_lanes;
	unsigned int clk_freq;
};

/**
 * struct gb_camera_ops - Greybus camera operations, used by the Greybus camera
 *                        driver to expose operations to the host camera driver.
 * @capabilities: Retrieve camera capabilities and store them in the buffer
 *                'buf' capabilities. The buffer maximum size is specified by
 *                the caller in the 'size' parameter, and the effective
 *                capabilities size is returned from the function. If the buffer
 *                size is too small to hold the capabilities an error is
 *                returned and the buffer is left untouched.
 *
 * @configure_streams: Negotiate configuration and prepare the module for video
 *                     capture. The caller specifies the number of streams it
 *                     requests in the 'nstreams' argument and the associated
 *                     streams configurations in the 'streams' argument. The
 *                     GB_CAMERA_IN_FLAG_TEST 'flag' can be set to test a
 *                     configuration without applying it, otherwise the
 *                     configuration is applied by the module. The module can
 *                     decide to modify the requested configuration, including
 *                     using a different number of streams. In that case the
 *                     modified configuration won't be applied, the
 *                     GB_CAMERA_OUT_FLAG_ADJUSTED 'flag' will be set upon
 *                     return, and the modified configuration and number of
 *                     streams stored in 'streams' and 'array'. The module
 *                     returns its CSI-2 bus parameters in the 'csi_params'
 *                     structure in all cases.
 *
 * @capture: Submit a capture request. The supplied 'request_id' must be unique
 *           and higher than the IDs of all the previously submitted requests.
 *           The 'streams' argument specifies which streams are affected by the
 *           request in the form of a bitmask, with bits corresponding to the
 *           configured streams indexes. If the request contains settings, the
 *           'settings' argument points to the settings buffer and its size is
 *           specified by the 'settings_size' argument. Otherwise the 'settings'
 *           argument should be set to NULL and 'settings_size' to 0.
 *
 * @flush: Flush the capture requests queue. Return the ID of the last request
 *         that will processed by the device before it stops transmitting video
 *         frames. All queued capture requests with IDs higher than the returned
 *         ID will be dropped without being processed.
 */
struct gb_camera_ops {
	ssize_t (*capabilities)(void *priv, char *buf, size_t len);
	int (*configure_streams)(void *priv, unsigned int *nstreams,
			unsigned int *flags, struct gb_camera_stream *streams,
			struct gb_camera_csi_params *csi_params);
	int (*capture)(void *priv, u32 request_id,
			unsigned int streams, unsigned int num_frames,
			size_t settings_size, const void *settings);
	int (*flush)(void *priv, u32 *request_id);
};

/**
 * struct gb_camera_module - Represents greybus camera module.
 * @priv: Module private data, passed to all camera operations.
 * @ops: Greybus camera operation callbacks.
 * @interface_id: Interface id of the module.
 * @refcount: Reference counting object.
 * @release: Module release function.
 * @list: List entry in the camera modules list.
 */
struct gb_camera_module {
	void *priv;
	const struct gb_camera_ops *ops;

	unsigned int interface_id;
	struct kref refcount;
	void (*release)(struct kref *kref);
	struct list_head list; /* Global list */
};

#define gb_camera_call(f, op, args...)      \
	(!(f) ? -ENODEV : (((f)->ops->op) ?  \
	(f)->ops->op((f)->priv, ##args) : -ENOIOCTLCMD))

int gb_camera_register(struct gb_camera_module *module);
int gb_camera_unregister(struct gb_camera_module *module);

#endif /* __GB_CAMERA_H */
