Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b5b489e authored by savoca's avatar savoca Committed by Razziell
Browse files

msm: mdss: KCAL: Send a pp display commit when changes are made



Sending a PP display commit when changes are made, to prevent waiting on a panel update from
some other part of the kernel. Sending a display commit takes care of locking and panel state
checking for us.

QC MDSS also handles queue-ing already for us, so remove that functionality from KCAL.

Signed-off-by: default avatarflar2 <asegaert@gmail.com>
Signed-off-by: default avatarAKabhishek <abhishekkaushik.star@gmail.com>
parent b1fb06e7
Loading
Loading
Loading
Loading
+30 −125
Original line number Diff line number Diff line
@@ -22,15 +22,6 @@
#include <linux/init.h>
#include <linux/module.h>

#if defined(CONFIG_MMI_PANEL_NOTIFICATIONS) && defined(CONFIG_FB)
#include <mach/mmi_panel_notifier.h>
#include <linux/notifier.h>
#include <linux/fb.h>
#elif defined(CONFIG_FB)
#include <linux/notifier.h>
#include <linux/fb.h>
#endif

#include "mdss_mdp.h"

#define DEF_PCC 0x100
@@ -38,13 +29,6 @@
#define PCC_ADJ 0x80

struct kcal_lut_data {
#if defined(CONFIG_MMI_PANEL_NOTIFICATIONS) && defined(CONFIG_FB)
	struct mmi_notifier panel_nb;
#elif defined(CONFIG_FB)
	struct device dev;
	struct notifier_block panel_nb;
#endif
	bool queue_changes;
	int red;
	int green;
	int blue;
@@ -183,19 +167,24 @@ static int mdss_mdp_kcal_store_fb0_ctl(void)
	return 0;
}

static bool mdss_mdp_kcal_is_panel_on(void)
static int mdss_mdp_kcal_display_commit(void)
{
	int i;
	int ret = 0;
	struct mdss_mdp_ctl *ctl;
	struct mdss_data_type *mdata = mdss_mdp_get_mdata();

	for (i = 0; i < mdata->nctl; i++) {
		ctl = mdata->ctl_off + i;
		if (mdss_mdp_ctl_is_power_on(ctl))
			return true;
		/* pp setup requires mfd */
		if ((mdss_mdp_ctl_is_power_on(ctl)) && (ctl->mfd)) {
			ret = mdss_mdp_pp_setup(ctl);
			if (ret)
				pr_err("%s: setup failed: %d\n", __func__, ret);
		}
	}

	return false;
	return ret;
}

static void mdss_mdp_kcal_update_pcc(struct kcal_lut_data *lut_data)
@@ -338,10 +327,8 @@ static ssize_t kcal_store(struct device *dev, struct device_attribute *attr,
	lut_data->green = kcal_g;
	lut_data->blue = kcal_b;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pcc(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -367,10 +354,8 @@ static ssize_t kcal_min_store(struct device *dev,

	lut_data->minimum = kcal_min;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pcc(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -396,12 +381,10 @@ static ssize_t kcal_enable_store(struct device *dev,

	lut_data->enable = kcal_enable;

	if (mdss_mdp_kcal_is_panel_on()) {
	mdss_mdp_kcal_update_pcc(lut_data);
	mdss_mdp_kcal_update_pa(lut_data);
	mdss_mdp_kcal_update_igc(lut_data);
	} else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -427,10 +410,8 @@ static ssize_t kcal_invert_store(struct device *dev,

	lut_data->invert = kcal_invert;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_igc(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -455,10 +436,8 @@ static ssize_t kcal_sat_store(struct device *dev,

	lut_data->sat = kcal_sat;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pa(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -483,10 +462,8 @@ static ssize_t kcal_hue_store(struct device *dev,

	lut_data->hue = kcal_hue;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pa(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -511,10 +488,8 @@ static ssize_t kcal_val_store(struct device *dev,

	lut_data->val = kcal_val;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pa(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -539,10 +514,8 @@ static ssize_t kcal_cont_store(struct device *dev,

	lut_data->cont = kcal_cont;

	if (mdss_mdp_kcal_is_panel_on())
	mdss_mdp_kcal_update_pa(lut_data);
	else
		lut_data->queue_changes = true;
	mdss_mdp_kcal_display_commit();

	return count;
}
@@ -567,39 +540,6 @@ static DEVICE_ATTR(kcal_val, S_IWUSR | S_IRUGO, kcal_val_show, kcal_val_store);
static DEVICE_ATTR(kcal_cont, S_IWUSR | S_IRUGO, kcal_cont_show,
	kcal_cont_store);

static int mdss_mdp_kcal_update_queue(struct device *dev)
{
	struct kcal_lut_data *lut_data = dev_get_drvdata(dev);

	if (lut_data->queue_changes) {
		mdss_mdp_kcal_update_pcc(lut_data);
		mdss_mdp_kcal_update_pa(lut_data);
		mdss_mdp_kcal_update_igc(lut_data);
		lut_data->queue_changes = false;
	}

	return 0;
}

#if defined(CONFIG_FB) && !defined(CONFIG_MMI_PANEL_NOTIFICATIONS)
static int fb_notifier_callback(struct notifier_block *nb,
	unsigned long event, void *data)
{
	int *blank;
	struct fb_event *evdata = data;
	struct kcal_lut_data *lut_data =
		container_of(nb, struct kcal_lut_data, panel_nb);

	if (evdata && evdata->data && event == FB_EVENT_BLANK) {
		blank = evdata->data;
		if (*blank == FB_BLANK_UNBLANK)
			mdss_mdp_kcal_update_queue(&lut_data->dev);
	}

	return 0;
}
#endif

static int kcal_ctrl_probe(struct platform_device *pdev)
{
	int ret;
@@ -625,29 +565,10 @@ static int kcal_ctrl_probe(struct platform_device *pdev)
	lut_data->val = DEF_PA;
	lut_data->cont = DEF_PA;

	lut_data->queue_changes = false;

	mdss_mdp_kcal_update_pcc(lut_data);
	mdss_mdp_kcal_update_pa(lut_data);
	mdss_mdp_kcal_update_igc(lut_data);

#if defined(CONFIG_MMI_PANEL_NOTIFICATIONS)
	lut_data->panel_nb.display_on = mdss_mdp_kcal_update_queue;
	lut_data->panel_nb.dev = &pdev->dev;
	ret = mmi_panel_register_notifier(&lut_data->panel_nb);
	if (ret) {
		pr_err("%s: unable to register MMI notifier\n", __func__);
		return ret;
	}
#elif defined(CONFIG_FB)
	lut_data->dev = pdev->dev;
	lut_data->panel_nb.notifier_call = fb_notifier_callback;
	ret = fb_register_client(&lut_data->panel_nb);
	if (ret) {
		pr_err("%s: unable to register fb notifier\n", __func__);
		return ret;
	}
#endif
	mdss_mdp_kcal_display_commit();

	ret = device_create_file(&pdev->dev, &dev_attr_kcal);
	ret |= device_create_file(&pdev->dev, &dev_attr_kcal_min);
@@ -659,24 +580,14 @@ static int kcal_ctrl_probe(struct platform_device *pdev)
	ret |= device_create_file(&pdev->dev, &dev_attr_kcal_cont);
	if (ret) {
		pr_err("%s: unable to create sysfs entries\n", __func__);
		goto out_notifier;
		return ret;
	}

	return 0;

out_notifier:
#if defined(CONFIG_MMI_PANEL_NOTIFICATIONS)
	mmi_panel_unregister_notifier(&lut_data->panel_nb);
#elif defined(CONFIG_FB)
	fb_unregister_client(&lut_data->panel_nb);
#endif
	return ret;
}

static int kcal_ctrl_remove(struct platform_device *pdev)
{
	struct kcal_lut_data *lut_data = platform_get_drvdata(pdev);

	device_remove_file(&pdev->dev, &dev_attr_kcal);
	device_remove_file(&pdev->dev, &dev_attr_kcal_min);
	device_remove_file(&pdev->dev, &dev_attr_kcal_enable);
@@ -686,12 +597,6 @@ static int kcal_ctrl_remove(struct platform_device *pdev)
	device_remove_file(&pdev->dev, &dev_attr_kcal_val);
	device_remove_file(&pdev->dev, &dev_attr_kcal_cont);

#if defined(CONFIG_MMI_PANEL_NOTIFICATIONS)
	mmi_panel_unregister_notifier(&lut_data->panel_nb);
#elif defined(CONFIG_FB)
	fb_unregister_client(&lut_data->panel_nb);
#endif

	return 0;
}

@@ -726,5 +631,5 @@ static void __exit kcal_ctrl_exit(void)
	platform_driver_unregister(&kcal_ctrl_driver);
}

late_initcall(kcal_ctrl_init);
module_init(kcal_ctrl_init);
module_exit(kcal_ctrl_exit);