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

Commit 09e74b90 authored by Kavya Nunna's avatar Kavya Nunna Committed by Gerrit - the friendly Code Review server
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>
Signed-off-by: default avatarShilpa Suresh <sbsure@codeaurora.org>
parent 38055361
Loading
Loading
Loading
Loading
+73 −1
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/*
 * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved.
 */

#define pr_fmt(fmt)	"LCDB: %s: " fmt, __func__
@@ -218,6 +218,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;
@@ -233,6 +234,8 @@ struct qpnp_lcdb {
	bool				settings_saved;
	bool				lcdb_sc_disable;
	bool				voltage_step_ramp;
	/* Tracks the secure UI mode entry/exit */
	bool				secure_mode;
	int				sc_count;
	ktime_t				sc_module_enable_time;

@@ -1326,6 +1329,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)
@@ -1340,6 +1346,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)
@@ -1362,6 +1371,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;

	lcdb->ldo.voltage_mv = min_uV / 1000;
	if (lcdb->voltage_step_ramp)
		rc = qpnp_lcdb_set_voltage_step(lcdb,
@@ -1405,6 +1417,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)
@@ -1419,6 +1434,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)
@@ -1441,6 +1459,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;

	lcdb->ncp.voltage_mv = min_uV / 1000;
	if (lcdb->voltage_step_ramp)
		rc = qpnp_lcdb_set_voltage_step(lcdb,
@@ -2112,6 +2133,8 @@ static int qpnp_lcdb_hw_init(struct qpnp_lcdb *lcdb)
	if (lcdb->sc_irq >= 0 &&
		lcdb->pmic_rev_id->pmic_subtype != PM660L_SUBTYPE) {
		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);
@@ -2233,6 +2256,45 @@ static int qpnp_lcdb_parse_dt(struct qpnp_lcdb *lcdb)
	return 0;
}

static ssize_t secure_mode_store(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 CLASS_ATTR_WO(secure_mode);

static struct attribute *lcdb_attrs[] = {
	&class_attr_secure_mode.attr,
	NULL,
};
ATTRIBUTE_GROUPS(lcdb);

static int qpnp_lcdb_regulator_probe(struct platform_device *pdev)
{
	int rc;
@@ -2272,6 +2334,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_groups = lcdb_groups;

	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);