/* Vote for a voltage level. */ int vote_vdd_level(struct clk_vdd_class *vdd_class, int level) { unsigned long flags; int rc; spin_lock_irqsave(&vdd_class->lock, flags); vdd_class->level_votes[level]++; rc = update_vdd(vdd_class); if (rc) vdd_class->level_votes[level]--; spin_unlock_irqrestore(&vdd_class->lock, flags); return rc; }
/* Vote for a voltage level. */ int vote_vdd_level(struct clk_vdd_class *vdd_class, int level) { int rc; if (level >= vdd_class->num_levels) return -EINVAL; mutex_lock(&vdd_class->lock); vdd_class->level_votes[level]++; rc = update_vdd(vdd_class); if (rc) vdd_class->level_votes[level]--; mutex_unlock(&vdd_class->lock); return rc; }
/* Remove vote for a voltage level. */ int unvote_vdd_level(struct clk_vdd_class *vdd_class, int level) { unsigned long flags; int rc = 0; spin_lock_irqsave(&vdd_class->lock, flags); if (WARN(!vdd_class->level_votes[level], "Reference counts are incorrect for %s level %d\n", vdd_class->class_name, level)) goto out; vdd_class->level_votes[level]--; rc = update_vdd(vdd_class); if (rc) vdd_class->level_votes[level]++; out: spin_unlock_irqrestore(&vdd_class->lock, flags); return rc; }
/* Remove vote for a voltage level. */ int unvote_vdd_level(struct clk_vdd_class *vdd_class, int level) { int rc = 0; if (level >= vdd_class->num_levels) return -EINVAL; mutex_lock(&vdd_class->lock); if (WARN(!vdd_class->level_votes[level], "Reference counts are incorrect for %s level %d\n", vdd_class->class_name, level)) goto out; vdd_class->level_votes[level]--; rc = update_vdd(vdd_class); if (rc) vdd_class->level_votes[level]++; out: mutex_unlock(&vdd_class->lock); return rc; }