Skip to content

Commit

Permalink
ported USB force FastCharge from apq8064 (thanks to @motley-git, @fra…
Browse files Browse the repository at this point in the history
…nciscofranco, Chad Froebel)
  • Loading branch information
DooMLoRD committed May 12, 2014
1 parent c28be79 commit 257e8aa
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
95 changes: 95 additions & 0 deletions arch/arm/mach-msm/fastchg.c
@@ -0,0 +1,95 @@
/*
* Author: Chad Froebel <chadfroebel@gmail.com>
*
* Simple port to Nexus 4 : motley <motley.slate@gmail.com>
*
* 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 - substitute AC to USB unconditional
*/

#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/fastchg.h>

int force_fast_charge;

/* sysfs interface for "force_fast_charge" */
static ssize_t force_fast_charge_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
return sprintf(buf, "%d\n", force_fast_charge);
}

static ssize_t force_fast_charge_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{

int new_force_fast_charge;

sscanf(buf, "%du", &new_force_fast_charge);

if (new_force_fast_charge >= FAST_CHARGE_DISABLED && new_force_fast_charge <= FAST_CHARGE_FORCE_AC) {
/* update only if valid value provided */
force_fast_charge = new_force_fast_charge;
}

return count;
}

static struct kobj_attribute force_fast_charge_attribute =
__ATTR(force_fast_charge, 0666, 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 = FAST_CHARGE_DISABLED; /* Forced fast charge disabled by default */

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);

14 changes: 14 additions & 0 deletions drivers/usb/otg/msm_otg.c
Expand Up @@ -61,6 +61,11 @@
#include <linux/mhl.h>
#endif

#ifdef CONFIG_FORCE_FAST_CHARGE
#include <linux/fastchg.h>
#define USB_FASTCHG_LOAD 1000 /* uA */
#endif

#define MSM_USB_BASE (motg->regs)
#define DRIVER_NAME "msm_otg"

Expand Down Expand Up @@ -1182,6 +1187,15 @@ static void msm_otg_notify_charger(struct msm_otg *motg, unsigned mA)

dev_info(motg->phy.dev, "Avail curr from USB = %u\n", mA);

#ifdef CONFIG_FORCE_FAST_CHARGE
if (force_fast_charge == 1) {
mA = USB_FASTCHG_LOAD;
pr_info("USB fast charging is ON - 1000mA.\n");
} else {
pr_info("USB fast charging is OFF.\n");
}
#endif

/*
* Use Power Supply API if supported, otherwise fallback
* to legacy pm8921 API.
Expand Down
23 changes: 23 additions & 0 deletions include/linux/fastchg.h
@@ -0,0 +1,23 @@
/*
* Author: Chad Froebel <chadfroebel@gmail.com>
*
* 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.
*
*/

#ifndef _LINUX_FASTCHG_H
#define _LINUX_FASTCHG_H

extern int force_fast_charge;

#define FAST_CHARGE_DISABLED 0 /* default */
#define FAST_CHARGE_FORCE_AC 1

#endif

0 comments on commit 257e8aa

Please sign in to comment.