blob: b2db2084afd4dde0bbe6e25b15f2176101e92423 [file] [log] [blame]
Deva Ramasubramanian1efb9952012-07-31 11:11:15 -07001/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
2*
3* This program is free software; you can redistribute it and/or modify
4* it under the terms of the GNU General Public License version 2 and
5* only version 2 as published by the Free Software Foundation.
6*
7* This program is distributed in the hope that it will be useful,
8* but WITHOUT ANY WARRANTY; without even the implied warranty of
9* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10* GNU General Public License for more details.
11*
12*/
13#include <linux/list.h>
14#include <linux/msm_mdp.h>
15#include <media/videobuf2-core.h>
16
Deva Ramasubramaniana9c2ed12012-07-31 11:11:46 -070017#include "enc-subdev.h"
Deva Ramasubramanian1efb9952012-07-31 11:11:15 -070018#include "mdp-subdev.h"
19#include "wfd-util.h"
20
21struct mdp_buf_queue {
22 struct mdp_buf_info mdp_buf_info;
23 struct list_head node;
24};
25
26struct mdp_instance {
27 struct mdp_buf_queue mdp_bufs;
28 struct mutex mutex;
29};
30
31int mdp_init(struct v4l2_subdev *sd, u32 val)
32{
33 return 0;
34}
35int mdp_open(struct v4l2_subdev *sd, void *arg)
36{
37 struct mdp_instance *inst = kzalloc(sizeof(struct mdp_instance),
38 GFP_KERNEL);
39 void **cookie = (void **)arg;
40 int rc = 0;
41
42 if (!inst) {
43 WFD_MSG_ERR("Out of memory\n");
44 return -ENOMEM;
45 }
46
47 INIT_LIST_HEAD(&inst->mdp_bufs.node);
48 mutex_init(&inst->mutex);
49 *cookie = inst;
50 return rc;
51}
52
53int mdp_start(struct v4l2_subdev *sd, void *arg)
54{
55 return 0;
56}
57int mdp_stop(struct v4l2_subdev *sd, void *arg)
58{
59 return 0;
60}
61int mdp_close(struct v4l2_subdev *sd, void *arg)
62{
63 return 0;
64}
65int mdp_q_buffer(struct v4l2_subdev *sd, void *arg)
66{
67 static int foo;
68 int rc = 0;
69 struct mdp_buf_info *binfo = arg;
70 struct mdp_instance *inst = NULL;
71
72 if (!binfo || !binfo->inst || !binfo->cookie) {
73 WFD_MSG_ERR("Invalid argument\n");
74 return -EINVAL;
75 }
76
77
78 inst = binfo->inst;
79 if (binfo->kvaddr) {
80 struct mdp_buf_queue *new_entry = kzalloc(sizeof(*new_entry),
81 GFP_KERNEL);
82 memset((void *)binfo->kvaddr, foo++, 1024);
83 new_entry->mdp_buf_info = *binfo;
84 mutex_lock(&inst->mutex);
85 list_add_tail(&new_entry->node, &inst->mdp_bufs.node);
86 mutex_unlock(&inst->mutex);
87 WFD_MSG_DBG("Queue %p with cookie %p\n",
88 (void *)binfo->paddr, (void *)binfo->cookie);
89 } else {
90 rc = -EINVAL;
91 }
92
93 return rc;
94}
95int mdp_dq_buffer(struct v4l2_subdev *sd, void *arg)
96{
97 struct mdp_buf_info *binfo = arg;
98 struct mdp_buf_queue *head = NULL;
99 struct mdp_instance *inst = NULL;
100
101 inst = binfo->inst;
102
103 while (head == NULL) {
104 mutex_lock(&inst->mutex);
105 if (!list_empty(&inst->mdp_bufs.node))
106 head = list_first_entry(&inst->mdp_bufs.node,
107 struct mdp_buf_queue, node);
108 mutex_unlock(&inst->mutex);
109 }
110
111 if (head == NULL)
112 return -ENOBUFS;
113
114 mutex_lock(&inst->mutex);
115 list_del(&head->node);
116 mutex_unlock(&inst->mutex);
117
118 *binfo = head->mdp_buf_info;
119 WFD_MSG_DBG("Dequeue %p with cookie %p\n",
120 (void *)binfo->paddr, (void *)binfo->cookie);
121 return 0;
122
123}
124int mdp_set_prop(struct v4l2_subdev *sd, void *arg)
125{
126 return 0;
127}
Deva Ramasubramaniana9c2ed12012-07-31 11:11:46 -0700128
129int mdp_mmap(struct v4l2_subdev *sd, void *arg)
130{
131 int rc = 0;
132 struct mem_region_map *mmap = arg;
133 struct mem_region *mregion;
134
135 mregion = mmap->mregion;
136 mregion->paddr = mregion->kvaddr;
137 return rc;
138}
139
140int mdp_munmap(struct v4l2_subdev *sd, void *arg)
141{
142 /* Whatever */
143 return 0;
144}
145
Deva Ramasubramanian1efb9952012-07-31 11:11:15 -0700146long mdp_ioctl(struct v4l2_subdev *sd, unsigned int cmd, void *arg)
147{
148 int rc = 0;
149 if (!sd) {
150 WFD_MSG_ERR("Invalid arguments\n");
151 return -EINVAL;
152 }
153 switch (cmd) {
154 case MDP_Q_BUFFER:
155 rc = mdp_q_buffer(sd, arg);
156 break;
157 case MDP_DQ_BUFFER:
158 rc = mdp_dq_buffer(sd, arg);
159 break;
160 case MDP_OPEN:
161 rc = mdp_open(sd, arg);
162 break;
163 case MDP_START:
164 rc = mdp_start(sd, arg);
165 break;
166 case MDP_STOP:
167 rc = mdp_stop(sd, arg);
168 break;
169 case MDP_SET_PROP:
170 rc = mdp_set_prop(sd, arg);
171 break;
172 case MDP_CLOSE:
173 rc = mdp_close(sd, arg);
174 break;
Deva Ramasubramaniana9c2ed12012-07-31 11:11:46 -0700175 case MDP_MMAP:
176 rc = mdp_mmap(sd, arg);
177 break;
178 case MDP_MUNMAP:
179 rc = mdp_munmap(sd, arg);
180 break;
Deva Ramasubramanian1efb9952012-07-31 11:11:15 -0700181 default:
182 WFD_MSG_ERR("IOCTL: %u not supported\n", cmd);
183 rc = -EINVAL;
184 break;
185 }
186 return rc;
187}