27 Jul, 2015

1 commit


14 Mar, 2015

2 commits

  • Change the ownership of power_supply structure from each driver
    implementing the class to the power supply core.

    The patch changes power_supply_register() function thus all drivers
    implementing power supply class are adjusted.

    Each driver provides the implementation of power supply. However it
    should not be the owner of power supply class instance because it is
    exposed by core to other subsystems with power_supply_get_by_name().
    These other subsystems have no knowledge when the driver will unregister
    the power supply. This leads to several issues when driver is unbound -
    mostly because user of power supply accesses freed memory.

    Instead let the core own the instance of struct 'power_supply'. Other
    users of this power supply will still access valid memory because it
    will be freed when device reference count reaches 0. Currently this
    means "it will leak" but power_supply_put() call in next patches will
    solve it.

    This solves invalid memory references in following race condition
    scenario:

    Thread 1: charger manager
    Thread 2: power supply driver, used by charger manager

    THREAD 1 (charger manager) THREAD 2 (power supply driver)
    ========================== ==============================
    psy = power_supply_get_by_name()
    Driver unbind, .remove
    power_supply_unregister()
    Device fully removed
    psy->get_property()

    The 'get_property' call is executed in invalid context because the driver was
    unbound and struct 'power_supply' memory was freed.

    This could be observed easily with charger manager driver (here compiled
    with max17040 fuel gauge):

    $ cat /sys/devices/virtual/power_supply/cm-battery/capacity &
    $ echo "1-0036" > /sys/bus/i2c/drivers/max17040/unbind
    [ 55.725123] Unable to handle kernel NULL pointer dereference at virtual address 00000000
    [ 55.732584] pgd = d98d4000
    [ 55.734060] [00000000] *pgd=5afa2831, *pte=00000000, *ppte=00000000
    [ 55.740318] Internal error: Oops: 80000007 [#1] PREEMPT SMP ARM
    [ 55.746210] Modules linked in:
    [ 55.749259] CPU: 1 PID: 2936 Comm: cat Tainted: G W 3.19.0-rc1-next-20141226-00048-gf79f475f3c44-dirty #1496
    [ 55.760190] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
    [ 55.766270] task: d9b76f00 ti: daf54000 task.ti: daf54000
    [ 55.771647] PC is at 0x0
    [ 55.774182] LR is at charger_get_property+0x2f4/0x36c
    [ 55.779201] pc : [] lr : [] psr: 60000013
    [ 55.779201] sp : daf55e90 ip : 00000003 fp : 00000000
    [ 55.790657] r10: 00000000 r9 : c06e2878 r8 : d9b26c68
    [ 55.795865] r7 : dad81610 r6 : daec7410 r5 : daf55ebc r4 : 00000000
    [ 55.802367] r3 : 00000000 r2 : daf55ebc r1 : 0000002a r0 : d9b26c68
    [ 55.808879] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
    [ 55.815994] Control: 10c5387d Table: 598d406a DAC: 00000015
    [ 55.821723] Process cat (pid: 2936, stack limit = 0xdaf54210)
    [ 55.827451] Stack: (0xdaf55e90 to 0xdaf56000)
    [ 55.831795] 5e80: 60000013 c01459c4 0000002a c06f8ef8
    [ 55.839956] 5ea0: db651000 c06f8ef8 daebac00 c04cb668 daebac08 c0346864 00000000 c01459c4
    [ 55.848115] 5ec0: d99eaa80 c06f8ef8 00000fff 00001000 db651000 c027f25c c027f240 d99eaa80
    [ 55.856274] 5ee0: d9a06c00 c0146218 daf55f18 00001000 d99eaa80 db4c18c0 00000001 00000001
    [ 55.864468] 5f00: daf55f80 c0144c78 c0144c54 c0107f90 00015000 d99eaab0 00000000 00000000
    [ 55.872603] 5f20: 000051c7 00000000 db4c18c0 c04a9370 00015000 00001000 daf55f80 00001000
    [ 55.880763] 5f40: daf54000 00015000 00000000 c00e53dc db4c18c0 c00e548c 0000000d 00008124
    [ 55.888937] 5f60: 00000001 00000000 00000000 db4c18c0 db4c18c0 00001000 00015000 c00e5550
    [ 55.897099] 5f80: 00000000 00000000 00001000 00001000 00015000 00000003 00000003 c000f364
    [ 55.905239] 5fa0: 00000000 c000f1a0 00001000 00015000 00000003 00015000 00001000 0001333c
    [ 55.913399] 5fc0: 00001000 00015000 00000003 00000003 00000002 00000000 00000000 00000000
    [ 55.921560] 5fe0: 7fffe000 be999850 0000a225 b6f3c19c 60000010 00000003 00000000 00000000
    [ 55.929744] [] (charger_get_property) from [] (power_supply_show_property+0x48/0x20c)
    [ 55.939286] [] (power_supply_show_property) from [] (dev_attr_show+0x1c/0x48)
    [ 55.948130] [] (dev_attr_show) from [] (sysfs_kf_seq_show+0x84/0x104)
    [ 55.956298] [] (sysfs_kf_seq_show) from [] (kernfs_seq_show+0x24/0x28)
    [ 55.964536] [] (kernfs_seq_show) from [] (seq_read+0x1b0/0x484)
    [ 55.972172] [] (seq_read) from [] (__vfs_read+0x18/0x4c)
    [ 55.979188] [] (__vfs_read) from [] (vfs_read+0x7c/0x100)
    [ 55.986304] [] (vfs_read) from [] (SyS_read+0x40/0x8c)
    [ 55.993164] [] (SyS_read) from [] (ret_fast_syscall+0x0/0x48)
    [ 56.000626] Code: bad PC value
    [ 56.011652] ---[ end trace 7b64343fbdae8ef1 ]---

    Signed-off-by: Krzysztof Kozlowski
    Reviewed-by: Bartlomiej Zolnierkiewicz

    [for the nvec part]
    Reviewed-by: Marc Dietrich

    [for compal-laptop.c]
    Acked-by: Darren Hart

    [for the mfd part]
    Acked-by: Lee Jones

    [for the hid part]
    Acked-by: Jiri Kosina

    [for the acpi part]
    Acked-by: Rafael J. Wysocki

    Signed-off-by: Sebastian Reichel

    Krzysztof Kozlowski
     
  • Add new structure 'power_supply_config' for holding run-time
    initialization data like of_node, supplies and private driver data.

    The power_supply_register() function is changed so all power supply
    drivers need updating.

    When registering the power supply this new 'power_supply_config' should be
    used instead of directly initializing 'struct power_supply'. This allows
    changing the ownership of power_supply structure from driver to the
    power supply core in next patches.

    When a driver does not use of_node or supplies then it should use NULL
    as config. If driver uses of_node or supplies then it should allocate
    config on stack and initialize it with proper values.

    Signed-off-by: Krzysztof Kozlowski
    Reviewed-by: Bartlomiej Zolnierkiewicz
    Acked-by: Pavel Machek

    [for the nvec part]
    Reviewed-by: Marc Dietrich

    [for drivers/platform/x86/compal-laptop.c]
    Reviewed-by: Darren Hart

    [for drivers/hid/*]
    Reviewed-by: Jiri Kosina

    Signed-off-by: Sebastian Reichel

    Krzysztof Kozlowski
     

20 Oct, 2014

1 commit


04 Jan, 2013

1 commit

  • CONFIG_HOTPLUG is going away as an option. As a result, the __dev*
    markings need to be removed.

    This change removes the use of __devinit, __devexit_p, __devinitconst,
    and __devexit from these drivers.

    Based on patches originally written by Bill Pemberton, but redone by me
    in order to handle some of the coding style issues better, by hand.

    Cc: Bill Pemberton
    Cc: Anton Vorontsov
    Cc: David Woodhouse
    Cc: Andrew Lunn
    Cc: Jamie Lentin
    Cc: Jason Cooper
    Signed-off-by: Greg Kroah-Hartman

    Greg Kroah-Hartman
     

29 Nov, 2012

3 commits


03 Aug, 2012

1 commit

  • Pull OLPC platform updates from Andres Salomon:
    "These move the OLPC Embedded Controller driver out of
    arch/x86/platform and into drivers/platform/olpc.

    OLPC machines are now ARM-based (which means lots of x86 and ARM
    changes), but are typically pretty self-contained.. so it makes more
    sense to go through a separate OLPC tree after getting the appropriate
    review/ACKs."

    * 'for-linus-3.6' of git://dev.laptop.org/users/dilinger/linux-olpc:
    x86: OLPC: move s/r-related EC cmds to EC driver
    Platform: OLPC: move global variables into priv struct
    Platform: OLPC: move debugfs support from x86 EC driver
    x86: OLPC: switch over to using new EC driver on x86
    Platform: OLPC: add a suspended flag to the EC driver
    Platform: OLPC: turn EC driver into a platform_driver
    Platform: OLPC: allow EC cmd to be overridden, and create a workqueue to call it
    drivers: OLPC: update various drivers to include olpc-ec.h
    Platform: OLPC: add a stub to drivers/platform/ for the OLPC EC driver

    Linus Torvalds
     

01 Aug, 2012

1 commit


16 Jul, 2012

2 commits

  • Reduce the mAh value for the BYD LiFe battery from 3100mAh to 2800mAh
    to better reflect the average usable capacity as measured by olpc-pwr-log.

    Signed-off-by: Richard A. Smith
    Signed-off-by: Daniel Drake
    Signed-off-by: Anton Vorontsov

    Richard A. Smith
     
  • upowerd wants to compute the energy in the battery by looking at this
    property. If it's not present then it falls back on using the reported
    voltage of the battery at time upowerd loads. That's close but also
    means that every time you boot you get a slightly different energy
    capacity.

    Adding the VOLTAGE_MAX_DESIGN property allows upowerd to compute the
    same energy every time.

    Signed-off-by: Richard A. Smith
    Signed-off-by: Daniel Drake
    Signed-off-by: Anton Vorontsov

    Richard A. Smith
     

04 Jan, 2012

1 commit

  • This patch converts the drivers in drivers/power/* to use the
    module_platform_driver() macro which makes the code smaller and a bit
    simpler.

    Cc: Mike Rapoport
    Cc: Lars-Peter Clausen
    Cc: Nithish Mahalingam
    Cc: MyungJoo Ham
    Cc: Haojian Zhuang
    Cc: Balaji Rao
    Cc: Mark Brown
    Signed-off-by: Axel Lin
    Acked-by: Clifton Barnes
    Signed-off-by: Anton Vorontsov

    Axel Lin
     

25 Nov, 2011

2 commits

  • It is no longer used, so we can safely remove it.

    Signed-off-by: Anton Vorontsov

    Anton Vorontsov
     
  • This patch fixes the following noise (by renaming _drv to _driver):

    WARNING: drivers/power/olpc_battery.o(.data+0x100): Section mismatch in reference from the variable olpc_battery_drv to the function .devinit.text:olpc_battery_probe()
    The variable olpc_battery_drv references
    the function __devinit olpc_battery_probe()
    If the reference is valid then annotate the
    variable with __init* or __refdata (see linux/init.h) or name the variable:
    *driver, *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

    WARNING: drivers/power/olpc_battery.o(.data+0x104): Section mismatch in reference from the variable olpc_battery_drv to the function .devexit.text:olpc_battery_remove()
    The variable olpc_battery_drv references
    the function __devexit olpc_battery_remove()
    If the reference is valid then annotate the
    variable with __exit* (see linux/init.h) or name the variable:
    *driver, *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

    WARNING: drivers/power/olpc_battery.o(.data+0x128): Section mismatch in reference from the variable olpc_battery_drv to the variable .devinit.rodata:olpc_battery_ids
    The variable olpc_battery_drv references
    the variable __devinitconst olpc_battery_ids
    If the reference is valid then annotate the
    variable with __init* or __refdata (see linux/init.h) or name the variable:
    *driver, *_template, *_timer, *_sht, *_ops, *_probe, *_probe_one, *_console

    Signed-off-by: Anton Vorontsov

    Anton Vorontsov
     

20 Aug, 2011

2 commits


13 Jan, 2011

5 commits

  • The patches adding support for CURRENT_NOW, VOLTAGE_NOW, CHARGE_NOW and
    CHARGE_FULL_DESIGN were based on a tree not including c566d299
    ("olpc_battery: Ambient temperature is not available on XO-1.5") and
    therefore only modified the then-common, now-XO-1 properties list. This
    patch adds the new properties to XO-1.5 as well.

    Signed-off-by: Sascha Silbe
    Signed-off-by: Anton Vorontsov

    Sascha Silbe
     
  • {CURRENT,VOLTAGE}_AVG are actually {CURRENT,VOLTAGE}_NOW (the EC code
    directly passes through the value from the gas gauge instead of the
    internally used average). We retain {CURRENT,VOLTAGE}_AVG as an alias
    for compatibility reasons, it will be removed later.

    Signed-off-by: Sascha Silbe
    [ pgf@laptop.org: added VOLTAGE_NOW, aliased to VOLTAGE_AVG ]
    Signed-off-by: Paul Fox
    Signed-off-by: Anton Vorontsov

    Sascha Silbe
     
  • CHARGE_NOW is needed by some user space software (read: UPower) for
    internal calculations.

    This patch violates the power supply class definition (as we already
    do for CAPACITY though it isn't as obvious there), but this is the best
    we can do without adding rather sophisticated algorithms to either the EC
    or UPower.

    Signed-off-by: Sascha Silbe
    Signed-off-by: Paul Fox
    Signed-off-by: Anton Vorontsov

    Sascha Silbe
     
  • Some user space software (read: UPower) uses CHARGE_FULL_DESIGN for internal
    calculations. The design capacity of the OLPC batteries is effectively fixed
    and only needs to be exported.

    Signed-off-by: Sascha Silbe
    Signed-off-by: Paul Fox
    Signed-off-by: Anton Vorontsov

    Sascha Silbe
     
  • The XO-1.5 does not support the ambient temperature property.
    Create a separate list of properties for that configuration where
    ambient temperature is not included, and apply the correct property
    list at runtime.

    Signed-off-by: Daniel Drake
    Signed-off-by: Anton Vorontsov

    Daniel Drake
     

28 Sep, 2010

1 commit

  • When the driver was updated to be endian neutral (8e9c7716c)
    the signed part of the s16 values was lost. This is because be16_to_cpu()
    returns an unsigned value. This patch casts the values back to a s16
    number prior to the the implicit cast up to an int.

    Signed-off-by: Richard A. Smith
    Signed-off-by: Daniel Drake
    Cc:
    Signed-off-by: Anton Vorontsov

    Richard A. Smith
     

10 Aug, 2010

1 commit

  • drivers/power/olpc_battery.c:387: error: unknown field 'owner' specified in initializer
    drivers/power/olpc_battery.c:387: warning: excess elements in struct initializer
    drivers/power/olpc_battery.c:387: warning: (near initialization for 'olpc_bat_eeprom.attr')

    The .owner field has been dropped from the attr struct.

    Signed-off-by: David Woodhouse

    David Woodhouse
     

22 May, 2010

1 commit


02 Jul, 2009

1 commit


01 Jul, 2009

4 commits


17 Oct, 2008

1 commit


19 May, 2008

1 commit


13 May, 2008

1 commit

  • This adds PROP_CHARGE_COUNTER to the power supply class (documenting it
    as well). The OLPC battery driver uses this for spitting out its ACR
    values (in uAh). We have some rounding errors (the data sheet claims
    416.7, the math actually works out to 416.666667, so we're forced to
    choose between overflows or precision loss. I chose precision loss,
    and stuck w/ data sheet values), but I don't think anyone will care
    that much.

    Signed-off-by: Andres Salomon
    Signed-off-by: Anton Vorontsov

    Andres Salomon
     

04 May, 2008

4 commits


29 Apr, 2008

1 commit

  • This adds support for OLPC XO hardware. Open Firmware on XOs don't contain
    the VSA, so it is necessary to emulate the PCI BARs in the kernel. This also
    adds functionality for running EC commands, and a CONFIG_OLPC.

    A number of OLPC drivers depend upon CONFIG_OLPC.

    olpc_ec_timeout is a hack to work around Embedded Controller bugs.

    [akpm@linux-foundation.org: build fix]
    [akpm@linux-foundation.org: geode_has_vsa build fix]
    [akpm@linux-foundation.org: olpc_register_battery_callback doesn't exist]
    Signed-off-by: Andres Salomon
    Acked-by: Ingo Molnar
    Cc: Thomas Gleixner
    Cc: Andi Kleen
    Cc: Jordan Crouse
    Signed-off-by: Andrew Morton
    Signed-off-by: Linus Torvalds

    Andres Salomon
     

02 Feb, 2008

1 commit

  • The CAPACITY_LEVEL stuff defines various levels of charge; however, what
    is the difference between them? What differentiates between HIGH and NORMAL,
    LOW and CRITICAL, etc?

    As it appears that these are fairly arbitrary, we end up making such policy
    decisions in the kernel (or in hardware). This is the sort of decision that
    should be made in userspace, not in the kernel.

    If the hardware does not support _CAPACITY and it cannot be easily calculated,
    then perhaps the driver should register a custom CAPACITY_LEVEL attribute;
    however, userspace should not become accustomed to looking for such a thing,
    and we should certainly not encourage drivers to provide CAPACITY_LEVEL
    stubs.

    The following removes support for POWER_SUPPLY_PROP_CAPACITY_LEVEL. The
    OLPC battery driver is the only driver making use of this, so it's
    removed from there as well.

    Signed-off-by: Andres Salomon
    Signed-off-by: David Woodhouse

    Andres Salomon
     

16 Jul, 2007

1 commit