03 Aug, 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


19 Jul, 2014

1 commit


31 Aug, 2013

1 commit

  • This issue was introduced in commit 8e2747f031bd "power: rx51_battery:
    Replace hardcoded channels values."

    Original code use channel as argument which was shifted by one in
    function. After mentioned commit argument is already shifted so we need to
    get index back.

    Signed-off-by: Marek Belisko
    Signed-off-by: Anton Vorontsov

    Marek BElisko
     

28 Aug, 2013

1 commit


07 Jun, 2013

1 commit

  • The driver core clears the driver data to NULL after device_release or on
    probe failure, since commit 0998d0631001288a5974afc0b2a5f568bcdecb4d
    (device-core: Ensure drvdata = NULL when no driver is bound). Thus, it is
    not needed to manually clear the device driver data to NULL.

    Signed-off-by: Jingoo Han
    Signed-off-by: Anton Vorontsov

    Jingoo Han
     

06 May, 2013

1 commit

  • Pull MFD update from Samuel Ortiz:
    "For 3.10 we have a few new MFD drivers for:

    - The ChromeOS embedded controller which provides keyboard, battery
    and power management services. This controller is accessible
    through i2c or SPI.

    - Silicon Laboratories 476x controller, providing access to their FM
    chipset and their audio codec.

    - Realtek's RTS5249, a memory stick, MMC and SD/SDIO PCI based
    reader.

    - Nokia's Tahvo power button and watchdog device. This device is
    very similar to Retu and is thus supported by the same code base.

    - STMicroelectronics STMPE1801, a keyboard and GPIO controller
    supported by the stmpe driver.

    - ST-Ericsson AB8540 and AB8505 power management and voltage
    converter controllers through the existing ab8500 code.

    Some other drivers got cleaned up or improved. In particular:

    - The Linaro/STE guys got the ab8500 driver in sync with their
    internal code through a series of optimizations, fixes and
    improvements.

    - The AS3711 and OMAP USB drivers now have DT support.

    - The arizona clock and interrupt handling code got improved.

    - The wm5102 register patch and boot mechanism also got improved."

    * tag 'mfd-3.10-1' of git://git.kernel.org/pub/scm/linux/kernel/git/sameo/mfd-next: (104 commits)
    mfd: si476x: Don't use 0bNNN
    mfd: vexpress: Handle pending config transactions
    mfd: ab8500: Export ab8500_gpadc_sw_hw_convert properly
    mfd: si476x: Fix i2c warning
    mfd: si476x: Add header files and Kbuild plumbing
    mfd: si476x: Add chip properties handling code
    mfd: si476x: Add the bulk of the core driver
    mfd: si476x: Add commands abstraction layer
    mfd: rtsx: Support RTS5249
    mfd: retu: Add Tahvo support
    mfd: ucb1400: Pass ucb1400-gpio data through ac97 bus
    mfd: wm8994: Add some OF properties
    mfd: wm8994: Add device ID data to WM8994 OF device IDs
    input: Export matrix_keypad_parse_of_params()
    mfd: tps65090: Add compatible string for charger subnode
    mfd: db8500-prcmu: Support platform dependant device selection
    mfd: syscon: Fix warnings when printing resource_size_t
    of: Add stub of_get_parent for non-OF builds
    mfd: omap-usb-tll: Convert to devm_ioremap_resource()
    mfd: omap-usb-host: Convert to devm_ioremap_resource()
    ...

    Linus Torvalds
     

17 Apr, 2013

1 commit


08 Apr, 2013

1 commit

  • Tell twl4030_madc_conversion that this driver needs raw values.
    Driver twl4030_madc has some hardcoded values and conversation
    functions which are incorrect for Nokia RX-51 board. This driver
    rx51_battery expects raw values which convert itself.

    This patch fixing values reported by power supply interface.
    Before this patch driver reported always incorrect values on
    3.8 kernel (sometimes design capacity was negative).

    Signed-off-by: Pali Rohár
    Acked-by: Anton Vorontsov
    Signed-off-by: Samuel Ortiz

    Pali Rohár
     

01 Apr, 2013

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
     

19 Nov, 2012

1 commit