static ssize_t store_overlays(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct platform_device *pdev = to_platform_device(dev); struct omapfb2_device *fbdev = platform_get_drvdata(pdev); int idx; struct omap_overlay *ovl = NULL; struct omap_overlay_manager *mgr; int r; char ovlname[10]; int posx, posy, outw, outh; int enabled; int alpha; idx = 0; while (idx < count && buf[idx] != ' ') ++idx; if (idx == count) return -EINVAL; if (idx >= sizeof(ovlname)) return -EINVAL; strncpy(ovlname, buf, idx); ovlname[idx] = 0; idx++; omapfb_lock(fbdev); ovl = find_overlay_by_name(fbdev, ovlname); if (!ovl) { dev_err(dev, "ovl not found\n"); r = -EINVAL; goto err; } DBG("ovl %s found\n", ovl->name); mgr = ovl->manager; posx = ovl->info.pos_x; posy = ovl->info.pos_y; outw = ovl->info.out_width; outh = ovl->info.out_height; if (strcmp(ovl->name, "vid1") != 0) alpha = ovl->info.global_alpha; else alpha = -1; enabled = ovl->info.enabled; while (idx < count) { char c; int val; int len; char sval[10]; r = sscanf(buf + idx, "%c:%d%n", &c, &val, &len); if (r != 2) { val = 0; r = sscanf(buf + idx, "%c:%9s%n", &c, sval, &len); if (r != 2) { dev_err(dev, "sscanf failed, aborting\n"); r = -EINVAL; goto err; } } else { sval[0] = 0; } switch (c) { case 't': if (strcmp(sval, "none") == 0) { mgr = NULL; } else { mgr = find_manager_by_name(fbdev, sval); if (mgr == NULL) { dev_err(dev, "no such manager\n"); r = -EINVAL; goto err; } DBG("manager %s found\n", mgr->name); } break; case 'x': posx = val; break; case 'y': posy = val; break; case 'w': if (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) outw = val; break; case 'h': if (ovl->caps & OMAP_DSS_OVL_CAP_SCALE) outh = val; break; case 'a': alpha = val & 0xff; break; case 'e': enabled = val; break; default: dev_err(dev, "unknown option %c\n", c); r = -EINVAL; goto err; } idx += len + 1; } if (strcmp(ovl->name, "vid1") != 0) ovl->info.global_alpha = alpha; r = ovl->setup_output(ovl, posx, posy, outw, outh); if (r) { dev_err(dev, "setup overlay failed\n"); goto err; } if (mgr != ovl->manager) { /* detach old manager */ if (ovl->manager) { r = ovl->unset_manager(ovl); if (r) { dev_err(dev, "detach failed\n"); goto err; } } if (mgr) { r = ovl->set_manager(ovl, mgr); if (r) { dev_err(dev, "Failed to attach overlay\n"); goto err; } } } r = ovl->enable(ovl, enabled); if (r) { dev_err(dev, "enable overlay failed\n"); goto err; } if (mgr) { r = mgr->apply(mgr); if (r) { dev_err(dev, "failed to apply dispc config\n"); goto err; } } else { ovl->enable(ovl, 0); } if (mgr && mgr->display && mgr->display->update) { int w, h; mgr->display->get_resolution(mgr->display, &w, &h); mgr->display->update(mgr->display, 0, 0, w, h); } omapfb_unlock(fbdev); return count; err: omapfb_unlock(fbdev); return r; }
static ssize_t store_managers(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct platform_device *pdev = to_platform_device(dev); struct omapfb2_device *fbdev = platform_get_drvdata(pdev); struct omap_overlay_manager *mgr; struct omap_display *display = NULL; char displayname[10]; int r; char *s, *tok; char str[128]; struct omap_overlay_manager_info newinfo; int apply = 0; displayname[0] = '\0'; if (strlen(buf) > sizeof(str) - 1) return -EINVAL; strcpy(str, buf); /* remove trailing linefeeds */ s = str + strlen(str) - 1; while (s >= str && *s == '\n') { *s = 0; s--; } s = str; if ((tok = strsep(&s, " ")) == 0) return -EINVAL; omapfb_lock(fbdev); mgr = find_manager_by_name(fbdev, tok); if (!mgr) { dev_err(dev, "manager not found\n"); r = -EINVAL; goto err; } newinfo = mgr->info; while ((tok = strsep(&s, " "))) { if (strncmp(tok, "t:", 2) == 0) { r = sscanf(tok, "t:%9s", displayname); if (r != 1) { r = -EINVAL; goto err; } } else if(strncmp(tok, "trans:", 6) == 0) { newinfo.trans_enabled = simple_strtoul(tok+6, NULL, 0); } else if(strncmp(tok, "type:", 5) == 0) { newinfo.trans_key_type = simple_strtoul(tok+5, NULL, 0); } else if(strncmp(tok, "key:", 4) == 0) { newinfo.trans_key = simple_strtoul(tok+4, NULL, 0); } else if(strncmp(tok, "alpha:", 6) == 0) { newinfo.alpha_enabled = simple_strtoul(tok+6, NULL, 0); } else { dev_err(dev, "unknown option\n"); r = -EINVAL; goto err; } } if (memcmp(&newinfo, &mgr->info, sizeof(struct omap_overlay_manager_info)) != 0) { mgr->info = newinfo; mgr->info_dirty = 1; apply = 1; } if (displayname[0] != '\0') { if (strcmp(displayname, "none") == 0) { display = NULL; } else { display = find_display_by_name(fbdev, displayname); if (!display) { dev_err(dev, "display not found: [%s]\n", displayname); r = -EINVAL; goto err; } } if (mgr->display) { r = mgr->unset_display(mgr); if (r) { dev_err(dev, "failed to unset display\n"); goto err; } } if (display) { r = mgr->set_display(mgr, display); if (r) { dev_err(dev, "failed to set manager\n"); goto err; } } apply = 1; } if (apply) { r = mgr->apply(mgr); if (r) { dev_err(dev, "failed to apply dispc config\n"); goto err; } } omapfb_unlock(fbdev); return count; err: omapfb_unlock(fbdev); return r; }
static ssize_t store_managers(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct platform_device *pdev = to_platform_device(dev); struct omapfb2_device *fbdev = platform_get_drvdata(pdev); int idx; struct omap_overlay_manager *mgr; struct omap_display *display; char mgrname[10]; char displayname[10]; int r; idx = 0; while (idx < count && buf[idx] != ' ') ++idx; if (idx == count) return -EINVAL; if (idx >= sizeof(mgrname)) return -EINVAL; strncpy(mgrname, buf, idx); mgrname[idx] = 0; idx++; omapfb_lock(fbdev); mgr = find_manager_by_name(fbdev, mgrname); if (!mgr) { dev_err(dev, "manager not found\n"); r = -EINVAL; goto err; } r = sscanf(buf + idx, "t:%9s", displayname); if (r != 1) { r = -EINVAL; goto err; } if (strcmp(displayname, "none") == 0) { display = NULL; } else { display = find_display_by_name(fbdev, displayname); if (!display) { dev_err(dev, "display not found\n"); r = -EINVAL; goto err; } } if (mgr->display) { r = mgr->unset_display(mgr); if (r) { dev_err(dev, "failed to unset display\n"); goto err; } } if (display) { r = mgr->set_display(mgr, display); if (r) { dev_err(dev, "failed to set manager\n"); goto err; } r = mgr->apply(mgr); if (r) { dev_err(dev, "failed to apply dispc config\n"); goto err; } } omapfb_unlock(fbdev); return count; err: omapfb_unlock(fbdev); return r; }