summaryrefslogtreecommitdiff
path: root/drivers/video/tegra/dc/dc_sysfs.c
diff options
context:
space:
mode:
authorKevin Huang <kevinh@nvidia.com>2012-04-09 18:03:51 -0700
committerSimone Willett <swillett@nvidia.com>2012-04-11 15:01:37 -0700
commit1827824d541eef3899122e9040e0662042d935d1 (patch)
treea2e2e69a5475cea3e28edbb6affe1261510da0f1 /drivers/video/tegra/dc/dc_sysfs.c
parent57b208f723b88520608beb37104acf7e264581b3 (diff)
video: tegra: fb: Add interface to nvdps.
Provide /sys/class/graphics/fb0/device/nvdps to change video mode on-the-fly without resetting window layout like fb_set_var(). This allows flicker free changes in refresh rate. nvdps sysfs file takes an integer, and selects the closest matching mode with the same or higher refresh rate. Reading the file displays the current refresh rate. Bug 560152 Change-Id: Id5c1eafaf338b99fa9742202b38ccbfc238b77d5 Signed-off-by: Kevin Huang <kevinh@nvidia.com> Reviewed-on: http://git-master/r/95473 Reviewed-by: Automatic_Commit_Validation_User Reviewed-by: Jon Mayo <jmayo@nvidia.com>
Diffstat (limited to 'drivers/video/tegra/dc/dc_sysfs.c')
-rw-r--r--drivers/video/tegra/dc/dc_sysfs.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/drivers/video/tegra/dc/dc_sysfs.c b/drivers/video/tegra/dc/dc_sysfs.c
index 6bb18382e6ee..0b259c374360 100644
--- a/drivers/video/tegra/dc/dc_sysfs.c
+++ b/drivers/video/tegra/dc/dc_sysfs.c
@@ -18,6 +18,7 @@
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
+#include <linux/fb.h>
#include <linux/platform_device.h>
#include <linux/kernel.h>
@@ -282,6 +283,36 @@ static ssize_t mode_3d_store(struct device *dev,
static DEVICE_ATTR(stereo_mode,
S_IRUGO|S_IWUSR, mode_3d_show, mode_3d_store);
+static ssize_t nvdps_show(struct device *device,
+ struct device_attribute *attr, char *buf)
+{
+ int refresh_rate;
+ struct nvhost_device *ndev = to_nvhost_device(device);
+ struct tegra_dc *dc = nvhost_get_drvdata(ndev);
+
+ refresh_rate = tegra_fb_get_mode(dc);
+ return snprintf(buf, PAGE_SIZE, "%d\n", refresh_rate);
+}
+
+
+static ssize_t nvdps_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ struct nvhost_device *ndev = to_nvhost_device(dev);
+ struct tegra_dc *dc = nvhost_get_drvdata(ndev);
+ int refresh_rate;
+ int e;
+
+ e = kstrtoint(buf, 10, &refresh_rate);
+ if (e)
+ return e;
+ e = tegra_fb_set_mode(dc, refresh_rate);
+
+ return count;
+}
+
+static DEVICE_ATTR(nvdps, S_IRUGO|S_IWUSR, nvdps_show, nvdps_store);
+
void __devexit tegra_dc_remove_sysfs(struct device *dev)
{
struct nvhost_device *ndev = to_nvhost_device(dev);
@@ -289,6 +320,7 @@ void __devexit tegra_dc_remove_sysfs(struct device *dev)
struct tegra_dc_sd_settings *sd_settings = dc->out->sd_settings;
device_remove_file(dev, &dev_attr_mode);
+ device_remove_file(dev, &dev_attr_nvdps);
device_remove_file(dev, &dev_attr_enable);
device_remove_file(dev, &dev_attr_stats_enable);
device_remove_file(dev, &dev_attr_crc_checksum_latched);
@@ -310,6 +342,7 @@ void tegra_dc_create_sysfs(struct device *dev)
int error = 0;
error |= device_create_file(dev, &dev_attr_mode);
+ error |= device_create_file(dev, &dev_attr_nvdps);
error |= device_create_file(dev, &dev_attr_enable);
error |= device_create_file(dev, &dev_attr_stats_enable);
error |= device_create_file(dev, &dev_attr_crc_checksum_latched);