blob: 6689fb854cb3024b3fb892ef0f4eef7b166565bb [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
Stefan Reinauerdebb11f2008-10-29 04:46:52 +00002
3#include <console/console.h>
4#include <device/device.h>
5#include <device/pci.h>
Kyösti Mälkkif1b58b72019-03-01 13:43:02 +02006#include <device/pci_ops.h>
Stefan Reinauerdebb11f2008-10-29 04:46:52 +00007#include <device/pci_ids.h>
8#include "i82801gx.h"
9
10static void usb_init(struct device *dev)
11{
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000012 u8 reg8;
13
14 /* USB Specification says the device must be Bus Master */
Stefan Reinauerc02b4fc2010-03-22 11:42:32 +000015 printk(BIOS_DEBUG, "UHCI: Setting up controller.. ");
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000016
Elyes HAOUAS12349252020-04-27 05:08:26 +020017 pci_or_config16(dev, PCI_COMMAND, PCI_COMMAND_MASTER);
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000018
Stefan Reinauer7a3d0952010-01-17 13:49:07 +000019 // Erratum
20 pci_write_config8(dev, 0xca, 0x00);
21
22 // Yes. Another Erratum
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000023 reg8 = pci_read_config8(dev, 0xca);
24 reg8 |= (1 << 0);
25 pci_write_config8(dev, 0xca, reg8);
26
Stefan Reinauerc02b4fc2010-03-22 11:42:32 +000027 printk(BIOS_DEBUG, "done.\n");
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000028}
29
Stefan Reinauera8e11682009-03-11 14:54:18 +000030static struct pci_operations usb_pci_ops = {
Elyes HAOUAS92646ea2020-04-04 13:43:03 +020031 .set_subsystem = pci_dev_set_subsystem,
Stefan Reinauera8e11682009-03-11 14:54:18 +000032};
33
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000034static struct device_operations usb_ops = {
35 .read_resources = pci_dev_read_resources,
36 .set_resources = pci_dev_set_resources,
37 .enable_resources = pci_dev_enable_resources,
38 .init = usb_init,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000039 .enable = i82801gx_enable,
Stefan Reinauera8e11682009-03-11 14:54:18 +000040 .ops_pci = &usb_pci_ops,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000041};
42
43/* 82801GB/GR/GDH/GBM/GHM/GU (ICH7/ICH7R/ICH7DH/ICH7-M/ICH7-M DH/ICH7-U) */
44static const struct pci_driver i82801gb_usb1 __pci_driver = {
45 .ops = &usb_ops,
46 .vendor = PCI_VENDOR_ID_INTEL,
Uwe Hermann5d7a1c82008-10-31 18:41:09 +000047 .device = 0x27c8,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000048};
49
Uwe Hermannbddc6932008-10-29 13:51:31 +000050/* 82801GB/GR/GDH/GBM/GHM/GU (ICH7/ICH7R/ICH7DH/ICH7-M/ICH7-M DH/ICH7-U) */
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000051static const struct pci_driver i82801gb_usb2 __pci_driver = {
52 .ops = &usb_ops,
53 .vendor = PCI_VENDOR_ID_INTEL,
Uwe Hermann5d7a1c82008-10-31 18:41:09 +000054 .device = 0x27c9,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000055};
56
Uwe Hermannbddc6932008-10-29 13:51:31 +000057/* 82801GB/GR/GDH/GBM/GHM/GU (ICH7/ICH7R/ICH7DH/ICH7-M/ICH7-M DH/ICH7-U) */
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000058static const struct pci_driver i82801gb_usb3 __pci_driver = {
59 .ops = &usb_ops,
60 .vendor = PCI_VENDOR_ID_INTEL,
Uwe Hermann5d7a1c82008-10-31 18:41:09 +000061 .device = 0x27ca,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000062};
63
Uwe Hermannbddc6932008-10-29 13:51:31 +000064/* 82801GB/GR/GDH/GBM/GHM/GU (ICH7/ICH7R/ICH7DH/ICH7-M/ICH7-M DH/ICH7-U) */
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000065static const struct pci_driver i82801gb_usb4 __pci_driver = {
66 .ops = &usb_ops,
67 .vendor = PCI_VENDOR_ID_INTEL,
Uwe Hermann5d7a1c82008-10-31 18:41:09 +000068 .device = 0x27cb,
Stefan Reinauerdebb11f2008-10-29 04:46:52 +000069};