summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/ext
diff options
context:
space:
mode:
authorRobert Morell <rmorell@nvidia.com>2011-03-21 14:32:29 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:13 -0800
commit491cb2c5948ccf7ce53c81dbca8d19475667a400 (patch)
treeb9fbc8fd153ccb44fbfcd3036a86b5126fe18ca0 /drivers/video/tegra/dc/ext
parentd69bf1aa9ddf62411b4e964f69d9f7a4ffb91816 (diff)
video: tegra: Add userspace CSC control
This adds configurability of the per-window color space conversion support in the Tegra display controller through the dc extension interface. The CSC matrix defaults to its previously-hardcoded values, but can be overridden by userspace. bug 818525 Original-Change-Id: I00d8e48dd38a40e5b8c36d4624d31c834e5cd9de Signed-off-by: Robert Morell <rmorell@nvidia.com> Reviewed-on: http://git-master/r/40527 Reviewed-by: Varun Colbert <vcolbert@nvidia.com> Tested-by: Varun Colbert <vcolbert@nvidia.com> Rebase-Id: R1f445ab544b4c06f56dde1e3f0e9db3c930a9c14
Diffstat (limited to 'drivers/video/tegra/dc/ext')
-rw-r--r--drivers/video/tegra/dc/ext/dev.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/ext/dev.c b/drivers/video/tegra/dc/ext/dev.c
index 788593ea0dcf..b0e8c38626a6 100644
--- a/drivers/video/tegra/dc/ext/dev.c
+++ b/drivers/video/tegra/dc/ext/dev.c
@@ -439,6 +439,43 @@ fail_pin:
return ret;
}
+static int tegra_dc_ext_set_csc(struct tegra_dc_ext_user *user,
+ struct tegra_dc_ext_csc *new_csc)
+{
+ unsigned int index = new_csc->win_index;
+ struct tegra_dc *dc = user->ext->dc;
+ struct tegra_dc_ext_win *ext_win;
+ struct tegra_dc_csc *csc;
+
+ if (index >= DC_N_WINDOWS)
+ return -EINVAL;
+
+ ext_win = &user->ext->win[index];
+ csc = &dc->windows[index].csc;
+
+ mutex_lock(&ext_win->lock);
+
+ if (ext_win->user != user) {
+ mutex_unlock(&ext_win->lock);
+ return -EACCES;
+ }
+
+ csc->yof = new_csc->yof;
+ csc->kyrgb = new_csc->kyrgb;
+ csc->kur = new_csc->kur;
+ csc->kvr = new_csc->kvr;
+ csc->kug = new_csc->kug;
+ csc->kvg = new_csc->kvg;
+ csc->kub = new_csc->kub;
+ csc->kvb = new_csc->kvb;
+
+ tegra_dc_update_csc(dc, index);
+
+ mutex_unlock(&ext_win->lock);
+
+ return 0;
+}
+
static long tegra_dc_ioctl(struct file *filp, unsigned int cmd,
unsigned long arg)
{
@@ -493,6 +530,16 @@ static long tegra_dc_ioctl(struct file *filp, unsigned int cmd,
return tegra_dc_ext_set_cursor(user, &args);
}
+ case TEGRA_DC_EXT_SET_CSC:
+ {
+ struct tegra_dc_ext_csc args;
+
+ if (copy_from_user(&args, user_arg, sizeof(args)))
+ return -EFAULT;
+
+ return tegra_dc_ext_set_csc(user, &args);
+ }
+
default:
return -EINVAL;
}