aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/samsung/mdnie.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/video/samsung/mdnie.c')
-rw-r--r--drivers/video/samsung/mdnie.c90
1 files changed, 72 insertions, 18 deletions
diff --git a/drivers/video/samsung/mdnie.c b/drivers/video/samsung/mdnie.c
index bb672bd..d45d3e9 100644
--- a/drivers/video/samsung/mdnie.c
+++ b/drivers/video/samsung/mdnie.c
@@ -48,6 +48,8 @@
#else /* CONFIG_CPU_EXYNOS4210 */
#if defined(CONFIG_FB_S5P_S6E8AA0)
#include "mdnie_table_c1m0.h"
+#elif defined(CONFIG_FB_S5P_S6E63M0)
+#include "mdnie_table_c1m0.h"
#elif defined(CONFIG_FB_S5P_S6C1372)
#include "mdnie_table_p4note.h"
#elif defined(CONFIG_FB_S5P_S6D6AA1)
@@ -72,7 +74,7 @@
#define DIM_BACKLIGHT_VALUE 16
#define CABC_CUTOFF_BACKLIGHT_VALUE 40 /* 2.5% */
#elif defined(CONFIG_FB_S5P_S6C1372)
-#define MAX_BACKLIGHT_VALUE 1329
+#define MAX_BACKLIGHT_VALUE 1441 //90%
#define MID_BACKLIGHT_VALUE 784
#define LOW_BACKLIGHT_VALUE 16
#define DIM_BACKLIGHT_VALUE 16
@@ -104,15 +106,16 @@ struct class *mdnie_class;
struct mdnie_info *g_mdnie;
+#ifdef CONFIG_MACH_P4NOTE
+static struct mdnie_backlight_value b_value;
+#endif
+
int mdnie_send_sequence(struct mdnie_info *mdnie, const unsigned short *seq)
{
int ret = 0, i = 0;
const unsigned short *wbuf;
- if (!mdnie->enable) {
- dev_err(mdnie->dev, "do not configure mDNIe after LCD/mDNIe power off\n");
- return -EPERM;
- } else if (IS_ERR_OR_NULL(seq)) {
+ if (IS_ERR_OR_NULL(seq)) {
dev_err(mdnie->dev, "mdnie sequence is null\n");
return -EPERM;
}
@@ -135,12 +138,12 @@ int mdnie_send_sequence(struct mdnie_info *mdnie, const unsigned short *seq)
return ret;
}
-void set_mdnie_value(struct mdnie_info *mdnie)
+void set_mdnie_value(struct mdnie_info *mdnie, u8 force)
{
u8 idx;
- if (!mdnie->enable) {
- dev_err(mdnie->dev, "do not configure mDNIe after LCD/mDNIe power off\n");
+ if ((!mdnie->enable) && (!force)) {
+ dev_err(mdnie->dev, "mdnie states is off\n");
return;
}
@@ -152,7 +155,7 @@ void set_mdnie_value(struct mdnie_info *mdnie)
mdnie->tone = TONE_NORMAL;
if (mdnie->tunning) {
- dev_info(mdnie->dev, "mDNIe tunning mode is enabled\n");
+ dev_info(mdnie->dev, "mdnie tunning mode is enabled\n");
return;
}
@@ -200,7 +203,9 @@ void set_mdnie_value(struct mdnie_info *mdnie)
tunning_table[mdnie->cabc][mdnie->mode][mdnie->scenario].name);
}
+#if defined(CONFIG_TDMB) || defined(CONFIG_TARGET_LOCALE_NTT)
etc:
+#endif
if (!IS_ERR_OR_NULL(etc_table[mdnie->cabc][mdnie->outdoor][mdnie->tone].seq)) {
mdnie_send_sequence(mdnie, etc_table[mdnie->cabc][mdnie->outdoor][mdnie->tone].seq);
dev_info(mdnie->dev, "%s\n", etc_table[mdnie->cabc][mdnie->outdoor][mdnie->tone].name);
@@ -213,6 +218,34 @@ exit:
}
#if defined(CONFIG_FB_MDNIE_PWM)
+#ifdef CONFIG_MACH_P4NOTE
+static int get_backlight_level_from_brightness(unsigned int brightness)
+{
+ unsigned int value;
+
+ /* brightness tuning*/
+ if (brightness >= MID_BRIGHTNESS_LEVEL)
+ value = (brightness - MID_BRIGHTNESS_LEVEL) * (b_value.max-b_value.mid) / (MAX_BRIGHTNESS_LEVEL-MID_BRIGHTNESS_LEVEL) + b_value.mid;
+ else if (brightness >= LOW_BRIGHTNESS_LEVEL)
+ value = (brightness - LOW_BRIGHTNESS_LEVEL) * (b_value.mid-b_value.low) / (MID_BRIGHTNESS_LEVEL-LOW_BRIGHTNESS_LEVEL) + b_value.low;
+ else if (brightness >= DIM_BRIGHTNESS_LEVEL)
+ value = (brightness - DIM_BRIGHTNESS_LEVEL) * (b_value.low-b_value.dim) / (LOW_BRIGHTNESS_LEVEL-DIM_BRIGHTNESS_LEVEL) + b_value.dim;
+ else if (brightness > 0)
+ value = b_value.dim;
+ else
+ return 0;
+
+ if (value > 1600)
+ value = 1600;
+
+ if (value < 16)
+ value = 1;
+ else
+ value = value >> 4;
+
+ return value;
+}
+#else
static int get_backlight_level_from_brightness(unsigned int brightness)
{
unsigned int value;
@@ -227,7 +260,7 @@ static int get_backlight_level_from_brightness(unsigned int brightness)
else if (brightness > 0)
value = DIM_BACKLIGHT_VALUE;
else
- value = brightness;
+ return 0;
if (value > 1600)
value = 1600;
@@ -239,6 +272,7 @@ static int get_backlight_level_from_brightness(unsigned int brightness)
return value;
}
+#endif
#if defined(CONFIG_CPU_EXYNOS4210)
static void mdnie_pwm_control(struct mdnie_info *mdnie, int value)
@@ -283,8 +317,7 @@ static void mdnie_pwm_control_cabc(struct mdnie_info *mdnie, int value)
mutex_unlock(&mdnie->dev_lock);
}
-#endif
-#if defined(CONFIG_CPU_EXYNOS4212) || defined(CONFIG_CPU_EXYNOS4412)
+#elif defined(CONFIG_CPU_EXYNOS4212) || defined(CONFIG_CPU_EXYNOS4412)
static void mdnie_pwm_control(struct mdnie_info *mdnie, int value)
{
mutex_lock(&mdnie->dev_lock);
@@ -329,6 +362,11 @@ static void mdnie_pwm_control_cabc(struct mdnie_info *mdnie, int value)
}
#endif
+void set_mdnie_pwm_value(struct mdnie_info *mdnie, int value)
+{
+ mdnie_pwm_control(mdnie, value);
+}
+
static int update_brightness(struct mdnie_info *mdnie)
{
unsigned int value;
@@ -413,7 +451,7 @@ static ssize_t mode_store(struct device *dev,
mdnie->mode = value;
mutex_unlock(&mdnie->lock);
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
#if defined(CONFIG_FB_MDNIE_PWM)
if ((mdnie->enable) && (mdnie->bd_enable))
update_brightness(mdnie);
@@ -454,7 +492,7 @@ static ssize_t scenario_store(struct device *dev,
mdnie->scenario = value;
mutex_unlock(&mdnie->lock);
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
#if defined(CONFIG_FB_MDNIE_PWM)
if ((mdnie->enable) && (mdnie->bd_enable))
update_brightness(mdnie);
@@ -492,7 +530,7 @@ static ssize_t outdoor_store(struct device *dev,
mdnie->outdoor = value;
mutex_unlock(&mdnie->lock);
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
return count;
}
@@ -527,7 +565,7 @@ static ssize_t cabc_store(struct device *dev,
mdnie->cabc = value;
mutex_unlock(&mdnie->lock);
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
if ((mdnie->enable) && (mdnie->bd_enable))
update_brightness(mdnie);
@@ -609,7 +647,7 @@ static ssize_t negative_store(struct device *dev,
mdnie->negative = value;
mutex_unlock(&mdnie->lock);
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
}
return count;
}
@@ -756,6 +794,22 @@ static int mdnie_probe(struct platform_device *pdev)
#endif
#endif
+#if defined(CONFIG_FB_S5P_S6C1372)
+ check_lcd_type();
+ dev_info(mdnie->dev, "lcdtype = %d\n", pdata->display_type);
+ if (pdata->display_type == 1) {
+ b_value.max = 1441;
+ b_value.mid = 784;
+ b_value.low = 16;
+ b_value.dim = 16;
+ } else {
+ b_value.max = 1137; /* 71% */
+ b_value.mid = 482; /* 38% */
+ b_value.low = 16; /* 1% */
+ b_value.dim = 16; /* 1% */
+ }
+#endif
+
#if defined(CONFIG_FB_S5P_S6F1202A)
if (pdata->display_type == 0) {
memcpy(tunning_table, tunning_table_hy, sizeof(tunning_table));
@@ -777,7 +831,7 @@ static int mdnie_probe(struct platform_device *pdev)
g_mdnie = mdnie;
- set_mdnie_value(mdnie);
+ set_mdnie_value(mdnie, 0);
dev_info(mdnie->dev, "registered successfully\n");