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

Commit 1bc78923 authored by Kiran Gunda's avatar Kiran Gunda Committed by Gerrit - the friendly Code Review server
Browse files

power: qpnp-smbcharger: Add snapshot of qpnp-smbcharger driver



This is a snapshot of the qpnp-smbcharger driver as of msm-4.4
'commit 504aeb1158e37 ("power: qcom-charger: add support for
USBIN-USBIN parallel configuration")'.

Change-Id: I7555f2e4f5b40ddcdb33ffbd7c8995b1c9bc8981
Signed-off-by: default avatarKiran Gunda <kgunda@codeaurora.org>
parent f526258c
Loading
Loading
Loading
Loading
+394 −0
Original line number Diff line number Diff line
QPNP SMB Battery Charger

QPNP SMB Charger is a single-cell switching mode battery charger. It can charge
the battery and power the system via the USB and AC adapter input.

The QPNP SMB Charger interfaces via the SPMI bus.

There are six different peripherals adding the following functionality.
Each of these peripherals are implemented as subnodes in the example at the
end of this file.

- qcom,chgr:		Supports charging control and status
			reporting.
- qcom,bat-if:		Battery status reporting such as presence,
			temperature reporting and voltage collapse
			protection.
- qcom,usb-chgpth:	USB charge path detection and input current
			limiting configuration.
- qcom,dc-chgpth:	DC charge path detection and input current
			limiting configuration.
- qcom,chg-misc:	Miscellaneous features such as watchdog timers
			and SYSOK pin control
- qcom,chg-otg:		OTG configuration control.

Parent node required properties:
- compatible:		Must be "qcom,qpnp-smbcharger"
- #address-cells:	Must be <1>
- #size-cells:		Must be <1>
- qcom,pmic-revid:      Should specify the phandle of PMIC
                        revid module. This is used to identify
                        the PMIC subtype.



Sub node required properties:
- reg:			The SPMI address for this peripheral
- interrupts:		Specifies the interrupt associated with the peripheral.
- interrupt-names:	Specifies the interrupt names for the peripheral. Every
			available interrupt needs to have an associated name
			with it to indentify its purpose.

			The following lists each subnode and their corresponding
			required interrupt names:

			qcom,chgr:
			 - chg-tcc-thr:		Triggers on charge completion.
			 - chg-taper-thr:	Triggers on the taper charge
						transtion.
			 - chg-inhibit:		Notifies on battery voltage
						being too high to resume
						charging.
			 - chg-p2f-thr:		Triggers on transitioning from
						precharge to fastcharge.
			 - chg-rechg-thr:	Triggers on battery voltage
						falling below the resume
						threshold.

			qcom,bat-if:
			 - batt-hot:		Triggers on battery temperature
						hitting the hot threshold.
						Charging stops.
			 - batt-warm:		Triggers on battery temperature
						hitting the warm threshold.
						Charging current is reduced.
			 - batt-cool:		Triggers on battery temperature
						hitting the cool threshold.
						Charging current is reduced
			 - batt-cold:		Triggers on battery temperature
						hitting the cold threshold.
						Charging stops.
			 - batt-missing:	Battery missing status
						interrupt.
			 - batt-low:		Triggers on battery voltage
						falling across a low threshold.

			qcom,usb-chgpth:
			 - usbin-uv:		USB input voltage falls below a
						valid threshold.
			 - usbin-src-det:	USB automatic source detection
						finishes.

			qcom,dc-chgpth:
			 - dcin-uv:		DC input voltage falls below a
						valid threshold.

			qcom,chgr-misc:
			 - wdog-timeout-mins:	Charger watchdog timer
						interrupt.
			 - temp-shutdown:	Triggers when charger goes
						overtemp and causes a shutdown.
			 - power-ok:		Triggers when the charger
						switcher turns on or off.

Regulator Subnodes:
- qcom,smbcharger-boost-otg	A subnode for a regulator device that turns on
				the charger boost for OTG operation.
- qcom,smbcharger-external-otg	A subnode for a regulator device that switches
				off charging and the USB input charge path
				in order to allow an external regulator to
				operate. This can be used in place of the
				qcom,smbcharger-boost-otg if an external boost
				is available.

Regulator Sub node required properties:
- regulator-name		A name string for the regulator in question

Optional Properties:
- qcom,battery-psy-name		The name of the main battery power supply that
				the charger will register. Failing to define
				this property will default the name to
				"battery".
- qcom,bms-psy-name		The psy name to use for reporting battery
				capacity. If left unspecified the capacity uses
				a preprogrammed default value of 50.
- qcom,float-voltage-mv		Float Voltage in mV - the maximum voltage up
				to which the battery is charged. Supported
				range 3600mV to 4500mV
- qcom,float-voltage-comp	Specifies the JEITA float voltage compensation.
				Value ranges from 0 to 63.
- qcom,fastchg-current-ma	Specifies the fast charge current in mA. Supported
				range is from 300mA to 3000mA.
- qcom,fastchg-current-comp	Specifies the fast charge current compensation in
				mA. Supported values are 250, 700, 900 and 1200mA.
- qcom,charging-timeout-mins	Maximum duration in minutes that a single
				charge cycle may last.  Supported values are:
				0, 192, 384, 768, and 1536.  A value of 0
				means that no charge cycle timeout is used and
				charging can continue indefinitely.
- qcom,precharging-timeout-mins	Maximum duration in minutes that a single
				precharge cycle may last.  Supported values
				are: 0, 24, 48, 96, 192.  A value of 0 means
				that no precharge cycle timeout is used and
				charging can continue indefinitely. Note that
				the qcom,charging-timeout-mins property must
				be specified in order for this to take effect.
- qcom,dc-psy-type		The type of charger connected to the DC path.
				Can be "Mains", "Wireless" or "Wipower"
- qcom,dc-psy-ma		The current in mA dc path can support. Must be
				specified if dc-psy-type is specified. Valid
				range 300mA to 2000mA.
- qcom,dcin-vadc		The phandle to pmi8994 voltage adc. The ADC is
				used to get notifications when the DCIN voltage
				crosses a programmed min/max threshold. This is
				used to make configurations for optimized power
				draw for Wipower.
- qcom,wipower-div2-ilim-map
- qcom,wipower-pt-ilim-map
- qcom,wipower-default-ilim-map
				Array of 5 elements to indicate the voltage ranges and their corresponding
				current limits. The 5 elements with index [0..4] are:
				[0] => voltage_low in uV
				[1] => voltage_high in uV
				[2] => current limit for pass through in mA
				[3] => current limit for div2 mode dcin low voltage in mA
				[4] => current limit for div2 mode dcin high voltage in mA
				The div2 and pt tables indicate the current limits
				to use when Wipower is operating in divide_by_2 mode
				and pass through mode respectively.
				The default table is used when the voltage ranges
				are beyond the ones specified in the mapping table.
				Note that if dcin-vadc or any of these mapping
				tables are not specified, dynamic dcin input
				is disabled.
- qcom,charging-disabled	Set this if charging should be disabled in the
				build by default.
- qcom,resume-delta-mv		Specifies the minimum voltage drop in
				millivolts below the float voltage that is
				required in order to initiate a new charging
				cycle. Supported values are: 50, 100, 200 and
				300mV.
- qcom,chg-inhibit-en		Boolean that indicates whether the charge inhibit
				feature needs to be enabled. If this is not set,
				charge inhibit feature is disabled by default.
- qcom,chg-inhibit-fg		Indicates if the recharge threshold source has
				to be Fuel gauge ADC. If this is not set, it
				will be analog sensor by default.
- qcom,bmd-algo-disabled	Indicates if the battery missing detection
				algorithm is disabled. If this node is present
				SMB uses the THERM pin for battery missing
				detection.
- qcom,charge-unknown-battery	Boolean that indicates whether an unknown
				battery without a matching profile will be
				charged. If this is not set, if the fuel gauge
				does not recognize the battery based on its
				battery ID, the charger will not start
				charging.
- qcom,bmd-pin-src		A string that indicates the source pin for the
				battery missind detection. This can be either:
				- "bpd_none"
					battery is considered always present
				- "bpd_id"
					battery id pin is used
				- "bpd_thm"
					battery therm pin is used
				- "bpd_thm_id"
					both pins are used (battery is
					considered missing if either pin is
					floating).
- qcom,iterm-ma			Specifies the termination current to indicate
				end-of-charge. Possible values in mA:
				50, 100, 150, 200, 250, 300, 500, 600.
- qcom,iterm-disabled		Disables the termination current feature. This
				is a boolean property.
- otg-parent-supply		A phandle to an external boost regulator for
				OTG if it exists.
- qcom,thermal-mitigation:	Array of input current limit values for
				different system thermal mitigation levels.
				This should be a flat array that denotates the
				maximum charge current in mA for each thermal
				level.
- qcom,rparasitics-uohm:	The parasitic resistance of the board following
				the line from the battery connectors through
				vph_power. This is used to calculate maximum
				available current of the battery.
- qcom,vled-max-uv:		The maximum input voltage of the flash leds.
				This is used to calculate maximum available
				current of the battery.
- qcom,autoadjust-vfloat	A boolean property that when set, makes the
				driver automatically readjust vfloat using the
				fuel gauge ADC readings to make charging more
				accurate.
- qcom,jeita-temp-hard-limit	property when present will enable or disable
				the jeita temperature hard limit based on the
				value 1 or 0. Specify 0 if the jeita temp hard
				limit needs to be disabled. If it is not present,
				jeita temperature hard limit will be based on what
				the bootloader had set earlier.
- qcom,low-volt-dcin:		A boolean property which upon set will enable the
				AICL deglitch configuration dynamically. This needs
				to be set if the DCIN supply is going to be less
				than or equal to 5V.
- qcom,force-aicl-rerun:	A boolean property which upon set will enable the
				AICL rerun by default along with the deglitch time
				configured to long interval (20 ms). Also, specifying
				this property will not adjust the AICL deglitch time
				dynamically for handling the battery over-voltage
				oscillations when the charger is headroom limited.
- qcom,aicl-rerun-period-s	If force-aicl-rerun is on, this property dictates
				how often aicl is reran in seconds. Possible values
				are 45, 90, 180, and 360.
- qcom,ibat-ocp-threshold-ua	Maximum current before the battery will trigger
				overcurrent protection. Use the recommended
				battery pack value minus some margin.
- qcom,soft-vfloat-comp-disabled	Set this property when the battery is
					powered via external source and could
					go above the float voltage.
- qcom,parallel-usb-min-current-ma	Minimum current drawn by the primary
					charger before enabling the parallel
					charger if one exists. Do not define
					this property if no parallel chargers
					exist.
- qcom,parallel-usb-9v-min-current-ma	Minimum current drawn by the primary
					charger before enabling the parallel
					charger if one exists. This property
					applies only for 9V chargers.
- qcom,parallel-allowed-lowering-ma	Acceptable current drop from the initial limit
					to keep parallel charger activated. If the
					charger current reduces beyond this threshold
					parallel charger is disabled. Must be specified
					if parallel charger is used.
- qcom,parallel-main-chg-fcc-percent	Percentage of the fast charge current allotted to the
					main charger when parallel charging is enabled and
					operational. If this property is not defined, the
					driver defaults to a 50%/50% split between the main
					and parallel charger.
- qcom,parallel-main-chg-icl-percent	Percentage of the input current allotted to the
					main charger when parallel charging is enabled and
					operational. If this property is not defined, the
					driver defaults to a 60%/40% split between the main
					and parallel charger.
- qcom,battery-data			Points to the phandle of node which
					contains the battery-profiles supported
					by the charger/FG.
- qcom,chg-led-support		A bool property to support the charger led feature.
- qcom,chg-led-sw-controls		A bool property to allow the software to control
					the charger led without a valid charger.
- qcom,skip-usb-notification	A boolean property to be used when usb gets present
				and type from other means. Especially true on
				liquid hardware, where usb presence is detected based on GPIO.
- qcom,skip-usb-suspend-for-fake-battery	A boolean property to skip
						suspending USB path for fake
						battery.
- qcom,vchg_sns-vadc		Phandle of the VADC node.
- qcom,vchg-adc-channel-id	The ADC channel to which the VCHG is routed.

Example:
	qcom,qpnp-smbcharger {
		compatible = "qcom,qpnp-smbcharger";
		#address-cells = <1>;
		#size-cells = <1>;

		qcom,iterm-ma = <100>;
		qcom,float-voltage-mv = <4200>;
		qcom,resume-delta-mv = <100>;
		qcom,bmd-pin-src = "bpd_thm_id";
		qcom,dc-psy-type = "Mains";
		qcom,dc-psy-ma = <1500>;
		qcom,bms-psy-name = "bms";
		qcom,battery-psy-name = "battery";
		qcom,thermal-mitigation = <1500 700 600 325>;
		qcom,vchg_sns-vadc = <&pmi8950_vadc>;
		qcom,vchg-adc-channel-id = <3>;

		qcom,chgr@1000 {
			reg = <0x1000 0x100>;
			interrupts =	<0x2 0x10 0x0>,
					<0x2 0x10 0x1>,
					<0x2 0x10 0x2>,
					<0x2 0x10 0x3>,
					<0x2 0x10 0x4>,
					<0x2 0x10 0x5>,
					<0x2 0x10 0x6>,
					<0x2 0x10 0x7>;

			interrupt-names =	"chg-error",
						"chg-inhibit",
						"chg-prechg-sft",
						"chg-complete-chg-sft",
						"chg-p2f-thr",
						"chg-rechg-thr",
						"chg-taper-thr",
						"chg-tcc-thr";
		};

		qcom,otg@1100 {
			reg = <0x1100 0x100>;
		};

		qcom,bat-if@1200 {
			reg = <0x1200 0x100>;
			interrupts =	<0x2 0x12 0x0>,
					<0x2 0x12 0x1>,
					<0x2 0x12 0x2>,
					<0x2 0x12 0x3>,
					<0x2 0x12 0x4>,
					<0x2 0x12 0x5>,
					<0x2 0x12 0x6>,
					<0x2 0x12 0x7>;

			interrupt-names =	"batt-hot",
						"batt-warm",
						"batt-cold",
						"batt-cool",
						"batt-ov",
						"batt-low",
						"batt-missing",
						"batt-term-missing";
		};

		qcom,usb-chgpth@1300 {
			reg = <0x1300 0x100>;
			interrupts =	<0x2 0x13 0x0>,
					<0x2 0x13 0x1>,
					<0x2 0x13 0x2>,
					<0x2 0x13 0x3>,
					<0x2 0x13 0x4>,
					<0x2 0x13 0x5>,
					<0x2 0x13 0x6>;

			interrupt-names =	"usbin-uv",
						"usbin-ov",
						"usbin-src-det",
						"otg-fail",
						"otg-oc",
						"aicl-done",
						"usbid-change";
		};

		qcom,dc-chgpth@1400 {
			reg = <0x1400 0x100>;
			interrupts =	<0x2 0x14 0x0>,
					<0x2 0x14 0x1>;

			interrupt-names =	"dcin-uv",
						"dcin-ov";
		};

		qcom,chgr-misc@1600 {
			reg = <0x1600 0x100>;
			interrupts =	<0x2 0x16 0x0>,
					<0x2 0x16 0x1>,
					<0x2 0x16 0x2>,
					<0x2 0x16 0x3>,
					<0x2 0x16 0x4>,
					<0x2 0x16 0x5>;

			interrupt-names =	"power-ok",
						"temp-shutdown",
						"wdog-timeout",
						"flash-fail",
						"otst2",
						"otst3";
		};
	};
+9 −0
Original line number Diff line number Diff line
@@ -64,6 +64,15 @@ config SMB138X_CHARGER
	  The driver reports the charger status via the power supply framework.
	  A charger status change triggers an IRQ via the device STAT pin.

config QPNP_SMBCHARGER
	tristate "QPNP SMB Charger driver"
	depends on MFD_SPMI_PMIC
	help
	  Say Y here to enable the dual path switch mode battery charger which
	  supports USB detection and battery charging up to 3A.
	  The driver also offers relevant information to userspace via the
	  power supply framework.

config QPNP_QNOVO
	bool "QPNP QNOVO driver"
	depends on MFD_SPMI_PMIC
+1 −0
Original line number Diff line number Diff line
obj-$(CONFIG_QPNP_FG_GEN3)     += qpnp-fg-gen3.o fg-memif.o fg-util.o
obj-$(CONFIG_QPNP_SMBCHARGER)	+= qpnp-smbcharger.o pmic-voter.o
obj-$(CONFIG_SMB135X_CHARGER)   += smb135x-charger.o pmic-voter.o
obj-$(CONFIG_SMB1355_SLAVE_CHARGER)   += smb1355-charger.o pmic-voter.o
obj-$(CONFIG_SMB1351_USB_CHARGER) += smb1351-charger.o pmic-voter.o battery.o
+8472 −0

File added.

Preview size limit exceeded, changes collapsed.

+104 −0
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014, The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * 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 __MSM_BCL_H
#define __MSM_BCL_H

#define BCL_NAME_MAX_LEN 20

enum bcl_trip_type {
	BCL_HIGH_TRIP,
	BCL_LOW_TRIP,
	BCL_TRIP_MAX,
};

enum bcl_param {
	BCL_PARAM_VOLTAGE,
	BCL_PARAM_CURRENT,
	BCL_PARAM_MAX,
};

struct bcl_threshold {
	int                     trip_value;
	enum bcl_trip_type      type;
	void                    *trip_data;
	void (*trip_notify)     (enum bcl_trip_type, int, void *);
};
struct bcl_param_data;
struct bcl_driver_ops {
	int (*read)             (int *);
	int (*set_high_trip)    (int);
	int (*get_high_trip)    (int *);
	int (*set_low_trip)     (int);
	int (*get_low_trip)     (int *);
	int (*disable)          (void);
	int (*enable)           (void);
	int (*notify)           (struct bcl_param_data *, int,
					enum bcl_trip_type);
};

struct bcl_param_data {
	char                    name[BCL_NAME_MAX_LEN];
	struct device           device;
	struct bcl_driver_ops   *ops;
	int                     high_trip;
	int                     low_trip;
	int                     last_read_val;
	bool                    registered;
	struct kobj_attribute   val_attr;
	struct kobj_attribute   high_trip_attr;
	struct kobj_attribute   low_trip_attr;
	struct attribute_group  bcl_attr_gp;
	struct bcl_threshold    *thresh[BCL_TRIP_MAX];
};

#ifdef CONFIG_MSM_BCL_CTL
struct bcl_param_data *msm_bcl_register_param(enum bcl_param,
	struct bcl_driver_ops *, char *);
int msm_bcl_unregister_param(struct bcl_param_data *);
int msm_bcl_enable(void);
int msm_bcl_disable(void);
int msm_bcl_set_threshold(enum bcl_param, enum bcl_trip_type,
	struct bcl_threshold *);
int msm_bcl_read(enum bcl_param, int *);
#else
static inline struct bcl_param_data *msm_bcl_register_param(
	enum bcl_param param_type, struct bcl_driver_ops *ops, char *name)
{
	return NULL;
}
static inline int msm_bcl_unregister_param(struct bcl_param_data *data)
{
	return -ENOSYS;
}
static inline int msm_bcl_enable(void)
{
	return -ENOSYS;
}
static inline int msm_bcl_disable(void)
{
	return -ENOSYS;
}
static inline int msm_bcl_set_threshold(enum bcl_param param_type,
	enum bcl_trip_type type,
	struct bcl_threshold *inp_thresh)
{
	return -ENOSYS;
}
static inline int msm_bcl_read(enum bcl_param param_type, int *vbat_value)
{
	return -ENOSYS;
}
#endif

#endif /*__MSM_BCL_H*/