2019-05-29 17:18:02 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2016-07-17 23:45:32 +03:00
/*
* dptf_power : DPTF platform power driver
* Copyright ( c ) 2016 , Intel Corporation .
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/acpi.h>
# include <linux/platform_device.h>
/*
* Presentation of attributes which are defined for INT3407 . They are :
* PMAX : Maximum platform powe
* PSRC : Platform power source
* ARTG : Adapter rating
* CTYP : Charger type
* PBSS : Battery steady power
*/
# define DPTF_POWER_SHOW(name, object) \
static ssize_t name # # _show ( struct device * dev , \
struct device_attribute * attr , \
char * buf ) \
{ \
2019-04-23 10:49:56 +03:00
struct acpi_device * acpi_dev = dev_get_drvdata ( dev ) ; \
2016-07-17 23:45:32 +03:00
unsigned long long val ; \
acpi_status status ; \
\
status = acpi_evaluate_integer ( acpi_dev - > handle , # object , \
NULL , & val ) ; \
if ( ACPI_SUCCESS ( status ) ) \
return sprintf ( buf , " %d \n " , ( int ) val ) ; \
else \
return - EINVAL ; \
}
DPTF_POWER_SHOW ( max_platform_power_mw , PMAX )
DPTF_POWER_SHOW ( platform_power_source , PSRC )
DPTF_POWER_SHOW ( adapter_rating_mw , ARTG )
DPTF_POWER_SHOW ( battery_steady_power_mw , PBSS )
DPTF_POWER_SHOW ( charger_type , CTYP )
static DEVICE_ATTR_RO ( max_platform_power_mw ) ;
static DEVICE_ATTR_RO ( platform_power_source ) ;
static DEVICE_ATTR_RO ( adapter_rating_mw ) ;
static DEVICE_ATTR_RO ( battery_steady_power_mw ) ;
static DEVICE_ATTR_RO ( charger_type ) ;
static struct attribute * dptf_power_attrs [ ] = {
& dev_attr_max_platform_power_mw . attr ,
& dev_attr_platform_power_source . attr ,
& dev_attr_adapter_rating_mw . attr ,
& dev_attr_battery_steady_power_mw . attr ,
& dev_attr_charger_type . attr ,
NULL
} ;
2017-06-30 16:02:49 +03:00
static const struct attribute_group dptf_power_attribute_group = {
2016-07-17 23:45:32 +03:00
. attrs = dptf_power_attrs ,
. name = " dptf_power "
} ;
static int dptf_power_add ( struct platform_device * pdev )
{
struct acpi_device * acpi_dev ;
acpi_status status ;
unsigned long long ptype ;
int result ;
acpi_dev = ACPI_COMPANION ( & ( pdev - > dev ) ) ;
if ( ! acpi_dev )
return - ENODEV ;
status = acpi_evaluate_integer ( acpi_dev - > handle , " PTYP " , NULL , & ptype ) ;
if ( ACPI_FAILURE ( status ) )
return - ENODEV ;
if ( ptype ! = 0x11 )
return - ENODEV ;
result = sysfs_create_group ( & pdev - > dev . kobj ,
& dptf_power_attribute_group ) ;
if ( result )
return result ;
platform_set_drvdata ( pdev , acpi_dev ) ;
return 0 ;
}
static int dptf_power_remove ( struct platform_device * pdev )
{
sysfs_remove_group ( & pdev - > dev . kobj , & dptf_power_attribute_group ) ;
return 0 ;
}
static const struct acpi_device_id int3407_device_ids [ ] = {
{ " INT3407 " , 0 } ,
{ " " , 0 } ,
} ;
MODULE_DEVICE_TABLE ( acpi , int3407_device_ids ) ;
static struct platform_driver dptf_power_driver = {
. probe = dptf_power_add ,
. remove = dptf_power_remove ,
. driver = {
. name = " DPTF Platform Power " ,
. acpi_match_table = int3407_device_ids ,
} ,
} ;
module_platform_driver ( dptf_power_driver ) ;
MODULE_AUTHOR ( " Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com> " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
MODULE_DESCRIPTION ( " ACPI DPTF platform power driver " ) ;