2 * Driver for the NVIDIA Tegra pinmux
4 * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
7 * Copyright (C) 2010 Google, Inc.
8 * Copyright (C) 2010 NVIDIA Corporation
9 * Copyright (C) 2009-2011 ST-Ericsson AB
11 * This program is free software; you can redistribute it and/or modify it
12 * under the terms and conditions of the GNU General Public License,
13 * version 2, as published by the Free Software Foundation.
15 * This program is distributed in the hope it will be useful, but WITHOUT
16 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
17 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
21 #include <linux/err.h>
22 #include <linux/init.h>
24 #include <linux/gpio.h>
25 #include <linux/module.h>
27 #include <linux/platform_device.h>
28 #include <linux/pinctrl/machine.h>
29 #include <linux/pinctrl/pinctrl.h>
30 #include <linux/pinctrl/pinmux.h>
31 #include <linux/pinctrl/pinconf.h>
32 #include <linux/slab.h>
33 #include <linux/syscore_ops.h>
34 #include <linux/uaccess.h>
36 #include <linux/pinctrl/pinconf-tegra.h>
39 #include "pinctrl-tegra.h"
41 static DEFINE_SPINLOCK(mux_lock);
45 struct pinctrl_dev *pctl;
47 const struct tegra_pinctrl_soc_data *soc;
52 unsigned int *reg_base;
55 unsigned drive_group_start_index;
58 static struct tegra_pmx *pmx;
60 static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev,
61 unsigned group, unsigned long config);
63 static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg)
65 return readl(pmx->regs[bank] + reg);
68 static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg)
70 writel(val, pmx->regs[bank] + reg);
73 static int tegra_pinctrl_get_groups_count(struct pinctrl_dev *pctldev)
75 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
77 return pmx->soc->ngroups;
80 static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev,
83 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
85 return pmx->soc->groups[group].name;
88 static int tegra_pinctrl_get_group_pins(struct pinctrl_dev *pctldev,
90 const unsigned **pins,
93 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
95 *pins = pmx->soc->groups[group].pins;
96 *num_pins = pmx->soc->groups[group].npins;
101 #ifdef CONFIG_DEBUG_FS
102 static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev,
106 seq_printf(s, " %s", dev_name(pctldev->dev));
110 static int reserve_map(struct device *dev, struct pinctrl_map **map,
111 unsigned *reserved_maps, unsigned *num_maps,
114 unsigned old_num = *reserved_maps;
115 unsigned new_num = *num_maps + reserve;
116 struct pinctrl_map *new_map;
118 if (old_num >= new_num)
121 new_map = krealloc(*map, sizeof(*new_map) * new_num, GFP_KERNEL);
123 dev_err(dev, "krealloc(map) failed\n");
127 memset(new_map + old_num, 0, (new_num - old_num) * sizeof(*new_map));
130 *reserved_maps = new_num;
135 static int add_map_mux(struct pinctrl_map **map, unsigned *reserved_maps,
136 unsigned *num_maps, const char *group,
137 const char *function)
139 if (WARN_ON(*num_maps == *reserved_maps))
142 (*map)[*num_maps].type = PIN_MAP_TYPE_MUX_GROUP;
143 (*map)[*num_maps].data.mux.group = group;
144 (*map)[*num_maps].data.mux.function = function;
150 static int add_map_configs(struct device *dev, struct pinctrl_map **map,
151 unsigned *reserved_maps, unsigned *num_maps,
152 const char *group, unsigned long *configs,
153 unsigned num_configs)
155 unsigned long *dup_configs;
157 if (WARN_ON(*num_maps == *reserved_maps))
160 dup_configs = kmemdup(configs, num_configs * sizeof(*dup_configs),
163 dev_err(dev, "kmemdup(configs) failed\n");
167 (*map)[*num_maps].type = PIN_MAP_TYPE_CONFIGS_GROUP;
168 (*map)[*num_maps].data.configs.group_or_pin = group;
169 (*map)[*num_maps].data.configs.configs = dup_configs;
170 (*map)[*num_maps].data.configs.num_configs = num_configs;
176 static int add_config(struct device *dev, unsigned long **configs,
177 unsigned *num_configs, unsigned long config)
179 unsigned old_num = *num_configs;
180 unsigned new_num = old_num + 1;
181 unsigned long *new_configs;
183 new_configs = krealloc(*configs, sizeof(*new_configs) * new_num,
186 dev_err(dev, "krealloc(configs) failed\n");
190 new_configs[old_num] = config;
192 *configs = new_configs;
193 *num_configs = new_num;
198 static void tegra_pinctrl_dt_free_map(struct pinctrl_dev *pctldev,
199 struct pinctrl_map *map,
204 for (i = 0; i < num_maps; i++)
205 if (map[i].type == PIN_MAP_TYPE_CONFIGS_GROUP)
206 kfree(map[i].data.configs.configs);
211 static const struct cfg_param {
212 const char *property;
213 enum tegra_pinconf_param param;
215 {"nvidia,pull", TEGRA_PINCONF_PARAM_PULL},
216 {"nvidia,tristate", TEGRA_PINCONF_PARAM_TRISTATE},
217 {"nvidia,enable-input", TEGRA_PINCONF_PARAM_ENABLE_INPUT},
218 {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN},
219 {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK},
220 {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET},
221 {"nvidia,rcv-sel", TEGRA_PINCONF_PARAM_RCV_SEL},
222 {"nvidia,io-high-voltage", TEGRA_PINCONF_PARAM_E_IO_HV},
223 {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE},
224 {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT},
225 {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE},
226 {"nvidia,pull-down-strength", TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH},
227 {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH},
228 {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING},
229 {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING},
230 {"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE},
233 static int tegra_pinctrl_dt_subnode_to_map(struct device *dev,
234 struct device_node *np,
235 struct pinctrl_map **map,
236 unsigned *reserved_maps,
240 const char *function;
242 unsigned long config;
243 unsigned long *configs = NULL;
244 unsigned num_configs = 0;
246 struct property *prop;
249 ret = of_property_read_string(np, "nvidia,function", &function);
251 /* EINVAL=missing, which is fine since it's optional */
254 "could not parse property nvidia,function\n");
258 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
259 ret = of_property_read_u32(np, cfg_params[i].property, &val);
261 config = TEGRA_PINCONF_PACK(cfg_params[i].param, val);
262 ret = add_config(dev, &configs, &num_configs, config);
265 /* EINVAL=missing, which is fine since it's optional */
266 } else if (ret != -EINVAL) {
267 dev_err(dev, "could not parse property %s\n",
268 cfg_params[i].property);
273 if (function != NULL)
277 ret = of_property_count_strings(np, "nvidia,pins");
279 dev_err(dev, "could not parse property nvidia,pins\n");
284 ret = reserve_map(dev, map, reserved_maps, num_maps, reserve);
288 of_property_for_each_string(np, "nvidia,pins", prop, group) {
290 ret = add_map_mux(map, reserved_maps, num_maps,
297 ret = add_map_configs(dev, map, reserved_maps,
298 num_maps, group, configs,
312 static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev,
313 struct device_node *np_config,
314 struct pinctrl_map **map,
317 unsigned reserved_maps;
318 struct device_node *np;
325 for_each_child_of_node(np_config, np) {
326 /* If node status is disabled then ignore the node */
327 if (!of_device_is_available(np))
330 ret = tegra_pinctrl_dt_subnode_to_map(pctldev->dev, np, map,
331 &reserved_maps, num_maps);
333 tegra_pinctrl_dt_free_map(pctldev, *map, *num_maps);
341 static const struct pinctrl_ops tegra_pinctrl_ops = {
342 .get_groups_count = tegra_pinctrl_get_groups_count,
343 .get_group_name = tegra_pinctrl_get_group_name,
344 .get_group_pins = tegra_pinctrl_get_group_pins,
345 #ifdef CONFIG_DEBUG_FS
346 .pin_dbg_show = tegra_pinctrl_pin_dbg_show,
348 .dt_node_to_map = tegra_pinctrl_dt_node_to_map,
349 .dt_free_map = tegra_pinctrl_dt_free_map,
352 static int tegra_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev)
354 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
356 return pmx->soc->nfunctions;
359 static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev,
362 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
364 return pmx->soc->functions[function].name;
367 static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
369 const char * const **groups,
370 unsigned * const num_groups)
372 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
374 *groups = pmx->soc->functions[function].groups;
375 *num_groups = pmx->soc->functions[function].ngroups;
380 static int tegra_pinconfig_group_set(struct pinctrl_dev *pctldev,
381 unsigned group, unsigned long param, unsigned long arg)
383 unsigned long config;
386 config = TEGRA_PINCONF_PACK(param, arg);
387 ret = tegra_pinconf_group_set(pctldev, group, config);
389 dev_err(pctldev->dev,
390 "Pinctrl group %u tristate config failed: %d\n",
395 static int tegra_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned req_function,
398 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
399 const struct tegra_pingroup *g;
400 unsigned function = req_function;
406 g = &pmx->soc->groups[group];
408 if (WARN_ON(g->mux_reg < 0))
411 switch (req_function) {
412 case TEGRA_PINMUX_SPECIAL_UNUSED:
413 /* Set tristate =1 and input = 0 for unused pins */
414 ret = tegra_pinconfig_group_set(pctldev, group,
415 TEGRA_PINCONF_PARAM_TRISTATE, 1);
417 ret = tegra_pinconfig_group_set(pctldev, group,
418 TEGRA_PINCONF_PARAM_ENABLE_INPUT, 0);
421 case TEGRA_PINMUX_SPECIAL_GPIO:
422 /* Do nothing for gpio pins */
429 for (i = 0; i < ARRAY_SIZE(g->funcs); i++) {
430 if (g->funcs[i] == function)
433 if (WARN_ON(i == ARRAY_SIZE(g->funcs)))
436 spin_lock_irqsave(&mux_lock, flags);
438 val = pmx_readl(pmx, g->mux_bank, g->mux_reg);
439 val &= ~(0x3 << g->mux_bit);
440 val |= i << g->mux_bit;
441 pmx_writel(pmx, val, g->mux_bank, g->mux_reg);
443 spin_unlock_irqrestore(&mux_lock, flags);
448 static int tegra_pinctrl_gpio_request_enable(struct pinctrl_dev *pctldev,
449 struct pinctrl_gpio_range *range,
452 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
454 if (pmx->soc->gpio_request_enable)
455 return pmx->soc->gpio_request_enable(pin);
459 static int tegra_pinctrl_gpio_set_direction (struct pinctrl_dev *pctldev,
460 struct pinctrl_gpio_range *range, unsigned offset, bool input)
462 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
464 const unsigned *pins;
468 for (group = 0; group < pmx->soc->ngroups; ++group) {
469 ret = tegra_pinctrl_get_group_pins(pctldev, group,
471 if (ret < 0 || num_pins != 1)
473 if (offset == pins[0])
477 if (group == pmx->soc->ngroups) {
478 dev_err(pctldev->dev,
479 "Pingroup not found for pin %u\n", offset);
484 * Set input = 1 for the input direction and
485 * tristate = 0 for output direction.
488 ret = tegra_pinconfig_group_set(pctldev, group,
489 TEGRA_PINCONF_PARAM_ENABLE_INPUT, 1);
491 ret = tegra_pinconfig_group_set(pctldev, group,
492 TEGRA_PINCONF_PARAM_TRISTATE, 0);
496 static const struct pinmux_ops tegra_pinmux_ops = {
497 .get_functions_count = tegra_pinctrl_get_funcs_count,
498 .get_function_name = tegra_pinctrl_get_func_name,
499 .get_function_groups = tegra_pinctrl_get_func_groups,
500 .enable = tegra_pinctrl_enable,
501 .gpio_request_enable = tegra_pinctrl_gpio_request_enable,
502 .gpio_set_direction = tegra_pinctrl_gpio_set_direction,
505 static int tegra_pinconf_reg(struct tegra_pmx *pmx,
506 const struct tegra_pingroup *g,
507 enum tegra_pinconf_param param,
509 s8 *bank, s16 *reg, s8 *bit, s8 *width)
512 case TEGRA_PINCONF_PARAM_PULL:
513 *bank = g->pupd_bank;
518 case TEGRA_PINCONF_PARAM_TRISTATE:
524 case TEGRA_PINCONF_PARAM_ENABLE_INPUT:
525 *bank = g->einput_bank;
526 *reg = g->einput_reg;
527 *bit = g->einput_bit;
530 case TEGRA_PINCONF_PARAM_OPEN_DRAIN:
531 *bank = g->odrain_bank;
532 *reg = g->odrain_reg;
533 *bit = g->odrain_bit;
536 case TEGRA_PINCONF_PARAM_LOCK:
537 *bank = g->lock_bank;
542 case TEGRA_PINCONF_PARAM_IORESET:
543 *bank = g->ioreset_bank;
544 *reg = g->ioreset_reg;
545 *bit = g->ioreset_bit;
548 case TEGRA_PINCONF_PARAM_RCV_SEL:
549 *bank = g->rcv_sel_bank;
550 *reg = g->rcv_sel_reg;
551 *bit = g->rcv_sel_bit;
554 case TEGRA_PINCONF_PARAM_E_IO_HV:
555 *bank = g->e_io_hv_bank;
556 *reg = g->e_io_hv_reg;
557 *bit = g->e_io_hv_bit;
560 case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE:
561 if (g->drv_reg == -1) {
571 case TEGRA_PINCONF_PARAM_SCHMITT:
572 if (g->drv_reg == -1) {
574 *reg = g->schmitt_reg;
579 *bit = g->schmitt_bit;
582 case TEGRA_PINCONF_PARAM_LOW_POWER_MODE:
588 case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH:
592 *width = g->drvdn_width;
594 case TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH:
598 *width = g->drvup_width;
600 case TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING:
604 *width = g->slwf_width;
606 case TEGRA_PINCONF_PARAM_SLEW_RATE_RISING:
610 *width = g->slwr_width;
612 case TEGRA_PINCONF_PARAM_DRIVE_TYPE:
613 *bank = g->drvtype_bank;
614 *reg = g->drvtype_reg;
615 *bit = g->drvtype_bit;
616 *width = g->drvtype_width;
619 dev_err(pmx->dev, "Invalid config param %04x\n", param);
623 if (*reg < 0 || *bit < 0) {
626 "Config param %04x not supported on group %s\n",
634 static int tegra_pinconf_get(struct pinctrl_dev *pctldev,
635 unsigned pin, unsigned long *config)
637 dev_err(pctldev->dev, "pin_config_get op not supported\n");
641 static int tegra_pinconf_set(struct pinctrl_dev *pctldev,
642 unsigned pin, unsigned long config)
644 dev_err(pctldev->dev, "pin_config_set op not supported\n");
648 static int tegra_pinconf_group_get(struct pinctrl_dev *pctldev,
649 unsigned group, unsigned long *config)
651 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
652 enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(*config);
654 const struct tegra_pingroup *g;
661 g = &pmx->soc->groups[group];
663 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit,
668 spin_lock_irqsave(&mux_lock, flags);
670 val = pmx_readl(pmx, bank, reg);
672 spin_unlock_irqrestore(&mux_lock, flags);
674 mask = (1 << width) - 1;
675 arg = (val >> bit) & mask;
677 *config = TEGRA_PINCONF_PACK(param, arg);
682 static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev,
683 unsigned group, unsigned long config)
685 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
686 enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config);
687 u16 arg = TEGRA_PINCONF_UNPACK_ARG(config);
688 const struct tegra_pingroup *g;
695 g = &pmx->soc->groups[group];
697 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, ®, &bit,
702 spin_lock_irqsave(&mux_lock, flags);
703 val = pmx_readl(pmx, bank, reg);
705 /* LOCK can't be cleared */
706 if (param == TEGRA_PINCONF_PARAM_LOCK) {
707 if ((val & BIT(bit)) && !arg) {
708 dev_err(pctldev->dev, "LOCK bit cannot be cleared\n");
714 /* Special-case Boolean values; allow any non-zero as true */
718 /* Range-check user-supplied value */
719 mask = (1 << width) - 1;
722 case TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH:
731 dev_err(pctldev->dev,
732 "group %s config %lx: %x too big for %d bit register\n",
733 g->name, config, arg, width);
738 /* Update register */
739 val &= ~(mask << bit);
741 pmx_writel(pmx, val, bank, reg);
744 spin_unlock_irqrestore(&mux_lock, flags);
748 #ifdef CONFIG_DEBUG_FS
749 static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev,
750 struct seq_file *s, unsigned offset)
754 static const char *strip_prefix(const char *s)
756 const char *comma = strchr(s, ',');
763 static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
764 struct seq_file *s, unsigned group)
766 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev);
767 const struct tegra_pingroup *g;
773 g = &pmx->soc->groups[group];
775 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
776 ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false,
777 &bank, ®, &bit, &width);
781 val = pmx_readl(pmx, bank, reg);
783 val &= (1 << width) - 1;
785 seq_printf(s, "\n\t%s=%u",
786 strip_prefix(cfg_params[i].property), val);
790 static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev,
792 unsigned long config)
794 enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config);
795 u16 arg = TEGRA_PINCONF_UNPACK_ARG(config);
796 const char *pname = "unknown";
799 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) {
800 if (cfg_params[i].param == param) {
801 pname = cfg_params[i].property;
806 seq_printf(s, "%s=%d", strip_prefix(pname), arg);
810 static const struct pinconf_ops tegra_pinconf_ops = {
811 .pin_config_get = tegra_pinconf_get,
812 .pin_config_set = tegra_pinconf_set,
813 .pin_config_group_get = tegra_pinconf_group_get,
814 .pin_config_group_set = tegra_pinconf_group_set,
815 #ifdef CONFIG_DEBUG_FS
816 .pin_config_dbg_show = tegra_pinconf_dbg_show,
817 .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show,
818 .pin_config_config_dbg_show = tegra_pinconf_config_dbg_show,
822 static struct pinctrl_desc tegra_pinctrl_desc = {
823 .pctlops = &tegra_pinctrl_ops,
824 .pmxops = &tegra_pinmux_ops,
825 .confops = &tegra_pinconf_ops,
826 .owner = THIS_MODULE,
829 #ifdef CONFIG_PM_SLEEP
831 static int pinctrl_suspend(void)
834 u32 *pg_data = pmx->pg_data;
837 if (pmx->soc->suspend) {
840 ret = pmx->soc->suspend(pg_data);
842 pinctrl_configure_user_state(pmx->pctl, "suspend");
846 for (i = 0; i < pmx->nbanks; i++) {
848 for (j = 0; j < pmx->regs_size[i] / 4; j++)
849 *pg_data++ = readl(regs++);
854 static void pinctrl_resume(void)
857 u32 *pg_data = pmx->pg_data;
860 if (pmx->soc->resume) {
861 pmx->soc->resume(pg_data);
865 for (i = 0; i < pmx->nbanks; i++) {
867 for (j = 0; j < pmx->regs_size[i] / 4; j++)
868 writel(*pg_data++, regs++);
872 static struct syscore_ops pinctrl_syscore_ops = {
873 .suspend = pinctrl_suspend,
874 .resume = pinctrl_resume,
875 .save = pinctrl_suspend,
876 .restore = pinctrl_resume,
881 static int tegra_pinctrl_get_group(struct tegra_pmx *pmx, const char *name)
885 for (i = 0; i< pmx->soc->ngroups; ++i) {
886 if (!strcmp(pmx->soc->groups[i].name, name))
892 static int tegra_pinctrl_set_config(struct pinctrl_dev *pctldev,
893 int pg, int param, int val)
895 unsigned long config;
897 config = TEGRA_PINCONF_PACK(param, val);
898 return tegra_pinconf_group_set(pmx->pctl, pg, config);
901 static void tegra_pinctrl_default_soc_init(struct tegra_pmx *pmx)
903 struct tegra_pinctrl_group_config_data *cdata;
907 for (i = 0; i < pmx->soc->nconfig_data; ++i) {
908 cdata = &pmx->soc->config_data[i];
909 group = tegra_pinctrl_get_group(pmx, cdata->name);
911 dev_warn(pmx->dev, "Group name %s not found\n",
916 if (pmx->soc->groups[group].hsm_bit >= 0)
917 tegra_pinctrl_set_config(pmx->pctl, group,
918 TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE,
919 cdata->high_speed_mode);
921 if (pmx->soc->groups[group].schmitt_bit >= 0)
922 tegra_pinctrl_set_config(pmx->pctl, group,
923 TEGRA_PINCONF_PARAM_SCHMITT,
926 if (pmx->soc->groups[group].lpmd_bit >= 0)
927 tegra_pinctrl_set_config(pmx->pctl, group,
928 TEGRA_PINCONF_PARAM_LOW_POWER_MODE,
929 cdata->low_power_mode);
931 if (pmx->soc->groups[group].drvdn_bit >= 0)
932 tegra_pinctrl_set_config(pmx->pctl, group,
933 TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH,
934 cdata->pull_down_strength);
936 if (pmx->soc->groups[group].drvup_bit >= 0)
937 tegra_pinctrl_set_config(pmx->pctl, group,
938 TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH,
939 cdata->pull_up_strength);
941 if (pmx->soc->groups[group].slwf_bit >= 0)
942 tegra_pinctrl_set_config(pmx->pctl, group,
943 TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING,
944 cdata->slew_rate_falling);
946 if (pmx->soc->groups[group].slwr_bit >= 0)
947 tegra_pinctrl_set_config(pmx->pctl, group,
948 TEGRA_PINCONF_PARAM_SLEW_RATE_RISING,
949 cdata->slew_rate_rising);
951 if (pmx->soc->groups[group].drvtype_reg >= 0)
952 tegra_pinctrl_set_config(pmx->pctl, group,
953 TEGRA_PINCONF_PARAM_DRIVE_TYPE,
958 int tegra_pinctrl_probe(struct platform_device *pdev,
959 const struct tegra_pinctrl_soc_data *soc_data)
961 struct resource *res;
962 int i, pg_data_size = 0;
964 pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL);
966 dev_err(&pdev->dev, "Can't alloc tegra_pmx\n");
969 pmx->dev = &pdev->dev;
972 pmx->drive_group_start_index = -1;
974 for (i = 0; i < pmx->soc->ngroups; ++i) {
975 if (pmx->soc->groups[i].drv_reg < 0)
977 pmx->drive_group_start_index = i;
981 tegra_pinctrl_desc.name = dev_name(&pdev->dev);
982 tegra_pinctrl_desc.pins = pmx->soc->pins;
983 tegra_pinctrl_desc.npins = pmx->soc->npins;
986 res = platform_get_resource(pdev, IORESOURCE_MEM, i);
989 pg_data_size += resource_size(res);
993 pmx->regs = devm_kzalloc(&pdev->dev, pmx->nbanks * sizeof(*pmx->regs),
996 dev_err(&pdev->dev, "Can't alloc regs pointer\n");
1000 pmx->reg_base = devm_kzalloc(&pdev->dev, pmx->nbanks *
1001 sizeof(*pmx->reg_base), GFP_KERNEL);
1002 if (!pmx->reg_base) {
1003 dev_err(&pdev->dev, "Can't alloc reg_base pointer\n");
1008 #ifdef CONFIG_PM_SLEEP
1009 pmx->regs_size = devm_kzalloc(&pdev->dev,
1010 pmx->nbanks * sizeof(*(pmx->regs_size)),
1012 if (!pmx->regs_size) {
1013 dev_err(&pdev->dev, "Can't alloc regs pointer\n");
1017 pmx->pg_data = devm_kzalloc(&pdev->dev, pg_data_size, GFP_KERNEL);
1018 if (!pmx->pg_data) {
1019 dev_err(&pdev->dev, "Can't alloc pingroup data pointer\n");
1024 for (i = 0; i < pmx->nbanks; i++) {
1025 res = platform_get_resource(pdev, IORESOURCE_MEM, i);
1027 dev_err(&pdev->dev, "Missing MEM resource\n");
1031 if (!devm_request_mem_region(&pdev->dev, res->start,
1033 dev_name(&pdev->dev))) {
1035 "Couldn't request MEM resource %d\n", i);
1039 pmx->reg_base[i] = res->start;
1040 pmx->regs[i] = devm_ioremap(&pdev->dev, res->start,
1041 resource_size(res));
1042 if (!pmx->regs[i]) {
1043 dev_err(&pdev->dev, "Couldn't ioremap regs %d\n", i);
1047 #ifdef CONFIG_PM_SLEEP
1048 pmx->regs_size[i] = resource_size(res);
1052 pmx->pctl = pinctrl_register(&tegra_pinctrl_desc, &pdev->dev, pmx);
1054 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
1058 platform_set_drvdata(pdev, pmx);
1060 tegra_pinctrl_default_soc_init(pmx);
1062 pinctrl_configure_user_state(pmx->pctl, "drive");
1063 pinctrl_configure_user_state(pmx->pctl, "unused");
1065 #ifdef CONFIG_PM_SLEEP
1066 register_syscore_ops(&pinctrl_syscore_ops);
1068 dev_info(&pdev->dev, "Probed Tegra pinctrl driver\n");
1072 EXPORT_SYMBOL_GPL(tegra_pinctrl_probe);
1074 int tegra_pinctrl_remove(struct platform_device *pdev)
1076 struct tegra_pmx *pmx = platform_get_drvdata(pdev);
1078 pinctrl_unregister(pmx->pctl);
1082 EXPORT_SYMBOL_GPL(tegra_pinctrl_remove);
1084 u32 tegra_pinctrl_readl(u32 bank, u32 reg)
1086 return readl(pmx->regs[bank] + reg);
1088 EXPORT_SYMBOL_GPL(tegra_pinctrl_readl);
1090 void tegra_pinctrl_writel(u32 val, u32 bank, u32 reg)
1092 writel(val, pmx->regs[bank] + reg);
1094 EXPORT_SYMBOL_GPL(tegra_pinctrl_writel);
1096 #ifdef CONFIG_DEBUG_FS
1098 #include <linux/debugfs.h>
1099 #include <linux/seq_file.h>
1101 static int dbg_reg_pinmux_show(struct seq_file *s, void *unused)
1108 for (i = 0; i < pmx->soc->ngroups; i++) {
1109 if (pmx->soc->groups[i].drv_reg < 0) {
1110 bank = pmx->soc->groups[i].mux_bank;
1111 offset = pmx->soc->groups[i].mux_reg;
1113 bank = pmx->soc->groups[i].drv_bank;
1114 offset = pmx->soc->groups[i].drv_reg;
1116 reg = pmx_readl(pmx, bank, offset);
1117 seq_printf(s, "Bank: %d Reg: 0x%08x Val: 0x%08x -> %s\n",
1118 bank, pmx->reg_base[bank] + offset, reg,
1119 pmx->soc->groups[i].name);
1124 static int dbg_reg_pinmux_open(struct inode *inode, struct file *file)
1126 return single_open(file, dbg_reg_pinmux_show, &inode->i_private);
1129 static const struct file_operations debug_reg_fops = {
1130 .open = dbg_reg_pinmux_open,
1132 .llseek = seq_lseek,
1133 .release = single_release,
1136 static int __init tegra_pinctrl_debuginit(void)
1141 (void) debugfs_create_file("tegra_pinctrl_reg", S_IRUGO,
1142 NULL, NULL, &debug_reg_fops);
1145 late_initcall(tegra_pinctrl_debuginit);