linux/drivers/pinctrl/tegra/pinctrl-tegra-xusb.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Copyright (c) 2014, NVIDIA CORPORATION.  All rights reserved.
   4 */
   5
   6#include <linux/delay.h>
   7#include <linux/io.h>
   8#include <linux/module.h>
   9#include <linux/of.h>
  10#include <linux/phy/phy.h>
  11#include <linux/pinctrl/pinctrl.h>
  12#include <linux/pinctrl/pinmux.h>
  13#include <linux/platform_device.h>
  14#include <linux/reset.h>
  15#include <linux/slab.h>
  16
  17#include <dt-bindings/pinctrl/pinctrl-tegra-xusb.h>
  18
  19#include "../core.h"
  20#include "../pinctrl-utils.h"
  21
  22#define XUSB_PADCTL_ELPG_PROGRAM 0x01c
  23#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN (1 << 26)
  24#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY (1 << 25)
  25#define XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN (1 << 24)
  26
  27#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1 0x040
  28#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET (1 << 19)
  29#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK (0xf << 12)
  30#define XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST (1 << 1)
  31
  32#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2 0x044
  33#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN (1 << 6)
  34#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN (1 << 5)
  35#define XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL (1 << 4)
  36
  37#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1 0x138
  38#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET (1 << 27)
  39#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE (1 << 24)
  40#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD (1 << 3)
  41#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST (1 << 1)
  42#define XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ (1 << 0)
  43
  44#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1 0x148
  45#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD (1 << 1)
  46#define XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ (1 << 0)
  47
  48struct tegra_xusb_padctl_function {
  49        const char *name;
  50        const char * const *groups;
  51        unsigned int num_groups;
  52};
  53
  54struct tegra_xusb_padctl_soc {
  55        const struct pinctrl_pin_desc *pins;
  56        unsigned int num_pins;
  57
  58        const struct tegra_xusb_padctl_function *functions;
  59        unsigned int num_functions;
  60
  61        const struct tegra_xusb_padctl_lane *lanes;
  62        unsigned int num_lanes;
  63};
  64
  65struct tegra_xusb_padctl_lane {
  66        const char *name;
  67
  68        unsigned int offset;
  69        unsigned int shift;
  70        unsigned int mask;
  71        unsigned int iddq;
  72
  73        const unsigned int *funcs;
  74        unsigned int num_funcs;
  75};
  76
  77struct tegra_xusb_padctl {
  78        struct device *dev;
  79        void __iomem *regs;
  80        struct mutex lock;
  81        struct reset_control *rst;
  82
  83        const struct tegra_xusb_padctl_soc *soc;
  84        struct pinctrl_dev *pinctrl;
  85        struct pinctrl_desc desc;
  86
  87        struct phy_provider *provider;
  88        struct phy *phys[2];
  89
  90        unsigned int enable;
  91};
  92
  93static inline void padctl_writel(struct tegra_xusb_padctl *padctl, u32 value,
  94                                 unsigned long offset)
  95{
  96        writel(value, padctl->regs + offset);
  97}
  98
  99static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
 100                               unsigned long offset)
 101{
 102        return readl(padctl->regs + offset);
 103}
 104
 105static int tegra_xusb_padctl_get_groups_count(struct pinctrl_dev *pinctrl)
 106{
 107        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 108
 109        return padctl->soc->num_pins;
 110}
 111
 112static const char *tegra_xusb_padctl_get_group_name(struct pinctrl_dev *pinctrl,
 113                                                    unsigned int group)
 114{
 115        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 116
 117        return padctl->soc->pins[group].name;
 118}
 119
 120static int tegra_xusb_padctl_get_group_pins(struct pinctrl_dev *pinctrl,
 121                                            unsigned group,
 122                                            const unsigned **pins,
 123                                            unsigned *num_pins)
 124{
 125        /*
 126         * For the tegra-xusb pad controller groups are synonymous
 127         * with lanes/pins and there is always one lane/pin per group.
 128         */
 129        *pins = &pinctrl->desc->pins[group].number;
 130        *num_pins = 1;
 131
 132        return 0;
 133}
 134
 135enum tegra_xusb_padctl_param {
 136        TEGRA_XUSB_PADCTL_IDDQ,
 137};
 138
 139static const struct tegra_xusb_padctl_property {
 140        const char *name;
 141        enum tegra_xusb_padctl_param param;
 142} properties[] = {
 143        { "nvidia,iddq", TEGRA_XUSB_PADCTL_IDDQ },
 144};
 145
 146#define TEGRA_XUSB_PADCTL_PACK(param, value) ((param) << 16 | (value))
 147#define TEGRA_XUSB_PADCTL_UNPACK_PARAM(config) ((config) >> 16)
 148#define TEGRA_XUSB_PADCTL_UNPACK_VALUE(config) ((config) & 0xffff)
 149
 150static int tegra_xusb_padctl_parse_subnode(struct tegra_xusb_padctl *padctl,
 151                                           struct device_node *np,
 152                                           struct pinctrl_map **maps,
 153                                           unsigned int *reserved_maps,
 154                                           unsigned int *num_maps)
 155{
 156        unsigned int i, reserve = 0, num_configs = 0;
 157        unsigned long config, *configs = NULL;
 158        const char *function, *group;
 159        struct property *prop;
 160        int err = 0;
 161        u32 value;
 162
 163        err = of_property_read_string(np, "nvidia,function", &function);
 164        if (err < 0) {
 165                if (err != -EINVAL)
 166                        return err;
 167
 168                function = NULL;
 169        }
 170
 171        for (i = 0; i < ARRAY_SIZE(properties); i++) {
 172                err = of_property_read_u32(np, properties[i].name, &value);
 173                if (err < 0) {
 174                        if (err == -EINVAL)
 175                                continue;
 176
 177                        goto out;
 178                }
 179
 180                config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, value);
 181
 182                err = pinctrl_utils_add_config(padctl->pinctrl, &configs,
 183                                               &num_configs, config);
 184                if (err < 0)
 185                        goto out;
 186        }
 187
 188        if (function)
 189                reserve++;
 190
 191        if (num_configs)
 192                reserve++;
 193
 194        err = of_property_count_strings(np, "nvidia,lanes");
 195        if (err < 0)
 196                goto out;
 197
 198        reserve *= err;
 199
 200        err = pinctrl_utils_reserve_map(padctl->pinctrl, maps, reserved_maps,
 201                                        num_maps, reserve);
 202        if (err < 0)
 203                goto out;
 204
 205        of_property_for_each_string(np, "nvidia,lanes", prop, group) {
 206                if (function) {
 207                        err = pinctrl_utils_add_map_mux(padctl->pinctrl, maps,
 208                                        reserved_maps, num_maps, group,
 209                                        function);
 210                        if (err < 0)
 211                                goto out;
 212                }
 213
 214                if (num_configs) {
 215                        err = pinctrl_utils_add_map_configs(padctl->pinctrl,
 216                                        maps, reserved_maps, num_maps, group,
 217                                        configs, num_configs,
 218                                        PIN_MAP_TYPE_CONFIGS_GROUP);
 219                        if (err < 0)
 220                                goto out;
 221                }
 222        }
 223
 224        err = 0;
 225
 226out:
 227        kfree(configs);
 228        return err;
 229}
 230
 231static int tegra_xusb_padctl_dt_node_to_map(struct pinctrl_dev *pinctrl,
 232                                            struct device_node *parent,
 233                                            struct pinctrl_map **maps,
 234                                            unsigned int *num_maps)
 235{
 236        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 237        unsigned int reserved_maps = 0;
 238        struct device_node *np;
 239        int err;
 240
 241        *num_maps = 0;
 242        *maps = NULL;
 243
 244        for_each_child_of_node(parent, np) {
 245                err = tegra_xusb_padctl_parse_subnode(padctl, np, maps,
 246                                                      &reserved_maps,
 247                                                      num_maps);
 248                if (err < 0) {
 249                        of_node_put(np);
 250                        return err;
 251                }
 252        }
 253
 254        return 0;
 255}
 256
 257static const struct pinctrl_ops tegra_xusb_padctl_pinctrl_ops = {
 258        .get_groups_count = tegra_xusb_padctl_get_groups_count,
 259        .get_group_name = tegra_xusb_padctl_get_group_name,
 260        .get_group_pins = tegra_xusb_padctl_get_group_pins,
 261        .dt_node_to_map = tegra_xusb_padctl_dt_node_to_map,
 262        .dt_free_map = pinctrl_utils_free_map,
 263};
 264
 265static int tegra_xusb_padctl_get_functions_count(struct pinctrl_dev *pinctrl)
 266{
 267        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 268
 269        return padctl->soc->num_functions;
 270}
 271
 272static const char *
 273tegra_xusb_padctl_get_function_name(struct pinctrl_dev *pinctrl,
 274                                    unsigned int function)
 275{
 276        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 277
 278        return padctl->soc->functions[function].name;
 279}
 280
 281static int tegra_xusb_padctl_get_function_groups(struct pinctrl_dev *pinctrl,
 282                                                 unsigned int function,
 283                                                 const char * const **groups,
 284                                                 unsigned * const num_groups)
 285{
 286        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 287
 288        *num_groups = padctl->soc->functions[function].num_groups;
 289        *groups = padctl->soc->functions[function].groups;
 290
 291        return 0;
 292}
 293
 294static int tegra_xusb_padctl_pinmux_set(struct pinctrl_dev *pinctrl,
 295                                        unsigned int function,
 296                                        unsigned int group)
 297{
 298        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 299        const struct tegra_xusb_padctl_lane *lane;
 300        unsigned int i;
 301        u32 value;
 302
 303        lane = &padctl->soc->lanes[group];
 304
 305        for (i = 0; i < lane->num_funcs; i++)
 306                if (lane->funcs[i] == function)
 307                        break;
 308
 309        if (i >= lane->num_funcs)
 310                return -EINVAL;
 311
 312        value = padctl_readl(padctl, lane->offset);
 313        value &= ~(lane->mask << lane->shift);
 314        value |= i << lane->shift;
 315        padctl_writel(padctl, value, lane->offset);
 316
 317        return 0;
 318}
 319
 320static const struct pinmux_ops tegra_xusb_padctl_pinmux_ops = {
 321        .get_functions_count = tegra_xusb_padctl_get_functions_count,
 322        .get_function_name = tegra_xusb_padctl_get_function_name,
 323        .get_function_groups = tegra_xusb_padctl_get_function_groups,
 324        .set_mux = tegra_xusb_padctl_pinmux_set,
 325};
 326
 327static int tegra_xusb_padctl_pinconf_group_get(struct pinctrl_dev *pinctrl,
 328                                               unsigned int group,
 329                                               unsigned long *config)
 330{
 331        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 332        const struct tegra_xusb_padctl_lane *lane;
 333        enum tegra_xusb_padctl_param param;
 334        u32 value;
 335
 336        param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(*config);
 337        lane = &padctl->soc->lanes[group];
 338
 339        switch (param) {
 340        case TEGRA_XUSB_PADCTL_IDDQ:
 341                /* lanes with iddq == 0 don't support this parameter */
 342                if (lane->iddq == 0)
 343                        return -EINVAL;
 344
 345                value = padctl_readl(padctl, lane->offset);
 346
 347                if (value & BIT(lane->iddq))
 348                        value = 0;
 349                else
 350                        value = 1;
 351
 352                *config = TEGRA_XUSB_PADCTL_PACK(param, value);
 353                break;
 354
 355        default:
 356                dev_err(padctl->dev, "invalid configuration parameter: %04x\n",
 357                        param);
 358                return -ENOTSUPP;
 359        }
 360
 361        return 0;
 362}
 363
 364static int tegra_xusb_padctl_pinconf_group_set(struct pinctrl_dev *pinctrl,
 365                                               unsigned int group,
 366                                               unsigned long *configs,
 367                                               unsigned int num_configs)
 368{
 369        struct tegra_xusb_padctl *padctl = pinctrl_dev_get_drvdata(pinctrl);
 370        const struct tegra_xusb_padctl_lane *lane;
 371        enum tegra_xusb_padctl_param param;
 372        unsigned long value;
 373        unsigned int i;
 374        u32 regval;
 375
 376        lane = &padctl->soc->lanes[group];
 377
 378        for (i = 0; i < num_configs; i++) {
 379                param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(configs[i]);
 380                value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(configs[i]);
 381
 382                switch (param) {
 383                case TEGRA_XUSB_PADCTL_IDDQ:
 384                        /* lanes with iddq == 0 don't support this parameter */
 385                        if (lane->iddq == 0)
 386                                return -EINVAL;
 387
 388                        regval = padctl_readl(padctl, lane->offset);
 389
 390                        if (value)
 391                                regval &= ~BIT(lane->iddq);
 392                        else
 393                                regval |= BIT(lane->iddq);
 394
 395                        padctl_writel(padctl, regval, lane->offset);
 396                        break;
 397
 398                default:
 399                        dev_err(padctl->dev,
 400                                "invalid configuration parameter: %04x\n",
 401                                param);
 402                        return -ENOTSUPP;
 403                }
 404        }
 405
 406        return 0;
 407}
 408
 409#ifdef CONFIG_DEBUG_FS
 410static const char *strip_prefix(const char *s)
 411{
 412        const char *comma = strchr(s, ',');
 413        if (!comma)
 414                return s;
 415
 416        return comma + 1;
 417}
 418
 419static void
 420tegra_xusb_padctl_pinconf_group_dbg_show(struct pinctrl_dev *pinctrl,
 421                                         struct seq_file *s,
 422                                         unsigned int group)
 423{
 424        unsigned int i;
 425
 426        for (i = 0; i < ARRAY_SIZE(properties); i++) {
 427                unsigned long config, value;
 428                int err;
 429
 430                config = TEGRA_XUSB_PADCTL_PACK(properties[i].param, 0);
 431
 432                err = tegra_xusb_padctl_pinconf_group_get(pinctrl, group,
 433                                                          &config);
 434                if (err < 0)
 435                        continue;
 436
 437                value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
 438
 439                seq_printf(s, "\n\t%s=%lu\n", strip_prefix(properties[i].name),
 440                           value);
 441        }
 442}
 443
 444static void
 445tegra_xusb_padctl_pinconf_config_dbg_show(struct pinctrl_dev *pinctrl,
 446                                          struct seq_file *s,
 447                                          unsigned long config)
 448{
 449        enum tegra_xusb_padctl_param param;
 450        const char *name = "unknown";
 451        unsigned long value;
 452        unsigned int i;
 453
 454        param = TEGRA_XUSB_PADCTL_UNPACK_PARAM(config);
 455        value = TEGRA_XUSB_PADCTL_UNPACK_VALUE(config);
 456
 457        for (i = 0; i < ARRAY_SIZE(properties); i++) {
 458                if (properties[i].param == param) {
 459                        name = properties[i].name;
 460                        break;
 461                }
 462        }
 463
 464        seq_printf(s, "%s=%lu", strip_prefix(name), value);
 465}
 466#endif
 467
 468static const struct pinconf_ops tegra_xusb_padctl_pinconf_ops = {
 469        .pin_config_group_get = tegra_xusb_padctl_pinconf_group_get,
 470        .pin_config_group_set = tegra_xusb_padctl_pinconf_group_set,
 471#ifdef CONFIG_DEBUG_FS
 472        .pin_config_group_dbg_show = tegra_xusb_padctl_pinconf_group_dbg_show,
 473        .pin_config_config_dbg_show = tegra_xusb_padctl_pinconf_config_dbg_show,
 474#endif
 475};
 476
 477static int tegra_xusb_padctl_enable(struct tegra_xusb_padctl *padctl)
 478{
 479        u32 value;
 480
 481        mutex_lock(&padctl->lock);
 482
 483        if (padctl->enable++ > 0)
 484                goto out;
 485
 486        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 487        value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 488        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 489
 490        usleep_range(100, 200);
 491
 492        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 493        value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 494        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 495
 496        usleep_range(100, 200);
 497
 498        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 499        value &= ~XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 500        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 501
 502out:
 503        mutex_unlock(&padctl->lock);
 504        return 0;
 505}
 506
 507static int tegra_xusb_padctl_disable(struct tegra_xusb_padctl *padctl)
 508{
 509        u32 value;
 510
 511        mutex_lock(&padctl->lock);
 512
 513        if (WARN_ON(padctl->enable == 0))
 514                goto out;
 515
 516        if (--padctl->enable > 0)
 517                goto out;
 518
 519        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 520        value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_VCORE_DOWN;
 521        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 522
 523        usleep_range(100, 200);
 524
 525        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 526        value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN_EARLY;
 527        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 528
 529        usleep_range(100, 200);
 530
 531        value = padctl_readl(padctl, XUSB_PADCTL_ELPG_PROGRAM);
 532        value |= XUSB_PADCTL_ELPG_PROGRAM_AUX_MUX_LP0_CLAMP_EN;
 533        padctl_writel(padctl, value, XUSB_PADCTL_ELPG_PROGRAM);
 534
 535out:
 536        mutex_unlock(&padctl->lock);
 537        return 0;
 538}
 539
 540static int tegra_xusb_phy_init(struct phy *phy)
 541{
 542        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 543
 544        return tegra_xusb_padctl_enable(padctl);
 545}
 546
 547static int tegra_xusb_phy_exit(struct phy *phy)
 548{
 549        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 550
 551        return tegra_xusb_padctl_disable(padctl);
 552}
 553
 554static int pcie_phy_power_on(struct phy *phy)
 555{
 556        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 557        unsigned long timeout;
 558        int err = -ETIMEDOUT;
 559        u32 value;
 560
 561        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 562        value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_REFCLK_SEL_MASK;
 563        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 564
 565        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
 566        value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL2_REFCLKBUF_EN |
 567                 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_EN |
 568                 XUSB_PADCTL_IOPHY_PLL_P0_CTL2_TXCLKREF_SEL;
 569        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL2);
 570
 571        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 572        value |= XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
 573        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 574
 575        timeout = jiffies + msecs_to_jiffies(50);
 576
 577        while (time_before(jiffies, timeout)) {
 578                value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 579                if (value & XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL0_LOCKDET) {
 580                        err = 0;
 581                        break;
 582                }
 583
 584                usleep_range(100, 200);
 585        }
 586
 587        return err;
 588}
 589
 590static int pcie_phy_power_off(struct phy *phy)
 591{
 592        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 593        u32 value;
 594
 595        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 596        value &= ~XUSB_PADCTL_IOPHY_PLL_P0_CTL1_PLL_RST;
 597        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_P0_CTL1);
 598
 599        return 0;
 600}
 601
 602static const struct phy_ops pcie_phy_ops = {
 603        .init = tegra_xusb_phy_init,
 604        .exit = tegra_xusb_phy_exit,
 605        .power_on = pcie_phy_power_on,
 606        .power_off = pcie_phy_power_off,
 607        .owner = THIS_MODULE,
 608};
 609
 610static int sata_phy_power_on(struct phy *phy)
 611{
 612        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 613        unsigned long timeout;
 614        int err = -ETIMEDOUT;
 615        u32 value;
 616
 617        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
 618        value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
 619        value &= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
 620        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
 621
 622        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 623        value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
 624        value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
 625        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 626
 627        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 628        value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
 629        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 630
 631        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 632        value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
 633        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 634
 635        timeout = jiffies + msecs_to_jiffies(50);
 636
 637        while (time_before(jiffies, timeout)) {
 638                value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 639                if (value & XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_LOCKDET) {
 640                        err = 0;
 641                        break;
 642                }
 643
 644                usleep_range(100, 200);
 645        }
 646
 647        return err;
 648}
 649
 650static int sata_phy_power_off(struct phy *phy)
 651{
 652        struct tegra_xusb_padctl *padctl = phy_get_drvdata(phy);
 653        u32 value;
 654
 655        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 656        value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_RST;
 657        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 658
 659        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 660        value &= ~XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL1_MODE;
 661        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 662
 663        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 664        value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_PWR_OVRD;
 665        value |= XUSB_PADCTL_IOPHY_PLL_S0_CTL1_PLL_IDDQ;
 666        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_PLL_S0_CTL1);
 667
 668        value = padctl_readl(padctl, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
 669        value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ_OVRD;
 670        value |= ~XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1_IDDQ;
 671        padctl_writel(padctl, value, XUSB_PADCTL_IOPHY_MISC_PAD_S0_CTL1);
 672
 673        return 0;
 674}
 675
 676static const struct phy_ops sata_phy_ops = {
 677        .init = tegra_xusb_phy_init,
 678        .exit = tegra_xusb_phy_exit,
 679        .power_on = sata_phy_power_on,
 680        .power_off = sata_phy_power_off,
 681        .owner = THIS_MODULE,
 682};
 683
 684static struct phy *tegra_xusb_padctl_xlate(struct device *dev,
 685                                           struct of_phandle_args *args)
 686{
 687        struct tegra_xusb_padctl *padctl = dev_get_drvdata(dev);
 688        unsigned int index = args->args[0];
 689
 690        if (args->args_count <= 0)
 691                return ERR_PTR(-EINVAL);
 692
 693        if (index >= ARRAY_SIZE(padctl->phys))
 694                return ERR_PTR(-EINVAL);
 695
 696        return padctl->phys[index];
 697}
 698
 699#define PIN_OTG_0   0
 700#define PIN_OTG_1   1
 701#define PIN_OTG_2   2
 702#define PIN_ULPI_0  3
 703#define PIN_HSIC_0  4
 704#define PIN_HSIC_1  5
 705#define PIN_PCIE_0  6
 706#define PIN_PCIE_1  7
 707#define PIN_PCIE_2  8
 708#define PIN_PCIE_3  9
 709#define PIN_PCIE_4 10
 710#define PIN_SATA_0 11
 711
 712static const struct pinctrl_pin_desc tegra124_pins[] = {
 713        PINCTRL_PIN(PIN_OTG_0,  "otg-0"),
 714        PINCTRL_PIN(PIN_OTG_1,  "otg-1"),
 715        PINCTRL_PIN(PIN_OTG_2,  "otg-2"),
 716        PINCTRL_PIN(PIN_ULPI_0, "ulpi-0"),
 717        PINCTRL_PIN(PIN_HSIC_0, "hsic-0"),
 718        PINCTRL_PIN(PIN_HSIC_1, "hsic-1"),
 719        PINCTRL_PIN(PIN_PCIE_0, "pcie-0"),
 720        PINCTRL_PIN(PIN_PCIE_1, "pcie-1"),
 721        PINCTRL_PIN(PIN_PCIE_2, "pcie-2"),
 722        PINCTRL_PIN(PIN_PCIE_3, "pcie-3"),
 723        PINCTRL_PIN(PIN_PCIE_4, "pcie-4"),
 724        PINCTRL_PIN(PIN_SATA_0, "sata-0"),
 725};
 726
 727static const char * const tegra124_snps_groups[] = {
 728        "otg-0",
 729        "otg-1",
 730        "otg-2",
 731        "ulpi-0",
 732        "hsic-0",
 733        "hsic-1",
 734};
 735
 736static const char * const tegra124_xusb_groups[] = {
 737        "otg-0",
 738        "otg-1",
 739        "otg-2",
 740        "ulpi-0",
 741        "hsic-0",
 742        "hsic-1",
 743};
 744
 745static const char * const tegra124_uart_groups[] = {
 746        "otg-0",
 747        "otg-1",
 748        "otg-2",
 749};
 750
 751static const char * const tegra124_pcie_groups[] = {
 752        "pcie-0",
 753        "pcie-1",
 754        "pcie-2",
 755        "pcie-3",
 756        "pcie-4",
 757};
 758
 759static const char * const tegra124_usb3_groups[] = {
 760        "pcie-0",
 761        "pcie-1",
 762        "sata-0",
 763};
 764
 765static const char * const tegra124_sata_groups[] = {
 766        "sata-0",
 767};
 768
 769static const char * const tegra124_rsvd_groups[] = {
 770        "otg-0",
 771        "otg-1",
 772        "otg-2",
 773        "pcie-0",
 774        "pcie-1",
 775        "pcie-2",
 776        "pcie-3",
 777        "pcie-4",
 778        "sata-0",
 779};
 780
 781#define TEGRA124_FUNCTION(_name)                                        \
 782        {                                                               \
 783                .name = #_name,                                         \
 784                .num_groups = ARRAY_SIZE(tegra124_##_name##_groups),    \
 785                .groups = tegra124_##_name##_groups,                    \
 786        }
 787
 788static struct tegra_xusb_padctl_function tegra124_functions[] = {
 789        TEGRA124_FUNCTION(snps),
 790        TEGRA124_FUNCTION(xusb),
 791        TEGRA124_FUNCTION(uart),
 792        TEGRA124_FUNCTION(pcie),
 793        TEGRA124_FUNCTION(usb3),
 794        TEGRA124_FUNCTION(sata),
 795        TEGRA124_FUNCTION(rsvd),
 796};
 797
 798enum tegra124_function {
 799        TEGRA124_FUNC_SNPS,
 800        TEGRA124_FUNC_XUSB,
 801        TEGRA124_FUNC_UART,
 802        TEGRA124_FUNC_PCIE,
 803        TEGRA124_FUNC_USB3,
 804        TEGRA124_FUNC_SATA,
 805        TEGRA124_FUNC_RSVD,
 806};
 807
 808static const unsigned int tegra124_otg_functions[] = {
 809        TEGRA124_FUNC_SNPS,
 810        TEGRA124_FUNC_XUSB,
 811        TEGRA124_FUNC_UART,
 812        TEGRA124_FUNC_RSVD,
 813};
 814
 815static const unsigned int tegra124_usb_functions[] = {
 816        TEGRA124_FUNC_SNPS,
 817        TEGRA124_FUNC_XUSB,
 818};
 819
 820static const unsigned int tegra124_pci_functions[] = {
 821        TEGRA124_FUNC_PCIE,
 822        TEGRA124_FUNC_USB3,
 823        TEGRA124_FUNC_SATA,
 824        TEGRA124_FUNC_RSVD,
 825};
 826
 827#define TEGRA124_LANE(_name, _offset, _shift, _mask, _iddq, _funcs)     \
 828        {                                                               \
 829                .name = _name,                                          \
 830                .offset = _offset,                                      \
 831                .shift = _shift,                                        \
 832                .mask = _mask,                                          \
 833                .iddq = _iddq,                                          \
 834                .num_funcs = ARRAY_SIZE(tegra124_##_funcs##_functions), \
 835                .funcs = tegra124_##_funcs##_functions,                 \
 836        }
 837
 838static const struct tegra_xusb_padctl_lane tegra124_lanes[] = {
 839        TEGRA124_LANE("otg-0",  0x004,  0, 0x3, 0, otg),
 840        TEGRA124_LANE("otg-1",  0x004,  2, 0x3, 0, otg),
 841        TEGRA124_LANE("otg-2",  0x004,  4, 0x3, 0, otg),
 842        TEGRA124_LANE("ulpi-0", 0x004, 12, 0x1, 0, usb),
 843        TEGRA124_LANE("hsic-0", 0x004, 14, 0x1, 0, usb),
 844        TEGRA124_LANE("hsic-1", 0x004, 15, 0x1, 0, usb),
 845        TEGRA124_LANE("pcie-0", 0x134, 16, 0x3, 1, pci),
 846        TEGRA124_LANE("pcie-1", 0x134, 18, 0x3, 2, pci),
 847        TEGRA124_LANE("pcie-2", 0x134, 20, 0x3, 3, pci),
 848        TEGRA124_LANE("pcie-3", 0x134, 22, 0x3, 4, pci),
 849        TEGRA124_LANE("pcie-4", 0x134, 24, 0x3, 5, pci),
 850        TEGRA124_LANE("sata-0", 0x134, 26, 0x3, 6, pci),
 851};
 852
 853static const struct tegra_xusb_padctl_soc tegra124_soc = {
 854        .num_pins = ARRAY_SIZE(tegra124_pins),
 855        .pins = tegra124_pins,
 856        .num_functions = ARRAY_SIZE(tegra124_functions),
 857        .functions = tegra124_functions,
 858        .num_lanes = ARRAY_SIZE(tegra124_lanes),
 859        .lanes = tegra124_lanes,
 860};
 861
 862static const struct of_device_id tegra_xusb_padctl_of_match[] = {
 863        { .compatible = "nvidia,tegra124-xusb-padctl", .data = &tegra124_soc },
 864        { }
 865};
 866MODULE_DEVICE_TABLE(of, tegra_xusb_padctl_of_match);
 867
 868/* predeclare these in order to silence sparse */
 869int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev);
 870int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev);
 871
 872int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev)
 873{
 874        struct tegra_xusb_padctl *padctl;
 875        const struct of_device_id *match;
 876        struct phy *phy;
 877        int err;
 878
 879        padctl = devm_kzalloc(&pdev->dev, sizeof(*padctl), GFP_KERNEL);
 880        if (!padctl)
 881                return -ENOMEM;
 882
 883        platform_set_drvdata(pdev, padctl);
 884        mutex_init(&padctl->lock);
 885        padctl->dev = &pdev->dev;
 886
 887        /*
 888         * Note that we can't replace this by of_device_get_match_data()
 889         * because we need the separate matching table for this legacy code on
 890         * Tegra124. of_device_get_match_data() would attempt to use the table
 891         * from the updated driver and fail.
 892         */
 893        match = of_match_node(tegra_xusb_padctl_of_match, pdev->dev.of_node);
 894        padctl->soc = match->data;
 895
 896        padctl->regs = devm_platform_ioremap_resource(pdev, 0);
 897        if (IS_ERR(padctl->regs))
 898                return PTR_ERR(padctl->regs);
 899
 900        padctl->rst = devm_reset_control_get_exclusive(&pdev->dev, NULL);
 901        if (IS_ERR(padctl->rst))
 902                return PTR_ERR(padctl->rst);
 903
 904        err = reset_control_deassert(padctl->rst);
 905        if (err < 0)
 906                return err;
 907
 908        memset(&padctl->desc, 0, sizeof(padctl->desc));
 909        padctl->desc.name = dev_name(padctl->dev);
 910        padctl->desc.pins = tegra124_pins;
 911        padctl->desc.npins = ARRAY_SIZE(tegra124_pins);
 912        padctl->desc.pctlops = &tegra_xusb_padctl_pinctrl_ops;
 913        padctl->desc.pmxops = &tegra_xusb_padctl_pinmux_ops;
 914        padctl->desc.confops = &tegra_xusb_padctl_pinconf_ops;
 915        padctl->desc.owner = THIS_MODULE;
 916
 917        padctl->pinctrl = devm_pinctrl_register(&pdev->dev, &padctl->desc,
 918                                                padctl);
 919        if (IS_ERR(padctl->pinctrl)) {
 920                dev_err(&pdev->dev, "failed to register pincontrol\n");
 921                err = PTR_ERR(padctl->pinctrl);
 922                goto reset;
 923        }
 924
 925        phy = devm_phy_create(&pdev->dev, NULL, &pcie_phy_ops);
 926        if (IS_ERR(phy)) {
 927                err = PTR_ERR(phy);
 928                goto reset;
 929        }
 930
 931        padctl->phys[TEGRA_XUSB_PADCTL_PCIE] = phy;
 932        phy_set_drvdata(phy, padctl);
 933
 934        phy = devm_phy_create(&pdev->dev, NULL, &sata_phy_ops);
 935        if (IS_ERR(phy)) {
 936                err = PTR_ERR(phy);
 937                goto reset;
 938        }
 939
 940        padctl->phys[TEGRA_XUSB_PADCTL_SATA] = phy;
 941        phy_set_drvdata(phy, padctl);
 942
 943        padctl->provider = devm_of_phy_provider_register(&pdev->dev,
 944                                                         tegra_xusb_padctl_xlate);
 945        if (IS_ERR(padctl->provider)) {
 946                err = PTR_ERR(padctl->provider);
 947                dev_err(&pdev->dev, "failed to register PHYs: %d\n", err);
 948                goto reset;
 949        }
 950
 951        return 0;
 952
 953reset:
 954        reset_control_assert(padctl->rst);
 955        return err;
 956}
 957EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_probe);
 958
 959int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev)
 960{
 961        struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev);
 962        int err;
 963
 964        err = reset_control_assert(padctl->rst);
 965        if (err < 0)
 966                dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
 967
 968        return err;
 969}
 970EXPORT_SYMBOL_GPL(tegra_xusb_padctl_legacy_remove);
 971