static void tegra_overlay_put_locked(struct overlay_client *client, int idx) { struct tegra_overlay_flip_args flip_args; struct tegra_overlay_info *dev = client->dev; if (idx < 0 || idx > dev->dc->n_windows) return; if (dev->overlays[idx].owner != client) return; dev_dbg(&client->dev->ndev->dev, "%s(): idx=%d pid=%d comm=%s\n", __func__, idx, client->task->pid, client->task->comm); dev->overlays[idx].owner = NULL; flip_args.win[0].index = idx; flip_args.win[0].buff_id = 0; flip_args.win[1].index = -1; flip_args.win[2].index = -1; flip_args.flags = 0; tegra_overlay_flip(dev, &flip_args, NULL); if (dev->dc->mode.pclk != 0) tegra_overlay_set_emc_freq(dev); }
static int tegra_overlay_ioctl_flip(struct overlay_client *client, void __user *arg) { int i = 0; int idx = 0; int err; bool found_one = false; struct tegra_overlay_flip_args flip_args; mutex_lock(&client->dev->dc->lock); if (!client->dev->dc->enabled) { mutex_unlock(&client->dev->dc->lock); return -EPIPE; } mutex_unlock(&client->dev->dc->lock); if (copy_from_user(&flip_args, arg, sizeof(flip_args))) return -EFAULT; for (i = 0; i < TEGRA_FB_FLIP_N_WINDOWS; i++) { idx = flip_args.win[i].index; if (idx == -1) { flip_args.win[i].buff_id = 0; continue; } if (idx < 0 || idx > client->dev->dc->n_windows) { dev_err(&client->dev->ndev->dev, "Flipping an invalid overlay! %d\n", idx); flip_args.win[i].index = -1; flip_args.win[i].buff_id = 0; continue; } if (client->dev->overlays[idx].owner != client) { dev_err(&client->dev->ndev->dev, "Flipping a non-owned overlay! %d\n", idx); flip_args.win[i].index = -1; flip_args.win[i].buff_id = 0; continue; } found_one = true; } if (!found_one) return -EFAULT; err = tegra_overlay_flip(client->dev, &flip_args, client->user_nvmap); if (err) return err; if (copy_to_user(arg, &flip_args, sizeof(flip_args))) return -EFAULT; return 0; }
static void tegra_overlay_put_locked(struct overlay_client *client, int idx) { struct tegra_overlay_flip_args flip_args; struct tegra_overlay_info *dev = client->dev; if (idx < 0 || idx > dev->dc->n_windows) return; if (dev->overlays[idx].owner != client) return; dev->overlays[idx].owner = NULL; flip_args.win[0].index = idx; flip_args.win[0].buff_id = 0; flip_args.win[1].index = -1; flip_args.win[2].index = -1; tegra_overlay_flip(dev, &flip_args, NULL); }