blob: d5ec57242975108a426853205595af7ae2e224a4 [file] [log] [blame]
Jonathan A. Kollaschd9628ec2015-06-14 13:13:52 -05001#include <arch/io.h>
2#include <console/console.h>
Vladimir Serbinenko6985d4e2014-09-21 14:31:19 +02003#include <device/device.h>
Jonathan A. Kollaschd9628ec2015-06-14 13:13:52 -05004#include <device/pnp_def.h>
5#include <stdlib.h>
6#include <superio/winbond/w83627thg/w83627thg.h>
7
8static void hwm_write(u16 base, u8 bank, u8 reg, u8 value)
9{
10 outb(0x4e, base + 0x05);
11 outb(bank, base + 0x06);
12 outb(reg, base + 0x05);
13 outb(value, base + 0x06);
14}
15
16static void mb6047_hwm_init(void)
17{
18 device_t dev;
19 struct resource *res;
20 size_t i;
21
22 static const struct { u8 bnk; u8 idx; u8 dat; } hwmtab[] = {
23 { 0x00, 0x5d, 0x05 }, /* CPUTIN diode */
24 { 0x04, 0x55, 0x32 }, /* CPUTIN offset */
25 { 0x00, 0x4e, 0x00 }, /* reset bank */
26 };
27
28 dev = dev_find_slot_pnp(0x2e, W83627THG_HWM);
29 if (dev == NULL)
30 return;
31
32 res = find_resource(dev, PNP_IDX_IO0);
33 if (res == NULL)
34 return;
35
36 printk(BIOS_INFO, "setting up hardware monitor at 0x%04x\n", (unsigned int)res->base);
37
38 /* Init hardware monitor. */
39 for (i = 0; i < ARRAY_SIZE(hwmtab); i++) {
40 hwm_write(res->base, hwmtab[i].bnk, hwmtab[i].idx, hwmtab[i].dat);
41 }
42}
43
44static void mb6047_mainboard_init(device_t dev)
45{
46 mb6047_hwm_init();
47}
Vladimir Serbinenko6985d4e2014-09-21 14:31:19 +020048
49static void mainboard_enable(device_t dev)
50{
Jonathan A. Kollaschd9628ec2015-06-14 13:13:52 -050051 dev->ops->init = mb6047_mainboard_init;
Vladimir Serbinenko6985d4e2014-09-21 14:31:19 +020052}
53
54struct chip_operations mainboard_ops = {
55 .enable_dev = mainboard_enable,
56};