root/drivers/pwm/pwm-lpss-platform.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. pwm_lpss_probe_platform
  2. pwm_lpss_remove_platform
  3. pwm_lpss_prepare

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * Intel Low Power Subsystem PWM controller driver
   4  *
   5  * Copyright (C) 2014, Intel Corporation
   6  *
   7  * Derived from the original pwm-lpss.c
   8  */
   9 
  10 #include <linux/acpi.h>
  11 #include <linux/kernel.h>
  12 #include <linux/module.h>
  13 #include <linux/platform_device.h>
  14 #include <linux/pm_runtime.h>
  15 
  16 #include "pwm-lpss.h"
  17 
  18 /* BayTrail */
  19 static const struct pwm_lpss_boardinfo pwm_lpss_byt_info = {
  20         .clk_rate = 25000000,
  21         .npwm = 1,
  22         .base_unit_bits = 16,
  23 };
  24 
  25 /* Braswell */
  26 static const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = {
  27         .clk_rate = 19200000,
  28         .npwm = 1,
  29         .base_unit_bits = 16,
  30         .other_devices_aml_touches_pwm_regs = true,
  31 };
  32 
  33 /* Broxton */
  34 static const struct pwm_lpss_boardinfo pwm_lpss_bxt_info = {
  35         .clk_rate = 19200000,
  36         .npwm = 4,
  37         .base_unit_bits = 22,
  38         .bypass = true,
  39 };
  40 
  41 static int pwm_lpss_probe_platform(struct platform_device *pdev)
  42 {
  43         const struct pwm_lpss_boardinfo *info;
  44         const struct acpi_device_id *id;
  45         struct pwm_lpss_chip *lpwm;
  46         struct resource *r;
  47 
  48         id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev);
  49         if (!id)
  50                 return -ENODEV;
  51 
  52         info = (const struct pwm_lpss_boardinfo *)id->driver_data;
  53         r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  54 
  55         lpwm = pwm_lpss_probe(&pdev->dev, r, info);
  56         if (IS_ERR(lpwm))
  57                 return PTR_ERR(lpwm);
  58 
  59         platform_set_drvdata(pdev, lpwm);
  60 
  61         dev_pm_set_driver_flags(&pdev->dev, DPM_FLAG_SMART_PREPARE);
  62         pm_runtime_set_active(&pdev->dev);
  63         pm_runtime_enable(&pdev->dev);
  64 
  65         return 0;
  66 }
  67 
  68 static int pwm_lpss_remove_platform(struct platform_device *pdev)
  69 {
  70         struct pwm_lpss_chip *lpwm = platform_get_drvdata(pdev);
  71 
  72         pm_runtime_disable(&pdev->dev);
  73         return pwm_lpss_remove(lpwm);
  74 }
  75 
  76 static int pwm_lpss_prepare(struct device *dev)
  77 {
  78         struct pwm_lpss_chip *lpwm = dev_get_drvdata(dev);
  79 
  80         /*
  81          * If other device's AML code touches the PWM regs on suspend/resume
  82          * force runtime-resume the PWM controller to allow this.
  83          */
  84         if (lpwm->info->other_devices_aml_touches_pwm_regs)
  85                 return 0; /* Force runtime-resume */
  86 
  87         return 1; /* If runtime-suspended leave as is */
  88 }
  89 
  90 static const struct dev_pm_ops pwm_lpss_platform_pm_ops = {
  91         .prepare = pwm_lpss_prepare,
  92         SET_SYSTEM_SLEEP_PM_OPS(pwm_lpss_suspend, pwm_lpss_resume)
  93 };
  94 
  95 static const struct acpi_device_id pwm_lpss_acpi_match[] = {
  96         { "80860F09", (unsigned long)&pwm_lpss_byt_info },
  97         { "80862288", (unsigned long)&pwm_lpss_bsw_info },
  98         { "80862289", (unsigned long)&pwm_lpss_bsw_info },
  99         { "80865AC8", (unsigned long)&pwm_lpss_bxt_info },
 100         { },
 101 };
 102 MODULE_DEVICE_TABLE(acpi, pwm_lpss_acpi_match);
 103 
 104 static struct platform_driver pwm_lpss_driver_platform = {
 105         .driver = {
 106                 .name = "pwm-lpss",
 107                 .acpi_match_table = pwm_lpss_acpi_match,
 108                 .pm = &pwm_lpss_platform_pm_ops,
 109         },
 110         .probe = pwm_lpss_probe_platform,
 111         .remove = pwm_lpss_remove_platform,
 112 };
 113 module_platform_driver(pwm_lpss_driver_platform);
 114 
 115 MODULE_DESCRIPTION("PWM platform driver for Intel LPSS");
 116 MODULE_LICENSE("GPL v2");
 117 MODULE_ALIAS("platform:pwm-lpss");

/* [<][>][^][v][top][bottom][index][help] */