clk: tegra: Changes for v4.15-rc1
This contains cleanups and minor fixes for the Tegra clock driver. -----BEGIN PGP SIGNATURE----- iQJHBAABCAAxFiEEiOrDCAFJzPfAjcif3SOs138+s6EFAloBzq8THHRyZWRpbmdA bnZpZGlhLmNvbQAKCRDdI6zXfz6zobeJD/9QhqSqE1EA5jLZDE/9yqNWL7BJHgOP +csMY4y6PaEX5SkxGuLrHmMOJPNHTfFeqnL8djAkMfsmAnUOYqxKvweEFqxmgT2V 7lPOv5ScdvAejPKje1TMou29P2JYaScoU2Pk3Ve6mQIye/m1IoTJxDMhDWJYCn1c 8fetIu2J25vrGHQcl9xChxce8au0KenEkQQSot0czrgymtrpZcBAJLFPn7EqVh5i HVkvB1RZG8GKbRNNhmm9P1ryWE0r5Yi+MOCki1izr153uDLsNM5oV20UY3FohoY3 97CsgZCt3PisCRuNd+4M4uYUQomQfalfz7MR5z+4wws+9tOi3uVujNUmRzU03pBY 4fscXy6iepDGLDngUxqZkjAhy1mvV8g0iGEvNS+7ELzyC7hsAAkNHN3j2xg+uklE aVl9/SSdKMDFjZk0n2YHmnE5bYAhlweluNUsEnJ2KnNpB9V7xWuDhF6abq3NPVbS XxMLGbwy/jT4t4IziPb2CicLsRbM1qySjlDd5AxyhM4t8bq3JVgVU6M+JwcrOZnQ ydkTvoFS489kXPDl2E3NyUJOSVPfp6z05mONGsNNJIMqh4pE7Q4uaMoBXEntMxbl UHhOcJSx8SAtRe2gnEnIc7+U+ngWAFzRD6mU0qEab2bEg1VfpCP6GD6MLa2PrUBU 8Ln17zfr0lD2YQ== =wB8S -----END PGP SIGNATURE----- Merge tag 'tegra-for-4.15-clk-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux into clk-next Pull tegra clk drivers updates from Thierry Reding: This contains cleanups and minor fixes for the Tegra clock driver. * tag 'tegra-for-4.15-clk-2' of git://git.kernel.org/pub/scm/linux/kernel/git/tegra/linux: clk: tegra: Use readl_relaxed_poll_timeout_atomic() in tegra210_clock_init() clk: tegra: dfll: Fix drvdata overwriting issue clk: tegra: Fix cclk_lp divisor register clk: tegra: Bump SCLK clock rate to 216 MHz clk: tegra: Use common definition of APBDMA clock gate clk: tegra: Correct parent of the APBDMA clock clk: tegra: Add AHB DMA clock entry clk: tegra: Mark APB clock as critical clk: tegra: Make tegra_clk_pll_params __ro_after_init clk: tegra: Fix sor1_out clock implementation clk: tegra: Use tegra_clk_register_periph_data() clk: tegra: Add peripheral clock registration helper clk: tegra: Check BPMP response return code dt-bindings: clock: tegra: Add sor1_out clock firmware: tegra: Propagate error code to caller
This commit is contained in:
commit
042e2e9c2c
@ -55,6 +55,7 @@ struct tegra_bpmp_clk_message {
|
||||
struct {
|
||||
void *data;
|
||||
size_t size;
|
||||
int ret;
|
||||
} rx;
|
||||
};
|
||||
|
||||
@ -64,6 +65,7 @@ static int tegra_bpmp_clk_transfer(struct tegra_bpmp *bpmp,
|
||||
struct mrq_clk_request request;
|
||||
struct tegra_bpmp_message msg;
|
||||
void *req = &request;
|
||||
int err;
|
||||
|
||||
memset(&request, 0, sizeof(request));
|
||||
request.cmd_and_id = (clk->cmd << 24) | clk->id;
|
||||
@ -84,7 +86,13 @@ static int tegra_bpmp_clk_transfer(struct tegra_bpmp *bpmp,
|
||||
msg.rx.data = clk->rx.data;
|
||||
msg.rx.size = clk->rx.size;
|
||||
|
||||
return tegra_bpmp_transfer(bpmp, &msg);
|
||||
err = tegra_bpmp_transfer(bpmp, &msg);
|
||||
if (err < 0)
|
||||
return err;
|
||||
else if (msg.rx.ret < 0)
|
||||
return -EINVAL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra_bpmp_clk_prepare(struct clk_hw *hw)
|
||||
@ -414,11 +422,8 @@ static int tegra_bpmp_probe_clocks(struct tegra_bpmp *bpmp,
|
||||
struct tegra_bpmp_clk_info *info = &clocks[count];
|
||||
|
||||
err = tegra_bpmp_clk_get_info(bpmp, id, info);
|
||||
if (err < 0) {
|
||||
dev_err(bpmp->dev, "failed to query clock %u: %d\n",
|
||||
id, err);
|
||||
if (err < 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (info->num_parents >= U8_MAX) {
|
||||
dev_err(bpmp->dev,
|
||||
|
@ -1728,10 +1728,10 @@ EXPORT_SYMBOL(tegra_dfll_register);
|
||||
* @pdev: DFLL platform_device *
|
||||
*
|
||||
* Unbind this driver from the DFLL hardware device represented by
|
||||
* @pdev. The DFLL must be disabled for this to succeed. Returns 0
|
||||
* upon success or -EBUSY if the DFLL is still active.
|
||||
* @pdev. The DFLL must be disabled for this to succeed. Returns a
|
||||
* soc pointer upon success or -EBUSY if the DFLL is still active.
|
||||
*/
|
||||
int tegra_dfll_unregister(struct platform_device *pdev)
|
||||
struct tegra_dfll_soc_data *tegra_dfll_unregister(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_dfll *td = platform_get_drvdata(pdev);
|
||||
|
||||
@ -1739,7 +1739,7 @@ int tegra_dfll_unregister(struct platform_device *pdev)
|
||||
if (td->mode != DFLL_DISABLED) {
|
||||
dev_err(&pdev->dev,
|
||||
"must disable DFLL before removing driver\n");
|
||||
return -EBUSY;
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
|
||||
debugfs_remove_recursive(td->debugfs_dir);
|
||||
@ -1753,6 +1753,6 @@ int tegra_dfll_unregister(struct platform_device *pdev)
|
||||
|
||||
reset_control_assert(td->dvco_rst);
|
||||
|
||||
return 0;
|
||||
return td->soc;
|
||||
}
|
||||
EXPORT_SYMBOL(tegra_dfll_unregister);
|
||||
|
@ -43,7 +43,7 @@ struct tegra_dfll_soc_data {
|
||||
|
||||
int tegra_dfll_register(struct platform_device *pdev,
|
||||
struct tegra_dfll_soc_data *soc);
|
||||
int tegra_dfll_unregister(struct platform_device *pdev);
|
||||
struct tegra_dfll_soc_data *tegra_dfll_unregister(struct platform_device *pdev);
|
||||
int tegra_dfll_runtime_suspend(struct device *dev);
|
||||
int tegra_dfll_runtime_resume(struct device *dev);
|
||||
|
||||
|
@ -12,6 +12,7 @@ enum clk_id {
|
||||
tegra_clk_amx,
|
||||
tegra_clk_amx1,
|
||||
tegra_clk_apb2ape,
|
||||
tegra_clk_ahbdma,
|
||||
tegra_clk_apbdma,
|
||||
tegra_clk_apbif,
|
||||
tegra_clk_ape,
|
||||
|
@ -203,3 +203,11 @@ struct clk *tegra_clk_register_periph_nodiv(const char *name,
|
||||
return _tegra_clk_register_periph(name, parent_names, num_parents,
|
||||
periph, clk_base, offset, CLK_SET_RATE_PARENT);
|
||||
}
|
||||
|
||||
struct clk *tegra_clk_register_periph_data(void __iomem *clk_base,
|
||||
struct tegra_periph_init_data *init)
|
||||
{
|
||||
return _tegra_clk_register_periph(init->name, init->p.parent_names,
|
||||
init->num_parents, &init->periph,
|
||||
clk_base, init->offset, init->flags);
|
||||
}
|
||||
|
@ -129,7 +129,6 @@
|
||||
#define CLK_SOURCE_NVDEC 0x698
|
||||
#define CLK_SOURCE_NVJPG 0x69c
|
||||
#define CLK_SOURCE_APE 0x6c0
|
||||
#define CLK_SOURCE_SOR1 0x410
|
||||
#define CLK_SOURCE_SDMMC_LEGACY 0x694
|
||||
#define CLK_SOURCE_QSPI 0x6c4
|
||||
#define CLK_SOURCE_VI_I2C 0x6c8
|
||||
@ -278,7 +277,6 @@ static DEFINE_SPINLOCK(PLLP_OUTA_lock);
|
||||
static DEFINE_SPINLOCK(PLLP_OUTB_lock);
|
||||
static DEFINE_SPINLOCK(PLLP_OUTC_lock);
|
||||
static DEFINE_SPINLOCK(sor0_lock);
|
||||
static DEFINE_SPINLOCK(sor1_lock);
|
||||
|
||||
#define MUX_I2S_SPDIF(_id) \
|
||||
static const char *mux_pllaout0_##_id##_2x_pllp_clkm[] = { "pll_a_out0", \
|
||||
@ -604,18 +602,6 @@ static u32 mux_pllp_plld_plld2_clkm_idx[] = {
|
||||
[0] = 0, [1] = 2, [2] = 5, [3] = 6
|
||||
};
|
||||
|
||||
static const char *mux_sor_safe_sor1_brick_sor1_src[] = {
|
||||
/*
|
||||
* Bit 0 of the mux selects sor1_brick, irrespective of bit 1, so the
|
||||
* sor1_brick parent appears twice in the list below. This is merely
|
||||
* to support clk_get_parent() if firmware happened to set these bits
|
||||
* to 0b11. While not an invalid setting, code should always set the
|
||||
* bits to 0b01 to select sor1_brick.
|
||||
*/
|
||||
"sor_safe", "sor1_brick", "sor1_src", "sor1_brick"
|
||||
};
|
||||
#define mux_sor_safe_sor1_brick_sor1_src_idx NULL
|
||||
|
||||
static const char *mux_pllp_pllre_clkm[] = {
|
||||
"pll_p", "pll_re_out1", "clk_m"
|
||||
};
|
||||
@ -804,8 +790,6 @@ static struct tegra_periph_init_data periph_clks[] = {
|
||||
MUX8("nvdec", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVDEC, 194, 0, tegra_clk_nvdec),
|
||||
MUX8("nvjpg", mux_pllc2_c_c3_pllp_plla1_clkm, CLK_SOURCE_NVJPG, 195, 0, tegra_clk_nvjpg),
|
||||
MUX8("ape", mux_plla_pllc4_out0_pllc_pllc4_out1_pllp_pllc4_out2_clkm, CLK_SOURCE_APE, 198, TEGRA_PERIPH_ON_APB, tegra_clk_ape),
|
||||
MUX8_NOGATE_LOCK("sor1_src", mux_pllp_plld_plld2_clkm, CLK_SOURCE_SOR1, tegra_clk_sor1_src, &sor1_lock),
|
||||
NODIV("sor1", mux_sor_safe_sor1_brick_sor1_src, CLK_SOURCE_SOR1, 14, MASK(2), 183, 0, tegra_clk_sor1, &sor1_lock),
|
||||
MUX8("sdmmc_legacy", mux_pllp_out3_clkm_pllp_pllc4, CLK_SOURCE_SDMMC_LEGACY, 193, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_sdmmc_legacy),
|
||||
MUX8("qspi", mux_pllp_pllc_pllc_out1_pllc4_out2_pllc4_out1_clkm_pllc4_out0, CLK_SOURCE_QSPI, 211, TEGRA_PERIPH_ON_APB, tegra_clk_qspi),
|
||||
I2C("vii2c", mux_pllp_pllc_clkm, CLK_SOURCE_VI_I2C, 208, tegra_clk_vi_i2c),
|
||||
@ -823,7 +807,8 @@ static struct tegra_periph_init_data gate_clks[] = {
|
||||
GATE("timer", "clk_m", 5, 0, tegra_clk_timer, CLK_IS_CRITICAL),
|
||||
GATE("isp", "clk_m", 23, 0, tegra_clk_isp, 0),
|
||||
GATE("vcp", "clk_m", 29, 0, tegra_clk_vcp, 0),
|
||||
GATE("apbdma", "clk_m", 34, 0, tegra_clk_apbdma, 0),
|
||||
GATE("ahbdma", "hclk", 33, 0, tegra_clk_ahbdma, 0),
|
||||
GATE("apbdma", "pclk", 34, 0, tegra_clk_apbdma, 0),
|
||||
GATE("kbc", "clk_32k", 36, TEGRA_PERIPH_ON_APB | TEGRA_PERIPH_NO_RESET, tegra_clk_kbc, 0),
|
||||
GATE("fuse", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse, 0),
|
||||
GATE("fuse_burn", "clk_m", 39, TEGRA_PERIPH_ON_APB, tegra_clk_fuse_burn, 0),
|
||||
@ -927,10 +912,7 @@ static void __init periph_clk_init(void __iomem *clk_base,
|
||||
continue;
|
||||
|
||||
data->periph.gate.regs = bank;
|
||||
clk = tegra_clk_register_periph(data->name,
|
||||
data->p.parent_names, data->num_parents,
|
||||
&data->periph, clk_base, data->offset,
|
||||
data->flags);
|
||||
clk = tegra_clk_register_periph_data(clk_base, data);
|
||||
*dt_clk = clk;
|
||||
}
|
||||
}
|
||||
|
@ -166,7 +166,7 @@ static void __init tegra_sclk_init(void __iomem *clk_base,
|
||||
clk_base + SYSTEM_CLK_RATE, 0, 2, 0,
|
||||
&sysrate_lock);
|
||||
clk = clk_register_gate(NULL, "pclk", "pclk_div", CLK_SET_RATE_PARENT |
|
||||
CLK_IGNORE_UNUSED, clk_base + SYSTEM_CLK_RATE,
|
||||
CLK_IS_CRITICAL, clk_base + SYSTEM_CLK_RATE,
|
||||
3, CLK_GATE_SET_TO_DISABLE, &sysrate_lock);
|
||||
*dt_clk = clk;
|
||||
}
|
||||
|
@ -1092,9 +1092,7 @@ static __init void tegra114_periph_clk_init(void __iomem *clk_base,
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
|
||||
data = &tegra_periph_clk_list[i];
|
||||
clk = tegra_clk_register_periph(data->name,
|
||||
data->p.parent_names, data->num_parents,
|
||||
&data->periph, clk_base, data->offset, data->flags);
|
||||
clk = tegra_clk_register_periph_data(clk_base, data);
|
||||
clks[data->clk_id] = clk;
|
||||
}
|
||||
|
||||
|
@ -125,19 +125,17 @@ static int tegra124_dfll_fcpu_probe(struct platform_device *pdev)
|
||||
return err;
|
||||
}
|
||||
|
||||
platform_set_drvdata(pdev, soc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tegra124_dfll_fcpu_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct tegra_dfll_soc_data *soc = platform_get_drvdata(pdev);
|
||||
int err;
|
||||
struct tegra_dfll_soc_data *soc;
|
||||
|
||||
err = tegra_dfll_unregister(pdev);
|
||||
if (err < 0)
|
||||
dev_err(&pdev->dev, "failed to unregister DFLL: %d\n", err);
|
||||
soc = tegra_dfll_unregister(pdev);
|
||||
if (IS_ERR(soc))
|
||||
dev_err(&pdev->dev, "failed to unregister DFLL: %ld\n",
|
||||
PTR_ERR(soc));
|
||||
|
||||
tegra_cvb_remove_opp_table(soc->dev, soc->cvb, soc->max_freq);
|
||||
|
||||
|
@ -522,6 +522,8 @@ static struct tegra_devclk devclks[] __initdata = {
|
||||
};
|
||||
|
||||
static struct tegra_clk tegra20_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_ahbdma] = { .dt_id = TEGRA20_CLK_AHBDMA, .present = true },
|
||||
[tegra_clk_apbdma] = { .dt_id = TEGRA20_CLK_APBDMA, .present = true },
|
||||
[tegra_clk_spdif_out] = { .dt_id = TEGRA20_CLK_SPDIF_OUT, .present = true },
|
||||
[tegra_clk_spdif_in] = { .dt_id = TEGRA20_CLK_SPDIF_IN, .present = true },
|
||||
[tegra_clk_sdmmc1] = { .dt_id = TEGRA20_CLK_SDMMC1, .present = true },
|
||||
@ -806,11 +808,6 @@ static void __init tegra20_periph_clk_init(void)
|
||||
clk_base, 0, 3, periph_clk_enb_refcnt);
|
||||
clks[TEGRA20_CLK_AC97] = clk;
|
||||
|
||||
/* apbdma */
|
||||
clk = tegra_clk_register_periph_gate("apbdma", "pclk", 0, clk_base,
|
||||
0, 34, periph_clk_enb_refcnt);
|
||||
clks[TEGRA20_CLK_APBDMA] = clk;
|
||||
|
||||
/* emc */
|
||||
clk = clk_register_mux(NULL, "emc_mux", mux_pllmcp_clkm,
|
||||
ARRAY_SIZE(mux_pllmcp_clkm),
|
||||
@ -850,9 +847,7 @@ static void __init tegra20_periph_clk_init(void)
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
|
||||
data = &tegra_periph_clk_list[i];
|
||||
clk = tegra_clk_register_periph(data->name, data->p.parent_names,
|
||||
data->num_parents, &data->periph,
|
||||
clk_base, data->offset, data->flags);
|
||||
clk = tegra_clk_register_periph_data(clk_base, data);
|
||||
clks[data->clk_id] = clk;
|
||||
}
|
||||
|
||||
@ -1025,7 +1020,7 @@ static struct tegra_clk_init_table init_table[] __initdata = {
|
||||
{ TEGRA20_CLK_PLL_P_OUT3, TEGRA20_CLK_CLK_MAX, 72000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_P_OUT4, TEGRA20_CLK_CLK_MAX, 24000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_C, TEGRA20_CLK_CLK_MAX, 600000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 120000000, 1 },
|
||||
{ TEGRA20_CLK_PLL_C_OUT1, TEGRA20_CLK_CLK_MAX, 216000000, 1 },
|
||||
{ TEGRA20_CLK_SCLK, TEGRA20_CLK_PLL_C_OUT1, 0, 1 },
|
||||
{ TEGRA20_CLK_HCLK, TEGRA20_CLK_CLK_MAX, 0, 1 },
|
||||
{ TEGRA20_CLK_PCLK, TEGRA20_CLK_CLK_MAX, 60000000, 1 },
|
||||
|
@ -40,6 +40,7 @@
|
||||
|
||||
#define CLK_SOURCE_CSITE 0x1d4
|
||||
#define CLK_SOURCE_EMC 0x19c
|
||||
#define CLK_SOURCE_SOR1 0x410
|
||||
|
||||
#define PLLC_BASE 0x80
|
||||
#define PLLC_OUT 0x84
|
||||
@ -264,6 +265,7 @@ static DEFINE_SPINLOCK(pll_d_lock);
|
||||
static DEFINE_SPINLOCK(pll_e_lock);
|
||||
static DEFINE_SPINLOCK(pll_re_lock);
|
||||
static DEFINE_SPINLOCK(pll_u_lock);
|
||||
static DEFINE_SPINLOCK(sor1_lock);
|
||||
static DEFINE_SPINLOCK(emc_lock);
|
||||
|
||||
/* possible OSC frequencies in Hz */
|
||||
@ -2566,8 +2568,8 @@ static int tegra210_enable_pllu(void)
|
||||
reg |= PLL_ENABLE;
|
||||
writel(reg, clk_base + PLLU_BASE);
|
||||
|
||||
readl_relaxed_poll_timeout(clk_base + PLLU_BASE, reg,
|
||||
reg & PLL_BASE_LOCK, 2, 1000);
|
||||
readl_relaxed_poll_timeout_atomic(clk_base + PLLU_BASE, reg,
|
||||
reg & PLL_BASE_LOCK, 2, 1000);
|
||||
if (!(reg & PLL_BASE_LOCK)) {
|
||||
pr_err("Timed out waiting for PLL_U to lock\n");
|
||||
return -ETIMEDOUT;
|
||||
@ -2628,10 +2630,35 @@ static int tegra210_init_pllu(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char * const sor1_out_parents[] = {
|
||||
/*
|
||||
* Bit 0 of the mux selects sor1_pad_clkout, irrespective of bit 1, so
|
||||
* the sor1_pad_clkout parent appears twice in the list below. This is
|
||||
* merely to support clk_get_parent() if firmware happened to set
|
||||
* these bits to 0b11. While not an invalid setting, code should
|
||||
* always set the bits to 0b01 to select sor1_pad_clkout.
|
||||
*/
|
||||
"sor_safe", "sor1_pad_clkout", "sor1", "sor1_pad_clkout",
|
||||
};
|
||||
|
||||
static const char * const sor1_parents[] = {
|
||||
"pll_p", "pll_d_out0", "pll_d2_out0", "clk_m",
|
||||
};
|
||||
|
||||
static u32 sor1_parents_idx[] = { 0, 2, 5, 6 };
|
||||
|
||||
static struct tegra_periph_init_data tegra210_periph[] = {
|
||||
TEGRA_INIT_DATA_TABLE("sor1", NULL, NULL, sor1_parents,
|
||||
CLK_SOURCE_SOR1, 29, 0x7, 0, 0, 8, 1,
|
||||
TEGRA_DIVIDER_ROUND_UP, 183, 0, tegra_clk_sor1,
|
||||
sor1_parents_idx, 0, &sor1_lock),
|
||||
};
|
||||
|
||||
static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
void __iomem *pmc_base)
|
||||
{
|
||||
struct clk *clk;
|
||||
unsigned int i;
|
||||
|
||||
/* xusb_ss_div2 */
|
||||
clk = clk_register_fixed_factor(NULL, "xusb_ss_div2", "xusb_ss_src", 0,
|
||||
@ -2650,6 +2677,12 @@ static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
1, 17, 207);
|
||||
clks[TEGRA210_CLK_DPAUX1] = clk;
|
||||
|
||||
clk = clk_register_mux_table(NULL, "sor1_out", sor1_out_parents,
|
||||
ARRAY_SIZE(sor1_out_parents), 0,
|
||||
clk_base + CLK_SOURCE_SOR1, 14, 0x3,
|
||||
0, NULL, &sor1_lock);
|
||||
clks[TEGRA210_CLK_SOR1_OUT] = clk;
|
||||
|
||||
/* pll_d_dsi_out */
|
||||
clk = clk_register_gate(NULL, "pll_d_dsi_out", "pll_d_out0", 0,
|
||||
clk_base + PLLD_MISC0, 21, 0, &pll_d_lock);
|
||||
@ -2694,6 +2727,20 @@ static __init void tegra210_periph_clk_init(void __iomem *clk_base,
|
||||
0, NULL);
|
||||
clks[TEGRA210_CLK_ACLK] = clk;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tegra210_periph); i++) {
|
||||
struct tegra_periph_init_data *init = &tegra210_periph[i];
|
||||
struct clk **clkp;
|
||||
|
||||
clkp = tegra_lookup_dt_id(init->clk_id, tegra210_clks);
|
||||
if (!clkp) {
|
||||
pr_warn("clock %u not found\n", init->clk_id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = tegra_clk_register_periph_data(clk_base, init);
|
||||
*clkp = clk;
|
||||
}
|
||||
|
||||
tegra_periph_clk_init(clk_base, pmc_base, tegra210_clks, &pll_p_params);
|
||||
}
|
||||
|
||||
|
@ -359,7 +359,7 @@ static struct tegra_clk_pll_freq_table pll_e_freq_table[] = {
|
||||
};
|
||||
|
||||
/* PLL parameters */
|
||||
static struct tegra_clk_pll_params pll_c_params = {
|
||||
static struct tegra_clk_pll_params pll_c_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 31000000,
|
||||
.cf_min = 1000000,
|
||||
@ -388,7 +388,7 @@ static struct div_nmp pllm_nmp = {
|
||||
.override_divp_shift = 15,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_m_params = {
|
||||
static struct tegra_clk_pll_params pll_m_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 31000000,
|
||||
.cf_min = 1000000,
|
||||
@ -409,7 +409,7 @@ static struct tegra_clk_pll_params pll_m_params = {
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE | TEGRA_PLL_FIXED,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_p_params = {
|
||||
static struct tegra_clk_pll_params pll_p_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 31000000,
|
||||
.cf_min = 1000000,
|
||||
@ -444,7 +444,7 @@ static struct tegra_clk_pll_params pll_a_params = {
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_d_params = {
|
||||
static struct tegra_clk_pll_params pll_d_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 40000000,
|
||||
.cf_min = 1000000,
|
||||
@ -461,7 +461,7 @@ static struct tegra_clk_pll_params pll_d_params = {
|
||||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_d2_params = {
|
||||
static struct tegra_clk_pll_params pll_d2_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 40000000,
|
||||
.cf_min = 1000000,
|
||||
@ -478,7 +478,7 @@ static struct tegra_clk_pll_params pll_d2_params = {
|
||||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_u_params = {
|
||||
static struct tegra_clk_pll_params pll_u_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 40000000,
|
||||
.cf_min = 1000000,
|
||||
@ -496,7 +496,7 @@ static struct tegra_clk_pll_params pll_u_params = {
|
||||
TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_x_params = {
|
||||
static struct tegra_clk_pll_params pll_x_params __ro_after_init = {
|
||||
.input_min = 2000000,
|
||||
.input_max = 31000000,
|
||||
.cf_min = 1000000,
|
||||
@ -513,7 +513,7 @@ static struct tegra_clk_pll_params pll_x_params = {
|
||||
TEGRA_PLL_USE_LOCK | TEGRA_PLL_HAS_LOCK_ENABLE,
|
||||
};
|
||||
|
||||
static struct tegra_clk_pll_params pll_e_params = {
|
||||
static struct tegra_clk_pll_params pll_e_params __ro_after_init = {
|
||||
.input_min = 12000000,
|
||||
.input_max = 216000000,
|
||||
.cf_min = 12000000,
|
||||
@ -788,6 +788,7 @@ static struct tegra_clk tegra30_clks[tegra_clk_max] __initdata = {
|
||||
[tegra_clk_extern3] = { .dt_id = TEGRA30_CLK_EXTERN3, .present = true },
|
||||
[tegra_clk_disp1] = { .dt_id = TEGRA30_CLK_DISP1, .present = true },
|
||||
[tegra_clk_disp2] = { .dt_id = TEGRA30_CLK_DISP2, .present = true },
|
||||
[tegra_clk_ahbdma] = { .dt_id = TEGRA30_CLK_AHBDMA, .present = true },
|
||||
[tegra_clk_apbdma] = { .dt_id = TEGRA30_CLK_APBDMA, .present = true },
|
||||
[tegra_clk_rtc] = { .dt_id = TEGRA30_CLK_RTC, .present = true },
|
||||
[tegra_clk_timer] = { .dt_id = TEGRA30_CLK_TIMER, .present = true },
|
||||
@ -964,7 +965,7 @@ static void __init tegra30_super_clk_init(void)
|
||||
* U71 divider of cclk_lp.
|
||||
*/
|
||||
clk = tegra_clk_register_divider("pll_p_out3_cclklp", "pll_p_out3",
|
||||
clk_base + SUPER_CCLKG_DIVIDER, 0,
|
||||
clk_base + SUPER_CCLKLP_DIVIDER, 0,
|
||||
TEGRA_DIVIDER_INT, 16, 8, 1, NULL);
|
||||
clk_register_clkdev(clk, "pll_p_out3_cclklp", NULL);
|
||||
|
||||
@ -1079,9 +1080,7 @@ static void __init tegra30_periph_clk_init(void)
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(tegra_periph_clk_list); i++) {
|
||||
data = &tegra_periph_clk_list[i];
|
||||
clk = tegra_clk_register_periph(data->name, data->p.parent_names,
|
||||
data->num_parents, &data->periph,
|
||||
clk_base, data->offset, data->flags);
|
||||
clk = tegra_clk_register_periph_data(clk_base, data);
|
||||
clks[data->clk_id] = clk;
|
||||
}
|
||||
|
||||
|
@ -662,6 +662,9 @@ struct tegra_periph_init_data {
|
||||
_clk_num, _gate_flags, _clk_id,\
|
||||
NULL, 0, NULL)
|
||||
|
||||
struct clk *tegra_clk_register_periph_data(void __iomem *clk_base,
|
||||
struct tegra_periph_init_data *init);
|
||||
|
||||
/**
|
||||
* struct clk_super_mux - super clock
|
||||
*
|
||||
|
@ -194,16 +194,24 @@ static int tegra_bpmp_wait_master_free(struct tegra_bpmp_channel *channel)
|
||||
}
|
||||
|
||||
static ssize_t __tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel,
|
||||
void *data, size_t size)
|
||||
void *data, size_t size, int *ret)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (data && size > 0)
|
||||
memcpy(data, channel->ib->data, size);
|
||||
|
||||
return tegra_ivc_read_advance(channel->ivc);
|
||||
err = tegra_ivc_read_advance(channel->ivc);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
*ret = channel->ib->code;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel,
|
||||
void *data, size_t size)
|
||||
void *data, size_t size, int *ret)
|
||||
{
|
||||
struct tegra_bpmp *bpmp = channel->bpmp;
|
||||
unsigned long flags;
|
||||
@ -217,7 +225,7 @@ static ssize_t tegra_bpmp_channel_read(struct tegra_bpmp_channel *channel,
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&bpmp->lock, flags);
|
||||
err = __tegra_bpmp_channel_read(channel, data, size);
|
||||
err = __tegra_bpmp_channel_read(channel, data, size, ret);
|
||||
clear_bit(index, bpmp->threaded.allocated);
|
||||
spin_unlock_irqrestore(&bpmp->lock, flags);
|
||||
|
||||
@ -337,7 +345,8 @@ int tegra_bpmp_transfer_atomic(struct tegra_bpmp *bpmp,
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return __tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size);
|
||||
return __tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size,
|
||||
&msg->rx.ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra_bpmp_transfer_atomic);
|
||||
|
||||
@ -371,7 +380,8 @@ int tegra_bpmp_transfer(struct tegra_bpmp *bpmp,
|
||||
if (err == 0)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
return tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size);
|
||||
return tegra_bpmp_channel_read(channel, msg->rx.data, msg->rx.size,
|
||||
&msg->rx.ret);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tegra_bpmp_transfer);
|
||||
|
||||
|
@ -309,6 +309,7 @@
|
||||
#define TEGRA210_CLK_BLINK 280
|
||||
/* 281 */
|
||||
#define TEGRA210_CLK_SOR1_SRC 282
|
||||
#define TEGRA210_CLK_SOR1_OUT 282
|
||||
/* 283 */
|
||||
#define TEGRA210_CLK_XUSB_HOST_SRC 284
|
||||
#define TEGRA210_CLK_XUSB_FALCON_SRC 285
|
||||
|
@ -110,6 +110,7 @@ struct tegra_bpmp_message {
|
||||
struct {
|
||||
void *data;
|
||||
size_t size;
|
||||
int ret;
|
||||
} rx;
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user