* [PATCH] power-supply: Add function to return system-wide power state [not found] <20080826200849.GA26114@srcf.ucam.org> @ 2008-08-26 20:09 ` Matthew Garrett 2008-08-26 20:25 ` Anton Vorontsov 0 siblings, 1 reply; 5+ messages in thread From: Matthew Garrett @ 2008-08-26 20:09 UTC (permalink / raw) To: cbou; +Cc: linux-kernel (resend, I screwed up the Cc) Certain drivers benefit from knowing whether the system is on ac or battery, for instance when determining which backlight registers to read. This adds a simple call to determine whether there's an online power supply other than any batteries. Signed-off-by: Matthew Garrett <mjg@redhat.com> --- The name is a bit odd, but seems to fit in with the existing naming scheme. diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index cb1ccb4..6a687da 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -87,6 +87,31 @@ int power_supply_am_i_supplied(struct power_supply *psy) return error; } +static int __power_supply_is_system_supplied(struct device *dev, void *data) +{ + union power_supply_propval ret = {0,}; + struct power_supply *psy = dev_get_drvdata(dev); + + if (psy->type != POWER_SUPPLY_TYPE_BATTERY) { + if (psy->get_property(psy, + POWER_SUPPLY_PROP_ONLINE, &ret)) + return 0; + if (ret.intval) + return ret.intval; + } + return 0; +} + +int power_supply_is_system_supplied() +{ + int error; + + error = class_for_each_device(power_supply_class, NULL, NULL, + __power_supply_is_system_supplied); + + return error; +} + int power_supply_register(struct device *parent, struct power_supply *psy) { int rc = 0; @@ -148,6 +173,7 @@ static void __exit power_supply_class_exit(void) EXPORT_SYMBOL_GPL(power_supply_changed); EXPORT_SYMBOL_GPL(power_supply_am_i_supplied); +EXPORT_SYMBOL_GPL(power_supply_is_system_supplied); EXPORT_SYMBOL_GPL(power_supply_register); EXPORT_SYMBOL_GPL(power_supply_unregister); diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index ea96ead..3e67d0c 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -164,6 +164,7 @@ struct power_supply_info { extern void power_supply_changed(struct power_supply *psy); extern int power_supply_am_i_supplied(struct power_supply *psy); +extern int power_supply_is_system_supplied(void); extern int power_supply_register(struct device *parent, struct power_supply *psy); -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] power-supply: Add function to return system-wide power state 2008-08-26 20:09 ` [PATCH] power-supply: Add function to return system-wide power state Matthew Garrett @ 2008-08-26 20:25 ` Anton Vorontsov 2008-08-26 20:33 ` Matthew Garrett 0 siblings, 1 reply; 5+ messages in thread From: Anton Vorontsov @ 2008-08-26 20:25 UTC (permalink / raw) To: Matthew Garrett; +Cc: linux-kernel On Tue, Aug 26, 2008 at 09:09:59PM +0100, Matthew Garrett wrote: > (resend, I screwed up the Cc) > > Certain drivers benefit from knowing whether the system is on ac or > battery, for instance when determining which backlight registers to > read. This adds a simple call to determine whether there's an online > power supply other than any batteries. I like the patch, much thanks! One comment below. > Signed-off-by: Matthew Garrett <mjg@redhat.com> > > --- > > The name is a bit odd, but seems to fit in with the existing naming > scheme. > > diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c > index cb1ccb4..6a687da 100644 > --- a/drivers/power/power_supply_core.c > +++ b/drivers/power/power_supply_core.c > @@ -87,6 +87,31 @@ int power_supply_am_i_supplied(struct power_supply *psy) > return error; > } > > +static int __power_supply_is_system_supplied(struct device *dev, void *data) > +{ > + union power_supply_propval ret = {0,}; > + struct power_supply *psy = dev_get_drvdata(dev); > + > + if (psy->type != POWER_SUPPLY_TYPE_BATTERY) { > + if (psy->get_property(psy, > + POWER_SUPPLY_PROP_ONLINE, &ret)) > + return 0; > + if (ret.intval) > + return ret.intval; > + } > + return 0; > +} > + > +int power_supply_is_system_supplied() > +{ > + int error; > + > + error = class_for_each_device(power_supply_class, NULL, NULL, > + __power_supply_is_system_supplied); > + > + return error; > +} > + > int power_supply_register(struct device *parent, struct power_supply *psy) > { > int rc = 0; > @@ -148,6 +173,7 @@ static void __exit power_supply_class_exit(void) > > EXPORT_SYMBOL_GPL(power_supply_changed); > EXPORT_SYMBOL_GPL(power_supply_am_i_supplied); > +EXPORT_SYMBOL_GPL(power_supply_is_system_supplied); > EXPORT_SYMBOL_GPL(power_supply_register); > EXPORT_SYMBOL_GPL(power_supply_unregister); > > diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h > index ea96ead..3e67d0c 100644 > --- a/include/linux/power_supply.h > +++ b/include/linux/power_supply.h > @@ -164,6 +164,7 @@ struct power_supply_info { > > extern void power_supply_changed(struct power_supply *psy); > extern int power_supply_am_i_supplied(struct power_supply *psy); > +extern int power_supply_is_system_supplied(void); May I suggest adding static int power_supply_is_system_supplied(void) { return -ENOSYS; } in case of !CONFIG_POWER_SUPPLY? This way drivers may not strictly depend on power supply class. And "if (power_supply_is_system_supplied())" will assume that we're always supplied, which good assumption, I think. Thanks, -- Anton Vorontsov email: cbouatmailru@gmail.com irc://irc.freenode.net/bd2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] power-supply: Add function to return system-wide power state 2008-08-26 20:25 ` Anton Vorontsov @ 2008-08-26 20:33 ` Matthew Garrett 2008-08-26 21:10 ` Anton Vorontsov 2008-08-31 23:14 ` Anton Vorontsov 0 siblings, 2 replies; 5+ messages in thread From: Matthew Garrett @ 2008-08-26 20:33 UTC (permalink / raw) To: Anton Vorontsov; +Cc: linux-kernel Something like this? diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c index cb1ccb4..6a687da 100644 --- a/drivers/power/power_supply_core.c +++ b/drivers/power/power_supply_core.c @@ -87,6 +87,31 @@ int power_supply_am_i_supplied(struct power_supply *psy) return error; } +static int __power_supply_is_system_supplied(struct device *dev, void *data) +{ + union power_supply_propval ret = {0,}; + struct power_supply *psy = dev_get_drvdata(dev); + + if (psy->type != POWER_SUPPLY_TYPE_BATTERY) { + if (psy->get_property(psy, + POWER_SUPPLY_PROP_ONLINE, &ret)) + return 0; + if (ret.intval) + return ret.intval; + } + return 0; +} + +int power_supply_is_system_supplied() +{ + int error; + + error = class_for_each_device(power_supply_class, NULL, NULL, + __power_supply_is_system_supplied); + + return error; +} + int power_supply_register(struct device *parent, struct power_supply *psy) { int rc = 0; @@ -148,6 +173,7 @@ static void __exit power_supply_class_exit(void) EXPORT_SYMBOL_GPL(power_supply_changed); EXPORT_SYMBOL_GPL(power_supply_am_i_supplied); +EXPORT_SYMBOL_GPL(power_supply_is_system_supplied); EXPORT_SYMBOL_GPL(power_supply_register); EXPORT_SYMBOL_GPL(power_supply_unregister); diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h index ea96ead..304df22 100644 --- a/include/linux/power_supply.h +++ b/include/linux/power_supply.h @@ -164,11 +164,16 @@ struct power_supply_info { extern void power_supply_changed(struct power_supply *psy); extern int power_supply_am_i_supplied(struct power_supply *psy); - extern int power_supply_register(struct device *parent, struct power_supply *psy); extern void power_supply_unregister(struct power_supply *psy); +#ifdef CONFIG_POWER_SUPPLY +extern int power_supply_is_system_supplied(void); +#else +static int power_supply_is_system_supplied(void) { return -ENOSYS; } +#endif + /* For APM emulation, think legacy userspace. */ extern struct class *power_supply_class; -- Matthew Garrett | mjg59@srcf.ucam.org ^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH] power-supply: Add function to return system-wide power state 2008-08-26 20:33 ` Matthew Garrett @ 2008-08-26 21:10 ` Anton Vorontsov 2008-08-31 23:14 ` Anton Vorontsov 1 sibling, 0 replies; 5+ messages in thread From: Anton Vorontsov @ 2008-08-26 21:10 UTC (permalink / raw) To: Matthew Garrett; +Cc: linux-kernel On Tue, Aug 26, 2008 at 09:33:27PM +0100, Matthew Garrett wrote: > Something like this? Yup, except that I forgot 'inline' in my example. ;-) I'll add it before applying, thanks! > diff --git a/drivers/power/power_supply_core.c b/drivers/power/power_supply_core.c > index cb1ccb4..6a687da 100644 > --- a/drivers/power/power_supply_core.c > +++ b/drivers/power/power_supply_core.c > @@ -87,6 +87,31 @@ int power_supply_am_i_supplied(struct power_supply *psy) > return error; > } > > +static int __power_supply_is_system_supplied(struct device *dev, void *data) > +{ > + union power_supply_propval ret = {0,}; > + struct power_supply *psy = dev_get_drvdata(dev); > + > + if (psy->type != POWER_SUPPLY_TYPE_BATTERY) { > + if (psy->get_property(psy, > + POWER_SUPPLY_PROP_ONLINE, &ret)) > + return 0; > + if (ret.intval) > + return ret.intval; > + } > + return 0; > +} > + > +int power_supply_is_system_supplied() > +{ > + int error; > + > + error = class_for_each_device(power_supply_class, NULL, NULL, > + __power_supply_is_system_supplied); > + > + return error; > +} > + > int power_supply_register(struct device *parent, struct power_supply *psy) > { > int rc = 0; > @@ -148,6 +173,7 @@ static void __exit power_supply_class_exit(void) > > EXPORT_SYMBOL_GPL(power_supply_changed); > EXPORT_SYMBOL_GPL(power_supply_am_i_supplied); > +EXPORT_SYMBOL_GPL(power_supply_is_system_supplied); > EXPORT_SYMBOL_GPL(power_supply_register); > EXPORT_SYMBOL_GPL(power_supply_unregister); > > diff --git a/include/linux/power_supply.h b/include/linux/power_supply.h > index ea96ead..304df22 100644 > --- a/include/linux/power_supply.h > +++ b/include/linux/power_supply.h > @@ -164,11 +164,16 @@ struct power_supply_info { > > extern void power_supply_changed(struct power_supply *psy); > extern int power_supply_am_i_supplied(struct power_supply *psy); > - > extern int power_supply_register(struct device *parent, > struct power_supply *psy); > extern void power_supply_unregister(struct power_supply *psy); > > +#ifdef CONFIG_POWER_SUPPLY > +extern int power_supply_is_system_supplied(void); > +#else > +static int power_supply_is_system_supplied(void) { return -ENOSYS; } > +#endif > + > /* For APM emulation, think legacy userspace. */ > extern struct class *power_supply_class; -- Anton Vorontsov email: cbouatmailru@gmail.com irc://irc.freenode.net/bd2 ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] power-supply: Add function to return system-wide power state 2008-08-26 20:33 ` Matthew Garrett 2008-08-26 21:10 ` Anton Vorontsov @ 2008-08-31 23:14 ` Anton Vorontsov 1 sibling, 0 replies; 5+ messages in thread From: Anton Vorontsov @ 2008-08-31 23:14 UTC (permalink / raw) To: Matthew Garrett; +Cc: linux-kernel On Tue, Aug 26, 2008 at 09:33:27PM +0100, Matthew Garrett wrote: > Something like this? I just applied it to battery-2.6.git with the following changes: [...] > +int power_supply_is_system_supplied() -() +(void) [...] > +#ifdef CONFIG_POWER_SUPPLY Added || defined(CONFIG_POWER_SUPPLY_MODULE) > +extern int power_supply_is_system_supplied(void); > +#else > +static int power_supply_is_system_supplied(void) { return -ENOSYS; } Added inline keyword, otherwise gcc might warn about defined but not used function. Please test battery-2.6.git tree (or simply next `-next` tree ;-) if everything is okay. Thanks again! -- Anton Vorontsov email: cbouatmailru@gmail.com irc://irc.freenode.net/bd2 ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2008-08-31 23:14 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20080826200849.GA26114@srcf.ucam.org>
2008-08-26 20:09 ` [PATCH] power-supply: Add function to return system-wide power state Matthew Garrett
2008-08-26 20:25 ` Anton Vorontsov
2008-08-26 20:33 ` Matthew Garrett
2008-08-26 21:10 ` Anton Vorontsov
2008-08-31 23:14 ` Anton Vorontsov
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox