static ssize_t mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value = 0; int ret; int result[5] = {0,}; ret = kstrtouint(buf, 0, &value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); if (value >= MODE_MAX) { value = STANDARD; return -EINVAL; } mutex_lock(&mdnie->lock); mdnie->mode = value; mutex_unlock(&mdnie->lock); if (!mdnie->color_correction) { ret = get_panel_coordinate(mdnie, result); if (ret > 0) update_color_position(mdnie, ret); } mdnie_update(mdnie); return count; }
static ssize_t auto_brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; static unsigned int update; ret = kstrtouint(buf, 0, &value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); mutex_lock(&mdnie->lock); #if defined(CONFIG_PANEL_S6E3HA3_DYNAMIC) || defined(CONFIG_PANEL_S6E3HF3_DYNAMIC) update = 0; if (IS_HBM(mdnie->auto_brightness) == IS_HBM(value)) { if (IS_HBM(mdnie->auto_brightness)&&(mdnie->auto_brightness != value)) update = 1; } else update = 1; #else update = (IS_HBM(mdnie->auto_brightness) != IS_HBM(value)) ? 1 : 0; #endif mdnie->hbm = IS_HBM(value) ? HBM_ON : HBM_OFF; mdnie->auto_brightness = value; mutex_unlock(&mdnie->lock); if (update) mdnie_update(mdnie); return count; }
static ssize_t mdnie_preset_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned int ret = -EINVAL; unsigned int val = 0; struct mdnie_info *m; // get pointer to global mdnie control structure m = *((void **)kallsyms_lookup_name("g_mdnie")); // read value from input buffer ret = sscanf(buf, "%d", &val); // check received preset value for validity if ((val >= 0) && (val <= 1)) { // store preset in global variable mdnie_preset = val; // update mdnie settings mdnie_update(m); // write debug info if (mdnie_preset == 0) printk("Boeffla-kernel: mdnie preset set to original\n"); else printk("Boeffla-kernel: mdnie preset set to Hardcore speedmod\n"); } return count; }
static ssize_t auto_brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; static unsigned int update; ret = kstrtouint(buf, 0, &value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); mutex_lock(&mdnie->lock); update = (IS_HBM(mdnie->auto_brightness) != IS_HBM(value)) ? 1 : 0; mdnie->hbm = IS_HBM(value) ? HBM_ON : HBM_OFF; mdnie->auto_brightness = value; mutex_unlock(&mdnie->lock); if (update) mdnie_update(mdnie); return count; }
static ssize_t cabc_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; if (mdnie->auto_brightness) return -EINVAL; ret = kstrtoul(buf, 0, (unsigned long *)&value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); if (value >= CABC_MAX) value = CABC_OFF; value = (value) ? CABC_ON : CABC_OFF; mutex_lock(&mdnie->lock); mdnie->cabc = value; mutex_unlock(&mdnie->lock); mdnie_update(mdnie); if ((mdnie->enable) && (mdnie->bd_enable)) update_brightness(mdnie); return count; }
static void mdnie_late_resume(struct early_suspend *h) { struct mdnie_info *mdnie = container_of(h, struct mdnie_info, early_suspend); #if defined(CONFIG_FB_MDNIE_PWM) struct lcd_platform_data *pd = mdnie->lcd_pd; #endif dev_info(mdnie->dev, "+%s\n", __func__); #if defined(CONFIG_FB_MDNIE_PWM) if (mdnie->enable) mdnie_pwm_control(mdnie, 0); if (pd && pd->power_on) pd->power_on(NULL, 1); if (mdnie->enable) { dev_info(&mdnie->bd->dev, "brightness=%d\n", mdnie->bd->props.brightness); update_brightness(mdnie); } mdnie->bd_enable = TRUE; #endif mdnie_update(mdnie); dev_info(mdnie->dev, "-%s\n", __func__); return; }
static ssize_t scenario_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; ret = kstrtoul(buf, 0, (unsigned long *)&value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); if (!SCENARIO_IS_VALID(value)) value = UI_MODE; #if defined(CONFIG_FB_MDNIE_PWM) if (value >= SCENARIO_MAX) value = UI_MODE; #endif mutex_lock(&mdnie->lock); mdnie->scenario = value; mutex_unlock(&mdnie->lock); mdnie_update(mdnie); #if defined(CONFIG_FB_MDNIE_PWM) if ((mdnie->enable) && (mdnie->bd_enable)) update_brightness(mdnie); #endif return count; }
static ssize_t tuning_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); int ret; if (sysfs_streq(buf, "0") || sysfs_streq(buf, "1")) { ret = kstrtouint(buf, 0, &mdnie->tuning); if (ret < 0) return ret; if (!mdnie->tuning) memset(mdnie->path, 0, sizeof(mdnie->path)); dev_info(dev, "%s: %s\n", __func__, mdnie->tuning ? "enable" : "disable"); } else { if (!mdnie->tuning) return count; if (count > (sizeof(mdnie->path) - sizeof(MDNIE_SYSFS_PREFIX))) { dev_err(dev, "file name %s is too long\n", mdnie->path); return -ENOMEM; } memset(mdnie->path, 0, sizeof(mdnie->path)); snprintf(mdnie->path, sizeof(MDNIE_SYSFS_PREFIX) + count-1, "%s%s", MDNIE_SYSFS_PREFIX, buf); dev_info(dev, "%s: %s\n", __func__, mdnie->path); mdnie_update(mdnie); } return count; }
static ssize_t accessibility_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value, s[9], cabc, i, len = 0; int ret; unsigned short *wbuf; char str[100] = {0,}; ret = sscanf(buf, "%d %x %x %x %x %x %x %x %x %x", &value, &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8]); dev_info(dev, "%s: value=%d\n", __func__, value); if (ret < 0) return ret; else { if (value >= ACCESSIBILITY_MAX) value = ACCESSIBILITY_OFF; mutex_lock(&mdnie->lock); mdnie->accessibility = value; if (value == COLOR_BLIND) { if (ret != 10) { mutex_unlock(&mdnie->lock); return -EINVAL; } for (cabc = 0; cabc < CABC_MAX; cabc++) { wbuf = accessibility_table[cabc][COLOR_BLIND].sequence; if (IS_ERR_OR_NULL(wbuf)) continue; i = 0; while (wbuf[i] != END_SEQ) { if (ADDRESS_IS_SCR_RGB(wbuf[i])) wbuf[i+1] = s[SCR_RGB_MASK(wbuf[i])]; i += 2; } } i = 0; len = sprintf(str + len, "%s: ", __func__); while (len < sizeof(str) && i < ARRAY_SIZE(s)) { len += sprintf(str + len, "0x%04x, ", s[i]); i++; } dev_info(dev, "%s\n", str); } mutex_unlock(&mdnie->lock); mdnie_update(mdnie); } return count; }
static ssize_t accessibility_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); int value; unsigned int s[12] = {0, }, i = 0; int ret; mdnie_t *wbuf; ret = sscanf(buf, "%d %x %x %x %x %x %x %x %x %x %x %x %x", &value, &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9], &s[10], &s[11]); dev_info(dev, "%s: value=%d param cnt : %d\n", __func__, value, ret); if (ret < 0) return ret; else { if (value >= ACCESSIBILITY_MAX) value = ACCESSIBILITY_OFF; mutex_lock(&mdnie->lock); mdnie->accessibility = value; if (value == COLOR_BLIND) { if (ret != MDNIE_COLOR_BLIND_TUNE_CNT + 1) { mutex_unlock(&mdnie->lock); return -EINVAL; } wbuf = &accessibility_table[COLOR_BLIND].tune[MDNIE_CMD1].sequence[MDNIE_COLOR_BLIND_OFFSET]; while (i < MDNIE_COLOR_BLIND_TUNE_CNT) { wbuf[i * 2 + 0] = GET_LSB_8BIT(s[i]); wbuf[i * 2 + 1] = GET_MSB_8BIT(s[i]); i++; } dev_info(dev, "%s: %s\n", __func__, buf); } else if (value == COLOR_BLIND_HBM) { if (ret != MDNIE_COLOR_BLIND_HBM_TUNE_CNT + 1) { mutex_unlock(&mdnie->lock); return -EINVAL; } wbuf = &accessibility_table[COLOR_BLIND_HBM].tune[MDNIE_CMD1].sequence[MDNIE_COLOR_BLIND_OFFSET]; while (i < MDNIE_COLOR_BLIND_HBM_TUNE_CNT) { wbuf[i * 2 + 0] = GET_LSB_8BIT(s[i]); wbuf[i * 2 + 1] = GET_MSB_8BIT(s[i]); i++; } dev_info(dev, "%s: %s\n", __func__, buf); } mutex_unlock(&mdnie->lock); mdnie_update(mdnie); } return count; }
int mdnie_update_ext(int mode) { struct mdnie_info *mdnie = g_mdnie; /* mode = 1 : Main LCD */ /* mode = 0 : EVF */ if (mode) mdnie_update(mdnie); else mdnie_evf_update(mdnie); return 0; }
static ssize_t accessibility_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); int value; unsigned int s[12] = {0, }, i = 0; int ret; mdnie_t *wbuf; struct mdnie_scr_info *scr_info = mdnie->tune->scr_info; ret = sscanf(buf, "%d %x %x %x %x %x %x %x %x %x %x %x %x", &value, &s[0], &s[1], &s[2], &s[3], &s[4], &s[5], &s[6], &s[7], &s[8], &s[9], &s[10], &s[11]); dev_info(dev, "%s: value: %d, cnt: %d\n", __func__, value, ret); if (ret < 0) return ret; else { if (value >= ACCESSIBILITY_MAX) value = ACCESSIBILITY_OFF; mutex_lock(&mdnie->lock); mdnie->accessibility = value; if (value == COLOR_BLIND || value == COLOR_BLIND_HBM) { if (ret > ARRAY_SIZE(s) + 1) { mutex_unlock(&mdnie->lock); return -EINVAL; } wbuf = &mdnie->tune->accessibility_table[value].seq[scr_info->index].cmd[scr_info->color_blind]; while (i < ret - 1) { wbuf[i * 2 + 0] = GET_LSB_8BIT(s[i]); wbuf[i * 2 + 1] = GET_MSB_8BIT(s[i]); i++; } dev_info(dev, "%s: %s\n", __func__, buf); } mutex_unlock(&mdnie->lock); mdnie_update(mdnie); } return count; }
static int fb_notifier_callback(struct notifier_block *self, unsigned long event, void *data) { struct mdnie_info *mdnie; struct fb_event *evdata = data; int fb_blank; switch (event) { case FB_EVENT_BLANK: break; default: return 0; } mdnie = container_of(self, struct mdnie_info, fb_notif); fb_blank = *(int *)evdata->data; dev_info(mdnie->dev, "%s: %d\n", __func__, fb_blank); if (evdata->info->node != 0) return 0; if (fb_blank == FB_BLANK_UNBLANK) { mutex_lock(&mdnie->lock); mdnie->enable = 1; mutex_unlock(&mdnie->lock); mdnie_update(mdnie); if (mdnie->tune->trans_info->enable) mdnie->disable_trans_dimming = 0; } else if (fb_blank == FB_BLANK_POWERDOWN) { mutex_lock(&mdnie->lock); mdnie->enable = 0; if (mdnie->tune->trans_info->enable) mdnie->disable_trans_dimming = 1; mutex_unlock(&mdnie->lock); } return 0; }
static ssize_t mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value = 0; int ret; #if !defined(CONFIG_FB_MDNIE_PWM) int result[5] = {0,}; #endif ret = kstrtoul(buf, 0, (unsigned long *)&value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); if (value >= MODE_MAX) { value = STANDARD; return -EINVAL; } mutex_lock(&mdnie->lock); mdnie->mode = value; mutex_unlock(&mdnie->lock); #if !defined(CONFIG_FB_MDNIE_PWM) if (!mdnie->color_correction) { ret = get_panel_coordinate(mdnie, result); if (ret > 0) update_color_position(mdnie, ret - 1); } #endif mdnie_update(mdnie); #if defined(CONFIG_FB_MDNIE_PWM) if ((mdnie->enable) && (mdnie->bd_enable)) update_brightness(mdnie); #endif return count; }
static ssize_t hmtColorTemp_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; ret = kstrtouint(buf, 0, &value); if (ret < 0) return ret; if (value != mdnie->hmt_mode && value < HMT_MDNIE_MAX) { mutex_lock(&mdnie->lock); mdnie->hmt_mode = value; mutex_unlock(&mdnie->lock); mdnie_update(mdnie); } return count; }
static ssize_t mdnie_ldu_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); mdnie_t *wbuf; u8 mode, scenario; int idx; int ret; struct mdnie_scr_info *scr_info = mdnie->tune->scr_info; ret = sscanf(buf, "%d", &idx); if (ret < 0) return ret; if (idx < 0 || idx > 5) { dev_info(dev, "%s: invalid input: %d\n", __func__, idx); return -EINVAL; } mutex_lock(&mdnie->lock); for (mode = 0; mode < MODE_MAX; mode++) { for (scenario = 0; scenario <= EMAIL_MODE; scenario++) { wbuf = mdnie->tune->main_table[scenario][mode].seq[scr_info->index].cmd; if (IS_ERR_OR_NULL(wbuf)) continue; if (scenario != EBOOK_MODE) { wbuf[scr_info->white_r] = mdnie->tune->adjust_ldu_rgb_table[mode][idx * 3 + 0]; wbuf[scr_info->white_g] = mdnie->tune->adjust_ldu_rgb_table[mode][idx * 3 + 1]; wbuf[scr_info->white_b] = mdnie->tune->adjust_ldu_rgb_table[mode][idx * 3 + 2]; } } } mutex_unlock(&mdnie->lock); mdnie_update(mdnie); return count; }
static ssize_t auto_brightness_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { struct mdnie_info *mdnie = dev_get_drvdata(dev); int value; int rc; rc = strict_strtoul(buf, (unsigned int)0, (unsigned long *)&value); if (rc < 0) return rc; else { if (mdnie->auto_brightness != value) { dev_info(dev, "%s: %d, %d\n", __func__, mdnie->auto_brightness, value); mutex_lock(&mdnie->dev_lock); mdnie->auto_brightness = value; mutex_lock(&mdnie->lock); mdnie->cabc = (value) ? CABC_ON : CABC_OFF; mutex_unlock(&mdnie->lock); if (mdnie->auto_brightness >= 5) mdnie->power_lut_idx = LUT_LEVEL_OUTDOOR_2; else if (mdnie->auto_brightness >= 3) mdnie->power_lut_idx = LUT_LEVEL_OUTDOOR_1; else mdnie->power_lut_idx = LUT_LEVEL_MANUAL_AND_INDOOR; mutex_unlock(&mdnie->dev_lock); mdnie_update(mdnie); if (mdnie->bd_enable) update_brightness(mdnie); } } return size; }
static ssize_t scenario_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct mdnie_info *mdnie = dev_get_drvdata(dev); unsigned int value; int ret; ret = kstrtouint(buf, 0, &value); if (ret < 0) return ret; dev_info(dev, "%s: value=%d\n", __func__, value); if (!SCENARIO_IS_VALID(value)) value = UI_MODE; mutex_lock(&mdnie->lock); mdnie->scenario = value; mutex_unlock(&mdnie->lock); mdnie_update(mdnie); return count; }
int mdnie_register(struct device *p, void *data, mdnie_w w, mdnie_r r, u16 *coordinate) { int ret = 0; struct mdnie_info *mdnie; mdnie_class = class_create(THIS_MODULE, "mdnie"); if (IS_ERR_OR_NULL(mdnie_class)) { pr_err("failed to create mdnie class\n"); ret = -EINVAL; goto error0; } mdnie_class->dev_attrs = mdnie_attributes; mdnie = kzalloc(sizeof(struct mdnie_info), GFP_KERNEL); if (!mdnie) { pr_err("failed to allocate mdnie\n"); ret = -ENOMEM; goto error1; } mdnie->dev = device_create(mdnie_class, p, 0, &mdnie, "mdnie"); if (IS_ERR_OR_NULL(mdnie->dev)) { pr_err("failed to create mdnie device\n"); ret = -EINVAL; goto error2; } mdnie->scenario = UI_MODE; mdnie->mode = STANDARD; mdnie->enable = 0; mdnie->tuning = 0; mdnie->accessibility = ACCESSIBILITY_OFF; mdnie->bypass = BYPASS_OFF; mdnie->data = data; mdnie->ops.write = w; mdnie->ops.read = r; mdnie->coordinate[0] = coordinate[0]; mdnie->coordinate[1] = coordinate[1]; mutex_init(&mdnie->lock); mutex_init(&mdnie->dev_lock); dev_set_drvdata(mdnie->dev, mdnie); mdnie_register_fb(mdnie); mdnie->enable = 1; mdnie_update(mdnie); dev_info(mdnie->dev, "registered successfully\n"); return 0; error2: kfree(mdnie); error1: class_destroy(mdnie_class); error0: return ret; }
static int mdnie_probe(struct platform_device *pdev) { #if defined(CONFIG_FB_MDNIE_PWM) struct platform_mdnie_data *pdata = pdev->dev.platform_data; #endif struct mdnie_info *mdnie; int ret = 0; mdnie_class = class_create(THIS_MODULE, dev_name(&pdev->dev)); if (IS_ERR_OR_NULL(mdnie_class)) { pr_err("failed to create mdnie class\n"); ret = -EINVAL; goto error0; } mdnie_class->dev_attrs = mdnie_attributes; mdnie = kzalloc(sizeof(struct mdnie_info), GFP_KERNEL); if (!mdnie) { pr_err("failed to allocate mdnie\n"); ret = -ENOMEM; goto error1; } mdnie->dev = device_create(mdnie_class, &pdev->dev, 0, &mdnie, "mdnie"); if (IS_ERR_OR_NULL(mdnie->dev)) { pr_err("failed to create mdnie device\n"); ret = -EINVAL; goto error2; } #if defined(CONFIG_FB_MDNIE_PWM) if (!pdata) { pr_err("no platform data specified\n"); ret = -EINVAL; goto error3; } mdnie->bd = backlight_device_register("panel", mdnie->dev, mdnie, &mdnie_backlight_ops, NULL); mdnie->bd->props.max_brightness = MAX_BRIGHTNESS_LEVEL; mdnie->bd->props.brightness = DEFAULT_BRIGHTNESS; mdnie->bd_enable = TRUE; mdnie->lcd_pd = pdata->lcd_pd; ret = device_create_file(&mdnie->bd->dev, &dev_attr_auto_brightness); if (ret < 0) dev_err(&mdnie->bd->dev, "failed to add sysfs entries, %d\n", __LINE__); #endif mdnie->scenario = UI_MODE; mdnie->mode = STANDARD; mdnie->enable = TRUE; mdnie->tuning = FALSE; mdnie->accessibility = ACCESSIBILITY_OFF; mdnie->cabc = CABC_OFF; #if defined(CONFIG_FB_MDNIE_PWM) mdnie->power_lut_idx = LUT_LEVEL_MANUAL_AND_INDOOR; mdnie->auto_brightness = 0; #endif mutex_init(&mdnie->lock); mutex_init(&mdnie->dev_lock); platform_set_drvdata(pdev, mdnie); dev_set_drvdata(mdnie->dev, mdnie); #ifdef CONFIG_HAS_EARLYSUSPEND #if defined(CONFIG_FB_MDNIE_PWM) mdnie->early_suspend.suspend = mdnie_early_suspend; #endif mdnie->early_suspend.resume = mdnie_late_resume; mdnie->early_suspend.level = EARLY_SUSPEND_LEVEL_DISABLE_FB - 1; register_early_suspend(&mdnie->early_suspend); #endif #if defined(CONFIG_FB_MDNIE_PWM) dev_info(mdnie->dev, "lcdtype: %d\n", pdata->display_type); if (pdata->display_type >= ARRAY_SIZE(backlight_table)) pdata->display_type = 0; mdnie->backlight = &backlight_table[pdata->display_type]; #endif #if defined(CONFIG_FB_S5P_S6F1202A) if (pdata->display_type == 0) memcpy(tuning_table, tuning_table_hydis, sizeof(tuning_table)); else if (pdata->display_type == 1) memcpy(tuning_table, tuning_table_sec, sizeof(tuning_table)); else if (pdata->display_type == 2) memcpy(tuning_table, tuning_table_boe, sizeof(tuning_table)); #endif g_mdnie = mdnie; mdnie_update(mdnie); dev_info(mdnie->dev, "registered successfully\n"); return 0; #if defined(CONFIG_FB_MDNIE_PWM) error3: device_destroy(mdnie_class, mdnie->dev->devt); #endif error2: kfree(mdnie); error1: class_destroy(mdnie_class); error0: return ret; }