diff --git a/drivers/power/mmi_charger/qti_glink_charger/qti_glink_charger.c b/drivers/power/mmi_charger/qti_glink_charger/qti_glink_charger.c index 4aadb0fe27f9..10de6e2345aa 100644 --- a/drivers/power/mmi_charger/qti_glink_charger/qti_glink_charger.c +++ b/drivers/power/mmi_charger/qti_glink_charger/qti_glink_charger.c @@ -64,6 +64,7 @@ enum oem_property_type { OEM_PROP_DEMO_MODE, OEM_PROP_FACTORY_MODE, OEM_PROP_FACTORY_VERSION, + OEM_PROP_TCMD, OEM_PROP_MAX, }; @@ -667,6 +668,56 @@ static int qti_charger_write_profile(struct qti_charger *chg) return rc; } +static ssize_t tcmd_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + unsigned long r; + unsigned long mode; + struct qti_charger *chg = dev_get_drvdata(dev); + + if (!chg) { + pr_err("QTI: chip not valid\n"); + return -ENODEV; + } + + r = kstrtoul(buf, 0, &mode); + if (r) { + mmi_err(chg, "Invalid TCMD = %lu\n", mode); + return -EINVAL; + } + + r = qti_charger_write(chg, OEM_PROP_TCMD, + &mode, + sizeof(mode)); + + return r ? r : count; +} + +static ssize_t tcmd_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + int data; + struct qti_charger *chg = dev_get_drvdata(dev); + + if (!chg) { + pr_err("QTI: chip not valid\n"); + return -ENODEV; + } + + qti_charger_read(chg, OEM_PROP_TCMD, + &data, + sizeof(int)); + + return scnprintf(buf, CHG_SHOW_MAX_SIZE, "%d\n", data); +} + + +static DEVICE_ATTR(tcmd, 0664, + tcmd_show, + tcmd_store); + static int qti_charger_init(struct qti_charger *chg) { int rc; @@ -730,6 +781,13 @@ static int qti_charger_init(struct qti_charger *chg) mmi_info(chg, "qti charger init successfully\n"); } + rc = device_create_file(chg->dev, + &dev_attr_tcmd); + if (rc) { + mmi_err(chg, + "Couldn't create tcmd\n"); + } + return 0; } @@ -742,6 +800,8 @@ static void qti_charger_deinit(struct qti_charger *chg) return; } + device_remove_file(chg->dev, &dev_attr_tcmd); + /* unregister driver from mmi charger */ rc = mmi_unregister_charger_driver(chg->driver); if (rc) {