Re: [jenny.tc@xxxxxxxxx: [RFC] power_supply: Introduce generic psy charging driver]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi!

(Only part of original cc-list preserved.)

> RFC: Fixed comments for patch v8, removed sorting and string comparisons

Ok, its better now.

> The Power Supply charging driver connects multiple subsystems
> to do charging in a generic way. The subsystems involves power_supply,
> thermal and battery communication subsystems (1wire).With this the charging is
> handled in a generic way.
> 
> The driver makes use of different new features - Battery Identification
> interfaces, pluggable charging algorithms, charger cable arbitrations etc.
> The patch also introduces generic interface for charger cable notifications.
> Charger cable events and capabilities can be notified using the generic
> power_supply_notifier chain.
> 
> Overall this driver removes the charging logic out of the charger chip driver
> and the charger chip driver can just listen to the request from the power
> supply charging driver to set the charger properties. This can be implemented
> by exposing get_property and set property callbacks.
> 
> Signed-off-by: Jenny TC <jenny.tc@xxxxxxxxx>
> ---
>  Documentation/power/power_supply_charger.txt |  350 +++++++++
>  drivers/power/Kconfig                        |    8 +
>  drivers/power/Makefile                       |    1 +
>  drivers/power/power_supply_charger.c         | 1066 ++++++++++++++++++++++++++
>  drivers/power/power_supply_charger.h         |  226 ++++++
>  drivers/power/power_supply_core.c            |    3 +
>  include/linux/power/power_supply_charger.h   |  304 ++++++++
>  include/linux/power_supply.h                 |  161 ++++
>  8 files changed, 2119 insertions(+)
>  create mode 100644 Documentation/power/power_supply_charger.txt
>  create mode 100644 drivers/power/power_supply_charger.c
>  create mode 100644 drivers/power/power_supply_charger.h
>  create mode 100644 include/linux/power/power_supply_charger.h
> 
> diff --git a/Documentation/power/power_supply_charger.txt b/Documentation/power/power_supply_charger.txt
> new file mode 100644
> index 0000000..1bb8cb4
> --- /dev/null
> +++ b/Documentation/power/power_supply_charger.txt
> @@ -0,0 +1,350 @@
> +1. Introduction
> +===============
> +
> +The Power Supply charging driver connects multiple subsystems
> +to do charging in a generic way. The subsystems involves power_supply,
> +thermal and battery communication subsystems (1wire).With this the charging is

Space after '.'.

> +static struct charger_cable cable_list[] = {
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_USB_SDP,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_USB_CDP,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_USB_DCP,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_USB_ACA,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_ACA_DOCK,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_SE1,
> +	 },
> +	{
> +	 .psy_cable_type = PSY_CHARGER_CABLE_TYPE_AC,
> +	 },
> +};

Can we get rid of this?

> +struct usb_phy *otg_xceiver;
> +static int handle_event_notification(struct notifier_block *nb,
> +				   unsigned long event, void *data);
> +struct notifier_block nb = {
> +		   .notifier_call = handle_event_notification,
> +		};

You need to add way more statics.



> +static void update_supplied_to_psy(struct power_supply *psy)
> +{
> +	WARN_ON(charger_context == NULL);

Useless.

> +	for (i = 0; i < psy->num_supplicants; i++) {
> +		charger_context->supplied_to_psy[cnt++] =
> +			power_supply_get_by_name(psy->supplied_to[i]);
> +		charger_context->supplied_to_psy[cnt] = NULL;
> +	}
> +}

Still some name lookups to be killed.

> +		for (i = 0; i < pst->num_supplicants; i++) {
> +			psb = power_supply_get_by_name(pst->supplied_to[i]);
> +			if (psb == psy) {
> +				batt_context->supplied_by_psy[cnt++] = pst;
> +				batt_context->supplied_by_psy[cnt] = NULL;
> +				break;
> +			}
> +		}
> +	}

And here.

> +	WARN_ON(psy->data == NULL);

Useless.

> +	charger_context = (struct psy_charger_context *)psy->data;

> +static inline bool is_supplied_to_has_ext_pwr_changed(struct power_supply *psy)
> +{
> +	int i;
> +	struct power_supply *psb;
> +	bool is_pwr_changed_defined = true;
> +
> +	for (i = 0; i < psy->num_supplicants; i++) {
> +		psb =
> +		    power_supply_get_by_name(psy->
> +					     supplied_to[i]);
> +		if (psb && !psb->external_power_changed)
> +			is_pwr_changed_defined &= false;
> +	}

You did not really get rid of the name lookups..

&= false. Bad idea.


> +static int trigger_algo(struct power_supply *psy)
> +{
> +	unsigned long cc = 0, cv = 0, cc_min;
> +	struct psy_batt_context *batt_context;
> +	struct psy_charging_algo *algo;
> +	struct psy_batt_chrg_prof chrg_profile;
> +	struct power_supply *psc;
> +	int cnt = 0;
> +
> +	if (psy->type != POWER_SUPPLY_TYPE_BATTERY)
> +		return 0;
> +
> +	if (psy_get_battery_prop(&chrg_profile)) {
> +		pr_err("Error in getting charge profile:%s:%d\n", __FILE__,
> +		       __LINE__);
> +		return -EINVAL;
> +	}
> +
> +	batt_context = (struct psy_batt_context *)psy->data;

Create inline function doing the cast. You have too many opencoded
casts.

> +	batt_context->algo_stat = algo->get_next_cc_cv
> +		(&batt_context->batt_props, chrg_profile, &cc, &cv);
> +static inline void enable_supplied_by_charging
> +		(struct power_supply *psy, bool is_enable)

This is not how you indent that, is it.

> +static void __power_supply_trigger_charging_handler(struct power_supply *psy)
> +{
> +	int i;
> +	struct power_supply *psb = NULL;
> +
> +	if (!is_trigger_charging_algo(psy))
> +		return;
> +
> +	if (psy_is_battery(psy)) {
> +		if (trigger_algo(psy))
> +			enable_supplied_by_charging(psy, false);
> +		else
> +			enable_supplied_by_charging(psy, true);

enable...(psy, trigger_algo())



> +static inline int psy_throttle_cc_value
> +		(struct power_supply *psy, unsigned int state)

Indent.


> +#define PSY_MAX_CV(psy) \
> +		psy_get_ps_int_property(psy,\
> +			POWER_SUPPLY_PROP_CONSTANT_CHARGE_VOLTAGE_MAX)
> +#define PSY_VOLTAGE_NOW(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_VOLTAGE_NOW)
> +#define PSY_VOLTAGE_OCV(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_VOLTAGE_OCV)
> +#define PSY_CURRENT_NOW(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_CURRENT_NOW)
> +#define PSY_STATUS(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_STATUS)
> +#define PSY_TEMPERATURE(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_TEMP)
> +#define PSY_BATTERY_TYPE(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_TECHNOLOGY)
> +#define PSY_ONLINE(psy) \
> +		psy_get_ps_int_property(psy, POWER_SUPPLY_PROP_ONLINE)

This looks like bad idea. Just opencode it.

s/return  /return /g

Thanks,
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux