linux/drivers/phy/tegra/xusb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2014-2020, NVIDIA CORPORATION.  All rights reserved.
   4 * Copyright (c) 2015, Google Inc.
   5 */
   6
   7#ifndef __PHY_TEGRA_XUSB_H
   8#define __PHY_TEGRA_XUSB_H
   9
  10#include <linux/io.h>
  11#include <linux/mutex.h>
  12#include <linux/workqueue.h>
  13
  14#include <linux/usb/ch9.h>
  15#include <linux/usb/otg.h>
  16#include <linux/usb/role.h>
  17
  18/* legacy entry points for backwards-compatibility */
  19int tegra_xusb_padctl_legacy_probe(struct platform_device *pdev);
  20int tegra_xusb_padctl_legacy_remove(struct platform_device *pdev);
  21
  22struct phy;
  23struct phy_provider;
  24struct platform_device;
  25struct regulator;
  26
  27/*
  28 * lanes
  29 */
  30struct tegra_xusb_lane_soc {
  31        const char *name;
  32
  33        unsigned int offset;
  34        unsigned int shift;
  35        unsigned int mask;
  36
  37        const char * const *funcs;
  38        unsigned int num_funcs;
  39
  40        struct {
  41                unsigned int misc_ctl2;
  42        } regs;
  43};
  44
  45struct tegra_xusb_lane {
  46        const struct tegra_xusb_lane_soc *soc;
  47        struct tegra_xusb_pad *pad;
  48        struct device_node *np;
  49        struct list_head list;
  50        unsigned int function;
  51        unsigned int index;
  52};
  53
  54int tegra_xusb_lane_parse_dt(struct tegra_xusb_lane *lane,
  55                             struct device_node *np);
  56
  57struct tegra_xusb_usb3_lane {
  58        struct tegra_xusb_lane base;
  59};
  60
  61static inline struct tegra_xusb_usb3_lane *
  62to_usb3_lane(struct tegra_xusb_lane *lane)
  63{
  64        return container_of(lane, struct tegra_xusb_usb3_lane, base);
  65}
  66
  67struct tegra_xusb_usb2_lane {
  68        struct tegra_xusb_lane base;
  69
  70        u32 hs_curr_level_offset;
  71        bool powered_on;
  72};
  73
  74static inline struct tegra_xusb_usb2_lane *
  75to_usb2_lane(struct tegra_xusb_lane *lane)
  76{
  77        return container_of(lane, struct tegra_xusb_usb2_lane, base);
  78}
  79
  80struct tegra_xusb_ulpi_lane {
  81        struct tegra_xusb_lane base;
  82};
  83
  84static inline struct tegra_xusb_ulpi_lane *
  85to_ulpi_lane(struct tegra_xusb_lane *lane)
  86{
  87        return container_of(lane, struct tegra_xusb_ulpi_lane, base);
  88}
  89
  90struct tegra_xusb_hsic_lane {
  91        struct tegra_xusb_lane base;
  92
  93        u32 strobe_trim;
  94        u32 rx_strobe_trim;
  95        u32 rx_data_trim;
  96        u32 tx_rtune_n;
  97        u32 tx_rtune_p;
  98        u32 tx_rslew_n;
  99        u32 tx_rslew_p;
 100        bool auto_term;
 101};
 102
 103static inline struct tegra_xusb_hsic_lane *
 104to_hsic_lane(struct tegra_xusb_lane *lane)
 105{
 106        return container_of(lane, struct tegra_xusb_hsic_lane, base);
 107}
 108
 109struct tegra_xusb_pcie_lane {
 110        struct tegra_xusb_lane base;
 111};
 112
 113static inline struct tegra_xusb_pcie_lane *
 114to_pcie_lane(struct tegra_xusb_lane *lane)
 115{
 116        return container_of(lane, struct tegra_xusb_pcie_lane, base);
 117}
 118
 119struct tegra_xusb_sata_lane {
 120        struct tegra_xusb_lane base;
 121};
 122
 123static inline struct tegra_xusb_sata_lane *
 124to_sata_lane(struct tegra_xusb_lane *lane)
 125{
 126        return container_of(lane, struct tegra_xusb_sata_lane, base);
 127}
 128
 129struct tegra_xusb_lane_ops {
 130        struct tegra_xusb_lane *(*probe)(struct tegra_xusb_pad *pad,
 131                                         struct device_node *np,
 132                                         unsigned int index);
 133        void (*remove)(struct tegra_xusb_lane *lane);
 134        void (*iddq_enable)(struct tegra_xusb_lane *lane);
 135        void (*iddq_disable)(struct tegra_xusb_lane *lane);
 136        int (*enable_phy_sleepwalk)(struct tegra_xusb_lane *lane, enum usb_device_speed speed);
 137        int (*disable_phy_sleepwalk)(struct tegra_xusb_lane *lane);
 138        int (*enable_phy_wake)(struct tegra_xusb_lane *lane);
 139        int (*disable_phy_wake)(struct tegra_xusb_lane *lane);
 140        bool (*remote_wake_detected)(struct tegra_xusb_lane *lane);
 141};
 142
 143bool tegra_xusb_lane_check(struct tegra_xusb_lane *lane, const char *function);
 144
 145/*
 146 * pads
 147 */
 148struct tegra_xusb_pad_soc;
 149struct tegra_xusb_padctl;
 150
 151struct tegra_xusb_pad_ops {
 152        struct tegra_xusb_pad *(*probe)(struct tegra_xusb_padctl *padctl,
 153                                        const struct tegra_xusb_pad_soc *soc,
 154                                        struct device_node *np);
 155        void (*remove)(struct tegra_xusb_pad *pad);
 156};
 157
 158struct tegra_xusb_pad_soc {
 159        const char *name;
 160
 161        const struct tegra_xusb_lane_soc *lanes;
 162        unsigned int num_lanes;
 163
 164        const struct tegra_xusb_pad_ops *ops;
 165};
 166
 167struct tegra_xusb_pad {
 168        const struct tegra_xusb_pad_soc *soc;
 169        struct tegra_xusb_padctl *padctl;
 170        struct phy_provider *provider;
 171        struct phy **lanes;
 172        struct device dev;
 173
 174        const struct tegra_xusb_lane_ops *ops;
 175
 176        struct list_head list;
 177};
 178
 179static inline struct tegra_xusb_pad *to_tegra_xusb_pad(struct device *dev)
 180{
 181        return container_of(dev, struct tegra_xusb_pad, dev);
 182}
 183
 184int tegra_xusb_pad_init(struct tegra_xusb_pad *pad,
 185                        struct tegra_xusb_padctl *padctl,
 186                        struct device_node *np);
 187int tegra_xusb_pad_register(struct tegra_xusb_pad *pad,
 188                            const struct phy_ops *ops);
 189void tegra_xusb_pad_unregister(struct tegra_xusb_pad *pad);
 190
 191struct tegra_xusb_usb3_pad {
 192        struct tegra_xusb_pad base;
 193
 194        unsigned int enable;
 195        struct mutex lock;
 196};
 197
 198static inline struct tegra_xusb_usb3_pad *
 199to_usb3_pad(struct tegra_xusb_pad *pad)
 200{
 201        return container_of(pad, struct tegra_xusb_usb3_pad, base);
 202}
 203
 204struct tegra_xusb_usb2_pad {
 205        struct tegra_xusb_pad base;
 206
 207        struct clk *clk;
 208        unsigned int enable;
 209        struct mutex lock;
 210};
 211
 212static inline struct tegra_xusb_usb2_pad *
 213to_usb2_pad(struct tegra_xusb_pad *pad)
 214{
 215        return container_of(pad, struct tegra_xusb_usb2_pad, base);
 216}
 217
 218struct tegra_xusb_ulpi_pad {
 219        struct tegra_xusb_pad base;
 220};
 221
 222static inline struct tegra_xusb_ulpi_pad *
 223to_ulpi_pad(struct tegra_xusb_pad *pad)
 224{
 225        return container_of(pad, struct tegra_xusb_ulpi_pad, base);
 226}
 227
 228struct tegra_xusb_hsic_pad {
 229        struct tegra_xusb_pad base;
 230
 231        struct regulator *supply;
 232        struct clk *clk;
 233};
 234
 235static inline struct tegra_xusb_hsic_pad *
 236to_hsic_pad(struct tegra_xusb_pad *pad)
 237{
 238        return container_of(pad, struct tegra_xusb_hsic_pad, base);
 239}
 240
 241struct tegra_xusb_pcie_pad {
 242        struct tegra_xusb_pad base;
 243
 244        struct reset_control *rst;
 245        struct clk *pll;
 246
 247        bool enable;
 248};
 249
 250static inline struct tegra_xusb_pcie_pad *
 251to_pcie_pad(struct tegra_xusb_pad *pad)
 252{
 253        return container_of(pad, struct tegra_xusb_pcie_pad, base);
 254}
 255
 256struct tegra_xusb_sata_pad {
 257        struct tegra_xusb_pad base;
 258
 259        struct reset_control *rst;
 260        struct clk *pll;
 261
 262        bool enable;
 263};
 264
 265static inline struct tegra_xusb_sata_pad *
 266to_sata_pad(struct tegra_xusb_pad *pad)
 267{
 268        return container_of(pad, struct tegra_xusb_sata_pad, base);
 269}
 270
 271/*
 272 * ports
 273 */
 274struct tegra_xusb_port_ops;
 275
 276struct tegra_xusb_port {
 277        struct tegra_xusb_padctl *padctl;
 278        struct tegra_xusb_lane *lane;
 279        unsigned int index;
 280
 281        struct list_head list;
 282        struct device dev;
 283
 284        struct usb_role_switch *usb_role_sw;
 285        struct work_struct usb_phy_work;
 286        struct usb_phy usb_phy;
 287
 288        const struct tegra_xusb_port_ops *ops;
 289};
 290
 291static inline struct tegra_xusb_port *to_tegra_xusb_port(struct device *dev)
 292{
 293        return container_of(dev, struct tegra_xusb_port, dev);
 294}
 295
 296struct tegra_xusb_lane_map {
 297        unsigned int port;
 298        const char *type;
 299        unsigned int index;
 300        const char *func;
 301};
 302
 303struct tegra_xusb_lane *
 304tegra_xusb_port_find_lane(struct tegra_xusb_port *port,
 305                          const struct tegra_xusb_lane_map *map,
 306                          const char *function);
 307
 308struct tegra_xusb_port *
 309tegra_xusb_find_port(struct tegra_xusb_padctl *padctl, const char *type,
 310                     unsigned int index);
 311
 312struct tegra_xusb_usb2_port {
 313        struct tegra_xusb_port base;
 314
 315        struct regulator *supply;
 316        enum usb_dr_mode mode;
 317        bool internal;
 318        int usb3_port_fake;
 319};
 320
 321static inline struct tegra_xusb_usb2_port *
 322to_usb2_port(struct tegra_xusb_port *port)
 323{
 324        return container_of(port, struct tegra_xusb_usb2_port, base);
 325}
 326
 327struct tegra_xusb_usb2_port *
 328tegra_xusb_find_usb2_port(struct tegra_xusb_padctl *padctl,
 329                          unsigned int index);
 330void tegra_xusb_usb2_port_release(struct tegra_xusb_port *port);
 331void tegra_xusb_usb2_port_remove(struct tegra_xusb_port *port);
 332
 333struct tegra_xusb_ulpi_port {
 334        struct tegra_xusb_port base;
 335
 336        struct regulator *supply;
 337        bool internal;
 338};
 339
 340static inline struct tegra_xusb_ulpi_port *
 341to_ulpi_port(struct tegra_xusb_port *port)
 342{
 343        return container_of(port, struct tegra_xusb_ulpi_port, base);
 344}
 345
 346void tegra_xusb_ulpi_port_release(struct tegra_xusb_port *port);
 347
 348struct tegra_xusb_hsic_port {
 349        struct tegra_xusb_port base;
 350};
 351
 352static inline struct tegra_xusb_hsic_port *
 353to_hsic_port(struct tegra_xusb_port *port)
 354{
 355        return container_of(port, struct tegra_xusb_hsic_port, base);
 356}
 357
 358void tegra_xusb_hsic_port_release(struct tegra_xusb_port *port);
 359
 360struct tegra_xusb_usb3_port {
 361        struct tegra_xusb_port base;
 362        struct regulator *supply;
 363        bool context_saved;
 364        unsigned int port;
 365        bool internal;
 366        bool disable_gen2;
 367
 368        u32 tap1;
 369        u32 amp;
 370        u32 ctle_z;
 371        u32 ctle_g;
 372};
 373
 374static inline struct tegra_xusb_usb3_port *
 375to_usb3_port(struct tegra_xusb_port *port)
 376{
 377        return container_of(port, struct tegra_xusb_usb3_port, base);
 378}
 379
 380struct tegra_xusb_usb3_port *
 381tegra_xusb_find_usb3_port(struct tegra_xusb_padctl *padctl,
 382                          unsigned int index);
 383void tegra_xusb_usb3_port_release(struct tegra_xusb_port *port);
 384void tegra_xusb_usb3_port_remove(struct tegra_xusb_port *port);
 385
 386struct tegra_xusb_port_ops {
 387        void (*release)(struct tegra_xusb_port *port);
 388        void (*remove)(struct tegra_xusb_port *port);
 389        int (*enable)(struct tegra_xusb_port *port);
 390        void (*disable)(struct tegra_xusb_port *port);
 391        struct tegra_xusb_lane *(*map)(struct tegra_xusb_port *port);
 392};
 393
 394/*
 395 * pad controller
 396 */
 397struct tegra_xusb_padctl_soc;
 398
 399struct tegra_xusb_padctl_ops {
 400        struct tegra_xusb_padctl *
 401                (*probe)(struct device *dev,
 402                         const struct tegra_xusb_padctl_soc *soc);
 403        void (*remove)(struct tegra_xusb_padctl *padctl);
 404
 405        int (*suspend_noirq)(struct tegra_xusb_padctl *padctl);
 406        int (*resume_noirq)(struct tegra_xusb_padctl *padctl);
 407        int (*usb3_save_context)(struct tegra_xusb_padctl *padctl,
 408                                 unsigned int index);
 409        int (*hsic_set_idle)(struct tegra_xusb_padctl *padctl,
 410                             unsigned int index, bool idle);
 411        int (*usb3_set_lfps_detect)(struct tegra_xusb_padctl *padctl,
 412                                    unsigned int index, bool enable);
 413        int (*vbus_override)(struct tegra_xusb_padctl *padctl, bool set);
 414        int (*utmi_port_reset)(struct phy *phy);
 415};
 416
 417struct tegra_xusb_padctl_soc {
 418        const struct tegra_xusb_pad_soc * const *pads;
 419        unsigned int num_pads;
 420
 421        struct {
 422                struct {
 423                        const struct tegra_xusb_port_ops *ops;
 424                        unsigned int count;
 425                } usb2, ulpi, hsic, usb3;
 426        } ports;
 427
 428        const struct tegra_xusb_padctl_ops *ops;
 429
 430        const char * const *supply_names;
 431        unsigned int num_supplies;
 432        bool supports_gen2;
 433        bool need_fake_usb3_port;
 434};
 435
 436struct tegra_xusb_padctl {
 437        struct device *dev;
 438        void __iomem *regs;
 439        struct mutex lock;
 440        struct reset_control *rst;
 441
 442        const struct tegra_xusb_padctl_soc *soc;
 443
 444        struct tegra_xusb_pad *pcie;
 445        struct tegra_xusb_pad *sata;
 446        struct tegra_xusb_pad *ulpi;
 447        struct tegra_xusb_pad *usb2;
 448        struct tegra_xusb_pad *hsic;
 449
 450        struct list_head ports;
 451        struct list_head lanes;
 452        struct list_head pads;
 453
 454        unsigned int enable;
 455
 456        struct clk *clk;
 457
 458        struct regulator_bulk_data *supplies;
 459};
 460
 461static inline void padctl_writel(struct tegra_xusb_padctl *padctl, u32 value,
 462                                 unsigned long offset)
 463{
 464        dev_dbg(padctl->dev, "%08lx < %08x\n", offset, value);
 465        writel(value, padctl->regs + offset);
 466}
 467
 468static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl,
 469                               unsigned long offset)
 470{
 471        u32 value = readl(padctl->regs + offset);
 472        dev_dbg(padctl->dev, "%08lx > %08x\n", offset, value);
 473        return value;
 474}
 475
 476struct tegra_xusb_lane *tegra_xusb_find_lane(struct tegra_xusb_padctl *padctl,
 477                                             const char *name,
 478                                             unsigned int index);
 479
 480#if defined(CONFIG_ARCH_TEGRA_124_SOC) || defined(CONFIG_ARCH_TEGRA_132_SOC)
 481extern const struct tegra_xusb_padctl_soc tegra124_xusb_padctl_soc;
 482#endif
 483#if defined(CONFIG_ARCH_TEGRA_210_SOC)
 484extern const struct tegra_xusb_padctl_soc tegra210_xusb_padctl_soc;
 485#endif
 486#if defined(CONFIG_ARCH_TEGRA_186_SOC)
 487extern const struct tegra_xusb_padctl_soc tegra186_xusb_padctl_soc;
 488#endif
 489#if defined(CONFIG_ARCH_TEGRA_194_SOC)
 490extern const struct tegra_xusb_padctl_soc tegra194_xusb_padctl_soc;
 491#endif
 492
 493#endif /* __PHY_TEGRA_XUSB_H */
 494