• Janusz Krzysztofik's avatar
    ARM: OMAP1: ams-delta: Fix MODEM initialization failure · 5447da5d
    Janusz Krzysztofik authored
    Regulator drivers were modified to use asynchronous device probe.  Since
    then, the board .init_late hook fails to acquire a GPIO based fixed
    regulator needed by an on-board voice MODEM device, and unregisters the
    MODEM.  That in turn triggers a so far not discovered bug of device
    unregister function called for a device with no associated release() op.
    
    serial8250 serial8250.1: incomplete constraints, dummy supplies not allowed
    WARNING: CPU: 0 PID: 1 at drivers/base/core.c:2486 device_release+0x98/0xa8
    Device 'serial8250.1' does not have a release() function, it is broken and
     must be fixed. See Documentation/core-api/kobject.rst.
    ...
    put_device from platform_device_put+0x1c/0x24
    platform_device_put from ams_delta_init_late+0x4c/0x68
    ams_delta_init_late from init_machine_late+0x1c/0x94
    init_machine_late from do_one_initcall+0x60/0x1d4
    
    As a consequence, ASoC CODEC driver is no longer able to control its
    device over the voice MODEM's tty interface.
    
    cx20442-codec: ASoC: error at soc_component_write_no_lock
     on cx20442-codec for register: [0x00000000] -5
    cx20442-codec: ASoC: error at snd_soc_component_update_bits_legacy
     on cx20442-codec for register: [0x00000000] -5
    cx20442-codec: ASoC: error at snd_soc_component_update_bits
     on cx20442-codec for register: [0x00000000] -5
    
    The regulator hangs of a GPIO pin controlled by basic-mmio-gpio driver.
    Unlike most GPIO drivers, that driver doesn't probe for devices before
    device_initcall, then GPIO pins under its control are not availabele to
    majority of devices probed at that phase, including regulators.  On the
    other hand, serial8250 driver used by the MODEM device neither accepts via
    platform data nor handles regulators, then the board file is not able to
    teach that driver to return -EPROBE_DEFER when the regulator is not ready
    so the failed probe is retried after late_initcall.
    
    Resolve the issue by extending description of the MODEM device with a
    dedicated power management domain.  Acquire the regulator from the
    domain's .activate hook and return -EPROBE_DEFER if the regulator is not
    available.  Having that under control, add the regulator device
    description to the list of platform devices initialized from .init_machine
    and drop the no longer needed custom .init_late hook.
    
    v2: Trim down the warning for prettier git log output (Tony).
    
    Fixes: 259b93b2 ("regulator: Set PROBE_PREFER_ASYNCHRONOUS for drivers that existed in 4.14")
    Signed-off-by: default avatarJanusz Krzysztofik <jmkrzyszt@gmail.com>
    Cc: stable@vger.kernel.org # v6.4+
    Message-ID: <20231011175038.1907629-1-jmkrzyszt@gmail.com>
    Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
    5447da5d
board-ams-delta.c 22.8 KB