Re: [PATCH 2/4] toshiba_acpi: Support alternate hotkey interfaces

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



2011/12/17 Thomas Renninger <trenn@xxxxxxx>:
> On Thursday 15 December 2011 19:06:09 Seth Forshee wrote:
> ...
>> +static bool toshiba_acpi_i8042_filter(unsigned char data, unsigned char str,
>> +                                   struct serio *port)
>> +{
>> +     if (str & 0x20)
>> +             return false;
>> +
>> +     if (unlikely(data == 0xe0))
>> +             return false;
>> +
>> +     if ((data & 0x7f) == TOS1900_FN_SCAN) {
>> +             schedule_work(&toshiba_acpi->hotkey_work);
>> +             return true;
>> +     }
> What have you tried to check whether some other kind of ACPI event
> is happening?
> Do any acpi/SCI interrupts happen?:
> watch -n1 "cat /proc/interrupts |grep acpi"

I already did this, no events whatsoever, I was using a Satellite X205
at the time

>
> Could it by chance be an EC or other device GPE/SCI?
>

Seth mentioned me something about this, but w/o proper docs from
Toshiba, we are blindly shooting.

Seth?

>> +
>> +     return false;
>> +}
>> +
>> +static void toshiba_acpi_hotkey_work(struct work_struct *work)
>> +{
>> +     acpi_handle ec_handle = ec_get_handle();
>> +     acpi_status status;
>> +
>> +     if (!ec_handle)
>> +             return;
>> +
>> +     status = acpi_evaluate_object(ec_handle, "NTFY", NULL, NULL);
>> +     if (ACPI_FAILURE(status))
>> +             pr_err("ACPI NTFY method execution failed\n");
> Why is calling NTFY needed?

The NTFY method triggers a 0x80 notify event on TOS1900 device,
and thus being trapped by toshiba_acpi_notify, here are the methods

Method (NTFY, 0, NotSerialized)
{
  Store (One, ^^^^VALZ.TECF)
  Notify (VALZ, 0x80)
  Return (0xAA)
}

And then

Method (INFO, 0, NotSerialized)
{
  If (TECF)
  {
    Store (Zero, TECF)
    Store (^^PCI0.LPCB.EC0.TOHK, Local0)
    Store (Zero, ^^PCI0.LPCB.EC0.TOHK)
  }
  Else
  {
    Store (Zero, Local0)
  }

  Return (Local0)
}


>
> ...
>
>> +static int toshiba_acpi_suspend(struct acpi_device *acpi_dev,
>> +                             pm_message_t state)
>> +{
>> +     struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
>> +     u32 result;
>> +
>> +     if (dev->hotkey_dev)
>> +             hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_DISABLE, &result);
>> +
>> +     return 0;
>> +}
>> +
>> +static int toshiba_acpi_resume(struct acpi_device *acpi_dev)
>> +{
>> +     struct toshiba_acpi_dev *dev = acpi_driver_data(acpi_dev);
>> +     u32 result;
>> +
>> +     if (dev->hotkey_dev)
>> +             hci_write1(dev, HCI_HOTKEY_EVENT, HCI_HOTKEY_ENABLE, &result);
>> +
>> +     return 0;
>> +}
> What are the suspend/resume funcs for?
> What bad things happen without them?

Some models (NB500 among others) stop sending hotkey events
when resumed, and even activating the hotkeys again don't work,
the suspend/resume functions do the trick ;)

>
>
>     Thomas

Saludos
Azael


-- 
-- El mundo apesta y vosotros apestais tambien --
--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux