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 "MANAGER"
11f76ee892STomi Valkeinen 
12f76ee892STomi Valkeinen #include <linux/kernel.h>
13*ee9fffdcSChristophe JAILLET #include <linux/kstrtox.h>
14f76ee892STomi Valkeinen #include <linux/slab.h>
15f76ee892STomi Valkeinen #include <linux/module.h>
16f76ee892STomi Valkeinen #include <linux/platform_device.h>
17f76ee892STomi Valkeinen #include <linux/jiffies.h>
18f76ee892STomi Valkeinen 
1962d9e44eSPeter Ujfalusi #include <video/omapfb_dss.h>
20f76ee892STomi Valkeinen 
21f76ee892STomi Valkeinen #include "dss.h"
22f76ee892STomi Valkeinen #include "dss_features.h"
23f76ee892STomi Valkeinen 
manager_name_show(struct omap_overlay_manager * mgr,char * buf)24f76ee892STomi Valkeinen static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf)
25f76ee892STomi Valkeinen {
26cc83ff24SQing Wang 	return sysfs_emit(buf, "%s\n", mgr->name);
27f76ee892STomi Valkeinen }
28f76ee892STomi Valkeinen 
manager_display_show(struct omap_overlay_manager * mgr,char * buf)29f76ee892STomi Valkeinen static ssize_t manager_display_show(struct omap_overlay_manager *mgr, char *buf)
30f76ee892STomi Valkeinen {
31f76ee892STomi Valkeinen 	struct omap_dss_device *dssdev = mgr->get_device(mgr);
32f76ee892STomi Valkeinen 
33cc83ff24SQing Wang 	return sysfs_emit(buf, "%s\n", dssdev ?
34f76ee892STomi Valkeinen 			dssdev->name : "<none>");
35f76ee892STomi Valkeinen }
36f76ee892STomi Valkeinen 
manager_display_match(struct omap_dss_device * dssdev,void * data)37f76ee892STomi Valkeinen static int manager_display_match(struct omap_dss_device *dssdev, void *data)
38f76ee892STomi Valkeinen {
39f76ee892STomi Valkeinen 	const char *str = data;
40f76ee892STomi Valkeinen 
41f76ee892STomi Valkeinen 	return sysfs_streq(dssdev->name, str);
42f76ee892STomi Valkeinen }
43f76ee892STomi Valkeinen 
manager_display_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)44f76ee892STomi Valkeinen static ssize_t manager_display_store(struct omap_overlay_manager *mgr,
45f76ee892STomi Valkeinen 		const char *buf, size_t size)
46f76ee892STomi Valkeinen {
47f76ee892STomi Valkeinen 	int r = 0;
48f76ee892STomi Valkeinen 	size_t len = size;
49f76ee892STomi Valkeinen 	struct omap_dss_device *dssdev = NULL;
50f76ee892STomi Valkeinen 	struct omap_dss_device *old_dssdev;
51f76ee892STomi Valkeinen 
52f76ee892STomi Valkeinen 	if (buf[size-1] == '\n')
53f76ee892STomi Valkeinen 		--len;
54f76ee892STomi Valkeinen 
55f76ee892STomi Valkeinen 	if (len > 0)
56f76ee892STomi Valkeinen 		dssdev = omap_dss_find_device((void *)buf,
57f76ee892STomi Valkeinen 			manager_display_match);
58f76ee892STomi Valkeinen 
59f76ee892STomi Valkeinen 	if (len > 0 && dssdev == NULL)
60f76ee892STomi Valkeinen 		return -EINVAL;
61f76ee892STomi Valkeinen 
62f76ee892STomi Valkeinen 	if (dssdev) {
63f76ee892STomi Valkeinen 		DSSDBG("display %s found\n", dssdev->name);
64f76ee892STomi Valkeinen 
65f76ee892STomi Valkeinen 		if (omapdss_device_is_connected(dssdev)) {
66f76ee892STomi Valkeinen 			DSSERR("new display is already connected\n");
67f76ee892STomi Valkeinen 			r = -EINVAL;
68f76ee892STomi Valkeinen 			goto put_device;
69f76ee892STomi Valkeinen 		}
70f76ee892STomi Valkeinen 
71f76ee892STomi Valkeinen 		if (omapdss_device_is_enabled(dssdev)) {
72f76ee892STomi Valkeinen 			DSSERR("new display is not disabled\n");
73f76ee892STomi Valkeinen 			r = -EINVAL;
74f76ee892STomi Valkeinen 			goto put_device;
75f76ee892STomi Valkeinen 		}
76f76ee892STomi Valkeinen 	}
77f76ee892STomi Valkeinen 
78f76ee892STomi Valkeinen 	old_dssdev = mgr->get_device(mgr);
79f76ee892STomi Valkeinen 	if (old_dssdev) {
80f76ee892STomi Valkeinen 		if (omapdss_device_is_enabled(old_dssdev)) {
81f76ee892STomi Valkeinen 			DSSERR("old display is not disabled\n");
82f76ee892STomi Valkeinen 			r = -EINVAL;
83f76ee892STomi Valkeinen 			goto put_device;
84f76ee892STomi Valkeinen 		}
85f76ee892STomi Valkeinen 
86f76ee892STomi Valkeinen 		old_dssdev->driver->disconnect(old_dssdev);
87f76ee892STomi Valkeinen 	}
88f76ee892STomi Valkeinen 
89f76ee892STomi Valkeinen 	if (dssdev) {
90f76ee892STomi Valkeinen 		r = dssdev->driver->connect(dssdev);
91f76ee892STomi Valkeinen 		if (r) {
92f76ee892STomi Valkeinen 			DSSERR("failed to connect new device\n");
93f76ee892STomi Valkeinen 			goto put_device;
94f76ee892STomi Valkeinen 		}
95f76ee892STomi Valkeinen 
96f76ee892STomi Valkeinen 		old_dssdev = mgr->get_device(mgr);
97f76ee892STomi Valkeinen 		if (old_dssdev != dssdev) {
98f76ee892STomi Valkeinen 			DSSERR("failed to connect device to this manager\n");
99f76ee892STomi Valkeinen 			dssdev->driver->disconnect(dssdev);
100f76ee892STomi Valkeinen 			goto put_device;
101f76ee892STomi Valkeinen 		}
102f76ee892STomi Valkeinen 
103f76ee892STomi Valkeinen 		r = mgr->apply(mgr);
104f76ee892STomi Valkeinen 		if (r) {
105f76ee892STomi Valkeinen 			DSSERR("failed to apply dispc config\n");
106f76ee892STomi Valkeinen 			goto put_device;
107f76ee892STomi Valkeinen 		}
108f76ee892STomi Valkeinen 	}
109f76ee892STomi Valkeinen 
110f76ee892STomi Valkeinen put_device:
111f76ee892STomi Valkeinen 	if (dssdev)
112f76ee892STomi Valkeinen 		omap_dss_put_device(dssdev);
113f76ee892STomi Valkeinen 
114f76ee892STomi Valkeinen 	return r ? r : size;
115f76ee892STomi Valkeinen }
116f76ee892STomi Valkeinen 
manager_default_color_show(struct omap_overlay_manager * mgr,char * buf)117f76ee892STomi Valkeinen static ssize_t manager_default_color_show(struct omap_overlay_manager *mgr,
118f76ee892STomi Valkeinen 					  char *buf)
119f76ee892STomi Valkeinen {
120f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
121f76ee892STomi Valkeinen 
122f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
123f76ee892STomi Valkeinen 
124cc83ff24SQing Wang 	return sysfs_emit(buf, "%#x\n", info.default_color);
125f76ee892STomi Valkeinen }
126f76ee892STomi Valkeinen 
manager_default_color_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)127f76ee892STomi Valkeinen static ssize_t manager_default_color_store(struct omap_overlay_manager *mgr,
128f76ee892STomi Valkeinen 					   const char *buf, size_t size)
129f76ee892STomi Valkeinen {
130f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
131f76ee892STomi Valkeinen 	u32 color;
132f76ee892STomi Valkeinen 	int r;
133f76ee892STomi Valkeinen 
134f76ee892STomi Valkeinen 	r = kstrtouint(buf, 0, &color);
135f76ee892STomi Valkeinen 	if (r)
136f76ee892STomi Valkeinen 		return r;
137f76ee892STomi Valkeinen 
138f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
139f76ee892STomi Valkeinen 
140f76ee892STomi Valkeinen 	info.default_color = color;
141f76ee892STomi Valkeinen 
142f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
143f76ee892STomi Valkeinen 	if (r)
144f76ee892STomi Valkeinen 		return r;
145f76ee892STomi Valkeinen 
146f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
147f76ee892STomi Valkeinen 	if (r)
148f76ee892STomi Valkeinen 		return r;
149f76ee892STomi Valkeinen 
150f76ee892STomi Valkeinen 	return size;
151f76ee892STomi Valkeinen }
152f76ee892STomi Valkeinen 
153f76ee892STomi Valkeinen static const char *trans_key_type_str[] = {
154f76ee892STomi Valkeinen 	"gfx-destination",
155f76ee892STomi Valkeinen 	"video-source",
156f76ee892STomi Valkeinen };
157f76ee892STomi Valkeinen 
manager_trans_key_type_show(struct omap_overlay_manager * mgr,char * buf)158f76ee892STomi Valkeinen static ssize_t manager_trans_key_type_show(struct omap_overlay_manager *mgr,
159f76ee892STomi Valkeinen 					   char *buf)
160f76ee892STomi Valkeinen {
161f76ee892STomi Valkeinen 	enum omap_dss_trans_key_type key_type;
162f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
163f76ee892STomi Valkeinen 
164f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
165f76ee892STomi Valkeinen 
166f76ee892STomi Valkeinen 	key_type = info.trans_key_type;
167f76ee892STomi Valkeinen 	BUG_ON(key_type >= ARRAY_SIZE(trans_key_type_str));
168f76ee892STomi Valkeinen 
169cc83ff24SQing Wang 	return sysfs_emit(buf, "%s\n", trans_key_type_str[key_type]);
170f76ee892STomi Valkeinen }
171f76ee892STomi Valkeinen 
manager_trans_key_type_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)172f76ee892STomi Valkeinen static ssize_t manager_trans_key_type_store(struct omap_overlay_manager *mgr,
173f76ee892STomi Valkeinen 					    const char *buf, size_t size)
174f76ee892STomi Valkeinen {
175f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
176f76ee892STomi Valkeinen 	int r;
177f76ee892STomi Valkeinen 
178b5438493SAndy Shevchenko 	r = sysfs_match_string(trans_key_type_str, buf);
179b5438493SAndy Shevchenko 	if (r < 0)
180b5438493SAndy Shevchenko 		return r;
181f76ee892STomi Valkeinen 
182f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
183f76ee892STomi Valkeinen 
184b5438493SAndy Shevchenko 	info.trans_key_type = r;
185f76ee892STomi Valkeinen 
186f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
187f76ee892STomi Valkeinen 	if (r)
188f76ee892STomi Valkeinen 		return r;
189f76ee892STomi Valkeinen 
190f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
191f76ee892STomi Valkeinen 	if (r)
192f76ee892STomi Valkeinen 		return r;
193f76ee892STomi Valkeinen 
194f76ee892STomi Valkeinen 	return size;
195f76ee892STomi Valkeinen }
196f76ee892STomi Valkeinen 
manager_trans_key_value_show(struct omap_overlay_manager * mgr,char * buf)197f76ee892STomi Valkeinen static ssize_t manager_trans_key_value_show(struct omap_overlay_manager *mgr,
198f76ee892STomi Valkeinen 					    char *buf)
199f76ee892STomi Valkeinen {
200f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
201f76ee892STomi Valkeinen 
202f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
203f76ee892STomi Valkeinen 
204cc83ff24SQing Wang 	return sysfs_emit(buf, "%#x\n", info.trans_key);
205f76ee892STomi Valkeinen }
206f76ee892STomi Valkeinen 
manager_trans_key_value_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)207f76ee892STomi Valkeinen static ssize_t manager_trans_key_value_store(struct omap_overlay_manager *mgr,
208f76ee892STomi Valkeinen 					     const char *buf, size_t size)
209f76ee892STomi Valkeinen {
210f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
211f76ee892STomi Valkeinen 	u32 key_value;
212f76ee892STomi Valkeinen 	int r;
213f76ee892STomi Valkeinen 
214f76ee892STomi Valkeinen 	r = kstrtouint(buf, 0, &key_value);
215f76ee892STomi Valkeinen 	if (r)
216f76ee892STomi Valkeinen 		return r;
217f76ee892STomi Valkeinen 
218f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
219f76ee892STomi Valkeinen 
220f76ee892STomi Valkeinen 	info.trans_key = key_value;
221f76ee892STomi Valkeinen 
222f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
223f76ee892STomi Valkeinen 	if (r)
224f76ee892STomi Valkeinen 		return r;
225f76ee892STomi Valkeinen 
226f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
227f76ee892STomi Valkeinen 	if (r)
228f76ee892STomi Valkeinen 		return r;
229f76ee892STomi Valkeinen 
230f76ee892STomi Valkeinen 	return size;
231f76ee892STomi Valkeinen }
232f76ee892STomi Valkeinen 
manager_trans_key_enabled_show(struct omap_overlay_manager * mgr,char * buf)233f76ee892STomi Valkeinen static ssize_t manager_trans_key_enabled_show(struct omap_overlay_manager *mgr,
234f76ee892STomi Valkeinen 					      char *buf)
235f76ee892STomi Valkeinen {
236f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
237f76ee892STomi Valkeinen 
238f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
239f76ee892STomi Valkeinen 
240cc83ff24SQing Wang 	return sysfs_emit(buf, "%d\n", info.trans_enabled);
241f76ee892STomi Valkeinen }
242f76ee892STomi Valkeinen 
manager_trans_key_enabled_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)243f76ee892STomi Valkeinen static ssize_t manager_trans_key_enabled_store(struct omap_overlay_manager *mgr,
244f76ee892STomi Valkeinen 					       const char *buf, size_t size)
245f76ee892STomi Valkeinen {
246f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
247f76ee892STomi Valkeinen 	bool enable;
248f76ee892STomi Valkeinen 	int r;
249f76ee892STomi Valkeinen 
250*ee9fffdcSChristophe JAILLET 	r = kstrtobool(buf, &enable);
251f76ee892STomi Valkeinen 	if (r)
252f76ee892STomi Valkeinen 		return r;
253f76ee892STomi Valkeinen 
254f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
255f76ee892STomi Valkeinen 
256f76ee892STomi Valkeinen 	info.trans_enabled = enable;
257f76ee892STomi Valkeinen 
258f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
259f76ee892STomi Valkeinen 	if (r)
260f76ee892STomi Valkeinen 		return r;
261f76ee892STomi Valkeinen 
262f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
263f76ee892STomi Valkeinen 	if (r)
264f76ee892STomi Valkeinen 		return r;
265f76ee892STomi Valkeinen 
266f76ee892STomi Valkeinen 	return size;
267f76ee892STomi Valkeinen }
268f76ee892STomi Valkeinen 
manager_alpha_blending_enabled_show(struct omap_overlay_manager * mgr,char * buf)269f76ee892STomi Valkeinen static ssize_t manager_alpha_blending_enabled_show(
270f76ee892STomi Valkeinen 		struct omap_overlay_manager *mgr, char *buf)
271f76ee892STomi Valkeinen {
272f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
273f76ee892STomi Valkeinen 
274f76ee892STomi Valkeinen 	if(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
275f76ee892STomi Valkeinen 		return -ENODEV;
276f76ee892STomi Valkeinen 
277f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
278f76ee892STomi Valkeinen 
279cc83ff24SQing Wang 	return sysfs_emit(buf, "%d\n",
280f76ee892STomi Valkeinen 		info.partial_alpha_enabled);
281f76ee892STomi Valkeinen }
282f76ee892STomi Valkeinen 
manager_alpha_blending_enabled_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)283f76ee892STomi Valkeinen static ssize_t manager_alpha_blending_enabled_store(
284f76ee892STomi Valkeinen 		struct omap_overlay_manager *mgr,
285f76ee892STomi Valkeinen 		const char *buf, size_t size)
286f76ee892STomi Valkeinen {
287f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
288f76ee892STomi Valkeinen 	bool enable;
289f76ee892STomi Valkeinen 	int r;
290f76ee892STomi Valkeinen 
291f76ee892STomi Valkeinen 	if(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
292f76ee892STomi Valkeinen 		return -ENODEV;
293f76ee892STomi Valkeinen 
294*ee9fffdcSChristophe JAILLET 	r = kstrtobool(buf, &enable);
295f76ee892STomi Valkeinen 	if (r)
296f76ee892STomi Valkeinen 		return r;
297f76ee892STomi Valkeinen 
298f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
299f76ee892STomi Valkeinen 
300f76ee892STomi Valkeinen 	info.partial_alpha_enabled = enable;
301f76ee892STomi Valkeinen 
302f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
303f76ee892STomi Valkeinen 	if (r)
304f76ee892STomi Valkeinen 		return r;
305f76ee892STomi Valkeinen 
306f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
307f76ee892STomi Valkeinen 	if (r)
308f76ee892STomi Valkeinen 		return r;
309f76ee892STomi Valkeinen 
310f76ee892STomi Valkeinen 	return size;
311f76ee892STomi Valkeinen }
312f76ee892STomi Valkeinen 
manager_cpr_enable_show(struct omap_overlay_manager * mgr,char * buf)313f76ee892STomi Valkeinen static ssize_t manager_cpr_enable_show(struct omap_overlay_manager *mgr,
314f76ee892STomi Valkeinen 		char *buf)
315f76ee892STomi Valkeinen {
316f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
317f76ee892STomi Valkeinen 
318f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
319f76ee892STomi Valkeinen 
320cc83ff24SQing Wang 	return sysfs_emit(buf, "%d\n", info.cpr_enable);
321f76ee892STomi Valkeinen }
322f76ee892STomi Valkeinen 
manager_cpr_enable_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)323f76ee892STomi Valkeinen static ssize_t manager_cpr_enable_store(struct omap_overlay_manager *mgr,
324f76ee892STomi Valkeinen 		const char *buf, size_t size)
325f76ee892STomi Valkeinen {
326f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
327f76ee892STomi Valkeinen 	int r;
328f76ee892STomi Valkeinen 	bool enable;
329f76ee892STomi Valkeinen 
330f76ee892STomi Valkeinen 	if (!dss_has_feature(FEAT_CPR))
331f76ee892STomi Valkeinen 		return -ENODEV;
332f76ee892STomi Valkeinen 
333*ee9fffdcSChristophe JAILLET 	r = kstrtobool(buf, &enable);
334f76ee892STomi Valkeinen 	if (r)
335f76ee892STomi Valkeinen 		return r;
336f76ee892STomi Valkeinen 
337f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
338f76ee892STomi Valkeinen 
339f76ee892STomi Valkeinen 	if (info.cpr_enable == enable)
340f76ee892STomi Valkeinen 		return size;
341f76ee892STomi Valkeinen 
342f76ee892STomi Valkeinen 	info.cpr_enable = enable;
343f76ee892STomi Valkeinen 
344f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
345f76ee892STomi Valkeinen 	if (r)
346f76ee892STomi Valkeinen 		return r;
347f76ee892STomi Valkeinen 
348f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
349f76ee892STomi Valkeinen 	if (r)
350f76ee892STomi Valkeinen 		return r;
351f76ee892STomi Valkeinen 
352f76ee892STomi Valkeinen 	return size;
353f76ee892STomi Valkeinen }
354f76ee892STomi Valkeinen 
manager_cpr_coef_show(struct omap_overlay_manager * mgr,char * buf)355f76ee892STomi Valkeinen static ssize_t manager_cpr_coef_show(struct omap_overlay_manager *mgr,
356f76ee892STomi Valkeinen 		char *buf)
357f76ee892STomi Valkeinen {
358f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
359f76ee892STomi Valkeinen 
360f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
361f76ee892STomi Valkeinen 
362cc83ff24SQing Wang 	return sysfs_emit(buf,
363f76ee892STomi Valkeinen 			"%d %d %d %d %d %d %d %d %d\n",
364f76ee892STomi Valkeinen 			info.cpr_coefs.rr,
365f76ee892STomi Valkeinen 			info.cpr_coefs.rg,
366f76ee892STomi Valkeinen 			info.cpr_coefs.rb,
367f76ee892STomi Valkeinen 			info.cpr_coefs.gr,
368f76ee892STomi Valkeinen 			info.cpr_coefs.gg,
369f76ee892STomi Valkeinen 			info.cpr_coefs.gb,
370f76ee892STomi Valkeinen 			info.cpr_coefs.br,
371f76ee892STomi Valkeinen 			info.cpr_coefs.bg,
372f76ee892STomi Valkeinen 			info.cpr_coefs.bb);
373f76ee892STomi Valkeinen }
374f76ee892STomi Valkeinen 
manager_cpr_coef_store(struct omap_overlay_manager * mgr,const char * buf,size_t size)375f76ee892STomi Valkeinen static ssize_t manager_cpr_coef_store(struct omap_overlay_manager *mgr,
376f76ee892STomi Valkeinen 		const char *buf, size_t size)
377f76ee892STomi Valkeinen {
378f76ee892STomi Valkeinen 	struct omap_overlay_manager_info info;
379f76ee892STomi Valkeinen 	struct omap_dss_cpr_coefs coefs;
380f76ee892STomi Valkeinen 	int r, i;
381f76ee892STomi Valkeinen 	s16 *arr;
382f76ee892STomi Valkeinen 
383f76ee892STomi Valkeinen 	if (!dss_has_feature(FEAT_CPR))
384f76ee892STomi Valkeinen 		return -ENODEV;
385f76ee892STomi Valkeinen 
386f76ee892STomi Valkeinen 	if (sscanf(buf, "%hd %hd %hd %hd %hd %hd %hd %hd %hd",
387f76ee892STomi Valkeinen 				&coefs.rr, &coefs.rg, &coefs.rb,
388f76ee892STomi Valkeinen 				&coefs.gr, &coefs.gg, &coefs.gb,
389f76ee892STomi Valkeinen 				&coefs.br, &coefs.bg, &coefs.bb) != 9)
390f76ee892STomi Valkeinen 		return -EINVAL;
391f76ee892STomi Valkeinen 
392f76ee892STomi Valkeinen 	arr = (s16[]){ coefs.rr, coefs.rg, coefs.rb,
393f76ee892STomi Valkeinen 		coefs.gr, coefs.gg, coefs.gb,
394f76ee892STomi Valkeinen 		coefs.br, coefs.bg, coefs.bb };
395f76ee892STomi Valkeinen 
396f76ee892STomi Valkeinen 	for (i = 0; i < 9; ++i) {
397f76ee892STomi Valkeinen 		if (arr[i] < -512 || arr[i] > 511)
398f76ee892STomi Valkeinen 			return -EINVAL;
399f76ee892STomi Valkeinen 	}
400f76ee892STomi Valkeinen 
401f76ee892STomi Valkeinen 	mgr->get_manager_info(mgr, &info);
402f76ee892STomi Valkeinen 
403f76ee892STomi Valkeinen 	info.cpr_coefs = coefs;
404f76ee892STomi Valkeinen 
405f76ee892STomi Valkeinen 	r = mgr->set_manager_info(mgr, &info);
406f76ee892STomi Valkeinen 	if (r)
407f76ee892STomi Valkeinen 		return r;
408f76ee892STomi Valkeinen 
409f76ee892STomi Valkeinen 	r = mgr->apply(mgr);
410f76ee892STomi Valkeinen 	if (r)
411f76ee892STomi Valkeinen 		return r;
412f76ee892STomi Valkeinen 
413f76ee892STomi Valkeinen 	return size;
414f76ee892STomi Valkeinen }
415f76ee892STomi Valkeinen 
416f76ee892STomi Valkeinen struct manager_attribute {
417f76ee892STomi Valkeinen 	struct attribute attr;
418f76ee892STomi Valkeinen 	ssize_t (*show)(struct omap_overlay_manager *, char *);
419f76ee892STomi Valkeinen 	ssize_t	(*store)(struct omap_overlay_manager *, const char *, size_t);
420f76ee892STomi Valkeinen };
421f76ee892STomi Valkeinen 
422f76ee892STomi Valkeinen #define MANAGER_ATTR(_name, _mode, _show, _store) \
423f76ee892STomi Valkeinen 	struct manager_attribute manager_attr_##_name = \
424f76ee892STomi Valkeinen 	__ATTR(_name, _mode, _show, _store)
425f76ee892STomi Valkeinen 
426f76ee892STomi Valkeinen static MANAGER_ATTR(name, S_IRUGO, manager_name_show, NULL);
427f76ee892STomi Valkeinen static MANAGER_ATTR(display, S_IRUGO|S_IWUSR,
428f76ee892STomi Valkeinen 		manager_display_show, manager_display_store);
429f76ee892STomi Valkeinen static MANAGER_ATTR(default_color, S_IRUGO|S_IWUSR,
430f76ee892STomi Valkeinen 		manager_default_color_show, manager_default_color_store);
431f76ee892STomi Valkeinen static MANAGER_ATTR(trans_key_type, S_IRUGO|S_IWUSR,
432f76ee892STomi Valkeinen 		manager_trans_key_type_show, manager_trans_key_type_store);
433f76ee892STomi Valkeinen static MANAGER_ATTR(trans_key_value, S_IRUGO|S_IWUSR,
434f76ee892STomi Valkeinen 		manager_trans_key_value_show, manager_trans_key_value_store);
435f76ee892STomi Valkeinen static MANAGER_ATTR(trans_key_enabled, S_IRUGO|S_IWUSR,
436f76ee892STomi Valkeinen 		manager_trans_key_enabled_show,
437f76ee892STomi Valkeinen 		manager_trans_key_enabled_store);
438f76ee892STomi Valkeinen static MANAGER_ATTR(alpha_blending_enabled, S_IRUGO|S_IWUSR,
439f76ee892STomi Valkeinen 		manager_alpha_blending_enabled_show,
440f76ee892STomi Valkeinen 		manager_alpha_blending_enabled_store);
441f76ee892STomi Valkeinen static MANAGER_ATTR(cpr_enable, S_IRUGO|S_IWUSR,
442f76ee892STomi Valkeinen 		manager_cpr_enable_show,
443f76ee892STomi Valkeinen 		manager_cpr_enable_store);
444f76ee892STomi Valkeinen static MANAGER_ATTR(cpr_coef, S_IRUGO|S_IWUSR,
445f76ee892STomi Valkeinen 		manager_cpr_coef_show,
446f76ee892STomi Valkeinen 		manager_cpr_coef_store);
447f76ee892STomi Valkeinen 
448f76ee892STomi Valkeinen 
449f76ee892STomi Valkeinen static struct attribute *manager_sysfs_attrs[] = {
450f76ee892STomi Valkeinen 	&manager_attr_name.attr,
451f76ee892STomi Valkeinen 	&manager_attr_display.attr,
452f76ee892STomi Valkeinen 	&manager_attr_default_color.attr,
453f76ee892STomi Valkeinen 	&manager_attr_trans_key_type.attr,
454f76ee892STomi Valkeinen 	&manager_attr_trans_key_value.attr,
455f76ee892STomi Valkeinen 	&manager_attr_trans_key_enabled.attr,
456f76ee892STomi Valkeinen 	&manager_attr_alpha_blending_enabled.attr,
457f76ee892STomi Valkeinen 	&manager_attr_cpr_enable.attr,
458f76ee892STomi Valkeinen 	&manager_attr_cpr_coef.attr,
459f76ee892STomi Valkeinen 	NULL
460f76ee892STomi Valkeinen };
46119d10a83SGreg Kroah-Hartman ATTRIBUTE_GROUPS(manager_sysfs);
462f76ee892STomi Valkeinen 
manager_attr_show(struct kobject * kobj,struct attribute * attr,char * buf)463f76ee892STomi Valkeinen static ssize_t manager_attr_show(struct kobject *kobj, struct attribute *attr,
464f76ee892STomi Valkeinen 		char *buf)
465f76ee892STomi Valkeinen {
466f76ee892STomi Valkeinen 	struct omap_overlay_manager *manager;
467f76ee892STomi Valkeinen 	struct manager_attribute *manager_attr;
468f76ee892STomi Valkeinen 
469f76ee892STomi Valkeinen 	manager = container_of(kobj, struct omap_overlay_manager, kobj);
470f76ee892STomi Valkeinen 	manager_attr = container_of(attr, struct manager_attribute, attr);
471f76ee892STomi Valkeinen 
472f76ee892STomi Valkeinen 	if (!manager_attr->show)
473f76ee892STomi Valkeinen 		return -ENOENT;
474f76ee892STomi Valkeinen 
475f76ee892STomi Valkeinen 	return manager_attr->show(manager, buf);
476f76ee892STomi Valkeinen }
477f76ee892STomi Valkeinen 
manager_attr_store(struct kobject * kobj,struct attribute * attr,const char * buf,size_t size)478f76ee892STomi Valkeinen static ssize_t manager_attr_store(struct kobject *kobj, struct attribute *attr,
479f76ee892STomi Valkeinen 		const char *buf, size_t size)
480f76ee892STomi Valkeinen {
481f76ee892STomi Valkeinen 	struct omap_overlay_manager *manager;
482f76ee892STomi Valkeinen 	struct manager_attribute *manager_attr;
483f76ee892STomi Valkeinen 
484f76ee892STomi Valkeinen 	manager = container_of(kobj, struct omap_overlay_manager, kobj);
485f76ee892STomi Valkeinen 	manager_attr = container_of(attr, struct manager_attribute, attr);
486f76ee892STomi Valkeinen 
487f76ee892STomi Valkeinen 	if (!manager_attr->store)
488f76ee892STomi Valkeinen 		return -ENOENT;
489f76ee892STomi Valkeinen 
490f76ee892STomi Valkeinen 	return manager_attr->store(manager, buf, size);
491f76ee892STomi Valkeinen }
492f76ee892STomi Valkeinen 
493f76ee892STomi Valkeinen static const struct sysfs_ops manager_sysfs_ops = {
494f76ee892STomi Valkeinen 	.show = manager_attr_show,
495f76ee892STomi Valkeinen 	.store = manager_attr_store,
496f76ee892STomi Valkeinen };
497f76ee892STomi Valkeinen 
498f76ee892STomi Valkeinen static struct kobj_type manager_ktype = {
499f76ee892STomi Valkeinen 	.sysfs_ops = &manager_sysfs_ops,
50019d10a83SGreg Kroah-Hartman 	.default_groups = manager_sysfs_groups,
501f76ee892STomi Valkeinen };
502f76ee892STomi Valkeinen 
dss_manager_kobj_init(struct omap_overlay_manager * mgr,struct platform_device * pdev)503f76ee892STomi Valkeinen int dss_manager_kobj_init(struct omap_overlay_manager *mgr,
504f76ee892STomi Valkeinen 		struct platform_device *pdev)
505f76ee892STomi Valkeinen {
506f76ee892STomi Valkeinen 	return kobject_init_and_add(&mgr->kobj, &manager_ktype,
507f76ee892STomi Valkeinen 			&pdev->dev.kobj, "manager%d", mgr->id);
508f76ee892STomi Valkeinen }
509f76ee892STomi Valkeinen 
dss_manager_kobj_uninit(struct omap_overlay_manager * mgr)510f76ee892STomi Valkeinen void dss_manager_kobj_uninit(struct omap_overlay_manager *mgr)
511f76ee892STomi Valkeinen {
512f76ee892STomi Valkeinen 	kobject_del(&mgr->kobj);
513f76ee892STomi Valkeinen 	kobject_put(&mgr->kobj);
514f76ee892STomi Valkeinen 
515f76ee892STomi Valkeinen 	memset(&mgr->kobj, 0, sizeof(mgr->kobj));
516f76ee892STomi Valkeinen }
517