tps65010, have undergone minor code improvements to enhance consistency and fix race conditions. - The syscon driver now utilizes the regmap max_register_is_0 capability for consistent register map configuration across syscons of all sizes. - New device support has been added for QCS8300, qcs615, SA8255p, and samsung,s2dos05, expanding the range of compatible hardware. - The cros_ec driver now supports loading cros_ec_ucsi on supported ECs and avoids loading the charger with UCSI, streamlining functionality. - The bd96801 driver now utilizes the more modern maple tree register cache, improving performance. - The da9052-spi driver has undergone a fix to change the read-mask to write-mask, preventing potential issues. - Unused declarations in max77693 have been removed, and support for samsung,s2dos05 has been added, enhancing code clarity and device compatibility. - Error handling in cs42l43 has been fixed to avoid unbalanced regulator put and ensure proper synchronization during driver removal. - The wcd934x driver now uses MODULE_DEVICE_TABLE() instead of MODULE_ALIAS(), improving code consistency. - Documentation for qcom,tcsr, syscon, and atmel-smc has been updated and reorganized for better clarity and maintainability. - The intel_soc_pmic_bxtwc driver has undergone significant improvements, including the use of IRQ domains for various devices, fixing IRQ domain names duplication, and code refactoring for better consistency and maintainability. - The ipaq-micro driver has received a fix for a missing break statement in the default case, enhancing code robustness. - Support for the AXP323 PMIC has been added to the axp20x driver, along with ensuring a clear relationship between IDs and model names, and allowing multiple regulators, broadening hardware compatibility. - The cs42l43 driver now disables IRQs during suspend for improved power management. - The adp5585 driver has reduced its dependencies by dropping the obsolete dependency on COMPILE_TEST. - Initial support for the MT6328 PMIC has been added to the mt6397 driver, expanding the range of supported hardware. - The rtc-bd70528 driver has been simplified by dropping the IC name from IRQ, improving code readability. - Documentation for qcom,spmi-pmic, ti,twl, and zii,rave-sp has been updated to enhance clarity and incorporate new features. - The rt5033 driver has received a fix for a missing regmap_del_irq_chip() in the error handling path. - New device support has been added for MSM8917, and the intel_soc_pmic_crc driver now supports non-ACPI instantiated i2c_client. - The 88pm886 driver has added support for the RTC cell, and the tqmx86 driver has improved its GPIO IRQ setup and added I2C IRQ support, increasing functionality. - The sprd,sc2731 DT schema has been updated and converted to YAML format for better readability and maintainability. -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEdrbJNaO+IJqU8IdIUa+KL4f8d2EFAmc/KQQACgkQUa+KL4f8 d2E0Gg//blIYrtUgGy5xEwR8WIobYtAxBo+AMX1tSgh4Hs4u/SFhy4cE7no+M3J2 Id5gQJscuz3k4sH0raoUMp2NRFyI8lD8Y9xRBTDE+KV/FbdL1KHfmTun2NY1zG7U LIop39HsJkJ0Z06lnyBf61QK6SmlzT8vXbJmK4mYf8wgBX7iFDZ0FMZHP2uW5k/Z UV8nyQalwerG+jOGXfQkVDXF8YKToqPtqsFWTJ1Yn5gs1SCd6dyusDNYqUDuW4Ng dbu/4wt3mspliTOnBTPnXlcVsCNefhtbCWxyBpaA3luK9ciMdX7cZ8wei1xkFcwK 5bXPjXsFiiUbDX0l/6eS1h676k1JQl5iABlhGXHJm/GMcN9fdNFCQL/2rtJ4iSfW 0CoYjERfm6OyHF0Wiuk3I8x/AARWKXtDEjktGXUL0do7NBqJgB3ISme8x8b5hW4l HO6MmsFmHxHbIlb+kCTTCtXa5R1Sdca/8qrPxMb+B89X3eOtF7sjVgS9dwkLNCGp hqP0K2IGNaRw+EDlXCBaWrbq7x0kpup6o+nooViU0Pj9fFjEdZlCLyu22+kjl04V Lfe3x9wMXBrHVrPynoaQp6+57QlWfpM0uuKJWoaKlCoJTh8UbFcWWkDqr6I/pDur EtfSwOO8uVuS8m/FMAs0m/+zrWfHAvjAbAHFCKBu/vKaD5DvxeI= =YP3r -----END PGP SIGNATURE----- Merge tag 'mfd-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd Pull MFD updates from Lee Jones: - Several drivers, including atmel-flexcom/rk8xx-core, palmas, and tps65010, have undergone minor code improvements to enhance consistency and fix race conditions. - The syscon driver now utilizes the regmap max_register_is_0 capability for consistent register map configuration across syscons of all sizes. - New device support has been added for QCS8300, qcs615, SA8255p, and samsung,s2dos05, expanding the range of compatible hardware. - The cros_ec driver now supports loading cros_ec_ucsi on supported ECs and avoids loading the charger with UCSI, streamlining functionality. - The bd96801 driver now utilizes the more modern maple tree register cache, improving performance. - The da9052-spi driver has undergone a fix to change the read-mask to write-mask, preventing potential issues. - Unused declarations in max77693 have been removed, and support for samsung,s2dos05 has been added, enhancing code clarity and device compatibility. - Error handling in cs42l43 has been fixed to avoid unbalanced regulator put and ensure proper synchronization during driver removal. - The wcd934x driver now uses MODULE_DEVICE_TABLE() instead of MODULE_ALIAS(), improving code consistency. - Documentation for qcom,tcsr, syscon, and atmel-smc has been updated and reorganized for better clarity and maintainability. - The intel_soc_pmic_bxtwc driver has undergone significant improvements, including the use of IRQ domains for various devices, fixing IRQ domain names duplication, and code refactoring for better consistency and maintainability. - The ipaq-micro driver has received a fix for a missing break statement in the default case, enhancing code robustness. - Support for the AXP323 PMIC has been added to the axp20x driver, along with ensuring a clear relationship between IDs and model names, and allowing multiple regulators, broadening hardware compatibility. - The cs42l43 driver now disables IRQs during suspend for improved power management. - The adp5585 driver has reduced its dependencies by dropping the obsolete dependency on COMPILE_TEST. - Initial support for the MT6328 PMIC has been added to the mt6397 driver, expanding the range of supported hardware. - The rtc-bd70528 driver has been simplified by dropping the IC name from IRQ, improving code readability. - Documentation for qcom,spmi-pmic, ti,twl, and zii,rave-sp has been updated to enhance clarity and incorporate new features. - The rt5033 driver has received a fix for a missing regmap_del_irq_chip() in the error handling path. - New device support has been added for MSM8917, and the intel_soc_pmic_crc driver now supports non-ACPI instantiated i2c_client. - The 88pm886 driver has added support for the RTC cell, and the tqmx86 driver has improved its GPIO IRQ setup and added I2C IRQ support, increasing functionality. - The sprd,sc2731 DT schema has been updated and converted to YAML format for better readability and maintainability. * tag 'mfd-next-6.13' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/mfd: (62 commits) dt-bindings: mfd: bd71828: Use charger resistor in mOhm instead of MOhm dt-bindings: mfd: sprd,sc2731: Convert to YAML mfd: tqmx86: Add I2C IRQ support mfd: tqmx86: Make IRQ setup errors non-fatal mfd: tqmx86: Refactor GPIO IRQ setup mfd: tqmx86: Improve gpio_irq module parameter description mfd: tqmx86: Add board definitions for TQMx120UC, TQMx130UC and TQMxE41S mfd: 88pm886: Add the RTC cell dt-bindings: mfd: Add Realtek RTL9300 switch peripherals mfd: intel_soc_pmic_crc: Add support for non ACPI instantiated i2c_client mfd: intel_soc_pmic_*: Consistently use filename as driver name dt-bindings: mfd: qcom,tcsr: Add compatible for MSM8917 mfd: rt5033: Fix missing regmap_del_irq_chip() mfd: cgbc-core: Fix error handling paths in cgbc_init_device() dt-bindings: mfd: aspeed: Support for AST2700 mfd: Switch back to struct platform_driver::remove() dt-bindings: mfd: qcom,spmi-pmic: Document PMICs added in SM8750 mfd: rtc: bd7xxxx Drop IC name from IRQ mfd: mt6397: Add initial support for MT6328 mfd: adp5585: Drop obsolete dependency on COMPILE_TEST ...
136 lines
3.4 KiB
C
136 lines
3.4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/*
|
|
* Intel BXT Whiskey Cove PMIC TMU driver
|
|
*
|
|
* Copyright (C) 2016 Intel Corporation. All rights reserved.
|
|
*
|
|
* This driver adds TMU (Time Management Unit) support for Intel BXT platform.
|
|
* It enables the alarm wake-up functionality in the TMU unit of Whiskey Cove
|
|
* PMIC.
|
|
*/
|
|
|
|
#include <linux/module.h>
|
|
#include <linux/mod_devicetable.h>
|
|
#include <linux/interrupt.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/mfd/intel_soc_pmic.h>
|
|
|
|
#define BXTWC_TMUIRQ 0x4fb6
|
|
#define BXTWC_MIRQLVL1 0x4e0e
|
|
#define BXTWC_MTMUIRQ_REG 0x4fb7
|
|
#define BXTWC_MIRQLVL1_MTMU BIT(1)
|
|
#define BXTWC_TMU_WK_ALRM BIT(1)
|
|
#define BXTWC_TMU_SYS_ALRM BIT(2)
|
|
#define BXTWC_TMU_ALRM_MASK (BXTWC_TMU_WK_ALRM | BXTWC_TMU_SYS_ALRM)
|
|
#define BXTWC_TMU_ALRM_IRQ (BXTWC_TMU_WK_ALRM | BXTWC_TMU_SYS_ALRM)
|
|
|
|
struct wcove_tmu {
|
|
int irq;
|
|
struct device *dev;
|
|
struct regmap *regmap;
|
|
};
|
|
|
|
static irqreturn_t bxt_wcove_tmu_irq_handler(int irq, void *data)
|
|
{
|
|
struct wcove_tmu *wctmu = data;
|
|
unsigned int tmu_irq;
|
|
|
|
/* Read TMU interrupt reg */
|
|
regmap_read(wctmu->regmap, BXTWC_TMUIRQ, &tmu_irq);
|
|
if (tmu_irq & BXTWC_TMU_ALRM_IRQ) {
|
|
/* clear TMU irq */
|
|
regmap_write(wctmu->regmap, BXTWC_TMUIRQ, tmu_irq);
|
|
return IRQ_HANDLED;
|
|
}
|
|
return IRQ_NONE;
|
|
}
|
|
|
|
static int bxt_wcove_tmu_probe(struct platform_device *pdev)
|
|
{
|
|
struct intel_soc_pmic *pmic = dev_get_drvdata(pdev->dev.parent);
|
|
struct wcove_tmu *wctmu;
|
|
int ret;
|
|
|
|
wctmu = devm_kzalloc(&pdev->dev, sizeof(*wctmu), GFP_KERNEL);
|
|
if (!wctmu)
|
|
return -ENOMEM;
|
|
|
|
wctmu->dev = &pdev->dev;
|
|
wctmu->regmap = pmic->regmap;
|
|
|
|
wctmu->irq = platform_get_irq(pdev, 0);
|
|
if (wctmu->irq < 0)
|
|
return wctmu->irq;
|
|
|
|
ret = devm_request_threaded_irq(&pdev->dev, wctmu->irq,
|
|
NULL, bxt_wcove_tmu_irq_handler,
|
|
IRQF_ONESHOT, "bxt_wcove_tmu", wctmu);
|
|
if (ret) {
|
|
dev_err(&pdev->dev, "request irq failed: %d,virq: %d\n",
|
|
ret, wctmu->irq);
|
|
return ret;
|
|
}
|
|
|
|
/* Unmask TMU second level Wake & System alarm */
|
|
regmap_update_bits(wctmu->regmap, BXTWC_MTMUIRQ_REG,
|
|
BXTWC_TMU_ALRM_MASK, 0);
|
|
|
|
platform_set_drvdata(pdev, wctmu);
|
|
return 0;
|
|
}
|
|
|
|
static void bxt_wcove_tmu_remove(struct platform_device *pdev)
|
|
{
|
|
struct wcove_tmu *wctmu = platform_get_drvdata(pdev);
|
|
unsigned int val;
|
|
|
|
/* Mask TMU interrupts */
|
|
regmap_read(wctmu->regmap, BXTWC_MIRQLVL1, &val);
|
|
regmap_write(wctmu->regmap, BXTWC_MIRQLVL1,
|
|
val | BXTWC_MIRQLVL1_MTMU);
|
|
regmap_read(wctmu->regmap, BXTWC_MTMUIRQ_REG, &val);
|
|
regmap_write(wctmu->regmap, BXTWC_MTMUIRQ_REG,
|
|
val | BXTWC_TMU_ALRM_MASK);
|
|
}
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
static int bxtwc_tmu_suspend(struct device *dev)
|
|
{
|
|
struct wcove_tmu *wctmu = dev_get_drvdata(dev);
|
|
|
|
enable_irq_wake(wctmu->irq);
|
|
return 0;
|
|
}
|
|
|
|
static int bxtwc_tmu_resume(struct device *dev)
|
|
{
|
|
struct wcove_tmu *wctmu = dev_get_drvdata(dev);
|
|
|
|
disable_irq_wake(wctmu->irq);
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
static SIMPLE_DEV_PM_OPS(bxtwc_tmu_pm_ops, bxtwc_tmu_suspend, bxtwc_tmu_resume);
|
|
|
|
static const struct platform_device_id bxt_wcove_tmu_id_table[] = {
|
|
{ .name = "bxt_wcove_tmu" },
|
|
{},
|
|
};
|
|
MODULE_DEVICE_TABLE(platform, bxt_wcove_tmu_id_table);
|
|
|
|
static struct platform_driver bxt_wcove_tmu_driver = {
|
|
.probe = bxt_wcove_tmu_probe,
|
|
.remove = bxt_wcove_tmu_remove,
|
|
.driver = {
|
|
.name = "bxt_wcove_tmu",
|
|
.pm = &bxtwc_tmu_pm_ops,
|
|
},
|
|
.id_table = bxt_wcove_tmu_id_table,
|
|
};
|
|
|
|
module_platform_driver(bxt_wcove_tmu_driver);
|
|
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_AUTHOR("Nilesh Bacchewar <nilesh.bacchewar@intel.com>");
|
|
MODULE_DESCRIPTION("BXT Whiskey Cove TMU Driver");
|