Ever wondered where those "setting incorrect section attributes for
[coreboot.git] / src / southbridge / nvidia / ck804 / ck804_smbus.c
1 /*
2  * Copyright 2004 Tyan Computer
3  *  by yhlu@tyan.com
4  */
5 #include <console/console.h>
6 #include <device/device.h>
7 #include <device/pci.h>
8 #include <device/pci_ids.h>
9 #include <device/pci_ops.h>
10 #include <device/smbus.h>
11 #include <bitops.h>
12 #include <arch/io.h>
13 #include "ck804.h"
14 #include "ck804_smbus.h"
15
16 static int lsmbus_recv_byte(device_t dev)
17 {
18         unsigned device;
19         struct resource *res;
20         struct bus *pbus;
21
22         device = dev->path.u.i2c.device;
23         pbus = get_pbus_smbus(dev);
24
25         res = find_resource(pbus->dev, 0x20 + (pbus->link * 4));
26
27         return do_smbus_recv_byte(res->base, device);
28 }
29         
30 static int lsmbus_send_byte(device_t dev, uint8_t val)
31 {
32         unsigned device;
33         struct resource *res;
34         struct bus *pbus;
35
36         device = dev->path.u.i2c.device;
37         pbus = get_pbus_smbus(dev);
38
39         res = find_resource(pbus->dev, 0x20 + (pbus->link * 4));
40
41         return do_smbus_send_byte(res->base, device, val);
42 }
43
44 static int lsmbus_read_byte(device_t dev, uint8_t address)
45 {
46         unsigned device;
47         struct resource *res;
48         struct bus *pbus;
49
50         device = dev->path.u.i2c.device;
51         pbus = get_pbus_smbus(dev);
52
53         res = find_resource(pbus->dev, 0x20 + (pbus->link * 4));
54
55         return do_smbus_read_byte(res->base, device, address);
56 }
57
58 static int lsmbus_write_byte(device_t dev, uint8_t address, uint8_t val)
59 {
60         unsigned device;
61         struct resource *res;
62         struct bus *pbus;
63
64         device = dev->path.u.i2c.device;
65         pbus = get_pbus_smbus(dev);
66
67         res = find_resource(pbus->dev, 0x20 + (pbus->link * 4));
68
69         return do_smbus_write_byte(res->base, device, address, val);
70 }
71 static struct smbus_bus_operations lops_smbus_bus = {
72         .recv_byte  = lsmbus_recv_byte,
73         .send_byte  = lsmbus_send_byte,
74         .read_byte  = lsmbus_read_byte,
75         .write_byte = lsmbus_write_byte,
76 };
77
78 static void lpci_set_subsystem(device_t dev, unsigned vendor, unsigned device)
79 {
80         pci_write_config32(dev, 0x40,
81                 ((device & 0xffff) << 16) | (vendor & 0xffff));
82 }
83
84 static struct pci_operations lops_pci = {
85         .set_subsystem = lpci_set_subsystem,
86 };
87 static struct device_operations smbus_ops = {
88         .read_resources   = pci_dev_read_resources,
89         .set_resources    = pci_dev_set_resources,
90         .enable_resources = pci_dev_enable_resources,
91         .init             = 0,
92         .scan_bus         = scan_static_bus,
93 //        .enable           = ck804_enable,
94         .ops_pci          = &lops_pci,
95         .ops_smbus_bus    = &lops_smbus_bus,
96 };
97 static const struct pci_driver smbus_driver __pci_driver = {
98         .ops    = &smbus_ops,
99         .vendor = PCI_VENDOR_ID_NVIDIA,
100         .device = PCI_DEVICE_ID_NVIDIA_CK804_SM,
101 };
102