static int clk_prcmu_opp_volt_prepare(struct clk_hw *hw) { int err; struct clk_prcmu *clk = to_clk_prcmu(hw); if (!clk->opp_requested) { err = prcmu_request_ape_opp_100_voltage(true); if (err) { pr_err("clk_prcmu: %s fail req APE OPP VOLT for %s.\n", __func__, __clk_get_name(hw->clk)); return err; } clk->opp_requested = 1; } err = prcmu_request_clock(clk->cg_sel, true); if (err) { prcmu_request_ape_opp_100_voltage(false); clk->opp_requested = 0; return err; } clk->is_prepared = 1; return 0; }
static ssize_t ape_voltage_write(struct file *file, const char __user *user_buf, size_t count, loff_t *ppos) { char buf[32]; ssize_t buf_size; long unsigned int i; int err; /* Get userspace string and assure termination */ buf_size = min(count, (sizeof(buf)-1)); if (copy_from_user(buf, user_buf, buf_size)) return -EFAULT; buf[buf_size] = 0; if (strict_strtoul(buf, 0, &i) != 0) return buf_size; switch (i) { case 0: if (ape_voltage_count == 0) pr_info("prcmu debug: reference count is already 0\n"); else { err = prcmu_request_ape_opp_100_voltage(false); if (err) pr_err("prcmu debug: drop request failed\n"); else ape_voltage_count--; } break; case 1: err = prcmu_request_ape_opp_100_voltage(true); if (err) pr_err("prcmu debug: request failed\n"); else ape_voltage_count++; break; default: pr_info("prcmu debug: value not equal to 0 or 1\n"); } return buf_size; }
static void clk_prcmu_opp_volt_unprepare(struct clk_hw *hw) { struct clk_prcmu *clk = to_clk_prcmu(hw); if (prcmu_request_clock(clk->cg_sel, false)) { pr_err("clk_prcmu: %s failed to disable %s.\n", __func__, __clk_get_name(hw->clk)); return; } if (clk->opp_requested) { prcmu_request_ape_opp_100_voltage(false); clk->opp_requested = 0; } clk->is_prepared = 0; }