linux/drivers/phy/tegra/xusb.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2014-2015, NVIDIA CORPORATION.  All rights reserved.
   3 *
   4 * This program is free software; you can redistribute it and/or modify it
   5 * under the terms and conditions of the GNU General Public License,
   6 * version 2, as published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope it will be useful, but WITHOUT
   9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  10 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
  11 * more details.
  12 */
  13
  14#include <linux/delay.h>
  15#include <linux/io.h>
  16#include <linux/mailbox_client.h>
  17#include <linux/module.h>
  18#include <linux/of.h>
  19#include <linux/of_device.h>
  20#include <linux/phy/phy.h>
  21#include <linux/phy/tegra/xusb.h>
  22#include <linux/platform_device.h>
  23#include <linux/regulator/consumer.h>
  24#include <linux/reset.h>
  25#include <linux/slab.h>
  26#include <linux/workqueue.h>
  27
  28#include <soc/tegra/fuse.h>
  29
  30#include "xusb.h"
  31
  32static struct phy *tegra_xusb_pad_of_xlate(struct device *dev,
  33                                           struct of_phandle_args *args)
  34{
  35        struct tegra_xusb_pad *pad = dev_get_drvdata(dev);
  36        struct phy *phy = NULL;
  37        unsigned int i;
  38
  39        if (args->args_count != 0)
  40                return ERR_PTR(-EINVAL);
  41
  42        for (i = 0; i < pad->soc->num_lanes; i++) {
  43                if (!pad->lanes[i])
  44                        continue;
  45
  46                if (pad->lanes[i]->dev.of_node == args->np) {
  47                        phy = pad->lanes[i];
  48                        break;
  49                }
  50        }
  51
  52        if (phy == NULL)
  53                phy = ERR_PTR(-ENODEV);
  54
  55        return phy;
  56}
  57
  58static const struct of_device_id tegra_xusb_padctl_of_match[] = {
  59#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
  60        {
  61                .compatible = "nvidia,tegra124-xusb-padctl",
  62                .data = &tegra124_xusb_padctl_soc,
  63        },
  64#endif
  65#if defined(CONFIG_ARCH_TEGRA_210_SOC)
  66        {
  67                .compatible = "nvidia,tegra210-xusb-padctl",
  68                .data = &tegra210_xusb_padctl_soc,
  69        },
  70#endif
  71        { }
  72};
  73MODULE_DEVICE_TABLE(of, tegra_xusb_padctl_of_match);
  74
  75static struct device_node *
  76tegra_xusb_find_pad_node(struct tegra_xusb_padctl *padctl, const char *name)
  77{
  78        /*
  79         * of_find_node_by_name() drops a reference, so make sure to grab one.
  80         */
  81        struct device_node *np = of_node_get(padctl->dev->of_node);
  82
  83        np = of_find_node_by_name(np, "pads");
  84        if (np)
  85                np = of_find_node_by_name(np, name);
  86
  87        return np;
  88}
  89
  90static struct device_node *
  91tegra_xusb_pad_find_phy_node(struct tegra_xusb_pad *pad, unsigned int index)
  92{
  93        /*
  94         * of_find_node_by_name() drops a reference, so make sure to grab one.
  95         */
  96        struct device_node *np = of_node_get(pad->dev.of_node);
  97
  98        np = of_find_node_by_name(np, "lanes");
  99        if (!np)
 100                return NULL;
 101
 102        return of_find_node_by_name(np, pad->soc->lanes[index].name);
 103}
 104
 105static int
 106tegra_xusb_lane_lookup_function(struct tegra_xusb_lane *lane,
 107                                    const char *function)
 108{
 109        unsigned int i;
 110
 111        for (i = 0; i < lane->soc->num_funcs; i++)
 112                if (strcmp(function, lane->soc->funcs[i]) == 0)
 113                        return i;
 114
 115        return -EINVAL;
 116}
 117
 118int tegra_xusb_lane_parse_dt(struct tegra_xusb_lane *lane,
 119                             struct device_node *np)
 120{
 121        struct device *dev = &lane->pad->dev;
 122        const char *function;
 123        int err;
 124
 125        err = of_property_read_string(np, "nvidia,function", &function);
 126        if (err < 0)
 127                return err;
 128
 129        err = tegra_xusb_lane_lookup_function(lane, function);
 130        if (err < 0) {
 131                dev_err(dev, "invalid function \"%s\" for lane \"%s\"\n",
 132                        function, np->name);
 133                return err;
 134        }
 135
 136        lane->function = err;
 137
 138        return 0;
 139}
 140
 141static void tegra_xusb_lane_destroy(struct phy *phy)
 142{
 143        if (phy) {
 144                struct tegra_xusb_lane *lane = phy_get_drvdata(phy);
 145
 146                lane->pad->ops->remove(lane);
 147                phy_destroy(phy);
 148        }
 149}
 150
 151static void tegra_xusb_pad_release(struct device *dev)
 152{
 153        struct tegra_xusb_pad *pad = to_tegra_xusb_pad(dev);
 154
 155        pad->soc->ops->remove(pad);
 156}
 157
 158static struct device_type tegra_xusb_pad_type = {
 159        .release = tegra_xusb_pad_release,
 160};
 161
 162int tegra_xusb_pad_init(struct tegra_xusb_pad *pad,
 163                        struct tegra_xusb_padctl *padctl,
 164                        struct device_node *np)
 165{
 166        int err;
 167
 168        device_initialize(&pad->dev);
 169        INIT_LIST_HEAD(&pad->list);
 170        pad->dev.parent = padctl->dev;
 171        pad->dev.type = &tegra_xusb_pad_type;
 172        pad->dev.of_node = np;
 173        pad->padctl = padctl;
 174
 175        err = dev_set_name(&pad->dev, "%s", pad->soc->name);
 176        if (err < 0)
 177                goto unregister;
 178
 179        err = device_add(&pad->dev);
 180        if (err < 0)
 181                goto unregister;
 182
 183        return 0;
 184
 185unregister:
 186        device_unregister(&pad->dev);
 187        return err;
 188}
 189
 190int tegra_xusb_pad_register(struct tegra_xusb_pad *pad,
 191                            const struct phy_ops *ops)
 192{
 193        struct device_node *children;
 194        struct phy *lane;
 195        unsigned int i;
 196        int err;
 197
 198        children = of_find_node_by_name(pad->dev.of_node, "lanes");
 199        if (!children)
 200                return -ENODEV;
 201
 202        pad->lanes = devm_kcalloc(&pad->dev, pad->soc->num_lanes, sizeof(lane),
 203                                  GFP_KERNEL);
 204        if (!pad->lanes) {
 205                of_node_put(children);
 206                return -ENOMEM;
 207        }
 208
 209        for (i = 0; i < pad->soc->num_lanes; i++) {
 210                struct device_node *np = tegra_xusb_pad_find_phy_node(pad, i);
 211                struct tegra_xusb_lane *lane;
 212
 213                /* skip disabled lanes */
 214                if (!np || !of_device_is_available(np)) {
 215                        of_node_put(np);
 216                        continue;
 217                }
 218
 219                pad->lanes[i] = phy_create(&pad->dev, np, ops);
 220                if (IS_ERR(pad->lanes[i])) {
 221                        err = PTR_ERR(pad->lanes[i]);
 222                        of_node_put(np);
 223                        goto remove;
 224                }
 225
 226                lane = pad->ops->probe(pad, np, i);
 227                if (IS_ERR(lane)) {
 228                        phy_destroy(pad->lanes[i]);
 229                        err = PTR_ERR(lane);
 230                        goto remove;
 231                }
 232
 233                list_add_tail(&lane->list, &pad->padctl->lanes);
 234                phy_set_drvdata(pad->lanes[i], lane);
 235        }
 236
 237        pad->provider = of_phy_provider_register_full(&pad->dev, children,
 238                                                      tegra_xusb_pad_of_xlate);
 239        if (IS_ERR(pad->provider)) {
 240                err = PTR_ERR(pad->provider);
 241                goto remove;
 242        }
 243
 244        return 0;
 245
 246remove:
 247        while (i--)
 248                tegra_xusb_lane_destroy(pad->lanes[i]);
 249
 250        of_node_put(children);
 251
 252        return err;
 253}
 254
 255void tegra_xusb_pad_unregister(struct tegra_xusb_pad *pad)
 256{
 257        unsigned int i = pad->soc->num_lanes;
 258
 259        of_phy_provider_unregister(pad->provider);
 260
 261        while (i--)
 262                tegra_xusb_lane_destroy(pad->lanes[i]);
 263
 264        device_unregister(&pad->dev);
 265}
 266
 267static struct tegra_xusb_pad *
 268tegra_xusb_pad_create(struct tegra_xusb_padctl *padctl,
 269                      const struct tegra_xusb_pad_soc *soc)
 270{
 271        struct tegra_xusb_pad *pad;
 272        struct device_node *np;
 273        int err;
 274
 275        np = tegra_xusb_find_pad_node(padctl, soc->name);
 276        if (!np || !of_device_is_available(np))
 277                return NULL;
 278
 279        pad = soc->ops->probe(padctl, soc, np);
 280        if (IS_ERR(pad)) {
 281                err = PTR_ERR(pad);
 282                dev_err(padctl->dev, "failed to create pad %s: %d\n",
 283                        soc->name, err);
 284                return ERR_PTR(err);
 285        }
 286
 287        /* XXX move this into ->probe() to avoid string comparison */
 288        if (strcmp(soc->name, "pcie") == 0)
 289                padctl->pcie = pad;
 290
 291        if (strcmp(soc->name, "sata") == 0)
 292                padctl->sata = pad;
 293
 294        if (strcmp(soc->name, "usb2") == 0)
 295                padctl->usb2 = pad;
 296
 297        if (strcmp(soc->name, "ulpi") == 0)
 298                padctl->ulpi = pad;
 299
 300        if (strcmp(soc->name, "hsic") == 0)
 301                padctl->hsic = pad;
 302
 303        return pad;
 304}
 305
 306static void __tegra_xusb_remove_pads(struct tegra_xusb_padctl *padctl)
 307{
 308        struct tegra_xusb_pad *pad, *tmp;
 309
 310        list_for_each_entry_safe_reverse(pad, tmp, &padctl->pads, list) {
 311                list_del(&pad->list);
 312                tegra_xusb_pad_unregister(pad);
 313        }
 314}
 315
 316static void tegra_xusb_remove_pads(struct tegra_xusb_padctl *padctl)
 317{
 318        mutex_lock(&padctl->lock);
 319        __tegra_xusb_remove_pads(padctl);
 320        mutex_unlock(&padctl->lock);
 321}
 322
 323static void tegra_xusb_lane_program(struct tegra_xusb_lane *lane)
 324{
 325        struct tegra_xusb_padctl *padctl = lane->pad->padctl;
 326        const struct tegra_xusb_lane_soc *soc = lane->soc;
 327        u32 value;
 328
 329        /* choose function */
 330        value = padctl_readl(padctl, soc->offset);
 331        value &= ~(soc->mask << soc->shift);
 332        value |= lane->function << soc->shift;
 333        padctl_writel(padctl, value, soc->offset);
 334}
 335
 336static void tegra_xusb_pad_program(struct tegra_xusb_pad *pad)
 337{
 338        unsigned int i;
 339
 340        for (i = 0; i < pad->soc->num_lanes; i++) {
 341                struct tegra_xusb_lane *lane;
 342
 343                if (pad->lanes[i]) {
 344                        lane = phy_get_drvdata(pad->lanes[i]);
 345                        tegra_xusb_lane_program(lane);
 346                }
 347        }
 348}
 349
 350static int tegra_xusb_setup_pads(struct tegra_xusb_padctl *padctl)
 351{
 352        struct tegra_xusb_pad *pad;
 353        unsigned int i;
 354
 355        mutex_lock(&padctl->lock);
 356
 357        for (i = 0; i < padctl->soc->num_pads; i++) {
 358                const struct tegra_xusb_pad_soc *soc = padctl->soc->pads[i];
 359                int err;
 360
 361                pad = tegra_xusb_pad_create(padctl, soc);
 362                if (IS_ERR(pad)) {
 363                        err = PTR_ERR(pad);
 364                        dev_err(padctl->dev, "failed to create pad %s: %d\n",
 365                                soc->name, err);
 366                        __tegra_xusb_remove_pads(padctl);
 367                        mutex_unlock(&padctl->lock);
 368                        return err;
 369                }
 370
 371                if (!pad)
 372                        continue;
 373
 374                list_add_tail(&pad->list, &padctl->pads);
 375        }
 376
 377        list_for_each_entry(pad, &padctl->pads, list)
 378                tegra_xusb_pad_program(pad);
 379
 380        mutex_unlock(&padctl->lock);
 381        return 0;
 382}
 383
 384static bool tegra_xusb_lane_check(struct tegra_xusb_lane *lane,
 385                                  const char *function)
 386{
 387        const char *func = lane->soc->funcs[lane->function];
 388
 389        return strcmp(function, func) == 0;
 390}
 391
 392struct tegra_xusb_lane *tegra_xusb_find_lane(struct tegra_xusb_padctl *padctl,
 393                                             const char *type,
 394                                             unsigned int index)
 395{
 396        struct tegra_xusb_lane *lane, *hit = ERR_PTR(-ENODEV);
 397        char *name;
 398
 399        name = kasprintf(GFP_KERNEL, "%s-%u", type, index);
 400        if (!name)
 401                return ERR_PTR(-ENOMEM);
 402
 403        list_for_each_entry(lane, &padctl->lanes, list) {
 404                if (strcmp(lane->soc->name, name) == 0) {
 405                        hit = lane;
 406                        break;
 407                }
 408        }
 409
 410        kfree(name);
 411        return hit;
 412}
 413
 414struct tegra_xusb_lane *
 415tegra_xusb_port_find_lane(struct tegra_xusb_port *port,
 416                          const struct tegra_xusb_lane_map *map,
 417                          const char *function)
 418{
 419        struct tegra_xusb_lane *lane, *match = ERR_PTR(-ENODEV);
 420
 421        for (map = map; map->type; map++) {
 422                if (port->index != map->port)
 423                        continue;
 424
 425                lane = tegra_xusb_find_lane(port->padctl, map->type,
 426                                            map->index);
 427                if (IS_ERR(lane))
 428                        continue;
 429
 430                if (!tegra_xusb_lane_check(lane, function))
 431                        continue;
 432
 433                if (!IS_ERR(match))
 434                        dev_err(&port->dev, "conflicting match: %s-%u / %s\n",
 435                                map->type, map->index, match->soc->name);
 436                else
 437                        match = lane;
 438        }
 439
 440        return match;
 441}
 442
 443static struct device_node *
 444tegra_xusb_find_port_node(struct tegra_xusb_padctl *padctl, const char *type,
 445                          unsigned int index)
 446{
 447        /*
 448         * of_find_node_by_name() drops a reference, so make sure to grab one.
 449         */
 450        struct device_node *np = of_node_get(padctl->dev->of_node);
 451
 452        np = of_find_node_by_name(np, "ports");
 453        if (np) {
 454                char *name;
 455
 456                name = kasprintf(GFP_KERNEL, "%s-%u", type, index);
 457                np = of_find_node_by_name(np, name);
 458                kfree(name);
 459        }
 460
 461        return np;
 462}
 463
 464struct tegra_xusb_port *
 465tegra_xusb_find_port(struct tegra_xusb_padctl *padctl, const char *type,
 466                     unsigned int index)
 467{
 468        struct tegra_xusb_port *port;
 469        struct device_node *np;
 470
 471        np = tegra_xusb_find_port_node(padctl, type, index);
 472        if (!np)
 473                return NULL;
 474
 475        list_for_each_entry(port, &padctl->ports, list) {
 476                if (np == port->dev.of_node) {
 477                        of_node_put(np);
 478                        return port;
 479                }
 480        }
 481
 482        of_node_put(np);
 483
 484        return NULL;
 485}
 486
 487struct tegra_xusb_usb2_port *
 488tegra_xusb_find_usb2_port(struct tegra_xusb_padctl *padctl, unsigned int index)
 489{
 490        struct tegra_xusb_port *port;
 491
 492        port = tegra_xusb_find_port(padctl, "usb2", index);
 493        if (port)
 494                return to_usb2_port(port);
 495
 496        return NULL;
 497}
 498
 499struct tegra_xusb_usb3_port *
 500tegra_xusb_find_usb3_port(struct tegra_xusb_padctl *padctl, unsigned int index)
 501{
 502        struct tegra_xusb_port *port;
 503
 504        port = tegra_xusb_find_port(padctl, "usb3", index);
 505        if (port)
 506                return to_usb3_port(port);
 507
 508        return NULL;
 509}
 510
 511static void tegra_xusb_port_release(struct device *dev)
 512{
 513}
 514
 515static struct device_type tegra_xusb_port_type = {
 516        .release = tegra_xusb_port_release,
 517};
 518
 519static int tegra_xusb_port_init(struct tegra_xusb_port *port,
 520                                struct tegra_xusb_padctl *padctl,
 521                                struct device_node *np,
 522                                const char *name,
 523                                unsigned int index)
 524{
 525        int err;
 526
 527        INIT_LIST_HEAD(&port->list);
 528        port->padctl = padctl;
 529        port->index = index;
 530
 531        device_initialize(&port->dev);
 532        port->dev.type = &tegra_xusb_port_type;
 533        port->dev.of_node = of_node_get(np);
 534        port->dev.parent = padctl->dev;
 535
 536        err = dev_set_name(&port->dev, "%s-%u", name, index);
 537        if (err < 0)
 538                goto unregister;
 539
 540        err = device_add(&port->dev);
 541        if (err < 0)
 542                goto unregister;
 543
 544        return 0;
 545
 546unregister:
 547        device_unregister(&port->dev);
 548        return err;
 549}
 550
 551static void tegra_xusb_port_unregister(struct tegra_xusb_port *port)
 552{
 553        device_unregister(&port->dev);
 554}
 555
 556static int tegra_xusb_usb2_port_parse_dt(struct tegra_xusb_usb2_port *usb2)
 557{
 558        struct tegra_xusb_port *port = &usb2->base;
 559        struct device_node *np = port->dev.of_node;
 560
 561        usb2->internal = of_property_read_bool(np, "nvidia,internal");
 562
 563        usb2->supply = devm_regulator_get(&port->dev, "vbus");
 564        if (IS_ERR(usb2->supply))
 565                return PTR_ERR(usb2->supply);
 566
 567        return 0;
 568}
 569
 570static int tegra_xusb_add_usb2_port(struct tegra_xusb_padctl *padctl,
 571                                    unsigned int index)
 572{
 573        struct tegra_xusb_usb2_port *usb2;
 574        struct device_node *np;
 575        int err = 0;
 576
 577        /*
 578         * USB2 ports don't require additional properties, but if the port is
 579         * marked as disabled there is no reason to register it.
 580         */
 581        np = tegra_xusb_find_port_node(padctl, "usb2", index);
 582        if (!np || !of_device_is_available(np))
 583                goto out;
 584
 585        usb2 = devm_kzalloc(padctl->dev, sizeof(*usb2), GFP_KERNEL);
 586        if (!usb2) {
 587                err = -ENOMEM;
 588                goto out;
 589        }
 590
 591        err = tegra_xusb_port_init(&usb2->base, padctl, np, "usb2", index);
 592        if (err < 0)
 593                goto out;
 594
 595        usb2->base.ops = padctl->soc->ports.usb2.ops;
 596
 597        usb2->base.lane = usb2->base.ops->map(&usb2->base);
 598        if (IS_ERR(usb2->base.lane)) {
 599                err = PTR_ERR(usb2->base.lane);
 600                goto out;
 601        }
 602
 603        err = tegra_xusb_usb2_port_parse_dt(usb2);
 604        if (err < 0) {
 605                tegra_xusb_port_unregister(&usb2->base);
 606                goto out;
 607        }
 608
 609        list_add_tail(&usb2->base.list, &padctl->ports);
 610
 611out:
 612        of_node_put(np);
 613        return err;
 614}
 615
 616static int tegra_xusb_ulpi_port_parse_dt(struct tegra_xusb_ulpi_port *ulpi)
 617{
 618        struct tegra_xusb_port *port = &ulpi->base;
 619        struct device_node *np = port->dev.of_node;
 620
 621        ulpi->internal = of_property_read_bool(np, "nvidia,internal");
 622
 623        return 0;
 624}
 625
 626static int tegra_xusb_add_ulpi_port(struct tegra_xusb_padctl *padctl,
 627                                    unsigned int index)
 628{
 629        struct tegra_xusb_ulpi_port *ulpi;
 630        struct device_node *np;
 631        int err = 0;
 632
 633        np = tegra_xusb_find_port_node(padctl, "ulpi", index);
 634        if (!np || !of_device_is_available(np))
 635                goto out;
 636
 637        ulpi = devm_kzalloc(padctl->dev, sizeof(*ulpi), GFP_KERNEL);
 638        if (!ulpi) {
 639                err = -ENOMEM;
 640                goto out;
 641        }
 642
 643        err = tegra_xusb_port_init(&ulpi->base, padctl, np, "ulpi", index);
 644        if (err < 0)
 645                goto out;
 646
 647        ulpi->base.ops = padctl->soc->ports.ulpi.ops;
 648
 649        ulpi->base.lane = ulpi->base.ops->map(&ulpi->base);
 650        if (IS_ERR(ulpi->base.lane)) {
 651                err = PTR_ERR(ulpi->base.lane);
 652                goto out;
 653        }
 654
 655        err = tegra_xusb_ulpi_port_parse_dt(ulpi);
 656        if (err < 0) {
 657                tegra_xusb_port_unregister(&ulpi->base);
 658                goto out;
 659        }
 660
 661        list_add_tail(&ulpi->base.list, &padctl->ports);
 662
 663out:
 664        of_node_put(np);
 665        return err;
 666}
 667
 668static int tegra_xusb_hsic_port_parse_dt(struct tegra_xusb_hsic_port *hsic)
 669{
 670        /* XXX */
 671        return 0;
 672}
 673
 674static int tegra_xusb_add_hsic_port(struct tegra_xusb_padctl *padctl,
 675                                    unsigned int index)
 676{
 677        struct tegra_xusb_hsic_port *hsic;
 678        struct device_node *np;
 679        int err = 0;
 680
 681        np = tegra_xusb_find_port_node(padctl, "hsic", index);
 682        if (!np || !of_device_is_available(np))
 683                goto out;
 684
 685        hsic = devm_kzalloc(padctl->dev, sizeof(*hsic), GFP_KERNEL);
 686        if (!hsic) {
 687                err = -ENOMEM;
 688                goto out;
 689        }
 690
 691        err = tegra_xusb_port_init(&hsic->base, padctl, np, "hsic", index);
 692        if (err < 0)
 693                goto out;
 694
 695        hsic->base.ops = padctl->soc->ports.hsic.ops;
 696
 697        hsic->base.lane = hsic->base.ops->map(&hsic->base);
 698        if (IS_ERR(hsic->base.lane)) {
 699                err = PTR_ERR(hsic->base.lane);
 700                goto out;
 701        }
 702
 703        err = tegra_xusb_hsic_port_parse_dt(hsic);
 704        if (err < 0) {
 705                tegra_xusb_port_unregister(&hsic->base);
 706                goto out;
 707        }
 708
 709        list_add_tail(&hsic->base.list, &padctl->ports);
 710
 711out:
 712        of_node_put(np);
 713        return err;
 714}
 715
 716static int tegra_xusb_usb3_port_parse_dt(struct tegra_xusb_usb3_port *usb3)
 717{
 718        struct tegra_xusb_port *port = &usb3->base;
 719        struct device_node *np = port->dev.of_node;
 720        u32 value;
 721        int err;
 722
 723        err = of_property_read_u32(np, "nvidia,usb2-companion", &value);
 724        if (err < 0) {
 725                dev_err(&port->dev, "failed to read port: %d\n", err);
 726                return err;
 727        }
 728
 729        usb3->port = value;
 730
 731        usb3->internal = of_property_read_bool(np, "nvidia,internal");
 732
 733        usb3->supply = devm_regulator_get(&port->dev, "vbus");
 734        if (IS_ERR(usb3->supply))
 735                return PTR_ERR(usb3->supply);
 736
 737        return 0;
 738}
 739
 740static int tegra_xusb_add_usb3_port(struct tegra_xusb_padctl *padctl,
 741                                    unsigned int index)
 742{
 743        struct tegra_xusb_usb3_port *usb3;
 744        struct device_node *np;
 745        int err = 0;
 746
 747        /*
 748         * If there is no supplemental configuration in the device tree the
 749         * port is unusable. But it is valid to configure only a single port,
 750         * hence return 0 instead of an error to allow ports to be optional.
 751         */
 752        np = tegra_xusb_find_port_node(padctl, "usb3", index);
 753        if (!np || !of_device_is_available(np))
 754                goto out;
 755
 756        usb3 = devm_kzalloc(padctl->dev, sizeof(*usb3), GFP_KERNEL);
 757        if (!usb3) {
 758                err = -ENOMEM;
 759                goto out;
 760        }
 761
 762        err = tegra_xusb_port_init(&usb3->base, padctl, np, "usb3", index);
 763        if (err < 0)
 764                goto out;
 765
 766        usb3->base.ops = padctl->soc->ports.usb3.ops;
 767
 768        usb3->base.lane = usb3->base.ops->map(&usb3->base);
 769        if (IS_ERR(usb3->base.lane)) {
 770                err = PTR_ERR(usb3->base.lane);
 771                goto out;
 772        }
 773
 774        err = tegra_xusb_usb3_port_parse_dt(usb3);
 775        if (err < 0) {
 776                tegra_xusb_port_unregister(&usb3->base);
 777                goto out;
 778        }
 779
 780        list_add_tail(&usb3->base.list, &padctl->ports);
 781
 782out:
 783        of_node_put(np);
 784        return err;
 785}
 786
 787static void __tegra_xusb_remove_ports(struct tegra_xusb_padctl *padctl)
 788{
 789        struct tegra_xusb_port *port, *tmp;
 790
 791        list_for_each_entry_safe_reverse(port, tmp, &padctl->ports, list) {
 792                list_del(&port->list);
 793                tegra_xusb_port_unregister(port);
 794        }
 795}
 796
 797static int tegra_xusb_setup_ports(struct tegra_xusb_padctl *padctl)
 798{
 799        struct tegra_xusb_port *port;
 800        unsigned int i;
 801        int err = 0;
 802
 803        mutex_lock(&padctl->lock);
 804
 805        for (i = 0; i < padctl->soc->ports.usb2.count; i++) {
 806                err = tegra_xusb_add_usb2_port(padctl, i);
 807                if (err < 0)
 808                        goto remove_ports;
 809        }
 810
 811        for (i = 0; i < padctl->soc->ports.ulpi.count; i++) {
 812                err = tegra_xusb_add_ulpi_port(padctl, i);
 813                if (err < 0)
 814                        goto remove_ports;
 815        }
 816
 817        for (i = 0; i < padctl->soc->ports.hsic.count; i++) {
 818                err = tegra_xusb_add_hsic_port(padctl, i);
 819                if (err < 0)
 820                        goto remove_ports;
 821        }
 822
 823        for (i = 0; i < padctl->soc->ports.usb3.count; i++) {
 824                err = tegra_xusb_add_usb3_port(padctl, i);
 825                if (err < 0)
 826                        goto remove_ports;
 827        }
 828
 829        list_for_each_entry(port, &padctl->ports, list) {
 830                err = port->ops->enable(port);
 831                if (err < 0)
 832                        dev_err(padctl->dev, "failed to enable port %s: %d\n",
 833                                dev_name(&port->dev), err);
 834        }
 835
 836        goto unlock;
 837
 838remove_ports:
 839        __tegra_xusb_remove_ports(padctl);
 840unlock:
 841        mutex_unlock(&padctl->lock);
 842        return err;
 843}
 844
 845static void tegra_xusb_remove_ports(struct tegra_xusb_padctl *padctl)
 846{
 847        mutex_lock(&padctl->lock);
 848        __tegra_xusb_remove_ports(padctl);
 849        mutex_unlock(&padctl->lock);
 850}
 851
 852static int tegra_xusb_padctl_probe(struct platform_device *pdev)
 853{
 854        struct device_node *np = of_node_get(pdev->dev.of_node);
 855        const struct tegra_xusb_padctl_soc *soc;
 856        struct tegra_xusb_padctl *padctl;
 857        const struct of_device_id *match;
 858        struct resource *res;
 859        int err;
 860
 861        /* for backwards compatibility with old device trees */
 862        np = of_find_node_by_name(np, "pads");
 863        if (!np) {
 864                dev_warn(&pdev->dev, "deprecated DT, using legacy driver\n");
 865                return tegra_xusb_padctl_legacy_probe(pdev);
 866        }
 867
 868        of_node_put(np);
 869
 870        match = of_match_node(tegra_xusb_padctl_of_match, pdev->dev.of_node);
 871        soc = match->data;
 872
 873        padctl = soc->ops->probe(&pdev->dev, soc);
 874        if (IS_ERR(padctl))
 875                return PTR_ERR(padctl);
 876
 877        platform_set_drvdata(pdev, padctl);
 878        INIT_LIST_HEAD(&padctl->ports);
 879        INIT_LIST_HEAD(&padctl->lanes);
 880        INIT_LIST_HEAD(&padctl->pads);
 881        mutex_init(&padctl->lock);
 882
 883        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 884        padctl->regs = devm_ioremap_resource(&pdev->dev, res);
 885        if (IS_ERR(padctl->regs)) {
 886                err = PTR_ERR(padctl->regs);
 887                goto remove;
 888        }
 889
 890        padctl->rst = devm_reset_control_get(&pdev->dev, NULL);
 891        if (IS_ERR(padctl->rst)) {
 892                err = PTR_ERR(padctl->rst);
 893                goto remove;
 894        }
 895
 896        err = reset_control_deassert(padctl->rst);
 897        if (err < 0)
 898                goto remove;
 899
 900        err = tegra_xusb_setup_pads(padctl);
 901        if (err < 0) {
 902                dev_err(&pdev->dev, "failed to setup pads: %d\n", err);
 903                goto reset;
 904        }
 905
 906        err = tegra_xusb_setup_ports(padctl);
 907        if (err) {
 908                dev_err(&pdev->dev, "failed to setup XUSB ports: %d\n", err);
 909                goto remove_pads;
 910        }
 911
 912        return 0;
 913
 914remove_pads:
 915        tegra_xusb_remove_pads(padctl);
 916reset:
 917        reset_control_assert(padctl->rst);
 918remove:
 919        soc->ops->remove(padctl);
 920        return err;
 921}
 922
 923static int tegra_xusb_padctl_remove(struct platform_device *pdev)
 924{
 925        struct tegra_xusb_padctl *padctl = platform_get_drvdata(pdev);
 926        int err;
 927
 928        tegra_xusb_remove_ports(padctl);
 929        tegra_xusb_remove_pads(padctl);
 930
 931        err = reset_control_assert(padctl->rst);
 932        if (err < 0)
 933                dev_err(&pdev->dev, "failed to assert reset: %d\n", err);
 934
 935        padctl->soc->ops->remove(padctl);
 936
 937        return err;
 938}
 939
 940static struct platform_driver tegra_xusb_padctl_driver = {
 941        .driver = {
 942                .name = "tegra-xusb-padctl",
 943                .of_match_table = tegra_xusb_padctl_of_match,
 944        },
 945        .probe = tegra_xusb_padctl_probe,
 946        .remove = tegra_xusb_padctl_remove,
 947};
 948module_platform_driver(tegra_xusb_padctl_driver);
 949
 950struct tegra_xusb_padctl *tegra_xusb_padctl_get(struct device *dev)
 951{
 952        struct tegra_xusb_padctl *padctl;
 953        struct platform_device *pdev;
 954        struct device_node *np;
 955
 956        np = of_parse_phandle(dev->of_node, "nvidia,xusb-padctl", 0);
 957        if (!np)
 958                return ERR_PTR(-EINVAL);
 959
 960        /*
 961         * This is slightly ugly. A better implementation would be to keep a
 962         * registry of pad controllers, but since there will almost certainly
 963         * only ever be one per SoC that would be a little overkill.
 964         */
 965        pdev = of_find_device_by_node(np);
 966        if (!pdev) {
 967                of_node_put(np);
 968                return ERR_PTR(-ENODEV);
 969        }
 970
 971        of_node_put(np);
 972
 973        padctl = platform_get_drvdata(pdev);
 974        if (!padctl) {
 975                put_device(&pdev->dev);
 976                return ERR_PTR(-EPROBE_DEFER);
 977        }
 978
 979        return padctl;
 980}
 981EXPORT_SYMBOL_GPL(tegra_xusb_padctl_get);
 982
 983void tegra_xusb_padctl_put(struct tegra_xusb_padctl *padctl)
 984{
 985        if (padctl)
 986                put_device(padctl->dev);
 987}
 988EXPORT_SYMBOL_GPL(tegra_xusb_padctl_put);
 989
 990int tegra_xusb_padctl_usb3_save_context(struct tegra_xusb_padctl *padctl,
 991                                        unsigned int port)
 992{
 993        if (padctl->soc->ops->usb3_save_context)
 994                return padctl->soc->ops->usb3_save_context(padctl, port);
 995
 996        return -ENOSYS;
 997}
 998EXPORT_SYMBOL_GPL(tegra_xusb_padctl_usb3_save_context);
 999
1000int tegra_xusb_padctl_hsic_set_idle(struct tegra_xusb_padctl *padctl,
1001                                    unsigned int port, bool idle)
1002{
1003        if (padctl->soc->ops->hsic_set_idle)
1004                return padctl->soc->ops->hsic_set_idle(padctl, port, idle);
1005
1006        return -ENOSYS;
1007}
1008EXPORT_SYMBOL_GPL(tegra_xusb_padctl_hsic_set_idle);
1009
1010int tegra_xusb_padctl_usb3_set_lfps_detect(struct tegra_xusb_padctl *padctl,
1011                                           unsigned int port, bool enable)
1012{
1013        if (padctl->soc->ops->usb3_set_lfps_detect)
1014                return padctl->soc->ops->usb3_set_lfps_detect(padctl, port,
1015                                                              enable);
1016
1017        return -ENOSYS;
1018}
1019EXPORT_SYMBOL_GPL(tegra_xusb_padctl_usb3_set_lfps_detect);
1020
1021MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
1022MODULE_DESCRIPTION("Tegra XUSB Pad Controller driver");
1023MODULE_LICENSE("GPL v2");
1024