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>
15 #include <linux/platform_data/clk-da8xx-cfgchip.h>
16 #include <linux/platform_device.h>
17 #include <linux/property.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 .determine_rate
= clk_hw_determine_rate_no_reparent
,
233 .set_parent
= da8xx_cfgchip_mux_clk_set_parent
,
234 .get_parent
= da8xx_cfgchip_mux_clk_get_parent
,
237 static struct da8xx_cfgchip_mux_clk
* __init
238 da8xx_cfgchip_mux_clk_register(struct device
*dev
,
239 const struct da8xx_cfgchip_mux_clk_info
*info
,
240 struct regmap
*regmap
)
242 const char * const parent_names
[] = { info
->parent0
, info
->parent1
};
243 struct da8xx_cfgchip_mux_clk
*mux
;
244 struct clk_init_data init
;
247 mux
= devm_kzalloc(dev
, sizeof(*mux
), GFP_KERNEL
);
249 return ERR_PTR(-ENOMEM
);
251 init
.name
= info
->name
;
252 init
.ops
= &da8xx_cfgchip_mux_clk_ops
;
253 init
.parent_names
= parent_names
;
254 init
.num_parents
= 2;
257 mux
->hw
.init
= &init
;
258 mux
->regmap
= regmap
;
259 mux
->reg
= info
->cfgchip
;
260 mux
->mask
= info
->bit
;
262 ret
= devm_clk_hw_register(dev
, &mux
->hw
);
269 static const struct da8xx_cfgchip_mux_clk_info da850_async1_info __initconst
= {
271 .parent0
= "pll0_sysclk3",
273 .cfgchip
= CFGCHIP(3),
274 .bit
= CFGCHIP3_EMA_CLKSRC
,
277 static int __init
da8xx_cfgchip_register_async1(struct device
*dev
,
278 struct regmap
*regmap
)
280 struct da8xx_cfgchip_mux_clk
*mux
;
282 mux
= da8xx_cfgchip_mux_clk_register(dev
, &da850_async1_info
, regmap
);
286 clk_hw_register_clkdev(&mux
->hw
, "async1", "da850-psc0");
291 static const struct da8xx_cfgchip_mux_clk_info da850_async3_info __initconst
= {
293 .parent0
= "pll0_sysclk2",
294 .parent1
= "pll1_sysclk2",
295 .cfgchip
= CFGCHIP(3),
296 .bit
= CFGCHIP3_ASYNC3_CLKSRC
,
299 static int __init
da850_cfgchip_register_async3(struct device
*dev
,
300 struct regmap
*regmap
)
302 struct da8xx_cfgchip_mux_clk
*mux
;
303 struct clk_hw
*parent
;
305 mux
= da8xx_cfgchip_mux_clk_register(dev
, &da850_async3_info
, regmap
);
309 clk_hw_register_clkdev(&mux
->hw
, "async3", "da850-psc1");
311 /* pll1_sysclk2 is not affected by CPU scaling, so use it for async3 */
312 parent
= clk_hw_get_parent_by_index(&mux
->hw
, 1);
314 clk_set_parent(mux
->hw
.clk
, parent
->clk
);
316 dev_warn(dev
, "Failed to find async3 parent clock\n");
322 of_da8xx_cfgchip_init_mux_clock(struct device
*dev
,
323 const struct da8xx_cfgchip_mux_clk_info
*info
,
324 struct regmap
*regmap
)
326 struct da8xx_cfgchip_mux_clk
*mux
;
328 mux
= da8xx_cfgchip_mux_clk_register(dev
, info
, regmap
);
332 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_simple_get
, &mux
->hw
);
335 static int __init
of_da850_async1_init(struct device
*dev
, struct regmap
*regmap
)
337 return of_da8xx_cfgchip_init_mux_clock(dev
, &da850_async1_info
, regmap
);
340 static int __init
of_da850_async3_init(struct device
*dev
, struct regmap
*regmap
)
342 return of_da8xx_cfgchip_init_mux_clock(dev
, &da850_async3_info
, regmap
);
345 /* --- USB 2.0 PHY clock --- */
347 struct da8xx_usb0_clk48
{
350 struct regmap
*regmap
;
353 #define to_da8xx_usb0_clk48(_hw) \
354 container_of((_hw), struct da8xx_usb0_clk48, hw)
356 static int da8xx_usb0_clk48_prepare(struct clk_hw
*hw
)
358 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
360 /* The USB 2.0 PSC clock is only needed temporarily during the USB 2.0
361 * PHY clock enable, but since clk_prepare() can't be called in an
362 * atomic context (i.e. in clk_enable()), we have to prepare it here.
364 return clk_prepare(usb0
->fck
);
367 static void da8xx_usb0_clk48_unprepare(struct clk_hw
*hw
)
369 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
371 clk_unprepare(usb0
->fck
);
374 static int da8xx_usb0_clk48_enable(struct clk_hw
*hw
)
376 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
377 unsigned int mask
, val
;
380 /* Locking the USB 2.O PLL requires that the USB 2.O PSC is enabled
381 * temporaily. It can be turned back off once the PLL is locked.
383 clk_enable(usb0
->fck
);
385 /* Turn on the USB 2.0 PHY, but just the PLL, and not OTG. The USB 1.1
386 * PHY may use the USB 2.0 PLL clock without USB 2.0 OTG being used.
388 mask
= CFGCHIP2_RESET
| CFGCHIP2_PHYPWRDN
| CFGCHIP2_PHY_PLLON
;
389 val
= CFGCHIP2_PHY_PLLON
;
391 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), mask
, val
);
392 ret
= regmap_read_poll_timeout(usb0
->regmap
, CFGCHIP(2), val
,
393 val
& CFGCHIP2_PHYCLKGD
, 0, 500000);
395 clk_disable(usb0
->fck
);
400 static void da8xx_usb0_clk48_disable(struct clk_hw
*hw
)
402 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
405 val
= CFGCHIP2_PHYPWRDN
;
406 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), val
, val
);
409 static int da8xx_usb0_clk48_is_enabled(struct clk_hw
*hw
)
411 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
414 regmap_read(usb0
->regmap
, CFGCHIP(2), &val
);
416 return !!(val
& CFGCHIP2_PHYCLKGD
);
419 static unsigned long da8xx_usb0_clk48_recalc_rate(struct clk_hw
*hw
,
420 unsigned long parent_rate
)
422 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
423 unsigned int mask
, val
;
425 /* The parent clock rate must be one of the following */
426 mask
= CFGCHIP2_REFFREQ_MASK
;
427 switch (parent_rate
) {
429 val
= CFGCHIP2_REFFREQ_12MHZ
;
432 val
= CFGCHIP2_REFFREQ_13MHZ
;
435 val
= CFGCHIP2_REFFREQ_19_2MHZ
;
438 val
= CFGCHIP2_REFFREQ_20MHZ
;
441 val
= CFGCHIP2_REFFREQ_24MHZ
;
444 val
= CFGCHIP2_REFFREQ_26MHZ
;
447 val
= CFGCHIP2_REFFREQ_38_4MHZ
;
450 val
= CFGCHIP2_REFFREQ_40MHZ
;
453 val
= CFGCHIP2_REFFREQ_48MHZ
;
459 regmap_write_bits(usb0
->regmap
, CFGCHIP(2), mask
, val
);
461 /* USB 2.0 PLL always supplies 48MHz */
465 static int da8xx_usb0_clk48_determine_rate(struct clk_hw
*hw
,
466 struct clk_rate_request
*req
)
468 req
->rate
= 48000000;
473 static int da8xx_usb0_clk48_set_parent(struct clk_hw
*hw
, u8 index
)
475 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
477 return regmap_write_bits(usb0
->regmap
, CFGCHIP(2),
478 CFGCHIP2_USB2PHYCLKMUX
,
479 index
? CFGCHIP2_USB2PHYCLKMUX
: 0);
482 static u8
da8xx_usb0_clk48_get_parent(struct clk_hw
*hw
)
484 struct da8xx_usb0_clk48
*usb0
= to_da8xx_usb0_clk48(hw
);
487 regmap_read(usb0
->regmap
, CFGCHIP(2), &val
);
489 return (val
& CFGCHIP2_USB2PHYCLKMUX
) ? 1 : 0;
492 static const struct clk_ops da8xx_usb0_clk48_ops
= {
493 .prepare
= da8xx_usb0_clk48_prepare
,
494 .unprepare
= da8xx_usb0_clk48_unprepare
,
495 .enable
= da8xx_usb0_clk48_enable
,
496 .disable
= da8xx_usb0_clk48_disable
,
497 .is_enabled
= da8xx_usb0_clk48_is_enabled
,
498 .recalc_rate
= da8xx_usb0_clk48_recalc_rate
,
499 .determine_rate
= da8xx_usb0_clk48_determine_rate
,
500 .set_parent
= da8xx_usb0_clk48_set_parent
,
501 .get_parent
= da8xx_usb0_clk48_get_parent
,
504 static struct da8xx_usb0_clk48
*
505 da8xx_cfgchip_register_usb0_clk48(struct device
*dev
,
506 struct regmap
*regmap
)
508 const char * const parent_names
[] = { "usb_refclkin", "pll0_auxclk" };
510 struct da8xx_usb0_clk48
*usb0
;
511 struct clk_init_data init
= {};
514 fck_clk
= devm_clk_get(dev
, "fck");
515 if (IS_ERR(fck_clk
)) {
516 return dev_err_cast_probe(dev
, fck_clk
, "Missing fck clock\n");
519 usb0
= devm_kzalloc(dev
, sizeof(*usb0
), GFP_KERNEL
);
521 return ERR_PTR(-ENOMEM
);
523 init
.name
= "usb0_clk48";
524 init
.ops
= &da8xx_usb0_clk48_ops
;
525 init
.parent_names
= parent_names
;
526 init
.num_parents
= 2;
528 usb0
->hw
.init
= &init
;
530 usb0
->regmap
= regmap
;
532 ret
= devm_clk_hw_register(dev
, &usb0
->hw
);
539 /* --- USB 1.1 PHY clock --- */
541 struct da8xx_usb1_clk48
{
543 struct regmap
*regmap
;
546 #define to_da8xx_usb1_clk48(_hw) \
547 container_of((_hw), struct da8xx_usb1_clk48, hw)
549 static int da8xx_usb1_clk48_set_parent(struct clk_hw
*hw
, u8 index
)
551 struct da8xx_usb1_clk48
*usb1
= to_da8xx_usb1_clk48(hw
);
553 return regmap_write_bits(usb1
->regmap
, CFGCHIP(2),
554 CFGCHIP2_USB1PHYCLKMUX
,
555 index
? CFGCHIP2_USB1PHYCLKMUX
: 0);
558 static u8
da8xx_usb1_clk48_get_parent(struct clk_hw
*hw
)
560 struct da8xx_usb1_clk48
*usb1
= to_da8xx_usb1_clk48(hw
);
563 regmap_read(usb1
->regmap
, CFGCHIP(2), &val
);
565 return (val
& CFGCHIP2_USB1PHYCLKMUX
) ? 1 : 0;
568 static const struct clk_ops da8xx_usb1_clk48_ops
= {
569 .determine_rate
= clk_hw_determine_rate_no_reparent
,
570 .set_parent
= da8xx_usb1_clk48_set_parent
,
571 .get_parent
= da8xx_usb1_clk48_get_parent
,
575 * da8xx_cfgchip_register_usb1_clk48 - Register a new USB 1.1 PHY clock
577 * @regmap: The CFGCHIP regmap
579 static struct da8xx_usb1_clk48
*
580 da8xx_cfgchip_register_usb1_clk48(struct device
*dev
,
581 struct regmap
*regmap
)
583 const char * const parent_names
[] = { "usb0_clk48", "usb_refclkin" };
584 struct da8xx_usb1_clk48
*usb1
;
585 struct clk_init_data init
= {};
588 usb1
= devm_kzalloc(dev
, sizeof(*usb1
), GFP_KERNEL
);
590 return ERR_PTR(-ENOMEM
);
592 init
.name
= "usb1_clk48";
593 init
.ops
= &da8xx_usb1_clk48_ops
;
594 init
.parent_names
= parent_names
;
595 init
.num_parents
= 2;
597 usb1
->hw
.init
= &init
;
598 usb1
->regmap
= regmap
;
600 ret
= devm_clk_hw_register(dev
, &usb1
->hw
);
607 static int da8xx_cfgchip_register_usb_phy_clk(struct device
*dev
,
608 struct regmap
*regmap
)
610 struct da8xx_usb0_clk48
*usb0
;
611 struct da8xx_usb1_clk48
*usb1
;
612 struct clk_hw
*parent
;
614 usb0
= da8xx_cfgchip_register_usb0_clk48(dev
, regmap
);
616 return PTR_ERR(usb0
);
619 * All existing boards use pll0_auxclk as the parent and new boards
620 * should use device tree, so hard-coding the value (1) here.
622 parent
= clk_hw_get_parent_by_index(&usb0
->hw
, 1);
624 clk_set_parent(usb0
->hw
.clk
, parent
->clk
);
626 dev_warn(dev
, "Failed to find usb0 parent clock\n");
628 usb1
= da8xx_cfgchip_register_usb1_clk48(dev
, regmap
);
630 return PTR_ERR(usb1
);
633 * All existing boards use usb0_clk48 as the parent and new boards
634 * should use device tree, so hard-coding the value (0) here.
636 parent
= clk_hw_get_parent_by_index(&usb1
->hw
, 0);
638 clk_set_parent(usb1
->hw
.clk
, parent
->clk
);
640 dev_warn(dev
, "Failed to find usb1 parent clock\n");
642 clk_hw_register_clkdev(&usb0
->hw
, "usb0_clk48", "da8xx-usb-phy");
643 clk_hw_register_clkdev(&usb1
->hw
, "usb1_clk48", "da8xx-usb-phy");
648 static int of_da8xx_usb_phy_clk_init(struct device
*dev
, struct regmap
*regmap
)
650 struct clk_hw_onecell_data
*clk_data
;
651 struct da8xx_usb0_clk48
*usb0
;
652 struct da8xx_usb1_clk48
*usb1
;
654 clk_data
= devm_kzalloc(dev
, struct_size(clk_data
, hws
, 2),
661 usb0
= da8xx_cfgchip_register_usb0_clk48(dev
, regmap
);
663 if (PTR_ERR(usb0
) == -EPROBE_DEFER
)
664 return -EPROBE_DEFER
;
666 dev_warn(dev
, "Failed to register usb0_clk48 (%ld)\n",
669 clk_data
->hws
[0] = ERR_PTR(-ENOENT
);
671 clk_data
->hws
[0] = &usb0
->hw
;
674 usb1
= da8xx_cfgchip_register_usb1_clk48(dev
, regmap
);
676 if (PTR_ERR(usb1
) == -EPROBE_DEFER
)
677 return -EPROBE_DEFER
;
679 dev_warn(dev
, "Failed to register usb1_clk48 (%ld)\n",
682 clk_data
->hws
[1] = ERR_PTR(-ENOENT
);
684 clk_data
->hws
[1] = &usb1
->hw
;
687 return devm_of_clk_add_hw_provider(dev
, of_clk_hw_onecell_get
, clk_data
);
690 /* --- platform device --- */
692 static const struct of_device_id da8xx_cfgchip_of_match
[] = {
694 .compatible
= "ti,da830-tbclksync",
695 .data
= of_da8xx_tbclksync_init
,
698 .compatible
= "ti,da830-div4p5ena",
699 .data
= of_da8xx_div4p5ena_init
,
702 .compatible
= "ti,da850-async1-clksrc",
703 .data
= of_da850_async1_init
,
706 .compatible
= "ti,da850-async3-clksrc",
707 .data
= of_da850_async3_init
,
710 .compatible
= "ti,da830-usb-phy-clocks",
711 .data
= of_da8xx_usb_phy_clk_init
,
716 static const struct platform_device_id da8xx_cfgchip_id_table
[] = {
718 .name
= "da830-tbclksync",
719 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_tbclk
,
722 .name
= "da830-div4p5ena",
723 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_div4p5
,
726 .name
= "da850-async1-clksrc",
727 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_async1
,
730 .name
= "da850-async3-clksrc",
731 .driver_data
= (kernel_ulong_t
)da850_cfgchip_register_async3
,
734 .name
= "da830-usb-phy-clks",
735 .driver_data
= (kernel_ulong_t
)da8xx_cfgchip_register_usb_phy_clk
,
740 typedef int (*da8xx_cfgchip_init
)(struct device
*dev
, struct regmap
*regmap
);
742 static int da8xx_cfgchip_probe(struct platform_device
*pdev
)
744 struct device
*dev
= &pdev
->dev
;
745 struct da8xx_cfgchip_clk_platform_data
*pdata
= dev
->platform_data
;
746 da8xx_cfgchip_init clk_init
= NULL
;
747 struct regmap
*regmap
= NULL
;
749 clk_init
= device_get_match_data(dev
);
751 struct device_node
*parent
__free(device_node
) = of_get_parent(dev
->of_node
);
753 regmap
= syscon_node_to_regmap(parent
);
754 } else if (pdev
->id_entry
&& pdata
) {
755 clk_init
= (void *)pdev
->id_entry
->driver_data
;
756 regmap
= pdata
->cfgchip
;
760 dev_err(dev
, "unable to find driver data\n");
764 if (IS_ERR_OR_NULL(regmap
)) {
765 dev_err(dev
, "no regmap for CFGCHIP syscon\n");
766 return regmap
? PTR_ERR(regmap
) : -ENOENT
;
769 return clk_init(dev
, regmap
);
772 static struct platform_driver da8xx_cfgchip_driver
= {
773 .probe
= da8xx_cfgchip_probe
,
775 .name
= "da8xx-cfgchip-clk",
776 .of_match_table
= da8xx_cfgchip_of_match
,
778 .id_table
= da8xx_cfgchip_id_table
,
781 static int __init
da8xx_cfgchip_driver_init(void)
783 return platform_driver_register(&da8xx_cfgchip_driver
);
786 /* has to be postcore_initcall because PSC devices depend on the async3 clock */
787 postcore_initcall(da8xx_cfgchip_driver_init
);