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
     

19 Mar, 2013

1 commit


29 Nov, 2012

1 commit


06 Jan, 2012

1 commit

  • Some sources for adc battery information provide only inaccurate results
    where the read value differs from the real value with positive and negative
    offsets. For such sources it can be more accurate to collect two or more
    value sample and use the average of all collected values.

    This patch adds pdata options volt_samples, current_samples and
    backup_volt_samples to specifiy the number of samples to collect,
    reads the specified number of samples and calculates the average of those.
    For unset sample-number-values a default of 1 is assumed.

    Signed-off-by: Heiko Stuebner
    Signed-off-by: Anton Vorontsov

    Heiko Stübner
     

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
     

20 Aug, 2011

1 commit

  • Add linux/module.h to fix this compilation error:

    drivers/power/s3c_adc_battery.c:435:15: error: expected declaration specifiers or ‘...’ before string constant
    drivers/power/s3c_adc_battery.c:435:1: warning: data definition has no type or storage class
    drivers/power/s3c_adc_battery.c:435:1: warning: type defaults to ‘int’ in declaration of ‘MODULE_AUTHOR’
    drivers/power/s3c_adc_battery.c:435:15: warning: function declaration isn’t a prototype
    drivers/power/s3c_adc_battery.c:436:20: error: expected declaration specifiers or ‘...’ before string constant
    drivers/power/s3c_adc_battery.c:436:1: warning: data definition has no type or storage class
    drivers/power/s3c_adc_battery.c:436:1: warning: type defaults to ‘int’ in declaration of ‘MODULE_DESCRIPTION’
    drivers/power/s3c_adc_battery.c:436:20: warning: function declaration isn’t a prototype
    drivers/power/s3c_adc_battery.c:437:16: error: expected declaration specifiers or ‘...’ before string constant
    drivers/power/s3c_adc_battery.c:437:1: warning: data definition has no type or storage class
    drivers/power/s3c_adc_battery.c:437:1: warning: type defaults to ‘int’ in declaration of ‘MODULE_LICENSE’
    drivers/power/s3c_adc_battery.c:437:16: warning: function declaration isn’t a prototype
    make[2]: *** [drivers/power/s3c_adc_battery.o] Error 1

    Signed-off-by: Vasily Khoruzhick
    Signed-off-by: Ian Lartey
    Signed-off-by: Anton Vorontsov

    Vasily Khoruzhick
     

08 Jul, 2011

1 commit


16 Mar, 2011

1 commit


15 Jan, 2011

1 commit

  • * git://git.infradead.org/battery-2.6: (21 commits)
    power_supply: Add MAX17042 Fuel Gauge Driver
    olpc_battery: Fix up XO-1.5 properties list
    olpc_battery: Add support for CURRENT_NOW and VOLTAGE_NOW
    olpc_battery: Add support for CHARGE_NOW
    olpc_battery: Add support for CHARGE_FULL_DESIGN
    olpc_battery: Ambient temperature is not available on XO-1.5
    jz4740-battery: Should include linux/io.h
    s3c_adc_battery: Add gpio_inverted field to pdata
    power_supply: Don't use flush_scheduled_work()
    power_supply: Fix use after free and memory leak
    gpio-charger: Fix potential race between irq handler and probe/remove
    gpio-charger: Provide default name for the power_supply
    gpio-charger: Check result of kzalloc
    jz4740-battery: Check if platform_data is supplied
    isp1704_charger: Detect charger after probe
    isp1704_charger: Set isp->dev before anything needs it
    isp1704_charger: Detect HUB/Host chargers
    isp1704_charger: Correct length for storing model
    power_supply: Add gpio charger driver
    jz4740-battery: Protect against concurrent battery readings
    ...

    Linus Torvalds
     

22 Dec, 2010

1 commit


02 Nov, 2010

1 commit

  • "gadget", "through", "command", "maintain", "maintain", "controller", "address",
    "between", "initiali[zs]e", "instead", "function", "select", "already",
    "equal", "access", "management", "hierarchy", "registration", "interest",
    "relative", "memory", "offset", "already",

    Signed-off-by: Uwe Kleine-König
    Signed-off-by: Jiri Kosina

    Uwe Kleine-König
     

23 Jul, 2010

1 commit

  • s3c-adc-battery is driver for monitoring and charging battery on
    iPAQ H1930/H1940/RX1950.

    It depends on s3c-adc driver to get battery voltage and current.

    Signed-off-by: Vasily Khoruzhick
    Signed-off-by: Anton Vorontsov

    Vasily Khoruzhick