1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0+ */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * vsp1.h -- R-Car VSP1 Driver 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (C) 2013-2014 Renesas Electronics Corporation 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com) 8*4882a593Smuzhiyun */ 9*4882a593Smuzhiyun #ifndef __VSP1_H__ 10*4882a593Smuzhiyun #define __VSP1_H__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/io.h> 13*4882a593Smuzhiyun #include <linux/list.h> 14*4882a593Smuzhiyun #include <linux/mutex.h> 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun #include <media/media-device.h> 17*4882a593Smuzhiyun #include <media/v4l2-device.h> 18*4882a593Smuzhiyun #include <media/v4l2-subdev.h> 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun #include "vsp1_regs.h" 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun struct clk; 23*4882a593Smuzhiyun struct device; 24*4882a593Smuzhiyun struct rcar_fcp_device; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun struct vsp1_drm; 27*4882a593Smuzhiyun struct vsp1_entity; 28*4882a593Smuzhiyun struct vsp1_platform_data; 29*4882a593Smuzhiyun struct vsp1_brx; 30*4882a593Smuzhiyun struct vsp1_clu; 31*4882a593Smuzhiyun struct vsp1_hgo; 32*4882a593Smuzhiyun struct vsp1_hgt; 33*4882a593Smuzhiyun struct vsp1_hsit; 34*4882a593Smuzhiyun struct vsp1_lif; 35*4882a593Smuzhiyun struct vsp1_lut; 36*4882a593Smuzhiyun struct vsp1_rwpf; 37*4882a593Smuzhiyun struct vsp1_sru; 38*4882a593Smuzhiyun struct vsp1_uds; 39*4882a593Smuzhiyun struct vsp1_uif; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define VSP1_MAX_LIF 2 42*4882a593Smuzhiyun #define VSP1_MAX_RPF 5 43*4882a593Smuzhiyun #define VSP1_MAX_UDS 3 44*4882a593Smuzhiyun #define VSP1_MAX_UIF 2 45*4882a593Smuzhiyun #define VSP1_MAX_WPF 4 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define VSP1_HAS_LUT (1 << 1) 48*4882a593Smuzhiyun #define VSP1_HAS_SRU (1 << 2) 49*4882a593Smuzhiyun #define VSP1_HAS_BRU (1 << 3) 50*4882a593Smuzhiyun #define VSP1_HAS_CLU (1 << 4) 51*4882a593Smuzhiyun #define VSP1_HAS_WPF_VFLIP (1 << 5) 52*4882a593Smuzhiyun #define VSP1_HAS_WPF_HFLIP (1 << 6) 53*4882a593Smuzhiyun #define VSP1_HAS_HGO (1 << 7) 54*4882a593Smuzhiyun #define VSP1_HAS_HGT (1 << 8) 55*4882a593Smuzhiyun #define VSP1_HAS_BRS (1 << 9) 56*4882a593Smuzhiyun #define VSP1_HAS_EXT_DL (1 << 10) 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun struct vsp1_device_info { 59*4882a593Smuzhiyun u32 version; 60*4882a593Smuzhiyun const char *model; 61*4882a593Smuzhiyun unsigned int gen; 62*4882a593Smuzhiyun unsigned int features; 63*4882a593Smuzhiyun unsigned int lif_count; 64*4882a593Smuzhiyun unsigned int rpf_count; 65*4882a593Smuzhiyun unsigned int uds_count; 66*4882a593Smuzhiyun unsigned int uif_count; 67*4882a593Smuzhiyun unsigned int wpf_count; 68*4882a593Smuzhiyun unsigned int num_bru_inputs; 69*4882a593Smuzhiyun bool uapi; 70*4882a593Smuzhiyun }; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun #define vsp1_feature(vsp1, f) ((vsp1)->info->features & (f)) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun struct vsp1_device { 75*4882a593Smuzhiyun struct device *dev; 76*4882a593Smuzhiyun const struct vsp1_device_info *info; 77*4882a593Smuzhiyun u32 version; 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun void __iomem *mmio; 80*4882a593Smuzhiyun struct rcar_fcp_device *fcp; 81*4882a593Smuzhiyun struct device *bus_master; 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun struct vsp1_brx *brs; 84*4882a593Smuzhiyun struct vsp1_brx *bru; 85*4882a593Smuzhiyun struct vsp1_clu *clu; 86*4882a593Smuzhiyun struct vsp1_hgo *hgo; 87*4882a593Smuzhiyun struct vsp1_hgt *hgt; 88*4882a593Smuzhiyun struct vsp1_hsit *hsi; 89*4882a593Smuzhiyun struct vsp1_hsit *hst; 90*4882a593Smuzhiyun struct vsp1_lif *lif[VSP1_MAX_LIF]; 91*4882a593Smuzhiyun struct vsp1_lut *lut; 92*4882a593Smuzhiyun struct vsp1_rwpf *rpf[VSP1_MAX_RPF]; 93*4882a593Smuzhiyun struct vsp1_sru *sru; 94*4882a593Smuzhiyun struct vsp1_uds *uds[VSP1_MAX_UDS]; 95*4882a593Smuzhiyun struct vsp1_uif *uif[VSP1_MAX_UIF]; 96*4882a593Smuzhiyun struct vsp1_rwpf *wpf[VSP1_MAX_WPF]; 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun struct list_head entities; 99*4882a593Smuzhiyun struct list_head videos; 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun struct v4l2_device v4l2_dev; 102*4882a593Smuzhiyun struct media_device media_dev; 103*4882a593Smuzhiyun struct media_entity_operations media_ops; 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun struct vsp1_drm *drm; 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun int vsp1_device_get(struct vsp1_device *vsp1); 109*4882a593Smuzhiyun void vsp1_device_put(struct vsp1_device *vsp1); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun int vsp1_reset_wpf(struct vsp1_device *vsp1, unsigned int index); 112*4882a593Smuzhiyun vsp1_read(struct vsp1_device * vsp1,u32 reg)113*4882a593Smuzhiyunstatic inline u32 vsp1_read(struct vsp1_device *vsp1, u32 reg) 114*4882a593Smuzhiyun { 115*4882a593Smuzhiyun return ioread32(vsp1->mmio + reg); 116*4882a593Smuzhiyun } 117*4882a593Smuzhiyun vsp1_write(struct vsp1_device * vsp1,u32 reg,u32 data)118*4882a593Smuzhiyunstatic inline void vsp1_write(struct vsp1_device *vsp1, u32 reg, u32 data) 119*4882a593Smuzhiyun { 120*4882a593Smuzhiyun iowrite32(data, vsp1->mmio + reg); 121*4882a593Smuzhiyun } 122*4882a593Smuzhiyun 123*4882a593Smuzhiyun #endif /* __VSP1_H__ */ 124