diff options
author | Anson Huang <Anson.Huang@nxp.com> | 2017-06-20 23:05:52 +0800 |
---|---|---|
committer | Jason Liu <jason.hui.liu@nxp.com> | 2019-02-12 10:27:01 +0800 |
commit | ce3229a175f85c1d2b965a06c5d8f3ffce8312da (patch) | |
tree | efd9cfdaf0230f938f38e241db8450ac1b9e3b04 /drivers/pinctrl/freescale | |
parent | d54e716c83ae2b4050bf18badd9f620f75018704 (diff) |
MLK-15128-3 pinctrl: freescale: support scu and memmap pinctrl together
As i.MX8MQ is a ARM64 SoC but it does NOT use SCU pinctrl, so
need to support both SCU and MEMMAP pinctrl together for ARM64
build.
use IMX8_USE_SCU flag to distinguish SCU and MEMMAP pinctrl
type.
Signed-off-by: Anson Huang <Anson.Huang@nxp.com>
Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'drivers/pinctrl/freescale')
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.c | 39 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-imx.h | 73 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-memmap.c | 8 | ||||
-rw-r--r-- | drivers/pinctrl/freescale/pinctrl-scu.c | 9 |
4 files changed, 107 insertions, 22 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index 7642e3102289..c658fbd9856e 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -158,6 +158,7 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, unsigned group) { struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + struct imx_pinctrl_soc_info *info = ipctl->info; unsigned int npins; int i, err; struct group_desc *grp = NULL; @@ -181,7 +182,11 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, func->name, grp->name); for (i = 0; i < npins; i++) { - err = imx_pmx_set_one_pin(ipctl, &((struct imx_pin *)(grp->data))[i]); + struct imx_pin *pin = &((struct imx_pin *)(grp->data))[i]; + if (info->flags & IMX8_USE_SCU) + err = imx_pmx_set_one_pin_scu(ipctl, pin); + else + err = imx_pmx_set_one_pin_mem(ipctl, pin); if (err) return err; } @@ -255,23 +260,41 @@ static u32 imx_pinconf_parse_generic_config(struct device_node *np, static int imx_pinconf_get(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *config) { - return imx_pinconf_backend_get(pctldev, pin_id, config); + struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + const struct imx_pinctrl_soc_info *info = ipctl->info; + + if (info->flags & IMX8_USE_SCU) + return imx_pinconf_backend_get_scu(pctldev, pin_id, config); + else + return imx_pinconf_backend_get_mem(pctldev, pin_id, config); } static int imx_pinconf_set(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *configs, unsigned num_configs) { - return imx_pinconf_backend_set(pctldev, pin_id, configs, num_configs); + struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + const struct imx_pinctrl_soc_info *info = ipctl->info; + + if (info->flags & IMX8_USE_SCU) + return imx_pinconf_backend_set_scu(pctldev, pin_id, configs, num_configs); + else + return imx_pinconf_backend_set_mem(pctldev, pin_id, configs, num_configs); } static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev, struct seq_file *s, unsigned pin_id) { + struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); + const struct imx_pinctrl_soc_info *info = ipctl->info; unsigned long config; int ret; - ret = imx_pinconf_backend_get(pctldev, pin_id, &config); + if (info->flags & IMX8_USE_SCU) + ret = imx_pinconf_backend_get_scu(pctldev, pin_id, &config); + else + ret = imx_pinconf_backend_get_mem(pctldev, pin_id, &config); + if (ret) { seq_printf(s, "N/A"); return; @@ -390,8 +413,12 @@ static int imx_pinctrl_parse_groups(struct device_node *np, for (i = 0; i < grp->num_pins; i++) { struct imx_pin *pin = &((struct imx_pin *)(grp->data))[i]; - imx_pinctrl_parse_pin(info, &grp->pins[i], pin, - list_p, config); + if (info->flags & IMX8_USE_SCU) + imx_pinctrl_parse_pin_scu(info, &grp->pins[i], + pin, list_p, config); + else + imx_pinctrl_parse_pin_mem(info, &grp->pins[i], + pin, list_p, config); } return 0; diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h b/drivers/pinctrl/freescale/pinctrl-imx.h index d2c6d7502839..ae162f667158 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.h +++ b/drivers/pinctrl/freescale/pinctrl-imx.h @@ -141,12 +141,69 @@ int imx_pinctrl_probe(struct platform_device *pdev, struct imx_pinctrl_soc_info *info); int imx_pinctrl_suspend(struct device *dev); int imx_pinctrl_resume(struct device *dev); -int imx_pmx_set_one_pin(struct imx_pinctrl *ipctl, struct imx_pin *pin); -int imx_pinconf_backend_get(struct pinctrl_dev *pctldev, unsigned pin_id, - unsigned long *config); -int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, unsigned pin_id, - unsigned long *configs, unsigned num_configs); -int imx_pinctrl_parse_pin(struct imx_pinctrl_soc_info *info, - unsigned int *pin_id, struct imx_pin *pin, - const __be32 **list_p, u32 generic_config); + +#ifdef CONFIG_PINCTRL_IMX_MEMMAP +int imx_pmx_set_one_pin_mem(struct imx_pinctrl *ipctl, struct imx_pin *pin); +int imx_pinconf_backend_get_mem(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *config); +int imx_pinconf_backend_set_mem(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *configs, unsigned num_configs); +int imx_pinctrl_parse_pin_mem(struct imx_pinctrl_soc_info *info, + unsigned int *pin_id, struct imx_pin *pin, const __be32 **list_p, + u32 generic_config); +#else +static inline int imx_pmx_set_one_pin_mem(struct imx_pinctrl *ipctl, struct imx_pin *pin) +{ + return 0; +} +static inline int imx_pinconf_backend_get_mem(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *config) +{ + return 0; +} +static inline int imx_pinconf_backend_set_mem(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *configs, unsigned num_configs) +{ + return 0; +} +static inline int imx_pinctrl_parse_pin_mem(struct imx_pinctrl_soc_info *info, + unsigned int *pin_id, struct imx_pin *pin, const __be32 **list_p, + u32 generic_config) +{ + return 0; +} +#endif + +#ifdef CONFIG_PINCTRL_IMX_SCU +int imx_pmx_set_one_pin_scu(struct imx_pinctrl *ipctl, struct imx_pin *pin); +int imx_pinconf_backend_get_scu(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *config); +int imx_pinconf_backend_set_scu(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *configs, unsigned num_configs); +int imx_pinctrl_parse_pin_scu(struct imx_pinctrl_soc_info *info, + unsigned int *pin_id, struct imx_pin *pin, const __be32 **list_p, + u32 generic_config); +#else +static inline int imx_pmx_set_one_pin_scu(struct imx_pinctrl *ipctl, struct imx_pin *pin) +{ + return 0; +} +static inline int imx_pinconf_backend_get_scu(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *config) +{ + return 0; +} +static inline int imx_pinconf_backend_set_scu(struct pinctrl_dev *pctldev, unsigned pin_id, + unsigned long *configs, unsigned num_configs) +{ + return 0; +} +static inline int imx_pinctrl_parse_pin_scu(struct imx_pinctrl_soc_info *info, + unsigned int *pin_id, struct imx_pin *pin, const __be32 **list_p, + u32 generic_config) +{ + return 0; +} +#endif + #endif /* __DRIVERS_PINCTRL_IMX_H */ diff --git a/drivers/pinctrl/freescale/pinctrl-memmap.c b/drivers/pinctrl/freescale/pinctrl-memmap.c index 531caf2daf31..c69482345192 100644 --- a/drivers/pinctrl/freescale/pinctrl-memmap.c +++ b/drivers/pinctrl/freescale/pinctrl-memmap.c @@ -33,7 +33,7 @@ #define IOMUXC_IBE (1 << 16) #define IOMUXC_OBE (1 << 17) -int imx_pmx_set_one_pin(struct imx_pinctrl *ipctl, struct imx_pin *pin) +int imx_pmx_set_one_pin_mem(struct imx_pinctrl *ipctl, struct imx_pin *pin) { const struct imx_pinctrl_soc_info *info = ipctl->info; unsigned int pin_id = pin->pin; @@ -108,7 +108,7 @@ int imx_pmx_set_one_pin(struct imx_pinctrl *ipctl, struct imx_pin *pin) return 0; } -int imx_pinconf_backend_get(struct pinctrl_dev *pctldev, +int imx_pinconf_backend_get_mem(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *config) { struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev); @@ -129,7 +129,7 @@ int imx_pinconf_backend_get(struct pinctrl_dev *pctldev, return 0; } -int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, +int imx_pinconf_backend_set_mem(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *configs, unsigned num_configs) { @@ -166,7 +166,7 @@ int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, return 0; } -int imx_pinctrl_parse_pin(struct imx_pinctrl_soc_info *info, +int imx_pinctrl_parse_pin_mem(struct imx_pinctrl_soc_info *info, unsigned int *grp_pin_id, struct imx_pin *pin, const __be32 **list_p, u32 generic_config) { diff --git a/drivers/pinctrl/freescale/pinctrl-scu.c b/drivers/pinctrl/freescale/pinctrl-scu.c index 7759cf9dc6cb..61dd50f565eb 100644 --- a/drivers/pinctrl/freescale/pinctrl-scu.c +++ b/drivers/pinctrl/freescale/pinctrl-scu.c @@ -31,12 +31,12 @@ sc_ipc_t pinctrl_ipcHandle; -int imx_pmx_set_one_pin(struct imx_pinctrl *ipctl, struct imx_pin *pin) +int imx_pmx_set_one_pin_scu(struct imx_pinctrl *ipctl, struct imx_pin *pin) { return 0; } -int imx_pinconf_backend_get(struct pinctrl_dev *pctldev, unsigned pin_id, +int imx_pinconf_backend_get_scu(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *config) { sc_err_t err = SC_ERR_NONE; @@ -54,7 +54,8 @@ int imx_pinconf_backend_get(struct pinctrl_dev *pctldev, unsigned pin_id, return 0; } -int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, unsigned pin_id, + +int imx_pinconf_backend_set_scu(struct pinctrl_dev *pctldev, unsigned pin_id, unsigned long *configs, unsigned num_configs) { sc_err_t err = SC_ERR_NONE; @@ -90,7 +91,7 @@ int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, unsigned pin_id, return 0; } -int imx_pinctrl_parse_pin(struct imx_pinctrl_soc_info *info, +int imx_pinctrl_parse_pin_scu(struct imx_pinctrl_soc_info *info, unsigned int *pin_id, struct imx_pin *pin, const __be32 **list_p, u32 generic_config) { |