blob: 8888c6dd0c83258d474c4d4db061eb528b9d7dfb [file] [log] [blame]
arch import user (historical)98d0d302005-07-06 17:13:46 +00001/*
Uwe Hermann8af6d552010-10-17 19:13:18 +00002 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2004 Tyan Computer
5 * Written by Yinghai Lu <yhlu@tyan.com> for Tyan Computer.
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; version 2 of the License.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
arch import user (historical)98d0d302005-07-06 17:13:46 +000015 */
Uwe Hermann7f3d48c2008-10-02 18:19:17 +000016
arch import user (historical)98d0d302005-07-06 17:13:46 +000017#include <console/console.h>
18#include <device/device.h>
19#include <device/pci.h>
20#include <device/pci_ids.h>
21#include <device/pci_ops.h>
Kyösti Mälkki413e3da2015-02-03 08:05:55 +020022#include "chip.h"
arch import user (historical)98d0d302005-07-06 17:13:46 +000023
Uwe Hermann7f3d48c2008-10-02 18:19:17 +000024static void usb1_init(struct device *dev)
25{
26 struct southbridge_nvidia_ck804_config const *conf = dev->chip_info;
Uwe Hermann7f3d48c2008-10-02 18:19:17 +000027
Uwe Hermann7e2fbd52011-01-04 17:36:55 +000028 if (!conf->usb1_hc_reset)
29 return;
30
31 /*
32 * Somehow the warm reset does not really reset the USB
33 * controller. Later, during boot, when the Bus Master bit is
34 * set, the USB controller trashes the memory, causing weird
35 * misbehavior. Was detected on Sun Ultra40, where mptable
36 * was damaged.
37 */
38 u32 bar0 = pci_read_config32(dev, 0x10);
39 u32 *regs = (u32 *) (bar0 & ~0xfff);
40
41 /* OHCI USB HCCommandStatus Register, HostControllerReset bit */
42 regs[2] |= 1;
Roman Kononov958a1f32007-02-02 22:40:10 +000043}
44
Uwe Hermann7f3d48c2008-10-02 18:19:17 +000045static struct device_operations usb_ops = {
arch import user (historical)98d0d302005-07-06 17:13:46 +000046 .read_resources = pci_dev_read_resources,
47 .set_resources = pci_dev_set_resources,
48 .enable_resources = pci_dev_enable_resources,
Roman Kononov958a1f32007-02-02 22:40:10 +000049 .init = usb1_init,
arch import user (historical)98d0d302005-07-06 17:13:46 +000050 .scan_bus = 0,
Jonathan Kollaschc7f3f802010-10-29 15:56:04 +000051 .ops_pci = &ck804_pci_ops,
arch import user (historical)98d0d302005-07-06 17:13:46 +000052};
53
Stefan Reinauerf1cf1f72007-10-24 09:08:58 +000054static const struct pci_driver usb_driver __pci_driver = {
arch import user (historical)98d0d302005-07-06 17:13:46 +000055 .ops = &usb_ops,
56 .vendor = PCI_VENDOR_ID_NVIDIA,
57 .device = PCI_DEVICE_ID_NVIDIA_CK804_USB,
58};