void nvhost_scale3d_init(struct platform_device *pdev) { struct nvhost_device_data *pdata = platform_get_drvdata(pdev); struct nvhost_device_profile *profile; struct nvhost_gr3d_params *gr3d_params; nvhost_scale_init(pdev); profile = pdata->power_profile; if (!profile) return; gr3d_params = kzalloc(sizeof(*gr3d_params), GFP_KERNEL); if (!gr3d_params) goto err_allocate_gr3d_params; gr3d_params->clk_3d = 0; gr3d_params->clk_3d_emc = 1; profile->private_data = gr3d_params; nvhost_scale3d_calibrate_emc(&gr3d_params->emc_params, clk(profile, gr3d_params->clk_3d), clk(profile, gr3d_params->clk_3d_emc), pdata->linear_emc); return; err_allocate_gr3d_params: nvhost_scale_deinit(pdev); }
void nvhost_scale3d_actmon_init(struct platform_device *dev) { struct nvhost_devfreq_ext_stat *ext_stat; struct nvhost_device_data *pdata = platform_get_drvdata(dev); if (power_profile.init) return; /* Get clocks */ power_profile.dev = dev; power_profile.clk_3d = pdata->clk[0]; if (tegra_get_chipid() == TEGRA_CHIPID_TEGRA3) { power_profile.clk_3d2 = pdata->clk[1]; power_profile.clk_3d_emc = pdata->clk[2]; } else power_profile.clk_3d_emc = pdata->clk[1]; /* Get frequency settings */ power_profile.max_rate_3d = clk_round_rate(power_profile.clk_3d, UINT_MAX); power_profile.min_rate_3d = clk_round_rate(power_profile.clk_3d, 0); nvhost_scale3d_devfreq_profile.initial_freq = power_profile.max_rate_3d; if (power_profile.max_rate_3d == power_profile.min_rate_3d) { pr_warn("scale3d: 3d max rate = min rate (%lu), disabling\n", power_profile.max_rate_3d); goto err_bad_power_profile; } /* Reserve space for devfreq structures (dev_stat and ext_dev_stat) */ power_profile.dev_stat = kzalloc(sizeof(struct power_profile_gr3d), GFP_KERNEL); if (!power_profile.dev_stat) goto err_devfreq_alloc; ext_stat = kzalloc(sizeof(struct nvhost_devfreq_ext_stat), GFP_KERNEL); if (!ext_stat) goto err_devfreq_ext_stat_alloc; /* Initialise the dev_stat and ext_stat structures */ power_profile.dev_stat->private_data = ext_stat; power_profile.last_event_type = DEVICE_UNKNOWN; ext_stat->min_freq = power_profile.min_rate_3d; ext_stat->max_freq = power_profile.max_rate_3d; power_profile.last_request_time = ktime_get(); nvhost_scale3d_calibrate_emc(); /* Start using devfreq */ pdata->power_manager = devfreq_add_device(&dev->dev, &nvhost_scale3d_devfreq_profile, &nvhost_podgov, NULL); power_profile.init = 1; return; err_devfreq_ext_stat_alloc: kfree(power_profile.dev_stat); err_devfreq_alloc: err_bad_power_profile: return; }