| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * phy-brcm-usb-init.c - Broadcom USB Phy chip specific init functions |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2014-2017 Broadcom |
|---|
| 5 | | - * |
|---|
| 6 | | - * This software is licensed under the terms of the GNU General Public |
|---|
| 7 | | - * License version 2, as published by the Free Software Foundation, and |
|---|
| 8 | | - * may be copied, distributed, and modified under those terms. |
|---|
| 9 | | - * |
|---|
| 10 | | - * This program is distributed in the hope that it will be useful, |
|---|
| 11 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|---|
| 12 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|---|
| 13 | | - * GNU General Public License for more details. |
|---|
| 14 | 6 | */ |
|---|
| 15 | 7 | |
|---|
| 16 | 8 | /* |
|---|
| .. | .. |
|---|
| 50 | 42 | #define USB_CTRL_PLL_CTL_PLL_IDDQ_PWRDN_MASK 0x80000000 /* option */ |
|---|
| 51 | 43 | #define USB_CTRL_EBRIDGE 0x0c |
|---|
| 52 | 44 | #define USB_CTRL_EBRIDGE_ESTOP_SCB_REQ_MASK 0x00020000 /* option */ |
|---|
| 45 | +#define USB_CTRL_EBRIDGE_EBR_SCB_SIZE_MASK 0x00000f80 /* option */ |
|---|
| 53 | 46 | #define USB_CTRL_OBRIDGE 0x10 |
|---|
| 54 | 47 | #define USB_CTRL_OBRIDGE_LS_KEEP_ALIVE_MASK 0x08000000 |
|---|
| 55 | 48 | #define USB_CTRL_MDIO 0x14 |
|---|
| .. | .. |
|---|
| 65 | 58 | #define USB_CTRL_USB_PM_SOFT_RESET_MASK 0x40000000 /* option */ |
|---|
| 66 | 59 | #define USB_CTRL_USB_PM_USB20_HC_RESETB_MASK 0x30000000 /* option */ |
|---|
| 67 | 60 | #define USB_CTRL_USB_PM_USB20_HC_RESETB_VAR_MASK 0x00300000 /* option */ |
|---|
| 61 | +#define USB_CTRL_USB_PM_RMTWKUP_EN_MASK 0x00000001 |
|---|
| 62 | +#define USB_CTRL_USB_PM_STATUS 0x38 |
|---|
| 68 | 63 | #define USB_CTRL_USB30_CTL1 0x60 |
|---|
| 69 | 64 | #define USB_CTRL_USB30_CTL1_PHY3_PLL_SEQ_START_MASK 0x00000010 |
|---|
| 70 | 65 | #define USB_CTRL_USB30_CTL1_PHY3_RESETB_MASK 0x00010000 |
|---|
| .. | .. |
|---|
| 134 | 129 | USB_CTRL_SELECTOR_COUNT, |
|---|
| 135 | 130 | }; |
|---|
| 136 | 131 | |
|---|
| 137 | | -#define USB_CTRL_REG(base, reg) ((void *)base + USB_CTRL_##reg) |
|---|
| 138 | | -#define USB_XHCI_EC_REG(base, reg) ((void *)base + USB_XHCI_EC_##reg) |
|---|
| 139 | | -#define USB_CTRL_MASK(reg, field) \ |
|---|
| 140 | | - USB_CTRL_##reg##_##field##_MASK |
|---|
| 141 | 132 | #define USB_CTRL_MASK_FAMILY(params, reg, field) \ |
|---|
| 142 | 133 | (params->usb_reg_bits_map[USB_CTRL_##reg##_##field##_SELECTOR]) |
|---|
| 143 | 134 | |
|---|
| .. | .. |
|---|
| 147 | 138 | #define USB_CTRL_UNSET_FAMILY(params, reg, field) \ |
|---|
| 148 | 139 | usb_ctrl_unset_family(params, USB_CTRL_##reg, \ |
|---|
| 149 | 140 | USB_CTRL_##reg##_##field##_SELECTOR) |
|---|
| 150 | | - |
|---|
| 151 | | -#define USB_CTRL_SET(base, reg, field) \ |
|---|
| 152 | | - usb_ctrl_set(USB_CTRL_REG(base, reg), \ |
|---|
| 153 | | - USB_CTRL_##reg##_##field##_MASK) |
|---|
| 154 | | -#define USB_CTRL_UNSET(base, reg, field) \ |
|---|
| 155 | | - usb_ctrl_unset(USB_CTRL_REG(base, reg), \ |
|---|
| 156 | | - USB_CTRL_##reg##_##field##_MASK) |
|---|
| 157 | 141 | |
|---|
| 158 | 142 | #define MDIO_USB2 0 |
|---|
| 159 | 143 | #define MDIO_USB3 BIT(31) |
|---|
| .. | .. |
|---|
| 184 | 168 | { 0x33900000, BRCM_FAMILY_3390A0 }, |
|---|
| 185 | 169 | { 0x72500010, BRCM_FAMILY_7250B0 }, |
|---|
| 186 | 170 | { 0x72600000, BRCM_FAMILY_7260A0 }, |
|---|
| 171 | + { 0x72550000, BRCM_FAMILY_7260A0 }, |
|---|
| 187 | 172 | { 0x72680000, BRCM_FAMILY_7271A0 }, |
|---|
| 188 | 173 | { 0x72710000, BRCM_FAMILY_7271A0 }, |
|---|
| 189 | 174 | { 0x73640000, BRCM_FAMILY_7364A0 }, |
|---|
| .. | .. |
|---|
| 409 | 394 | }, |
|---|
| 410 | 395 | }; |
|---|
| 411 | 396 | |
|---|
| 412 | | -static inline u32 brcmusb_readl(void __iomem *addr) |
|---|
| 413 | | -{ |
|---|
| 414 | | - return readl(addr); |
|---|
| 415 | | -} |
|---|
| 416 | | - |
|---|
| 417 | | -static inline void brcmusb_writel(u32 val, void __iomem *addr) |
|---|
| 418 | | -{ |
|---|
| 419 | | - writel(val, addr); |
|---|
| 420 | | -} |
|---|
| 421 | | - |
|---|
| 422 | 397 | static inline |
|---|
| 423 | 398 | void usb_ctrl_unset_family(struct brcm_usb_init_params *params, |
|---|
| 424 | 399 | u32 reg_offset, u32 field) |
|---|
| 425 | 400 | { |
|---|
| 426 | 401 | u32 mask; |
|---|
| 427 | | - void *reg; |
|---|
| 428 | 402 | |
|---|
| 429 | 403 | mask = params->usb_reg_bits_map[field]; |
|---|
| 430 | | - reg = params->ctrl_regs + reg_offset; |
|---|
| 431 | | - brcmusb_writel(brcmusb_readl(reg) & ~mask, reg); |
|---|
| 404 | + brcm_usb_ctrl_unset(params->regs[BRCM_REGS_CTRL] + reg_offset, mask); |
|---|
| 432 | 405 | }; |
|---|
| 433 | 406 | |
|---|
| 434 | 407 | static inline |
|---|
| .. | .. |
|---|
| 436 | 409 | u32 reg_offset, u32 field) |
|---|
| 437 | 410 | { |
|---|
| 438 | 411 | u32 mask; |
|---|
| 439 | | - void *reg; |
|---|
| 440 | 412 | |
|---|
| 441 | 413 | mask = params->usb_reg_bits_map[field]; |
|---|
| 442 | | - reg = params->ctrl_regs + reg_offset; |
|---|
| 443 | | - brcmusb_writel(brcmusb_readl(reg) | mask, reg); |
|---|
| 414 | + brcm_usb_ctrl_set(params->regs[BRCM_REGS_CTRL] + reg_offset, mask); |
|---|
| 444 | 415 | }; |
|---|
| 445 | | - |
|---|
| 446 | | -static inline void usb_ctrl_set(void __iomem *reg, u32 field) |
|---|
| 447 | | -{ |
|---|
| 448 | | - u32 value; |
|---|
| 449 | | - |
|---|
| 450 | | - value = brcmusb_readl(reg); |
|---|
| 451 | | - brcmusb_writel(value | field, reg); |
|---|
| 452 | | -} |
|---|
| 453 | | - |
|---|
| 454 | | -static inline void usb_ctrl_unset(void __iomem *reg, u32 field) |
|---|
| 455 | | -{ |
|---|
| 456 | | - u32 value; |
|---|
| 457 | | - |
|---|
| 458 | | - value = brcmusb_readl(reg); |
|---|
| 459 | | - brcmusb_writel(value & ~field, reg); |
|---|
| 460 | | -} |
|---|
| 461 | 416 | |
|---|
| 462 | 417 | static u32 brcmusb_usb_mdio_read(void __iomem *ctrl_base, u32 reg, int mode) |
|---|
| 463 | 418 | { |
|---|
| 464 | 419 | u32 data; |
|---|
| 465 | 420 | |
|---|
| 466 | 421 | data = (reg << 16) | mode; |
|---|
| 467 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 422 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 468 | 423 | data |= (1 << 24); |
|---|
| 469 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 424 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 470 | 425 | data &= ~(1 << 24); |
|---|
| 471 | 426 | /* wait for the 60MHz parallel to serial shifter */ |
|---|
| 472 | 427 | usleep_range(10, 20); |
|---|
| 473 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 428 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 474 | 429 | /* wait for the 60MHz parallel to serial shifter */ |
|---|
| 475 | 430 | usleep_range(10, 20); |
|---|
| 476 | 431 | |
|---|
| 477 | | - return brcmusb_readl(USB_CTRL_REG(ctrl_base, MDIO2)) & 0xffff; |
|---|
| 432 | + return brcm_usb_readl(USB_CTRL_REG(ctrl_base, MDIO2)) & 0xffff; |
|---|
| 478 | 433 | } |
|---|
| 479 | 434 | |
|---|
| 480 | 435 | static void brcmusb_usb_mdio_write(void __iomem *ctrl_base, u32 reg, |
|---|
| .. | .. |
|---|
| 483 | 438 | u32 data; |
|---|
| 484 | 439 | |
|---|
| 485 | 440 | data = (reg << 16) | val | mode; |
|---|
| 486 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 441 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 487 | 442 | data |= (1 << 25); |
|---|
| 488 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 443 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 489 | 444 | data &= ~(1 << 25); |
|---|
| 490 | 445 | |
|---|
| 491 | 446 | /* wait for the 60MHz parallel to serial shifter */ |
|---|
| 492 | 447 | usleep_range(10, 20); |
|---|
| 493 | | - brcmusb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 448 | + brcm_usb_writel(data, USB_CTRL_REG(ctrl_base, MDIO)); |
|---|
| 494 | 449 | /* wait for the 60MHz parallel to serial shifter */ |
|---|
| 495 | 450 | usleep_range(10, 20); |
|---|
| 496 | 451 | } |
|---|
| .. | .. |
|---|
| 589 | 544 | { |
|---|
| 590 | 545 | u32 ofs; |
|---|
| 591 | 546 | int ii; |
|---|
| 592 | | - void __iomem *ctrl_base = params->ctrl_regs; |
|---|
| 547 | + void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL]; |
|---|
| 593 | 548 | |
|---|
| 594 | 549 | /* |
|---|
| 595 | 550 | * On newer B53 based SoC's, the reference clock for the |
|---|
| .. | .. |
|---|
| 670 | 625 | |
|---|
| 671 | 626 | static void brcmusb_usb3_phy_workarounds(struct brcm_usb_init_params *params) |
|---|
| 672 | 627 | { |
|---|
| 673 | | - void __iomem *ctrl_base = params->ctrl_regs; |
|---|
| 628 | + void __iomem *ctrl_base = params->regs[BRCM_REGS_CTRL]; |
|---|
| 674 | 629 | |
|---|
| 675 | 630 | brcmusb_usb3_pll_fix(ctrl_base); |
|---|
| 676 | 631 | brcmusb_usb3_pll_54mhz(params); |
|---|
| .. | .. |
|---|
| 712 | 667 | |
|---|
| 713 | 668 | static void brcmusb_usb3_otp_fix(struct brcm_usb_init_params *params) |
|---|
| 714 | 669 | { |
|---|
| 715 | | - void __iomem *xhci_ec_base = params->xhci_ec_regs; |
|---|
| 670 | + void __iomem *xhci_ec_base = params->regs[BRCM_REGS_XHCI_EC]; |
|---|
| 716 | 671 | u32 val; |
|---|
| 717 | 672 | |
|---|
| 718 | | - if (params->family_id != 0x74371000 || xhci_ec_base == 0) |
|---|
| 673 | + if (params->family_id != 0x74371000 || !xhci_ec_base) |
|---|
| 719 | 674 | return; |
|---|
| 720 | | - brcmusb_writel(0xa20c, USB_XHCI_EC_REG(xhci_ec_base, IRAADR)); |
|---|
| 721 | | - val = brcmusb_readl(USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); |
|---|
| 675 | + brcm_usb_writel(0xa20c, USB_XHCI_EC_REG(xhci_ec_base, IRAADR)); |
|---|
| 676 | + val = brcm_usb_readl(USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); |
|---|
| 722 | 677 | |
|---|
| 723 | 678 | /* set cfg_pick_ss_lock */ |
|---|
| 724 | 679 | val |= (1 << 27); |
|---|
| 725 | | - brcmusb_writel(val, USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); |
|---|
| 680 | + brcm_usb_writel(val, USB_XHCI_EC_REG(xhci_ec_base, IRADAT)); |
|---|
| 726 | 681 | |
|---|
| 727 | 682 | /* Reset USB 3.0 PHY for workaround to take effect */ |
|---|
| 728 | | - USB_CTRL_UNSET(params->ctrl_regs, USB30_CTL1, PHY3_RESETB); |
|---|
| 729 | | - USB_CTRL_SET(params->ctrl_regs, USB30_CTL1, PHY3_RESETB); |
|---|
| 683 | + USB_CTRL_UNSET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB); |
|---|
| 684 | + USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_CTL1, PHY3_RESETB); |
|---|
| 730 | 685 | } |
|---|
| 731 | 686 | |
|---|
| 732 | 687 | static void brcmusb_xhci_soft_reset(struct brcm_usb_init_params *params, |
|---|
| .. | .. |
|---|
| 755 | 710 | * - default chip/rev. |
|---|
| 756 | 711 | * NOTE: The minor rev is always ignored. |
|---|
| 757 | 712 | */ |
|---|
| 758 | | -static enum brcm_family_type brcmusb_get_family_type( |
|---|
| 713 | +static enum brcm_family_type get_family_type( |
|---|
| 759 | 714 | struct brcm_usb_init_params *params) |
|---|
| 760 | 715 | { |
|---|
| 761 | 716 | int last_type = -1; |
|---|
| .. | .. |
|---|
| 783 | 738 | return last_type; |
|---|
| 784 | 739 | } |
|---|
| 785 | 740 | |
|---|
| 786 | | -void brcm_usb_init_ipp(struct brcm_usb_init_params *params) |
|---|
| 741 | +static void usb_init_ipp(struct brcm_usb_init_params *params) |
|---|
| 787 | 742 | { |
|---|
| 788 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 743 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 789 | 744 | u32 reg; |
|---|
| 790 | 745 | u32 orig_reg; |
|---|
| 791 | 746 | |
|---|
| .. | .. |
|---|
| 799 | 754 | USB_CTRL_SET_FAMILY(params, USB30_CTL1, USB3_IPP); |
|---|
| 800 | 755 | } |
|---|
| 801 | 756 | |
|---|
| 802 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 757 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 803 | 758 | orig_reg = reg; |
|---|
| 804 | 759 | if (USB_CTRL_MASK_FAMILY(params, SETUP, STRAP_CC_DRD_MODE_ENABLE_SEL)) |
|---|
| 805 | 760 | /* Never use the strap, it's going away. */ |
|---|
| .. | .. |
|---|
| 807 | 762 | SETUP, |
|---|
| 808 | 763 | STRAP_CC_DRD_MODE_ENABLE_SEL)); |
|---|
| 809 | 764 | if (USB_CTRL_MASK_FAMILY(params, SETUP, STRAP_IPP_SEL)) |
|---|
| 765 | + /* override ipp strap pin (if it exits) */ |
|---|
| 810 | 766 | if (params->ipp != 2) |
|---|
| 811 | | - /* override ipp strap pin (if it exits) */ |
|---|
| 812 | 767 | reg &= ~(USB_CTRL_MASK_FAMILY(params, SETUP, |
|---|
| 813 | 768 | STRAP_IPP_SEL)); |
|---|
| 814 | 769 | |
|---|
| .. | .. |
|---|
| 816 | 771 | reg &= ~(USB_CTRL_MASK(SETUP, IPP) | USB_CTRL_MASK(SETUP, IOC)); |
|---|
| 817 | 772 | if (params->ioc) |
|---|
| 818 | 773 | reg |= USB_CTRL_MASK(SETUP, IOC); |
|---|
| 819 | | - if (params->ipp == 1 && ((reg & USB_CTRL_MASK(SETUP, IPP)) == 0)) |
|---|
| 774 | + if (params->ipp == 1) |
|---|
| 820 | 775 | reg |= USB_CTRL_MASK(SETUP, IPP); |
|---|
| 821 | | - brcmusb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 776 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 822 | 777 | |
|---|
| 823 | 778 | /* |
|---|
| 824 | 779 | * If we're changing IPP, make sure power is off long enough |
|---|
| 825 | 780 | * to turn off any connected devices. |
|---|
| 826 | 781 | */ |
|---|
| 827 | | - if (reg != orig_reg) |
|---|
| 782 | + if ((reg ^ orig_reg) & USB_CTRL_MASK(SETUP, IPP)) |
|---|
| 828 | 783 | msleep(50); |
|---|
| 829 | 784 | } |
|---|
| 830 | 785 | |
|---|
| 831 | | -int brcm_usb_init_get_dual_select(struct brcm_usb_init_params *params) |
|---|
| 786 | +static void usb_wake_enable(struct brcm_usb_init_params *params, |
|---|
| 787 | + bool enable) |
|---|
| 832 | 788 | { |
|---|
| 833 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 834 | | - u32 reg = 0; |
|---|
| 789 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 835 | 790 | |
|---|
| 836 | | - if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { |
|---|
| 837 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 838 | | - reg &= USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, |
|---|
| 839 | | - PORT_MODE); |
|---|
| 840 | | - } |
|---|
| 841 | | - return reg; |
|---|
| 791 | + if (enable) |
|---|
| 792 | + USB_CTRL_SET(ctrl, USB_PM, RMTWKUP_EN); |
|---|
| 793 | + else |
|---|
| 794 | + USB_CTRL_UNSET(ctrl, USB_PM, RMTWKUP_EN); |
|---|
| 842 | 795 | } |
|---|
| 843 | 796 | |
|---|
| 844 | | -void brcm_usb_init_set_dual_select(struct brcm_usb_init_params *params, |
|---|
| 845 | | - int mode) |
|---|
| 846 | | -{ |
|---|
| 847 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 848 | | - u32 reg; |
|---|
| 849 | | - |
|---|
| 850 | | - if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { |
|---|
| 851 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 852 | | - reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, |
|---|
| 853 | | - PORT_MODE); |
|---|
| 854 | | - reg |= mode; |
|---|
| 855 | | - brcmusb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 856 | | - } |
|---|
| 857 | | -} |
|---|
| 858 | | - |
|---|
| 859 | | -void brcm_usb_init_common(struct brcm_usb_init_params *params) |
|---|
| 797 | +static void usb_init_common(struct brcm_usb_init_params *params) |
|---|
| 860 | 798 | { |
|---|
| 861 | 799 | u32 reg; |
|---|
| 862 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 800 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 801 | + |
|---|
| 802 | + /* Clear any pending wake conditions */ |
|---|
| 803 | + usb_wake_enable(params, false); |
|---|
| 804 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_PM_STATUS)); |
|---|
| 805 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_PM_STATUS)); |
|---|
| 863 | 806 | |
|---|
| 864 | 807 | /* Take USB out of power down */ |
|---|
| 865 | 808 | if (USB_CTRL_MASK_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN)) { |
|---|
| .. | .. |
|---|
| 885 | 828 | /* Block auto PLL suspend by USB2 PHY (Sasi) */ |
|---|
| 886 | 829 | USB_CTRL_SET(ctrl, PLL_CTL, PLL_SUSPEND_EN); |
|---|
| 887 | 830 | |
|---|
| 888 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 831 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 889 | 832 | if (params->selected_family == BRCM_FAMILY_7364A0) |
|---|
| 890 | 833 | /* Suppress overcurrent indication from USB30 ports for A0 */ |
|---|
| 891 | 834 | reg |= USB_CTRL_MASK_FAMILY(params, SETUP, OC3_DISABLE); |
|---|
| .. | .. |
|---|
| 901 | 844 | reg |= USB_CTRL_MASK_FAMILY(params, SETUP, SCB1_EN); |
|---|
| 902 | 845 | if (USB_CTRL_MASK_FAMILY(params, SETUP, SCB2_EN)) |
|---|
| 903 | 846 | reg |= USB_CTRL_MASK_FAMILY(params, SETUP, SCB2_EN); |
|---|
| 904 | | - brcmusb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 847 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 905 | 848 | |
|---|
| 906 | 849 | brcmusb_memc_fix(params); |
|---|
| 907 | 850 | |
|---|
| 908 | 851 | if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { |
|---|
| 909 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 852 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 910 | 853 | reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, |
|---|
| 911 | 854 | PORT_MODE); |
|---|
| 912 | 855 | reg |= params->mode; |
|---|
| 913 | | - brcmusb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 856 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 914 | 857 | } |
|---|
| 915 | 858 | if (USB_CTRL_MASK_FAMILY(params, USB_PM, BDC_SOFT_RESETB)) { |
|---|
| 916 | 859 | switch (params->mode) { |
|---|
| .. | .. |
|---|
| 932 | 875 | } |
|---|
| 933 | 876 | } |
|---|
| 934 | 877 | |
|---|
| 935 | | -void brcm_usb_init_eohci(struct brcm_usb_init_params *params) |
|---|
| 878 | +static void usb_init_eohci(struct brcm_usb_init_params *params) |
|---|
| 936 | 879 | { |
|---|
| 937 | 880 | u32 reg; |
|---|
| 938 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 881 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 939 | 882 | |
|---|
| 940 | 883 | if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB20_HC_RESETB)) |
|---|
| 941 | 884 | USB_CTRL_SET_FAMILY(params, USB_PM, USB20_HC_RESETB); |
|---|
| .. | .. |
|---|
| 948 | 891 | USB_CTRL_SET(ctrl, EBRIDGE, ESTOP_SCB_REQ); |
|---|
| 949 | 892 | |
|---|
| 950 | 893 | /* Setup the endian bits */ |
|---|
| 951 | | - reg = brcmusb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 894 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 952 | 895 | reg &= ~USB_CTRL_SETUP_ENDIAN_BITS; |
|---|
| 953 | 896 | reg |= USB_CTRL_MASK_FAMILY(params, SETUP, ENDIAN); |
|---|
| 954 | | - brcmusb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 897 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, SETUP)); |
|---|
| 955 | 898 | |
|---|
| 956 | 899 | if (params->selected_family == BRCM_FAMILY_7271A0) |
|---|
| 957 | 900 | /* Enable LS keep alive fix for certain keyboards */ |
|---|
| 958 | 901 | USB_CTRL_SET(ctrl, OBRIDGE, LS_KEEP_ALIVE); |
|---|
| 902 | + |
|---|
| 903 | + if (params->family_id == 0x72550000) { |
|---|
| 904 | + /* |
|---|
| 905 | + * Make the burst size 512 bytes to fix a hardware bug |
|---|
| 906 | + * on the 7255a0. See HW7255-24. |
|---|
| 907 | + */ |
|---|
| 908 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, EBRIDGE)); |
|---|
| 909 | + reg &= ~USB_CTRL_MASK(EBRIDGE, EBR_SCB_SIZE); |
|---|
| 910 | + reg |= 0x800; |
|---|
| 911 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, EBRIDGE)); |
|---|
| 912 | + } |
|---|
| 959 | 913 | } |
|---|
| 960 | 914 | |
|---|
| 961 | | -void brcm_usb_init_xhci(struct brcm_usb_init_params *params) |
|---|
| 915 | +static void usb_init_xhci(struct brcm_usb_init_params *params) |
|---|
| 962 | 916 | { |
|---|
| 963 | | - void __iomem *ctrl = params->ctrl_regs; |
|---|
| 917 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 964 | 918 | |
|---|
| 965 | 919 | USB_CTRL_UNSET(ctrl, USB30_PCTL, PHY3_IDDQ_OVERRIDE); |
|---|
| 966 | 920 | /* 1 millisecond - for USB clocks to settle down */ |
|---|
| .. | .. |
|---|
| 986 | 940 | brcmusb_usb3_otp_fix(params); |
|---|
| 987 | 941 | } |
|---|
| 988 | 942 | |
|---|
| 989 | | -void brcm_usb_uninit_common(struct brcm_usb_init_params *params) |
|---|
| 943 | +static void usb_uninit_common(struct brcm_usb_init_params *params) |
|---|
| 990 | 944 | { |
|---|
| 991 | 945 | if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB_PWRDN)) |
|---|
| 992 | 946 | USB_CTRL_SET_FAMILY(params, USB_PM, USB_PWRDN); |
|---|
| 993 | 947 | |
|---|
| 994 | 948 | if (USB_CTRL_MASK_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN)) |
|---|
| 995 | 949 | USB_CTRL_SET_FAMILY(params, PLL_CTL, PLL_IDDQ_PWRDN); |
|---|
| 950 | + if (params->wake_enabled) |
|---|
| 951 | + usb_wake_enable(params, true); |
|---|
| 996 | 952 | } |
|---|
| 997 | 953 | |
|---|
| 998 | | -void brcm_usb_uninit_eohci(struct brcm_usb_init_params *params) |
|---|
| 954 | +static void usb_uninit_eohci(struct brcm_usb_init_params *params) |
|---|
| 999 | 955 | { |
|---|
| 1000 | | - if (USB_CTRL_MASK_FAMILY(params, USB_PM, USB20_HC_RESETB)) |
|---|
| 1001 | | - USB_CTRL_UNSET_FAMILY(params, USB_PM, USB20_HC_RESETB); |
|---|
| 1002 | 956 | } |
|---|
| 1003 | 957 | |
|---|
| 1004 | | -void brcm_usb_uninit_xhci(struct brcm_usb_init_params *params) |
|---|
| 958 | +static void usb_uninit_xhci(struct brcm_usb_init_params *params) |
|---|
| 1005 | 959 | { |
|---|
| 1006 | 960 | brcmusb_xhci_soft_reset(params, 1); |
|---|
| 1007 | | - USB_CTRL_SET(params->ctrl_regs, USB30_PCTL, PHY3_IDDQ_OVERRIDE); |
|---|
| 961 | + USB_CTRL_SET(params->regs[BRCM_REGS_CTRL], USB30_PCTL, |
|---|
| 962 | + PHY3_IDDQ_OVERRIDE); |
|---|
| 1008 | 963 | } |
|---|
| 1009 | 964 | |
|---|
| 1010 | | -void brcm_usb_set_family_map(struct brcm_usb_init_params *params) |
|---|
| 965 | +static int usb_get_dual_select(struct brcm_usb_init_params *params) |
|---|
| 966 | +{ |
|---|
| 967 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 968 | + u32 reg = 0; |
|---|
| 969 | + |
|---|
| 970 | + pr_debug("%s\n", __func__); |
|---|
| 971 | + if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { |
|---|
| 972 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 973 | + reg &= USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, |
|---|
| 974 | + PORT_MODE); |
|---|
| 975 | + } |
|---|
| 976 | + return reg; |
|---|
| 977 | +} |
|---|
| 978 | + |
|---|
| 979 | +static void usb_set_dual_select(struct brcm_usb_init_params *params, int mode) |
|---|
| 980 | +{ |
|---|
| 981 | + void __iomem *ctrl = params->regs[BRCM_REGS_CTRL]; |
|---|
| 982 | + u32 reg; |
|---|
| 983 | + |
|---|
| 984 | + pr_debug("%s\n", __func__); |
|---|
| 985 | + |
|---|
| 986 | + if (USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, PORT_MODE)) { |
|---|
| 987 | + reg = brcm_usb_readl(USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 988 | + reg &= ~USB_CTRL_MASK_FAMILY(params, USB_DEVICE_CTL1, |
|---|
| 989 | + PORT_MODE); |
|---|
| 990 | + reg |= mode; |
|---|
| 991 | + brcm_usb_writel(reg, USB_CTRL_REG(ctrl, USB_DEVICE_CTL1)); |
|---|
| 992 | + } |
|---|
| 993 | +} |
|---|
| 994 | + |
|---|
| 995 | +static const struct brcm_usb_init_ops bcm7445_ops = { |
|---|
| 996 | + .init_ipp = usb_init_ipp, |
|---|
| 997 | + .init_common = usb_init_common, |
|---|
| 998 | + .init_eohci = usb_init_eohci, |
|---|
| 999 | + .init_xhci = usb_init_xhci, |
|---|
| 1000 | + .uninit_common = usb_uninit_common, |
|---|
| 1001 | + .uninit_eohci = usb_uninit_eohci, |
|---|
| 1002 | + .uninit_xhci = usb_uninit_xhci, |
|---|
| 1003 | + .get_dual_select = usb_get_dual_select, |
|---|
| 1004 | + .set_dual_select = usb_set_dual_select, |
|---|
| 1005 | +}; |
|---|
| 1006 | + |
|---|
| 1007 | +void brcm_usb_dvr_init_7445(struct brcm_usb_init_params *params) |
|---|
| 1011 | 1008 | { |
|---|
| 1012 | 1009 | int fam; |
|---|
| 1013 | 1010 | |
|---|
| 1014 | | - fam = brcmusb_get_family_type(params); |
|---|
| 1011 | + pr_debug("%s\n", __func__); |
|---|
| 1012 | + |
|---|
| 1013 | + fam = get_family_type(params); |
|---|
| 1015 | 1014 | params->selected_family = fam; |
|---|
| 1016 | 1015 | params->usb_reg_bits_map = |
|---|
| 1017 | 1016 | &usb_reg_bits_map_table[fam][0]; |
|---|
| 1018 | 1017 | params->family_name = family_names[fam]; |
|---|
| 1018 | + params->ops = &bcm7445_ops; |
|---|
| 1019 | 1019 | } |
|---|