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