aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRhyland Klein <rklein@nvidia.com>2015-06-18 17:28:17 -0400
committerThierry Reding <treding@nvidia.com>2015-10-20 07:56:55 -0400
commit88d909bedf4df7285d6e8d8730425df0d163512e (patch)
treeb1769433bfbbdf573933c6596c7679a27effbdd7
parentdb592c4e2b6010069efc983ba3a35f0850844132 (diff)
clk: tegra: Modify tegra_audio_clk_init to accept more plls
tegra_audio_clk_init was written expecting a single PLL to be passed in directly. Change this to accept an array which will allow for supporting multiple plls and specifying specific data about them, like their parent, which may change over time. Reviewed-by: Benson Leung <bleung@chromium.org> Signed-off-by: Rhyland Klein <rklein@nvidia.com> Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r--drivers/clk/tegra/clk-tegra-audio.c25
-rw-r--r--drivers/clk/tegra/clk-tegra114.c8
-rw-r--r--drivers/clk/tegra/clk-tegra124.c8
-rw-r--r--drivers/clk/tegra/clk-tegra30.c8
-rw-r--r--drivers/clk/tegra/clk.h18
5 files changed, 56 insertions, 11 deletions
diff --git a/drivers/clk/tegra/clk-tegra-audio.c b/drivers/clk/tegra/clk-tegra-audio.c
index 11e3ad7ad7a3..e2bfa9b368f6 100644
--- a/drivers/clk/tegra/clk-tegra-audio.c
+++ b/drivers/clk/tegra/clk-tegra-audio.c
@@ -125,18 +125,29 @@ static struct tegra_audio2x_clk_initdata audio2x_clks[] = {
125 125
126void __init tegra_audio_clk_init(void __iomem *clk_base, 126void __init tegra_audio_clk_init(void __iomem *clk_base,
127 void __iomem *pmc_base, struct tegra_clk *tegra_clks, 127 void __iomem *pmc_base, struct tegra_clk *tegra_clks,
128 struct tegra_clk_pll_params *pll_a_params) 128 struct tegra_audio_clk_info *audio_info,
129 unsigned int num_plls)
129{ 130{
130 struct clk *clk; 131 struct clk *clk;
131 struct clk **dt_clk; 132 struct clk **dt_clk;
132 int i; 133 int i;
133 134
134 /* PLLA */ 135 if (!audio_info || num_plls < 1) {
135 dt_clk = tegra_lookup_dt_id(tegra_clk_pll_a, tegra_clks); 136 pr_err("No audio data passed to tegra_audio_clk_init\n");
136 if (dt_clk) { 137 WARN_ON(1);
137 clk = tegra_clk_register_pll("pll_a", "pll_p_out1", clk_base, 138 return;
138 pmc_base, 0, pll_a_params, NULL); 139 }
139 *dt_clk = clk; 140
141 for (i = 0; i < num_plls; i++) {
142 struct tegra_audio_clk_info *info = &audio_info[i];
143
144 dt_clk = tegra_lookup_dt_id(info->clk_id, tegra_clks);
145 if (dt_clk) {
146 clk = tegra_clk_register_pll(info->name, info->parent,
147 clk_base, pmc_base, 0, info->pll_params,
148 NULL);
149 *dt_clk = clk;
150 }
140 } 151 }
141 152
142 /* PLLA_OUT0 */ 153 /* PLLA_OUT0 */
diff --git a/drivers/clk/tegra/clk-tegra114.c b/drivers/clk/tegra/clk-tegra114.c
index db5871519bf5..b7d03e9add97 100644
--- a/drivers/clk/tegra/clk-tegra114.c
+++ b/drivers/clk/tegra/clk-tegra114.c
@@ -933,6 +933,10 @@ static u32 mux_pllm_pllc2_c_c3_pllp_plla_idx[] = {
933 [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6, 933 [0] = 0, [1] = 1, [2] = 2, [3] = 3, [4] = 4, [5] = 6,
934}; 934};
935 935
936static struct tegra_audio_clk_info tegra114_audio_plls[] = {
937 { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" },
938};
939
936static struct clk **clks; 940static struct clk **clks;
937 941
938static unsigned long osc_freq; 942static unsigned long osc_freq;
@@ -1481,7 +1485,9 @@ static void __init tegra114_clock_init(struct device_node *np)
1481 tegra114_fixed_clk_init(clk_base); 1485 tegra114_fixed_clk_init(clk_base);
1482 tegra114_pll_init(clk_base, pmc_base); 1486 tegra114_pll_init(clk_base, pmc_base);
1483 tegra114_periph_clk_init(clk_base, pmc_base); 1487 tegra114_periph_clk_init(clk_base, pmc_base);
1484 tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks, &pll_a_params); 1488 tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks,
1489 tegra114_audio_plls,
1490 ARRAY_SIZE(tegra114_audio_plls));
1485 tegra_pmc_clk_init(pmc_base, tegra114_clks); 1491 tegra_pmc_clk_init(pmc_base, tegra114_clks);
1486 tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks, 1492 tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks,
1487 &pll_x_params); 1493 &pll_x_params);
diff --git a/drivers/clk/tegra/clk-tegra124.c b/drivers/clk/tegra/clk-tegra124.c
index 824d75883d2b..87975f7adddc 100644
--- a/drivers/clk/tegra/clk-tegra124.c
+++ b/drivers/clk/tegra/clk-tegra124.c
@@ -1417,6 +1417,10 @@ static struct tegra_clk_init_table tegra132_init_table[] __initdata = {
1417 {TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0}, 1417 {TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0},
1418}; 1418};
1419 1419
1420static struct tegra_audio_clk_info tegra124_audio_plls[] = {
1421 { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" },
1422};
1423
1420/** 1424/**
1421 * tegra124_clock_apply_init_table - initialize clocks on Tegra124 SoCs 1425 * tegra124_clock_apply_init_table - initialize clocks on Tegra124 SoCs
1422 * 1426 *
@@ -1555,7 +1559,9 @@ static void __init tegra124_132_clock_init_pre(struct device_node *np)
1555 tegra_fixed_clk_init(tegra124_clks); 1559 tegra_fixed_clk_init(tegra124_clks);
1556 tegra124_pll_init(clk_base, pmc_base); 1560 tegra124_pll_init(clk_base, pmc_base);
1557 tegra124_periph_clk_init(clk_base, pmc_base); 1561 tegra124_periph_clk_init(clk_base, pmc_base);
1558 tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks, &pll_a_params); 1562 tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks,
1563 tegra124_audio_plls,
1564 ARRAY_SIZE(tegra124_audio_plls));
1559 tegra_pmc_clk_init(pmc_base, tegra124_clks); 1565 tegra_pmc_clk_init(pmc_base, tegra124_clks);
1560 1566
1561 /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */ 1567 /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */
diff --git a/drivers/clk/tegra/clk-tegra30.c b/drivers/clk/tegra/clk-tegra30.c
index fad561a5896b..b90db615c29e 100644
--- a/drivers/clk/tegra/clk-tegra30.c
+++ b/drivers/clk/tegra/clk-tegra30.c
@@ -1405,6 +1405,10 @@ static const struct of_device_id pmc_match[] __initconst = {
1405 {}, 1405 {},
1406}; 1406};
1407 1407
1408static struct tegra_audio_clk_info tegra30_audio_plls[] = {
1409 { "pll_a", &pll_a_params, tegra_clk_pll_a, "pll_p_out1" },
1410};
1411
1408static void __init tegra30_clock_init(struct device_node *np) 1412static void __init tegra30_clock_init(struct device_node *np)
1409{ 1413{
1410 struct device_node *node; 1414 struct device_node *node;
@@ -1442,7 +1446,9 @@ static void __init tegra30_clock_init(struct device_node *np)
1442 tegra30_pll_init(); 1446 tegra30_pll_init();
1443 tegra30_super_clk_init(); 1447 tegra30_super_clk_init();
1444 tegra30_periph_clk_init(); 1448 tegra30_periph_clk_init();
1445 tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks, &pll_a_params); 1449 tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks,
1450 tegra30_audio_plls,
1451 ARRAY_SIZE(tegra30_audio_plls));
1446 tegra_pmc_clk_init(pmc_base, tegra30_clks); 1452 tegra_pmc_clk_init(pmc_base, tegra30_clks);
1447 1453
1448 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX); 1454 tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX);
diff --git a/drivers/clk/tegra/clk.h b/drivers/clk/tegra/clk.h
index bdc661cb81f0..5d2678914160 100644
--- a/drivers/clk/tegra/clk.h
+++ b/drivers/clk/tegra/clk.h
@@ -270,6 +270,21 @@ struct tegra_clk_pll {
270 270
271#define to_clk_pll(_hw) container_of(_hw, struct tegra_clk_pll, hw) 271#define to_clk_pll(_hw) container_of(_hw, struct tegra_clk_pll, hw)
272 272
273/**
274 * struct tegra_audio_clk_info - Tegra Audio Clk Information
275 *
276 * @name: name for the audio pll
277 * @pll_params: pll_params for audio pll
278 * @clk_id: clk_ids for the audio pll
279 * @parent: name of the parent of the audio pll
280 */
281struct tegra_audio_clk_info {
282 char *name;
283 struct tegra_clk_pll_params *pll_params;
284 int clk_id;
285 char *parent;
286};
287
273extern const struct clk_ops tegra_clk_pll_ops; 288extern const struct clk_ops tegra_clk_pll_ops;
274extern const struct clk_ops tegra_clk_plle_ops; 289extern const struct clk_ops tegra_clk_plle_ops;
275struct clk *tegra_clk_register_pll(const char *name, const char *parent_name, 290struct clk *tegra_clk_register_pll(const char *name, const char *parent_name,
@@ -622,7 +637,8 @@ void tegra_register_devclks(struct tegra_devclk *dev_clks, int num);
622 637
623void tegra_audio_clk_init(void __iomem *clk_base, 638void tegra_audio_clk_init(void __iomem *clk_base,
624 void __iomem *pmc_base, struct tegra_clk *tegra_clks, 639 void __iomem *pmc_base, struct tegra_clk *tegra_clks,
625 struct tegra_clk_pll_params *pll_params); 640 struct tegra_audio_clk_info *audio_info,
641 unsigned int num_plls);
626 642
627void tegra_periph_clk_init(void __iomem *clk_base, void __iomem *pmc_base, 643void tegra_periph_clk_init(void __iomem *clk_base, void __iomem *pmc_base,
628 struct tegra_clk *tegra_clks, 644 struct tegra_clk *tegra_clks,