Commit 14a7b467 authored by Arnd Bergmann's avatar Arnd Bergmann

Merge tag 'memory-controller-drv-tegra-5.16' of...

Merge tag 'memory-controller-drv-tegra-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl into arm/drivers

Memory controller drivers for v5.16 - Tegra SoC

1. Several minor improvements.
2. Handle errors in BPMP response of Tegra186 EMC.

* tag 'memory-controller-drv-tegra-5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux-mem-ctrl:
  memory: tegra210-emc: replace DEFINE_SIMPLE_ATTRIBUTE with
  memory: tegra186-emc: Fix error return code in tegra186_emc_probe()
  memory: tegra: Make use of the helper function devm_add_action_or_reset()
  memory: tegra186-emc: Handle errors in BPMP response
  memory: tegra: Remove interconnect state syncing hack
  memory: tegra210-emc: replace DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE
  memory: tegra30-emc: replace DEFINE_SIMPLE_ATTRIBUTE with DEFINE_DEBUGFS_ATTRIBUTE
  memory: tegra: make the array list static const, makes object smaller

Link: https://lore.kernel.org/r/20211010175836.13302-3-krzysztof.kozlowski@canonical.comSigned-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 55ab5942 31b88d85
...@@ -87,11 +87,9 @@ struct tegra_mc *devm_tegra_memory_controller_get(struct device *dev) ...@@ -87,11 +87,9 @@ struct tegra_mc *devm_tegra_memory_controller_get(struct device *dev)
return ERR_PTR(-EPROBE_DEFER); return ERR_PTR(-EPROBE_DEFER);
} }
err = devm_add_action(dev, tegra_mc_devm_action_put_device, mc); err = devm_add_action_or_reset(dev, tegra_mc_devm_action_put_device, mc);
if (err) { if (err)
put_device(mc->dev);
return ERR_PTR(err); return ERR_PTR(err);
}
return mc; return mc;
} }
...@@ -706,15 +704,6 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc) ...@@ -706,15 +704,6 @@ static int tegra_mc_interconnect_setup(struct tegra_mc *mc)
goto remove_nodes; goto remove_nodes;
} }
/*
* MC driver is registered too early, so early that generic driver
* syncing doesn't work for the MC. But it doesn't really matter
* since syncing works for the EMC drivers, hence we can sync the
* MC driver by ourselves and then EMC will complete syncing of
* the whole ICC state.
*/
icc_sync_state(mc->dev);
return 0; return 0;
remove_nodes: remove_nodes:
...@@ -835,6 +824,15 @@ static int __maybe_unused tegra_mc_resume(struct device *dev) ...@@ -835,6 +824,15 @@ static int __maybe_unused tegra_mc_resume(struct device *dev)
return 0; return 0;
} }
static void tegra_mc_sync_state(struct device *dev)
{
struct tegra_mc *mc = dev_get_drvdata(dev);
/* check whether ICC provider is registered */
if (mc->provider.dev == dev)
icc_sync_state(dev);
}
static const struct dev_pm_ops tegra_mc_pm_ops = { static const struct dev_pm_ops tegra_mc_pm_ops = {
SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume) SET_SYSTEM_SLEEP_PM_OPS(tegra_mc_suspend, tegra_mc_resume)
}; };
...@@ -845,6 +843,7 @@ static struct platform_driver tegra_mc_driver = { ...@@ -845,6 +843,7 @@ static struct platform_driver tegra_mc_driver = {
.of_match_table = tegra_mc_of_match, .of_match_table = tegra_mc_of_match,
.pm = &tegra_mc_pm_ops, .pm = &tegra_mc_pm_ops,
.suppress_bind_attrs = true, .suppress_bind_attrs = true,
.sync_state = tegra_mc_sync_state,
}, },
.prevent_deferred_probe = true, .prevent_deferred_probe = true,
.probe = tegra_mc_probe, .probe = tegra_mc_probe,
......
...@@ -197,6 +197,11 @@ static int tegra186_emc_probe(struct platform_device *pdev) ...@@ -197,6 +197,11 @@ static int tegra186_emc_probe(struct platform_device *pdev)
dev_err(&pdev->dev, "failed to EMC DVFS pairs: %d\n", err); dev_err(&pdev->dev, "failed to EMC DVFS pairs: %d\n", err);
goto put_bpmp; goto put_bpmp;
} }
if (msg.rx.ret < 0) {
err = -EINVAL;
dev_err(&pdev->dev, "EMC DVFS MRQ failed: %d (BPMP error code)\n", msg.rx.ret);
goto put_bpmp;
}
emc->debugfs.min_rate = ULONG_MAX; emc->debugfs.min_rate = ULONG_MAX;
emc->debugfs.max_rate = 0; emc->debugfs.max_rate = 0;
......
...@@ -478,7 +478,7 @@ static u32 periodic_compensation_handler(struct tegra210_emc *emc, u32 type, ...@@ -478,7 +478,7 @@ static u32 periodic_compensation_handler(struct tegra210_emc *emc, u32 type,
static u32 tegra210_emc_r21021_periodic_compensation(struct tegra210_emc *emc) static u32 tegra210_emc_r21021_periodic_compensation(struct tegra210_emc *emc)
{ {
u32 emc_cfg, emc_cfg_o, emc_cfg_update, del, value; u32 emc_cfg, emc_cfg_o, emc_cfg_update, del, value;
u32 list[] = { static const u32 list[] = {
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_0,
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_1,
EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2, EMC_PMACRO_OB_DDLL_LONG_DQ_RANK0_2,
......
...@@ -1662,7 +1662,7 @@ static int tegra210_emc_debug_min_rate_set(void *data, u64 rate) ...@@ -1662,7 +1662,7 @@ static int tegra210_emc_debug_min_rate_set(void *data, u64 rate)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(tegra210_emc_debug_min_rate_fops, DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_min_rate_fops,
tegra210_emc_debug_min_rate_get, tegra210_emc_debug_min_rate_get,
tegra210_emc_debug_min_rate_set, "%llu\n"); tegra210_emc_debug_min_rate_set, "%llu\n");
...@@ -1692,7 +1692,7 @@ static int tegra210_emc_debug_max_rate_set(void *data, u64 rate) ...@@ -1692,7 +1692,7 @@ static int tegra210_emc_debug_max_rate_set(void *data, u64 rate)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(tegra210_emc_debug_max_rate_fops, DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_max_rate_fops,
tegra210_emc_debug_max_rate_get, tegra210_emc_debug_max_rate_get,
tegra210_emc_debug_max_rate_set, "%llu\n"); tegra210_emc_debug_max_rate_set, "%llu\n");
...@@ -1723,7 +1723,7 @@ static int tegra210_emc_debug_temperature_set(void *data, u64 temperature) ...@@ -1723,7 +1723,7 @@ static int tegra210_emc_debug_temperature_set(void *data, u64 temperature)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(tegra210_emc_debug_temperature_fops, DEFINE_DEBUGFS_ATTRIBUTE(tegra210_emc_debug_temperature_fops,
tegra210_emc_debug_temperature_get, tegra210_emc_debug_temperature_get,
tegra210_emc_debug_temperature_set, "%llu\n"); tegra210_emc_debug_temperature_set, "%llu\n");
......
...@@ -1289,7 +1289,7 @@ static int tegra_emc_debug_min_rate_set(void *data, u64 rate) ...@@ -1289,7 +1289,7 @@ static int tegra_emc_debug_min_rate_set(void *data, u64 rate)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(tegra_emc_debug_min_rate_fops, DEFINE_DEBUGFS_ATTRIBUTE(tegra_emc_debug_min_rate_fops,
tegra_emc_debug_min_rate_get, tegra_emc_debug_min_rate_get,
tegra_emc_debug_min_rate_set, "%llu\n"); tegra_emc_debug_min_rate_set, "%llu\n");
...@@ -1319,7 +1319,7 @@ static int tegra_emc_debug_max_rate_set(void *data, u64 rate) ...@@ -1319,7 +1319,7 @@ static int tegra_emc_debug_max_rate_set(void *data, u64 rate)
return 0; return 0;
} }
DEFINE_SIMPLE_ATTRIBUTE(tegra_emc_debug_max_rate_fops, DEFINE_DEBUGFS_ATTRIBUTE(tegra_emc_debug_max_rate_fops,
tegra_emc_debug_max_rate_get, tegra_emc_debug_max_rate_get,
tegra_emc_debug_max_rate_set, "%llu\n"); tegra_emc_debug_max_rate_set, "%llu\n");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment