blob: 8fd124a5a3a96f68bf575024cc6060854d999c21 [file] [log] [blame]
Angel Pons182dbde2020-04-02 23:49:05 +02001/* SPDX-License-Identifier: GPL-2.0-only */
zbao246e84b2012-07-13 18:47:03 +08002
zbao246e84b2012-07-13 18:47:03 +08003#include <device/device.h>
4#include <device/pci.h>
5#include <device/pci_ids.h>
zbao246e84b2012-07-13 18:47:03 +08006#include <device/smbus.h>
zbao246e84b2012-07-13 18:47:03 +08007#include <arch/ioapic.h>
Elyes HAOUAS400f9ca2019-06-23 07:01:22 +02008
zbao246e84b2012-07-13 18:47:03 +08009#include "hudson.h"
10#include "smbus.c"
11
12#define NMI_OFF 0
13
14#define MAINBOARD_POWER_OFF 0
15#define MAINBOARD_POWER_ON 1
16
zbao246e84b2012-07-13 18:47:03 +080017/*
18* HUDSON enables all USB controllers by default in SMBUS Control.
19* HUDSON enables SATA by default in SMBUS Control.
20*/
21
Elyes HAOUASa93e7542018-05-19 14:30:47 +020022static void sm_init(struct device *dev)
zbao246e84b2012-07-13 18:47:03 +080023{
Kevin Paul Herbertbde6d302014-12-24 18:43:20 -080024 setup_ioapic(VIO_APIC_VADDR, CONFIG_MAX_CPUS);
zbao246e84b2012-07-13 18:47:03 +080025}
26
Elyes HAOUASa93e7542018-05-19 14:30:47 +020027static int lsmbus_recv_byte(struct device *dev)
zbao246e84b2012-07-13 18:47:03 +080028{
29 u32 device;
30 struct resource *res;
31 struct bus *pbus;
32
33 device = dev->path.i2c.device;
34 pbus = get_pbus_smbus(dev);
35
36 res = find_resource(pbus->dev, 0x90);
37
38 return do_smbus_recv_byte(res->base, device);
39}
40
Elyes HAOUASa93e7542018-05-19 14:30:47 +020041static int lsmbus_send_byte(struct device *dev, u8 val)
zbao246e84b2012-07-13 18:47:03 +080042{
43 u32 device;
44 struct resource *res;
45 struct bus *pbus;
46
47 device = dev->path.i2c.device;
48 pbus = get_pbus_smbus(dev);
49
50 res = find_resource(pbus->dev, 0x90);
51
52 return do_smbus_send_byte(res->base, device, val);
53}
54
Elyes HAOUASa93e7542018-05-19 14:30:47 +020055static int lsmbus_read_byte(struct device *dev, u8 address)
zbao246e84b2012-07-13 18:47:03 +080056{
57 u32 device;
58 struct resource *res;
59 struct bus *pbus;
60
61 device = dev->path.i2c.device;
62 pbus = get_pbus_smbus(dev);
63
64 res = find_resource(pbus->dev, 0x90);
65
66 return do_smbus_read_byte(res->base, device, address);
67}
68
Elyes HAOUASa93e7542018-05-19 14:30:47 +020069static int lsmbus_write_byte(struct device *dev, u8 address, u8 val)
zbao246e84b2012-07-13 18:47:03 +080070{
71 u32 device;
72 struct resource *res;
73 struct bus *pbus;
74
75 device = dev->path.i2c.device;
76 pbus = get_pbus_smbus(dev);
77
78 res = find_resource(pbus->dev, 0x90);
79
80 return do_smbus_write_byte(res->base, device, address, val);
81}
82static struct smbus_bus_operations lops_smbus_bus = {
83 .recv_byte = lsmbus_recv_byte,
84 .send_byte = lsmbus_send_byte,
85 .read_byte = lsmbus_read_byte,
86 .write_byte = lsmbus_write_byte,
87};
88
Elyes HAOUASa93e7542018-05-19 14:30:47 +020089static void hudson_sm_read_resources(struct device *dev)
zbao246e84b2012-07-13 18:47:03 +080090{
91}
92
93static void hudson_sm_set_resources(struct device *dev)
94{
95}
96
zbao246e84b2012-07-13 18:47:03 +080097static struct device_operations smbus_ops = {
98 .read_resources = hudson_sm_read_resources,
99 .set_resources = hudson_sm_set_resources,
100 .enable_resources = pci_dev_enable_resources,
101 .init = sm_init,
Kyösti Mälkkid0e212c2015-02-26 20:47:47 +0200102 .scan_bus = scan_smbus,
Angel Pons1fc0edd2020-05-31 00:03:28 +0200103 .ops_pci = &pci_dev_ops_pci,
zbao246e84b2012-07-13 18:47:03 +0800104 .ops_smbus_bus = &lops_smbus_bus,
105};
106static const struct pci_driver smbus_driver __pci_driver = {
107 .ops = &smbus_ops,
Felix Singer43b7f412022-03-07 04:34:52 +0100108 .vendor = PCI_VID_AMD,
109 .device = PCI_DID_AMD_SB900_SM,
zbao246e84b2012-07-13 18:47:03 +0800110};