diff options
author | Stephen Boyd <sboyd@codeaurora.org> | 2016-04-20 14:44:03 -0400 |
---|---|---|
committer | Stephen Boyd <sboyd@codeaurora.org> | 2016-04-20 14:44:03 -0400 |
commit | bb4399b8a5d7d9a8bf9d28b1e78badff1b0e5a5e (patch) | |
tree | e9cf480400d3520a71dee0374f49f39901549f2d | |
parent | 0f05db651dc50c2a6f45794de2567fbf64a4df75 (diff) | |
parent | 2066390ad47b374f3d35075a32325b47d15bf735 (diff) |
Merge tag 'clk-renesas-for-v4.7-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers into clk-next
clk: renesas: R-Car SYSC PM Domain Preparation
- Export the CPG/MSSR and CPG/MSTP attach/detach_dev callbacks, so
they can be called by the R-Car SYSC PM Domain driver.
* tag 'clk-renesas-for-v4.7-tag2' of git://git.kernel.org/pub/scm/linux/kernel/git/geert/renesas-drivers:
clk: renesas: cpg-mssr: Export cpg_mssr_{at,de}tach_dev()
clk: renesas: mstp: Provide dummy attach/detach_dev callbacks
clk: renesas: Provide Kconfig symbols for CPG/MSSR and CPG/MSTP support
-rw-r--r-- | drivers/clk/Kconfig | 1 | ||||
-rw-r--r-- | drivers/clk/renesas/Kconfig | 16 | ||||
-rw-r--r-- | drivers/clk/renesas/Makefile | 26 | ||||
-rw-r--r-- | drivers/clk/renesas/renesas-cpg-mssr.c | 18 | ||||
-rw-r--r-- | include/linux/clk/renesas.h | 12 |
5 files changed, 55 insertions, 18 deletions
diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig index 16f7d33421d8..c45554957499 100644 --- a/drivers/clk/Kconfig +++ b/drivers/clk/Kconfig | |||
@@ -201,6 +201,7 @@ source "drivers/clk/bcm/Kconfig" | |||
201 | source "drivers/clk/hisilicon/Kconfig" | 201 | source "drivers/clk/hisilicon/Kconfig" |
202 | source "drivers/clk/mvebu/Kconfig" | 202 | source "drivers/clk/mvebu/Kconfig" |
203 | source "drivers/clk/qcom/Kconfig" | 203 | source "drivers/clk/qcom/Kconfig" |
204 | source "drivers/clk/renesas/Kconfig" | ||
204 | source "drivers/clk/samsung/Kconfig" | 205 | source "drivers/clk/samsung/Kconfig" |
205 | source "drivers/clk/tegra/Kconfig" | 206 | source "drivers/clk/tegra/Kconfig" |
206 | source "drivers/clk/ti/Kconfig" | 207 | source "drivers/clk/ti/Kconfig" |
diff --git a/drivers/clk/renesas/Kconfig b/drivers/clk/renesas/Kconfig new file mode 100644 index 000000000000..2115ce410cfb --- /dev/null +++ b/drivers/clk/renesas/Kconfig | |||
@@ -0,0 +1,16 @@ | |||
1 | config CLK_RENESAS_CPG_MSSR | ||
2 | bool | ||
3 | default y if ARCH_R8A7795 | ||
4 | |||
5 | config CLK_RENESAS_CPG_MSTP | ||
6 | bool | ||
7 | default y if ARCH_R7S72100 | ||
8 | default y if ARCH_R8A73A4 | ||
9 | default y if ARCH_R8A7740 | ||
10 | default y if ARCH_R8A7778 | ||
11 | default y if ARCH_R8A7779 | ||
12 | default y if ARCH_R8A7790 | ||
13 | default y if ARCH_R8A7791 | ||
14 | default y if ARCH_R8A7793 | ||
15 | default y if ARCH_R8A7794 | ||
16 | default y if ARCH_SH73A0 | ||
diff --git a/drivers/clk/renesas/Makefile b/drivers/clk/renesas/Makefile index 7e2579b30326..ead8bb843524 100644 --- a/drivers/clk/renesas/Makefile +++ b/drivers/clk/renesas/Makefile | |||
@@ -1,13 +1,15 @@ | |||
1 | obj-$(CONFIG_ARCH_EMEV2) += clk-emev2.o | 1 | obj-$(CONFIG_ARCH_EMEV2) += clk-emev2.o |
2 | obj-$(CONFIG_ARCH_R7S72100) += clk-rz.o clk-mstp.o | 2 | obj-$(CONFIG_ARCH_R7S72100) += clk-rz.o |
3 | obj-$(CONFIG_ARCH_R8A73A4) += clk-r8a73a4.o clk-mstp.o clk-div6.o | 3 | obj-$(CONFIG_ARCH_R8A73A4) += clk-r8a73a4.o clk-div6.o |
4 | obj-$(CONFIG_ARCH_R8A7740) += clk-r8a7740.o clk-mstp.o clk-div6.o | 4 | obj-$(CONFIG_ARCH_R8A7740) += clk-r8a7740.o clk-div6.o |
5 | obj-$(CONFIG_ARCH_R8A7778) += clk-r8a7778.o clk-mstp.o | 5 | obj-$(CONFIG_ARCH_R8A7778) += clk-r8a7778.o |
6 | obj-$(CONFIG_ARCH_R8A7779) += clk-r8a7779.o clk-mstp.o | 6 | obj-$(CONFIG_ARCH_R8A7779) += clk-r8a7779.o |
7 | obj-$(CONFIG_ARCH_R8A7790) += clk-rcar-gen2.o clk-mstp.o clk-div6.o | 7 | obj-$(CONFIG_ARCH_R8A7790) += clk-rcar-gen2.o clk-div6.o |
8 | obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o clk-mstp.o clk-div6.o | 8 | obj-$(CONFIG_ARCH_R8A7791) += clk-rcar-gen2.o clk-div6.o |
9 | obj-$(CONFIG_ARCH_R8A7793) += clk-rcar-gen2.o clk-mstp.o clk-div6.o | 9 | obj-$(CONFIG_ARCH_R8A7793) += clk-rcar-gen2.o clk-div6.o |
10 | obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o clk-mstp.o clk-div6.o | 10 | obj-$(CONFIG_ARCH_R8A7794) += clk-rcar-gen2.o clk-div6.o |
11 | obj-$(CONFIG_ARCH_R8A7795) += renesas-cpg-mssr.o \ | 11 | obj-$(CONFIG_ARCH_R8A7795) += r8a7795-cpg-mssr.o |
12 | r8a7795-cpg-mssr.o clk-div6.o | 12 | obj-$(CONFIG_ARCH_SH73A0) += clk-sh73a0.o clk-div6.o |
13 | obj-$(CONFIG_ARCH_SH73A0) += clk-sh73a0.o clk-mstp.o clk-div6.o | 13 | |
14 | obj-$(CONFIG_CLK_RENESAS_CPG_MSSR) += renesas-cpg-mssr.o clk-div6.o | ||
15 | obj-$(CONFIG_CLK_RENESAS_CPG_MSTP) += clk-mstp.o | ||
diff --git a/drivers/clk/renesas/renesas-cpg-mssr.c b/drivers/clk/renesas/renesas-cpg-mssr.c index 703bdb157528..1f2dc3629f0e 100644 --- a/drivers/clk/renesas/renesas-cpg-mssr.c +++ b/drivers/clk/renesas/renesas-cpg-mssr.c | |||
@@ -15,6 +15,7 @@ | |||
15 | 15 | ||
16 | #include <linux/clk.h> | 16 | #include <linux/clk.h> |
17 | #include <linux/clk-provider.h> | 17 | #include <linux/clk-provider.h> |
18 | #include <linux/clk/renesas.h> | ||
18 | #include <linux/device.h> | 19 | #include <linux/device.h> |
19 | #include <linux/init.h> | 20 | #include <linux/init.h> |
20 | #include <linux/mod_devicetable.h> | 21 | #include <linux/mod_devicetable.h> |
@@ -388,6 +389,8 @@ struct cpg_mssr_clk_domain { | |||
388 | unsigned int core_pm_clks[0]; | 389 | unsigned int core_pm_clks[0]; |
389 | }; | 390 | }; |
390 | 391 | ||
392 | static struct cpg_mssr_clk_domain *cpg_mssr_clk_domain; | ||
393 | |||
391 | static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec, | 394 | static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec, |
392 | struct cpg_mssr_clk_domain *pd) | 395 | struct cpg_mssr_clk_domain *pd) |
393 | { | 396 | { |
@@ -411,17 +414,20 @@ static bool cpg_mssr_is_pm_clk(const struct of_phandle_args *clkspec, | |||
411 | } | 414 | } |
412 | } | 415 | } |
413 | 416 | ||
414 | static int cpg_mssr_attach_dev(struct generic_pm_domain *genpd, | 417 | int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev) |
415 | struct device *dev) | ||
416 | { | 418 | { |
417 | struct cpg_mssr_clk_domain *pd = | 419 | struct cpg_mssr_clk_domain *pd = cpg_mssr_clk_domain; |
418 | container_of(genpd, struct cpg_mssr_clk_domain, genpd); | ||
419 | struct device_node *np = dev->of_node; | 420 | struct device_node *np = dev->of_node; |
420 | struct of_phandle_args clkspec; | 421 | struct of_phandle_args clkspec; |
421 | struct clk *clk; | 422 | struct clk *clk; |
422 | int i = 0; | 423 | int i = 0; |
423 | int error; | 424 | int error; |
424 | 425 | ||
426 | if (!pd) { | ||
427 | dev_dbg(dev, "CPG/MSSR clock domain not yet available\n"); | ||
428 | return -EPROBE_DEFER; | ||
429 | } | ||
430 | |||
425 | while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, | 431 | while (!of_parse_phandle_with_args(np, "clocks", "#clock-cells", i, |
426 | &clkspec)) { | 432 | &clkspec)) { |
427 | if (cpg_mssr_is_pm_clk(&clkspec, pd)) | 433 | if (cpg_mssr_is_pm_clk(&clkspec, pd)) |
@@ -461,8 +467,7 @@ fail_put: | |||
461 | return error; | 467 | return error; |
462 | } | 468 | } |
463 | 469 | ||
464 | static void cpg_mssr_detach_dev(struct generic_pm_domain *genpd, | 470 | void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev) |
465 | struct device *dev) | ||
466 | { | 471 | { |
467 | if (!list_empty(&dev->power.subsys_data->clock_list)) | 472 | if (!list_empty(&dev->power.subsys_data->clock_list)) |
468 | pm_clk_destroy(dev); | 473 | pm_clk_destroy(dev); |
@@ -491,6 +496,7 @@ static int __init cpg_mssr_add_clk_domain(struct device *dev, | |||
491 | pm_genpd_init(genpd, &simple_qos_governor, false); | 496 | pm_genpd_init(genpd, &simple_qos_governor, false); |
492 | genpd->attach_dev = cpg_mssr_attach_dev; | 497 | genpd->attach_dev = cpg_mssr_attach_dev; |
493 | genpd->detach_dev = cpg_mssr_detach_dev; | 498 | genpd->detach_dev = cpg_mssr_detach_dev; |
499 | cpg_mssr_clk_domain = pd; | ||
494 | 500 | ||
495 | of_genpd_add_provider_simple(np, genpd); | 501 | of_genpd_add_provider_simple(np, genpd); |
496 | return 0; | 502 | return 0; |
diff --git a/include/linux/clk/renesas.h b/include/linux/clk/renesas.h index 095b1681daf4..ba6fa4148515 100644 --- a/include/linux/clk/renesas.h +++ b/include/linux/clk/renesas.h | |||
@@ -25,7 +25,19 @@ void r8a7779_clocks_init(u32 mode); | |||
25 | void rcar_gen2_clocks_init(u32 mode); | 25 | void rcar_gen2_clocks_init(u32 mode); |
26 | 26 | ||
27 | void cpg_mstp_add_clk_domain(struct device_node *np); | 27 | void cpg_mstp_add_clk_domain(struct device_node *np); |
28 | #ifdef CONFIG_CLK_RENESAS_CPG_MSTP | ||
28 | int cpg_mstp_attach_dev(struct generic_pm_domain *unused, struct device *dev); | 29 | int cpg_mstp_attach_dev(struct generic_pm_domain *unused, struct device *dev); |
29 | void cpg_mstp_detach_dev(struct generic_pm_domain *unused, struct device *dev); | 30 | void cpg_mstp_detach_dev(struct generic_pm_domain *unused, struct device *dev); |
31 | #else | ||
32 | #define cpg_mstp_attach_dev NULL | ||
33 | #define cpg_mstp_detach_dev NULL | ||
34 | #endif | ||
30 | 35 | ||
36 | #ifdef CONFIG_CLK_RENESAS_CPG_MSSR | ||
37 | int cpg_mssr_attach_dev(struct generic_pm_domain *unused, struct device *dev); | ||
38 | void cpg_mssr_detach_dev(struct generic_pm_domain *unused, struct device *dev); | ||
39 | #else | ||
40 | #define cpg_mssr_attach_dev NULL | ||
41 | #define cpg_mssr_detach_dev NULL | ||
42 | #endif | ||
31 | #endif | 43 | #endif |