Beispiel #1
0
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;
}
Beispiel #2
0
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;
}
Beispiel #3
0
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;
}