diff options
author | Robert Morell <rmorell@nvidia.com> | 2011-03-21 14:32:29 -0700 |
---|---|---|
committer | Dan Willemsen <dwillemsen@nvidia.com> | 2011-11-30 21:48:13 -0800 |
commit | 491cb2c5948ccf7ce53c81dbca8d19475667a400 (patch) | |
tree | b9fbc8fd153ccb44fbfcd3036a86b5126fe18ca0 /drivers/video/tegra/dc/ext | |
parent | d69bf1aa9ddf62411b4e964f69d9f7a4ffb91816 (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.c | 47 |
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; } |