blob: 8c7fc695cc15878f07be4ee33453fdce25bc886a [file] [log] [blame]
Felix Held3f3eca92020-01-23 17:12:32 +01001/* SPDX-License-Identifier: GPL-2.0-or-later */
2/* This file is part of the coreboot project. */
Samuel Holland1318ea62017-06-03 03:52:57 -05003
4#include <device/device.h>
5#include <device/pnp.h>
6#include <pc80/keyboard.h>
Kyösti Mälkkicbf95712020-01-05 08:05:45 +02007#include <option.h>
Samuel Holland1318ea62017-06-03 03:52:57 -05008#include <superio/ite/common/env_ctrl.h>
9#include <superio/conf_mode.h>
Samuel Hollandc622dc52018-03-30 15:14:17 -050010#include <types.h>
Samuel Holland1318ea62017-06-03 03:52:57 -050011
12#include "chip.h"
13#include "it8720f.h"
14
Samuel Hollandc622dc52018-03-30 15:14:17 -050015#define MAINBOARD_POWER_OFF 0
16#define MAINBOARD_POWER_ON 1
17#define MAINBOARD_POWER_KEEP 2
18
19static void power_control_init(struct device *dev)
20{
21 int power_on = MAINBOARD_POWER_OFF;
Felix Helde37d7712018-07-26 20:02:38 +020022 u8 value;
Samuel Hollandc622dc52018-03-30 15:14:17 -050023
24 get_option(&power_on, "power_on_after_fail");
Felix Helde37d7712018-07-26 20:02:38 +020025
Samuel Hollandc622dc52018-03-30 15:14:17 -050026 pnp_enter_conf_mode(dev);
27 pnp_set_logical_device(dev);
Felix Helde37d7712018-07-26 20:02:38 +020028
29 value = pnp_read_config(dev, IT8720F_EC_PCR1);
30 if (power_on == MAINBOARD_POWER_KEEP)
31 value |= (1 << 5);
32 else
33 value &= ~(1 << 5);
34 pnp_write_config(dev, IT8720F_EC_PCR1, value);
35
36 value = pnp_read_config(dev, IT8720F_EC_PCR2);
37 if (power_on == MAINBOARD_POWER_ON)
38 value |= (1 << 5);
39 else
40 value &= ~(1 << 5);
41 pnp_write_config(dev, IT8720F_EC_PCR2, value);
42
Samuel Hollandc622dc52018-03-30 15:14:17 -050043 pnp_exit_conf_mode(dev);
44}
45
Samuel Holland1318ea62017-06-03 03:52:57 -050046static void it8720f_init(struct device *dev)
47{
48 const struct superio_ite_it8720f_config *conf;
49 const struct resource *res;
50
51 if (!dev->enabled)
52 return;
53
54 switch (dev->path.pnp.device) {
55 case IT8720F_EC:
56 conf = dev->chip_info;
57 res = find_resource(dev, PNP_IDX_IO0);
58 if (!conf || !res)
59 break;
60 ite_ec_init(res->base, &conf->ec);
Samuel Hollandc622dc52018-03-30 15:14:17 -050061 power_control_init(dev);
Samuel Holland1318ea62017-06-03 03:52:57 -050062 break;
63 case IT8720F_KBCK:
64 pc_keyboard_init(NO_AUX_DEVICE);
65 break;
66 default:
67 break;
68 }
69}
70
71static struct device_operations ops = {
72 .read_resources = pnp_read_resources,
73 .set_resources = pnp_set_resources,
74 .enable_resources = pnp_enable_resources,
75 .enable = pnp_enable,
76 .init = it8720f_init,
77 .ops_pnp_mode = &pnp_conf_mode_870155_aa,
78};
79
80static struct pnp_info pnp_dev_info[] = {
Felix Heldc40275b2017-12-27 22:11:30 +010081 { NULL, IT8720F_FDC,
Samuel Holland1318ea62017-06-03 03:52:57 -050082 PNP_IO0 | PNP_IRQ0 | PNP_DRQ0 | PNP_MSC0 | PNP_MSC1,
Samuel Holland7daac912017-06-06 22:55:01 -050083 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +010084 { NULL, IT8720F_SP1,
Samuel Holland1318ea62017-06-03 03:52:57 -050085 PNP_IO0 | PNP_IRQ0 | PNP_MSC0 | PNP_MSC1,
Samuel Holland7daac912017-06-06 22:55:01 -050086 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +010087 { NULL, IT8720F_SP2,
Samuel Holland1318ea62017-06-03 03:52:57 -050088 PNP_IO0 | PNP_IRQ0 | PNP_MSC0 | PNP_MSC1,
Samuel Holland7daac912017-06-06 22:55:01 -050089 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +010090 { NULL, IT8720F_PP,
Samuel Holland1318ea62017-06-03 03:52:57 -050091 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_DRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -050092 0x0ff8, 0x0ffc, },
Felix Heldc40275b2017-12-27 22:11:30 +010093 { NULL, IT8720F_EC,
Samuel Holland1318ea62017-06-03 03:52:57 -050094 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_MSC0 | PNP_MSC1 | PNP_MSC2 |
95 PNP_MSC3 | PNP_MSC4 | PNP_MSC5 | PNP_MSC6,
Samuel Holland7daac912017-06-06 22:55:01 -050096 0x0ff8, 0x0ffc, },
Felix Heldc40275b2017-12-27 22:11:30 +010097 { NULL, IT8720F_KBCK,
Samuel Holland1318ea62017-06-03 03:52:57 -050098 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -050099 0x0fff, 0x0fff, },
Felix Heldc40275b2017-12-27 22:11:30 +0100100 { NULL, IT8720F_KBCM,
Samuel Holland1318ea62017-06-03 03:52:57 -0500101 PNP_IRQ0 | PNP_MSC0, },
Felix Heldc40275b2017-12-27 22:11:30 +0100102 { NULL, IT8720F_GPIO,
Samuel Holland1318ea62017-06-03 03:52:57 -0500103 PNP_IO0 | PNP_IO1 | PNP_IO2 | PNP_MSC0 | PNP_MSC1 | PNP_MSC2 |
104 PNP_MSC3 | PNP_MSC4 | PNP_MSC5 | PNP_MSC6 | PNP_MSC7 |
105 PNP_MSC8 | PNP_MSC9 | PNP_MSCA | PNP_MSCB | PNP_MSCD | PNP_MSCE,
Samuel Holland7daac912017-06-06 22:55:01 -0500106 0x0ff8, 0x0ff8, 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +0100107 { NULL, IT8720F_CIR,
Samuel Holland1318ea62017-06-03 03:52:57 -0500108 PNP_IO0 | PNP_IRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -0500109 0x0ff8, },
Samuel Holland1318ea62017-06-03 03:52:57 -0500110};
111
112static void enable_dev(struct device *dev)
113{
Felix Heldc40275b2017-12-27 22:11:30 +0100114 pnp_enable_devices(dev, &ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
Samuel Holland1318ea62017-06-03 03:52:57 -0500115}
116
117struct chip_operations superio_ite_it8720f_ops = {
118 CHIP_NAME("ITE IT8720F Super I/O")
119 .enable_dev = enable_dev,
120};