aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/misc
diff options
context:
space:
mode:
authorEzekeel <notezekeel@googlemail.com>2012-07-06 23:56:10 +0200
committerZiyan <jaraidaniel@gmail.com>2014-12-16 12:42:16 +0100
commita2bb75e6a1abb90f41b5f4901bb2f75b5b4cd0d7 (patch)
tree3850e53819e66f203768ac6ff27fd489a89544bb /drivers/misc
parent240ea5d7f770040a97a7e333ee913f06a8696297 (diff)
downloadkernel_samsung_tuna-a2bb75e6a1abb90f41b5f4901bb2f75b5b4cd0d7.zip
kernel_samsung_tuna-a2bb75e6a1abb90f41b5f4901bb2f75b5b4cd0d7.tar.gz
kernel_samsung_tuna-a2bb75e6a1abb90f41b5f4901bb2f75b5b4cd0d7.tar.bz2
Added Color Control version 4.
Conflicts: drivers/misc/Makefile Change-Id: Ie57d33003d1ce0a750ef2ec2cb15884a449df92a
Diffstat (limited to 'drivers/misc')
-rwxr-xr-xdrivers/misc/Kconfig6
-rwxr-xr-xdrivers/misc/Makefile1
-rw-r--r--drivers/misc/color_control.c223
3 files changed, 230 insertions, 0 deletions
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
index ce12d36..7ed9c18 100755
--- a/drivers/misc/Kconfig
+++ b/drivers/misc/Kconfig
@@ -595,4 +595,10 @@ source "drivers/misc/gcx/gcioctl/Kconfig"
source "drivers/misc/gcx/gcbv/Kconfig"
source "drivers/misc/cache-2dmanager/Kconfig"
+config COLOR_CONTROL
+ bool "Support for Color Control"
+ default y
+ help
+ Say Y here to enable Color Control
+
endif # MISC_DEVICES
diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
index ebeca8b..d46c7a0 100755
--- a/drivers/misc/Makefile
+++ b/drivers/misc/Makefile
@@ -63,3 +63,4 @@ obj-$(CONFIG_GCCORE) += gcx/gccore/
obj-$(CONFIG_GCBV) += gcx/gcbv/
obj-$(CONFIG_GCIOCTL) += gcx/gcioctl/
obj-$(CONFIG_CACHE2DMANAGER) += cache-2dmanager/
+obj-$(CONFIG_COLOR_CONTROL) += color_control.o
diff --git a/drivers/misc/color_control.c b/drivers/misc/color_control.c
new file mode 100644
index 0000000..9465fe2
--- /dev/null
+++ b/drivers/misc/color_control.c
@@ -0,0 +1,223 @@
+/* drivers/misc/color_control.c
+ *
+ * Copyright 2012 Ezekeel (based on supercurio's idea)
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ */
+
+#include <linux/init.h>
+#include <linux/device.h>
+#include <linux/miscdevice.h>
+
+#define COLORCONTROL_VERSION 4
+
+extern void colorcontrol_update(bool multiplier_updated);
+
+static bool safety_enabled = true;
+
+static int * v1_offset;
+
+static u32 * color_multiplier;
+
+static u32 original_multiplier[3];
+
+void colorcontrol_register_offset(int * offset)
+{
+ v1_offset = offset;
+
+ return;
+}
+EXPORT_SYMBOL(colorcontrol_register_offset);
+
+void colorcontrol_register_multiplier(u32 * multiplier)
+{
+ int i;
+
+ color_multiplier = multiplier;
+
+ for (i = 0; i < 3; i++)
+ original_multiplier[i] = color_multiplier[i];
+
+ return;
+}
+EXPORT_SYMBOL(colorcontrol_register_multiplier);
+
+static ssize_t colorcontrol_offset_read(struct device * dev, struct device_attribute * attr, char * buf)
+{
+ return sprintf(buf, "%i %i %i\n", v1_offset[0], v1_offset[1], v1_offset[2]);
+}
+
+static ssize_t colorcontrol_offset_write(struct device * dev, struct device_attribute * attr, const char * buf, size_t size)
+{
+ int i;
+ int new_offset[3];
+
+ if(sscanf(buf, "%i %i %i\n", &new_offset[0], &new_offset[1], &new_offset[2]) == 3)
+ {
+ for (i = 0; i < 3; i++)
+ v1_offset[i] = new_offset[i];
+
+ pr_info("COLORCONTROL V1 offsets changed\n");
+
+ colorcontrol_update(false);
+ }
+ else
+ {
+ pr_info("%s: invalid input\n", __FUNCTION__);
+ }
+
+ return size;
+}
+
+static ssize_t colorcontrol_multiplier_read(struct device * dev, struct device_attribute * attr, char * buf)
+{
+ return sprintf(buf, "%u %u %u\n", color_multiplier[0], color_multiplier[1], color_multiplier[2]);
+}
+
+static ssize_t colorcontrol_multiplier_write(struct device * dev, struct device_attribute * attr, const char * buf, size_t size)
+{
+ int i;
+
+ u32 new_multiplier[3];
+
+ if(sscanf(buf, "%u %u %u\n", &new_multiplier[0], &new_multiplier[1], &new_multiplier[2]) == 3)
+ {
+ for (i = 0; i < 3; i++)
+ {
+ if (safety_enabled)
+ color_multiplier[i] = min(new_multiplier[i], original_multiplier[i]);
+ else
+ color_multiplier[i] = new_multiplier[i];
+ }
+
+ pr_info("COLORCONTROL color multipliers changed\n");
+
+ colorcontrol_update(true);
+ }
+ else
+ {
+ pr_info("%s: invalid input\n", __FUNCTION__);
+ }
+
+ return size;
+}
+
+static ssize_t colorcontrol_safety_read(struct device * dev, struct device_attribute * attr, char * buf)
+{
+ return sprintf(buf, "%u\n", (safety_enabled ? 1 : 0));
+}
+
+static ssize_t colorcontrol_safety_write(struct device * dev, struct device_attribute * attr, const char * buf, size_t size)
+{
+ unsigned int data;
+
+ int i;
+
+ bool multipliers_modified = false;
+
+ if(sscanf(buf, "%u\n", &data) == 1)
+ {
+ pr_devel("%s: %u \n", __FUNCTION__, data);
+
+ if (data == 1)
+ {
+ pr_info("%s: COLORCONTROL safety enabled\n", __FUNCTION__);
+
+ safety_enabled = true;
+
+ for (i = 0; i < 3; i++)
+ {
+ if (color_multiplier[i] > original_multiplier[i])
+ {
+ color_multiplier[i] = original_multiplier[i];
+
+ multipliers_modified = true;
+ }
+ }
+
+ if (multipliers_modified)
+ colorcontrol_update(true);
+ }
+ else if (data == 0)
+ {
+ pr_info("%s: COLORCONTROL safety disabled\n", __FUNCTION__);
+
+ safety_enabled = false;
+ }
+ else
+ {
+ pr_info("%s: invalid input range %u\n", __FUNCTION__, data);
+ }
+ }
+ else
+ {
+ pr_info("%s: invalid input\n", __FUNCTION__);
+ }
+
+ return size;
+}
+
+static ssize_t colorcontrol_originalmultiplier_read(struct device * dev, struct device_attribute * attr, char * buf)
+{
+ return sprintf(buf, "%u %u %u\n", original_multiplier[0], original_multiplier[1], original_multiplier[2]);
+}
+
+static ssize_t colorcontrol_version(struct device * dev, struct device_attribute * attr, char * buf)
+{
+ return sprintf(buf, "%u\n", COLORCONTROL_VERSION);
+}
+
+static DEVICE_ATTR(v1_offset, S_IRUGO | S_IWUGO, colorcontrol_offset_read, colorcontrol_offset_write);
+static DEVICE_ATTR(multiplier, S_IRUGO | S_IWUGO, colorcontrol_multiplier_read, colorcontrol_multiplier_write);
+static DEVICE_ATTR(safety_enabled, S_IRUGO | S_IWUGO, colorcontrol_safety_read, colorcontrol_safety_write);
+static DEVICE_ATTR(original_multiplier, S_IRUGO, colorcontrol_originalmultiplier_read, NULL);
+static DEVICE_ATTR(version, S_IRUGO , colorcontrol_version, NULL);
+
+static struct attribute *colorcontrol_attributes[] =
+ {
+ &dev_attr_v1_offset.attr,
+ &dev_attr_multiplier.attr,
+ &dev_attr_safety_enabled.attr,
+ &dev_attr_original_multiplier.attr,
+ &dev_attr_version.attr,
+ NULL
+ };
+
+static struct attribute_group colorcontrol_group =
+ {
+ .attrs = colorcontrol_attributes,
+ };
+
+static struct miscdevice colorcontrol_device =
+ {
+ .minor = MISC_DYNAMIC_MINOR,
+ .name = "colorcontrol",
+ };
+
+static int __init colorcontrol_init(void)
+{
+ int ret;
+
+ pr_info("%s misc_register(%s)\n", __FUNCTION__, colorcontrol_device.name);
+
+ ret = misc_register(&colorcontrol_device);
+
+ if (ret)
+ {
+ pr_err("%s misc_register(%s) fail\n", __FUNCTION__, colorcontrol_device.name);
+
+ return 1;
+ }
+
+ if (sysfs_create_group(&colorcontrol_device.this_device->kobj, &colorcontrol_group) < 0)
+ {
+ pr_err("%s sysfs_create_group fail\n", __FUNCTION__);
+ pr_err("Failed to create sysfs group for device (%s)!\n", colorcontrol_device.name);
+ }
+
+ return 0;
+}
+
+device_initcall(colorcontrol_init);