On Mon, 2021-08-02 at 20:12 +0800, Eizan Miyamoto wrote: > The original intent of commit 86698b9505bbc ("media: mtk-mdp: convert > mtk_mdp_dev.comp array to list") was to create a list to track all > the > MDP components that needed to have their clocks enabled/disabled when > calling mtk_mdp_comp_clock_on/off. However, there was a bug inside > mtk_mdp_register_component where the args to a call to list_add were > swapped. The result is that only one component was added to > mtk_mdp_dev.comp_list because comp_list was instead being > repeatedly added to the single element lists headed by each > mtk_mdp_comp. > > The order of the args to list_add in mtk_mdp_register_component was > fixed in https://patchwork.kernel.org/patch/11742895/ (Fix Null > pointer > dereference when calling list_add). > > Then, as a result of https://patchwork.kernel.org/patch/11530769/ > (mtk-mdp: use pm_runtime in MDP component driver) if all the > components > are added to the component list, the mdp "master" / rdma0 component > ends up having pm_runtime_get_sync() called on it twice recursively: > > rpm_resume+0x694/0x8f8 > __pm_runtime_resume+0x7c/0xa0 ***NOTE*** > mtk_mdp_comp_clock_on+0x48/0x104 [mtk_mdp] > mtk_mdp_pm_resume+0x2c/0x44 [mtk_mdp] > pm_generic_runtime_resume+0x34/0x48 > __genpd_runtime_resume+0x6c/0x80 > genpd_runtime_resume+0x104/0x1ac > __rpm_callback+0x120/0x238 > rpm_callback+0x34/0x8c > rpm_resume+0x7a0/0x8f8 > __pm_runtime_resume+0x7c/0xa0 ***NOTE*** > mtk_mdp_m2m_start_streaming+0x2c/0x3c [mtk_mdp] > > (The calls to pm_runtime_get_sync are inlined and correspond to the > calls to __pm_runtime_resume). It is not correct to have > pm_runtime_get_sync called recursively and the second call will block > indefinitely. > > As a result of all that, this change factors > mtk_mdp_comp_clock_on/off > into mtk_mdp_comp_power_on/off and moves the calls to > pm_runtime_get/put into the power_on/off functions. > > This change then special-cases the master/rdma0 MDP component and > does > these things: > - the master/rdma0 component is not added to mtk_mdp_dev.comp_list > - the master/rdma0 component has its clocks (*but not power*) toggled > by mtk_mpd_comp_clock_on/off inside mtk_mdp_clock_on/off. > - the other components have their clocks *and* power toggled with > mtk_mdp_comp_power_on/off. > > This change introduces the assumption that mtk_mdp_pm_resume will > always be called though a callback from pm_runtime_get_sync made on > the > master / rdma0 component. > > Signed-off-by: Eizan Miyamoto <eizan@xxxxxxxxxxxx> > --- > Reviewed-by: Houlong Wei <houlong.wei@xxxxxxxxxxxx> > (no changes since v1) > [...]