const struct tegra_sdhci_platform_data *plat;
const struct sdhci_tegra_soc_data *soc_data;
bool clk_enabled;
+ /* ensure atomic set clock calls */
+ struct mutex set_clock_mutex;
struct regulator *vdd_io_reg;
struct regulator *vdd_slot_reg;
struct regulator *vcore_reg;
struct platform_device *pdev = to_platform_device(mmc_dev(sdhci->mmc));
u8 ctrl;
+ mutex_lock(&tegra_host->set_clock_mutex);
pr_debug("%s %s %u enabled=%u\n", __func__,
mmc_hostname(sdhci->mmc), clock, tegra_host->clk_enabled);
-
if (clock) {
if (!tegra_host->clk_enabled) {
pm_runtime_get_sync(&pdev->dev);
tegra_host->clk_enabled = false;
}
sdhci->is_clk_on = tegra_host->clk_enabled;
+ mutex_unlock(&tegra_host->set_clock_mutex);
}
static unsigned int get_calibration_offsets(struct sdhci_host *sdhci)
pltfm_host->priv = tegra_host;
tegra_host->clk_enabled = true;
host->is_clk_on = tegra_host->clk_enabled;
+ mutex_init(&tegra_host->set_clock_mutex);
+
tegra_host->max_clk_limit = plat->max_clk_limit;
tegra_host->ddr_clk_limit = plat->ddr_clk_limit;
tegra_host->instance = pdev->id;