forked from luck/tmp_suning_uos_patched
pinctrl: mediatek: Add gpio_request_enable support
Implement the .gpio_request_enable() callbacks in struct pinmux_ops in mediatek pinctrl driver. Make sure that when gpio_request is called, GPIO on the pin is enabled. Signed-off-by: Biao Huang <biao.huang@mediatek.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
parent
148b95eea0
commit
59ee9c96dd
@ -43,6 +43,7 @@
|
|||||||
|
|
||||||
#define MAX_GPIO_MODE_PER_REG 5
|
#define MAX_GPIO_MODE_PER_REG 5
|
||||||
#define GPIO_MODE_BITS 3
|
#define GPIO_MODE_BITS 3
|
||||||
|
#define GPIO_MODE_PREFIX "GPIO"
|
||||||
|
|
||||||
static const char * const mtk_gpio_functions[] = {
|
static const char * const mtk_gpio_functions[] = {
|
||||||
"func0", "func1", "func2", "func3",
|
"func0", "func1", "func2", "func3",
|
||||||
@ -733,12 +734,47 @@ static int mtk_pmx_set_mux(struct pinctrl_dev *pctldev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mtk_pmx_find_gpio_mode(struct mtk_pinctrl *pctl,
|
||||||
|
unsigned offset)
|
||||||
|
{
|
||||||
|
const struct mtk_desc_pin *pin = pctl->devdata->pins + offset;
|
||||||
|
const struct mtk_desc_function *func = pin->functions;
|
||||||
|
|
||||||
|
while (func && func->name) {
|
||||||
|
if (!strncmp(func->name, GPIO_MODE_PREFIX,
|
||||||
|
sizeof(GPIO_MODE_PREFIX)-1))
|
||||||
|
return func->muxval;
|
||||||
|
func++;
|
||||||
|
}
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mtk_pmx_gpio_request_enable(struct pinctrl_dev *pctldev,
|
||||||
|
struct pinctrl_gpio_range *range,
|
||||||
|
unsigned offset)
|
||||||
|
{
|
||||||
|
unsigned long muxval;
|
||||||
|
struct mtk_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev);
|
||||||
|
|
||||||
|
muxval = mtk_pmx_find_gpio_mode(pctl, offset);
|
||||||
|
|
||||||
|
if (muxval < 0) {
|
||||||
|
dev_err(pctl->dev, "invalid gpio pin %d.\n", offset);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mtk_pmx_set_mode(pctldev, offset, muxval);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static const struct pinmux_ops mtk_pmx_ops = {
|
static const struct pinmux_ops mtk_pmx_ops = {
|
||||||
.get_functions_count = mtk_pmx_get_funcs_cnt,
|
.get_functions_count = mtk_pmx_get_funcs_cnt,
|
||||||
.get_function_name = mtk_pmx_get_func_name,
|
.get_function_name = mtk_pmx_get_func_name,
|
||||||
.get_function_groups = mtk_pmx_get_func_groups,
|
.get_function_groups = mtk_pmx_get_func_groups,
|
||||||
.set_mux = mtk_pmx_set_mux,
|
.set_mux = mtk_pmx_set_mux,
|
||||||
.gpio_set_direction = mtk_pmx_gpio_set_direction,
|
.gpio_set_direction = mtk_pmx_gpio_set_direction,
|
||||||
|
.gpio_request_enable = mtk_pmx_gpio_request_enable,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int mtk_gpio_direction_input(struct gpio_chip *chip,
|
static int mtk_gpio_direction_input(struct gpio_chip *chip,
|
||||||
|
Loading…
Reference in New Issue
Block a user