18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * vsp1.h  --  R-Car VSP1 Driver
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 2013-2014 Renesas Electronics Corporation
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci#ifndef __VSP1_H__
108c2ecf20Sopenharmony_ci#define __VSP1_H__
118c2ecf20Sopenharmony_ci
128c2ecf20Sopenharmony_ci#include <linux/io.h>
138c2ecf20Sopenharmony_ci#include <linux/list.h>
148c2ecf20Sopenharmony_ci#include <linux/mutex.h>
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <media/media-device.h>
178c2ecf20Sopenharmony_ci#include <media/v4l2-device.h>
188c2ecf20Sopenharmony_ci#include <media/v4l2-subdev.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include "vsp1_regs.h"
218c2ecf20Sopenharmony_ci
228c2ecf20Sopenharmony_cistruct clk;
238c2ecf20Sopenharmony_cistruct device;
248c2ecf20Sopenharmony_cistruct rcar_fcp_device;
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_cistruct vsp1_drm;
278c2ecf20Sopenharmony_cistruct vsp1_entity;
288c2ecf20Sopenharmony_cistruct vsp1_platform_data;
298c2ecf20Sopenharmony_cistruct vsp1_brx;
308c2ecf20Sopenharmony_cistruct vsp1_clu;
318c2ecf20Sopenharmony_cistruct vsp1_hgo;
328c2ecf20Sopenharmony_cistruct vsp1_hgt;
338c2ecf20Sopenharmony_cistruct vsp1_hsit;
348c2ecf20Sopenharmony_cistruct vsp1_lif;
358c2ecf20Sopenharmony_cistruct vsp1_lut;
368c2ecf20Sopenharmony_cistruct vsp1_rwpf;
378c2ecf20Sopenharmony_cistruct vsp1_sru;
388c2ecf20Sopenharmony_cistruct vsp1_uds;
398c2ecf20Sopenharmony_cistruct vsp1_uif;
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define VSP1_MAX_LIF		2
428c2ecf20Sopenharmony_ci#define VSP1_MAX_RPF		5
438c2ecf20Sopenharmony_ci#define VSP1_MAX_UDS		3
448c2ecf20Sopenharmony_ci#define VSP1_MAX_UIF		2
458c2ecf20Sopenharmony_ci#define VSP1_MAX_WPF		4
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci#define VSP1_HAS_LUT		(1 << 1)
488c2ecf20Sopenharmony_ci#define VSP1_HAS_SRU		(1 << 2)
498c2ecf20Sopenharmony_ci#define VSP1_HAS_BRU		(1 << 3)
508c2ecf20Sopenharmony_ci#define VSP1_HAS_CLU		(1 << 4)
518c2ecf20Sopenharmony_ci#define VSP1_HAS_WPF_VFLIP	(1 << 5)
528c2ecf20Sopenharmony_ci#define VSP1_HAS_WPF_HFLIP	(1 << 6)
538c2ecf20Sopenharmony_ci#define VSP1_HAS_HGO		(1 << 7)
548c2ecf20Sopenharmony_ci#define VSP1_HAS_HGT		(1 << 8)
558c2ecf20Sopenharmony_ci#define VSP1_HAS_BRS		(1 << 9)
568c2ecf20Sopenharmony_ci#define VSP1_HAS_EXT_DL		(1 << 10)
578c2ecf20Sopenharmony_ci
588c2ecf20Sopenharmony_cistruct vsp1_device_info {
598c2ecf20Sopenharmony_ci	u32 version;
608c2ecf20Sopenharmony_ci	const char *model;
618c2ecf20Sopenharmony_ci	unsigned int gen;
628c2ecf20Sopenharmony_ci	unsigned int features;
638c2ecf20Sopenharmony_ci	unsigned int lif_count;
648c2ecf20Sopenharmony_ci	unsigned int rpf_count;
658c2ecf20Sopenharmony_ci	unsigned int uds_count;
668c2ecf20Sopenharmony_ci	unsigned int uif_count;
678c2ecf20Sopenharmony_ci	unsigned int wpf_count;
688c2ecf20Sopenharmony_ci	unsigned int num_bru_inputs;
698c2ecf20Sopenharmony_ci	bool uapi;
708c2ecf20Sopenharmony_ci};
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci#define vsp1_feature(vsp1, f) ((vsp1)->info->features & (f))
738c2ecf20Sopenharmony_ci
748c2ecf20Sopenharmony_cistruct vsp1_device {
758c2ecf20Sopenharmony_ci	struct device *dev;
768c2ecf20Sopenharmony_ci	const struct vsp1_device_info *info;
778c2ecf20Sopenharmony_ci	u32 version;
788c2ecf20Sopenharmony_ci
798c2ecf20Sopenharmony_ci	void __iomem *mmio;
808c2ecf20Sopenharmony_ci	struct rcar_fcp_device *fcp;
818c2ecf20Sopenharmony_ci	struct device *bus_master;
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	struct vsp1_brx *brs;
848c2ecf20Sopenharmony_ci	struct vsp1_brx *bru;
858c2ecf20Sopenharmony_ci	struct vsp1_clu *clu;
868c2ecf20Sopenharmony_ci	struct vsp1_hgo *hgo;
878c2ecf20Sopenharmony_ci	struct vsp1_hgt *hgt;
888c2ecf20Sopenharmony_ci	struct vsp1_hsit *hsi;
898c2ecf20Sopenharmony_ci	struct vsp1_hsit *hst;
908c2ecf20Sopenharmony_ci	struct vsp1_lif *lif[VSP1_MAX_LIF];
918c2ecf20Sopenharmony_ci	struct vsp1_lut *lut;
928c2ecf20Sopenharmony_ci	struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
938c2ecf20Sopenharmony_ci	struct vsp1_sru *sru;
948c2ecf20Sopenharmony_ci	struct vsp1_uds *uds[VSP1_MAX_UDS];
958c2ecf20Sopenharmony_ci	struct vsp1_uif *uif[VSP1_MAX_UIF];
968c2ecf20Sopenharmony_ci	struct vsp1_rwpf *wpf[VSP1_MAX_WPF];
978c2ecf20Sopenharmony_ci
988c2ecf20Sopenharmony_ci	struct list_head entities;
998c2ecf20Sopenharmony_ci	struct list_head videos;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	struct v4l2_device v4l2_dev;
1028c2ecf20Sopenharmony_ci	struct media_device media_dev;
1038c2ecf20Sopenharmony_ci	struct media_entity_operations media_ops;
1048c2ecf20Sopenharmony_ci
1058c2ecf20Sopenharmony_ci	struct vsp1_drm *drm;
1068c2ecf20Sopenharmony_ci};
1078c2ecf20Sopenharmony_ci
1088c2ecf20Sopenharmony_ciint vsp1_device_get(struct vsp1_device *vsp1);
1098c2ecf20Sopenharmony_civoid vsp1_device_put(struct vsp1_device *vsp1);
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ciint vsp1_reset_wpf(struct vsp1_device *vsp1, unsigned int index);
1128c2ecf20Sopenharmony_ci
1138c2ecf20Sopenharmony_cistatic inline u32 vsp1_read(struct vsp1_device *vsp1, u32 reg)
1148c2ecf20Sopenharmony_ci{
1158c2ecf20Sopenharmony_ci	return ioread32(vsp1->mmio + reg);
1168c2ecf20Sopenharmony_ci}
1178c2ecf20Sopenharmony_ci
1188c2ecf20Sopenharmony_cistatic inline void vsp1_write(struct vsp1_device *vsp1, u32 reg, u32 data)
1198c2ecf20Sopenharmony_ci{
1208c2ecf20Sopenharmony_ci	iowrite32(data, vsp1->mmio + reg);
1218c2ecf20Sopenharmony_ci}
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci#endif /* __VSP1_H__ */
124