blob: efb50cd6f70f1b48d08b7e65f171b6b93fc7acaa [file] [log] [blame]
Angel Ponsae593872020-04-04 18:50:57 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Marc Jones24484842017-05-04 21:17:45 -06002
3#include <console/console.h>
4#include <device/device.h>
5#include <device/pci.h>
6#include <device/pci_ids.h>
7#include <device/pci_ops.h>
8#include <device/pci_ehci.h>
Duncan Laurie32bdffa2018-05-07 15:37:28 -07009#include <soc/acpi.h>
Marc Jonesfb4c7d22017-11-22 22:16:31 -070010#include <soc/pci_devs.h>
Marc Jonesdfeb1c42017-08-07 19:08:24 -060011#include <soc/southbridge.h>
Marshall Dawson69486ca2019-05-02 12:03:45 -060012#include <amdblocks/acpimmio.h>
Marc Jonesfb4c7d22017-11-22 22:16:31 -070013
14static void set_usb_over_current(struct device *dev)
15{
16 uint16_t map = USB_OC_DISABLE_ALL;
17
18 if (dev->path.pci.devfn == XHCI_DEVFN) {
19 if (mainboard_get_xhci_oc_map(&map) == 0) {
20 xhci_pm_write32(XHCI_PM_INDIRECT_INDEX,
21 XHCI_OVER_CURRENT_CONTROL);
22 xhci_pm_write16(XHCI_PM_INDIRECT_DATA, map);
23 }
24 }
25
26 if (dev->path.pci.devfn == EHCI1_DEVFN) {
27 if (mainboard_get_ehci_oc_map(&map) == 0)
28 pci_write_config16(dev, EHCI_OVER_CURRENT_CONTROL, map);
29 }
30}
31
Aaron Durbin64031672018-04-21 14:45:32 -060032int __weak mainboard_get_xhci_oc_map(uint16_t *map)
Marc Jonesfb4c7d22017-11-22 22:16:31 -070033{
34 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
35 return -1;
36}
37
Aaron Durbin64031672018-04-21 14:45:32 -060038int __weak mainboard_get_ehci_oc_map(uint16_t *map)
Marc Jonesfb4c7d22017-11-22 22:16:31 -070039{
40 printk(BIOS_DEBUG, "WEAK: %s/%s called\n", __FILE__, __func__);
41 return -1;
42}
43
Marc Jones24484842017-05-04 21:17:45 -060044static struct device_operations usb_ops = {
45 .read_resources = pci_ehci_read_resources,
46 .set_resources = pci_dev_set_resources,
47 .enable_resources = pci_dev_enable_resources,
Marc Jonesfb4c7d22017-11-22 22:16:31 -070048 .init = set_usb_over_current,
Nico Hubera89c82e2017-09-14 15:40:28 +020049 .scan_bus = scan_static_bus,
Duncan Laurie32bdffa2018-05-07 15:37:28 -070050 .acpi_name = soc_acpi_name,
Angel Pons1fc0edd2020-05-31 00:03:28 +020051 .ops_pci = &pci_dev_ops_pci,
Marc Jones24484842017-05-04 21:17:45 -060052};
53
54static const unsigned short pci_device_ids[] = {
Felix Singer43b7f412022-03-07 04:34:52 +010055 PCI_DID_AMD_SB900_USB_18_0,
56 PCI_DID_AMD_SB900_USB_18_2,
57 PCI_DID_AMD_SB900_USB_20_5,
58 PCI_DID_AMD_CZ_USB_0,
59 PCI_DID_AMD_CZ_USB_1,
60 PCI_DID_AMD_CZ_USB3_0,
Marc Jones24484842017-05-04 21:17:45 -060061 0
62};
63
64static const struct pci_driver usb_0_driver __pci_driver = {
65 .ops = &usb_ops,
Felix Singer43b7f412022-03-07 04:34:52 +010066 .vendor = PCI_VID_AMD,
Marc Jones24484842017-05-04 21:17:45 -060067 .devices = pci_device_ids,
68};