• Serge Semin's avatar
    ata: libahci_platform: Convert to using devm bulk clocks API · e28b3abf
    Serge Semin authored
    In order to simplify the clock-related code there is a way to convert the
    current fixed clocks array into using the common bulk clocks kernel API
    with dynamic set of the clock handlers and device-managed clock-resource
    tracking. It's a bit tricky due to the complication coming from the
    requirement to support the platforms (da850, spear13xx) with the
    non-OF-based clock source, but still doable.
    
    Before this modification there are two methods have been used to get the
    clocks connected to an AHCI device: clk_get() - to get the very first
    clock in the list and of_clk_get() - to get the rest of them. Basically
    the platforms with non-OF-based clocks definition could specify only a
    single reference clock source. The platforms with OF-hw clocks have been
    luckier and could setup up to AHCI_MAX_CLKS clocks. Such semantic can be
    retained with using devm_clk_bulk_get_all() to retrieve the clocks defined
    via the DT firmware and devm_clk_get_optional() otherwise. In both cases
    using the device-managed version of the methods will cause the automatic
    resources deallocation on the AHCI device removal event. The only
    complicated part in the suggested approach is the explicit allocation and
    initialization of the clk_bulk_data structure instance for the non-OF
    reference clocks. It's required in order to use the Bulk Clocks API for
    the both denoted cases of the clocks definition.
    
    Note aside with the clock-related code reduction and natural
    simplification, there are several bonuses the suggested modification
    provides. First of all the limitation of having no greater than
    AHCI_MAX_CLKS clocks is now removed, since the devm_clk_bulk_get_all()
    method will allocate as many reference clocks data descriptors as there
    are clocks specified for the device. Secondly the clock names are
    auto-detected. So the LLDD (glue) drivers can make sure that the required
    clocks are specified just by checking the clock IDs in the clk_bulk_data
    array.  Thirdly using the handy Bulk Clocks kernel API improves the
    clocks-handling code readability. And the last but not least this
    modification implements a true optional clocks support to the
    ahci_platform_get_resources() method. Indeed the previous clocks getting
    procedure just stopped getting the clocks on any errors (aside from
    non-critical -EPROBE_DEFER) in a way so the callee wasn't even informed
    about abnormal loop termination. The new implementation lacks of such
    problem. The ahci_platform_get_resources() will return an error code if
    the corresponding clocks getting method ends execution abnormally.
    Signed-off-by: default avatarSerge Semin <Sergey.Semin@baikalelectronics.ru>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.de>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
    e28b3abf
ahci_da850.c 6.22 KB