1/*
2 * Samsung S5P G2D - 2D Graphics Accelerator Driver
3 *
4 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
5 * Kamil Debski, <k.debski@samsung.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the
10 * License, or (at your option) any later version
11 */
12
13#include <linux/platform_device.h>
14#include <media/v4l2-device.h>
15#include <media/v4l2-ctrls.h>
16
17#define G2D_NAME "s5p-g2d"
18#define TYPE_G2D_3X 3
19#define TYPE_G2D_4X 4
20
21struct g2d_dev {
22	struct v4l2_device	v4l2_dev;
23	struct v4l2_m2m_dev	*m2m_dev;
24	struct video_device	*vfd;
25	struct mutex		mutex;
26	spinlock_t		ctrl_lock;
27	atomic_t		num_inst;
28	struct vb2_alloc_ctx	*alloc_ctx;
29	void __iomem		*regs;
30	struct clk		*clk;
31	struct clk		*gate;
32	struct g2d_ctx		*curr;
33	struct g2d_variant	*variant;
34	int irq;
35	wait_queue_head_t	irq_queue;
36};
37
38struct g2d_frame {
39	/* Original dimensions */
40	u32	width;
41	u32	height;
42	/* Crop size */
43	u32	c_width;
44	u32	c_height;
45	/* Offset */
46	u32	o_width;
47	u32	o_height;
48	/* Image format */
49	struct g2d_fmt *fmt;
50	/* Variables that can calculated once and reused */
51	u32	stride;
52	u32	bottom;
53	u32	right;
54	u32	size;
55};
56
57struct g2d_ctx {
58	struct v4l2_fh fh;
59	struct g2d_dev		*dev;
60	struct g2d_frame	in;
61	struct g2d_frame	out;
62	struct v4l2_ctrl	*ctrl_hflip;
63	struct v4l2_ctrl	*ctrl_vflip;
64	struct v4l2_ctrl_handler ctrl_handler;
65	u32 rop;
66	u32 flip;
67};
68
69struct g2d_fmt {
70	char	*name;
71	u32	fourcc;
72	int	depth;
73	u32	hw;
74};
75
76struct g2d_variant {
77	unsigned short hw_rev;
78};
79
80void g2d_reset(struct g2d_dev *d);
81void g2d_set_src_size(struct g2d_dev *d, struct g2d_frame *f);
82void g2d_set_src_addr(struct g2d_dev *d, dma_addr_t a);
83void g2d_set_dst_size(struct g2d_dev *d, struct g2d_frame *f);
84void g2d_set_dst_addr(struct g2d_dev *d, dma_addr_t a);
85void g2d_start(struct g2d_dev *d);
86void g2d_clear_int(struct g2d_dev *d);
87void g2d_set_rop4(struct g2d_dev *d, u32 r);
88void g2d_set_flip(struct g2d_dev *d, u32 r);
89void g2d_set_v41_stretch(struct g2d_dev *d,
90			struct g2d_frame *src, struct g2d_frame *dst);
91void g2d_set_cmd(struct g2d_dev *d, u32 c);
92
93static inline struct g2d_variant *g2d_get_drv_data(struct platform_device *pdev)
94{
95	return (struct g2d_variant *)platform_get_device_id(pdev)->driver_data;
96}
97