@@ -86,6 +86,20 @@ struct imx_sc_pd_soc {
u8 num_ranges;
};
+bool imx_scu_pd_initialized;
+
+/*
+ * SCU clock-controller (SCU clock protocol) does not have a power domain
+ * property in DT, but the sub clocks registered requires power domain to
+ * be ready first. Export an API for SCU clk driver to query the status in
+ * order to support -EPROBE_DEFER properly.
+ */
+bool imx_scu_pd_is_initialized(void)
+{
+ return imx_scu_pd_initialized;
+}
+EXPORT_SYMBOL_GPL(imx_scu_pd_is_initialized);
+
static const struct imx_sc_pd_range imx8qxp_scu_pd_ranges[] = {
/* LSIO SS */
{ "pwm", IMX_SC_R_PWM_0, 8, true, 0 },
@@ -351,7 +365,11 @@ static int imx_sc_pd_probe(struct platform_device *pdev)
if (!pd_soc)
return -ENODEV;
- return imx_scu_init_pm_domains(&pdev->dev, pd_soc);
+ ret = imx_scu_init_pm_domains(&pdev->dev, pd_soc);
+ if (!ret)
+ imx_scu_pd_initialized = true;
+
+ return ret;
}
static const struct of_device_id imx_sc_pd_match[] = {
@@ -22,6 +22,7 @@ int imx_scu_irq_register_notifier(struct notifier_block *nb);
int imx_scu_irq_unregister_notifier(struct notifier_block *nb);
int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable);
int imx_scu_soc_init(struct device *dev);
+bool imx_scu_pd_is_initialized(void);
#else
static inline int imx_scu_soc_init(struct device *dev)
{
@@ -47,5 +48,10 @@ static inline int imx_scu_irq_group_enable(u8 group, u32 mask, u8 enable)
{
return -ENOTSUPP;
}
+
+static inline bool imx_scu_pd_is_initialized(void)
+{
+ return false;
+}
#endif
#endif /* _SC_SCI_H */
SCU clock-controller (SCU clock protocol) does not have a power domain property in DT, but the sub clocks registered requires power domain to be ready first. Export an API for SCU clk driver to query the status in order to support -EPROBE_DEFER properly. Link: https://lore.kernel.org/patchwork/patch/1334670/ Signed-off-by: Dong Aisheng <aisheng.dong@nxp.com> --- drivers/firmware/imx/scu-pd.c | 20 +++++++++++++++++++- include/linux/firmware/imx/sci.h | 6 ++++++ 2 files changed, 25 insertions(+), 1 deletion(-)