OSDN Git Service

pinctrl: mediatek: common-v1: Commonize spec_ies_smt_set callback
authorAngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tue, 22 Feb 2022 11:11:44 +0000 (12:11 +0100)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 17 Mar 2022 01:06:53 +0000 (02:06 +0100)
All of the MediaTek pinctrl drivers registering with pinctrl-mtk-common
that are offering a .spec_ies_smt_set() callback are declaring their
own function which is doing exactly the same on all drivers: calling
mtk_pconf_spec_set_ies_smt_range() with their struct and a simple check.

Commonize this callback by adding the ies and smt structure pointers
to struct mtk_pinctrl_devdata and changing the callback signature to
take it.

Removing the callback and checking for the existance of the spec_smt
and/or spec_ies data would allow us to staticize the function
mtk_pconf_spec_set_ies_smt_range(), but this solution was avoided as
to keep flexibility, as some SoCs may need to perform a very different
operation compared to what this commonized function is doing.

Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Chen-Yu Tsai <wenst@chromium.org>
Link: https://lore.kernel.org/r/20220222111144.20796-6-angelogioacchino.delregno@collabora.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/mediatek/pinctrl-mt2701.c
drivers/pinctrl/mediatek/pinctrl-mt2712.c
drivers/pinctrl/mediatek/pinctrl-mt8127.c
drivers/pinctrl/mediatek/pinctrl-mt8167.c
drivers/pinctrl/mediatek/pinctrl-mt8173.c
drivers/pinctrl/mediatek/pinctrl-mt8365.c
drivers/pinctrl/mediatek/pinctrl-mt8516.c
drivers/pinctrl/mediatek/pinctrl-mtk-common.c
drivers/pinctrl/mediatek/pinctrl-mtk-common.h

index 816de39..d1583b4 100644 (file)
@@ -429,18 +429,6 @@ static const struct mtk_pin_ies_smt_set mt2701_smt_set[] = {
        MTK_PIN_IES_SMT_SPEC(278, 278, 0xb70, 13),
 };
 
-static int mt2701_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt2701_ies_set,
-                       ARRAY_SIZE(mt2701_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt2701_smt_set,
-                       ARRAY_SIZE(mt2701_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_spec_pinmux_set mt2701_spec_pinmux[] = {
        MTK_PINMUX_SPEC(22, 0xb10, 3),
        MTK_PINMUX_SPEC(23, 0xb10, 4),
@@ -501,10 +489,14 @@ static const struct mtk_pinctrl_devdata mt2701_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt2701_drv_grp),
        .pin_drv_grp = mt2701_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt2701_pin_drv),
+       .spec_ies = mt2701_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt2701_ies_set),
        .spec_pupd = mt2701_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt2701_spec_pupd),
+       .spec_smt = mt2701_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt2701_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt2701_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .spec_pinmux_set = mt2701_spec_pinmux_set,
        .spec_dir_set = mt2701_spec_dir_set,
        .dir_offset = 0x0000,
index b6182b0..b921068 100644 (file)
@@ -275,19 +275,6 @@ static const struct mtk_pin_ies_smt_set mt2712_ies_set[] = {
        MTK_PIN_IES_SMT_SPEC(207, 209, 0x8b0, 15)
 };
 
-static int mt2712_ies_smt_set(struct regmap *regmap, unsigned int pin,
-                             unsigned char align,
-                             int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt2712_ies_set,
-                       ARRAY_SIZE(mt2712_ies_set), pin, align, value);
-       if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt2712_smt_set,
-                       ARRAY_SIZE(mt2712_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_drv_group_desc mt2712_drv_grp[] =  {
        /* 0E4E8SR 4/8/12/16 */
        MTK_DRV_GRP(4, 16, 1, 2, 4),
@@ -553,10 +540,14 @@ static const struct mtk_pinctrl_devdata mt2712_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt2712_drv_grp),
        .pin_drv_grp = mt2712_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt2712_pin_drv),
+       .spec_ies = mt2712_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt2712_ies_set),
        .spec_pupd = mt2712_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt2712_spec_pupd),
+       .spec_smt = mt2712_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt2712_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt2712_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0000,
        .pullen_offset = 0x0100,
        .pullsel_offset = 0x0200,
index 9745d15..91c530e 100644 (file)
@@ -252,19 +252,6 @@ static const struct mtk_pin_ies_smt_set mt8127_smt_set[] = {
        MTK_PIN_IES_SMT_SPEC(142, 142, 0x920, 13),
 };
 
-static int mt8127_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8127_ies_set,
-                       ARRAY_SIZE(mt8127_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8127_smt_set,
-                       ARRAY_SIZE(mt8127_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
-
 static const struct mtk_pinctrl_devdata mt8127_pinctrl_data = {
        .pins = mtk_pins_mt8127,
        .npins = ARRAY_SIZE(mtk_pins_mt8127),
@@ -272,10 +259,14 @@ static const struct mtk_pinctrl_devdata mt8127_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt8127_drv_grp),
        .pin_drv_grp = mt8127_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt8127_pin_drv),
+       .spec_ies = mt8127_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt8127_ies_set),
        .spec_pupd = mt8127_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt8127_spec_pupd),
+       .spec_smt = mt8127_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt8127_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt8127_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0000,
        .pullen_offset = 0x0100,
        .pullsel_offset = 0x0200,
index 118ddcb..825167f 100644 (file)
@@ -285,18 +285,6 @@ static const struct mtk_pin_ies_smt_set mt8167_smt_set[] = {
        MTK_PIN_IES_SMT_SPEC(121, 124, 0xA10, 9),
 };
 
-static int mt8167_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8167_ies_set,
-                       ARRAY_SIZE(mt8167_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8167_smt_set,
-                       ARRAY_SIZE(mt8167_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_pinctrl_devdata mt8167_pinctrl_data = {
        .pins = mtk_pins_mt8167,
        .npins = ARRAY_SIZE(mtk_pins_mt8167),
@@ -304,10 +292,14 @@ static const struct mtk_pinctrl_devdata mt8167_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt8167_drv_grp),
        .pin_drv_grp = mt8167_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt8167_pin_drv),
+       .spec_ies = mt8167_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt8167_ies_set),
        .spec_pupd = mt8167_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt8167_spec_pupd),
+       .spec_smt = mt8167_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt8167_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt8167_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0000,
        .pullen_offset = 0x0500,
        .pullsel_offset = 0x0600,
index b34c977..1d7d11a 100644 (file)
@@ -167,18 +167,6 @@ static const struct mtk_pin_ies_smt_set mt8173_ies_set[] = {
        MTK_PIN_IES_SMT_SPEC(133, 134, 0x910, 8)
 };
 
-static int mt8173_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8173_ies_set,
-                       ARRAY_SIZE(mt8173_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8173_smt_set,
-                       ARRAY_SIZE(mt8173_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_drv_group_desc mt8173_drv_grp[] =  {
        /* 0E4E8SR 4/8/12/16 */
        MTK_DRV_GRP(4, 16, 1, 2, 4),
@@ -312,10 +300,14 @@ static const struct mtk_pinctrl_devdata mt8173_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt8173_drv_grp),
        .pin_drv_grp = mt8173_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt8173_pin_drv),
+       .spec_ies = mt8173_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt8173_ies_set),
        .spec_pupd = mt8173_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt8173_spec_pupd),
+       .spec_smt = mt8173_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt8173_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt8173_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0000,
        .pullen_offset = 0x0100,
        .pullsel_offset = 0x0200,
index dbff7a8..727c652 100644 (file)
@@ -416,18 +416,6 @@ static const struct mtk_pin_ies_smt_set mt8365_smt_set[] = {
        MTK_PIN_IES_SMT_SPEC(144, 144, 0x480, 22),
 };
 
-static int mt8365_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8365_ies_set,
-                       ARRAY_SIZE(mt8365_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8365_smt_set,
-                       ARRAY_SIZE(mt8365_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_pinctrl_devdata mt8365_pinctrl_data = {
        .pins = mtk_pins_mt8365,
        .npins = ARRAY_SIZE(mtk_pins_mt8365),
@@ -435,10 +423,14 @@ static const struct mtk_pinctrl_devdata mt8365_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt8365_drv_grp),
        .pin_drv_grp = mt8365_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt8365_pin_drv),
+       .spec_ies = mt8365_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt8365_ies_set),
+       .spec_smt = mt8365_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt8365_smt_set),
        .spec_pupd = mt8365_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt8365_spec_pupd),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt8365_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0140,
        .dout_offset = 0x00A0,
        .din_offset = 0x0000,
index 8ad2006..939a193 100644 (file)
@@ -285,18 +285,6 @@ static const struct mtk_pin_ies_smt_set mt8516_smt_set[] = {
        MTK_PIN_IES_SMT_SPEC(121, 124, 0xA10, 9),
 };
 
-static int mt8516_ies_smt_set(struct regmap *regmap, unsigned int pin,
-               unsigned char align, int value, enum pin_config_param arg)
-{
-       if (arg == PIN_CONFIG_INPUT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8516_ies_set,
-                       ARRAY_SIZE(mt8516_ies_set), pin, align, value);
-       else if (arg == PIN_CONFIG_INPUT_SCHMITT_ENABLE)
-               return mtk_pconf_spec_set_ies_smt_range(regmap, mt8516_smt_set,
-                       ARRAY_SIZE(mt8516_smt_set), pin, align, value);
-       return -EINVAL;
-}
-
 static const struct mtk_pinctrl_devdata mt8516_pinctrl_data = {
        .pins = mtk_pins_mt8516,
        .npins = ARRAY_SIZE(mtk_pins_mt8516),
@@ -304,10 +292,14 @@ static const struct mtk_pinctrl_devdata mt8516_pinctrl_data = {
        .n_grp_cls = ARRAY_SIZE(mt8516_drv_grp),
        .pin_drv_grp = mt8516_pin_drv,
        .n_pin_drv_grps = ARRAY_SIZE(mt8516_pin_drv),
+       .spec_ies = mt8516_ies_set,
+       .n_spec_ies = ARRAY_SIZE(mt8516_ies_set),
        .spec_pupd = mt8516_spec_pupd,
        .n_spec_pupd = ARRAY_SIZE(mt8516_spec_pupd),
+       .spec_smt = mt8516_smt_set,
+       .n_spec_smt = ARRAY_SIZE(mt8516_smt_set),
        .spec_pull_set = mtk_pctrl_spec_pull_set_samereg,
-       .spec_ies_smt_set = mt8516_ies_smt_set,
+       .spec_ies_smt_set = mtk_pconf_spec_set_ies_smt_range,
        .dir_offset = 0x0000,
        .pullen_offset = 0x0500,
        .pullsel_offset = 0x0600,
index 3e4e376..4aa9a45 100644 (file)
@@ -131,7 +131,7 @@ static int mtk_pconf_set_ies_smt(struct mtk_pinctrl *pctl, unsigned pin,
         */
        if (pctl->devdata->spec_ies_smt_set) {
                return pctl->devdata->spec_ies_smt_set(mtk_get_regmap(pctl, pin),
-                       pin, pctl->devdata->port_align, value, arg);
+                       pctl->devdata, pin, value, arg);
        }
 
        if (arg == PIN_CONFIG_INPUT_ENABLE)
@@ -151,10 +151,27 @@ static int mtk_pconf_set_ies_smt(struct mtk_pinctrl *pctl, unsigned pin,
 }
 
 int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
-               const struct mtk_pin_ies_smt_set *ies_smt_infos, unsigned int info_num,
-               unsigned int pin, unsigned char align, int value)
+               const struct mtk_pinctrl_devdata *devdata,
+               unsigned int pin, int value, enum pin_config_param arg)
 {
-       unsigned int i, reg_addr, bit;
+       const struct mtk_pin_ies_smt_set *ies_smt_infos = NULL;
+       unsigned int i, info_num, reg_addr, bit;
+
+       switch (arg) {
+       case PIN_CONFIG_INPUT_ENABLE:
+               ies_smt_infos = devdata->spec_ies;
+               info_num = devdata->n_spec_ies;
+               break;
+       case PIN_CONFIG_INPUT_SCHMITT_ENABLE:
+               ies_smt_infos = devdata->spec_smt;
+               info_num = devdata->n_spec_smt;
+               break;
+       default:
+               break;
+       };
+
+       if (!ies_smt_infos)
+               return -EINVAL;
 
        for (i = 0; i < info_num; i++) {
                if (pin >= ies_smt_infos[i].start &&
@@ -167,9 +184,9 @@ int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
                return -EINVAL;
 
        if (value)
-               reg_addr = ies_smt_infos[i].offset + align;
+               reg_addr = ies_smt_infos[i].offset + devdata->port_align;
        else
-               reg_addr = ies_smt_infos[i].offset + (align << 1);
+               reg_addr = ies_smt_infos[i].offset + (devdata->port_align << 1);
 
        bit = BIT(ies_smt_infos[i].bit);
        regmap_write(regmap, reg_addr, bit);
index f7968a6..6fe8564 100644 (file)
@@ -193,8 +193,12 @@ struct mtk_eint_offsets {
  *
  * @grp_desc: The driving group info.
  * @pin_drv_grp: The driving group for all pins.
+ * @spec_ies: Special pin setting for input enable
+ * @n_spec_ies: Number of entries in spec_ies
  * @spec_pupd: Special pull up/down setting
  * @n_spec_pupd: Number of entries in spec_pupd
+ * @spec_smt: Special pin setting for schmitt
+ * @n_spec_smt: Number of entries in spec_smt
  * @spec_pull_set: Each SoC may have special pins for pull up/down setting,
  *  these pins' pull setting are very different, they have separate pull
  *  up/down bit, R0 and R1 resistor bit, so they need special pull setting.
@@ -233,13 +237,18 @@ struct mtk_pinctrl_devdata {
        unsigned int    n_grp_cls;
        const struct mtk_pin_drv_grp    *pin_drv_grp;
        unsigned int    n_pin_drv_grps;
+       const struct mtk_pin_ies_smt_set *spec_ies;
+       unsigned int n_spec_ies;
        const struct mtk_pin_spec_pupd_set_samereg *spec_pupd;
        unsigned int n_spec_pupd;
+       const struct mtk_pin_ies_smt_set *spec_smt;
+       unsigned int n_spec_smt;
        int (*spec_pull_set)(struct regmap *regmap,
                        const struct mtk_pinctrl_devdata *devdata,
                        unsigned int pin, bool isup, unsigned int r1r0);
-       int (*spec_ies_smt_set)(struct regmap *reg, unsigned int pin,
-                       unsigned char align, int value, enum pin_config_param arg);
+       int (*spec_ies_smt_set)(struct regmap *reg,
+                       const struct mtk_pinctrl_devdata *devdata,
+                       unsigned int pin, int value, enum pin_config_param arg);
        void (*spec_pinmux_set)(struct regmap *reg, unsigned int pin,
                        unsigned int mode);
        void (*spec_dir_set)(unsigned int *reg_addr, unsigned int pin);
@@ -289,8 +298,8 @@ int mtk_pctrl_spec_pull_set_samereg(struct regmap *regmap,
                unsigned int pin, bool isup, unsigned int r1r0);
 
 int mtk_pconf_spec_set_ies_smt_range(struct regmap *regmap,
-               const struct mtk_pin_ies_smt_set *ies_smt_infos, unsigned int info_num,
-               unsigned int pin, unsigned char align, int value);
+               const struct mtk_pinctrl_devdata *devdata,
+               unsigned int pin, int value, enum pin_config_param arg);
 
 extern const struct dev_pm_ops mtk_eint_pm_ops;