f080be27d7
To be able to save some power when PWM is not in use, add support for runtime PM for this driver. This also allows the platform to transition to low power S0ix states when the system is idle. Signed-off-by: Huiquan Zhong <huiquan.zhong@intel.com> Signed-off-by: Qipeng Zha <qipeng.zha@intel.com> Signed-off-by: Mika Westerberg <mika.westerberg@linux.intel.com> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
76 lines
1.9 KiB
C
76 lines
1.9 KiB
C
/*
|
|
* Intel Low Power Subsystem PWM controller driver
|
|
*
|
|
* Copyright (C) 2014, Intel Corporation
|
|
*
|
|
* Derived from the original pwm-lpss.c
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#include <linux/acpi.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/pm_runtime.h>
|
|
|
|
#include "pwm-lpss.h"
|
|
|
|
static int pwm_lpss_probe_platform(struct platform_device *pdev)
|
|
{
|
|
const struct pwm_lpss_boardinfo *info;
|
|
const struct acpi_device_id *id;
|
|
struct pwm_lpss_chip *lpwm;
|
|
struct resource *r;
|
|
|
|
id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
|
|
if (!id)
|
|
return -ENODEV;
|
|
|
|
info = (const struct pwm_lpss_boardinfo *)id->driver_data;
|
|
r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
|
|
lpwm = pwm_lpss_probe(&pdev->dev, r, info);
|
|
if (IS_ERR(lpwm))
|
|
return PTR_ERR(lpwm);
|
|
|
|
platform_set_drvdata(pdev, lpwm);
|
|
|
|
pm_runtime_set_active(&pdev->dev);
|
|
pm_runtime_enable(&pdev->dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int pwm_lpss_remove_platform(struct platform_device *pdev)
|
|
{
|
|
struct pwm_lpss_chip *lpwm = platform_get_drvdata(pdev);
|
|
|
|
pm_runtime_disable(&pdev->dev);
|
|
return pwm_lpss_remove(lpwm);
|
|
}
|
|
|
|
static const struct acpi_device_id pwm_lpss_acpi_match[] = {
|
|
{ "80860F09", (unsigned long)&pwm_lpss_byt_info },
|
|
{ "80862288", (unsigned long)&pwm_lpss_bsw_info },
|
|
{ "80865AC8", (unsigned long)&pwm_lpss_bxt_info },
|
|
{ },
|
|
};
|
|
MODULE_DEVICE_TABLE(acpi, pwm_lpss_acpi_match);
|
|
|
|
static struct platform_driver pwm_lpss_driver_platform = {
|
|
.driver = {
|
|
.name = "pwm-lpss",
|
|
.acpi_match_table = pwm_lpss_acpi_match,
|
|
},
|
|
.probe = pwm_lpss_probe_platform,
|
|
.remove = pwm_lpss_remove_platform,
|
|
};
|
|
module_platform_driver(pwm_lpss_driver_platform);
|
|
|
|
MODULE_DESCRIPTION("PWM platform driver for Intel LPSS");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_ALIAS("platform:pwm-lpss");
|