iio: light: acpi-als: Properly enable on ASUS Zenbooks
PATCH 1/1 iio: light: acpi-als: Properly enable on ASUS Zenbooks
ASUS Zenbooks need several special ACPI calls to enable the ALS peripheral. Otherwise, reads just return 0.
Signed-off-by Josef Gajdusek <[email protected]>
--- drivers/iio/light/acpi-als.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)
drivers/iio/light/acpi-als.c +17 -0
@@ -39,6 +39,9 @@#define ACPI_ALS_DEVICE_NAME "acpi-als"#define ACPI_ALS_NOTIFY_ILLUMINANCE 0x80 +#define ACPI_ALS_ASUS_TALS "\\_SB.PCI0.LPCB.EC0.TALS" +#define ACPI_ALS_ASUS_ALSC "\\_SB.ATKD.ALSC" +ACPI_MODULE_NAME ("acpi-als" );/*
@@ -180,6 +183,8 @@ static int acpi_als_add(struct acpi_device *device)struct acpi_als *als;struct iio_dev *indio_dev;struct iio_buffer *buffer; +acpi_handle handle_tals, handle_alsc; +acpi_status status_tals, status_alsc; indio_dev =devm_iio_device_alloc (&device->dev,sizeof (*als));if (!indio_dev)
@@ -191,6 +196,18 @@ static int acpi_als_add(struct acpi_device *device) als->device = device;mutex_init (&als->lock); +/* ASUS Zenbooks need this to enable ALS */ + status_tals =acpi_get_handle (NULL ,ACPI_ALS_ASUS_TALS , &handle_tals); + status_alsc =acpi_get_handle (NULL ,ACPI_ALS_ASUS_ALSC , &handle_alsc); +/* So far only devices with both have been observed */ +if (ACPI_SUCCESS (status_tals) ^ACPI_SUCCESS (status_alsc)) +dev_warn (&device->dev,"Attempting to enable ACPI ALS, but found only one of \"" +ACPI_ALS_ASUS_TALS "\" and \"" ACPI_ALS_ASUS_ALSC "\"" ); +if (ACPI_SUCCESS (status_tals)) +acpi_execute_simple_method (handle_tals,NULL ,1 ); +if (ACPI_SUCCESS (status_alsc)) +acpi_execute_simple_method (handle_alsc,NULL ,1 ); + indio_dev->name =ACPI_ALS_DEVICE_NAME ; indio_dev->dev.parent = &device->dev; indio_dev->info = &acpi_als_info;
Signature · 1 line
2.10.2
Quoted 36 lines · Josef Gajdusek
ASUS Zenbooks need several special ACPI calls to enable the ALS peripheral. Otherwise, reads just return 0.
Signed-off-by Josef Gajdusek <[email protected]>--- drivers/iio/light/acpi-als.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+)drivers/iio/light/acpi-als.c +6
-0@@ -39,6 +39,9 @@#define ACPI_ALS_DEVICE_NAME "acpi-als"#define ACPI_ALS_NOTIFY_ILLUMINANCE 0x80 +#define ACPI_ALS_ASUS_TALS "\\_SB.PCI0.LPCB.EC0.TALS" +#define ACPI_ALS_ASUS_ALSC "\\_SB.ATKD.ALSC" +ACPI_MODULE_NAME ("acpi-als" );/* @@ -180,6 +183,8 @@ static int acpi_als_add(struct acpi_device *device)struct acpi_als *als;struct iio_dev *indio_dev;struct iio_buffer *buffer; +acpi_handle handle_tals, handle_alsc; +acpi_status status_tals, status_alsc; indio_dev =devm_iio_device_alloc (&device->dev,sizeof (*als));if (!indio_dev)@@ -191,6 +196,18 @@ static int acpi_als_add(struct acpi_device *device) als->device = device;mutex_init (&als->lock); +/* ASUS Zenbooks need this to enable ALS */
drivers/iio/light/acpi-als.c static int acpi_als_add(struct acpi_device *device) · line 209
Quoted 10 lines
drivers/iio/light/acpi-als.c +10
-0+ status_tals =acpi_get_handle (NULL ,ACPI_ALS_ASUS_TALS , &handle_tals); + status_alsc =acpi_get_handle (NULL ,ACPI_ALS_ASUS_ALSC , &handle_alsc); +/* So far only devices with both have been observed */ +if (ACPI_SUCCESS (status_tals) ^ACPI_SUCCESS (status_alsc)) +dev_warn (&device->dev,"Attempting to enable ACPI ALS, but found only one of \"" +ACPI_ALS_ASUS_TALS "\" and \"" ACPI_ALS_ASUS_ALSC "\"" ); +if (ACPI_SUCCESS (status_tals)) +acpi_execute_simple_method (handle_tals,NULL ,1 ); +if (ACPI_SUCCESS (status_alsc)) +acpi_execute_simple_method (handle_alsc,NULL ,1 );
Pull the system-specific quirk into a function please, don't pollute common code with broken-ACPI crap.
Also, handle the failures in sequence, avoid the xor and other such nonsense.
Quoted 4 lines
drivers/iio/light/acpi-als.c +0
-0indio_dev->name =ACPI_ALS_DEVICE_NAME ; indio_dev->dev.parent = &device->dev; indio_dev->info = &acpi_als_info;
Signature · 2 lines
Best regards, Marek Vasut