2019-06-04 11:11:33 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2011-07-08 01:05:25 +04:00
/*
* Driver for Samsung Q10 and related laptops : controls the backlight
*
* Copyright ( c ) 2011 Frederick van der Wyck < fvanderwyck @ gmail . com >
*/
# include <linux/module.h>
# include <linux/kernel.h>
# include <linux/init.h>
# include <linux/platform_device.h>
# include <linux/backlight.h>
# include <linux/dmi.h>
2013-12-03 04:49:16 +04:00
# include <linux/acpi.h>
2011-07-08 01:05:25 +04:00
2013-07-09 01:34:56 +04:00
# define SAMSUNGQ10_BL_MAX_INTENSITY 7
2011-07-08 01:05:25 +04:00
2013-07-09 01:34:56 +04:00
static acpi_handle ec_handle ;
2011-07-08 01:05:25 +04:00
static bool force ;
module_param ( force , bool , 0 ) ;
MODULE_PARM_DESC ( force ,
" Disable the DMI check and force the driver to be loaded " ) ;
static int samsungq10_bl_set_intensity ( struct backlight_device * bd )
{
2013-07-09 01:34:56 +04:00
acpi_status status ;
int i ;
2011-07-08 01:05:25 +04:00
2013-07-09 01:34:56 +04:00
for ( i = 0 ; i < SAMSUNGQ10_BL_MAX_INTENSITY ; i + + ) {
status = acpi_evaluate_object ( ec_handle , " _Q63 " , NULL , NULL ) ;
if ( ACPI_FAILURE ( status ) )
return - EIO ;
}
for ( i = 0 ; i < bd - > props . brightness ; i + + ) {
status = acpi_evaluate_object ( ec_handle , " _Q64 " , NULL , NULL ) ;
if ( ACPI_FAILURE ( status ) )
return - EIO ;
}
2011-07-08 01:05:25 +04:00
return 0 ;
}
static const struct backlight_ops samsungq10_bl_ops = {
. update_status = samsungq10_bl_set_intensity ,
} ;
2012-12-22 01:18:33 +04:00
static int samsungq10_probe ( struct platform_device * pdev )
2011-07-08 01:05:25 +04:00
{
struct backlight_properties props ;
struct backlight_device * bd ;
memset ( & props , 0 , sizeof ( struct backlight_properties ) ) ;
props . type = BACKLIGHT_PLATFORM ;
props . max_brightness = SAMSUNGQ10_BL_MAX_INTENSITY ;
bd = backlight_device_register ( " samsung " , & pdev - > dev , NULL ,
& samsungq10_bl_ops , & props ) ;
if ( IS_ERR ( bd ) )
return PTR_ERR ( bd ) ;
platform_set_drvdata ( pdev , bd ) ;
return 0 ;
}
2012-12-22 01:18:33 +04:00
static int samsungq10_remove ( struct platform_device * pdev )
2011-07-08 01:05:25 +04:00
{
struct backlight_device * bd = platform_get_drvdata ( pdev ) ;
backlight_device_unregister ( bd ) ;
return 0 ;
}
static struct platform_driver samsungq10_driver = {
. driver = {
. name = KBUILD_MODNAME ,
} ,
. probe = samsungq10_probe ,
2012-12-22 01:18:33 +04:00
. remove = samsungq10_remove ,
2011-07-08 01:05:25 +04:00
} ;
static struct platform_device * samsungq10_device ;
static int __init dmi_check_callback ( const struct dmi_system_id * id )
{
printk ( KERN_INFO KBUILD_MODNAME " : found model '%s' \n " , id - > ident ) ;
2011-07-18 12:08:21 +04:00
return 1 ;
2011-07-08 01:05:25 +04:00
}
2017-09-14 12:59:30 +03:00
static const struct dmi_system_id samsungq10_dmi_table [ ] __initconst = {
2011-07-08 01:05:25 +04:00
{
. ident = " Samsung Q10 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Samsung " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " SQ10 " ) ,
} ,
. callback = dmi_check_callback ,
} ,
{
. ident = " Samsung Q20 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " SAMSUNG Electronics " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " SENS Q20 " ) ,
} ,
. callback = dmi_check_callback ,
} ,
{
. ident = " Samsung Q25 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " SAMSUNG Electronics " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " NQ25 " ) ,
} ,
. callback = dmi_check_callback ,
} ,
{
. ident = " Dell Latitude X200 " ,
. matches = {
DMI_MATCH ( DMI_SYS_VENDOR , " Dell Computer Corporation " ) ,
DMI_MATCH ( DMI_PRODUCT_NAME , " X200 " ) ,
} ,
. callback = dmi_check_callback ,
} ,
{ } ,
} ;
MODULE_DEVICE_TABLE ( dmi , samsungq10_dmi_table ) ;
static int __init samsungq10_init ( void )
{
if ( ! force & & ! dmi_check_system ( samsungq10_dmi_table ) )
return - ENODEV ;
2013-07-09 01:34:56 +04:00
ec_handle = ec_get_handle ( ) ;
if ( ! ec_handle )
return - ENODEV ;
2011-07-08 01:05:25 +04:00
samsungq10_device = platform_create_bundle ( & samsungq10_driver ,
samsungq10_probe ,
NULL , 0 , NULL , 0 ) ;
2013-07-15 05:50:32 +04:00
return PTR_ERR_OR_ZERO ( samsungq10_device ) ;
2011-07-08 01:05:25 +04:00
}
static void __exit samsungq10_exit ( void )
{
platform_device_unregister ( samsungq10_device ) ;
platform_driver_unregister ( & samsungq10_driver ) ;
}
module_init ( samsungq10_init ) ;
module_exit ( samsungq10_exit ) ;
MODULE_AUTHOR ( " Frederick van der Wyck <fvanderwyck@gmail.com> " ) ;
MODULE_DESCRIPTION ( " Samsung Q10 Driver " ) ;
MODULE_LICENSE ( " GPL " ) ;