static struct dsim_device *dsim_base;
static struct backlight_device *bd;
-#if defined(CONFIG_EXYNOS_PANEL_CABC)
struct panel_device {
struct device *dev;
struct dsim_device *dsim;
struct panel_device *nt36672a_panel_drvdata;
struct class *nt36672a_panel_class;
-#endif
static int nt36672a_get_brightness(struct backlight_device *bd)
{
static int nt36672a_set_brightness(struct backlight_device *bd)
{
+ struct dsim_device *dsim;
int brightness = bd->props.brightness;
+ dsim = get_dsim_drvdata(0);
+
if (brightness < MIN_BRIGHTNESS || brightness > MAX_BRIGHTNESS) {
pr_err("Brightness should be in the range of 0 ~ 255\n");
return -EINVAL;
}
+
+ dsim->user_brightness = brightness;
+ if ((brightness > dsim->max_brightness) &&
+ (brightness <= MAX_BRIGHTNESS)) {
+ brightness = dsim->max_brightness;
+ }
+
nt36672a_update_brightness(brightness);
+ dsim->brightness = brightness;
return 0;
}
return count;
}
+#endif
static ssize_t panel_cabc_mode_show(struct device *dev,
struct device_attribute *attr, char *buf)
mutex_lock(&panel->lock);
+#if defined(CONFIG_EXYNOS_PANEL_CABC)
ret = nt36672a_cabc_mode(panel->dsim, CABC_READ_MODE);
-
+#endif
mutex_unlock(&panel->lock);
count = snprintf(buf, PAGE_SIZE, "cabc_mode = %d, ret = %d\n",
mutex_unlock(&panel->lock);
pr_info("%s: %d\n", __func__, value);
-
+#if defined(CONFIG_EXYNOS_PANEL_CABC)
nt36672a_cabc_mode(panel->dsim, panel->cabc_mode);
+#endif
+ return count;
+}
+
+static ssize_t panel_max_brightness_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t count = 0;
+ struct dsim_device *dsim = get_dsim_drvdata(0);
+
+ count = snprintf(buf, PAGE_SIZE, "max_brightness = %d\n",
+ dsim->max_brightness);
+
+ return count;
+}
+
+static ssize_t panel_max_brightness_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ unsigned int value = 0;
+ struct dsim_device *dsim = get_dsim_drvdata(0);
+ int old_brightness;
+
+ ret = kstrtouint(buf, 0, &value);
+ if (ret < 0)
+ return ret;
+
+ mutex_lock(&dsim->bl_lock);
+
+ old_brightness = dsim->brightness;
+
+ if (value > MAX_BRIGHTNESS) {
+ dsim->max_brightness = MAX_BRIGHTNESS;
+ dsim->brightness = dsim->user_brightness;
+ } else if ((value >= MIN_BRIGHTNESS) && (value <= MAX_BRIGHTNESS)) {
+ dsim->max_brightness = value;
+ if (dsim->user_brightness > dsim->max_brightness)
+ dsim->brightness = dsim->max_brightness;
+ else
+ dsim->brightness = dsim->user_brightness;
+ } else {
+ goto end;
+ }
+
+ if (old_brightness != dsim->brightness) {
+ nt36672a_update_brightness(dsim->brightness);
+ }
+
+end:
+ mutex_unlock(&dsim->bl_lock);
+
+ pr_info("%s: %d\n", __func__, dsim->max_brightness);
return count;
}
+static DEVICE_ATTR(max_brightness, 0660, panel_max_brightness_show,
+ panel_max_brightness_store);
+
+
+static ssize_t panel_brightness_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ ssize_t count = 0;
+ struct dsim_device *dsim = get_dsim_drvdata(0);
+
+ count = snprintf(buf, PAGE_SIZE, "brightness = %d\n",
+ dsim->brightness);
+
+ return count;
+}
+
+static ssize_t panel_brightness_store(struct device *dev,
+ struct device_attribute *attr, const char *buf, size_t count)
+{
+ int ret;
+ unsigned int value = 0;
+ struct dsim_device *dsim = get_dsim_drvdata(0);
+
+ ret = kstrtouint(buf, 0, &value);
+ if (ret < 0)
+ return ret;
+
+ mutex_lock(&dsim->bl_lock);
+
+ if (value <= dsim->max_brightness) {
+ dsim->brightness = value;
+ nt36672a_update_brightness(dsim->brightness);
+ } else if (value <= MAX_BRIGHTNESS) {
+ dsim->user_brightness = value;
+ } else {
+ pr_err("%s, brightness value is wrong[%d]\n",
+ __func__, value);
+ }
+
+ mutex_unlock(&dsim->bl_lock);
+
+ pr_info("%s: %d\n", __func__, dsim->brightness);
+
+ return count;
+}
+
+static DEVICE_ATTR(brightness, 0660, panel_brightness_show,
+ panel_brightness_store);
+
static DEVICE_ATTR(cabc_mode, 0660, panel_cabc_mode_show,
panel_cabc_mode_store);
-#endif
static ssize_t lcd_panel_supplier_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
static struct attribute *panel_attrs[] = {
&dev_attr_cabc_mode.attr,
&dev_attr_panel_supplier.attr,
+ &dev_attr_max_brightness.attr,
+ &dev_attr_brightness.attr,
NULL,
};
ATTRIBUTE_GROUPS(panel);
bd->props.max_brightness = MAX_BRIGHTNESS;
bd->props.brightness = DEFAULT_BRIGHTNESS;
+ dsim->max_brightness = MAX_BRIGHTNESS;
+ dsim->brightness = DEFAULT_BRIGHTNESS;
nt36672a_create_sysfs(dsim);
-#if defined(CONFIG_EXYNOS_PANEL_CABC)
panel = kzalloc(sizeof(struct panel_device), GFP_KERNEL);
if (!panel) {
pr_err("failed to allocate panel\n");
}
mutex_init(&panel->lock);
+ mutex_init(&dsim->bl_lock);
dev_set_drvdata(panel->dev, panel);
panel_no++;
exit1:
kfree(panel);
exit0:
-#endif
return ret;
}
return backlightlevel;
}
-static int s6e3fa0_update_brightness(struct dsim_device *dsim, int brightness)
+static int s6e3fa0_update_brightness(int brightness)
{
int backlightlevel;
brightness = dsim->max_brightness;
}
- s6e3fa0_update_brightness(dsim, brightness);
+ dsim->user_brightness = brightness;
+ if ((brightness > dsim->max_brightness) &&
+ (brightness <= MAX_BRIGHTNESS)) {
+ brightness = dsim->max_brightness;
+ }
+
+ s6e3fa0_update_brightness(brightness);
dsim->brightness = brightness;
return 1;
int ret;
unsigned int value = 0;
struct dsim_device *dsim = get_dsim_drvdata(0);
+ int old_brightness;
ret = kstrtouint(buf, 0, &value);
if (ret < 0)
mutex_lock(&dsim->bl_lock);
+ old_brightness = dsim->brightness;
+
if (value > MAX_BRIGHTNESS) {
dsim->max_brightness = MAX_BRIGHTNESS;
- if (dsim->log_brightness > 0)
- dsim->brightness = dsim->log_brightness;
- dsim->bd->props.brightness = dsim->brightness;
- s6e3fa0_set_brightness(dsim->bd);
- }
-
- if ((value >= MIN_BRIGHTNESS) && (value <= MAX_BRIGHTNESS))
+ dsim->brightness = dsim->user_brightness;
+ } else if ((value >= MIN_BRIGHTNESS) && (value <= MAX_BRIGHTNESS)) {
dsim->max_brightness = value;
+ if (dsim->user_brightness > dsim->max_brightness)
+ dsim->brightness = dsim->max_brightness;
+ else
+ dsim->brightness = dsim->user_brightness;
+ } else {
+ goto end;
+ }
- if (dsim->brightness > dsim->max_brightness) {
- dsim->brightness = dsim->max_brightness;
- s6e3fa0_update_brightness(dsim, dsim->brightness);
+ if (old_brightness != dsim->brightness) {
+ s6e3fa0_update_brightness(dsim->brightness);
}
+end:
mutex_unlock(&dsim->bl_lock);
pr_info("%s: %d\n", __func__, dsim->max_brightness);
dsim->bd->props.brightness = dsim->brightness;
s6e3fa0_set_brightness(dsim->bd);
} else if (value <= MAX_BRIGHTNESS) {
- dsim->log_brightness = value;
+ dsim->user_brightness = value;
} else {
pr_err("%s, brightness value is wrong[%d]\n",
__func__, value);
}
mutex_init(&panel->lock);
+ mutex_init(&dsim->bl_lock);
dev_set_drvdata(panel->dev, panel);
panel_no++;