Commit b7d7f9ee authored by Sean Wang's avatar Sean Wang Committed by Linus Walleij

pinctrl: mediatek: extend struct mtk_pin_desc which per-pin driver depends on

Because the pincrl-mtk-common.c is an implementation for per-pin binding,
its pin descriptor includes more information than pinctrl-mtk-common-v2
so far can support. So, we complement these data before writing a driver
using pincrl-mtk-common-v2.c for per-pin binding. By the way, the size of
struct mtk_pin_desc would be larger than struct pinctrl_pin_desc can hold,
so it's necessary to have a copy before the pins information is being
registered into the core.
Signed-off-by: default avatarSean Wang <sean.wang@mediatek.com>
Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 9d9b171c
...@@ -475,10 +475,10 @@ static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset) ...@@ -475,10 +475,10 @@ static int mtk_gpio_to_irq(struct gpio_chip *chip, unsigned int offset)
desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset]; desc = (const struct mtk_pin_desc *)&hw->soc->pins[offset];
if (desc->eint_n == EINT_NA) if (desc->eint.eint_n == EINT_NA)
return -ENOTSUPP; return -ENOTSUPP;
return mtk_eint_find_irq(hw->eint, desc->eint_n); return mtk_eint_find_irq(hw->eint, desc->eint.eint_n);
} }
static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset, static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
...@@ -492,12 +492,12 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset, ...@@ -492,12 +492,12 @@ static int mtk_gpio_set_config(struct gpio_chip *chip, unsigned int offset,
if (!hw->eint || if (!hw->eint ||
pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE || pinconf_to_config_param(config) != PIN_CONFIG_INPUT_DEBOUNCE ||
desc->eint_n == EINT_NA) desc->eint.eint_n == EINT_NA)
return -ENOTSUPP; return -ENOTSUPP;
debounce = pinconf_to_config_argument(config); debounce = pinconf_to_config_argument(config);
return mtk_eint_set_debounce(hw->eint, desc->eint_n, debounce); return mtk_eint_set_debounce(hw->eint, desc->eint.eint_n, debounce);
} }
static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np) static int mtk_build_gpiochip(struct mtk_pinctrl *hw, struct device_node *np)
...@@ -593,7 +593,7 @@ static int mtk_xt_find_eint_num(struct mtk_pinctrl *hw, ...@@ -593,7 +593,7 @@ static int mtk_xt_find_eint_num(struct mtk_pinctrl *hw,
desc = (const struct mtk_pin_desc *)hw->soc->pins; desc = (const struct mtk_pin_desc *)hw->soc->pins;
while (i < hw->soc->npins) { while (i < hw->soc->npins) {
if (desc[i].eint_n == eint_n) if (desc[i].eint.eint_n == eint_n)
return desc[i].number; return desc[i].number;
i++; i++;
} }
...@@ -612,7 +612,7 @@ static int mtk_xt_get_gpio_n(void *data, unsigned long eint_n, ...@@ -612,7 +612,7 @@ static int mtk_xt_get_gpio_n(void *data, unsigned long eint_n,
*gpio_chip = &hw->chip; *gpio_chip = &hw->chip;
/* Be greedy to guess first gpio_n is equal to eint_n */ /* Be greedy to guess first gpio_n is equal to eint_n */
if (desc[eint_n].eint_n == eint_n) if (desc[eint_n].eint.eint_n == eint_n)
*gpio_n = eint_n; *gpio_n = eint_n;
else else
*gpio_n = mtk_xt_find_eint_num(hw, eint_n); *gpio_n = mtk_xt_find_eint_num(hw, eint_n);
...@@ -649,7 +649,7 @@ static int mtk_xt_set_gpio_as_eint(void *data, unsigned long eint_n) ...@@ -649,7 +649,7 @@ static int mtk_xt_set_gpio_as_eint(void *data, unsigned long eint_n)
desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n]; desc = (const struct mtk_pin_desc *)&hw->soc->pins[gpio_n];
err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE, err = mtk_hw_set_value(hw, desc, PINCTRL_PIN_REG_MODE,
hw->soc->eint_m); desc->eint.eint_m);
if (err) if (err)
return err; return err;
...@@ -711,6 +711,7 @@ mtk_build_eint(struct mtk_pinctrl *hw, struct platform_device *pdev) ...@@ -711,6 +711,7 @@ mtk_build_eint(struct mtk_pinctrl *hw, struct platform_device *pdev)
int mtk_moore_pinctrl_probe(struct platform_device *pdev, int mtk_moore_pinctrl_probe(struct platform_device *pdev,
const struct mtk_pin_soc *soc) const struct mtk_pin_soc *soc)
{ {
struct pinctrl_pin_desc *pins;
struct resource *res; struct resource *res;
struct mtk_pinctrl *hw; struct mtk_pinctrl *hw;
int err, i; int err, i;
...@@ -748,8 +749,19 @@ int mtk_moore_pinctrl_probe(struct platform_device *pdev, ...@@ -748,8 +749,19 @@ int mtk_moore_pinctrl_probe(struct platform_device *pdev,
hw->nbase = hw->soc->nbase_names; hw->nbase = hw->soc->nbase_names;
/* Copy from internal struct mtk_pin_desc to register to the core */
pins = devm_kmalloc_array(&pdev->dev, hw->soc->npins, sizeof(*pins),
GFP_KERNEL);
if (IS_ERR(pins))
return PTR_ERR(pins);
for (i = 0; i < hw->soc->npins; i++) {
pins[i].number = hw->soc->pins[i].number;
pins[i].name = hw->soc->pins[i].name;
}
/* Setup pins descriptions per SoC types */ /* Setup pins descriptions per SoC types */
mtk_desc.pins = (const struct pinctrl_pin_desc *)hw->soc->pins; mtk_desc.pins = (const struct pinctrl_pin_desc *)pins;
mtk_desc.npins = hw->soc->npins; mtk_desc.npins = hw->soc->npins;
mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings); mtk_desc.num_custom_params = ARRAY_SIZE(mtk_custom_bindings);
mtk_desc.custom_params = mtk_custom_bindings; mtk_desc.custom_params = mtk_custom_bindings;
......
...@@ -28,11 +28,15 @@ ...@@ -28,11 +28,15 @@
#define MTK_RANGE(_a) { .range = (_a), .nranges = ARRAY_SIZE(_a), } #define MTK_RANGE(_a) { .range = (_a), .nranges = ARRAY_SIZE(_a), }
#define MTK_PIN(_number, _name, _eint_n, _drv_n) { \ #define MTK_PIN(_number, _name, _eint_m, _eint_n, _drv_n) { \
.number = _number, \ .number = _number, \
.name = _name, \ .name = _name, \
.eint_n = _eint_n, \ .eint = { \
.eint_m = _eint_m, \
.eint_n = _eint_n, \
}, \
.drv_n = _drv_n, \ .drv_n = _drv_n, \
.funcs = NULL, \
} }
#define PINCTRL_PIN_GROUP(name, id) \ #define PINCTRL_PIN_GROUP(name, id) \
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
#include "pinctrl-moore.h" #include "pinctrl-moore.h"
#define MT7622_PIN(_number, _name) \ #define MT7622_PIN(_number, _name) \
MTK_PIN(_number, _name, _number, DRV_GRP0) MTK_PIN(_number, _name, 1, _number, DRV_GRP0)
static const struct mtk_pin_field_calc mt7622_pin_mode_range[] = { static const struct mtk_pin_field_calc mt7622_pin_mode_range[] = {
PIN_FIELD(0, 0, 0x320, 0x10, 16, 4), PIN_FIELD(0, 0, 0x320, 0x10, 16, 4),
...@@ -758,7 +758,7 @@ static const struct mtk_eint_hw mt7622_eint_hw = { ...@@ -758,7 +758,7 @@ static const struct mtk_eint_hw mt7622_eint_hw = {
static const struct mtk_pin_soc mt7622_data = { static const struct mtk_pin_soc mt7622_data = {
.reg_cal = mt7622_reg_cals, .reg_cal = mt7622_reg_cals,
.pins = (const struct pinctrl_pin_desc *)mt7622_pins, .pins = mt7622_pins,
.npins = ARRAY_SIZE(mt7622_pins), .npins = ARRAY_SIZE(mt7622_pins),
.grps = mt7622_groups, .grps = mt7622_groups,
.ngrps = ARRAY_SIZE(mt7622_groups), .ngrps = ARRAY_SIZE(mt7622_groups),
...@@ -766,7 +766,6 @@ static const struct mtk_pin_soc mt7622_data = { ...@@ -766,7 +766,6 @@ static const struct mtk_pin_soc mt7622_data = {
.nfuncs = ARRAY_SIZE(mt7622_functions), .nfuncs = ARRAY_SIZE(mt7622_functions),
.eint_hw = &mt7622_eint_hw, .eint_hw = &mt7622_eint_hw,
.gpio_m = 1, .gpio_m = 1,
.eint_m = 1,
.ies_present = false, .ies_present = false,
.base_names = mtk_default_register_base_names, .base_names = mtk_default_register_base_names,
.nbase_names = ARRAY_SIZE(mtk_default_register_base_names), .nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
......
...@@ -30,7 +30,7 @@ ...@@ -30,7 +30,7 @@
_x_bits, 16, 1) _x_bits, 16, 1)
#define MT7623_PIN(_number, _name, _eint_n, _drv_grp) \ #define MT7623_PIN(_number, _name, _eint_n, _drv_grp) \
MTK_PIN(_number, _name, _eint_n, _drv_grp) MTK_PIN(_number, _name, 0, _eint_n, _drv_grp)
static const struct mtk_pin_field_calc mt7623_pin_mode_range[] = { static const struct mtk_pin_field_calc mt7623_pin_mode_range[] = {
PIN_FIELD15(0, 278, 0x760, 0x10, 0, 3), PIN_FIELD15(0, 278, 0x760, 0x10, 0, 3),
...@@ -1373,7 +1373,7 @@ static const struct mtk_eint_hw mt7623_eint_hw = { ...@@ -1373,7 +1373,7 @@ static const struct mtk_eint_hw mt7623_eint_hw = {
static struct mtk_pin_soc mt7623_data = { static struct mtk_pin_soc mt7623_data = {
.reg_cal = mt7623_reg_cals, .reg_cal = mt7623_reg_cals,
.pins = (const struct pinctrl_pin_desc *)mt7623_pins, .pins = mt7623_pins,
.npins = ARRAY_SIZE(mt7623_pins), .npins = ARRAY_SIZE(mt7623_pins),
.grps = mt7623_groups, .grps = mt7623_groups,
.ngrps = ARRAY_SIZE(mt7623_groups), .ngrps = ARRAY_SIZE(mt7623_groups),
...@@ -1381,7 +1381,6 @@ static struct mtk_pin_soc mt7623_data = { ...@@ -1381,7 +1381,6 @@ static struct mtk_pin_soc mt7623_data = {
.nfuncs = ARRAY_SIZE(mt7623_functions), .nfuncs = ARRAY_SIZE(mt7623_functions),
.eint_hw = &mt7623_eint_hw, .eint_hw = &mt7623_eint_hw,
.gpio_m = 0, .gpio_m = 0,
.eint_m = 0,
.ies_present = true, .ies_present = true,
.base_names = mtk_default_register_base_names, .base_names = mtk_default_register_base_names,
.nbase_names = ARRAY_SIZE(mtk_default_register_base_names), .nbase_names = ARRAY_SIZE(mtk_default_register_base_names),
......
...@@ -133,19 +133,45 @@ struct mtk_pin_reg_calc { ...@@ -133,19 +133,45 @@ struct mtk_pin_reg_calc {
unsigned int nranges; unsigned int nranges;
}; };
/**
* struct mtk_func_desc - the structure that providing information
* all the funcs for this pin
* @name: the name of function
* @muxval: the mux to the function
*/
struct mtk_func_desc {
const char *name;
u8 muxval;
};
/**
* struct mtk_eint_desc - the structure that providing information
* for eint data per pin
* @eint_m: the eint mux for this pin
* @eitn_n: the eint number for this pin
*/
struct mtk_eint_desc {
u8 eint_m;
u16 eint_n;
};
/** /**
* struct mtk_pin_desc - the structure that providing information * struct mtk_pin_desc - the structure that providing information
* for each pin of chips * for each pin of chips
* @number: unique pin number from the global pin number space * @number: unique pin number from the global pin number space
* @name: name for this pin * @name: name for this pin
* @eint_n: the eint number for this pin * @eint: the eint data for this pin
* @drv_n: the index with the driving group * @drv_n: the index with the driving group
* @funcs: all available functions for this pins (only used in
* those drivers compatible to pinctrl-mtk-common.c-like
* ones)
*/ */
struct mtk_pin_desc { struct mtk_pin_desc {
unsigned int number; unsigned int number;
const char *name; const char *name;
u16 eint_n; struct mtk_eint_desc eint;
u8 drv_n; u8 drv_n;
struct mtk_func_desc *funcs;
}; };
struct mtk_pinctrl; struct mtk_pinctrl;
...@@ -153,7 +179,7 @@ struct mtk_pinctrl; ...@@ -153,7 +179,7 @@ struct mtk_pinctrl;
/* struct mtk_pin_soc - the structure that holds SoC-specific data */ /* struct mtk_pin_soc - the structure that holds SoC-specific data */
struct mtk_pin_soc { struct mtk_pin_soc {
const struct mtk_pin_reg_calc *reg_cal; const struct mtk_pin_reg_calc *reg_cal;
const struct pinctrl_pin_desc *pins; const struct mtk_pin_desc *pins;
unsigned int npins; unsigned int npins;
const struct group_desc *grps; const struct group_desc *grps;
unsigned int ngrps; unsigned int ngrps;
...@@ -164,7 +190,6 @@ struct mtk_pin_soc { ...@@ -164,7 +190,6 @@ struct mtk_pin_soc {
/* Specific parameters per SoC */ /* Specific parameters per SoC */
u8 gpio_m; u8 gpio_m;
u8 eint_m;
bool ies_present; bool ies_present;
const char * const *base_names; const char * const *base_names;
unsigned int nbase_names; unsigned int nbase_names;
...@@ -190,6 +215,9 @@ struct mtk_pin_soc { ...@@ -190,6 +215,9 @@ struct mtk_pin_soc {
int (*adv_pull_get)(struct mtk_pinctrl *hw, int (*adv_pull_get)(struct mtk_pinctrl *hw,
const struct mtk_pin_desc *desc, bool pullup, const struct mtk_pin_desc *desc, bool pullup,
u32 *val); u32 *val);
/* Specific driver data */
void *driver_data;
}; };
struct mtk_pinctrl { struct mtk_pinctrl {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment