Skip to content

Commit f04ed3d

Browse files
committed
Merge branches 'clk-basic', 'clk-mtk', 'clk-devm-enable' and 'clk-ti-dt' into clk-next
- Remove allwinner workaround logic/compatible in fixed factor code - MediaTek clk driver cleanups - Add reset support to more MediaTek clk drivers - devm helpers for clk_get() + clk_prepare() and clk_enable() * clk-basic: clk: fixed-factor: Introduce *clk_hw_register_fixed_factor_parent_hw() clk: mux: Introduce devm_clk_hw_register_mux_parent_hws() clk: divider: Introduce devm_clk_hw_register_divider_parent_hw() dt-bindings: clock: fixed-factor: Drop Allwinner A10 compatible clk: fixed: Remove Allwinner A10 special-case logic * clk-mtk: clk: mediatek: reset: Add infra_ao reset support for MT8186 dt-bindings: arm: mediatek: Add #reset-cells property for MT8186 dt-bindings: reset: mediatek: Add infra_ao reset index for MT8186 clk: mediatek: reset: Add infra_ao reset support for MT8192/MT8195 dt-bindings: reset: mediatek: Add infra_ao reset index for MT8192/MT8195 dt-bindings: arm: mediatek: Add #reset-cells property for MT8192/MT8195 clk: mediatek: reset: Add reset support for simple probe clk: mediatek: reset: Add new register reset function with device clk: mediatek: reset: Change return type for clock reset register function clk: mediatek: reset: Support inuput argument index mode clk: mediatek: reset: Support nonsequence base offsets of reset registers clk: mediatek: reset: Revise structure to control reset register clk: mediatek: reset: Merge and revise reset register function clk: mediatek: reset: Extract common drivers to update function clk: mediatek: reset: Refine and reorder functions in reset.c clk: mediatek: reset: Fix written reset bit offset clk: mediatek: reset: Add reset.h clk: mediatek: Delete MT8192 msdc gate dt-bindings: ARM: Mediatek: Remove msdc binding of MT8192 clock * clk-devm-enable: clk: Remove never used devm_clk_*unregister() clk: Fix pointer casting to prevent oops in devm_clk_release() clk: meson: axg-audio: Don't duplicate devm_clk_get_enabled() clk: Provide new devm_clk helpers for prepared and enabled clocks clk: generalize devm_clk_get() a bit clk: Improve documentation for devm_clk_get() and its optional variant * clk-ti-dt: clk: ti: Stop using legacy clkctrl names for omap4 and 5
5 parents 3d7cb6b + 6ebd524 + 3b3ec20 + 62c0aff + 255584b commit f04ed3d

38 files changed

+987
-420
lines changed

Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8186-sys-clock.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,9 @@ properties:
3939
'#clock-cells':
4040
const: 1
4141

42+
'#reset-cells':
43+
const: 1
44+
4245
required:
4346
- compatible
4447
- reg

Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-clock.yaml

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ properties:
2424
- mediatek,mt8192-imp_iic_wrap_w
2525
- mediatek,mt8192-imp_iic_wrap_n
2626
- mediatek,mt8192-msdc_top
27-
- mediatek,mt8192-msdc
2827
- mediatek,mt8192-mfgcfg
2928
- mediatek,mt8192-imgsys
3029
- mediatek,mt8192-imgsys2
@@ -107,13 +106,6 @@ examples:
107106
#clock-cells = <1>;
108107
};
109108
110-
- |
111-
msdc: clock-controller@11f60000 {
112-
compatible = "mediatek,mt8192-msdc";
113-
reg = <0x11f60000 0x1000>;
114-
#clock-cells = <1>;
115-
};
116-
117109
- |
118110
mfgcfg: clock-controller@13fbf000 {
119111
compatible = "mediatek,mt8192-mfgcfg";

Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8192-sys-clock.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ properties:
2929
'#clock-cells':
3030
const: 1
3131

32+
'#reset-cells':
33+
const: 1
34+
3235
required:
3336
- compatible
3437
- reg

Documentation/devicetree/bindings/arm/mediatek/mediatek,mt8195-sys-clock.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ properties:
3737
'#clock-cells':
3838
const: 1
3939

40+
'#reset-cells':
41+
const: 1
42+
4043
required:
4144
- compatible
4245
- reg

Documentation/devicetree/bindings/clock/fixed-factor-clock.yaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ maintainers:
1313
properties:
1414
compatible:
1515
enum:
16-
- allwinner,sun4i-a10-pll3-2x-clk
1716
- fixed-factor-clock
1817

1918
"#clock-cells":

drivers/clk/clk-devres.c

Lines changed: 75 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -4,42 +4,101 @@
44
#include <linux/export.h>
55
#include <linux/gfp.h>
66

7+
struct devm_clk_state {
8+
struct clk *clk;
9+
void (*exit)(struct clk *clk);
10+
};
11+
712
static void devm_clk_release(struct device *dev, void *res)
813
{
9-
clk_put(*(struct clk **)res);
14+
struct devm_clk_state *state = res;
15+
16+
if (state->exit)
17+
state->exit(state->clk);
18+
19+
clk_put(state->clk);
1020
}
1121

12-
struct clk *devm_clk_get(struct device *dev, const char *id)
22+
static struct clk *__devm_clk_get(struct device *dev, const char *id,
23+
struct clk *(*get)(struct device *dev, const char *id),
24+
int (*init)(struct clk *clk),
25+
void (*exit)(struct clk *clk))
1326
{
14-
struct clk **ptr, *clk;
27+
struct devm_clk_state *state;
28+
struct clk *clk;
29+
int ret;
1530

16-
ptr = devres_alloc(devm_clk_release, sizeof(*ptr), GFP_KERNEL);
17-
if (!ptr)
31+
state = devres_alloc(devm_clk_release, sizeof(*state), GFP_KERNEL);
32+
if (!state)
1833
return ERR_PTR(-ENOMEM);
1934

20-
clk = clk_get(dev, id);
21-
if (!IS_ERR(clk)) {
22-
*ptr = clk;
23-
devres_add(dev, ptr);
24-
} else {
25-
devres_free(ptr);
35+
clk = get(dev, id);
36+
if (IS_ERR(clk)) {
37+
ret = PTR_ERR(clk);
38+
goto err_clk_get;
2639
}
2740

41+
if (init) {
42+
ret = init(clk);
43+
if (ret)
44+
goto err_clk_init;
45+
}
46+
47+
state->clk = clk;
48+
state->exit = exit;
49+
50+
devres_add(dev, state);
51+
2852
return clk;
53+
54+
err_clk_init:
55+
56+
clk_put(clk);
57+
err_clk_get:
58+
59+
devres_free(state);
60+
return ERR_PTR(ret);
61+
}
62+
63+
struct clk *devm_clk_get(struct device *dev, const char *id)
64+
{
65+
return __devm_clk_get(dev, id, clk_get, NULL, NULL);
2966
}
3067
EXPORT_SYMBOL(devm_clk_get);
3168

32-
struct clk *devm_clk_get_optional(struct device *dev, const char *id)
69+
struct clk *devm_clk_get_prepared(struct device *dev, const char *id)
3370
{
34-
struct clk *clk = devm_clk_get(dev, id);
71+
return __devm_clk_get(dev, id, clk_get, clk_prepare, clk_unprepare);
72+
}
73+
EXPORT_SYMBOL_GPL(devm_clk_get_prepared);
3574

36-
if (clk == ERR_PTR(-ENOENT))
37-
return NULL;
75+
struct clk *devm_clk_get_enabled(struct device *dev, const char *id)
76+
{
77+
return __devm_clk_get(dev, id, clk_get,
78+
clk_prepare_enable, clk_disable_unprepare);
79+
}
80+
EXPORT_SYMBOL_GPL(devm_clk_get_enabled);
3881

39-
return clk;
82+
struct clk *devm_clk_get_optional(struct device *dev, const char *id)
83+
{
84+
return __devm_clk_get(dev, id, clk_get_optional, NULL, NULL);
4085
}
4186
EXPORT_SYMBOL(devm_clk_get_optional);
4287

88+
struct clk *devm_clk_get_optional_prepared(struct device *dev, const char *id)
89+
{
90+
return __devm_clk_get(dev, id, clk_get_optional,
91+
clk_prepare, clk_unprepare);
92+
}
93+
EXPORT_SYMBOL_GPL(devm_clk_get_optional_prepared);
94+
95+
struct clk *devm_clk_get_optional_enabled(struct device *dev, const char *id)
96+
{
97+
return __devm_clk_get(dev, id, clk_get_optional,
98+
clk_prepare_enable, clk_disable_unprepare);
99+
}
100+
EXPORT_SYMBOL_GPL(devm_clk_get_optional_enabled);
101+
43102
struct clk_bulk_devres {
44103
struct clk_bulk_data *clks;
45104
int num_clks;

drivers/clk/clk-fixed-factor.c

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ static void devm_clk_hw_register_fixed_factor_release(struct device *dev, void *
7878

7979
static struct clk_hw *
8080
__clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
81-
const char *name, const char *parent_name, int index,
81+
const char *name, const char *parent_name,
82+
const struct clk_hw *parent_hw, int index,
8283
unsigned long flags, unsigned int mult, unsigned int div,
8384
bool devm)
8485
{
@@ -110,6 +111,8 @@ __clk_hw_register_fixed_factor(struct device *dev, struct device_node *np,
110111
init.flags = flags;
111112
if (parent_name)
112113
init.parent_names = &parent_name;
114+
else if (parent_hw)
115+
init.parent_hws = &parent_hw;
113116
else
114117
init.parent_data = &pdata;
115118
init.num_parents = 1;
@@ -148,16 +151,48 @@ struct clk_hw *devm_clk_hw_register_fixed_factor_index(struct device *dev,
148151
const char *name, unsigned int index, unsigned long flags,
149152
unsigned int mult, unsigned int div)
150153
{
151-
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, index,
154+
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, NULL, index,
152155
flags, mult, div, true);
153156
}
154157
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_index);
155158

159+
/**
160+
* devm_clk_hw_register_fixed_factor_parent_hw - Register a fixed factor clock with
161+
* pointer to parent clock
162+
* @dev: device that is registering this clock
163+
* @name: name of this clock
164+
* @parent_hw: pointer to parent clk
165+
* @flags: fixed factor flags
166+
* @mult: multiplier
167+
* @div: divider
168+
*
169+
* Return: Pointer to fixed factor clk_hw structure that was registered or
170+
* an error pointer.
171+
*/
172+
struct clk_hw *devm_clk_hw_register_fixed_factor_parent_hw(struct device *dev,
173+
const char *name, const struct clk_hw *parent_hw,
174+
unsigned long flags, unsigned int mult, unsigned int div)
175+
{
176+
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL, parent_hw,
177+
-1, flags, mult, div, true);
178+
}
179+
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor_parent_hw);
180+
181+
struct clk_hw *clk_hw_register_fixed_factor_parent_hw(struct device *dev,
182+
const char *name, const struct clk_hw *parent_hw,
183+
unsigned long flags, unsigned int mult, unsigned int div)
184+
{
185+
return __clk_hw_register_fixed_factor(dev, NULL, name, NULL,
186+
parent_hw, -1, flags, mult, div,
187+
false);
188+
}
189+
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor_parent_hw);
190+
156191
struct clk_hw *clk_hw_register_fixed_factor(struct device *dev,
157192
const char *name, const char *parent_name, unsigned long flags,
158193
unsigned int mult, unsigned int div)
159194
{
160-
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, -1,
195+
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1,
161196
flags, mult, div, false);
162197
}
163198
EXPORT_SYMBOL_GPL(clk_hw_register_fixed_factor);
@@ -204,22 +239,16 @@ struct clk_hw *devm_clk_hw_register_fixed_factor(struct device *dev,
204239
const char *name, const char *parent_name, unsigned long flags,
205240
unsigned int mult, unsigned int div)
206241
{
207-
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, -1,
242+
return __clk_hw_register_fixed_factor(dev, NULL, name, parent_name, NULL, -1,
208243
flags, mult, div, true);
209244
}
210245
EXPORT_SYMBOL_GPL(devm_clk_hw_register_fixed_factor);
211246

212247
#ifdef CONFIG_OF
213-
static const struct of_device_id set_rate_parent_matches[] = {
214-
{ .compatible = "allwinner,sun4i-a10-pll3-2x-clk" },
215-
{ /* Sentinel */ },
216-
};
217-
218248
static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
219249
{
220250
struct clk_hw *hw;
221251
const char *clk_name = node->name;
222-
unsigned long flags = 0;
223252
u32 div, mult;
224253
int ret;
225254

@@ -237,11 +266,8 @@ static struct clk_hw *_of_fixed_factor_clk_setup(struct device_node *node)
237266

238267
of_property_read_string(node, "clock-output-names", &clk_name);
239268

240-
if (of_match_node(set_rate_parent_matches, node))
241-
flags |= CLK_SET_RATE_PARENT;
242-
243-
hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, 0,
244-
flags, mult, div, false);
269+
hw = __clk_hw_register_fixed_factor(NULL, node, clk_name, NULL, NULL, 0,
270+
0, mult, div, false);
245271
if (IS_ERR(hw)) {
246272
/*
247273
* Clear OF_POPULATED flag so that clock registration can be

drivers/clk/clk.c

Lines changed: 0 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4279,54 +4279,6 @@ int devm_clk_hw_register(struct device *dev, struct clk_hw *hw)
42794279
}
42804280
EXPORT_SYMBOL_GPL(devm_clk_hw_register);
42814281

4282-
static int devm_clk_match(struct device *dev, void *res, void *data)
4283-
{
4284-
struct clk *c = res;
4285-
if (WARN_ON(!c))
4286-
return 0;
4287-
return c == data;
4288-
}
4289-
4290-
static int devm_clk_hw_match(struct device *dev, void *res, void *data)
4291-
{
4292-
struct clk_hw *hw = res;
4293-
4294-
if (WARN_ON(!hw))
4295-
return 0;
4296-
return hw == data;
4297-
}
4298-
4299-
/**
4300-
* devm_clk_unregister - resource managed clk_unregister()
4301-
* @dev: device that is unregistering the clock data
4302-
* @clk: clock to unregister
4303-
*
4304-
* Deallocate a clock allocated with devm_clk_register(). Normally
4305-
* this function will not need to be called and the resource management
4306-
* code will ensure that the resource is freed.
4307-
*/
4308-
void devm_clk_unregister(struct device *dev, struct clk *clk)
4309-
{
4310-
WARN_ON(devres_release(dev, devm_clk_unregister_cb, devm_clk_match, clk));
4311-
}
4312-
EXPORT_SYMBOL_GPL(devm_clk_unregister);
4313-
4314-
/**
4315-
* devm_clk_hw_unregister - resource managed clk_hw_unregister()
4316-
* @dev: device that is unregistering the hardware-specific clock data
4317-
* @hw: link to hardware-specific clock data
4318-
*
4319-
* Unregister a clk_hw registered with devm_clk_hw_register(). Normally
4320-
* this function will not need to be called and the resource management
4321-
* code will ensure that the resource is freed.
4322-
*/
4323-
void devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw)
4324-
{
4325-
WARN_ON(devres_release(dev, devm_clk_hw_unregister_cb, devm_clk_hw_match,
4326-
hw));
4327-
}
4328-
EXPORT_SYMBOL_GPL(devm_clk_hw_unregister);
4329-
43304282
static void devm_clk_release(struct device *dev, void *res)
43314283
{
43324284
clk_put(*(struct clk **)res);

drivers/clk/mediatek/clk-mt2701-eth.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,14 @@ static const struct mtk_gate eth_clks[] = {
3636
GATE_ETH(CLK_ETHSYS_CRYPTO, "crypto_clk", "ethif_sel", 29),
3737
};
3838

39+
static u16 rst_ofs[] = { 0x34, };
40+
41+
static const struct mtk_clk_rst_desc clk_rst_desc = {
42+
.version = MTK_RST_SIMPLE,
43+
.rst_bank_ofs = rst_ofs,
44+
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
45+
};
46+
3947
static const struct of_device_id of_match_clk_mt2701_eth[] = {
4048
{ .compatible = "mediatek,mt2701-ethsys", },
4149
{}
@@ -58,7 +66,7 @@ static int clk_mt2701_eth_probe(struct platform_device *pdev)
5866
"could not register clock provider: %s: %d\n",
5967
pdev->name, r);
6068

61-
mtk_register_reset_controller(node, 1, 0x34);
69+
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
6270

6371
return r;
6472
}

drivers/clk/mediatek/clk-mt2701-g3d.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,14 @@ static const struct mtk_gate g3d_clks[] = {
3535
GATE_G3D(CLK_G3DSYS_CORE, "g3d_core", "mfg_sel", 0),
3636
};
3737

38+
static u16 rst_ofs[] = { 0xc, };
39+
40+
static const struct mtk_clk_rst_desc clk_rst_desc = {
41+
.version = MTK_RST_SIMPLE,
42+
.rst_bank_ofs = rst_ofs,
43+
.rst_bank_nr = ARRAY_SIZE(rst_ofs),
44+
};
45+
3846
static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
3947
{
4048
struct clk_hw_onecell_data *clk_data;
@@ -52,7 +60,7 @@ static int clk_mt2701_g3dsys_init(struct platform_device *pdev)
5260
"could not register clock provider: %s: %d\n",
5361
pdev->name, r);
5462

55-
mtk_register_reset_controller(node, 1, 0xc);
63+
mtk_register_reset_controller_with_dev(&pdev->dev, &clk_rst_desc);
5664

5765
return r;
5866
}

0 commit comments

Comments
 (0)