Loading drivers/regulator/qpnp-lcdb-regulator.c +71 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) Loading @@ -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) Loading @@ -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); Loading Loading @@ -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) Loading @@ -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) Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading Loading
drivers/regulator/qpnp-lcdb-regulator.c +71 −0 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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) Loading @@ -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) Loading @@ -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); Loading Loading @@ -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) Loading @@ -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) Loading @@ -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); Loading Loading @@ -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); Loading Loading @@ -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; Loading Loading @@ -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); Loading