Skip to content

Commit 4f0a1a1

Browse files
YongWu-HFjoergroedel
authored andcommitted
memory: mtk-smi: Invoke pm runtime_callback to enable clocks
This patch only move the clk_prepare_enable and config_port into the runtime suspend/resume callback. It doesn't change the code content and sequence. This is a preparing patch for adjusting SMI_BUS_SEL for mt8183. (SMI_BUS_SEL need to be restored after smi-common resume every time.) Also it gives a chance to get rid of mtk_smi_larb_get/put which could be a next topic. CC: Matthias Brugger <[email protected]> Signed-off-by: Yong Wu <[email protected]> Reviewed-by: Evan Green <[email protected]> Reviewed-by: Matthias Brugger <[email protected]> Signed-off-by: Joerg Roedel <[email protected]>
1 parent 15a01f4 commit 4f0a1a1

File tree

1 file changed

+72
-41
lines changed

1 file changed

+72
-41
lines changed

drivers/memory/mtk-smi.c

Lines changed: 72 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -78,17 +78,13 @@ struct mtk_smi_larb { /* larb: local arbiter */
7878
u32 *mmu;
7979
};
8080

81-
static int mtk_smi_enable(const struct mtk_smi *smi)
81+
static int mtk_smi_clk_enable(const struct mtk_smi *smi)
8282
{
8383
int ret;
8484

85-
ret = pm_runtime_get_sync(smi->dev);
86-
if (ret < 0)
87-
return ret;
88-
8985
ret = clk_prepare_enable(smi->clk_apb);
9086
if (ret)
91-
goto err_put_pm;
87+
return ret;
9288

9389
ret = clk_prepare_enable(smi->clk_smi);
9490
if (ret)
@@ -110,59 +106,28 @@ static int mtk_smi_enable(const struct mtk_smi *smi)
110106
clk_disable_unprepare(smi->clk_smi);
111107
err_disable_apb:
112108
clk_disable_unprepare(smi->clk_apb);
113-
err_put_pm:
114-
pm_runtime_put_sync(smi->dev);
115109
return ret;
116110
}
117111

118-
static void mtk_smi_disable(const struct mtk_smi *smi)
112+
static void mtk_smi_clk_disable(const struct mtk_smi *smi)
119113
{
120114
clk_disable_unprepare(smi->clk_gals1);
121115
clk_disable_unprepare(smi->clk_gals0);
122116
clk_disable_unprepare(smi->clk_smi);
123117
clk_disable_unprepare(smi->clk_apb);
124-
pm_runtime_put_sync(smi->dev);
125118
}
126119

127120
int mtk_smi_larb_get(struct device *larbdev)
128121
{
129-
struct mtk_smi_larb *larb = dev_get_drvdata(larbdev);
130-
const struct mtk_smi_larb_gen *larb_gen = larb->larb_gen;
131-
struct mtk_smi *common = dev_get_drvdata(larb->smi_common_dev);
132-
int ret;
122+
int ret = pm_runtime_get_sync(larbdev);
133123

134-
/* Enable the smi-common's power and clocks */
135-
ret = mtk_smi_enable(common);
136-
if (ret)
137-
return ret;
138-
139-
/* Enable the larb's power and clocks */
140-
ret = mtk_smi_enable(&larb->smi);
141-
if (ret) {
142-
mtk_smi_disable(common);
143-
return ret;
144-
}
145-
146-
/* Configure the iommu info for this larb */
147-
larb_gen->config_port(larbdev);
148-
149-
return 0;
124+
return (ret < 0) ? ret : 0;
150125
}
151126
EXPORT_SYMBOL_GPL(mtk_smi_larb_get);
152127

153128
void mtk_smi_larb_put(struct device *larbdev)
154129
{
155-
struct mtk_smi_larb *larb = dev_get_drvdata(larbdev);
156-
struct mtk_smi *common = dev_get_drvdata(larb->smi_common_dev);
157-
158-
/*
159-
* Don't de-configure the iommu info for this larb since there may be
160-
* several modules in this larb.
161-
* The iommu info will be reset after power off.
162-
*/
163-
164-
mtk_smi_disable(&larb->smi);
165-
mtk_smi_disable(common);
130+
pm_runtime_put_sync(larbdev);
166131
}
167132
EXPORT_SYMBOL_GPL(mtk_smi_larb_put);
168133

@@ -377,12 +342,52 @@ static int mtk_smi_larb_remove(struct platform_device *pdev)
377342
return 0;
378343
}
379344

345+
static int __maybe_unused mtk_smi_larb_resume(struct device *dev)
346+
{
347+
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
348+
const struct mtk_smi_larb_gen *larb_gen = larb->larb_gen;
349+
int ret;
350+
351+
/* Power on smi-common. */
352+
ret = pm_runtime_get_sync(larb->smi_common_dev);
353+
if (ret < 0) {
354+
dev_err(dev, "Failed to pm get for smi-common(%d).\n", ret);
355+
return ret;
356+
}
357+
358+
ret = mtk_smi_clk_enable(&larb->smi);
359+
if (ret < 0) {
360+
dev_err(dev, "Failed to enable clock(%d).\n", ret);
361+
pm_runtime_put_sync(larb->smi_common_dev);
362+
return ret;
363+
}
364+
365+
/* Configure the basic setting for this larb */
366+
larb_gen->config_port(dev);
367+
368+
return 0;
369+
}
370+
371+
static int __maybe_unused mtk_smi_larb_suspend(struct device *dev)
372+
{
373+
struct mtk_smi_larb *larb = dev_get_drvdata(dev);
374+
375+
mtk_smi_clk_disable(&larb->smi);
376+
pm_runtime_put_sync(larb->smi_common_dev);
377+
return 0;
378+
}
379+
380+
static const struct dev_pm_ops smi_larb_pm_ops = {
381+
SET_RUNTIME_PM_OPS(mtk_smi_larb_suspend, mtk_smi_larb_resume, NULL)
382+
};
383+
380384
static struct platform_driver mtk_smi_larb_driver = {
381385
.probe = mtk_smi_larb_probe,
382386
.remove = mtk_smi_larb_remove,
383387
.driver = {
384388
.name = "mtk-smi-larb",
385389
.of_match_table = mtk_smi_larb_of_ids,
390+
.pm = &smi_larb_pm_ops,
386391
}
387392
};
388393

@@ -481,12 +486,38 @@ static int mtk_smi_common_remove(struct platform_device *pdev)
481486
return 0;
482487
}
483488

489+
static int __maybe_unused mtk_smi_common_resume(struct device *dev)
490+
{
491+
struct mtk_smi *common = dev_get_drvdata(dev);
492+
int ret;
493+
494+
ret = mtk_smi_clk_enable(common);
495+
if (ret) {
496+
dev_err(common->dev, "Failed to enable clock(%d).\n", ret);
497+
return ret;
498+
}
499+
return 0;
500+
}
501+
502+
static int __maybe_unused mtk_smi_common_suspend(struct device *dev)
503+
{
504+
struct mtk_smi *common = dev_get_drvdata(dev);
505+
506+
mtk_smi_clk_disable(common);
507+
return 0;
508+
}
509+
510+
static const struct dev_pm_ops smi_common_pm_ops = {
511+
SET_RUNTIME_PM_OPS(mtk_smi_common_suspend, mtk_smi_common_resume, NULL)
512+
};
513+
484514
static struct platform_driver mtk_smi_common_driver = {
485515
.probe = mtk_smi_common_probe,
486516
.remove = mtk_smi_common_remove,
487517
.driver = {
488518
.name = "mtk-smi-common",
489519
.of_match_table = mtk_smi_common_of_ids,
520+
.pm = &smi_common_pm_ops,
490521
}
491522
};
492523

0 commit comments

Comments
 (0)