struct acpi_generic_address command_addr;
                struct acpi_generic_address data_addr;
                unsigned long global_lock;
-               spinlock_t lock;
+               struct semaphore sem;
        } poll;
 };
 
 {
        acpi_status status = AE_OK;
        int result = 0;
-       unsigned long flags = 0;
        u32 glk = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_read");
                        return_VALUE(-ENODEV);
        }
 
-       spin_lock_irqsave(&ec->poll.lock, flags);
-
+       if (down_interruptible(&ec->poll.sem)) {
+               result = -ERESTARTSYS;
+               goto end_nosem;
+       }
+       
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_READ,
                                &ec->common.command_addr);
        result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
                          *data, address));
 
       end:
-       spin_unlock_irqrestore(&ec->poll.lock, flags);
-
+       up(&ec->poll.sem);
+end_nosem:
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
 
 {
        int result = 0;
        acpi_status status = AE_OK;
-       unsigned long flags = 0;
        u32 glk = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_write");
                        return_VALUE(-ENODEV);
        }
 
-       spin_lock_irqsave(&ec->poll.lock, flags);
-
+       if (down_interruptible(&ec->poll.sem)) {
+               result = -ERESTARTSYS;
+               goto end_nosem;
+       }
+       
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_WRITE,
                                &ec->common.command_addr);
        result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBE);
                          data, address));
 
       end:
-       spin_unlock_irqrestore(&ec->poll.lock, flags);
-
+       up(&ec->poll.sem);
+end_nosem:
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
 
 {
        int result = 0;
        acpi_status status = AE_OK;
-       unsigned long flags = 0;
        u32 glk = 0;
 
        ACPI_FUNCTION_TRACE("acpi_ec_query");
         * Note that successful completion of the query causes the ACPI_EC_SCI
         * bit to be cleared (and thus clearing the interrupt source).
         */
-       spin_lock_irqsave(&ec->poll.lock, flags);
-
+       if (down_interruptible(&ec->poll.sem)) {
+               result = -ERESTARTSYS;
+               goto end_nosem;
+       }
+       
        acpi_hw_low_level_write(8, ACPI_EC_COMMAND_QUERY,
                                &ec->common.command_addr);
        result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF);
                result = -ENODATA;
 
       end:
-       spin_unlock_irqrestore(&ec->poll.lock, flags);
-
+       up(&ec->poll.sem);
+end_nosem:
        if (ec->common.global_lock)
                acpi_release_global_lock(glk);
 
 {
        union acpi_ec *ec = (union acpi_ec *)ec_cxt;
        u32 value = 0;
-       unsigned long flags = 0;
        static char object_name[5] = { '_', 'Q', '0', '0', '\0' };
        const char hex[] = { '0', '1', '2', '3', '4', '5', '6', '7',
                '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
        if (!ec_cxt)
                goto end;
 
-       spin_lock_irqsave(&ec->poll.lock, flags);
+       if (down_interruptible (&ec->poll.sem)) {
+               return_VOID;
+       }
        acpi_hw_low_level_read(8, &value, &ec->common.command_addr);
-       spin_unlock_irqrestore(&ec->poll.lock, flags);
+       up(&ec->poll.sem);
 
        /* TBD: Implement asynch events!
         * NOTE: All we care about are EC-SCI's.  Other EC events are
 
        ec->common.handle = device->handle;
        ec->common.uid = -1;
-       spin_lock_init(&ec->poll.lock);
+       init_MUTEX(&ec->poll.sem);
        strcpy(acpi_device_name(device), ACPI_EC_DEVICE_NAME);
        strcpy(acpi_device_class(device), ACPI_EC_CLASS);
        acpi_driver_data(device) = ec;
                                  &ec_ecdt->common.gpe_bit);
        if (ACPI_FAILURE(status))
                return status;
-       spin_lock_init(&ec_ecdt->poll.lock);
+       init_MUTEX(&ec_ecdt->poll.sem);
        ec_ecdt->common.global_lock = TRUE;
        ec_ecdt->common.handle = handle;
 
        ec_ecdt->common.status_addr = ecdt_ptr->ec_control;
        ec_ecdt->common.data_addr = ecdt_ptr->ec_data;
        ec_ecdt->common.gpe_bit = ecdt_ptr->gpe_bit;
-       spin_lock_init(&ec_ecdt->poll.lock);
+       init_MUTEX(&ec_ecdt->poll.sem);
        /* use the GL just to be safe */
        ec_ecdt->common.global_lock = TRUE;
        ec_ecdt->common.uid = ecdt_ptr->uid;