Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.16-rc6 725 lines 18 kB view raw
1/* 2 * Driver for the NVIDIA Tegra pinmux 3 * 4 * Copyright (c) 2011-2012, NVIDIA CORPORATION. All rights reserved. 5 * 6 * Derived from code: 7 * Copyright (C) 2010 Google, Inc. 8 * Copyright (C) 2010 NVIDIA Corporation 9 * Copyright (C) 2009-2011 ST-Ericsson AB 10 * 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. 14 * 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 18 * more details. 19 */ 20 21#include <linux/err.h> 22#include <linux/init.h> 23#include <linux/io.h> 24#include <linux/module.h> 25#include <linux/of.h> 26#include <linux/platform_device.h> 27#include <linux/pinctrl/machine.h> 28#include <linux/pinctrl/pinctrl.h> 29#include <linux/pinctrl/pinmux.h> 30#include <linux/pinctrl/pinconf.h> 31#include <linux/slab.h> 32 33#include "core.h" 34#include "pinctrl-tegra.h" 35#include "pinctrl-utils.h" 36 37struct tegra_pmx { 38 struct device *dev; 39 struct pinctrl_dev *pctl; 40 41 const struct tegra_pinctrl_soc_data *soc; 42 const char **group_pins; 43 44 int nbanks; 45 void __iomem **regs; 46}; 47 48static inline u32 pmx_readl(struct tegra_pmx *pmx, u32 bank, u32 reg) 49{ 50 return readl(pmx->regs[bank] + reg); 51} 52 53static inline void pmx_writel(struct tegra_pmx *pmx, u32 val, u32 bank, u32 reg) 54{ 55 writel(val, pmx->regs[bank] + reg); 56} 57 58static int tegra_pinctrl_get_groups_count(struct pinctrl_dev *pctldev) 59{ 60 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 61 62 return pmx->soc->ngroups; 63} 64 65static const char *tegra_pinctrl_get_group_name(struct pinctrl_dev *pctldev, 66 unsigned group) 67{ 68 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 69 70 return pmx->soc->groups[group].name; 71} 72 73static int tegra_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, 74 unsigned group, 75 const unsigned **pins, 76 unsigned *num_pins) 77{ 78 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 79 80 *pins = pmx->soc->groups[group].pins; 81 *num_pins = pmx->soc->groups[group].npins; 82 83 return 0; 84} 85 86#ifdef CONFIG_DEBUG_FS 87static void tegra_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, 88 struct seq_file *s, 89 unsigned offset) 90{ 91 seq_printf(s, " %s", dev_name(pctldev->dev)); 92} 93#endif 94 95static const struct cfg_param { 96 const char *property; 97 enum tegra_pinconf_param param; 98} cfg_params[] = { 99 {"nvidia,pull", TEGRA_PINCONF_PARAM_PULL}, 100 {"nvidia,tristate", TEGRA_PINCONF_PARAM_TRISTATE}, 101 {"nvidia,enable-input", TEGRA_PINCONF_PARAM_ENABLE_INPUT}, 102 {"nvidia,open-drain", TEGRA_PINCONF_PARAM_OPEN_DRAIN}, 103 {"nvidia,lock", TEGRA_PINCONF_PARAM_LOCK}, 104 {"nvidia,io-reset", TEGRA_PINCONF_PARAM_IORESET}, 105 {"nvidia,rcv-sel", TEGRA_PINCONF_PARAM_RCV_SEL}, 106 {"nvidia,high-speed-mode", TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE}, 107 {"nvidia,schmitt", TEGRA_PINCONF_PARAM_SCHMITT}, 108 {"nvidia,low-power-mode", TEGRA_PINCONF_PARAM_LOW_POWER_MODE}, 109 {"nvidia,pull-down-strength", TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH}, 110 {"nvidia,pull-up-strength", TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH}, 111 {"nvidia,slew-rate-falling", TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING}, 112 {"nvidia,slew-rate-rising", TEGRA_PINCONF_PARAM_SLEW_RATE_RISING}, 113 {"nvidia,drive-type", TEGRA_PINCONF_PARAM_DRIVE_TYPE}, 114}; 115 116static int tegra_pinctrl_dt_subnode_to_map(struct pinctrl_dev *pctldev, 117 struct device_node *np, 118 struct pinctrl_map **map, 119 unsigned *reserved_maps, 120 unsigned *num_maps) 121{ 122 struct device *dev = pctldev->dev; 123 int ret, i; 124 const char *function; 125 u32 val; 126 unsigned long config; 127 unsigned long *configs = NULL; 128 unsigned num_configs = 0; 129 unsigned reserve; 130 struct property *prop; 131 const char *group; 132 133 ret = of_property_read_string(np, "nvidia,function", &function); 134 if (ret < 0) { 135 /* EINVAL=missing, which is fine since it's optional */ 136 if (ret != -EINVAL) 137 dev_err(dev, 138 "could not parse property nvidia,function\n"); 139 function = NULL; 140 } 141 142 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { 143 ret = of_property_read_u32(np, cfg_params[i].property, &val); 144 if (!ret) { 145 config = TEGRA_PINCONF_PACK(cfg_params[i].param, val); 146 ret = pinctrl_utils_add_config(pctldev, &configs, 147 &num_configs, config); 148 if (ret < 0) 149 goto exit; 150 /* EINVAL=missing, which is fine since it's optional */ 151 } else if (ret != -EINVAL) { 152 dev_err(dev, "could not parse property %s\n", 153 cfg_params[i].property); 154 } 155 } 156 157 reserve = 0; 158 if (function != NULL) 159 reserve++; 160 if (num_configs) 161 reserve++; 162 ret = of_property_count_strings(np, "nvidia,pins"); 163 if (ret < 0) { 164 dev_err(dev, "could not parse property nvidia,pins\n"); 165 goto exit; 166 } 167 reserve *= ret; 168 169 ret = pinctrl_utils_reserve_map(pctldev, map, reserved_maps, 170 num_maps, reserve); 171 if (ret < 0) 172 goto exit; 173 174 of_property_for_each_string(np, "nvidia,pins", prop, group) { 175 if (function) { 176 ret = pinctrl_utils_add_map_mux(pctldev, map, 177 reserved_maps, num_maps, group, 178 function); 179 if (ret < 0) 180 goto exit; 181 } 182 183 if (num_configs) { 184 ret = pinctrl_utils_add_map_configs(pctldev, map, 185 reserved_maps, num_maps, group, 186 configs, num_configs, 187 PIN_MAP_TYPE_CONFIGS_GROUP); 188 if (ret < 0) 189 goto exit; 190 } 191 } 192 193 ret = 0; 194 195exit: 196 kfree(configs); 197 return ret; 198} 199 200static int tegra_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, 201 struct device_node *np_config, 202 struct pinctrl_map **map, 203 unsigned *num_maps) 204{ 205 unsigned reserved_maps; 206 struct device_node *np; 207 int ret; 208 209 reserved_maps = 0; 210 *map = NULL; 211 *num_maps = 0; 212 213 for_each_child_of_node(np_config, np) { 214 ret = tegra_pinctrl_dt_subnode_to_map(pctldev, np, map, 215 &reserved_maps, num_maps); 216 if (ret < 0) { 217 pinctrl_utils_dt_free_map(pctldev, *map, 218 *num_maps); 219 return ret; 220 } 221 } 222 223 return 0; 224} 225 226static const struct pinctrl_ops tegra_pinctrl_ops = { 227 .get_groups_count = tegra_pinctrl_get_groups_count, 228 .get_group_name = tegra_pinctrl_get_group_name, 229 .get_group_pins = tegra_pinctrl_get_group_pins, 230#ifdef CONFIG_DEBUG_FS 231 .pin_dbg_show = tegra_pinctrl_pin_dbg_show, 232#endif 233 .dt_node_to_map = tegra_pinctrl_dt_node_to_map, 234 .dt_free_map = pinctrl_utils_dt_free_map, 235}; 236 237static int tegra_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) 238{ 239 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 240 241 return pmx->soc->nfunctions; 242} 243 244static const char *tegra_pinctrl_get_func_name(struct pinctrl_dev *pctldev, 245 unsigned function) 246{ 247 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 248 249 return pmx->soc->functions[function].name; 250} 251 252static int tegra_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, 253 unsigned function, 254 const char * const **groups, 255 unsigned * const num_groups) 256{ 257 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 258 259 *groups = pmx->soc->functions[function].groups; 260 *num_groups = pmx->soc->functions[function].ngroups; 261 262 return 0; 263} 264 265static int tegra_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function, 266 unsigned group) 267{ 268 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 269 const struct tegra_pingroup *g; 270 int i; 271 u32 val; 272 273 g = &pmx->soc->groups[group]; 274 275 if (WARN_ON(g->mux_reg < 0)) 276 return -EINVAL; 277 278 for (i = 0; i < ARRAY_SIZE(g->funcs); i++) { 279 if (g->funcs[i] == function) 280 break; 281 } 282 if (WARN_ON(i == ARRAY_SIZE(g->funcs))) 283 return -EINVAL; 284 285 val = pmx_readl(pmx, g->mux_bank, g->mux_reg); 286 val &= ~(0x3 << g->mux_bit); 287 val |= i << g->mux_bit; 288 pmx_writel(pmx, val, g->mux_bank, g->mux_reg); 289 290 return 0; 291} 292 293static void tegra_pinctrl_disable(struct pinctrl_dev *pctldev, 294 unsigned function, unsigned group) 295{ 296 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 297 const struct tegra_pingroup *g; 298 299 g = &pmx->soc->groups[group]; 300 301 if (WARN_ON(g->mux_reg < 0)) 302 return; 303} 304 305static const struct pinmux_ops tegra_pinmux_ops = { 306 .get_functions_count = tegra_pinctrl_get_funcs_count, 307 .get_function_name = tegra_pinctrl_get_func_name, 308 .get_function_groups = tegra_pinctrl_get_func_groups, 309 .enable = tegra_pinctrl_enable, 310 .disable = tegra_pinctrl_disable, 311}; 312 313static int tegra_pinconf_reg(struct tegra_pmx *pmx, 314 const struct tegra_pingroup *g, 315 enum tegra_pinconf_param param, 316 bool report_err, 317 s8 *bank, s16 *reg, s8 *bit, s8 *width) 318{ 319 switch (param) { 320 case TEGRA_PINCONF_PARAM_PULL: 321 *bank = g->pupd_bank; 322 *reg = g->pupd_reg; 323 *bit = g->pupd_bit; 324 *width = 2; 325 break; 326 case TEGRA_PINCONF_PARAM_TRISTATE: 327 *bank = g->tri_bank; 328 *reg = g->tri_reg; 329 *bit = g->tri_bit; 330 *width = 1; 331 break; 332 case TEGRA_PINCONF_PARAM_ENABLE_INPUT: 333 *bank = g->mux_bank; 334 *reg = g->mux_reg; 335 *bit = g->einput_bit; 336 *width = 1; 337 break; 338 case TEGRA_PINCONF_PARAM_OPEN_DRAIN: 339 *bank = g->mux_bank; 340 *reg = g->mux_reg; 341 *bit = g->odrain_bit; 342 *width = 1; 343 break; 344 case TEGRA_PINCONF_PARAM_LOCK: 345 *bank = g->mux_bank; 346 *reg = g->mux_reg; 347 *bit = g->lock_bit; 348 *width = 1; 349 break; 350 case TEGRA_PINCONF_PARAM_IORESET: 351 *bank = g->mux_bank; 352 *reg = g->mux_reg; 353 *bit = g->ioreset_bit; 354 *width = 1; 355 break; 356 case TEGRA_PINCONF_PARAM_RCV_SEL: 357 *bank = g->mux_bank; 358 *reg = g->mux_reg; 359 *bit = g->rcv_sel_bit; 360 *width = 1; 361 break; 362 case TEGRA_PINCONF_PARAM_HIGH_SPEED_MODE: 363 *bank = g->drv_bank; 364 *reg = g->drv_reg; 365 *bit = g->hsm_bit; 366 *width = 1; 367 break; 368 case TEGRA_PINCONF_PARAM_SCHMITT: 369 *bank = g->drv_bank; 370 *reg = g->drv_reg; 371 *bit = g->schmitt_bit; 372 *width = 1; 373 break; 374 case TEGRA_PINCONF_PARAM_LOW_POWER_MODE: 375 *bank = g->drv_bank; 376 *reg = g->drv_reg; 377 *bit = g->lpmd_bit; 378 *width = 2; 379 break; 380 case TEGRA_PINCONF_PARAM_DRIVE_DOWN_STRENGTH: 381 *bank = g->drv_bank; 382 *reg = g->drv_reg; 383 *bit = g->drvdn_bit; 384 *width = g->drvdn_width; 385 break; 386 case TEGRA_PINCONF_PARAM_DRIVE_UP_STRENGTH: 387 *bank = g->drv_bank; 388 *reg = g->drv_reg; 389 *bit = g->drvup_bit; 390 *width = g->drvup_width; 391 break; 392 case TEGRA_PINCONF_PARAM_SLEW_RATE_FALLING: 393 *bank = g->drv_bank; 394 *reg = g->drv_reg; 395 *bit = g->slwf_bit; 396 *width = g->slwf_width; 397 break; 398 case TEGRA_PINCONF_PARAM_SLEW_RATE_RISING: 399 *bank = g->drv_bank; 400 *reg = g->drv_reg; 401 *bit = g->slwr_bit; 402 *width = g->slwr_width; 403 break; 404 case TEGRA_PINCONF_PARAM_DRIVE_TYPE: 405 *bank = g->drv_bank; 406 *reg = g->drv_reg; 407 *bit = g->drvtype_bit; 408 *width = 2; 409 break; 410 default: 411 dev_err(pmx->dev, "Invalid config param %04x\n", param); 412 return -ENOTSUPP; 413 } 414 415 if (*reg < 0 || *bit > 31) { 416 if (report_err) { 417 const char *prop = "unknown"; 418 int i; 419 420 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { 421 if (cfg_params[i].param == param) { 422 prop = cfg_params[i].property; 423 break; 424 } 425 } 426 427 dev_err(pmx->dev, 428 "Config param %04x (%s) not supported on group %s\n", 429 param, prop, g->name); 430 } 431 return -ENOTSUPP; 432 } 433 434 return 0; 435} 436 437static int tegra_pinconf_get(struct pinctrl_dev *pctldev, 438 unsigned pin, unsigned long *config) 439{ 440 dev_err(pctldev->dev, "pin_config_get op not supported\n"); 441 return -ENOTSUPP; 442} 443 444static int tegra_pinconf_set(struct pinctrl_dev *pctldev, 445 unsigned pin, unsigned long *configs, 446 unsigned num_configs) 447{ 448 dev_err(pctldev->dev, "pin_config_set op not supported\n"); 449 return -ENOTSUPP; 450} 451 452static int tegra_pinconf_group_get(struct pinctrl_dev *pctldev, 453 unsigned group, unsigned long *config) 454{ 455 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 456 enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(*config); 457 u16 arg; 458 const struct tegra_pingroup *g; 459 int ret; 460 s8 bank, bit, width; 461 s16 reg; 462 u32 val, mask; 463 464 g = &pmx->soc->groups[group]; 465 466 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit, 467 &width); 468 if (ret < 0) 469 return ret; 470 471 val = pmx_readl(pmx, bank, reg); 472 mask = (1 << width) - 1; 473 arg = (val >> bit) & mask; 474 475 *config = TEGRA_PINCONF_PACK(param, arg); 476 477 return 0; 478} 479 480static int tegra_pinconf_group_set(struct pinctrl_dev *pctldev, 481 unsigned group, unsigned long *configs, 482 unsigned num_configs) 483{ 484 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 485 enum tegra_pinconf_param param; 486 u16 arg; 487 const struct tegra_pingroup *g; 488 int ret, i; 489 s8 bank, bit, width; 490 s16 reg; 491 u32 val, mask; 492 493 g = &pmx->soc->groups[group]; 494 495 for (i = 0; i < num_configs; i++) { 496 param = TEGRA_PINCONF_UNPACK_PARAM(configs[i]); 497 arg = TEGRA_PINCONF_UNPACK_ARG(configs[i]); 498 499 ret = tegra_pinconf_reg(pmx, g, param, true, &bank, &reg, &bit, 500 &width); 501 if (ret < 0) 502 return ret; 503 504 val = pmx_readl(pmx, bank, reg); 505 506 /* LOCK can't be cleared */ 507 if (param == TEGRA_PINCONF_PARAM_LOCK) { 508 if ((val & BIT(bit)) && !arg) { 509 dev_err(pctldev->dev, "LOCK bit cannot be cleared\n"); 510 return -EINVAL; 511 } 512 } 513 514 /* Special-case Boolean values; allow any non-zero as true */ 515 if (width == 1) 516 arg = !!arg; 517 518 /* Range-check user-supplied value */ 519 mask = (1 << width) - 1; 520 if (arg & ~mask) { 521 dev_err(pctldev->dev, 522 "config %lx: %x too big for %d bit register\n", 523 configs[i], arg, width); 524 return -EINVAL; 525 } 526 527 /* Update register */ 528 val &= ~(mask << bit); 529 val |= arg << bit; 530 pmx_writel(pmx, val, bank, reg); 531 } /* for each config */ 532 533 return 0; 534} 535 536#ifdef CONFIG_DEBUG_FS 537static void tegra_pinconf_dbg_show(struct pinctrl_dev *pctldev, 538 struct seq_file *s, unsigned offset) 539{ 540} 541 542static const char *strip_prefix(const char *s) 543{ 544 const char *comma = strchr(s, ','); 545 if (!comma) 546 return s; 547 548 return comma + 1; 549} 550 551static void tegra_pinconf_group_dbg_show(struct pinctrl_dev *pctldev, 552 struct seq_file *s, unsigned group) 553{ 554 struct tegra_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); 555 const struct tegra_pingroup *g; 556 int i, ret; 557 s8 bank, bit, width; 558 s16 reg; 559 u32 val; 560 561 g = &pmx->soc->groups[group]; 562 563 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { 564 ret = tegra_pinconf_reg(pmx, g, cfg_params[i].param, false, 565 &bank, &reg, &bit, &width); 566 if (ret < 0) 567 continue; 568 569 val = pmx_readl(pmx, bank, reg); 570 val >>= bit; 571 val &= (1 << width) - 1; 572 573 seq_printf(s, "\n\t%s=%u", 574 strip_prefix(cfg_params[i].property), val); 575 } 576} 577 578static void tegra_pinconf_config_dbg_show(struct pinctrl_dev *pctldev, 579 struct seq_file *s, 580 unsigned long config) 581{ 582 enum tegra_pinconf_param param = TEGRA_PINCONF_UNPACK_PARAM(config); 583 u16 arg = TEGRA_PINCONF_UNPACK_ARG(config); 584 const char *pname = "unknown"; 585 int i; 586 587 for (i = 0; i < ARRAY_SIZE(cfg_params); i++) { 588 if (cfg_params[i].param == param) { 589 pname = cfg_params[i].property; 590 break; 591 } 592 } 593 594 seq_printf(s, "%s=%d", strip_prefix(pname), arg); 595} 596#endif 597 598static const struct pinconf_ops tegra_pinconf_ops = { 599 .pin_config_get = tegra_pinconf_get, 600 .pin_config_set = tegra_pinconf_set, 601 .pin_config_group_get = tegra_pinconf_group_get, 602 .pin_config_group_set = tegra_pinconf_group_set, 603#ifdef CONFIG_DEBUG_FS 604 .pin_config_dbg_show = tegra_pinconf_dbg_show, 605 .pin_config_group_dbg_show = tegra_pinconf_group_dbg_show, 606 .pin_config_config_dbg_show = tegra_pinconf_config_dbg_show, 607#endif 608}; 609 610static struct pinctrl_gpio_range tegra_pinctrl_gpio_range = { 611 .name = "Tegra GPIOs", 612 .id = 0, 613 .base = 0, 614}; 615 616static struct pinctrl_desc tegra_pinctrl_desc = { 617 .pctlops = &tegra_pinctrl_ops, 618 .pmxops = &tegra_pinmux_ops, 619 .confops = &tegra_pinconf_ops, 620 .owner = THIS_MODULE, 621}; 622 623int tegra_pinctrl_probe(struct platform_device *pdev, 624 const struct tegra_pinctrl_soc_data *soc_data) 625{ 626 struct tegra_pmx *pmx; 627 struct resource *res; 628 int i; 629 const char **group_pins; 630 int fn, gn, gfn; 631 632 pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); 633 if (!pmx) { 634 dev_err(&pdev->dev, "Can't alloc tegra_pmx\n"); 635 return -ENOMEM; 636 } 637 pmx->dev = &pdev->dev; 638 pmx->soc = soc_data; 639 640 /* 641 * Each mux group will appear in 4 functions' list of groups. 642 * This over-allocates slightly, since not all groups are mux groups. 643 */ 644 pmx->group_pins = devm_kzalloc(&pdev->dev, 645 soc_data->ngroups * 4 * sizeof(*pmx->group_pins), 646 GFP_KERNEL); 647 if (!pmx->group_pins) 648 return -ENOMEM; 649 650 group_pins = pmx->group_pins; 651 for (fn = 0; fn < soc_data->nfunctions; fn++) { 652 struct tegra_function *func = &soc_data->functions[fn]; 653 654 func->groups = group_pins; 655 656 for (gn = 0; gn < soc_data->ngroups; gn++) { 657 const struct tegra_pingroup *g = &soc_data->groups[gn]; 658 659 if (g->mux_reg == -1) 660 continue; 661 662 for (gfn = 0; gfn < 4; gfn++) 663 if (g->funcs[gfn] == fn) 664 break; 665 if (gfn == 4) 666 continue; 667 668 BUG_ON(group_pins - pmx->group_pins >= 669 soc_data->ngroups * 4); 670 *group_pins++ = g->name; 671 func->ngroups++; 672 } 673 } 674 675 tegra_pinctrl_gpio_range.npins = pmx->soc->ngpios; 676 tegra_pinctrl_desc.name = dev_name(&pdev->dev); 677 tegra_pinctrl_desc.pins = pmx->soc->pins; 678 tegra_pinctrl_desc.npins = pmx->soc->npins; 679 680 for (i = 0; ; i++) { 681 res = platform_get_resource(pdev, IORESOURCE_MEM, i); 682 if (!res) 683 break; 684 } 685 pmx->nbanks = i; 686 687 pmx->regs = devm_kzalloc(&pdev->dev, pmx->nbanks * sizeof(*pmx->regs), 688 GFP_KERNEL); 689 if (!pmx->regs) { 690 dev_err(&pdev->dev, "Can't alloc regs pointer\n"); 691 return -ENOMEM; 692 } 693 694 for (i = 0; i < pmx->nbanks; i++) { 695 res = platform_get_resource(pdev, IORESOURCE_MEM, i); 696 pmx->regs[i] = devm_ioremap_resource(&pdev->dev, res); 697 if (IS_ERR(pmx->regs[i])) 698 return PTR_ERR(pmx->regs[i]); 699 } 700 701 pmx->pctl = pinctrl_register(&tegra_pinctrl_desc, &pdev->dev, pmx); 702 if (!pmx->pctl) { 703 dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); 704 return -ENODEV; 705 } 706 707 pinctrl_add_gpio_range(pmx->pctl, &tegra_pinctrl_gpio_range); 708 709 platform_set_drvdata(pdev, pmx); 710 711 dev_dbg(&pdev->dev, "Probed Tegra pinctrl driver\n"); 712 713 return 0; 714} 715EXPORT_SYMBOL_GPL(tegra_pinctrl_probe); 716 717int tegra_pinctrl_remove(struct platform_device *pdev) 718{ 719 struct tegra_pmx *pmx = platform_get_drvdata(pdev); 720 721 pinctrl_unregister(pmx->pctl); 722 723 return 0; 724} 725EXPORT_SYMBOL_GPL(tegra_pinctrl_remove);