aboutsummaryrefslogtreecommitdiff
path: root/src/ec/lenovo/pmh7/pmh7.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/ec/lenovo/pmh7/pmh7.c')
-rw-r--r--src/ec/lenovo/pmh7/pmh7.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/src/ec/lenovo/pmh7/pmh7.c b/src/ec/lenovo/pmh7/pmh7.c
new file mode 100644
index 0000000000..c9cf1925cf
--- /dev/null
+++ b/src/ec/lenovo/pmh7/pmh7.c
@@ -0,0 +1,56 @@
+#include <arch/io.h>
+#include <console/console.h>
+#include <device/device.h>
+#include <device/pnp.h>
+#include <stdlib.h>
+
+#include "pmh7.h"
+
+void pmh7_register_set_bit(int reg, int bit)
+{
+ char val;
+
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ val = inb(EC_LENOVO_PMH7_DATA);
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ outb(val | (1 << bit), EC_LENOVO_PMH7_DATA);
+}
+
+void pmh7_register_clear_bit(int reg, int bit)
+{
+ char val;
+
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ val = inb(EC_LENOVO_PMH7_DATA);
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ outb(val &= ~(1 << bit), EC_LENOVO_PMH7_DATA);
+}
+
+char pmh7_register_read(int reg)
+{
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ return inb(EC_LENOVO_PMH7_DATA);
+}
+
+void pmh7_register_write(int reg, int val)
+{
+ outb(reg, EC_LENOVO_PMH7_ADDR);
+ outb(val, EC_LENOVO_PMH7_DATA);
+}
+
+static void enable_dev(device_t dev)
+{
+ struct resource *resource;
+ resource = new_resource(dev, EC_LENOVO_PMH7_INDEX);
+ resource->flags = IORESOURCE_IO | IORESOURCE_FIXED;
+ resource->base = EC_LENOVO_PMH7_BASE;
+ resource->size = 16;
+ resource->align = 5;
+ resource->gran = 5;
+
+}
+
+struct chip_operations ec_lenovo_pmh7_ops = {
+ CHIP_NAME("Lenovo Power Management Hardware Hub 7")
+ .enable_dev = enable_dev,
+};