2 * Core driver for the imx pin controller
4 * Copyright (C) 2012 Freescale Semiconductor, Inc.
5 * Copyright (C) 2012 Linaro Ltd.
7 * Author: Dong Aisheng <dong.aisheng@linaro.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
15 #include <linux/err.h>
16 #include <linux/init.h>
18 #include <linux/mfd/syscon.h>
20 #include <linux/of_device.h>
21 #include <linux/of_address.h>
22 #include <linux/pinctrl/machine.h>
23 #include <linux/pinctrl/pinconf.h>
24 #include <linux/pinctrl/pinctrl.h>
25 #include <linux/pinctrl/pinmux.h>
26 #include <linux/slab.h>
27 #include <linux/regmap.h>
30 #include "../pinconf.h"
31 #include "../pinmux.h"
32 #include "pinctrl-imx.h"
34 /* The bits in CONFIG cell defined in binding doc*/
35 #define IMX_NO_PAD_CTL 0x80000000 /* no pin config need */
36 #define IMX_PAD_SION 0x40000000 /* set SION */
38 static inline const struct group_desc
*imx_pinctrl_find_group_by_name(
39 struct pinctrl_dev
*pctldev
,
42 const struct group_desc
*grp
= NULL
;
45 for (i
= 0; i
< pctldev
->num_groups
; i
++) {
46 grp
= pinctrl_generic_get_group(pctldev
, i
);
47 if (grp
&& !strcmp(grp
->name
, name
))
54 static void imx_pin_dbg_show(struct pinctrl_dev
*pctldev
, struct seq_file
*s
,
57 seq_printf(s
, "%s", dev_name(pctldev
->dev
));
60 static int imx_dt_node_to_map(struct pinctrl_dev
*pctldev
,
61 struct device_node
*np
,
62 struct pinctrl_map
**map
, unsigned *num_maps
)
64 struct imx_pinctrl
*ipctl
= pinctrl_dev_get_drvdata(pctldev
);
65 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
66 const struct group_desc
*grp
;
67 struct pinctrl_map
*new_map
;
68 struct device_node
*parent
;
73 * first find the group of this node and check if we need create
74 * config maps for pins
76 grp
= imx_pinctrl_find_group_by_name(pctldev
, np
->name
);
78 dev_err(info
->dev
, "unable to find group for node %s\n",
83 for (i
= 0; i
< grp
->num_pins
; i
++) {
84 struct imx_pin
*pin
= &((struct imx_pin
*)(grp
->data
))[i
];
86 if (!(pin
->config
& IMX_NO_PAD_CTL
))
90 new_map
= kmalloc(sizeof(struct pinctrl_map
) * map_num
, GFP_KERNEL
);
98 parent
= of_get_parent(np
);
103 new_map
[0].type
= PIN_MAP_TYPE_MUX_GROUP
;
104 new_map
[0].data
.mux
.function
= parent
->name
;
105 new_map
[0].data
.mux
.group
= np
->name
;
108 /* create config map */
110 for (i
= j
= 0; i
< grp
->num_pins
; i
++) {
111 struct imx_pin
*pin
= &((struct imx_pin
*)(grp
->data
))[i
];
113 if (!(pin
->config
& IMX_NO_PAD_CTL
)) {
114 new_map
[j
].type
= PIN_MAP_TYPE_CONFIGS_PIN
;
115 new_map
[j
].data
.configs
.group_or_pin
=
116 pin_get_name(pctldev
, pin
->pin
);
117 new_map
[j
].data
.configs
.configs
= &pin
->config
;
118 new_map
[j
].data
.configs
.num_configs
= 1;
123 dev_dbg(pctldev
->dev
, "maps: function %s group %s num %d\n",
124 (*map
)->data
.mux
.function
, (*map
)->data
.mux
.group
, map_num
);
129 static void imx_dt_free_map(struct pinctrl_dev
*pctldev
,
130 struct pinctrl_map
*map
, unsigned num_maps
)
135 static const struct pinctrl_ops imx_pctrl_ops
= {
136 .get_groups_count
= pinctrl_generic_get_group_count
,
137 .get_group_name
= pinctrl_generic_get_group_name
,
138 .get_group_pins
= pinctrl_generic_get_group_pins
,
139 .pin_dbg_show
= imx_pin_dbg_show
,
140 .dt_node_to_map
= imx_dt_node_to_map
,
141 .dt_free_map
= imx_dt_free_map
,
145 static int imx_pmx_set(struct pinctrl_dev
*pctldev
, unsigned selector
,
148 struct imx_pinctrl
*ipctl
= pinctrl_dev_get_drvdata(pctldev
);
149 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
150 const struct imx_pin_reg
*pin_reg
;
151 unsigned int npins
, pin_id
;
153 struct group_desc
*grp
= NULL
;
154 struct function_desc
*func
= NULL
;
157 * Configure the mux mode for each pin in the group for a specific
160 grp
= pinctrl_generic_get_group(pctldev
, group
);
164 func
= pinmux_generic_get_function(pctldev
, selector
);
168 npins
= grp
->num_pins
;
170 dev_dbg(ipctl
->dev
, "enable function %s group %s\n",
171 func
->name
, grp
->name
);
173 for (i
= 0; i
< npins
; i
++) {
174 struct imx_pin
*pin
= &((struct imx_pin
*)(grp
->data
))[i
];
177 pin_reg
= &info
->pin_regs
[pin_id
];
179 if (pin_reg
->mux_reg
== -1) {
180 dev_dbg(ipctl
->dev
, "Pin(%s) does not support mux function\n",
181 info
->pins
[pin_id
].name
);
185 if (info
->flags
& SHARE_MUX_CONF_REG
) {
187 reg
= readl(ipctl
->base
+ pin_reg
->mux_reg
);
188 reg
&= ~info
->mux_mask
;
189 reg
|= (pin
->mux_mode
<< info
->mux_shift
);
190 writel(reg
, ipctl
->base
+ pin_reg
->mux_reg
);
191 dev_dbg(ipctl
->dev
, "write: offset 0x%x val 0x%x\n",
192 pin_reg
->mux_reg
, reg
);
194 writel(pin
->mux_mode
, ipctl
->base
+ pin_reg
->mux_reg
);
195 dev_dbg(ipctl
->dev
, "write: offset 0x%x val 0x%x\n",
196 pin_reg
->mux_reg
, pin
->mux_mode
);
200 * If the select input value begins with 0xff, it's a quirky
201 * select input and the value should be interpreted as below.
203 * | 0xff | shift | width | select |
204 * It's used to work around the problem that the select
205 * input for some pin is not implemented in the select
206 * input register but in some general purpose register.
207 * We encode the select input value, width and shift of
208 * the bit field into input_val cell of pin function ID
209 * in device tree, and then decode them here for setting
210 * up the select input bits in general purpose register.
212 if (pin
->input_val
>> 24 == 0xff) {
213 u32 val
= pin
->input_val
;
214 u8 select
= val
& 0xff;
215 u8 width
= (val
>> 8) & 0xff;
216 u8 shift
= (val
>> 16) & 0xff;
217 u32 mask
= ((1 << width
) - 1) << shift
;
219 * The input_reg[i] here is actually some IOMUXC general
220 * purpose register, not regular select input register.
222 val
= readl(ipctl
->base
+ pin
->input_reg
);
224 val
|= select
<< shift
;
225 writel(val
, ipctl
->base
+ pin
->input_reg
);
226 } else if (pin
->input_reg
) {
228 * Regular select input register can never be at offset
229 * 0, and we only print register value for regular case.
231 if (ipctl
->input_sel_base
)
232 writel(pin
->input_val
, ipctl
->input_sel_base
+
235 writel(pin
->input_val
, ipctl
->base
+
238 "==>select_input: offset 0x%x val 0x%x\n",
239 pin
->input_reg
, pin
->input_val
);
246 struct pinmux_ops imx_pmx_ops
= {
247 .get_functions_count
= pinmux_generic_get_function_count
,
248 .get_function_name
= pinmux_generic_get_function_name
,
249 .get_function_groups
= pinmux_generic_get_function_groups
,
250 .set_mux
= imx_pmx_set
,
253 /* decode generic config into raw register values */
254 static u32
imx_pinconf_decode_generic_config(struct imx_pinctrl
*ipctl
,
255 unsigned long *configs
,
256 unsigned int num_configs
)
258 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
259 struct imx_cfg_params_decode
*decode
;
260 enum pin_config_param param
;
265 WARN_ON(num_configs
> info
->num_decodes
);
267 for (i
= 0; i
< num_configs
; i
++) {
268 param
= pinconf_to_config_param(configs
[i
]);
269 param_val
= pinconf_to_config_argument(configs
[i
]);
270 decode
= info
->decodes
;
271 for (j
= 0; j
< info
->num_decodes
; j
++) {
272 if (param
== decode
->param
) {
274 param_val
= !param_val
;
275 raw_config
|= (param_val
<< decode
->shift
)
284 info
->fixup(configs
, num_configs
, &raw_config
);
289 static u32
imx_pinconf_parse_generic_config(struct device_node
*np
,
290 struct imx_pinctrl
*ipctl
)
292 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
293 struct pinctrl_dev
*pctl
= ipctl
->pctl
;
294 unsigned int num_configs
;
295 unsigned long *configs
;
298 if (!info
->generic_pinconf
)
301 ret
= pinconf_generic_parse_dt_config(np
, pctl
, &configs
,
306 return imx_pinconf_decode_generic_config(ipctl
, configs
, num_configs
);
309 static int imx_pinconf_get(struct pinctrl_dev
*pctldev
,
310 unsigned pin_id
, unsigned long *config
)
312 struct imx_pinctrl
*ipctl
= pinctrl_dev_get_drvdata(pctldev
);
313 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
314 const struct imx_pin_reg
*pin_reg
= &info
->pin_regs
[pin_id
];
316 if (pin_reg
->conf_reg
== -1) {
317 dev_err(info
->dev
, "Pin(%s) does not support config function\n",
318 info
->pins
[pin_id
].name
);
322 *config
= readl(ipctl
->base
+ pin_reg
->conf_reg
);
324 if (info
->flags
& SHARE_MUX_CONF_REG
)
325 *config
&= ~info
->mux_mask
;
330 static int imx_pinconf_set(struct pinctrl_dev
*pctldev
,
331 unsigned pin_id
, unsigned long *configs
,
332 unsigned num_configs
)
334 struct imx_pinctrl
*ipctl
= pinctrl_dev_get_drvdata(pctldev
);
335 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
336 const struct imx_pin_reg
*pin_reg
= &info
->pin_regs
[pin_id
];
339 if (pin_reg
->conf_reg
== -1) {
340 dev_err(info
->dev
, "Pin(%s) does not support config function\n",
341 info
->pins
[pin_id
].name
);
345 dev_dbg(ipctl
->dev
, "pinconf set pin %s\n",
346 info
->pins
[pin_id
].name
);
348 for (i
= 0; i
< num_configs
; i
++) {
349 if (info
->flags
& SHARE_MUX_CONF_REG
) {
351 reg
= readl(ipctl
->base
+ pin_reg
->conf_reg
);
352 reg
&= info
->mux_mask
;
354 writel(reg
, ipctl
->base
+ pin_reg
->conf_reg
);
355 dev_dbg(ipctl
->dev
, "write: offset 0x%x val 0x%x\n",
356 pin_reg
->conf_reg
, reg
);
358 writel(configs
[i
], ipctl
->base
+ pin_reg
->conf_reg
);
359 dev_dbg(ipctl
->dev
, "write: offset 0x%x val 0x%lx\n",
360 pin_reg
->conf_reg
, configs
[i
]);
362 } /* for each config */
367 static void imx_pinconf_dbg_show(struct pinctrl_dev
*pctldev
,
368 struct seq_file
*s
, unsigned pin_id
)
370 struct imx_pinctrl
*ipctl
= pinctrl_dev_get_drvdata(pctldev
);
371 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
372 const struct imx_pin_reg
*pin_reg
= &info
->pin_regs
[pin_id
];
373 unsigned long config
;
375 if (!pin_reg
|| pin_reg
->conf_reg
== -1) {
376 seq_printf(s
, "N/A");
380 config
= readl(ipctl
->base
+ pin_reg
->conf_reg
);
381 seq_printf(s
, "0x%lx", config
);
384 static void imx_pinconf_group_dbg_show(struct pinctrl_dev
*pctldev
,
385 struct seq_file
*s
, unsigned group
)
387 struct group_desc
*grp
;
388 unsigned long config
;
392 if (group
> pctldev
->num_groups
)
396 grp
= pinctrl_generic_get_group(pctldev
, group
);
400 for (i
= 0; i
< grp
->num_pins
; i
++) {
401 struct imx_pin
*pin
= &((struct imx_pin
*)(grp
->data
))[i
];
403 name
= pin_get_name(pctldev
, pin
->pin
);
404 ret
= imx_pinconf_get(pctldev
, pin
->pin
, &config
);
407 seq_printf(s
, " %s: 0x%lx\n", name
, config
);
411 static const struct pinconf_ops imx_pinconf_ops
= {
412 .pin_config_get
= imx_pinconf_get
,
413 .pin_config_set
= imx_pinconf_set
,
414 .pin_config_dbg_show
= imx_pinconf_dbg_show
,
415 .pin_config_group_dbg_show
= imx_pinconf_group_dbg_show
,
419 * Each pin represented in fsl,pins consists of 5 u32 PIN_FUNC_ID and
420 * 1 u32 CONFIG, so 24 types in total for each pin.
422 #define FSL_PIN_SIZE 24
423 #define SHARE_FSL_PIN_SIZE 20
425 static int imx_pinctrl_parse_groups(struct device_node
*np
,
426 struct group_desc
*grp
,
427 struct imx_pinctrl
*ipctl
,
430 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
436 dev_dbg(info
->dev
, "group(%d): %s\n", index
, np
->name
);
438 if (info
->flags
& SHARE_MUX_CONF_REG
)
439 pin_size
= SHARE_FSL_PIN_SIZE
;
441 pin_size
= FSL_PIN_SIZE
;
443 if (info
->generic_pinconf
)
446 /* Initialise group */
447 grp
->name
= np
->name
;
450 * the binding format is fsl,pins = <PIN_FUNC_ID CONFIG ...>,
451 * do sanity check and calculate pins number
453 * First try legacy 'fsl,pins' property, then fall back to the
456 * Note: for generic 'pinmux' case, there's no CONFIG part in
457 * the binding format.
459 list
= of_get_property(np
, "fsl,pins", &size
);
461 list
= of_get_property(np
, "pinmux", &size
);
464 "no fsl,pins and pins property in node %pOF\n", np
);
469 /* we do not check return since it's safe node passed down */
470 if (!size
|| size
% pin_size
) {
471 dev_err(info
->dev
, "Invalid fsl,pins or pins property in node %pOF\n", np
);
475 /* first try to parse the generic pin config */
476 config
= imx_pinconf_parse_generic_config(np
, ipctl
);
478 grp
->num_pins
= size
/ pin_size
;
479 grp
->data
= devm_kzalloc(info
->dev
, grp
->num_pins
*
480 sizeof(struct imx_pin
), GFP_KERNEL
);
481 grp
->pins
= devm_kzalloc(info
->dev
, grp
->num_pins
*
482 sizeof(unsigned int), GFP_KERNEL
);
483 if (!grp
->pins
|| !grp
->data
)
486 for (i
= 0; i
< grp
->num_pins
; i
++) {
487 u32 mux_reg
= be32_to_cpu(*list
++);
490 struct imx_pin_reg
*pin_reg
;
491 struct imx_pin
*pin
= &((struct imx_pin
*)(grp
->data
))[i
];
493 if (!(info
->flags
& ZERO_OFFSET_VALID
) && !mux_reg
)
496 if (info
->flags
& SHARE_MUX_CONF_REG
) {
499 conf_reg
= be32_to_cpu(*list
++);
504 pin_id
= (mux_reg
!= -1) ? mux_reg
/ 4 : conf_reg
/ 4;
505 pin_reg
= &info
->pin_regs
[pin_id
];
507 grp
->pins
[i
] = pin_id
;
508 pin_reg
->mux_reg
= mux_reg
;
509 pin_reg
->conf_reg
= conf_reg
;
510 pin
->input_reg
= be32_to_cpu(*list
++);
511 pin
->mux_mode
= be32_to_cpu(*list
++);
512 pin
->input_val
= be32_to_cpu(*list
++);
514 if (info
->generic_pinconf
) {
515 /* generic pin config decoded */
516 pin
->config
= config
;
518 /* legacy pin config read from devicetree */
519 config
= be32_to_cpu(*list
++);
521 /* SION bit is in mux register */
522 if (config
& IMX_PAD_SION
)
523 pin
->mux_mode
|= IOMUXC_CONFIG_SION
;
524 pin
->config
= config
& ~IMX_PAD_SION
;
527 dev_dbg(info
->dev
, "%s: 0x%x 0x%08lx", info
->pins
[pin_id
].name
,
528 pin
->mux_mode
, pin
->config
);
534 static int imx_pinctrl_parse_functions(struct device_node
*np
,
535 struct imx_pinctrl
*ipctl
,
538 struct pinctrl_dev
*pctl
= ipctl
->pctl
;
539 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
540 struct device_node
*child
;
541 struct function_desc
*func
;
542 struct group_desc
*grp
;
545 dev_dbg(info
->dev
, "parse function(%d): %s\n", index
, np
->name
);
547 func
= pinmux_generic_get_function(pctl
, index
);
551 /* Initialise function */
552 func
->name
= np
->name
;
553 func
->num_group_names
= of_get_child_count(np
);
554 if (func
->num_group_names
== 0) {
555 dev_err(info
->dev
, "no groups defined in %pOF\n", np
);
558 func
->group_names
= devm_kcalloc(info
->dev
, func
->num_group_names
,
559 sizeof(char *), GFP_KERNEL
);
560 if (!func
->group_names
)
563 for_each_child_of_node(np
, child
) {
564 func
->group_names
[i
] = child
->name
;
566 grp
= devm_kzalloc(info
->dev
, sizeof(struct group_desc
),
571 mutex_lock(&info
->mutex
);
572 radix_tree_insert(&pctl
->pin_group_tree
,
573 info
->group_index
++, grp
);
574 mutex_unlock(&info
->mutex
);
576 imx_pinctrl_parse_groups(child
, grp
, ipctl
, i
++);
583 * Check if the DT contains pins in the direct child nodes. This indicates the
584 * newer DT format to store pins. This function returns true if the first found
585 * fsl,pins property is in a child of np. Otherwise false is returned.
587 static bool imx_pinctrl_dt_is_flat_functions(struct device_node
*np
)
589 struct device_node
*function_np
;
590 struct device_node
*pinctrl_np
;
592 for_each_child_of_node(np
, function_np
) {
593 if (of_property_read_bool(function_np
, "fsl,pins"))
596 for_each_child_of_node(function_np
, pinctrl_np
) {
597 if (of_property_read_bool(pinctrl_np
, "fsl,pins"))
605 static int imx_pinctrl_probe_dt(struct platform_device
*pdev
,
606 struct imx_pinctrl
*ipctl
)
608 struct device_node
*np
= pdev
->dev
.of_node
;
609 struct device_node
*child
;
610 struct pinctrl_dev
*pctl
= ipctl
->pctl
;
611 struct imx_pinctrl_soc_info
*info
= ipctl
->info
;
619 flat_funcs
= imx_pinctrl_dt_is_flat_functions(np
);
623 nfuncs
= of_get_child_count(np
);
625 dev_err(&pdev
->dev
, "no functions defined\n");
630 for (i
= 0; i
< nfuncs
; i
++) {
631 struct function_desc
*function
;
633 function
= devm_kzalloc(&pdev
->dev
, sizeof(*function
),
638 mutex_lock(&info
->mutex
);
639 radix_tree_insert(&pctl
->pin_function_tree
, i
, function
);
640 mutex_unlock(&info
->mutex
);
642 pctl
->num_functions
= nfuncs
;
644 info
->group_index
= 0;
646 pctl
->num_groups
= of_get_child_count(np
);
648 pctl
->num_groups
= 0;
649 for_each_child_of_node(np
, child
)
650 pctl
->num_groups
+= of_get_child_count(child
);
654 imx_pinctrl_parse_functions(np
, ipctl
, 0);
657 for_each_child_of_node(np
, child
)
658 imx_pinctrl_parse_functions(child
, ipctl
, i
++);
665 * imx_free_resources() - free memory used by this driver
666 * @info: info driver instance
668 static void imx_free_resources(struct imx_pinctrl
*ipctl
)
671 pinctrl_unregister(ipctl
->pctl
);
674 int imx_pinctrl_probe(struct platform_device
*pdev
,
675 struct imx_pinctrl_soc_info
*info
)
677 struct regmap_config config
= { .name
= "gpr" };
678 struct device_node
*dev_np
= pdev
->dev
.of_node
;
679 struct pinctrl_desc
*imx_pinctrl_desc
;
680 struct device_node
*np
;
681 struct imx_pinctrl
*ipctl
;
682 struct resource
*res
;
686 if (!info
|| !info
->pins
|| !info
->npins
) {
687 dev_err(&pdev
->dev
, "wrong pinctrl info\n");
690 info
->dev
= &pdev
->dev
;
692 if (info
->gpr_compatible
) {
693 gpr
= syscon_regmap_lookup_by_compatible(info
->gpr_compatible
);
695 regmap_attach_dev(&pdev
->dev
, gpr
, &config
);
698 /* Create state holders etc for this driver */
699 ipctl
= devm_kzalloc(&pdev
->dev
, sizeof(*ipctl
), GFP_KERNEL
);
703 info
->pin_regs
= devm_kmalloc(&pdev
->dev
, sizeof(*info
->pin_regs
) *
704 info
->npins
, GFP_KERNEL
);
708 for (i
= 0; i
< info
->npins
; i
++) {
709 info
->pin_regs
[i
].mux_reg
= -1;
710 info
->pin_regs
[i
].conf_reg
= -1;
713 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
714 ipctl
->base
= devm_ioremap_resource(&pdev
->dev
, res
);
715 if (IS_ERR(ipctl
->base
))
716 return PTR_ERR(ipctl
->base
);
718 if (of_property_read_bool(dev_np
, "fsl,input-sel")) {
719 np
= of_parse_phandle(dev_np
, "fsl,input-sel", 0);
721 dev_err(&pdev
->dev
, "iomuxc fsl,input-sel property not found\n");
725 ipctl
->input_sel_base
= of_iomap(np
, 0);
727 if (!ipctl
->input_sel_base
) {
729 "iomuxc input select base address not found\n");
734 imx_pinctrl_desc
= devm_kzalloc(&pdev
->dev
, sizeof(*imx_pinctrl_desc
),
736 if (!imx_pinctrl_desc
)
739 imx_pinctrl_desc
->name
= dev_name(&pdev
->dev
);
740 imx_pinctrl_desc
->pins
= info
->pins
;
741 imx_pinctrl_desc
->npins
= info
->npins
;
742 imx_pinctrl_desc
->pctlops
= &imx_pctrl_ops
;
743 imx_pinctrl_desc
->pmxops
= &imx_pmx_ops
;
744 imx_pinctrl_desc
->confops
= &imx_pinconf_ops
;
745 imx_pinctrl_desc
->owner
= THIS_MODULE
;
747 /* for generic pinconf */
748 imx_pinctrl_desc
->custom_params
= info
->custom_params
;
749 imx_pinctrl_desc
->num_custom_params
= info
->num_custom_params
;
751 /* platform specific callback */
752 imx_pmx_ops
.gpio_set_direction
= info
->gpio_set_direction
;
754 mutex_init(&info
->mutex
);
757 ipctl
->dev
= info
->dev
;
758 platform_set_drvdata(pdev
, ipctl
);
759 ret
= devm_pinctrl_register_and_init(&pdev
->dev
,
760 imx_pinctrl_desc
, ipctl
,
763 dev_err(&pdev
->dev
, "could not register IMX pinctrl driver\n");
767 ret
= imx_pinctrl_probe_dt(pdev
, ipctl
);
769 dev_err(&pdev
->dev
, "fail to probe dt properties\n");
773 dev_info(&pdev
->dev
, "initialized IMX pinctrl driver\n");
775 return pinctrl_enable(ipctl
->pctl
);
778 imx_free_resources(ipctl
);