• Stephan Gerhold's avatar
    cpufreq: dt: Refactor initialization to handle probe deferral properly · dc279ac6
    Stephan Gerhold authored
    cpufreq-dt is currently unable to handle -EPROBE_DEFER properly
    because the error code is not propagated for the cpufreq_driver->init()
    callback. Instead, it attempts to avoid the situation by temporarily
    requesting all resources within resources_available() and releasing them
    again immediately after. This has several disadvantages:
    
      - Whenever we add something like interconnect handling to the OPP core
        we need to patch cpufreq-dt to request these resources early.
    
      - resources_available() is only run for CPU0, but other clusters may
        eventually depend on other resources that are not available yet.
        (See FIXME comment removed by this commit...)
    
      - All resources need to be looked up several times.
    
    Now that the OPP core can propagate -EPROBE_DEFER during initialization,
    it would be nice to avoid all that trouble and just propagate its error
    code when necessary.
    
    This commit refactors the cpufreq-dt driver to initialize private_data
    before registering the cpufreq driver. We do this by iterating over
    all possible CPUs and ensure that all resources are initialized:
    
      1. dev_pm_opp_get_opp_table() ensures the OPP table is allocated
         and initialized with clock and interconnects.
    
      2. dev_pm_opp_set_regulators() requests the regulators and assigns
         them to the OPP table.
    
      3. We call dev_pm_opp_of_get_sharing_cpus() early so that we only
         initialize the OPP table once for each shared policy.
    
    With these changes, we actually end up saving a few lines of code,
    the resources are no longer looked up multiple times and everything
    should be much more robust.
    Signed-off-by: default avatarStephan Gerhold <stephan@gerhold.net>
    [ Viresh: Use list_head structure for maintaining the list and minor
    	  changes ]
    Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
    dc279ac6
cpufreq-dt.c 9.66 KB