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

Commit d5878186 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

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

parents 0d99384b 49b1339e
Loading
Loading
Loading
Loading
+72 −0
Original line number Diff line number Diff line
@@ -226,6 +226,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;
@@ -241,6 +242,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;

@@ -1334,6 +1337,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)
@@ -1348,6 +1354,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)
@@ -1370,6 +1379,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,
@@ -1413,6 +1425,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)
@@ -1427,6 +1442,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)
@@ -1449,6 +1467,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,
@@ -2120,6 +2141,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);
@@ -2241,6 +2264,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;
@@ -2280,6 +2342,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);