162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * vsp1.h  --  R-Car VSP1 Driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2013-2014 Renesas Electronics Corporation
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
862306a36Sopenharmony_ci */
962306a36Sopenharmony_ci#ifndef __VSP1_H__
1062306a36Sopenharmony_ci#define __VSP1_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <linux/io.h>
1362306a36Sopenharmony_ci#include <linux/list.h>
1462306a36Sopenharmony_ci#include <linux/mutex.h>
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#include <media/media-device.h>
1762306a36Sopenharmony_ci#include <media/v4l2-device.h>
1862306a36Sopenharmony_ci#include <media/v4l2-subdev.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#include "vsp1_regs.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistruct clk;
2362306a36Sopenharmony_cistruct device;
2462306a36Sopenharmony_cistruct rcar_fcp_device;
2562306a36Sopenharmony_cistruct reset_control;
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistruct vsp1_drm;
2862306a36Sopenharmony_cistruct vsp1_entity;
2962306a36Sopenharmony_cistruct vsp1_platform_data;
3062306a36Sopenharmony_cistruct vsp1_brx;
3162306a36Sopenharmony_cistruct vsp1_clu;
3262306a36Sopenharmony_cistruct vsp1_hgo;
3362306a36Sopenharmony_cistruct vsp1_hgt;
3462306a36Sopenharmony_cistruct vsp1_hsit;
3562306a36Sopenharmony_cistruct vsp1_lif;
3662306a36Sopenharmony_cistruct vsp1_lut;
3762306a36Sopenharmony_cistruct vsp1_rwpf;
3862306a36Sopenharmony_cistruct vsp1_sru;
3962306a36Sopenharmony_cistruct vsp1_uds;
4062306a36Sopenharmony_cistruct vsp1_uif;
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci#define VSP1_MAX_LIF		2
4362306a36Sopenharmony_ci#define VSP1_MAX_RPF		5
4462306a36Sopenharmony_ci#define VSP1_MAX_UDS		3
4562306a36Sopenharmony_ci#define VSP1_MAX_UIF		2
4662306a36Sopenharmony_ci#define VSP1_MAX_WPF		4
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#define VSP1_HAS_LUT		BIT(1)
4962306a36Sopenharmony_ci#define VSP1_HAS_SRU		BIT(2)
5062306a36Sopenharmony_ci#define VSP1_HAS_BRU		BIT(3)
5162306a36Sopenharmony_ci#define VSP1_HAS_CLU		BIT(4)
5262306a36Sopenharmony_ci#define VSP1_HAS_WPF_VFLIP	BIT(5)
5362306a36Sopenharmony_ci#define VSP1_HAS_WPF_HFLIP	BIT(6)
5462306a36Sopenharmony_ci#define VSP1_HAS_HGO		BIT(7)
5562306a36Sopenharmony_ci#define VSP1_HAS_HGT		BIT(8)
5662306a36Sopenharmony_ci#define VSP1_HAS_BRS		BIT(9)
5762306a36Sopenharmony_ci#define VSP1_HAS_EXT_DL		BIT(10)
5862306a36Sopenharmony_ci#define VSP1_HAS_NON_ZERO_LBA	BIT(11)
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_cistruct vsp1_device_info {
6162306a36Sopenharmony_ci	u32 version;
6262306a36Sopenharmony_ci	const char *model;
6362306a36Sopenharmony_ci	unsigned int gen;
6462306a36Sopenharmony_ci	unsigned int features;
6562306a36Sopenharmony_ci	unsigned int lif_count;
6662306a36Sopenharmony_ci	unsigned int rpf_count;
6762306a36Sopenharmony_ci	unsigned int uds_count;
6862306a36Sopenharmony_ci	unsigned int uif_count;
6962306a36Sopenharmony_ci	unsigned int wpf_count;
7062306a36Sopenharmony_ci	unsigned int num_bru_inputs;
7162306a36Sopenharmony_ci	u8 soc;
7262306a36Sopenharmony_ci	bool uapi;
7362306a36Sopenharmony_ci};
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci#define vsp1_feature(vsp1, f) ((vsp1)->info->features & (f))
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_cistruct vsp1_device {
7862306a36Sopenharmony_ci	struct device *dev;
7962306a36Sopenharmony_ci	const struct vsp1_device_info *info;
8062306a36Sopenharmony_ci	u32 version;
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	void __iomem *mmio;
8362306a36Sopenharmony_ci	struct rcar_fcp_device *fcp;
8462306a36Sopenharmony_ci	struct device *bus_master;
8562306a36Sopenharmony_ci	struct reset_control *rstc;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci	struct vsp1_brx *brs;
8862306a36Sopenharmony_ci	struct vsp1_brx *bru;
8962306a36Sopenharmony_ci	struct vsp1_clu *clu;
9062306a36Sopenharmony_ci	struct vsp1_hgo *hgo;
9162306a36Sopenharmony_ci	struct vsp1_hgt *hgt;
9262306a36Sopenharmony_ci	struct vsp1_hsit *hsi;
9362306a36Sopenharmony_ci	struct vsp1_hsit *hst;
9462306a36Sopenharmony_ci	struct vsp1_lif *lif[VSP1_MAX_LIF];
9562306a36Sopenharmony_ci	struct vsp1_lut *lut;
9662306a36Sopenharmony_ci	struct vsp1_rwpf *rpf[VSP1_MAX_RPF];
9762306a36Sopenharmony_ci	struct vsp1_sru *sru;
9862306a36Sopenharmony_ci	struct vsp1_uds *uds[VSP1_MAX_UDS];
9962306a36Sopenharmony_ci	struct vsp1_uif *uif[VSP1_MAX_UIF];
10062306a36Sopenharmony_ci	struct vsp1_rwpf *wpf[VSP1_MAX_WPF];
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	struct list_head entities;
10362306a36Sopenharmony_ci	struct list_head videos;
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci	struct v4l2_device v4l2_dev;
10662306a36Sopenharmony_ci	struct media_device media_dev;
10762306a36Sopenharmony_ci	struct media_entity_operations media_ops;
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci	struct vsp1_drm *drm;
11062306a36Sopenharmony_ci};
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ciint vsp1_device_get(struct vsp1_device *vsp1);
11362306a36Sopenharmony_civoid vsp1_device_put(struct vsp1_device *vsp1);
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ciint vsp1_reset_wpf(struct vsp1_device *vsp1, unsigned int index);
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_cistatic inline u32 vsp1_read(struct vsp1_device *vsp1, u32 reg)
11862306a36Sopenharmony_ci{
11962306a36Sopenharmony_ci	return ioread32(vsp1->mmio + reg);
12062306a36Sopenharmony_ci}
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_cistatic inline void vsp1_write(struct vsp1_device *vsp1, u32 reg, u32 data)
12362306a36Sopenharmony_ci{
12462306a36Sopenharmony_ci	iowrite32(data, vsp1->mmio + reg);
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci#endif /* __VSP1_H__ */
128