struct rpres *rpres_get(const char *name) { int ret; struct rpres *r; struct rpres_platform_data *pdata; spin_lock(&rpres_lock); r = __find_by_name(name); spin_unlock(&rpres_lock); if (!r) return ERR_PTR(-ENOENT); omap4_dpll_cascading_blocker_hold(&r->pdev->dev); mutex_lock(&r->lock); if (r->state == RPRES_ACTIVE) { pr_err("%s:resource already active\n", __func__); ret = -EINVAL; goto out; } pdata = r->pdev->dev.platform_data; ret = pdata->ops->start(r->pdev); if (!ret) r->state = RPRES_ACTIVE; out: mutex_unlock(&r->lock); if (ret) return ERR_PTR(ret); return r; }
int omap_device_scale_gpu(struct device *req_dev, struct device *target_dev, unsigned long rate) { unsigned long freq = 0; /* find lowest frequency */ opp_find_freq_ceil(target_dev, &freq); if (rate > freq) omap4_dpll_cascading_blocker_hold(target_dev); else omap4_dpll_cascading_blocker_release(target_dev); return omap_device_scale(req_dev, target_dev, rate); }