Source
x
/* Sel 31 is special case when LDO3 is in mode sync_source (BUCK2/2) */
// SPDX-License-Identifier: GPL-2.0+ OR BSD-3-Clause
/*
* Copyright (C) 2018, STMicroelectronics - All Rights Reserved
* Author: Christophe Kerello <christophe.kerello@st.com>
*/
struct stpmic1_range {
int min_uv;
int min_sel;
int max_sel;
int step;
};
struct stpmic1_output {
const struct stpmic1_range *ranges;
int nbranges;
};
static int stpmic1_output_find_uv(int sel,
const struct stpmic1_output *output)
{
const struct stpmic1_range *range;
int i;
for (i = 0, range = output->ranges;
i < output->nbranges; i++, range++) {
if (sel >= range->min_sel && sel <= range->max_sel)
return range->min_uv +
(sel - range->min_sel) * range->step;
}
return -EINVAL;
}
static int stpmic1_output_find_sel(int uv,
const struct stpmic1_output *output)
{
const struct stpmic1_range *range;
int i;
for (i = 0, range = output->ranges;
i < output->nbranges; i++, range++) {
if (uv == range->min_uv && !range->step)
return range->min_sel;
if (uv >= range->min_uv &&
uv <= range->min_uv +
(range->max_sel - range->min_sel) * range->step)
return range->min_sel +
(uv - range->min_uv) / range->step;
}
return -EINVAL;
}
/*
* BUCK regulators
*/
static const struct stpmic1_range buck1_ranges[] = {
STPMIC1_RANGE(725000, 0, 4, 0),
STPMIC1_RANGE(725000, 5, 36, 25000),
STPMIC1_RANGE(1500000, 37, 63, 0),
};
static const struct stpmic1_range buck2_ranges[] = {
STPMIC1_RANGE(1000000, 0, 17, 0),