1caab277bSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2f76ee892STomi Valkeinen /*
3f76ee892STomi Valkeinen  * Copyright (C) 2009 Nokia Corporation
4f76ee892STomi Valkeinen  * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com>
5f76ee892STomi Valkeinen  *
6f76ee892STomi Valkeinen  * Some code and ideas taken from drivers/video/omap/ driver
7f76ee892STomi Valkeinen  * by Imre Deak.
8f76ee892STomi Valkeinen  */
9f76ee892STomi Valkeinen 
10f76ee892STomi Valkeinen #define DSS_SUBSYS_NAME "OVERLAY"
11f76ee892STomi Valkeinen 
12f76ee892STomi Valkeinen #include <linux/module.h>
13f76ee892STomi Valkeinen #include <linux/err.h>
14f76ee892STomi Valkeinen #include <linux/sysfs.h>
15f76ee892STomi Valkeinen #include <linux/kobject.h>
16f76ee892STomi Valkeinen #include <linux/platform_device.h>
17f76ee892STomi Valkeinen 
1862d9e44eSPeter Ujfalusi #include <video/omapfb_dss.h>
19f76ee892STomi Valkeinen 
20f76ee892STomi Valkeinen #include "dss.h"
21f76ee892STomi Valkeinen #include "dss_features.h"
22f76ee892STomi Valkeinen 
23f76ee892STomi Valkeinen static ssize_t overlay_name_show(struct omap_overlay *ovl, char *buf)
24f76ee892STomi Valkeinen {
25f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%s\n", ovl->name);
26f76ee892STomi Valkeinen }
27f76ee892STomi Valkeinen 
28f76ee892STomi Valkeinen static ssize_t overlay_manager_show(struct omap_overlay *ovl, char *buf)
29f76ee892STomi Valkeinen {
30f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%s\n",
31f76ee892STomi Valkeinen 			ovl->manager ? ovl->manager->name : "<none>");
32f76ee892STomi Valkeinen }
33f76ee892STomi Valkeinen 
34f76ee892STomi Valkeinen static ssize_t overlay_manager_store(struct omap_overlay *ovl, const char *buf,
35f76ee892STomi Valkeinen 		size_t size)
36f76ee892STomi Valkeinen {
37f76ee892STomi Valkeinen 	int i, r;
38f76ee892STomi Valkeinen 	struct omap_overlay_manager *mgr = NULL;
39f76ee892STomi Valkeinen 	struct omap_overlay_manager *old_mgr;
40f76ee892STomi Valkeinen 	int len = size;
41f76ee892STomi Valkeinen 
42f76ee892STomi Valkeinen 	if (buf[size-1] == '\n')
43f76ee892STomi Valkeinen 		--len;
44f76ee892STomi Valkeinen 
45f76ee892STomi Valkeinen 	if (len > 0) {
46f76ee892STomi Valkeinen 		for (i = 0; i < omap_dss_get_num_overlay_managers(); ++i) {
47f76ee892STomi Valkeinen 			mgr = omap_dss_get_overlay_manager(i);
48f76ee892STomi Valkeinen 
49f76ee892STomi Valkeinen 			if (sysfs_streq(buf, mgr->name))
50f76ee892STomi Valkeinen 				break;
51f76ee892STomi Valkeinen 
52f76ee892STomi Valkeinen 			mgr = NULL;
53f76ee892STomi Valkeinen 		}
54f76ee892STomi Valkeinen 	}
55f76ee892STomi Valkeinen 
56f76ee892STomi Valkeinen 	if (len > 0 && mgr == NULL)
57f76ee892STomi Valkeinen 		return -EINVAL;
58f76ee892STomi Valkeinen 
59f76ee892STomi Valkeinen 	if (mgr)
60f76ee892STomi Valkeinen 		DSSDBG("manager %s found\n", mgr->name);
61f76ee892STomi Valkeinen 
62f76ee892STomi Valkeinen 	if (mgr == ovl->manager)
63f76ee892STomi Valkeinen 		return size;
64f76ee892STomi Valkeinen 
65f76ee892STomi Valkeinen 	old_mgr = ovl->manager;
66f76ee892STomi Valkeinen 
67f76ee892STomi Valkeinen 	r = dispc_runtime_get();
68f76ee892STomi Valkeinen 	if (r)
69f76ee892STomi Valkeinen 		return r;
70f76ee892STomi Valkeinen 
71f76ee892STomi Valkeinen 	/* detach old manager */
72f76ee892STomi Valkeinen 	if (old_mgr) {
73f76ee892STomi Valkeinen 		r = ovl->unset_manager(ovl);
74f76ee892STomi Valkeinen 		if (r) {
75f76ee892STomi Valkeinen 			DSSERR("detach failed\n");
76f76ee892STomi Valkeinen 			goto err;
77f76ee892STomi Valkeinen 		}
78f76ee892STomi Valkeinen 
79f76ee892STomi Valkeinen 		r = old_mgr->apply(old_mgr);
80f76ee892STomi Valkeinen 		if (r)
81f76ee892STomi Valkeinen 			goto err;
82f76ee892STomi Valkeinen 	}
83f76ee892STomi Valkeinen 
84f76ee892STomi Valkeinen 	if (mgr) {
85f76ee892STomi Valkeinen 		r = ovl->set_manager(ovl, mgr);
86f76ee892STomi Valkeinen 		if (r) {
87f76ee892STomi Valkeinen 			DSSERR("Failed to attach overlay\n");
88f76ee892STomi Valkeinen 			goto err;
89f76ee892STomi Valkeinen 		}
90f76ee892STomi Valkeinen 
91f76ee892STomi Valkeinen 		r = mgr->apply(mgr);
92f76ee892STomi Valkeinen 		if (r)
93f76ee892STomi Valkeinen 			goto err;
94f76ee892STomi Valkeinen 	}
95f76ee892STomi Valkeinen 
96f76ee892STomi Valkeinen 	dispc_runtime_put();
97f76ee892STomi Valkeinen 
98f76ee892STomi Valkeinen 	return size;
99f76ee892STomi Valkeinen 
100f76ee892STomi Valkeinen err:
101f76ee892STomi Valkeinen 	dispc_runtime_put();
102f76ee892STomi Valkeinen 	return r;
103f76ee892STomi Valkeinen }
104f76ee892STomi Valkeinen 
105f76ee892STomi Valkeinen static ssize_t overlay_input_size_show(struct omap_overlay *ovl, char *buf)
106f76ee892STomi Valkeinen {
107f76ee892STomi Valkeinen 	struct omap_overlay_info info;
108f76ee892STomi Valkeinen 
109f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
110f76ee892STomi Valkeinen 
111f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d,%d\n",
112f76ee892STomi Valkeinen 			info.width, info.height);
113f76ee892STomi Valkeinen }
114f76ee892STomi Valkeinen 
115f76ee892STomi Valkeinen static ssize_t overlay_screen_width_show(struct omap_overlay *ovl, char *buf)
116f76ee892STomi Valkeinen {
117f76ee892STomi Valkeinen 	struct omap_overlay_info info;
118f76ee892STomi Valkeinen 
119f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
120f76ee892STomi Valkeinen 
121f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d\n", info.screen_width);
122f76ee892STomi Valkeinen }
123f76ee892STomi Valkeinen 
124f76ee892STomi Valkeinen static ssize_t overlay_position_show(struct omap_overlay *ovl, char *buf)
125f76ee892STomi Valkeinen {
126f76ee892STomi Valkeinen 	struct omap_overlay_info info;
127f76ee892STomi Valkeinen 
128f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
129f76ee892STomi Valkeinen 
130f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d,%d\n",
131f76ee892STomi Valkeinen 			info.pos_x, info.pos_y);
132f76ee892STomi Valkeinen }
133f76ee892STomi Valkeinen 
134f76ee892STomi Valkeinen static ssize_t overlay_position_store(struct omap_overlay *ovl,
135f76ee892STomi Valkeinen 		const char *buf, size_t size)
136f76ee892STomi Valkeinen {
137f76ee892STomi Valkeinen 	int r;
138f76ee892STomi Valkeinen 	char *last;
139f76ee892STomi Valkeinen 	struct omap_overlay_info info;
140f76ee892STomi Valkeinen 
141f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
142f76ee892STomi Valkeinen 
143f76ee892STomi Valkeinen 	info.pos_x = simple_strtoul(buf, &last, 10);
144f76ee892STomi Valkeinen 	++last;
145f76ee892STomi Valkeinen 	if (last - buf >= size)
146f76ee892STomi Valkeinen 		return -EINVAL;
147f76ee892STomi Valkeinen 
148f76ee892STomi Valkeinen 	info.pos_y = simple_strtoul(last, &last, 10);
149f76ee892STomi Valkeinen 
150f76ee892STomi Valkeinen 	r = ovl->set_overlay_info(ovl, &info);
151f76ee892STomi Valkeinen 	if (r)
152f76ee892STomi Valkeinen 		return r;
153f76ee892STomi Valkeinen 
154f76ee892STomi Valkeinen 	if (ovl->manager) {
155f76ee892STomi Valkeinen 		r = ovl->manager->apply(ovl->manager);
156f76ee892STomi Valkeinen 		if (r)
157f76ee892STomi Valkeinen 			return r;
158f76ee892STomi Valkeinen 	}
159f76ee892STomi Valkeinen 
160f76ee892STomi Valkeinen 	return size;
161f76ee892STomi Valkeinen }
162f76ee892STomi Valkeinen 
163f76ee892STomi Valkeinen static ssize_t overlay_output_size_show(struct omap_overlay *ovl, char *buf)
164f76ee892STomi Valkeinen {
165f76ee892STomi Valkeinen 	struct omap_overlay_info info;
166f76ee892STomi Valkeinen 
167f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
168f76ee892STomi Valkeinen 
169f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d,%d\n",
170f76ee892STomi Valkeinen 			info.out_width, info.out_height);
171f76ee892STomi Valkeinen }
172f76ee892STomi Valkeinen 
173f76ee892STomi Valkeinen static ssize_t overlay_output_size_store(struct omap_overlay *ovl,
174f76ee892STomi Valkeinen 		const char *buf, size_t size)
175f76ee892STomi Valkeinen {
176f76ee892STomi Valkeinen 	int r;
177f76ee892STomi Valkeinen 	char *last;
178f76ee892STomi Valkeinen 	struct omap_overlay_info info;
179f76ee892STomi Valkeinen 
180f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
181f76ee892STomi Valkeinen 
182f76ee892STomi Valkeinen 	info.out_width = simple_strtoul(buf, &last, 10);
183f76ee892STomi Valkeinen 	++last;
184f76ee892STomi Valkeinen 	if (last - buf >= size)
185f76ee892STomi Valkeinen 		return -EINVAL;
186f76ee892STomi Valkeinen 
187f76ee892STomi Valkeinen 	info.out_height = simple_strtoul(last, &last, 10);
188f76ee892STomi Valkeinen 
189f76ee892STomi Valkeinen 	r = ovl->set_overlay_info(ovl, &info);
190f76ee892STomi Valkeinen 	if (r)
191f76ee892STomi Valkeinen 		return r;
192f76ee892STomi Valkeinen 
193f76ee892STomi Valkeinen 	if (ovl->manager) {
194f76ee892STomi Valkeinen 		r = ovl->manager->apply(ovl->manager);
195f76ee892STomi Valkeinen 		if (r)
196f76ee892STomi Valkeinen 			return r;
197f76ee892STomi Valkeinen 	}
198f76ee892STomi Valkeinen 
199f76ee892STomi Valkeinen 	return size;
200f76ee892STomi Valkeinen }
201f76ee892STomi Valkeinen 
202f76ee892STomi Valkeinen static ssize_t overlay_enabled_show(struct omap_overlay *ovl, char *buf)
203f76ee892STomi Valkeinen {
204f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d\n", ovl->is_enabled(ovl));
205f76ee892STomi Valkeinen }
206f76ee892STomi Valkeinen 
207f76ee892STomi Valkeinen static ssize_t overlay_enabled_store(struct omap_overlay *ovl, const char *buf,
208f76ee892STomi Valkeinen 		size_t size)
209f76ee892STomi Valkeinen {
210f76ee892STomi Valkeinen 	int r;
211f76ee892STomi Valkeinen 	bool enable;
212f76ee892STomi Valkeinen 
213f76ee892STomi Valkeinen 	r = strtobool(buf, &enable);
214f76ee892STomi Valkeinen 	if (r)
215f76ee892STomi Valkeinen 		return r;
216f76ee892STomi Valkeinen 
217f76ee892STomi Valkeinen 	if (enable)
218f76ee892STomi Valkeinen 		r = ovl->enable(ovl);
219f76ee892STomi Valkeinen 	else
220f76ee892STomi Valkeinen 		r = ovl->disable(ovl);
221f76ee892STomi Valkeinen 
222f76ee892STomi Valkeinen 	if (r)
223f76ee892STomi Valkeinen 		return r;
224f76ee892STomi Valkeinen 
225f76ee892STomi Valkeinen 	return size;
226f76ee892STomi Valkeinen }
227f76ee892STomi Valkeinen 
228f76ee892STomi Valkeinen static ssize_t overlay_global_alpha_show(struct omap_overlay *ovl, char *buf)
229f76ee892STomi Valkeinen {
230f76ee892STomi Valkeinen 	struct omap_overlay_info info;
231f76ee892STomi Valkeinen 
232f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
233f76ee892STomi Valkeinen 
234f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d\n",
235f76ee892STomi Valkeinen 			info.global_alpha);
236f76ee892STomi Valkeinen }
237f76ee892STomi Valkeinen 
238f76ee892STomi Valkeinen static ssize_t overlay_global_alpha_store(struct omap_overlay *ovl,
239f76ee892STomi Valkeinen 		const char *buf, size_t size)
240f76ee892STomi Valkeinen {
241f76ee892STomi Valkeinen 	int r;
242f76ee892STomi Valkeinen 	u8 alpha;
243f76ee892STomi Valkeinen 	struct omap_overlay_info info;
244f76ee892STomi Valkeinen 
245f76ee892STomi Valkeinen 	if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
246f76ee892STomi Valkeinen 		return -ENODEV;
247f76ee892STomi Valkeinen 
248f76ee892STomi Valkeinen 	r = kstrtou8(buf, 0, &alpha);
249f76ee892STomi Valkeinen 	if (r)
250f76ee892STomi Valkeinen 		return r;
251f76ee892STomi Valkeinen 
252f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
253f76ee892STomi Valkeinen 
254f76ee892STomi Valkeinen 	info.global_alpha = alpha;
255f76ee892STomi Valkeinen 
256f76ee892STomi Valkeinen 	r = ovl->set_overlay_info(ovl, &info);
257f76ee892STomi Valkeinen 	if (r)
258f76ee892STomi Valkeinen 		return r;
259f76ee892STomi Valkeinen 
260f76ee892STomi Valkeinen 	if (ovl->manager) {
261f76ee892STomi Valkeinen 		r = ovl->manager->apply(ovl->manager);
262f76ee892STomi Valkeinen 		if (r)
263f76ee892STomi Valkeinen 			return r;
264f76ee892STomi Valkeinen 	}
265f76ee892STomi Valkeinen 
266f76ee892STomi Valkeinen 	return size;
267f76ee892STomi Valkeinen }
268f76ee892STomi Valkeinen 
269f76ee892STomi Valkeinen static ssize_t overlay_pre_mult_alpha_show(struct omap_overlay *ovl,
270f76ee892STomi Valkeinen 		char *buf)
271f76ee892STomi Valkeinen {
272f76ee892STomi Valkeinen 	struct omap_overlay_info info;
273f76ee892STomi Valkeinen 
274f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
275f76ee892STomi Valkeinen 
276f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d\n",
277f76ee892STomi Valkeinen 			info.pre_mult_alpha);
278f76ee892STomi Valkeinen }
279f76ee892STomi Valkeinen 
280f76ee892STomi Valkeinen static ssize_t overlay_pre_mult_alpha_store(struct omap_overlay *ovl,
281f76ee892STomi Valkeinen 		const char *buf, size_t size)
282f76ee892STomi Valkeinen {
283f76ee892STomi Valkeinen 	int r;
284f76ee892STomi Valkeinen 	u8 alpha;
285f76ee892STomi Valkeinen 	struct omap_overlay_info info;
286f76ee892STomi Valkeinen 
287f76ee892STomi Valkeinen 	if ((ovl->caps & OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA) == 0)
288f76ee892STomi Valkeinen 		return -ENODEV;
289f76ee892STomi Valkeinen 
290f76ee892STomi Valkeinen 	r = kstrtou8(buf, 0, &alpha);
291f76ee892STomi Valkeinen 	if (r)
292f76ee892STomi Valkeinen 		return r;
293f76ee892STomi Valkeinen 
294f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
295f76ee892STomi Valkeinen 
296f76ee892STomi Valkeinen 	info.pre_mult_alpha = alpha;
297f76ee892STomi Valkeinen 
298f76ee892STomi Valkeinen 	r = ovl->set_overlay_info(ovl, &info);
299f76ee892STomi Valkeinen 	if (r)
300f76ee892STomi Valkeinen 		return r;
301f76ee892STomi Valkeinen 
302f76ee892STomi Valkeinen 	if (ovl->manager) {
303f76ee892STomi Valkeinen 		r = ovl->manager->apply(ovl->manager);
304f76ee892STomi Valkeinen 		if (r)
305f76ee892STomi Valkeinen 			return r;
306f76ee892STomi Valkeinen 	}
307f76ee892STomi Valkeinen 
308f76ee892STomi Valkeinen 	return size;
309f76ee892STomi Valkeinen }
310f76ee892STomi Valkeinen 
311f76ee892STomi Valkeinen static ssize_t overlay_zorder_show(struct omap_overlay *ovl, char *buf)
312f76ee892STomi Valkeinen {
313f76ee892STomi Valkeinen 	struct omap_overlay_info info;
314f76ee892STomi Valkeinen 
315f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
316f76ee892STomi Valkeinen 
317f76ee892STomi Valkeinen 	return snprintf(buf, PAGE_SIZE, "%d\n", info.zorder);
318f76ee892STomi Valkeinen }
319f76ee892STomi Valkeinen 
320f76ee892STomi Valkeinen static ssize_t overlay_zorder_store(struct omap_overlay *ovl,
321f76ee892STomi Valkeinen 		const char *buf, size_t size)
322f76ee892STomi Valkeinen {
323f76ee892STomi Valkeinen 	int r;
324f76ee892STomi Valkeinen 	u8 zorder;
325f76ee892STomi Valkeinen 	struct omap_overlay_info info;
326f76ee892STomi Valkeinen 
327f76ee892STomi Valkeinen 	if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0)
328f76ee892STomi Valkeinen 		return -ENODEV;
329f76ee892STomi Valkeinen 
330f76ee892STomi Valkeinen 	r = kstrtou8(buf, 0, &zorder);
331f76ee892STomi Valkeinen 	if (r)
332f76ee892STomi Valkeinen 		return r;
333f76ee892STomi Valkeinen 
334f76ee892STomi Valkeinen 	ovl->get_overlay_info(ovl, &info);
335f76ee892STomi Valkeinen 
336f76ee892STomi Valkeinen 	info.zorder = zorder;
337f76ee892STomi Valkeinen 
338f76ee892STomi Valkeinen 	r = ovl->set_overlay_info(ovl, &info);
339f76ee892STomi Valkeinen 	if (r)
340f76ee892STomi Valkeinen 		return r;
341f76ee892STomi Valkeinen 
342f76ee892STomi Valkeinen 	if (ovl->manager) {
343f76ee892STomi Valkeinen 		r = ovl->manager->apply(ovl->manager);
344f76ee892STomi Valkeinen 		if (r)
345f76ee892STomi Valkeinen 			return r;
346f76ee892STomi Valkeinen 	}
347f76ee892STomi Valkeinen 
348f76ee892STomi Valkeinen 	return size;
349f76ee892STomi Valkeinen }
350f76ee892STomi Valkeinen 
351f76ee892STomi Valkeinen struct overlay_attribute {
352f76ee892STomi Valkeinen 	struct attribute attr;
353f76ee892STomi Valkeinen 	ssize_t (*show)(struct omap_overlay *, char *);
354f76ee892STomi Valkeinen 	ssize_t	(*store)(struct omap_overlay *, const char *, size_t);
355f76ee892STomi Valkeinen };
356f76ee892STomi Valkeinen 
357f76ee892STomi Valkeinen #define OVERLAY_ATTR(_name, _mode, _show, _store) \
358f76ee892STomi Valkeinen 	struct overlay_attribute overlay_attr_##_name = \
359f76ee892STomi Valkeinen 	__ATTR(_name, _mode, _show, _store)
360f76ee892STomi Valkeinen 
361f76ee892STomi Valkeinen static OVERLAY_ATTR(name, S_IRUGO, overlay_name_show, NULL);
362f76ee892STomi Valkeinen static OVERLAY_ATTR(manager, S_IRUGO|S_IWUSR,
363f76ee892STomi Valkeinen 		overlay_manager_show, overlay_manager_store);
364f76ee892STomi Valkeinen static OVERLAY_ATTR(input_size, S_IRUGO, overlay_input_size_show, NULL);
365f76ee892STomi Valkeinen static OVERLAY_ATTR(screen_width, S_IRUGO, overlay_screen_width_show, NULL);
366f76ee892STomi Valkeinen static OVERLAY_ATTR(position, S_IRUGO|S_IWUSR,
367f76ee892STomi Valkeinen 		overlay_position_show, overlay_position_store);
368f76ee892STomi Valkeinen static OVERLAY_ATTR(output_size, S_IRUGO|S_IWUSR,
369f76ee892STomi Valkeinen 		overlay_output_size_show, overlay_output_size_store);
370f76ee892STomi Valkeinen static OVERLAY_ATTR(enabled, S_IRUGO|S_IWUSR,
371f76ee892STomi Valkeinen 		overlay_enabled_show, overlay_enabled_store);
372f76ee892STomi Valkeinen static OVERLAY_ATTR(global_alpha, S_IRUGO|S_IWUSR,
373f76ee892STomi Valkeinen 		overlay_global_alpha_show, overlay_global_alpha_store);
374f76ee892STomi Valkeinen static OVERLAY_ATTR(pre_mult_alpha, S_IRUGO|S_IWUSR,
375f76ee892STomi Valkeinen 		overlay_pre_mult_alpha_show,
376f76ee892STomi Valkeinen 		overlay_pre_mult_alpha_store);
377f76ee892STomi Valkeinen static OVERLAY_ATTR(zorder, S_IRUGO|S_IWUSR,
378f76ee892STomi Valkeinen 		overlay_zorder_show, overlay_zorder_store);
379f76ee892STomi Valkeinen 
380f76ee892STomi Valkeinen static struct attribute *overlay_sysfs_attrs[] = {
381f76ee892STomi Valkeinen 	&overlay_attr_name.attr,
382f76ee892STomi Valkeinen 	&overlay_attr_manager.attr,
383f76ee892STomi Valkeinen 	&overlay_attr_input_size.attr,
384f76ee892STomi Valkeinen 	&overlay_attr_screen_width.attr,
385f76ee892STomi Valkeinen 	&overlay_attr_position.attr,
386f76ee892STomi Valkeinen 	&overlay_attr_output_size.attr,
387f76ee892STomi Valkeinen 	&overlay_attr_enabled.attr,
388f76ee892STomi Valkeinen 	&overlay_attr_global_alpha.attr,
389f76ee892STomi Valkeinen 	&overlay_attr_pre_mult_alpha.attr,
390f76ee892STomi Valkeinen 	&overlay_attr_zorder.attr,
391f76ee892STomi Valkeinen 	NULL
392f76ee892STomi Valkeinen };
393f76ee892STomi Valkeinen 
394f76ee892STomi Valkeinen static ssize_t overlay_attr_show(struct kobject *kobj, struct attribute *attr,
395f76ee892STomi Valkeinen 		char *buf)
396f76ee892STomi Valkeinen {
397f76ee892STomi Valkeinen 	struct omap_overlay *overlay;
398f76ee892STomi Valkeinen 	struct overlay_attribute *overlay_attr;
399f76ee892STomi Valkeinen 
400f76ee892STomi Valkeinen 	overlay = container_of(kobj, struct omap_overlay, kobj);
401f76ee892STomi Valkeinen 	overlay_attr = container_of(attr, struct overlay_attribute, attr);
402f76ee892STomi Valkeinen 
403f76ee892STomi Valkeinen 	if (!overlay_attr->show)
404f76ee892STomi Valkeinen 		return -ENOENT;
405f76ee892STomi Valkeinen 
406f76ee892STomi Valkeinen 	return overlay_attr->show(overlay, buf);
407f76ee892STomi Valkeinen }
408f76ee892STomi Valkeinen 
409f76ee892STomi Valkeinen static ssize_t overlay_attr_store(struct kobject *kobj, struct attribute *attr,
410f76ee892STomi Valkeinen 		const char *buf, size_t size)
411f76ee892STomi Valkeinen {
412f76ee892STomi Valkeinen 	struct omap_overlay *overlay;
413f76ee892STomi Valkeinen 	struct overlay_attribute *overlay_attr;
414f76ee892STomi Valkeinen 
415f76ee892STomi Valkeinen 	overlay = container_of(kobj, struct omap_overlay, kobj);
416f76ee892STomi Valkeinen 	overlay_attr = container_of(attr, struct overlay_attribute, attr);
417f76ee892STomi Valkeinen 
418f76ee892STomi Valkeinen 	if (!overlay_attr->store)
419f76ee892STomi Valkeinen 		return -ENOENT;
420f76ee892STomi Valkeinen 
421f76ee892STomi Valkeinen 	return overlay_attr->store(overlay, buf, size);
422f76ee892STomi Valkeinen }
423f76ee892STomi Valkeinen 
424f76ee892STomi Valkeinen static const struct sysfs_ops overlay_sysfs_ops = {
425f76ee892STomi Valkeinen 	.show = overlay_attr_show,
426f76ee892STomi Valkeinen 	.store = overlay_attr_store,
427f76ee892STomi Valkeinen };
428f76ee892STomi Valkeinen 
429f76ee892STomi Valkeinen static struct kobj_type overlay_ktype = {
430f76ee892STomi Valkeinen 	.sysfs_ops = &overlay_sysfs_ops,
431f76ee892STomi Valkeinen 	.default_attrs = overlay_sysfs_attrs,
432f76ee892STomi Valkeinen };
433f76ee892STomi Valkeinen 
434f76ee892STomi Valkeinen int dss_overlay_kobj_init(struct omap_overlay *ovl,
435f76ee892STomi Valkeinen 		struct platform_device *pdev)
436f76ee892STomi Valkeinen {
437f76ee892STomi Valkeinen 	return kobject_init_and_add(&ovl->kobj, &overlay_ktype,
438f76ee892STomi Valkeinen 			&pdev->dev.kobj, "overlay%d", ovl->id);
439f76ee892STomi Valkeinen }
440f76ee892STomi Valkeinen 
441f76ee892STomi Valkeinen void dss_overlay_kobj_uninit(struct omap_overlay *ovl)
442f76ee892STomi Valkeinen {
443f76ee892STomi Valkeinen 	kobject_del(&ovl->kobj);
444f76ee892STomi Valkeinen 	kobject_put(&ovl->kobj);
445f76ee892STomi Valkeinen }
446