summaryrefslogtreecommitdiff
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorPeng Fan <peng.fan@nxp.com>2017-05-18 18:06:58 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:26:34 +0800
commit1a82415430f05b7dfc4637c62846780f2587f75f (patch)
treeb4568e99e6dd82f3bf61ea2b73cf1324e4aa278d /drivers/pinctrl
parentac0b24e24bf6c02f00b3f91150217c73142130c9 (diff)
MLK-14946-2: pinctrl: imx8qm/qxp: switch to use new format
switch to use new format. Split mux out from pad config. Change the high two bits in pad config to 0, because driver will automatically set that two bits to 1. Signed-off-by: Peng Fan <peng.fan@nxp.com>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/freescale/pinctrl-imx.c6
-rw-r--r--drivers/pinctrl/freescale/pinctrl-imx.h3
-rw-r--r--drivers/pinctrl/freescale/pinctrl-scu.c18
3 files changed, 18 insertions, 9 deletions
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
index df12a08e4694..7642e3102289 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.c
+++ b/drivers/pinctrl/freescale/pinctrl-imx.c
@@ -118,8 +118,8 @@ static int imx_dt_node_to_map(struct pinctrl_dev *pctldev,
new_map[j].data.configs.group_or_pin =
pin_get_name(pctldev, pin->pin);
new_map[j].data.configs.configs =
- (unsigned long *)&pin->pin_conf.pin_scu.all;
- new_map[j].data.configs.num_configs = 1;
+ (unsigned long *)&pin->pin_conf.pin_scu;
+ new_map[j].data.configs.num_configs = 2;
j++;
} else if (!(pin->pin_conf.pin_memmap.config & IMX_NO_PAD_CTL)) {
new_map[j].type = PIN_MAP_TYPE_CONFIGS_PIN;
@@ -318,7 +318,7 @@ static const struct pinconf_ops imx_pinconf_ops = {
* Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
* 1 u32 CONFIG, so 24 types in total for each pin.
*/
-#define FSL_IMX8_PIN_SIZE 8
+#define FSL_IMX8_PIN_SIZE 12
#define FSL_PIN_SIZE 24
#define SHARE_FSL_PIN_SIZE 20
diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h b/drivers/pinctrl/freescale/pinctrl-imx.h
index f915bf93aef4..d2c6d7502839 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.h
+++ b/drivers/pinctrl/freescale/pinctrl-imx.h
@@ -40,7 +40,8 @@ struct imx_pin_memmap {
};
struct imx_pin_scu {
- unsigned int all;
+ unsigned long mux;
+ unsigned long config;
};
struct imx_pin {
diff --git a/drivers/pinctrl/freescale/pinctrl-scu.c b/drivers/pinctrl/freescale/pinctrl-scu.c
index 7a629baacf22..7759cf9dc6cb 100644
--- a/drivers/pinctrl/freescale/pinctrl-scu.c
+++ b/drivers/pinctrl/freescale/pinctrl-scu.c
@@ -61,7 +61,12 @@ int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, unsigned pin_id,
sc_ipc_t ipc = pinctrl_ipcHandle;
struct imx_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
const struct imx_pinctrl_soc_info *info = ipctl->info;
- unsigned int val = configs[0];
+ /*
+ * Mux should be done in pmx set, but we do not have a good api
+ * to handle that in scfw, so config it in pad conf func
+ */
+ unsigned int mux = configs[0];
+ unsigned int val = configs[1];
if (ipc == -1) {
printk("IPC handle not initialized!\n");
@@ -74,8 +79,10 @@ int imx_pinconf_backend_set(struct pinctrl_dev *pctldev, unsigned pin_id,
if (info->flags & IMX8_ENABLE_PAD_CONFIG)
val |= BM_IMX8_GP_ENABLE;
- if (info->flags & SHARE_MUX_CONF_REG)
+ if (info->flags & SHARE_MUX_CONF_REG) {
+ val |= (mux << 27) & (0x7 << 27);
err = sc_pad_set(ipc, pin_id, val);
+ }
if (err != SC_ERR_NONE)
return -EIO;
@@ -91,10 +98,11 @@ int imx_pinctrl_parse_pin(struct imx_pinctrl_soc_info *info,
pin->pin = be32_to_cpu(*((*list_p)++));
*pin_id = pin->pin;
- pin_scu->all = be32_to_cpu(*((*list_p)++));
+ pin_scu->mux = be32_to_cpu(*((*list_p)++));
+ pin_scu->config = be32_to_cpu(*((*list_p)++));
- dev_dbg(info->dev, "%s: 0x%x",
- info->pins[pin->pin].name, pin_scu->all);
+ dev_dbg(info->dev, "%s: 0x%lx 0x%lx",
+ info->pins[pin->pin].name, pin_scu->mux, pin_scu->config);
return 0;
}