From 33ea3a3f56d26f10e07ffe16fcaccaad904056d3 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sun, 7 Sep 2014 15:39:34 -0700 Subject: [PATCH] greybus: add battery module --- drivers/staging/greybus/Makefile | 3 +- drivers/staging/greybus/battery-gb.c | 153 +++++++++++++++++++++++++++++++++++ drivers/staging/greybus/core.c | 8 ++ drivers/staging/greybus/greybus.h | 4 + 4 files changed, 167 insertions(+), 1 deletion(-) create mode 100644 drivers/staging/greybus/battery-gb.c diff --git a/drivers/staging/greybus/Makefile b/drivers/staging/greybus/Makefile index c1e4e12..114089a 100644 --- a/drivers/staging/greybus/Makefile +++ b/drivers/staging/greybus/Makefile @@ -6,7 +6,8 @@ greybus-y := core.o \ i2c-gb.o \ gpio-gb.o \ sdio-gb.o \ - uart-gb.o + uart-gb.o \ + battery-gb.o obj-m += greybus.o obj-m += es1-ap-usb.o diff --git a/drivers/staging/greybus/battery-gb.c b/drivers/staging/greybus/battery-gb.c new file mode 100644 index 0000000..123b2af --- /dev/null +++ b/drivers/staging/greybus/battery-gb.c @@ -0,0 +1,153 @@ +/* + * Battery driver for a Greybus module. + * + * Copyright 2014 Google Inc. + * + * Released under the GPLv2 only. + */ + +#include +#include +#include +#include +#include "greybus.h" + +struct gb_battery { + struct power_supply bat; + struct greybus_device *gdev; +}; +#define to_gb_battery(x) container_of(x, struct gb_battery, bat) + +static const struct greybus_module_id id_table[] = { + { GREYBUS_DEVICE(0x42, 0x42) }, /* make shit up */ + { }, /* terminating NULL entry */ +}; + +static int get_status(struct gb_battery *gb) +{ + // FIXME!!! + return 0; +} + +static int get_capacity(struct gb_battery *gb) +{ + // FIXME!!! + return 0; +} + +static int get_temp(struct gb_battery *gb) +{ + // FIXME!!! + return 0; +} + +static int get_voltage(struct gb_battery *gb) +{ + // FIXME!!! + return 0; +} + + + +static int get_property(struct power_supply *b, + enum power_supply_property psp, + union power_supply_propval *val) +{ + struct gb_battery *gb = to_gb_battery(b); + + switch (psp) { + case POWER_SUPPLY_PROP_TECHNOLOGY: + // FIXME - guess! + val->intval = POWER_SUPPLY_TECHNOLOGY_NiMH; + break; + + case POWER_SUPPLY_PROP_STATUS: + val->intval = get_status(gb); + break; + + case POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN: + val->intval = 4700000; // FIXME - guess??? + break; + + case POWER_SUPPLY_PROP_CAPACITY: + val->intval = get_capacity(gb); + break; + + case POWER_SUPPLY_PROP_TEMP: + val->intval = get_temp(gb); + break; + + case POWER_SUPPLY_PROP_VOLTAGE_NOW: + val->intval = get_voltage(gb); + break; + + default: + return -EINVAL; + } + + return 0; +} + + +// FIXME - verify this list, odds are some can be removed and others added. +static enum power_supply_property battery_props[] = { + POWER_SUPPLY_PROP_TECHNOLOGY, + POWER_SUPPLY_PROP_STATUS, + POWER_SUPPLY_PROP_VOLTAGE_MAX_DESIGN, + POWER_SUPPLY_PROP_CAPACITY, + POWER_SUPPLY_PROP_TEMP, + POWER_SUPPLY_PROP_VOLTAGE_NOW, +}; + +int gb_battery_probe(struct greybus_device *gdev, + const struct greybus_module_id *id) +{ + struct gb_battery *gb; + struct power_supply *b; + int retval; + + gb = kzalloc(sizeof(*gb), GFP_KERNEL); + if (!gb) + return -ENOMEM; + + b = &gb->bat; + // FIXME - get a better (i.e. unique) name + // FIXME - anything else needs to be set? + b->name = "gb_battery"; + b->type = POWER_SUPPLY_TYPE_BATTERY, + b->properties = battery_props, + b->num_properties = ARRAY_SIZE(battery_props), + b->get_property = get_property, + + retval = power_supply_register(&gdev->dev, b); + if (retval) { + kfree(gb); + return retval; + } + gdev->gb_battery = gb; + + return 0; +} + +void gb_battery_disconnect(struct greybus_device *gdev) +{ + struct gb_battery *gb; + + gb = gdev->gb_battery; + + power_supply_unregister(&gb->bat); + + kfree(gb); +} + +#if 0 +static struct greybus_driver battery_gb_driver = { + .probe = gb_battery_probe, + .disconnect = gb_battery_disconnect, + .id_table = id_table, +}; + +module_greybus_driver(battery_gb_driver); +MODULE_LICENSE("GPL"); +MODULE_AUTHOR("Greg Kroah-Hartman "); +#endif diff --git a/drivers/staging/greybus/core.c b/drivers/staging/greybus/core.c index 5c633a39..76938cd 100644 --- a/drivers/staging/greybus/core.c +++ b/drivers/staging/greybus/core.c @@ -210,8 +210,15 @@ static int gb_init_subdevs(struct greybus_device *gdev, retval = gb_tty_probe(gdev, id); if (retval) goto error_tty; + + retval = gb_battery_probe(gdev, id); + if (retval) + goto error_battery; return 0; +error_battery: + gb_tty_disconnect(gdev); + error_tty: gb_sdio_disconnect(gdev); @@ -444,6 +451,7 @@ void greybus_remove_device(struct greybus_device *gdev) gb_gpio_disconnect(gdev); gb_sdio_disconnect(gdev); gb_tty_disconnect(gdev); + gb_battery_disconnect(gdev); // FIXME - device_remove(&gdev->dev); } diff --git a/drivers/staging/greybus/greybus.h b/drivers/staging/greybus/greybus.h index 2f67df5..2b96917 100644 --- a/drivers/staging/greybus/greybus.h +++ b/drivers/staging/greybus/greybus.h @@ -91,6 +91,7 @@ struct gb_gpio_device; struct gb_sdio_host; struct gb_tty; struct gb_usb_device; +struct gb_battery; struct greybus_host_device; struct svc_msg; @@ -142,6 +143,7 @@ struct greybus_device { struct gb_sdio_host *gb_sdio_host; struct gb_tty *gb_tty; struct gb_usb_device *gb_usb_dev; + struct gb_battery *gb_battery; }; #define to_greybus_device(d) container_of(d, struct greybus_device, dev) @@ -237,6 +239,8 @@ int gb_sdio_probe(struct greybus_device *gdev, const struct greybus_module_id *i void gb_sdio_disconnect(struct greybus_device *gdev); int gb_tty_probe(struct greybus_device *gdev, const struct greybus_module_id *id); void gb_tty_disconnect(struct greybus_device *gdev); +int gb_battery_probe(struct greybus_device *gdev, const struct greybus_module_id *id); +void gb_battery_disconnect(struct greybus_device *gdev); int gb_tty_init(void); void gb_tty_exit(void); -- 2.7.4