blob: c63fa9ab4faa46dceb69b647fa66e6786591008f [file] [log] [blame]
Felix Held3f3eca92020-01-23 17:12:32 +01001/* SPDX-License-Identifier: GPL-2.0-or-later */
Samuel Holland1318ea62017-06-03 03:52:57 -05002
3#include <device/device.h>
4#include <device/pnp.h>
5#include <pc80/keyboard.h>
Kyösti Mälkkicbf95712020-01-05 08:05:45 +02006#include <option.h>
Samuel Holland1318ea62017-06-03 03:52:57 -05007#include <superio/ite/common/env_ctrl.h>
8#include <superio/conf_mode.h>
Samuel Hollandc622dc52018-03-30 15:14:17 -05009#include <types.h>
Samuel Holland1318ea62017-06-03 03:52:57 -050010
11#include "chip.h"
12#include "it8720f.h"
13
Samuel Hollandc622dc52018-03-30 15:14:17 -050014#define MAINBOARD_POWER_OFF 0
15#define MAINBOARD_POWER_ON 1
16#define MAINBOARD_POWER_KEEP 2
17
18static void power_control_init(struct device *dev)
19{
Angel Pons88dcb312021-04-26 17:10:28 +020020 unsigned int power_on = get_uint_option("power_on_after_fail", MAINBOARD_POWER_OFF);
Felix Helde37d7712018-07-26 20:02:38 +020021 u8 value;
Samuel Hollandc622dc52018-03-30 15:14:17 -050022
Samuel Hollandc622dc52018-03-30 15:14:17 -050023 pnp_enter_conf_mode(dev);
24 pnp_set_logical_device(dev);
Felix Helde37d7712018-07-26 20:02:38 +020025
26 value = pnp_read_config(dev, IT8720F_EC_PCR1);
27 if (power_on == MAINBOARD_POWER_KEEP)
28 value |= (1 << 5);
29 else
30 value &= ~(1 << 5);
31 pnp_write_config(dev, IT8720F_EC_PCR1, value);
32
33 value = pnp_read_config(dev, IT8720F_EC_PCR2);
34 if (power_on == MAINBOARD_POWER_ON)
35 value |= (1 << 5);
36 else
37 value &= ~(1 << 5);
38 pnp_write_config(dev, IT8720F_EC_PCR2, value);
39
Samuel Hollandc622dc52018-03-30 15:14:17 -050040 pnp_exit_conf_mode(dev);
41}
42
Samuel Holland1318ea62017-06-03 03:52:57 -050043static void it8720f_init(struct device *dev)
44{
45 const struct superio_ite_it8720f_config *conf;
46 const struct resource *res;
47
48 if (!dev->enabled)
49 return;
50
51 switch (dev->path.pnp.device) {
52 case IT8720F_EC:
53 conf = dev->chip_info;
54 res = find_resource(dev, PNP_IDX_IO0);
55 if (!conf || !res)
56 break;
57 ite_ec_init(res->base, &conf->ec);
Samuel Hollandc622dc52018-03-30 15:14:17 -050058 power_control_init(dev);
Samuel Holland1318ea62017-06-03 03:52:57 -050059 break;
60 case IT8720F_KBCK:
61 pc_keyboard_init(NO_AUX_DEVICE);
62 break;
63 default:
64 break;
65 }
66}
67
68static struct device_operations ops = {
69 .read_resources = pnp_read_resources,
70 .set_resources = pnp_set_resources,
71 .enable_resources = pnp_enable_resources,
72 .enable = pnp_enable,
73 .init = it8720f_init,
74 .ops_pnp_mode = &pnp_conf_mode_870155_aa,
75};
76
77static struct pnp_info pnp_dev_info[] = {
Felix Heldc40275b2017-12-27 22:11:30 +010078 { NULL, IT8720F_FDC,
Samuel Holland1318ea62017-06-03 03:52:57 -050079 PNP_IO0 | PNP_IRQ0 | PNP_DRQ0 | PNP_MSC0 | PNP_MSC1,
Samuel Holland7daac912017-06-06 22:55:01 -050080 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +010081 { NULL, IT8720F_SP1,
Samuel Holland1318ea62017-06-03 03:52:57 -050082 PNP_IO0 | PNP_IRQ0 | PNP_MSC0 | PNP_MSC1,
Samuel Holland7daac912017-06-06 22:55:01 -050083 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +010084 { NULL, IT8720F_SP2,
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_PP,
Samuel Holland1318ea62017-06-03 03:52:57 -050088 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_DRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -050089 0x0ff8, 0x0ffc, },
Felix Heldc40275b2017-12-27 22:11:30 +010090 { NULL, IT8720F_EC,
Samuel Holland1318ea62017-06-03 03:52:57 -050091 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_MSC0 | PNP_MSC1 | PNP_MSC2 |
92 PNP_MSC3 | PNP_MSC4 | PNP_MSC5 | PNP_MSC6,
Samuel Holland7daac912017-06-06 22:55:01 -050093 0x0ff8, 0x0ffc, },
Felix Heldc40275b2017-12-27 22:11:30 +010094 { NULL, IT8720F_KBCK,
Samuel Holland1318ea62017-06-03 03:52:57 -050095 PNP_IO0 | PNP_IO1 | PNP_IRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -050096 0x0fff, 0x0fff, },
Felix Heldc40275b2017-12-27 22:11:30 +010097 { NULL, IT8720F_KBCM,
Samuel Holland1318ea62017-06-03 03:52:57 -050098 PNP_IRQ0 | PNP_MSC0, },
Felix Heldc40275b2017-12-27 22:11:30 +010099 { NULL, IT8720F_GPIO,
Samuel Holland1318ea62017-06-03 03:52:57 -0500100 PNP_IO0 | PNP_IO1 | PNP_IO2 | PNP_MSC0 | PNP_MSC1 | PNP_MSC2 |
101 PNP_MSC3 | PNP_MSC4 | PNP_MSC5 | PNP_MSC6 | PNP_MSC7 |
102 PNP_MSC8 | PNP_MSC9 | PNP_MSCA | PNP_MSCB | PNP_MSCD | PNP_MSCE,
Samuel Holland7daac912017-06-06 22:55:01 -0500103 0x0ff8, 0x0ff8, 0x0ff8, },
Felix Heldc40275b2017-12-27 22:11:30 +0100104 { NULL, IT8720F_CIR,
Samuel Holland1318ea62017-06-03 03:52:57 -0500105 PNP_IO0 | PNP_IRQ0 | PNP_MSC0,
Samuel Holland7daac912017-06-06 22:55:01 -0500106 0x0ff8, },
Samuel Holland1318ea62017-06-03 03:52:57 -0500107};
108
109static void enable_dev(struct device *dev)
110{
Felix Heldc40275b2017-12-27 22:11:30 +0100111 pnp_enable_devices(dev, &ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
Samuel Holland1318ea62017-06-03 03:52:57 -0500112}
113
114struct chip_operations superio_ite_it8720f_ops = {
115 CHIP_NAME("ITE IT8720F Super I/O")
116 .enable_dev = enable_dev,
117};