2019-06-04 10:11:33 +02:00
// SPDX-License-Identifier: GPL-2.0-only
2014-08-19 19:17:35 +03:00
/*
* Intel Low Power Subsystem PWM controller PCI driver
*
* Copyright ( C ) 2014 , Intel Corporation
*
* Derived from the original pwm - lpss . c
*/
# include <linux/kernel.h>
# include <linux/module.h>
# include <linux/pci.h>
2015-10-26 12:58:27 +02:00
# include <linux/pm_runtime.h>
2014-08-19 19:17:35 +03:00
# include "pwm-lpss.h"
static int pwm_lpss_probe_pci ( struct pci_dev * pdev ,
const struct pci_device_id * id )
{
const struct pwm_lpss_boardinfo * info ;
2024-02-14 10:31:54 +01:00
struct pwm_chip * chip ;
2014-08-19 19:17:35 +03:00
int err ;
2014-08-19 19:17:36 +03:00
err = pcim_enable_device ( pdev ) ;
2014-08-19 19:17:35 +03:00
if ( err < 0 )
return err ;
2022-09-27 19:24:17 +03:00
err = pcim_iomap_regions ( pdev , BIT ( 0 ) , pci_name ( pdev ) ) ;
if ( err )
return err ;
2014-08-19 19:17:35 +03:00
info = ( struct pwm_lpss_boardinfo * ) id - > driver_data ;
2024-02-14 10:31:54 +01:00
chip = devm_pwm_lpss_probe ( & pdev - > dev , pcim_iomap_table ( pdev ) [ 0 ] , info ) ;
if ( IS_ERR ( chip ) )
return PTR_ERR ( chip ) ;
2014-08-19 19:17:35 +03:00
2015-10-26 12:58:27 +02:00
pm_runtime_put ( & pdev - > dev ) ;
pm_runtime_allow ( & pdev - > dev ) ;
2014-08-19 19:17:35 +03:00
return 0 ;
}
static void pwm_lpss_remove_pci ( struct pci_dev * pdev )
{
2015-10-26 12:58:27 +02:00
pm_runtime_forbid ( & pdev - > dev ) ;
pm_runtime_get_sync ( & pdev - > dev ) ;
2014-08-19 19:17:35 +03:00
}
2015-10-26 12:58:27 +02:00
static int pwm_lpss_runtime_suspend_pci ( struct device * dev )
{
/*
* The PCI core will handle transition to D3 automatically . We only
* need to provide runtime PM hooks for that to happen .
*/
return 0 ;
}
static int pwm_lpss_runtime_resume_pci ( struct device * dev )
{
return 0 ;
}
2022-09-27 19:24:19 +03:00
static DEFINE_RUNTIME_DEV_PM_OPS ( pwm_lpss_pci_pm ,
pwm_lpss_runtime_suspend_pci ,
pwm_lpss_runtime_resume_pci ,
NULL ) ;
2015-10-26 12:58:27 +02:00
2014-08-19 19:17:35 +03:00
static const struct pci_device_id pwm_lpss_pci_ids [ ] = {
2015-10-20 16:53:06 +03:00
{ PCI_VDEVICE ( INTEL , 0x0ac8 ) , ( unsigned long ) & pwm_lpss_bxt_info } ,
2014-08-19 19:17:35 +03:00
{ PCI_VDEVICE ( INTEL , 0x0f08 ) , ( unsigned long ) & pwm_lpss_byt_info } ,
{ PCI_VDEVICE ( INTEL , 0x0f09 ) , ( unsigned long ) & pwm_lpss_byt_info } ,
2017-04-06 14:54:00 +03:00
{ PCI_VDEVICE ( INTEL , 0x11a5 ) , ( unsigned long ) & pwm_lpss_tng_info } ,
2015-10-20 16:53:06 +03:00
{ PCI_VDEVICE ( INTEL , 0x1ac8 ) , ( unsigned long ) & pwm_lpss_bxt_info } ,
2014-08-19 19:17:35 +03:00
{ PCI_VDEVICE ( INTEL , 0x2288 ) , ( unsigned long ) & pwm_lpss_bsw_info } ,
{ PCI_VDEVICE ( INTEL , 0x2289 ) , ( unsigned long ) & pwm_lpss_bsw_info } ,
2017-01-28 17:10:44 +02:00
{ PCI_VDEVICE ( INTEL , 0x31c8 ) , ( unsigned long ) & pwm_lpss_bxt_info } ,
2015-10-20 16:53:07 +03:00
{ PCI_VDEVICE ( INTEL , 0x5ac8 ) , ( unsigned long ) & pwm_lpss_bxt_info } ,
2014-08-19 19:17:35 +03:00
{ } ,
} ;
MODULE_DEVICE_TABLE ( pci , pwm_lpss_pci_ids ) ;
static struct pci_driver pwm_lpss_driver_pci = {
. name = " pwm-lpss " ,
. id_table = pwm_lpss_pci_ids ,
. probe = pwm_lpss_probe_pci ,
. remove = pwm_lpss_remove_pci ,
2015-10-26 12:58:27 +02:00
. driver = {
2022-09-27 19:24:19 +03:00
. pm = pm_ptr ( & pwm_lpss_pci_pm ) ,
2015-10-26 12:58:27 +02:00
} ,
2014-08-19 19:17:35 +03:00
} ;
module_pci_driver ( pwm_lpss_driver_pci ) ;
MODULE_DESCRIPTION ( " PWM PCI driver for Intel LPSS " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
2022-09-27 19:24:16 +03:00
MODULE_IMPORT_NS ( PWM_LPSS ) ;