int tegra_bbc_power_init(struct platform_device *pdev)
{
	struct clk *clk;
	int ret = 0;

	/* Suspend */
	register_syscore_ops(&tegra_bbc_power_syscore_ops);
	/* Frequency changes */
	power.memfreq_nb.notifier_call = bbc_power_memfreq_notify;
	clk = clk_get(&pdev->dev, "emc");
	if (IS_ERR(clk)) {
		ret = PTR_ERR(clk);
		pr_err("failed to get clock 'emc': ret=%d", ret);
		return ret;
	}

	ret = tegra_register_clk_rate_notifier(clk, &power.memfreq_nb);
	if (ret) {
		pr_err("failed to register with rate notifier: ret=%d", ret);
		return ret;
	}

	/* Modem up/down */
	power.modem_nb.notifier_call = bbc_power_modem_notify;
	nvshm_stats_register(&power.modem_nb);
	return 0;
}
static int __init tegra_simon_init_cpu(void)
{
	struct tegra_simon_grader *grader =
		&simon_graders[TEGRA_SIMON_DOMAIN_CPU];
	struct clk *c;
	int r;

	spin_lock_init(&grader->grade_lock);
	setup_timer(&grader->grade_timer, tegra_simon_restart_grader,
		    (unsigned long)grader);
	setup_timer(&grader->grade_wdt, tegra_simon_reset_grade,
		    (unsigned long)grader);
	INIT_WORK(&grader->grade_update_work, tegra_simon_grade_notify);

	grader->tzd = thermal_zone_device_find_by_name("CPU-therm");
	if (!grader->tzd) {
		pr_err("%s: Failed to find %s thermal zone\n",
		       __func__, grader->domain_name);
		return -ENOENT;
	}

	c = clk_get_sys("tegra_simon", "cpu");
	if (IS_ERR(c)) {
		pr_err("%s: Failed to get %s clock\n",
		       __func__, grader->domain_name);
		return -ENOENT;
	}

	grader->grading_condition_nb.notifier_call = tegra_simon_cpu_grading_cb;
	r = tegra_register_clk_rate_notifier(c, &grader->grading_condition_nb);
	if (r) {
		pr_err("%s: Failed to register for %s rate change notify\n",
		       __func__, c->name);
		return r;
	}
	grader->clk = c;

	return 0;
}