aboutsummaryrefslogtreecommitdiffstats
path: root/include/media/exynos_mc.h
blob: a96b0387457cde177f1bae7603bbfe010eaec09f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
/* linux/inclue/media/exynos_mc.h
 *
 * Copyright (c) 2011 Samsung Electronics Co., Ltd.
 *		http://www.samsung.com
 *
 * header file for exynos media device driver
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef GSC_MDEVICE_H_
#define GSC_MDEVICE_H_

#include <linux/clk.h>
#include <linux/platform_device.h>
#include <linux/mutex.h>
#include <linux/device.h>
#include <media/media-device.h>
#include <media/media-entity.h>
#include <media/v4l2-device.h>
#include <media/v4l2-subdev.h>

#define err(fmt, args...) \
	printk(KERN_ERR "%s:%d: " fmt "\n", __func__, __LINE__, ##args)

#define MDEV_MODULE_NAME "exynos-mdev"
#define MAX_GSC_SUBDEV		4
#define MDEV_MAX_NUM	3

#define GSC_OUT_PAD_SINK	0
#define GSC_OUT_PAD_SOURCE	1

#define GSC_CAP_PAD_SINK	0
#define GSC_CAP_PAD_SOURCE	1

#define FLITE_PAD_SINK		0
#define FLITE_PAD_SOURCE_PREV	1
#define FLITE_PAD_SOURCE_CAMCORD	2
#define FLITE_PAD_SOURCE_MEM		3
#define FLITE_PADS_NUM		4

#define CSIS_PAD_SINK		0
#define CSIS_PAD_SOURCE		1
#define CSIS_PADS_NUM		2

#define MAX_CAMIF_CLIENTS	2

#define MXR_SUBDEV_NAME		"s5p-mixer"

#define GSC_MODULE_NAME			"exynos-gsc"
#define GSC_SUBDEV_NAME			"exynos-gsc-sd"
#define FIMD_MODULE_NAME		"s5p-fimd1"
#define FIMD_ENTITY_NAME		"s3c-fb-window"
#define FLITE_MODULE_NAME		"exynos-fimc-lite"
#define CSIS_MODULE_NAME		"s5p-mipi-csis"

#define GSC_CAP_GRP_ID			(1 << 0)
#define FLITE_GRP_ID			(1 << 1)
#define CSIS_GRP_ID			(1 << 2)
#define SENSOR_GRP_ID			(1 << 3)
#define FIMD_GRP_ID			(1 << 4)

#define SENSOR_MAX_ENTITIES		MAX_CAMIF_CLIENTS
#define FLITE_MAX_ENTITIES		2
#define CSIS_MAX_ENTITIES		2

enum mdev_node {
	MDEV_OUTPUT,
	MDEV_CAPTURE,
	MDEV_ISP,
};

enum mxr_data_from {
	FROM_GSC_SD,
	FROM_MXR_VD,
};

struct exynos_media_ops {
	int (*power_off)(struct v4l2_subdev *sd);
};

struct exynos_entity_data {
	const struct exynos_media_ops *media_ops;
	enum mxr_data_from mxr_data_from;
};

/**
 * struct exynos_md - Exynos media device information
 * @media_dev: top level media device
 * @v4l2_dev: top level v4l2_device holding up the subdevs
 * @pdev: platform device this media device is hooked up into
 * @slock: spinlock protecting @sensor array
 * @id: media device IDs
 * @gsc_sd: each pointer of g-scaler's subdev array
 */
struct exynos_md {
	struct media_device	media_dev;
	struct v4l2_device	v4l2_dev;
	struct platform_device	*pdev;
	struct v4l2_subdev	*gsc_sd[MAX_GSC_SUBDEV];
	struct v4l2_subdev	*gsc_cap_sd[MAX_GSC_SUBDEV];
	struct v4l2_subdev	*csis_sd[CSIS_MAX_ENTITIES];
	struct v4l2_subdev	*flite_sd[FLITE_MAX_ENTITIES];
	struct v4l2_subdev	*sensor_sd[SENSOR_MAX_ENTITIES];
	u16			id;
	bool			is_flite_on;
	spinlock_t slock;
};

static int dummy_callback(struct device *dev, void *md)
{
	/* non-zero return stops iteration */
	return -1;
}

static inline void *module_name_to_driver_data(char *module_name)
{
	struct device_driver *drv;
	struct device *dev;
	void *driver_data;

	drv = driver_find(module_name, &platform_bus_type);
	if (drv) {
		dev = driver_find_device(drv, NULL, NULL, dummy_callback);
		driver_data = dev_get_drvdata(dev);
		put_driver(drv);
		return driver_data;
	} else
		return NULL;
}

/* print entity information for debug*/
static inline void entity_info_print(struct media_entity *me, struct device *dev)
{
	u16 num_pads = me->num_pads;
	u16 num_links = me->num_links;
	int i;

	dev_dbg(dev, "entity name : %s\n", me->name);
	dev_dbg(dev, "number of pads = %d\n", num_pads);
	for (i = 0; i < num_pads; ++i) {
		dev_dbg(dev, "pad[%d] flag : %s\n", i,
			(me->pads[i].flags == 1) ? "SINK" : "SOURCE");
	}

	dev_dbg(dev, "number of links = %d\n", num_links);

	for (i = 0; i < num_links; ++i) {
		dev_dbg(dev, "link[%d] info  =  ", i);
		dev_dbg(dev, "%s : %s[%d]  --->  %s : %s[%d]\n",
			me->links[i].source->entity->name,
			me->links[i].source->flags == 1 ? "SINK" : "SOURCE",
			me->links[i].source->index,
			me->links[i].sink->entity->name,
			me->links[i].sink->flags == 1 ? "SINK" : "SOURCE",
			me->links[i].sink->index);
	}
}
#endif