brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · 5130238 Raw
83 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Intel Low Power Subsystem PWM controller driver4 *5 * Copyright (C) 2014, Intel Corporation6 *7 * Derived from the original pwm-lpss.c8 */9 10#include <linux/kernel.h>11#include <linux/mod_devicetable.h>12#include <linux/module.h>13#include <linux/platform_device.h>14#include <linux/pm_runtime.h>15#include <linux/property.h>16 17#include "pwm-lpss.h"18 19 20static int pwm_lpss_probe_platform(struct platform_device *pdev)21{22	const struct pwm_lpss_boardinfo *info;23	struct pwm_chip *chip;24	void __iomem *base;25 26	info = device_get_match_data(&pdev->dev);27	if (!info)28		return -ENODEV;29 30	base = devm_platform_ioremap_resource(pdev, 0);31	if (IS_ERR(base))32		return PTR_ERR(base);33 34	chip = devm_pwm_lpss_probe(&pdev->dev, base, info);35	if (IS_ERR(chip))36		return PTR_ERR(chip);37 38	/*39	 * On Cherry Trail devices the GFX0._PS0 AML checks if the controller40	 * is on and if it is not on it turns it on and restores what it41	 * believes is the correct state to the PWM controller.42	 * Because of this we must disallow direct-complete, which keeps the43	 * controller (runtime)suspended on resume, to avoid 2 issues:44	 * 1. The controller getting turned on without the linux-pm code45	 *    knowing about this. On devices where the controller is unused46	 *    this causes it to stay on during the next suspend causing high47	 *    battery drain (because S0i3 is not reached)48	 * 2. The state restoring code unexpectedly messing with the controller49	 *50	 * Leaving the controller runtime-suspended (skipping runtime-resume +51	 * normal-suspend) during suspend is fine.52	 */53	if (info->other_devices_aml_touches_pwm_regs)54		dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_NO_DIRECT_COMPLETE|55						    DPM_FLAG_SMART_SUSPEND);56 57	pm_runtime_set_active(&pdev->dev);58	return devm_pm_runtime_enable(&pdev->dev);59}60 61static const struct acpi_device_id pwm_lpss_acpi_match[] = {62	{ "80860F09", (unsigned long)&pwm_lpss_byt_info },63	{ "80862288", (unsigned long)&pwm_lpss_bsw_info },64	{ "80862289", (unsigned long)&pwm_lpss_bsw_info },65	{ "80865AC8", (unsigned long)&pwm_lpss_bxt_info },66	{ },67};68MODULE_DEVICE_TABLE(acpi, pwm_lpss_acpi_match);69 70static struct platform_driver pwm_lpss_driver_platform = {71	.driver = {72		.name = "pwm-lpss",73		.acpi_match_table = pwm_lpss_acpi_match,74	},75	.probe = pwm_lpss_probe_platform,76};77module_platform_driver(pwm_lpss_driver_platform);78 79MODULE_DESCRIPTION("PWM platform driver for Intel LPSS");80MODULE_LICENSE("GPL v2");81MODULE_IMPORT_NS(PWM_LPSS);82MODULE_ALIAS("platform:pwm-lpss");83