Skip to content

Commit 8de790a

Browse files
committed
Merge tag 'spacemit-clk-for-6.18-1' of https://github.com/spacemit-com/linux into clk-spacemit
Pull RISC-V SpacemiT clk driver updates from Yixun Lan: - Convert to use clk_ops::determine_rate() - Fix parent clocks of SSPA in SpacemiT driver * tag 'spacemit-clk-for-6.18-1' of https://github.com/spacemit-com/linux: clk: spacemit: ccu_pll: convert from round_rate() to determine_rate() clk: spacemit: ccu_mix: convert from round_rate() to determine_rate() clk: spacemit: ccu_ddn: convert from round_rate() to determine_rate() clk: spacemit: fix sspax_clk dt-bindings: clock: spacemit: CLK_SSPA_I2S_BCLK for SSPA
2 parents 8f5ae30 + d02c71c commit 8de790a

5 files changed

Lines changed: 47 additions & 17 deletions

File tree

drivers/clk/spacemit/ccu-k1.c

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -247,18 +247,37 @@ CCU_GATE_DEFINE(aib_clk, CCU_PARENT_NAME(vctcxo_24m), APBC_AIB_CLK_RST, BIT(1),
247247

248248
CCU_GATE_DEFINE(onewire_clk, CCU_PARENT_NAME(vctcxo_24m), APBC_ONEWIRE_CLK_RST, BIT(1), 0);
249249

250-
static const struct clk_parent_data sspa_parents[] = {
250+
/*
251+
* When i2s_bclk is selected as the parent clock of sspa,
252+
* the hardware requires bit3 to be set
253+
*/
254+
CCU_GATE_DEFINE(sspa0_i2s_bclk, CCU_PARENT_HW(i2s_bclk), APBC_SSPA0_CLK_RST, BIT(3), 0);
255+
CCU_GATE_DEFINE(sspa1_i2s_bclk, CCU_PARENT_HW(i2s_bclk), APBC_SSPA1_CLK_RST, BIT(3), 0);
256+
257+
static const struct clk_parent_data sspa0_parents[] = {
251258
CCU_PARENT_HW(pll1_d384_6p4),
252259
CCU_PARENT_HW(pll1_d192_12p8),
253260
CCU_PARENT_HW(pll1_d96_25p6),
254261
CCU_PARENT_HW(pll1_d48_51p2),
255262
CCU_PARENT_HW(pll1_d768_3p2),
256263
CCU_PARENT_HW(pll1_d1536_1p6),
257264
CCU_PARENT_HW(pll1_d3072_0p8),
258-
CCU_PARENT_HW(i2s_bclk),
265+
CCU_PARENT_HW(sspa0_i2s_bclk),
259266
};
260-
CCU_MUX_GATE_DEFINE(sspa0_clk, sspa_parents, APBC_SSPA0_CLK_RST, 4, 3, BIT(1), 0);
261-
CCU_MUX_GATE_DEFINE(sspa1_clk, sspa_parents, APBC_SSPA1_CLK_RST, 4, 3, BIT(1), 0);
267+
CCU_MUX_GATE_DEFINE(sspa0_clk, sspa0_parents, APBC_SSPA0_CLK_RST, 4, 3, BIT(1), 0);
268+
269+
static const struct clk_parent_data sspa1_parents[] = {
270+
CCU_PARENT_HW(pll1_d384_6p4),
271+
CCU_PARENT_HW(pll1_d192_12p8),
272+
CCU_PARENT_HW(pll1_d96_25p6),
273+
CCU_PARENT_HW(pll1_d48_51p2),
274+
CCU_PARENT_HW(pll1_d768_3p2),
275+
CCU_PARENT_HW(pll1_d1536_1p6),
276+
CCU_PARENT_HW(pll1_d3072_0p8),
277+
CCU_PARENT_HW(sspa1_i2s_bclk),
278+
};
279+
CCU_MUX_GATE_DEFINE(sspa1_clk, sspa1_parents, APBC_SSPA1_CLK_RST, 4, 3, BIT(1), 0);
280+
262281
CCU_GATE_DEFINE(dro_clk, CCU_PARENT_HW(apb_clk), APBC_DRO_CLK_RST, BIT(1), 0);
263282
CCU_GATE_DEFINE(ir_clk, CCU_PARENT_HW(apb_clk), APBC_IR_CLK_RST, BIT(1), 0);
264283
CCU_GATE_DEFINE(tsen_clk, CCU_PARENT_HW(apb_clk), APBC_TSEN_CLK_RST, BIT(1), 0);
@@ -865,6 +884,8 @@ static struct clk_hw *k1_ccu_apbc_hws[] = {
865884
[CLK_SSPA1_BUS] = &sspa1_bus_clk.common.hw,
866885
[CLK_TSEN_BUS] = &tsen_bus_clk.common.hw,
867886
[CLK_IPC_AP2AUD_BUS] = &ipc_ap2aud_bus_clk.common.hw,
887+
[CLK_SSPA0_I2S_BCLK] = &sspa0_i2s_bclk.common.hw,
888+
[CLK_SSPA1_I2S_BCLK] = &sspa1_i2s_bclk.common.hw,
868889
};
869890

870891
static const struct spacemit_ccu_data k1_ccu_apbc_data = {

drivers/clk/spacemit/ccu_ddn.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,16 @@ static unsigned long ccu_ddn_calc_best_rate(struct ccu_ddn *ddn,
3939
return ccu_ddn_calc_rate(prate, *num, *den);
4040
}
4141

42-
static long ccu_ddn_round_rate(struct clk_hw *hw, unsigned long rate,
43-
unsigned long *prate)
42+
static int ccu_ddn_determine_rate(struct clk_hw *hw,
43+
struct clk_rate_request *req)
4444
{
4545
struct ccu_ddn *ddn = hw_to_ccu_ddn(hw);
4646
unsigned long num, den;
4747

48-
return ccu_ddn_calc_best_rate(ddn, rate, *prate, &num, &den);
48+
req->rate = ccu_ddn_calc_best_rate(ddn, req->rate,
49+
req->best_parent_rate, &num, &den);
50+
51+
return 0;
4952
}
5053

5154
static unsigned long ccu_ddn_recalc_rate(struct clk_hw *hw, unsigned long prate)
@@ -78,6 +81,6 @@ static int ccu_ddn_set_rate(struct clk_hw *hw, unsigned long rate,
7881

7982
const struct clk_ops spacemit_ccu_ddn_ops = {
8083
.recalc_rate = ccu_ddn_recalc_rate,
81-
.round_rate = ccu_ddn_round_rate,
84+
.determine_rate = ccu_ddn_determine_rate,
8285
.set_rate = ccu_ddn_set_rate,
8386
};

drivers/clk/spacemit/ccu_mix.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -80,10 +80,12 @@ static int ccu_mix_trigger_fc(struct clk_hw *hw)
8080
MIX_FC_TIMEOUT_US);
8181
}
8282

83-
static long ccu_factor_round_rate(struct clk_hw *hw, unsigned long rate,
84-
unsigned long *prate)
83+
static int ccu_factor_determine_rate(struct clk_hw *hw,
84+
struct clk_rate_request *req)
8585
{
86-
return ccu_factor_recalc_rate(hw, *prate);
86+
req->rate = ccu_factor_recalc_rate(hw, req->best_parent_rate);
87+
88+
return 0;
8789
}
8890

8991
static int ccu_factor_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -198,7 +200,7 @@ const struct clk_ops spacemit_ccu_gate_ops = {
198200
};
199201

200202
const struct clk_ops spacemit_ccu_factor_ops = {
201-
.round_rate = ccu_factor_round_rate,
203+
.determine_rate = ccu_factor_determine_rate,
202204
.recalc_rate = ccu_factor_recalc_rate,
203205
.set_rate = ccu_factor_set_rate,
204206
};
@@ -220,7 +222,7 @@ const struct clk_ops spacemit_ccu_factor_gate_ops = {
220222
.enable = ccu_gate_enable,
221223
.is_enabled = ccu_gate_is_enabled,
222224

223-
.round_rate = ccu_factor_round_rate,
225+
.determine_rate = ccu_factor_determine_rate,
224226
.recalc_rate = ccu_factor_recalc_rate,
225227
.set_rate = ccu_factor_set_rate,
226228
};

drivers/clk/spacemit/ccu_pll.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,14 @@ static unsigned long ccu_pll_recalc_rate(struct clk_hw *hw,
125125
return entry ? entry->rate : 0;
126126
}
127127

128-
static long ccu_pll_round_rate(struct clk_hw *hw, unsigned long rate,
129-
unsigned long *prate)
128+
static int ccu_pll_determine_rate(struct clk_hw *hw,
129+
struct clk_rate_request *req)
130130
{
131131
struct ccu_pll *pll = hw_to_ccu_pll(hw);
132132

133-
return ccu_pll_lookup_best_rate(pll, rate)->rate;
133+
req->rate = ccu_pll_lookup_best_rate(pll, req->rate)->rate;
134+
135+
return 0;
134136
}
135137

136138
static int ccu_pll_init(struct clk_hw *hw)
@@ -152,6 +154,6 @@ const struct clk_ops spacemit_ccu_pll_ops = {
152154
.disable = ccu_pll_disable,
153155
.set_rate = ccu_pll_set_rate,
154156
.recalc_rate = ccu_pll_recalc_rate,
155-
.round_rate = ccu_pll_round_rate,
157+
.determine_rate = ccu_pll_determine_rate,
156158
.is_enabled = ccu_pll_is_enabled,
157159
};

include/dt-bindings/clock/spacemit,k1-syscon.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@
182182
#define CLK_SSPA1_BUS 97
183183
#define CLK_TSEN_BUS 98
184184
#define CLK_IPC_AP2AUD_BUS 99
185+
#define CLK_SSPA0_I2S_BCLK 100
186+
#define CLK_SSPA1_I2S_BCLK 101
185187

186188
/* APBC resets */
187189
#define RESET_UART0 0

0 commit comments

Comments
 (0)