.. | .. |
---|
| 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 | } |
---|