clk: tegra: Fix maximum audio sync clock for Tegra124/210
authorJon Hunter <jonathanh@nvidia.com>
Mon, 3 Dec 2018 10:28:40 +0000 (10:28 +0000)
committerStephen Boyd <sboyd@kernel.org>
Fri, 14 Dec 2018 21:32:55 +0000 (13:32 -0800)
The maximum frequency supported for I2S on Tegra124 and Tegra210 is
24.576MHz (as stated in the Tegra TK1 data sheet for Tegra124 and the
Jetson TX1 module data sheet for Tegra210). However, the maximum I2S
frequency is limited to 24MHz because that is the maximum frequency of
the audio sync clock. Increase the maximum audio sync clock frequency
to 24.576MHz for Tegra124 and Tegra210 in order to support 24.576MHz
for I2S.

Update the tegra_clk_register_sync_source() function so that it does
not set the initial rate for the sync clocks and use the clock init
tables to set the initial rate instead.

Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Acked-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/tegra/clk-audio-sync.c
drivers/clk/tegra/clk-tegra-audio.c
drivers/clk/tegra/clk-tegra114.c
drivers/clk/tegra/clk-tegra124.c
drivers/clk/tegra/clk-tegra210.c
drivers/clk/tegra/clk-tegra30.c
drivers/clk/tegra/clk.h

index 92d04ce2dee6b7e4e5131a1f9052bbee7d5de134..53cdc0ec40f33a752aef895f8157a4f65258ed1d 100644 (file)
@@ -55,7 +55,7 @@ const struct clk_ops tegra_clk_sync_source_ops = {
 };
 
 struct clk *tegra_clk_register_sync_source(const char *name,
-               unsigned long rate, unsigned long max_rate)
+                                          unsigned long max_rate)
 {
        struct tegra_clk_sync_source *sync;
        struct clk_init_data init;
@@ -67,7 +67,6 @@ struct clk *tegra_clk_register_sync_source(const char *name,
                return ERR_PTR(-ENOMEM);
        }
 
-       sync->rate = rate;
        sync->max_rate = max_rate;
 
        init.ops = &tegra_clk_sync_source_ops;
index b37cae7af26da031c01a6fb584802bb4640ba099..02dd6487d855d001083579b9c7841383bd8e380b 100644 (file)
@@ -49,8 +49,6 @@ struct tegra_sync_source_initdata {
 #define SYNC(_name) \
        {\
                .name           = #_name,\
-               .rate           = 24000000,\
-               .max_rate       = 24000000,\
                .clk_id         = tegra_clk_ ## _name,\
        }
 
@@ -176,7 +174,7 @@ static void __init tegra_audio_sync_clk_init(void __iomem *clk_base,
 void __init tegra_audio_clk_init(void __iomem *clk_base,
                        void __iomem *pmc_base, struct tegra_clk *tegra_clks,
                        struct tegra_audio_clk_info *audio_info,
-                       unsigned int num_plls)
+                       unsigned int num_plls, unsigned long sync_max_rate)
 {
        struct clk *clk;
        struct clk **dt_clk;
@@ -221,8 +219,7 @@ void __init tegra_audio_clk_init(void __iomem *clk_base,
                if (!dt_clk)
                        continue;
 
-               clk = tegra_clk_register_sync_source(data->name,
-                                       data->rate, data->max_rate);
+               clk = tegra_clk_register_sync_source(data->name, sync_max_rate);
                *dt_clk = clk;
        }
 
index 1824f014202b0351f2587a7dcc3b9e666a69b15a..625d11091330896149c051910b3f5b791117d034 100644 (file)
@@ -1190,6 +1190,13 @@ static struct tegra_clk_init_table init_table[] __initdata = {
        { TEGRA114_CLK_XUSB_FALCON_SRC, TEGRA114_CLK_PLL_P, 204000000, 0 },
        { TEGRA114_CLK_XUSB_HOST_SRC, TEGRA114_CLK_PLL_P, 102000000, 0 },
        { TEGRA114_CLK_VDE, TEGRA114_CLK_CLK_MAX, 600000000, 0 },
+       { TEGRA114_CLK_SPDIF_IN_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_I2S0_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_I2S1_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_I2S2_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_I2S3_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_I2S4_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA114_CLK_VIMCLK_SYNC, TEGRA114_CLK_CLK_MAX, 24000000, 0 },
        /* must be the last entry */
        { TEGRA114_CLK_CLK_MAX, TEGRA114_CLK_CLK_MAX, 0, 0 },
 };
@@ -1362,7 +1369,7 @@ static void __init tegra114_clock_init(struct device_node *np)
        tegra114_periph_clk_init(clk_base, pmc_base);
        tegra_audio_clk_init(clk_base, pmc_base, tegra114_clks,
                             tegra114_audio_plls,
-                            ARRAY_SIZE(tegra114_audio_plls));
+                            ARRAY_SIZE(tegra114_audio_plls), 24000000);
        tegra_pmc_clk_init(pmc_base, tegra114_clks);
        tegra_super_clk_gen4_init(clk_base, pmc_base, tegra114_clks,
                                        &pll_x_params);
index b6cf28ca2ed291174e7a24576f89afe90638f2d6..df0018f7bf7ed8668d04a6ab5ef47994b4ef3ac3 100644 (file)
@@ -1291,6 +1291,13 @@ static struct tegra_clk_init_table common_init_table[] __initdata = {
        { TEGRA124_CLK_CSITE, TEGRA124_CLK_CLK_MAX, 0, 1 },
        { TEGRA124_CLK_TSENSOR, TEGRA124_CLK_CLK_M, 400000, 0 },
        { TEGRA124_CLK_VIC03, TEGRA124_CLK_PLL_C3, 0, 0 },
+       { TEGRA124_CLK_SPDIF_IN_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_I2S0_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_I2S1_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_I2S2_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_I2S3_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_I2S4_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA124_CLK_VIMCLK_SYNC, TEGRA124_CLK_CLK_MAX, 24576000, 0 },
        /* must be the last entry */
        { TEGRA124_CLK_CLK_MAX, TEGRA124_CLK_CLK_MAX, 0, 0 },
 };
@@ -1455,7 +1462,7 @@ static void __init tegra124_132_clock_init_pre(struct device_node *np)
        tegra124_periph_clk_init(clk_base, pmc_base);
        tegra_audio_clk_init(clk_base, pmc_base, tegra124_clks,
                             tegra124_audio_plls,
-                            ARRAY_SIZE(tegra124_audio_plls));
+                            ARRAY_SIZE(tegra124_audio_plls), 24576000);
        tegra_pmc_clk_init(pmc_base, tegra124_clks);
 
        /* For Tegra124 & Tegra132, PLLD is the only source for DSIA & DSIB */
index 88f1943bd2b507aec617c98fafa50c5746406730..7545af763d7a927872862e99a55d671e45b17740 100644 (file)
@@ -3370,6 +3370,13 @@ static struct tegra_clk_init_table init_table[] __initdata = {
        { TEGRA210_CLK_CCLK_G, TEGRA210_CLK_CLK_MAX, 0, 1 },
        { TEGRA210_CLK_PLL_U_OUT1, TEGRA210_CLK_CLK_MAX, 48000000, 1 },
        { TEGRA210_CLK_PLL_U_OUT2, TEGRA210_CLK_CLK_MAX, 60000000, 1 },
+       { TEGRA210_CLK_SPDIF_IN_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_I2S0_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_I2S1_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_I2S2_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_I2S3_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_I2S4_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
+       { TEGRA210_CLK_VIMCLK_SYNC, TEGRA210_CLK_CLK_MAX, 24576000, 0 },
        /* This MUST be the last entry. */
        { TEGRA210_CLK_CLK_MAX, TEGRA210_CLK_CLK_MAX, 0, 0 },
 };
@@ -3563,7 +3570,7 @@ static void __init tegra210_clock_init(struct device_node *np)
        tegra210_periph_clk_init(clk_base, pmc_base);
        tegra_audio_clk_init(clk_base, pmc_base, tegra210_clks,
                             tegra210_audio_plls,
-                            ARRAY_SIZE(tegra210_audio_plls));
+                            ARRAY_SIZE(tegra210_audio_plls), 24576000);
        tegra_pmc_clk_init(pmc_base, tegra210_clks);
 
        /* For Tegra210, PLLD is the only source for DSIA & DSIB */
index acfe661b2ae7249db0c130e0897e1b6fea164d67..e0aaecd98fbff1635c2ee78f877ad84df734eed5 100644 (file)
@@ -1267,6 +1267,13 @@ static struct tegra_clk_init_table init_table[] __initdata = {
        { TEGRA30_CLK_GR3D2, TEGRA30_CLK_PLL_C, 300000000, 0 },
        { TEGRA30_CLK_PLL_U, TEGRA30_CLK_CLK_MAX, 480000000, 0 },
        { TEGRA30_CLK_VDE, TEGRA30_CLK_CLK_MAX, 600000000, 0 },
+       { TEGRA30_CLK_SPDIF_IN_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_I2S0_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_I2S1_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_I2S2_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_I2S3_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_I2S4_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
+       { TEGRA30_CLK_VIMCLK_SYNC, TEGRA30_CLK_CLK_MAX, 24000000, 0 },
        /* must be the last entry */
        { TEGRA30_CLK_CLK_MAX, TEGRA30_CLK_CLK_MAX, 0, 0 },
 };
@@ -1344,7 +1351,7 @@ static void __init tegra30_clock_init(struct device_node *np)
        tegra30_periph_clk_init();
        tegra_audio_clk_init(clk_base, pmc_base, tegra30_clks,
                             tegra30_audio_plls,
-                            ARRAY_SIZE(tegra30_audio_plls));
+                            ARRAY_SIZE(tegra30_audio_plls), 24000000);
        tegra_pmc_clk_init(pmc_base, tegra30_clks);
 
        tegra_init_dup_clks(tegra_clk_duplicates, clks, TEGRA30_CLK_CLK_MAX);
index d2c3a010f8e9b358906cc99f4eaf80b54fb1c18a..09bccbb9640c48c802dff657d166645641ebada0 100644 (file)
@@ -41,7 +41,7 @@ extern const struct clk_ops tegra_clk_sync_source_ops;
 extern int *periph_clk_enb_refcnt;
 
 struct clk *tegra_clk_register_sync_source(const char *name,
-               unsigned long fixed_rate, unsigned long max_rate);
+                                          unsigned long max_rate);
 
 /**
  * struct tegra_clk_frac_div - fractional divider clock
@@ -796,7 +796,7 @@ void tegra_register_devclks(struct tegra_devclk *dev_clks, int num);
 void tegra_audio_clk_init(void __iomem *clk_base,
                        void __iomem *pmc_base, struct tegra_clk *tegra_clks,
                        struct tegra_audio_clk_info *audio_info,
-                       unsigned int num_plls);
+                       unsigned int num_plls, unsigned long sync_max_rate);
 
 void tegra_periph_clk_init(void __iomem *clk_base, void __iomem *pmc_base,
                        struct tegra_clk *tegra_clks,