09 May, 2020

1 commit

  • Change the regulator helpers to use common linear_ranges code.

    Signed-off-by: Matti Vaittinen
    Reviewed-by: Mark Brown
    Acked-by: Charles Keepax
    Acked-by: Adam Thomson
    Link: https://lore.kernel.org/r/64f01d5e381b8631a271616b7790f9d5640974fb.1588944082.git.matti.vaittinen@fi.rohmeurope.com
    Signed-off-by: Mark Brown

    Matti Vaittinen
     

07 Jan, 2020

1 commit

  • Fix up inconsistent usage of upper and lowercase letters in "Samsung"
    name.

    "SAMSUNG" is not an abbreviation but a regular trademarked name.
    Therefore it should be written with lowercase letters starting with
    capital letter.

    Although advertisement materials usually use uppercase "SAMSUNG", the
    lowercase version is used in all legal aspects (e.g. on Wikipedia and in
    privacy/legal statements on
    https://www.samsung.com/semiconductor/privacy-global/).

    Signed-off-by: Krzysztof Kozlowski
    Link: https://lore.kernel.org/r/20200103171131.9900-20-krzk@kernel.org
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

07 Oct, 2019

1 commit

  • devm_gpiod_get_from_of_node() is being retired in favor of
    devm_fwnode_gpiod_get_index(), that behaves similar to
    devm_gpiod_get_index(), but can work with arbitrary firmware node. It
    will also be able to support secondary software nodes.

    Let's switch this driver over.

    Signed-off-by: Dmitry Torokhov
    Link: https://lore.kernel.org/r/20191004231017.130290-5-dmitry.torokhov@gmail.com
    Reviewed-by: Linus Walleij
    Signed-off-by: Mark Brown

    Dmitry Torokhov
     

10 Sep, 2019

1 commit


05 Jul, 2019

1 commit


02 Jul, 2019

2 commits

  • The driver was registering buck regulators with unsupported range of
    voltages for S2MPS11 devices. Basically it assumed that all 256 values
    are possible for a single 8-bit I2C register controlling buck's voltage.
    This is not true, as datasheet describes subset of these which can be
    used.

    For example for buck[12346] the minimum voltage is 650 mV which
    corresponds to register value of 0x8. The driver was however
    registering regulator starting at 600 mV, so for a step of 6.25 mV this
    gave the same result. However this allowed to try to configure
    regulators to unsupported values.

    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     
  • On S2MPS11 device, the buck7 and buck8 regulator voltages start at 750
    mV, not 600 mV. Using wrong minimal value caused shifting of these
    regulator values by 150 mV (e.g. buck7 usually configured to v1.35 V was
    reported as 1.2 V).

    On most of the boards these regulators are left in default state so this
    was only affecting reported voltage. However if any driver wanted to
    change them, then effectively it would set voltage 150 mV higher than
    intended.

    Cc:
    Fixes: cb74685ecb39 ("regulator: s2mps11: Add samsung s2mps11 regulator driver")
    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

25 Jun, 2019

3 commits

  • In case the requested gpio property is not found in the device tree, some
    callers of gpiod_get_from_of_node() expect a return value of NULL, others
    expect -ENOENT.
    In particular devm_fwnode_get_index_gpiod_from_child() expects -ENOENT.
    Currently it gets a NULL, which breaks the loop that tries all
    gpio_suffixes. The result is that a gpio property is not found, even
    though it is there.

    This patch changes gpiod_get_from_of_node() to return -ENOENT instead
    of NULL when the requested gpio property is not found in the device
    tree. Additionally it modifies all calling functions to properly
    evaluate the return value.

    Another approach would be to leave the return value of
    gpiod_get_from_of_node() as is and fix the bug in
    devm_fwnode_get_index_gpiod_from_child(). Other callers would still need
    to be reworked. The effort would be the same as with the chosen solution.

    Signed-off-by: Georg Waibel
    Reviewed-by: Krzysztof Kozlowski
    Reviewed-by: Linus Walleij
    Signed-off-by: Mark Brown

    Waibel Georg
     
  • The driver supported turning off regulators in suspend only for S2MPS14
    device. However this makes also sense for S2MPS11 and can reduce the
    power consumption during suspend to RAM.

    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     
  • Store the regulator ID instead of calling rdev_get_id() every time.
    This makes code slightly easier to read as shorter 'rdev_id' variable is
    used instead of full call. This can also speed things up by reducing
    number of calls, although effect was not measured.

    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

20 Jun, 2019

1 commit

  • If devm_gpiod_get_from_of_node() call returns ERR_PTR, it is assigned
    into an array of GPIO descriptors and used later because such error is
    not treated as critical thus it is not propagated back to the probe
    function.

    All code later expects that such GPIO descriptor is either a NULL or
    proper value. This later might lead to dereference of ERR_PTR.

    Only devices with S2MPS14 flavor are affected (other do not control
    regulators with GPIOs).

    Fixes: 1c984942f0a4 ("regulator: s2mps11: Pass descriptor instead of GPIO number")
    Cc:
    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

12 Feb, 2019

1 commit

  • LDO35 uses 25 mV step, not 50 mV. Bucks 7 and 8 use 12.5 mV step
    instead of 6.25 mV. Wrong step caused over-voltage (LDO35) or
    under-voltage (buck7 and 8) if regulators were used (e.g. on Exynos5420
    Arndale Octa board).

    Cc:
    Fixes: cb74685ecb39 ("regulator: s2mps11: Add samsung s2mps11 regulator driver")
    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

11 Dec, 2018

1 commit

  • The GPIO descriptors used by the S2MPS11 driver are retrieved
    during probe() and it is really helpful to have those under
    devres management because of all the errorpaths in the
    intialization.

    Using the new dev_gpiod_unhinge() call we can remove the
    devres management of the descriptor right before handing
    it over to the regulators core.

    Signed-off-by: Linus Walleij
    Reviewed-by: Marek Szyprowski
    Tested-by: Marek Szyprowski
    Reviewed-by: Charles Keepax
    Signed-off-by: Mark Brown

    Linus Walleij
     

20 Nov, 2018

1 commit


16 Nov, 2018

1 commit

  • Instead of passing a global GPIO number for the enable GPIO, pass
    a descriptor looked up with the standard devm_gpiod_get_optional()
    call.

    This regulator supports passing platform data, but enable/sleep
    regulators are looked up from the device tree exclusively, so
    we can need not touch other files.

    Tested on Odroid XU3 (with s2mps11 although not using any GPIOs
    for regulators, so at least default paths are not broken).

    Cc: Sangbeom Kim
    Cc: Chanwoo Choi
    Cc: Bartlomiej Zolnierkiewicz
    Cc: Krzysztof Kozlowski
    Reviewed-by: Krzysztof Kozlowski
    Tested-by: Krzysztof Kozlowski
    Signed-off-by: Linus Walleij
    Signed-off-by: Mark Brown

    Linus Walleij
     

08 Aug, 2018

1 commit


13 Jun, 2018

2 commits

  • The devm_kmalloc() function has a 2-factor argument form,
    devm_kmalloc_array(). This patch replaces cases of:

    devm_kmalloc(handle, a * b, gfp)

    with:
    devm_kmalloc_array(handle, a * b, gfp)

    as well as handling cases of:

    devm_kmalloc(handle, a * b * c, gfp)

    with:

    devm_kmalloc(handle, array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    devm_kmalloc_array(handle, array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    devm_kmalloc(handle, 4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    Some manual whitespace fixes were needed in this patch, as Coccinelle
    really liked to write "=devm_kmalloc..." instead of "= devm_kmalloc...".

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    expression HANDLE;
    type TYPE;
    expression THING, E;
    @@

    (
    devm_kmalloc(HANDLE,
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression HANDLE;
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    devm_kmalloc(HANDLE,
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    expression HANDLE;
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    expression HANDLE;
    identifier SIZE, COUNT;
    @@

    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression HANDLE;
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    devm_kmalloc(HANDLE,
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression HANDLE;
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    devm_kmalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    devm_kmalloc(HANDLE,
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    expression HANDLE;
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    devm_kmalloc(HANDLE,
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression HANDLE;
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    devm_kmalloc(HANDLE, C1 * C2 * C3, ...)
    |
    devm_kmalloc(HANDLE,
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    devm_kmalloc(HANDLE,
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression HANDLE;
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    devm_kmalloc(HANDLE, sizeof(THING) * C2, ...)
    |
    devm_kmalloc(HANDLE, sizeof(TYPE) * C2, ...)
    |
    devm_kmalloc(HANDLE, C1 * C2 * C3, ...)
    |
    devm_kmalloc(HANDLE, C1 * C2, ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - devm_kmalloc
    + devm_kmalloc_array
    (HANDLE,
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     
  • The kzalloc() function has a 2-factor argument form, kcalloc(). This
    patch replaces cases of:

    kzalloc(a * b, gfp)

    with:
    kcalloc(a * b, gfp)

    as well as handling cases of:

    kzalloc(a * b * c, gfp)

    with:

    kzalloc(array3_size(a, b, c), gfp)

    as it's slightly less ugly than:

    kzalloc_array(array_size(a, b), c, gfp)

    This does, however, attempt to ignore constant size factors like:

    kzalloc(4 * 1024, gfp)

    though any constants defined via macros get caught up in the conversion.

    Any factors with a sizeof() of "unsigned char", "char", and "u8" were
    dropped, since they're redundant.

    The Coccinelle script used for this was:

    // Fix redundant parens around sizeof().
    @@
    type TYPE;
    expression THING, E;
    @@

    (
    kzalloc(
    - (sizeof(TYPE)) * E
    + sizeof(TYPE) * E
    , ...)
    |
    kzalloc(
    - (sizeof(THING)) * E
    + sizeof(THING) * E
    , ...)
    )

    // Drop single-byte sizes and redundant parens.
    @@
    expression COUNT;
    typedef u8;
    typedef __u8;
    @@

    (
    kzalloc(
    - sizeof(u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * (COUNT)
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(__u8) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(char) * COUNT
    + COUNT
    , ...)
    |
    kzalloc(
    - sizeof(unsigned char) * COUNT
    + COUNT
    , ...)
    )

    // 2-factor product with sizeof(type/expression) and identifier or constant.
    @@
    type TYPE;
    expression THING;
    identifier COUNT_ID;
    constant COUNT_CONST;
    @@

    (
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_ID)
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_ID
    + COUNT_ID, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (COUNT_CONST)
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * COUNT_CONST
    + COUNT_CONST, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_ID)
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_ID
    + COUNT_ID, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (COUNT_CONST)
    + COUNT_CONST, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * COUNT_CONST
    + COUNT_CONST, sizeof(THING)
    , ...)
    )

    // 2-factor product, only identifiers.
    @@
    identifier SIZE, COUNT;
    @@

    - kzalloc
    + kcalloc
    (
    - SIZE * COUNT
    + COUNT, SIZE
    , ...)

    // 3-factor product with 1 sizeof(type) or sizeof(expression), with
    // redundant parens removed.
    @@
    expression THING;
    identifier STRIDE, COUNT;
    type TYPE;
    @@

    (
    kzalloc(
    - sizeof(TYPE) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(TYPE))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * (COUNT) * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * (STRIDE)
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    |
    kzalloc(
    - sizeof(THING) * COUNT * STRIDE
    + array3_size(COUNT, STRIDE, sizeof(THING))
    , ...)
    )

    // 3-factor product with 2 sizeof(variable), with redundant parens removed.
    @@
    expression THING1, THING2;
    identifier COUNT;
    type TYPE1, TYPE2;
    @@

    (
    kzalloc(
    - sizeof(TYPE1) * sizeof(TYPE2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(TYPE2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(THING1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(THING1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * COUNT
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    |
    kzalloc(
    - sizeof(TYPE1) * sizeof(THING2) * (COUNT)
    + array3_size(COUNT, sizeof(TYPE1), sizeof(THING2))
    , ...)
    )

    // 3-factor product, only identifiers, with redundant parens removed.
    @@
    identifier STRIDE, SIZE, COUNT;
    @@

    (
    kzalloc(
    - (COUNT) * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * STRIDE * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - (COUNT) * (STRIDE) * (SIZE)
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    |
    kzalloc(
    - COUNT * STRIDE * SIZE
    + array3_size(COUNT, STRIDE, SIZE)
    , ...)
    )

    // Any remaining multi-factor products, first at least 3-factor products,
    // when they're not all constants...
    @@
    expression E1, E2, E3;
    constant C1, C2, C3;
    @@

    (
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(
    - (E1) * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * E3
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - (E1) * (E2) * (E3)
    + array3_size(E1, E2, E3)
    , ...)
    |
    kzalloc(
    - E1 * E2 * E3
    + array3_size(E1, E2, E3)
    , ...)
    )

    // And then all remaining 2 factors products when they're not all constants,
    // keeping sizeof() as the second factor argument.
    @@
    expression THING, E1, E2;
    type TYPE;
    constant C1, C2, C3;
    @@

    (
    kzalloc(sizeof(THING) * C2, ...)
    |
    kzalloc(sizeof(TYPE) * C2, ...)
    |
    kzalloc(C1 * C2 * C3, ...)
    |
    kzalloc(C1 * C2, ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * (E2)
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(TYPE) * E2
    + E2, sizeof(TYPE)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * (E2)
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - sizeof(THING) * E2
    + E2, sizeof(THING)
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * E2
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - (E1) * (E2)
    + E1, E2
    , ...)
    |
    - kzalloc
    + kcalloc
    (
    - E1 * E2
    + E1, E2
    , ...)
    )

    Signed-off-by: Kees Cook

    Kees Cook
     

14 Mar, 2017

1 commit


12 Jul, 2016

1 commit


13 May, 2016

1 commit


19 Apr, 2016

1 commit

  • Driver did not provide default value for ramp delay for LDOs which lead
    to warning in dmesg, e.g. on Odroid XU4:

    [ 1.486076] vdd_ldo9: ramp_delay not set
    [ 1.506875] vddq_mmc2: ramp_delay not set
    [ 1.523766] vdd_ldo15: ramp_delay not set
    [ 1.544702] vdd_sd: ramp_delay not set

    The datasheet for all the S2MPS1x family is inconsistent here and does
    not specify unambiguously the value of ramp delay for LDO. It mentions
    30 mV/us in one timing diagram but then omits it completely in LDO
    regulator characteristics table (it is specified for bucks).

    However the vendor kernels for Galaxy S5 and Odroid XU3 use values of 12
    mV/us or 24 mV/us.

    Without the ramp delay value the consumers do not wait for voltage
    settle after changing it. Although the proper value of ramp delay for
    LDOs is unknown, it seems safer to use at least some value from
    reference kernel than to leave it unset.

    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

07 Apr, 2016

1 commit

  • The driver's init and exit function don't do anything besides registering
    and unregistering the platform driver, so the module_platform_driver()
    macro could just be used instead of having separate functions.

    Currently the macro is not being used because the driver is initialized at
    subsys init call level but this isn't necessary since consumer devices are
    defined in the DT as dependencies so there's no need for init calls order.

    Signed-off-by: Javier Martinez Canillas
    Signed-off-by: Mark Brown

    Javier Martinez Canillas
     

28 Mar, 2016

1 commit

  • The buck9 regulator of S2MPS11 PMIC had incorrect vsel_mask (0xff
    instead of 0x1f) thus reading entire register as buck9's voltage. This
    effectively caused regulator core to interpret values as higher voltages
    than they were and then to set real voltage much lower than intended.

    The buck9 provides power to other regulators, including LDO13
    and LDO19 which supply the MMC2 (SD card). On Odroid XU3/XU4 the lower
    voltage caused SD card detection errors on Odroid XU3/XU4:
    mmc1: card never left busy state
    mmc1: error -110 whilst initialising SD card

    During driver probe the regulator core was checking whether initial
    voltage matches the constraints. With incorrect vsel_mask of 0xff and
    default value of 0x50, the core interpreted this as 5 V which is outside
    of constraints (3-3.775 V). Then the regulator core was adjusting the
    voltage to match the constraints. With incorrect vsel_mask this new
    voltage mapped to a vere low voltage in the driver.

    Signed-off-by: Krzysztof Kozlowski
    Reviewed-by: Javier Martinez Canillas
    Tested-by: Javier Martinez Canillas
    Signed-off-by: Mark Brown
    Cc:

    Krzysztof Kozlowski
     

20 Feb, 2016

1 commit


18 Feb, 2016

1 commit

  • Following BUILD_BUG_ON using a variable fails for some of the compilers
    and optimization levels (reported for gcc 4.9):
    var = ARRAY_SIZE(s2mps15_regulators);
    BUILD_BUG_ON(S2MPS_REGULATOR_MAX < var);
    Fix this by using ARRAY_SIZE directly.

    Additionally add missing BUILD_BUG_ON check for S2MPS15 device (the
    check ensures that internal arrays are big enough to hold data for all
    of regulators on all devices).

    Reported-by: Arnd Bergmann
    Signed-off-by: Krzysztof Kozlowski
    Tested-by: Arnd Bergmann
    Reviewed-by: Arnd Bergmann
    Signed-off-by: Mark Brown

    Krzysztof Kozlowski
     

24 Nov, 2015

1 commit

  • Currently S2MPSXX multifunction device is named as *-pmic,
    and these MFDs also supports regulator as a one of its MFD cell which
    has the same name, because current name is confusing and we want to
    sort it out.

    We did discussed different approaches about how the MFD and it
    cells need to be named here [1].
    Based in the discussion this patch rename MFD regulator name as
    *-regulator instead of current *-pmic.

    This patch also changes the corresponding entries in the regulator driver
    to keep git-bisect happy.

    [1]-> https://lkml.org/lkml/2015/10/28/417

    Suggested-by: Lee Jones
    Signed-off-by: Alim Akhtar
    Reviewed-by: Krzysztof Kozlowski
    Acked-by: Mark Brown
    Signed-off-by: Lee Jones

    Alim Akhtar
     

23 Nov, 2015

1 commit

  • The S2MPS15 PMIC is similar in functionality to S2MPS11/14 PMIC. It contains
    27 LDO and 10 Buck regulators and allows programming these regulators via a
    I2C interface. This patch adds initial support for LDO/Buck regulators of
    S2MPS15 PMIC.

    Signed-off-by: Thomas Abraham
    Signed-off-by: Alim Akhtar
    Reviewed-by: Krzysztof Kozlowski
    Acked-by: Mark Brown
    Signed-off-by: Lee Jones

    Thomas Abraham
     

24 Jun, 2015

1 commit

  • Status of enabling suspend mode for regulator was stored in bitmap-like
    long integer.

    However since adding support for S2MPU02 the number of regulators
    exceeded 32 so on devices with more than 32 regulators (S2MPU02 and
    S2MPS13) overflow happens when shifting the bit. This could lead to
    enabling suspend mode for completely different regulator than intended
    or to switching different regulator to other mode (e.g. from always
    enabled to controlled by PWRHOLD pin). Both cases could result in larger
    energy usage and issues when suspending to RAM.

    Fixes: 00e2573d2c10 ("regulator: s2mps11: Add support S2MPU02 regulator device")
    Reported-by: Dan Carpenter
    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown
    Cc:

    Krzysztof Kozlowski
     

28 Apr, 2015

1 commit


16 Jan, 2015

1 commit


09 Jan, 2015

1 commit

  • This patch adds missing registers('BUCK7_SW' & 'LDO29_CTRL'). Since BUCK7 has
    1 more register (BUCK7_SW) than others, register offset should
    be added one more for which has bigger address than BUCK7 registers.

    Fixes: 76b9840b24ae04(regulator: s2mps11: Add support S2MPS13 regulator device)
    Signed-off-by: Jonghwa Lee
    Signed-off-by: Chanwoo Choi
    Signed-off-by: Mark Brown
    Cc:

    Jonghwa Lee
     

30 Dec, 2014

1 commit


15 Dec, 2014

1 commit

  • Pull driver core update from Greg KH:
    "Here's the set of driver core patches for 3.19-rc1.

    They are dominated by the removal of the .owner field in platform
    drivers. They touch a lot of files, but they are "simple" changes,
    just removing a line in a structure.

    Other than that, a few minor driver core and debugfs changes. There
    are some ath9k patches coming in through this tree that have been
    acked by the wireless maintainers as they relied on the debugfs
    changes.

    Everything has been in linux-next for a while"

    * tag 'driver-core-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core: (324 commits)
    Revert "ath: ath9k: use debugfs_create_devm_seqfile() helper for seq_file entries"
    fs: debugfs: add forward declaration for struct device type
    firmware class: Deletion of an unnecessary check before the function call "vunmap"
    firmware loader: fix hung task warning dump
    devcoredump: provide a one-way disable function
    device: Add dev__once variants
    ath: ath9k: use debugfs_create_devm_seqfile() helper for seq_file entries
    ath: use seq_file api for ath9k debugfs files
    debugfs: add helper function to create device related seq_file
    drivers/base: cacheinfo: remove noisy error boot message
    Revert "core: platform: add warning if driver has no owner"
    drivers: base: support cpu cache information interface to userspace via sysfs
    drivers: base: add cpu_device_create to support per-cpu devices
    topology: replace custom attribute macros with standard DEVICE_ATTR*
    cpumask: factor out show_cpumap into separate helper function
    driver core: Fix unbalanced device reference in drivers_probe
    driver core: fix race with userland in device_add()
    sysfs/kernfs: make read requests on pre-alloc files use the buffer.
    sysfs/kernfs: allow attributes to request write buffer be pre-allocated.
    fs: sysfs: return EGBIG on write if offset is larger than file size
    ...

    Linus Torvalds
     

12 Dec, 2014

1 commit

  • Invalid buck4 configuration for linear mapping of voltage in S2MPS14
    regulators caused boot failure on Gear 2 (dw_mmc-exynos):

    [ 3.569137] EXT4-fs (mmcblk0p15): mounted filesystem with ordered data mode. Opts: (null)
    [ 3.571716] VFS: Mounted root (ext4 filesystem) readonly on device 179:15.
    [ 3.629842] mmcblk0: error -110 sending status command, retrying
    [ 3.630244] mmcblk0: error -110 sending status command, retrying
    [ 3.636292] mmcblk0: error -110 sending status command, aborting

    Buck4 voltage regulator has different minimal voltage value than other
    bucks. Commit merging multiple regulator description macros caused to
    use linear_min_sel from buck[1235] regulators as value for buck4. This
    lead to lower voltage of buck4 than required.

    Output of the buck4 is used internally as power source for
    LDO{3,4,7,11,19,20,21,23}. On Gear 2 board LDO11 is used as MMC
    regulator (V_EMMC_1.8V).

    Fixes: 5a867cf28893 ("regulator: s2mps11: Optimize the regulator description macro")
    Signed-off-by: Krzysztof Kozlowski
    Signed-off-by: Mark Brown
    Cc:

    Krzysztof Kozlowski
     

09 Dec, 2014

1 commit

  • Pull regulator updates from Mark Brown:
    "The main thing this time around is support for suspend mode
    configuration from DT which will enable some very useful power savings
    on systems where we can't rely on the bootloader configuration. We
    still don't really support dynamic configuration of this at runtime,
    that may come later if there is any demand.

    Summary:
    - Support for specifying the target regulation mode and voltage
    during system suspend via DT, enabling power savings in that mode.
    - Reduce the default verbosity of the logging on boot, improving boot
    times especially for systems with very large numbers of regulators.
    - Lots of cleanups and fixes for Maxim PMIC drivers.
    - New driver for Richtek RT5033"

    * tag 'regulator-v3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/regulator: (62 commits)
    regulator: core: Fix regualtor_ena_gpio_free not to access pin after freeing
    regulator: sky81452: Modify Device Tree structure
    regulator: sky81452: Modify Device Tree structure
    dt-bindings: Update documentation for "system-power-controller" and fix misspellings
    of: Rename "poweroff-source" property to "system-power-controller"
    regulator: max77686: Remove support for board files
    regulator: max77802: Remove support for board files
    regulator: max77802: Fill regulator modes translation callback
    regulator: max77802: Document binding for regulator operating modes
    regulator: of: Add support for parsing initial and suspend modes
    regulator: of: Pass the regulator description in the match table
    regulator: of: Add regulator desc param to of_get_regulator_init_data()
    regulator: Add mode mapping function to struct regulator_desc
    regulator: Document binding for initial and suspend modes
    regulator: core: Add PRE_DISABLE notification
    regulator: gpio: fix parsing of gpio list
    regulator: rpm: add support for RPM-controller SMB208
    regulator: da9063: Do not transform local IRQ to virtual
    regulator: sky81452: Modify dependent Kconfig symbol
    regulator: rt5033: Add RT5033 Regulator device driver
    ...

    Linus Torvalds
     

05 Dec, 2014

1 commit


25 Nov, 2014

1 commit

  • This patch adds S2MPS13 regulator device to existing S2MPS11 device driver.
    The S2MPS13 has just different number of regulators from S2MPS14.
    The S2MPS13 regulator device includes LDO[1-40] and BUCK[1-10].

    Signed-off-by: Chanwoo Choi
    Acked-by: Sangbeom Kim
    Acked-by: Mark Brown
    Reviewed-by: Krzysztof Kozlowski
    Signed-off-by: Lee Jones

    Chanwoo Choi
     

07 Nov, 2014

1 commit


20 Oct, 2014

1 commit