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

Commit 9fc9808a authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

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

parents aeedb09c 80bc1509
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);