Skip to content

Commit d724f4a

Browse files
saschahauerchanwoochoi
authored andcommitted
PM / devfreq: rockchip-dfi: Prepare for multiple users
When adding perf support later the DFI must be enabled when either of devfreq-event or perf is active. Prepare for that by adding a usage counter for the DFI. Also move enabling and disabling of the clock away from the devfreq-event specific functions to which the perf specific part won't have access. Link: https://lore.kernel.org/all/[email protected]/ Reviewed-by: Jonathan Cameron <[email protected]> Reviewed-by: Sebastian Reichel <[email protected]> Acked-by: Chanwoo Choi <[email protected]> Signed-off-by: Sascha Hauer <[email protected]> Signed-off-by: Chanwoo Choi <[email protected]>
1 parent b82932f commit d724f4a

File tree

1 file changed

+40
-17
lines changed

1 file changed

+40
-17
lines changed

drivers/devfreq/event/rockchip-dfi.c

Lines changed: 40 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -68,14 +68,29 @@ struct rockchip_dfi {
6868
void __iomem *regs;
6969
struct regmap *regmap_pmu;
7070
struct clk *clk;
71+
int usecount;
72+
struct mutex mutex;
7173
u32 ddr_type;
7274
unsigned int channel_mask;
7375
unsigned int max_channels;
7476
};
7577

76-
static void rockchip_dfi_start_hardware_counter(struct rockchip_dfi *dfi)
78+
static int rockchip_dfi_enable(struct rockchip_dfi *dfi)
7779
{
7880
void __iomem *dfi_regs = dfi->regs;
81+
int ret = 0;
82+
83+
mutex_lock(&dfi->mutex);
84+
85+
dfi->usecount++;
86+
if (dfi->usecount > 1)
87+
goto out;
88+
89+
ret = clk_prepare_enable(dfi->clk);
90+
if (ret) {
91+
dev_err(&dfi->edev->dev, "failed to enable dfi clk: %d\n", ret);
92+
goto out;
93+
}
7994

8095
/* clear DDRMON_CTRL setting */
8196
writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_TIMER_CNT_EN | DDRMON_CTRL_SOFTWARE_EN |
@@ -100,14 +115,30 @@ static void rockchip_dfi_start_hardware_counter(struct rockchip_dfi *dfi)
100115
/* enable count, use software mode */
101116
writel_relaxed(HIWORD_UPDATE(DDRMON_CTRL_SOFTWARE_EN, DDRMON_CTRL_SOFTWARE_EN),
102117
dfi_regs + DDRMON_CTRL);
118+
out:
119+
mutex_unlock(&dfi->mutex);
120+
121+
return ret;
103122
}
104123

105-
static void rockchip_dfi_stop_hardware_counter(struct rockchip_dfi *dfi)
124+
static void rockchip_dfi_disable(struct rockchip_dfi *dfi)
106125
{
107126
void __iomem *dfi_regs = dfi->regs;
108127

128+
mutex_lock(&dfi->mutex);
129+
130+
dfi->usecount--;
131+
132+
WARN_ON_ONCE(dfi->usecount < 0);
133+
134+
if (dfi->usecount > 0)
135+
goto out;
136+
109137
writel_relaxed(HIWORD_UPDATE(0, DDRMON_CTRL_SOFTWARE_EN),
110138
dfi_regs + DDRMON_CTRL);
139+
clk_disable_unprepare(dfi->clk);
140+
out:
141+
mutex_unlock(&dfi->mutex);
111142
}
112143

113144
static void rockchip_dfi_read_counters(struct rockchip_dfi *dfi, struct dmc_count *count)
@@ -125,29 +156,20 @@ static void rockchip_dfi_read_counters(struct rockchip_dfi *dfi, struct dmc_coun
125156
}
126157
}
127158

128-
static int rockchip_dfi_disable(struct devfreq_event_dev *edev)
159+
static int rockchip_dfi_event_disable(struct devfreq_event_dev *edev)
129160
{
130161
struct rockchip_dfi *dfi = devfreq_event_get_drvdata(edev);
131162

132-
rockchip_dfi_stop_hardware_counter(dfi);
133-
clk_disable_unprepare(dfi->clk);
163+
rockchip_dfi_disable(dfi);
134164

135165
return 0;
136166
}
137167

138-
static int rockchip_dfi_enable(struct devfreq_event_dev *edev)
168+
static int rockchip_dfi_event_enable(struct devfreq_event_dev *edev)
139169
{
140170
struct rockchip_dfi *dfi = devfreq_event_get_drvdata(edev);
141-
int ret;
142-
143-
ret = clk_prepare_enable(dfi->clk);
144-
if (ret) {
145-
dev_err(&edev->dev, "failed to enable dfi clk: %d\n", ret);
146-
return ret;
147-
}
148171

149-
rockchip_dfi_start_hardware_counter(dfi);
150-
return 0;
172+
return rockchip_dfi_enable(dfi);
151173
}
152174

153175
static int rockchip_dfi_set_event(struct devfreq_event_dev *edev)
@@ -191,8 +213,8 @@ static int rockchip_dfi_get_event(struct devfreq_event_dev *edev,
191213
}
192214

193215
static const struct devfreq_event_ops rockchip_dfi_ops = {
194-
.disable = rockchip_dfi_disable,
195-
.enable = rockchip_dfi_enable,
216+
.disable = rockchip_dfi_event_disable,
217+
.enable = rockchip_dfi_event_enable,
196218
.get_event = rockchip_dfi_get_event,
197219
.set_event = rockchip_dfi_set_event,
198220
};
@@ -280,6 +302,7 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
280302
return PTR_ERR(dfi->regmap_pmu);
281303

282304
dfi->dev = dev;
305+
mutex_init(&dfi->mutex);
283306

284307
desc = &dfi->desc;
285308
desc->ops = &rockchip_dfi_ops;

0 commit comments

Comments
 (0)