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

Commit 80bc1509 authored by Kavya Nunna's avatar Kavya Nunna
Browse files

regulator: qpnp-lcdb: Add sysfs class to enable/disable the irq



lcdb interrupts need to be disabled and enabled during the entry
and exit of the secure display use case respectively. Add sysfs
property to allow the userspace to perform this operation.

To disable the interrupts:
	echo 1 > /sys/class/lcd_bias/secure_mode

To enable the interrupts:
	echo 0 > /sys/class/lcd_bias/secure_mode

Change-Id: I9763b788deab448f223ab108d3063f246e138f0e
Signed-off-by: default avatarKavya Nunna <knunna@codeaurora.org>
parent 387632bf
Loading
Loading
Loading
Loading
+71 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ struct qpnp_lcdb {
	struct device			*dev;
	struct platform_device		*pdev;
	struct regmap			*regmap;
	struct class			lcdb_class;
	struct pmic_revid_data		*pmic_rev_id;
	u32				base;
	u32				wa_flags;
@@ -229,6 +230,8 @@ struct qpnp_lcdb {
	bool				lcdb_enabled;
	bool				settings_saved;
	bool				lcdb_sc_disable;
	/* Tracks the secure UI mode entry/exit */
	bool				secure_mode;
	int				sc_count;
	ktime_t				sc_module_enable_time;

@@ -1203,6 +1206,9 @@ static int qpnp_lcdb_ldo_regulator_enable(struct regulator_dev *rdev)
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	mutex_lock(&lcdb->lcdb_mutex);
	rc = qpnp_lcdb_enable(lcdb);
	if (rc < 0)
@@ -1217,6 +1223,9 @@ static int qpnp_lcdb_ldo_regulator_disable(struct regulator_dev *rdev)
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	mutex_lock(&lcdb->lcdb_mutex);
	rc = qpnp_lcdb_disable(lcdb);
	if (rc < 0)
@@ -1239,6 +1248,9 @@ static int qpnp_lcdb_ldo_regulator_set_voltage(struct regulator_dev *rdev,
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	rc = qpnp_lcdb_set_voltage(lcdb, min_uV / 1000, LDO);
	if (rc < 0)
		pr_err("Failed to set LDO voltage rc=%c\n", rc);
@@ -1276,6 +1288,9 @@ static int qpnp_lcdb_ncp_regulator_enable(struct regulator_dev *rdev)
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	mutex_lock(&lcdb->lcdb_mutex);
	rc = qpnp_lcdb_enable(lcdb);
	if (rc < 0)
@@ -1290,6 +1305,9 @@ static int qpnp_lcdb_ncp_regulator_disable(struct regulator_dev *rdev)
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	mutex_lock(&lcdb->lcdb_mutex);
	rc = qpnp_lcdb_disable(lcdb);
	if (rc < 0)
@@ -1312,6 +1330,9 @@ static int qpnp_lcdb_ncp_regulator_set_voltage(struct regulator_dev *rdev,
	int rc = 0;
	struct qpnp_lcdb *lcdb  = rdev_get_drvdata(rdev);

	if (lcdb->secure_mode)
		return 0;

	rc = qpnp_lcdb_set_voltage(lcdb, min_uV / 1000, NCP);
	if (rc < 0)
		pr_err("Failed to set LDO voltage rc=%c\n", rc);
@@ -1959,6 +1980,8 @@ static int qpnp_lcdb_hw_init(struct qpnp_lcdb *lcdb)

	if (lcdb->sc_irq >= 0 && !(lcdb->wa_flags & NCP_SCP_DISABLE_WA)) {
		lcdb->sc_count = 0;
		irq_set_status_flags(lcdb->sc_irq,
					IRQ_DISABLE_UNLAZY);
		rc = devm_request_threaded_irq(lcdb->dev, lcdb->sc_irq,
				NULL, qpnp_lcdb_sc_irq_handler, IRQF_ONESHOT,
				"qpnp_lcdb_sc_irq", lcdb);
@@ -2059,6 +2082,44 @@ static int qpnp_lcdb_parse_dt(struct qpnp_lcdb *lcdb)
	return rc;
}

static ssize_t qpnp_lcdb_irq_control(struct class *c,
					struct class_attribute *attr,
					const char *buf, size_t count)
{
	struct qpnp_lcdb *lcdb = container_of(c, struct qpnp_lcdb,
							lcdb_class);
	int val, rc;

	rc = kstrtouint(buf, 0, &val);

	if (rc < 0)
		return rc;

	if (val != 0 && val != 1)
		return count;

	if (val == 1 && !lcdb->secure_mode) {
		if (lcdb->sc_irq > 0)
			disable_irq(lcdb->sc_irq);

		lcdb->secure_mode = true;
	} else if (val == 0 && lcdb->secure_mode) {

		if (lcdb->sc_irq > 0)
			enable_irq(lcdb->sc_irq);

		lcdb->secure_mode = false;
	}

	return count;
}

static struct  class_attribute lcdb_attributes[] = {
	[0] =  __ATTR(secure_mode, 0664, NULL,
				qpnp_lcdb_irq_control),
	__ATTR_NULL,
};

static int qpnp_lcdb_regulator_probe(struct platform_device *pdev)
{
	int rc;
@@ -2098,6 +2159,16 @@ static int qpnp_lcdb_regulator_probe(struct platform_device *pdev)
		return rc;
	}

	lcdb->lcdb_class.name = "lcd_bias";
	lcdb->lcdb_class.owner = THIS_MODULE;
	lcdb->lcdb_class.class_attrs = lcdb_attributes;

	rc = class_register(&lcdb->lcdb_class);
	if (rc < 0) {
		pr_err("Failed to register lcdb  class rc = %d\n", rc);
		return rc;
	}

	rc = qpnp_lcdb_hw_init(lcdb);
	if (rc < 0)
		pr_err("Failed to initialize LCDB module rc=%d\n", rc);