[PATCH v2] spmi: Fix controller->node != parent->node breakage

Konrad Dybcio konradybcio at gmail.com
Mon Jan 13 14:12:28 PST 2025



On 1/13/25 22:52, Stephen Boyd wrote:
> Quoting Konrad Dybcio (2025-01-13 05:02:58)
>> From: Konrad Dybcio <konrad.dybcio at oss.qualcomm.com>
>>
>> On some platforms, like recent Qualcomm SoCs with multi-bus SPMI
>> arbiters, controller->node must be assigned to the individual buses'
>> subnodes, as the slave devices are children of these, like so:
>>
>> arbiter at c400000
>>          spmi at c42d000
>>                  pmic at 0
>>
>>          spmi at c432000
>>                  pmic at 0
>>
>> The commit referenced in Fixes changed that assignment, such that
>> spmi_controller_alloc() always assumes the PMICs come directly under
>> the arbiter node (which is true when there's only a single bus per
>> controller).
>>
>> Make controller->node specifiable to both benefit from Joe's refcount
>> improvements and un-break the aforementioned platforms.
> 
> How is it broken? I see spmi_pmic_arb_bus_init() calls
> devm_spmi_controller_alloc() which sets the of_node to the parent device
> and then spmi_pmic_arb_bus_init() overwrites that with
> 'ctrl->dev.of_node = node' later on in the same function. That will
> cause one more of_node_put() than is expected. I don't see that removed
> in this patch though, so the leak is still there?
> 
>>
>> Fixes: 821b07853e32 ("spmi: hisi-spmi-controller: manage the OF node reference in device initialization and cleanup")
> 
> I've dropped this patch from my queue. I don't know if we're really
> doing anything better by managing the of_node lifetime in that function
> vs. letting the callers assign the node they want and manage the
> lifetime themselves. Maybe we don't need to do anything? Presumably the
> parent device driver will unregister the controller anyway, so the
> lifetime of the of_node will be ensured regardless. For subnodes like
> qcom SPMI, the subnodes are child nodes of the parent device so they
> won't be removed. If they are dynamic nodes, then the caller can manage
> the lifetime.

Stephen, the wrong node gets assigned in the qcom driver with
multi-master controllers, resulting in probe failures.

Since the introduction of the commit referenced in fixes,
of_spmi_register_devices() sees the controller's subnodes
(which describe each of the two masters) as slave devices
- meaning no "real" devices ever get to probe

Konrad




More information about the linux-arm-kernel mailing list