1 /* 2 * Intel Low Power Subsystem PWM controller driver 3 * 4 * Copyright (C) 2014, Intel Corporation 5 * 6 * Derived from the original pwm-lpss.c 7 * 8 * This program is free software; you can redistribute it and/or modify 9 * it under the terms of the GNU General Public License version 2 as 10 * published by the Free Software Foundation. 11 */ 12 13 #include <linux/acpi.h> 14 #include <linux/kernel.h> 15 #include <linux/module.h> 16 #include <linux/platform_device.h> 17 #include <linux/pm_runtime.h> 18 19 #include "pwm-lpss.h" 20 21 /* BayTrail */ 22 static const struct pwm_lpss_boardinfo pwm_lpss_byt_info = { 23 .clk_rate = 25000000, 24 .npwm = 1, 25 .base_unit_bits = 16, 26 }; 27 28 /* Braswell */ 29 static const struct pwm_lpss_boardinfo pwm_lpss_bsw_info = { 30 .clk_rate = 19200000, 31 .npwm = 1, 32 .base_unit_bits = 16, 33 }; 34 35 /* Broxton */ 36 static const struct pwm_lpss_boardinfo pwm_lpss_bxt_info = { 37 .clk_rate = 19200000, 38 .npwm = 4, 39 .base_unit_bits = 22, 40 .bypass = true, 41 }; 42 43 static int pwm_lpss_probe_platform(struct platform_device *pdev) 44 { 45 const struct pwm_lpss_boardinfo *info; 46 const struct acpi_device_id *id; 47 struct pwm_lpss_chip *lpwm; 48 struct resource *r; 49 50 id = acpi_match_device(pdev->dev.driver->acpi_match_table, &pdev->dev); 51 if (!id) 52 return -ENODEV; 53 54 info = (const struct pwm_lpss_boardinfo *)id->driver_data; 55 r = platform_get_resource(pdev, IORESOURCE_MEM, 0); 56 57 lpwm = pwm_lpss_probe(&pdev->dev, r, info); 58 if (IS_ERR(lpwm)) 59 return PTR_ERR(lpwm); 60 61 platform_set_drvdata(pdev, lpwm); 62 63 pm_runtime_set_active(&pdev->dev); 64 pm_runtime_enable(&pdev->dev); 65 66 return 0; 67 } 68 69 static int pwm_lpss_remove_platform(struct platform_device *pdev) 70 { 71 struct pwm_lpss_chip *lpwm = platform_get_drvdata(pdev); 72 73 pm_runtime_disable(&pdev->dev); 74 return pwm_lpss_remove(lpwm); 75 } 76 77 static SIMPLE_DEV_PM_OPS(pwm_lpss_platform_pm_ops, 78 pwm_lpss_suspend, 79 pwm_lpss_resume); 80 81 static const struct acpi_device_id pwm_lpss_acpi_match[] = { 82 { "80860F09", (unsigned long)&pwm_lpss_byt_info }, 83 { "80862288", (unsigned long)&pwm_lpss_bsw_info }, 84 { "80865AC8", (unsigned long)&pwm_lpss_bxt_info }, 85 { }, 86 }; 87 MODULE_DEVICE_TABLE(acpi, pwm_lpss_acpi_match); 88 89 static struct platform_driver pwm_lpss_driver_platform = { 90 .driver = { 91 .name = "pwm-lpss", 92 .acpi_match_table = pwm_lpss_acpi_match, 93 .pm = &pwm_lpss_platform_pm_ops, 94 }, 95 .probe = pwm_lpss_probe_platform, 96 .remove = pwm_lpss_remove_platform, 97 }; 98 module_platform_driver(pwm_lpss_driver_platform); 99 100 MODULE_DESCRIPTION("PWM platform driver for Intel LPSS"); 101 MODULE_LICENSE("GPL v2"); 102 MODULE_ALIAS("platform:pwm-lpss"); 103