1 // SPDX-License-Identifier: GPL-2.0
3 * Clock driver for DA8xx/AM17xx/AM18xx/OMAP-L13x CFGCHIP
5 * Copyright (C) 2018 David Lechner <david@lechnology.com>
8 #include <linux/clk-provider.h>
10 #include <linux/clkdev.h>
11 #include <linux/init.h>
12 #include <linux/mfd/da8xx-cfgchip.h>
13 #include <linux/mfd/syscon.h>
14 #include <linux/of_device.h>
16 #include <linux/platform_data/clk-da8xx-cfgchip.h>
17 #include <linux/platform_device.h>
18 #include <linux/regmap.h>
19 #include <linux/slab.h>
21 /* --- Gate clocks --- */
23 #define DA8XX_GATE_CLOCK_IS_DIV4P5 BIT(1)
25 struct da8xx_cfgchip_gate_clk_info
{
32 struct da8xx_cfgchip_gate_clk
{
34 struct regmap
*regmap
;
39 #define to_da8xx_cfgchip_gate_clk(_hw) \
40 container_of((_hw), struct da8xx_cfgchip_gate_clk, hw)
42 static int da8xx_cfgchip_gate_clk_enable(struct clk_hw
*hw
)
44 struct da8xx_cfgchip_gate_clk
*clk
= to_da8xx_cfgchip_gate_clk(hw
);
46 return regmap_write_bits(clk
->regmap
, clk
->reg
, clk
->mask
, clk
->mask
);
49 static void da8xx_cfgchip_gate_clk_disable(struct clk_hw
*hw
)
51 struct da8xx_cfgchip_gate_clk
*clk
= to_da8xx_cfgchip_gate_clk(hw
);
53 regmap_write_bits(clk
->regmap
, clk
->reg
, clk
->mask
, 0);
56 static int da8xx_cfgchip_gate_clk_is_enabled(struct clk_hw
*hw
)
58 struct da8xx_cfgchip_gate_clk
*clk
= to_da8xx_cfgchip_gate_clk(hw
);
61 regmap_read(clk
->regmap
, clk
->reg
, &val
);
63 return !!(val
& clk
->mask
);
66 static unsigned long da8xx_cfgchip_div4p5_recalc_rate(struct clk_hw
*hw
,
67 unsigned long parent_rate
)
69 /* this clock divides by 4.5 */
70 return parent_rate
* 2 / 9;
73 static const struct clk_ops da8xx_cfgchip_gate_clk_ops
= {
74 .enable
= da8xx_cfgchip_gate_clk_enable
,
75 .disable
= da8xx_cfgchip_gate_clk_disable
,
76 .is_enabled
= da8xx_cfgchip_gate_clk_is_enabled
,
79 static const struct clk_ops da8xx_cfgchip_div4p5_clk_ops
= {
80 .enable
= da8xx_cfgchip_gate_clk_enable
,
81 .disable
= da8xx_cfgchip_gate_clk_disable
,
82 .is_enabled
= da8xx_cfgchip_gate_clk_is_enabled
,
83 .recalc_rate
= da8xx_cfgchip_div4p5_recalc_rate
,
86 static struct da8xx_cfgchip_gate_clk
* __init
87 da8xx_cfgchip_gate_clk_register(struct device
*dev
,
88 const struct da8xx_cfgchip_gate_clk_info
*info
,
89 struct regmap
*regmap
)
92 const char *parent_name
;
93 struct da8xx_cfgchip_gate_clk
*gate
;
94 struct clk_init_data init
;
97 parent
= devm_clk_get(dev
, NULL
);
99 return ERR_CAST(parent
);
101 parent_name
= __clk_get_name(parent
);
103 gate
= devm_kzalloc(dev
, sizeof(*gate
), GFP_KERNEL
);
105 return ERR_PTR(-ENOMEM
);
107 init
.name
= info
->name
;
108 if (info
->flags
& DA8XX_GATE_CLOCK_IS_DIV4P5
)
109 init
.ops
= &da8xx_cfgchip_div4p5_clk_ops
;
111 init
.ops
= &da8xx_cfgchip_gate_clk_ops
;
112 init
.parent_names
= &parent_name
;
113 init
.num_parents
= 1;
116 gate
->hw
.init
= &init
;
117 gate
->regmap
= regmap
;
118 gate
->reg
= info
->cfgchip
;
119 gate
->mask
= info
->bit
;
121 ret
= devm_clk_hw_register(dev
, &gate
->hw
);
128 static const struct da8xx_cfgchip_gate_clk_info da8xx_tbclksync_info __initconst
= {
129 .name
= "ehrpwm_tbclk",
130 .cfgchip
= CFGCHIP(1),
131 .bit
= CFGCHIP1_TBCLKSYNC
,
134 static int __init
da8xx_cfgchip_register_tbclk(struct device
*dev
,
135 struct regmap
*regmap
)
137 struct da8xx_cfgchip_gate_clk
*gate
;
139 gate
= da8xx_cfgchip_gate_clk_register(dev
, &da8xx_tbclksync_info
,
142 return PTR_ERR(gate
);
144 clk_hw_register_clkdev(&gate
->hw
, "tbclk", "ehrpwm.0");
145 clk_hw_register_clkdev(&gate
->hw
, "tbclk", "ehrpwm.1");
150 static const struct da8xx_cfgchip_gate_clk_info da8xx_div4p5ena_info __initconst
= {
152 .cfgchip
= CFGCHIP(3),
153 .bit
= CFGCHIP3_DIV45PENA
,
154 .flags
= DA8XX_GATE_CLOCK_IS_DIV4P5
,
157 static int __init
da8xx_cfgchip_register_div4p5(struct device
*dev
,
158 struct regmap
*regmap
)
160 struct da8xx_cfgchip_gate_clk
*gate
;
162 gate
= da8xx_cfgchip_gate_clk_register(dev
, &da8xx_div4p5ena_info
, regmap
);
164 return PTR_ERR_OR_ZERO(gate
);
168 of_da8xx_cfgchip_gate_clk_init(struct device
*dev
,
169 const struct da8xx_cfgchip_gate_clk_info
*info
,
170 struct regmap
*regmap
)
172 struct da8xx_cfgchip_gate_clk
*gate
;
174 gate
= da8xx_cfgchip_gate_clk_register(dev
, info
, regmap
);
176 return PTR_ERR(gate
);
178 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_simple_get
, gate
);
181 static int __init
of_da8xx_tbclksync_init(struct device
*dev
,
182 struct regmap
*regmap
)
184 return of_da8xx_cfgchip_gate_clk_init(dev
, &da8xx_tbclksync_info
, regmap
);
187 static int __init
of_da8xx_div4p5ena_init(struct device
*dev
,
188 struct regmap
*regmap
)
190 return of_da8xx_cfgchip_gate_clk_init(dev
, &da8xx_div4p5ena_info
, regmap
);
193 /* --- MUX clocks --- */
195 struct da8xx_cfgchip_mux_clk_info
{
203 struct da8xx_cfgchip_mux_clk
{
205 struct regmap
*regmap
;
210 #define to_da8xx_cfgchip_mux_clk(_hw) \
211 container_of((_hw), struct da8xx_cfgchip_mux_clk, hw)
213 static int da8xx_cfgchip_mux_clk_set_parent(struct clk_hw
*hw
, u8 index
)
215 struct da8xx_cfgchip_mux_clk
*clk
= to_da8xx_cfgchip_mux_clk(hw
);
216 unsigned int val
= index
? clk
->mask
: 0;
218 return regmap_write_bits(clk
->regmap
, clk
->reg
, clk
->mask
, val
);
221 static u8
da8xx_cfgchip_mux_clk_get_parent(struct clk_hw
*hw
)
223 struct da8xx_cfgchip_mux_clk
*clk
= to_da8xx_cfgchip_mux_clk(hw
);
226 regmap_read(clk
->regmap
, clk
->reg
, &val
);
228 return (val
& clk
->mask
) ? 1 : 0;
231 static const struct clk_ops da8xx_cfgchip_mux_clk_ops
= {
232 .set_parent
= da8xx_cfgchip_mux_clk_set_parent
,
233 .get_parent
= da8xx_cfgchip_mux_clk_get_parent
,
236 static struct da8xx_cfgchip_mux_clk
* __init
237 da8xx_cfgchip_mux_clk_register(struct device
*dev
,
238 const struct da8xx_cfgchip_mux_clk_info
*info
,
239 struct regmap
*regmap
)
241 const char * const parent_names
[] = { info
->parent0
, info
->parent1
};
242 struct da8xx_cfgchip_mux_clk
*mux
;
243 struct clk_init_data init
;
246 mux
= devm_kzalloc(dev
, sizeof(*mux
), GFP_KERNEL
);
248 return ERR_PTR(-ENOMEM
);
250 init
.name
= info
->name
;
251 init
.ops
= &da8xx_cfgchip_mux_clk_ops
;
252 init
.parent_names
= parent_names
;
253 init
.num_parents
= 2;
256 mux
->hw
.init
= &init
;
257 mux
->regmap
= regmap
;
258 mux
->reg
= info
->cfgchip
;
259 mux
->mask
= info
->bit
;
261 ret
= devm_clk_hw_register(dev
, &mux
->hw
);
268 static const struct da8xx_cfgchip_mux_clk_info da850_async1_info __initconst
= {
270 .parent0
= "pll0_sysclk3",
272 .cfgchip
= CFGCHIP(3),
273 .bit
= CFGCHIP3_EMA_CLKSRC
,
276 static int __init
da8xx_cfgchip_register_async1(struct device
*dev
,
277 struct regmap
*regmap
)
279 struct da8xx_cfgchip_mux_clk
*mux
;
281 mux
= da8xx_cfgchip_mux_clk_register(dev
, &da850_async1_info
, regmap
);
285 clk_hw_register_clkdev(&mux
->hw
, "async1", "da850-psc0");
290 static const struct da8xx_cfgchip_mux_clk_info da850_async3_info __initconst
= {
292 .parent0
= "pll0_sysclk2",
293 .parent1
= "pll1_sysclk2",
294 .cfgchip
= CFGCHIP(3),
295 .bit
= CFGCHIP3_ASYNC3_CLKSRC
,
298 static int __init
da850_cfgchip_register_async3(struct device
*dev
,
299 struct regmap
*regmap
)
301 struct da8xx_cfgchip_mux_clk
*mux
;
302 struct clk_hw
*parent
;
304 mux
= da8xx_cfgchip_mux_clk_register(dev
, &da850_async3_info
, regmap
);
308 clk_hw_register_clkdev(&mux
->hw
, "async3", "da850-psc1");
310 /* pll1_sysclk2 is not affected by CPU scaling, so use it for async3 */
311 parent
= clk_hw_get_parent_by_index(&mux
->hw
, 1);
313 clk_set_parent(mux
->hw
.clk
, parent
->clk
);
315 dev_warn(dev
, "Failed to find async3 parent clock\n");
321 of_da8xx_cfgchip_init_mux_clock(struct device
*dev
,
322 const struct da8xx_cfgchip_mux_clk_info
*info
,
323 struct regmap
*regmap
)
325 struct da8xx_cfgchip_mux_clk
*mux
;
327 mux
= da8xx_cfgchip_mux_clk_register(dev
, info
, regmap
);
331 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_simple_get
, &mux
->hw
);
334 static int __init
of_da850_async1_init(struct device
*dev
, struct regmap
*regmap
)
336 return of_da8xx_cfgchip_init_mux_clock(dev
, &da850_async1_info
, regmap
);
339 static int __init
of_da850_async3_init(struct device
*dev
, struct regmap
*regmap
)
341 return of_da8xx_cfgchip_init_mux_clock(dev
, &da850_async3_info
, regmap
);
344 /* --- USB 2.0 PHY clock --- */
346 struct da8xx_usb0_clk48
{
349 struct regmap
*regmap
;
352 #define to_da8xx_usb0_clk48(_hw) \
353 container_of((_hw), struct da8xx_usb0_clk48, hw)
355 static int da8xx_usb0_clk48_prepare(struct clk_hw
*hw
)
357 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
359 /* The USB 2.0 PSC clock is only needed temporarily during the USB 2.0
360 * PHY clock enable, but since clk_prepare() can't be called in an
361 * atomic context (i.e. in clk_enable()), we have to prepare it here.
363 return clk_prepare(usb0
->fck
);
366 static void da8xx_usb0_clk48_unprepare(struct clk_hw
*hw
)
368 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
370 clk_unprepare(usb0
->fck
);
373 static int da8xx_usb0_clk48_enable(struct clk_hw
*hw
)
375 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
376 unsigned int mask
, val
;
379 /* Locking the USB 2.O PLL requires that the USB 2.O PSC is enabled
380 * temporaily. It can be turned back off once the PLL is locked.
382 clk_enable(usb0
->fck
);
384 /* Turn on the USB 2.0 PHY, but just the PLL, and not OTG. The USB 1.1
385 * PHY may use the USB 2.0 PLL clock without USB 2.0 OTG being used.
387 mask
= CFGCHIP2_RESET
| CFGCHIP2_PHYPWRDN
| CFGCHIP2_PHY_PLLON
;
388 val
= CFGCHIP2_PHY_PLLON
;
390 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), mask
, val
);
391 ret
= regmap_read_poll_timeout(usb0
->regmap
, CFGCHIP(2), val
,
392 val
& CFGCHIP2_PHYCLKGD
, 0, 500000);
394 clk_disable(usb0
->fck
);
399 static void da8xx_usb0_clk48_disable(struct clk_hw
*hw
)
401 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
404 val
= CFGCHIP2_PHYPWRDN
;
405 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), val
, val
);
408 static int da8xx_usb0_clk48_is_enabled(struct clk_hw
*hw
)
410 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
413 regmap_read(usb0
->regmap
, CFGCHIP(2), &val
);
415 return !!(val
& CFGCHIP2_PHYCLKGD
);
418 static unsigned long da8xx_usb0_clk48_recalc_rate(struct clk_hw
*hw
,
419 unsigned long parent_rate
)
421 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
422 unsigned int mask
, val
;
424 /* The parent clock rate must be one of the following */
425 mask
= CFGCHIP2_REFFREQ_MASK
;
426 switch (parent_rate
) {
428 val
= CFGCHIP2_REFFREQ_12MHZ
;
431 val
= CFGCHIP2_REFFREQ_13MHZ
;
434 val
= CFGCHIP2_REFFREQ_19_2MHZ
;
437 val
= CFGCHIP2_REFFREQ_20MHZ
;
440 val
= CFGCHIP2_REFFREQ_24MHZ
;
443 val
= CFGCHIP2_REFFREQ_26MHZ
;
446 val
= CFGCHIP2_REFFREQ_38_4MHZ
;
449 val
= CFGCHIP2_REFFREQ_40MHZ
;
452 val
= CFGCHIP2_REFFREQ_48MHZ
;
458 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), mask
, val
);
460 /* USB 2.0 PLL always supplies 48MHz */
464 static long da8xx_usb0_clk48_round_rate(struct clk_hw
*hw
, unsigned long rate
,
465 unsigned long *parent_rate
)
470 static int da8xx_usb0_clk48_set_parent(struct clk_hw
*hw
, u8 index
)
472 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
474 return regmap_write_bits(usb0
->regmap
, CFGCHIP(2),
475 CFGCHIP2_USB2PHYCLKMUX
,
476 index
? CFGCHIP2_USB2PHYCLKMUX
: 0);
479 static u8
da8xx_usb0_clk48_get_parent(struct clk_hw
*hw
)
481 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
484 regmap_read(usb0
->regmap
, CFGCHIP(2), &val
);
486 return (val
& CFGCHIP2_USB2PHYCLKMUX
) ? 1 : 0;
489 static const struct clk_ops da8xx_usb0_clk48_ops
= {
490 .prepare
= da8xx_usb0_clk48_prepare
,
491 .unprepare
= da8xx_usb0_clk48_unprepare
,
492 .enable
= da8xx_usb0_clk48_enable
,
493 .disable
= da8xx_usb0_clk48_disable
,
494 .is_enabled
= da8xx_usb0_clk48_is_enabled
,
495 .recalc_rate
= da8xx_usb0_clk48_recalc_rate
,
496 .round_rate
= da8xx_usb0_clk48_round_rate
,
497 .set_parent
= da8xx_usb0_clk48_set_parent
,
498 .get_parent
= da8xx_usb0_clk48_get_parent
,
501 static struct da8xx_usb0_clk48
*
502 da8xx_cfgchip_register_usb0_clk48(struct device
*dev
,
503 struct regmap
*regmap
)
505 const char * const parent_names
[] = { "usb_refclkin", "pll0_auxclk" };
507 struct da8xx_usb0_clk48
*usb0
;
508 struct clk_init_data init
;
511 fck_clk
= devm_clk_get(dev
, "fck");
512 if (IS_ERR(fck_clk
)) {
513 if (PTR_ERR(fck_clk
) != -EPROBE_DEFER
)
514 dev_err(dev
, "Missing fck clock\n");
515 return ERR_CAST(fck_clk
);
518 usb0
= devm_kzalloc(dev
, sizeof(*usb0
), GFP_KERNEL
);
520 return ERR_PTR(-ENOMEM
);
522 init
.name
= "usb0_clk48";
523 init
.ops
= &da8xx_usb0_clk48_ops
;
524 init
.parent_names
= parent_names
;
525 init
.num_parents
= 2;
527 usb0
->hw
.init
= &init
;
529 usb0
->regmap
= regmap
;
531 ret
= devm_clk_hw_register(dev
, &usb0
->hw
);
538 /* --- USB 1.1 PHY clock --- */
540 struct da8xx_usb1_clk48
{
542 struct regmap
*regmap
;
545 #define to_da8xx_usb1_clk48(_hw) \
546 container_of((_hw), struct da8xx_usb1_clk48, hw)
548 static int da8xx_usb1_clk48_set_parent(struct clk_hw
*hw
, u8 index
)
550 struct da8xx_usb1_clk48
*usb1
= to_da8xx_usb1_clk48(hw
);
552 return regmap_write_bits(usb1
->regmap
, CFGCHIP(2),
553 CFGCHIP2_USB1PHYCLKMUX
,
554 index
? CFGCHIP2_USB1PHYCLKMUX
: 0);
557 static u8
da8xx_usb1_clk48_get_parent(struct clk_hw
*hw
)
559 struct da8xx_usb1_clk48
*usb1
= to_da8xx_usb1_clk48(hw
);
562 regmap_read(usb1
->regmap
, CFGCHIP(2), &val
);
564 return (val
& CFGCHIP2_USB1PHYCLKMUX
) ? 1 : 0;
567 static const struct clk_ops da8xx_usb1_clk48_ops
= {
568 .set_parent
= da8xx_usb1_clk48_set_parent
,
569 .get_parent
= da8xx_usb1_clk48_get_parent
,
573 * da8xx_cfgchip_register_usb1_clk48 - Register a new USB 1.1 PHY clock
575 * @regmap: The CFGCHIP regmap
577 static struct da8xx_usb1_clk48
*
578 da8xx_cfgchip_register_usb1_clk48(struct device
*dev
,
579 struct regmap
*regmap
)
581 const char * const parent_names
[] = { "usb0_clk48", "usb_refclkin" };
582 struct da8xx_usb1_clk48
*usb1
;
583 struct clk_init_data init
;
586 usb1
= devm_kzalloc(dev
, sizeof(*usb1
), GFP_KERNEL
);
588 return ERR_PTR(-ENOMEM
);
590 init
.name
= "usb1_clk48";
591 init
.ops
= &da8xx_usb1_clk48_ops
;
592 init
.parent_names
= parent_names
;
593 init
.num_parents
= 2;
595 usb1
->hw
.init
= &init
;
596 usb1
->regmap
= regmap
;
598 ret
= devm_clk_hw_register(dev
, &usb1
->hw
);
605 static int da8xx_cfgchip_register_usb_phy_clk(struct device
*dev
,
606 struct regmap
*regmap
)
608 struct da8xx_usb0_clk48
*usb0
;
609 struct da8xx_usb1_clk48
*usb1
;
610 struct clk_hw
*parent
;
612 usb0
= da8xx_cfgchip_register_usb0_clk48(dev
, regmap
);
614 return PTR_ERR(usb0
);
617 * All existing boards use pll0_auxclk as the parent and new boards
618 * should use device tree, so hard-coding the value (1) here.
620 parent
= clk_hw_get_parent_by_index(&usb0
->hw
, 1);
622 clk_set_parent(usb0
->hw
.clk
, parent
->clk
);
624 dev_warn(dev
, "Failed to find usb0 parent clock\n");
626 usb1
= da8xx_cfgchip_register_usb1_clk48(dev
, regmap
);
628 return PTR_ERR(usb1
);
631 * All existing boards use usb0_clk48 as the parent and new boards
632 * should use device tree, so hard-coding the value (0) here.
634 parent
= clk_hw_get_parent_by_index(&usb1
->hw
, 0);
636 clk_set_parent(usb1
->hw
.clk
, parent
->clk
);
638 dev_warn(dev
, "Failed to find usb1 parent clock\n");
640 clk_hw_register_clkdev(&usb0
->hw
, "usb0_clk48", "da8xx-usb-phy");
641 clk_hw_register_clkdev(&usb1
->hw
, "usb1_clk48", "da8xx-usb-phy");
646 static int of_da8xx_usb_phy_clk_init(struct device
*dev
, struct regmap
*regmap
)
648 struct clk_hw_onecell_data
*clk_data
;
649 struct da8xx_usb0_clk48
*usb0
;
650 struct da8xx_usb1_clk48
*usb1
;
652 clk_data
= devm_kzalloc(dev
, struct_size(clk_data
, hws
, 2),
659 usb0
= da8xx_cfgchip_register_usb0_clk48(dev
, regmap
);
661 if (PTR_ERR(usb0
) == -EPROBE_DEFER
)
662 return -EPROBE_DEFER
;
664 dev_warn(dev
, "Failed to register usb0_clk48 (%ld)\n",
667 clk_data
->hws
[0] = ERR_PTR(-ENOENT
);
669 clk_data
->hws
[0] = &usb0
->hw
;
672 usb1
= da8xx_cfgchip_register_usb1_clk48(dev
, regmap
);
674 if (PTR_ERR(usb1
) == -EPROBE_DEFER
)
675 return -EPROBE_DEFER
;
677 dev_warn(dev
, "Failed to register usb1_clk48 (%ld)\n",
680 clk_data
->hws
[1] = ERR_PTR(-ENOENT
);
682 clk_data
->hws
[1] = &usb1
->hw
;
685 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_onecell_get
, clk_data
);
688 /* --- platform device --- */
690 static const struct of_device_id da8xx_cfgchip_of_match
[] = {
692 .compatible
= "ti,da830-tbclksync",
693 .data
= of_da8xx_tbclksync_init
,
696 .compatible
= "ti,da830-div4p5ena",
697 .data
= of_da8xx_div4p5ena_init
,
700 .compatible
= "ti,da850-async1-clksrc",
701 .data
= of_da850_async1_init
,
704 .compatible
= "ti,da850-async3-clksrc",
705 .data
= of_da850_async3_init
,
708 .compatible
= "ti,da830-usb-phy-clocks",
709 .data
= of_da8xx_usb_phy_clk_init
,
714 static const struct platform_device_id da8xx_cfgchip_id_table
[] = {
716 .name
= "da830-tbclksync",
717 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_tbclk
,
720 .name
= "da830-div4p5ena",
721 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_div4p5
,
724 .name
= "da850-async1-clksrc",
725 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_async1
,
728 .name
= "da850-async3-clksrc",
729 .driver_data
= (kernel_ulong_t
)da850_cfgchip_register_async3
,
732 .name
= "da830-usb-phy-clks",
733 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_usb_phy_clk
,
738 typedef int (*da8xx_cfgchip_init
)(struct device
*dev
, struct regmap
*regmap
);
740 static int da8xx_cfgchip_probe(struct platform_device
*pdev
)
742 struct device
*dev
= &pdev
->dev
;
743 struct da8xx_cfgchip_clk_platform_data
*pdata
= dev
->platform_data
;
744 const struct of_device_id
*of_id
;
745 da8xx_cfgchip_init clk_init
= NULL
;
746 struct regmap
*regmap
= NULL
;
748 of_id
= of_match_device(da8xx_cfgchip_of_match
, dev
);
750 struct device_node
*parent
;
752 clk_init
= of_id
->data
;
753 parent
= of_get_parent(dev
->of_node
);
754 regmap
= syscon_node_to_regmap(parent
);
756 } else if (pdev
->id_entry
&& pdata
) {
757 clk_init
= (void *)pdev
->id_entry
->driver_data
;
758 regmap
= pdata
->cfgchip
;
762 dev_err(dev
, "unable to find driver data\n");
766 if (IS_ERR_OR_NULL(regmap
)) {
767 dev_err(dev
, "no regmap for CFGCHIP syscon\n");
768 return regmap
? PTR_ERR(regmap
) : -ENOENT
;
771 return clk_init(dev
, regmap
);
774 static struct platform_driver da8xx_cfgchip_driver
= {
775 .probe
= da8xx_cfgchip_probe
,
777 .name
= "da8xx-cfgchip-clk",
778 .of_match_table
= da8xx_cfgchip_of_match
,
780 .id_table
= da8xx_cfgchip_id_table
,
783 static int __init
da8xx_cfgchip_driver_init(void)
785 return platform_driver_register(&da8xx_cfgchip_driver
);
788 /* has to be postcore_initcall because PSC devices depend on the async3 clock */
789 postcore_initcall(da8xx_cfgchip_driver_init
);