aboutsummaryrefslogtreecommitdiff
path: root/drivers/misc/fastchg.c
diff options
context:
space:
mode:
authorengstk <eng.stk@sapo.pt>2017-07-31 18:28:24 +0100
committerSemavi Ulusoy <doc.divxm@gmail.com>2023-05-25 01:48:28 +0300
commitf2357465a39723366faac4a9fb77489fd5c08739 (patch)
tree2e02a4474e18cc87673e9d0b7e864195dda8bd98 /drivers/misc/fastchg.c
parentb870015c90676065016aaa65244a159f8e8c35dc (diff)
drivers: misc: power: implement usb2 fast charge modeHEADt13.0
echo 0 /sys/kernel/fast_charge/force_fast_charge (disable) echo 1 /sys/kernel/fast_charge/force_fast_charge (enable) Enables force charging up to 900mA in usb2 mode Signed-off-by: engstk <eng.stk@sapo.pt> Signed-off-by: AnierinB <anierin@evolution-x.org>
Diffstat (limited to 'drivers/misc/fastchg.c')
-rw-r--r--drivers/misc/fastchg.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/drivers/misc/fastchg.c b/drivers/misc/fastchg.c
new file mode 100644
index 000000000000..3b8ac5f1af37
--- /dev/null
+++ b/drivers/misc/fastchg.c
@@ -0,0 +1,103 @@
+/*
+ * Author (legacy sysfs): Chad Froebel <chadfroebel@gmail.com>
+ *
+ * Port to instantnoodle/kebab and powers supply hooks: engstk <eng.stk@sapo.pt>
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ */
+
+/*
+ * Possible values for "force_fast_charge" are :
+ *
+ * 0 - Disabled (default)
+ * 1 - Force faster charge
+*/
+
+#include <linux/kobject.h>
+#include <linux/sysfs.h>
+#include <linux/fastchg.h>
+#include <linux/string.h>
+#include <linux/module.h>
+
+int force_fast_charge = 0;
+
+static int __init get_fastcharge_opt(char *ffc)
+{
+ if (strcmp(ffc, "0") == 0) {
+ force_fast_charge = 0;
+ } else if (strcmp(ffc, "1") == 0) {
+ force_fast_charge = 1;
+ } else {
+ force_fast_charge = 0;
+ }
+ return 1;
+}
+
+__setup("ffc=", get_fastcharge_opt);
+
+static ssize_t force_fast_charge_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
+{
+ size_t count = 0;
+ count += sprintf(buf, "%d\n", force_fast_charge);
+ return count;
+}
+
+static ssize_t force_fast_charge_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
+{
+ sscanf(buf, "%d ", &force_fast_charge);
+ if (force_fast_charge < 0 || force_fast_charge > 1)
+ force_fast_charge = 0;
+
+ return count;
+}
+
+static struct kobj_attribute force_fast_charge_attribute =
+__ATTR(force_fast_charge, 0664, force_fast_charge_show, force_fast_charge_store);
+
+static struct attribute *force_fast_charge_attrs[] = {
+&force_fast_charge_attribute.attr,
+NULL,
+};
+
+static struct attribute_group force_fast_charge_attr_group = {
+.attrs = force_fast_charge_attrs,
+};
+
+/* Initialize fast charge sysfs folder */
+static struct kobject *force_fast_charge_kobj;
+
+int force_fast_charge_init(void)
+{
+ int force_fast_charge_retval;
+
+ force_fast_charge_kobj = kobject_create_and_add("fast_charge", kernel_kobj);
+ if (!force_fast_charge_kobj) {
+ return -ENOMEM;
+ }
+
+ force_fast_charge_retval = sysfs_create_group(force_fast_charge_kobj, &force_fast_charge_attr_group);
+
+ if (force_fast_charge_retval)
+ kobject_put(force_fast_charge_kobj);
+
+ if (force_fast_charge_retval)
+ kobject_put(force_fast_charge_kobj);
+
+ return (force_fast_charge_retval);
+}
+
+void force_fast_charge_exit(void)
+{
+ kobject_put(force_fast_charge_kobj);
+}
+
+module_init(force_fast_charge_init);
+module_exit(force_fast_charge_exit);