11680d7b6SStephen Warren /* 21680d7b6SStephen Warren * Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved. 31680d7b6SStephen Warren * 41680d7b6SStephen Warren * SPDX-License-Identifier: GPL-2.0 51680d7b6SStephen Warren */ 61680d7b6SStephen Warren 71680d7b6SStephen Warren #ifndef _TEGRA_XUSB_PADCTL_COMMON_H_ 81680d7b6SStephen Warren #define _TEGRA_XUSB_PADCTL_COMMON_H_ 91680d7b6SStephen Warren 101680d7b6SStephen Warren #include <common.h> 111680d7b6SStephen Warren #include <fdtdec.h> 121680d7b6SStephen Warren 131680d7b6SStephen Warren #include <asm/io.h> 141680d7b6SStephen Warren #include <asm/arch-tegra/xusb-padctl.h> 151680d7b6SStephen Warren 161680d7b6SStephen Warren struct tegra_xusb_padctl_lane { 171680d7b6SStephen Warren const char *name; 181680d7b6SStephen Warren 191680d7b6SStephen Warren unsigned int offset; 201680d7b6SStephen Warren unsigned int shift; 211680d7b6SStephen Warren unsigned int mask; 221680d7b6SStephen Warren unsigned int iddq; 231680d7b6SStephen Warren 241680d7b6SStephen Warren const unsigned int *funcs; 251680d7b6SStephen Warren unsigned int num_funcs; 261680d7b6SStephen Warren }; 271680d7b6SStephen Warren 281680d7b6SStephen Warren struct tegra_xusb_phy_ops { 291680d7b6SStephen Warren int (*prepare)(struct tegra_xusb_phy *phy); 301680d7b6SStephen Warren int (*enable)(struct tegra_xusb_phy *phy); 311680d7b6SStephen Warren int (*disable)(struct tegra_xusb_phy *phy); 321680d7b6SStephen Warren int (*unprepare)(struct tegra_xusb_phy *phy); 331680d7b6SStephen Warren }; 341680d7b6SStephen Warren 351680d7b6SStephen Warren struct tegra_xusb_phy { 36095e6583SStephen Warren unsigned int type; 371680d7b6SStephen Warren const struct tegra_xusb_phy_ops *ops; 381680d7b6SStephen Warren struct tegra_xusb_padctl *padctl; 391680d7b6SStephen Warren }; 401680d7b6SStephen Warren 411680d7b6SStephen Warren struct tegra_xusb_padctl_pin { 421680d7b6SStephen Warren const struct tegra_xusb_padctl_lane *lane; 431680d7b6SStephen Warren 441680d7b6SStephen Warren unsigned int func; 451680d7b6SStephen Warren int iddq; 461680d7b6SStephen Warren }; 471680d7b6SStephen Warren 48*4e4b5574SStephen Warren #define MAX_GROUPS 5 49*4e4b5574SStephen Warren #define MAX_PINS 7 501680d7b6SStephen Warren 511680d7b6SStephen Warren struct tegra_xusb_padctl_group { 521680d7b6SStephen Warren const char *name; 531680d7b6SStephen Warren 541680d7b6SStephen Warren const char *pins[MAX_PINS]; 551680d7b6SStephen Warren unsigned int num_pins; 561680d7b6SStephen Warren 571680d7b6SStephen Warren const char *func; 581680d7b6SStephen Warren int iddq; 591680d7b6SStephen Warren }; 601680d7b6SStephen Warren 61095e6583SStephen Warren struct tegra_xusb_padctl_soc { 62095e6583SStephen Warren const struct tegra_xusb_padctl_lane *lanes; 63095e6583SStephen Warren unsigned int num_lanes; 64095e6583SStephen Warren const char *const *functions; 65095e6583SStephen Warren unsigned int num_functions; 66095e6583SStephen Warren struct tegra_xusb_phy *phys; 67095e6583SStephen Warren unsigned int num_phys; 68095e6583SStephen Warren }; 69095e6583SStephen Warren 701680d7b6SStephen Warren struct tegra_xusb_padctl_config { 711680d7b6SStephen Warren const char *name; 721680d7b6SStephen Warren 731680d7b6SStephen Warren struct tegra_xusb_padctl_group groups[MAX_GROUPS]; 741680d7b6SStephen Warren unsigned int num_groups; 751680d7b6SStephen Warren }; 761680d7b6SStephen Warren 771680d7b6SStephen Warren struct tegra_xusb_padctl { 78095e6583SStephen Warren const struct tegra_xusb_padctl_soc *socdata; 79095e6583SStephen Warren struct tegra_xusb_padctl_config config; 801680d7b6SStephen Warren struct fdt_resource regs; 811680d7b6SStephen Warren unsigned int enable; 821680d7b6SStephen Warren 831680d7b6SStephen Warren }; 84095e6583SStephen Warren extern struct tegra_xusb_padctl padctl; 851680d7b6SStephen Warren 861680d7b6SStephen Warren static inline u32 padctl_readl(struct tegra_xusb_padctl *padctl, 871680d7b6SStephen Warren unsigned long offset) 881680d7b6SStephen Warren { 891680d7b6SStephen Warren return readl(padctl->regs.start + offset); 901680d7b6SStephen Warren } 911680d7b6SStephen Warren 921680d7b6SStephen Warren static inline void padctl_writel(struct tegra_xusb_padctl *padctl, 931680d7b6SStephen Warren u32 value, unsigned long offset) 941680d7b6SStephen Warren { 951680d7b6SStephen Warren writel(value, padctl->regs.start + offset); 961680d7b6SStephen Warren } 971680d7b6SStephen Warren 98095e6583SStephen Warren int tegra_xusb_process_nodes(const void *fdt, int nodes[], unsigned int count, 99095e6583SStephen Warren const struct tegra_xusb_padctl_soc *socdata); 1001680d7b6SStephen Warren 1011680d7b6SStephen Warren #endif 102