blob: 5e4c2fddb8cec32de8c9a281559056151f1fb2fd [file] [log] [blame]
Felix Held3f3eca92020-01-23 17:12:32 +01001/* SPDX-License-Identifier: GPL-2.0-or-later */
Edward O'Callaghan946bee12014-05-06 18:00:07 +10002
Edward O'Callaghan946bee12014-05-06 18:00:07 +10003#include <device/device.h>
4#include <device/pnp.h>
5#include <superio/conf_mode.h>
Rudolf Marek290bed72014-05-13 16:07:00 +02006#include <pc80/keyboard.h>
Tobias Diedrich1f064d72017-04-14 19:45:51 +02007#include <superio/ite/common/env_ctrl.h>
Edward O'Callaghan946bee12014-05-06 18:00:07 +10008
9#include "chip.h"
10#include "it8728f.h"
Edward O'Callaghan946bee12014-05-06 18:00:07 +100011
Edward O'Callaghanf21bdc32014-10-21 07:43:41 +110012static void it8728f_init(struct device *dev)
Edward O'Callaghan946bee12014-05-06 18:00:07 +100013{
Tobias Diedrich1f064d72017-04-14 19:45:51 +020014 const struct superio_ite_it8728f_config *conf = dev->chip_info;
15 const struct resource *res;
16
Edward O'Callaghan946bee12014-05-06 18:00:07 +100017 if (!dev->enabled)
18 return;
19
Elyes HAOUAS0ce41f12018-11-13 10:03:31 +010020 switch (dev->path.pnp.device) {
Tobias Diedrich1f064d72017-04-14 19:45:51 +020021 /* TODO: Might potentially need code for FDC etc. */
Rudolf Marek290bed72014-05-13 16:07:00 +020022 case IT8728F_EC:
Angel Ponsc167b742021-11-03 13:25:02 +010023 res = probe_resource(dev, PNP_IDX_IO0);
Tobias Diedrich1f064d72017-04-14 19:45:51 +020024 if (!conf || !res)
25 break;
26 ite_ec_init(res->base, &conf->ec);
Edward O'Callaghan946bee12014-05-06 18:00:07 +100027 break;
Rudolf Marek290bed72014-05-13 16:07:00 +020028 case IT8728F_KBCK:
29 set_kbc_ps2_mode();
Timothy Pearson448e3862015-11-24 14:12:01 -060030 pc_keyboard_init(NO_AUX_DEVICE);
Rudolf Marek290bed72014-05-13 16:07:00 +020031 break;
Edward O'Callaghan946bee12014-05-06 18:00:07 +100032 }
33}
34
35static struct device_operations ops = {
36 .read_resources = pnp_read_resources,
37 .set_resources = pnp_set_resources,
38 .enable_resources = pnp_enable_resources,
39 .enable = pnp_alt_enable,
40 .init = it8728f_init,
41 .ops_pnp_mode = &pnp_conf_mode_870155_aa,
42};
43
Edward O'Callaghan946bee12014-05-06 18:00:07 +100044static struct pnp_info pnp_dev_info[] = {
Felix Heldc40275b2017-12-27 22:11:30 +010045 { NULL, IT8728F_FDC, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, 0x0ff8, },
46 { NULL, IT8728F_SP1, PNP_IO0 | PNP_IRQ0, 0x0ff8, },
47 { NULL, IT8728F_SP2, PNP_IO0 | PNP_IRQ0, 0x0ff8, },
48 { NULL, IT8728F_PP, PNP_IO0 | PNP_IRQ0 | PNP_DRQ0, 0x0ffc, },
49 { NULL, IT8728F_EC, PNP_IO0 | PNP_IO1 | PNP_IRQ0, 0x0ff8, 0x0ff8, },
50 { NULL, IT8728F_KBCK, PNP_IO0 | PNP_IO1 | PNP_IRQ0, 0x0fff, 0x0fff, },
51 { NULL, IT8728F_KBCM, PNP_IRQ0, },
52 { NULL, IT8728F_GPIO, PNP_IO0 | PNP_IO1 | PNP_IO2 | PNP_IRQ0,
53 0x0fff, 0x0ff8, 0x0ff8, },
54 { NULL, IT8728F_IR, PNP_IO0 | PNP_IRQ0, 0x0ff8, },
Edward O'Callaghan946bee12014-05-06 18:00:07 +100055};
56
Edward O'Callaghanf21bdc32014-10-21 07:43:41 +110057static void enable_dev(struct device *dev)
Edward O'Callaghan946bee12014-05-06 18:00:07 +100058{
59 pnp_enable_devices(dev, &ops, ARRAY_SIZE(pnp_dev_info), pnp_dev_info);
60}
61
62struct chip_operations superio_ite_it8728f_ops = {
Nicholas Sudsgaardbfb11be2024-01-30 09:53:46 +090063 .name = "ITE IT8728F Super I/O",
Edward O'Callaghan946bee12014-05-06 18:00:07 +100064 .enable_dev = enable_dev
65};