Exemplo n.º 1
0
static int tegra_overlay_ioctl_close(struct overlay_client *client,
				     void __user *arg)
{
	int err = 0;
	int idx;

	if (copy_from_user(&idx, arg, sizeof(idx)))
		return -EFAULT;

	if (idx < 0 || idx > client->dev->dc->n_windows)
		return -EINVAL;

	mutex_lock(&client->dev->overlays_lock);
	if (client->dev->overlays[idx].owner == client)
		tegra_overlay_put_locked(client, idx);
	else
		err = -EINVAL;
	mutex_unlock(&client->dev->overlays_lock);

	return err;
}
Exemplo n.º 2
0
static int tegra_overlay_release(struct inode *inode, struct file *filp)
{
	struct overlay_client *client = filp->private_data;
	unsigned long flags;
	int i;

	mutex_lock(&client->dev->overlays_lock);
	for (i = 0; i < client->dev->dc->n_windows; i++)
		if (client->dev->overlays[i].owner == client)
			tegra_overlay_put_locked(client, i);
	mutex_unlock(&client->dev->overlays_lock);

	spin_lock_irqsave(&client->dev->clients_lock, flags);
	list_del(&client->list);
	spin_unlock_irqrestore(&client->dev->clients_lock, flags);

	put_task_struct(client->task);

	kfree(client);
	return 0;
}
Exemplo n.º 3
0
static void tegra_overlay_put(struct overlay_client *client, int idx)
{
	mutex_lock(&client->dev->overlays_lock);
	tegra_overlay_put_locked(client, idx);
	mutex_unlock(&client->dev->overlays_lock);
}