+static int acpi_ec_intr_read(union acpi_ec *ec, u8 address, u32 * data)
+{
+ int status = 0;
+ u32 glk;
+
+ ACPI_FUNCTION_TRACE("acpi_ec_read");
+
+ if (!ec || !data)
+ return_VALUE(-EINVAL);
+
+ *data = 0;
+
+ if (ec->common.global_lock) {
+ status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
+ if (ACPI_FAILURE(status))
+ return_VALUE(-ENODEV);
+ }
+
+ WARN_ON(in_interrupt());
+ down(&ec->intr.sem);
+
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
+ goto end;
+ }
+ acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
+ &ec->common.command_addr);
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "read EC, IB not empty\n");
+ }
+
+ acpi_hw_low_level_write(8, address, &ec->common.data_addr);
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "read EC, OB not full\n");
+ goto end;
+ }
+ acpi_hw_low_level_read(8, data, &ec->common.data_addr);
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Read [%02x] from address [%02x]\n",
+ *data, address));
+
+ end:
+ up(&ec->intr.sem);
+
+ if (ec->common.global_lock)
+ acpi_release_global_lock(glk);
+
+ return_VALUE(status);
+}
+
+static int acpi_ec_intr_write(union acpi_ec *ec, u8 address, u8 data)
+{
+ int status = 0;
+ u32 glk;
+
+ ACPI_FUNCTION_TRACE("acpi_ec_write");
+
+ if (!ec)
+ return_VALUE(-EINVAL);
+
+ if (ec->common.global_lock) {
+ status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
+ if (ACPI_FAILURE(status))
+ return_VALUE(-ENODEV);
+ }
+
+ WARN_ON(in_interrupt());
+ down(&ec->intr.sem);
+
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
+ }
+ acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
+ &ec->common.command_addr);
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
+ }
+
+ acpi_hw_low_level_write(8, address, &ec->common.data_addr);
+ status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
+ if (status) {
+ printk(KERN_DEBUG PREFIX "write EC, IB not empty\n");
+ }
+
+ acpi_hw_low_level_write(8, data, &ec->common.data_addr);
+
+ ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Wrote [%02x] to address [%02x]\n",
+ data, address));
+
+ up(&ec->intr.sem);
+
+ if (ec->common.global_lock)
+ acpi_release_global_lock(glk);
+
+ return_VALUE(status);
+}
+