RTC for 6.13
Subsystem: - use boolean values with device_init_wakeup() Drivers: - pcf2127: add BSM support - pcf85063: fix possible out of bound write -----BEGIN PGP SIGNATURE----- iQIzBAABCgAdFiEEBqsFVZXh8s/0O5JiY6TcMGxwOjIFAmeb/UQACgkQY6TcMGxw OjLgTA//fUNMueHNrdwEA2RATolmOpfz5tlplE2DPfIAaknJDOpZFZo6GuVsMb9S B0oIdwfpNa9+cJyK2cA5Bvjqh/TeLJCrH7UPbZXBczQQG3YFmwsoFhpcjJAR2JDr es72pLK+uALrWI//pN3y7cbtfOXm+5rGBoKCWxJTuFdWpuxbrgs7bBSDY3EGXefd jR+RU3IkJSmjauSv5IYfkmg0g5H0yREwQkPk2ymZvIf0Vao9XsTKlWdUucdugfDV 7nPIcIdgsYKyB/+U1WmBo2eu/kcAz1cjj8aAfViYww0MgGvtU4heJx3v+Gpp5O8D D8xGUAIp28UG6pj9BNJBOP/Y3fahTnqGp9HvyCl0DnaqZYfQPLlqCOkXDlktfGB5 YBRnzkecRqzJAFroTrrx8E9CIvp2u0kGBOikDKZ/l1dleYiWVJVmALfXH0KFLsVR ByiPKayaq8kGCqjZR8Ge1QDd4y8vQ+QqXQvADrPnRmreck8nqLCZrvsReGWjMpWq x0gSrhZU6k8tyYiufDO2JyyxoD96bHc8w6FmQquMKylzjVjNcoEjPLToIReyb+h1 ql2JfTeY4jkcyFj/H6vkrtehumYNxzl2nHP8QtV4yOgbfn/UTxdAfAsB9m9e7AAz gdHsm2pt6gFkxirm0xST/Z5CohZRR+9/m9agvbM1l2Lu5q+WFu4= =BxV0 -----END PGP SIGNATURE----- Merge tag 'rtc-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux Pull RTC updates from Alexandre Belloni: "Not much this cycle, there are multiple small fixes. Core: - use boolean values with device_init_wakeup() Drivers: - pcf2127: add BSM support - pcf85063: fix possible out of bounds write" * tag 'rtc-6.14' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: rtc: pcf2127: add BSM support rtc: Remove hpet_rtc_dropped_irq() dt-bindings: rtc: mxc: Document fsl,imx31-rtc rtc: stm32: Use syscon_regmap_lookup_by_phandle_args rtc: zynqmp: Fix optional clock name property rtc: loongson: clear TOY_MATCH0_REG in loongson_rtc_isr() rtc: pcf85063: fix potential OOB write in PCF85063 NVMEM read rtc: tps6594: Fix integer overflow on 32bit systems rtc: use boolean values with device_init_wakeup() rtc: RTC_DRV_SPEAR should not default to y when compile-testing
This commit is contained in:
commit
2a9f04bde0
|
@ -14,9 +14,13 @@ maintainers:
|
|||
|
||||
properties:
|
||||
compatible:
|
||||
enum:
|
||||
- fsl,imx1-rtc
|
||||
- fsl,imx21-rtc
|
||||
oneOf:
|
||||
- const: fsl,imx1-rtc
|
||||
- const: fsl,imx21-rtc
|
||||
- items:
|
||||
- enum:
|
||||
- fsl,imx31-rtc
|
||||
- const: fsl,imx21-rtc
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
|
|
@ -84,7 +84,6 @@ extern int hpet_set_rtc_irq_bit(unsigned long bit_mask);
|
|||
extern int hpet_set_alarm_time(unsigned char hrs, unsigned char min,
|
||||
unsigned char sec);
|
||||
extern int hpet_set_periodic_freq(unsigned long freq);
|
||||
extern int hpet_rtc_dropped_irq(void);
|
||||
extern int hpet_rtc_timer_init(void);
|
||||
extern irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id);
|
||||
extern int hpet_register_irq_handler(rtc_irq_handler handler);
|
||||
|
|
|
@ -1382,12 +1382,6 @@ int hpet_set_periodic_freq(unsigned long freq)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(hpet_set_periodic_freq);
|
||||
|
||||
int hpet_rtc_dropped_irq(void)
|
||||
{
|
||||
return is_hpet_enabled();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq);
|
||||
|
||||
static void hpet_rtc_timer_reinit(void)
|
||||
{
|
||||
unsigned int delta;
|
||||
|
|
|
@ -1316,7 +1316,7 @@ config RTC_DRV_SC27XX
|
|||
config RTC_DRV_SPEAR
|
||||
tristate "SPEAR ST RTC"
|
||||
depends on PLAT_SPEAR || COMPILE_TEST
|
||||
default y
|
||||
default PLAT_SPEAR
|
||||
help
|
||||
If you say Y here you will get support for the RTC found on
|
||||
spear
|
||||
|
|
|
@ -308,7 +308,7 @@ static int pm80x_rtc_probe(struct platform_device *pdev)
|
|||
/* remember whether this power up is caused by PMIC RTC or not */
|
||||
info->rtc_dev->dev.platform_data = &pdata->rtc_wakeup;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
return 0;
|
||||
out_rtc:
|
||||
|
|
|
@ -326,7 +326,7 @@ static int pm860x_rtc_probe(struct platform_device *pdev)
|
|||
schedule_delayed_work(&info->calib_work, VRTC_CALIB_INTERVAL);
|
||||
#endif /* VRTC_CALIBRATION */
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -361,7 +361,7 @@ static int aml_rtc_probe(struct platform_device *pdev)
|
|||
"failed to get_enable rtc sys clk\n");
|
||||
aml_rtc_init(rtc);
|
||||
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
rtc->rtc_dev = devm_rtc_allocate_device(dev);
|
||||
|
@ -391,7 +391,7 @@ static int aml_rtc_probe(struct platform_device *pdev)
|
|||
return 0;
|
||||
err_clk:
|
||||
clk_disable_unprepare(rtc->sys_clk);
|
||||
device_init_wakeup(dev, 0);
|
||||
device_init_wakeup(dev, false);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -426,7 +426,7 @@ static void aml_rtc_remove(struct platform_device *pdev)
|
|||
struct aml_rtc_data *rtc = dev_get_drvdata(&pdev->dev);
|
||||
|
||||
clk_disable_unprepare(rtc->sys_clk);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
}
|
||||
|
||||
static const struct aml_rtc_config a5_rtc_config = {
|
||||
|
|
|
@ -527,7 +527,7 @@ static __init int armada38x_rtc_probe(struct platform_device *pdev)
|
|||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
if (rtc->irq != -1)
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
else
|
||||
clear_bit(RTC_FEATURE_ALARM, rtc->rtc_dev->features);
|
||||
|
||||
|
|
|
@ -187,7 +187,7 @@ static int as3722_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
as3722_rtc->rtc = devm_rtc_device_register(&pdev->dev, "as3722-rtc",
|
||||
&as3722_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -528,7 +528,7 @@ static int __init at91_rtc_probe(struct platform_device *pdev)
|
|||
* being wake-capable; if it didn't, do that here.
|
||||
*/
|
||||
if (!device_can_wakeup(&pdev->dev))
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
if (at91_rtc_config->has_correction)
|
||||
rtc->ops = &sama5d4_rtc_ops;
|
||||
|
|
|
@ -353,7 +353,7 @@ static int at91_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
/* platform setup code should have handled this; sigh */
|
||||
if (!device_can_wakeup(&pdev->dev))
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
|
|
|
@ -359,7 +359,7 @@ static void cdns_rtc_remove(struct platform_device *pdev)
|
|||
struct cdns_rtc *crtc = platform_get_drvdata(pdev);
|
||||
|
||||
cdns_rtc_alarm_irq_enable(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
|
||||
clk_disable_unprepare(crtc->pclk);
|
||||
clk_disable_unprepare(crtc->ref_clk);
|
||||
|
|
|
@ -151,11 +151,6 @@ static inline int hpet_set_periodic_freq(unsigned long freq)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static inline int hpet_rtc_dropped_irq(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int hpet_rtc_timer_init(void)
|
||||
{
|
||||
return 0;
|
||||
|
@ -864,7 +859,7 @@ static void acpi_cmos_wake_setup(struct device *dev)
|
|||
dev_info(dev, "RTC can wake from S4\n");
|
||||
|
||||
/* RTC always wakes from S1/S2/S3, and often S4/STD */
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
}
|
||||
|
||||
static void cmos_check_acpi_rtc_status(struct device *dev,
|
||||
|
|
|
@ -295,7 +295,7 @@ static int cpcap_rtc_probe(struct platform_device *pdev)
|
|||
}
|
||||
disable_irq(rtc->update_irq);
|
||||
|
||||
err = device_init_wakeup(dev, 1);
|
||||
err = device_init_wakeup(dev, true);
|
||||
if (err) {
|
||||
dev_err(dev, "wakeup initialization failed (%d)\n", err);
|
||||
/* ignore error and continue without wakeup support */
|
||||
|
|
|
@ -337,7 +337,7 @@ static int cros_ec_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ret = device_init_wakeup(&pdev->dev, 1);
|
||||
ret = device_init_wakeup(&pdev->dev, true);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "failed to initialize wakeup\n");
|
||||
return ret;
|
||||
|
|
|
@ -288,7 +288,7 @@ static int da9055_rtc_probe(struct platform_device *pdev)
|
|||
if (ret & DA9055_RTC_ALM_EN)
|
||||
rtc->alarm_enable = 1;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&da9055_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -508,7 +508,7 @@ static int ds3232_probe(struct device *dev, struct regmap *regmap, int irq,
|
|||
return ret;
|
||||
|
||||
if (ds3232->irq > 0)
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
ds3232_hwmon_register(dev, name);
|
||||
|
||||
|
|
|
@ -830,7 +830,7 @@ static int isl1208_setup_irq(struct i2c_client *client, int irq)
|
|||
isl1208_driver.driver.name,
|
||||
client);
|
||||
if (!rc) {
|
||||
device_init_wakeup(&client->dev, 1);
|
||||
device_init_wakeup(&client->dev, true);
|
||||
enable_irq_wake(irq);
|
||||
} else {
|
||||
dev_err(&client->dev,
|
||||
|
|
|
@ -367,7 +367,7 @@ static int jz4740_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
ret = dev_pm_set_wake_irq(dev, irq);
|
||||
if (ret)
|
||||
|
|
|
@ -114,6 +114,13 @@ static irqreturn_t loongson_rtc_isr(int irq, void *id)
|
|||
struct loongson_rtc_priv *priv = (struct loongson_rtc_priv *)id;
|
||||
|
||||
rtc_update_irq(priv->rtcdev, 1, RTC_AF | RTC_IRQF);
|
||||
|
||||
/*
|
||||
* The TOY_MATCH0_REG should be cleared 0 here,
|
||||
* otherwise the interrupt cannot be cleared.
|
||||
*/
|
||||
regmap_write(priv->regmap, TOY_MATCH0_REG, 0);
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
|
@ -131,11 +138,7 @@ static u32 loongson_rtc_handler(void *id)
|
|||
writel(RTC_STS, priv->pm_base + PM1_STS_REG);
|
||||
spin_unlock(&priv->lock);
|
||||
|
||||
/*
|
||||
* The TOY_MATCH0_REG should be cleared 0 here,
|
||||
* otherwise the interrupt cannot be cleared.
|
||||
*/
|
||||
return regmap_write(priv->regmap, TOY_MATCH0_REG, 0);
|
||||
return ACPI_INTERRUPT_HANDLED;
|
||||
}
|
||||
|
||||
static int loongson_rtc_set_enabled(struct device *dev)
|
||||
|
@ -329,7 +332,7 @@ static int loongson_rtc_probe(struct platform_device *pdev)
|
|||
alarm_irq);
|
||||
|
||||
priv->pm_base = regs - priv->config->pm_offset;
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
if (has_acpi_companion(dev))
|
||||
acpi_install_fixed_event_handler(ACPI_EVENT_RTC,
|
||||
|
@ -360,7 +363,7 @@ static void loongson_rtc_remove(struct platform_device *pdev)
|
|||
acpi_remove_fixed_event_handler(ACPI_EVENT_RTC,
|
||||
loongson_rtc_handler);
|
||||
|
||||
device_init_wakeup(dev, 0);
|
||||
device_init_wakeup(dev, false);
|
||||
loongson_rtc_alarm_irq_enable(dev, 0);
|
||||
}
|
||||
|
||||
|
|
|
@ -293,7 +293,7 @@ static int lp8788_rtc_probe(struct platform_device *pdev)
|
|||
rtc->alarm = lp->pdata ? lp->pdata->alarm_sel : DEFAULT_ALARM_SEL;
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
rtc->rdev = devm_rtc_device_register(dev, "lp8788_rtc",
|
||||
&lp8788_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -257,7 +257,7 @@ static int lpc32xx_rtc_probe(struct platform_device *pdev)
|
|||
dev_warn(&pdev->dev, "Can't request interrupt.\n");
|
||||
rtc->irq = -1;
|
||||
} else {
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -770,7 +770,7 @@ static int max77686_rtc_probe(struct platform_device *pdev)
|
|||
goto err_rtc;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
info->rtc_dev = devm_rtc_device_register(&pdev->dev, id->name,
|
||||
&max77686_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -270,7 +270,7 @@ static int max8925_rtc_probe(struct platform_device *pdev)
|
|||
/* XXX - isn't this redundant? */
|
||||
platform_set_drvdata(pdev, info);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8925-rtc",
|
||||
&max8925_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -473,7 +473,7 @@ static int max8997_rtc_probe(struct platform_device *pdev)
|
|||
max8997_rtc_enable_wtsr(info, true);
|
||||
max8997_rtc_enable_smpl(info, true);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
info->rtc_dev = devm_rtc_device_register(&pdev->dev, "max8997-rtc",
|
||||
&max8997_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -74,7 +74,7 @@ static int meson_vrtc_probe(struct platform_device *pdev)
|
|||
if (IS_ERR(vrtc->io_alarm))
|
||||
return PTR_ERR(vrtc->io_alarm);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
platform_set_drvdata(pdev, vrtc);
|
||||
|
||||
|
|
|
@ -303,7 +303,7 @@ static int mpc5121_rtc_probe(struct platform_device *op)
|
|||
return PTR_ERR(rtc->regs);
|
||||
}
|
||||
|
||||
device_init_wakeup(&op->dev, 1);
|
||||
device_init_wakeup(&op->dev, true);
|
||||
|
||||
platform_set_drvdata(op, rtc);
|
||||
|
||||
|
|
|
@ -286,7 +286,7 @@ static int mtk_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
rtc->rtc_dev->ops = &mtk_rtc_ops;
|
||||
rtc->rtc_dev->range_min = RTC_TIMESTAMP_BEGIN_1900;
|
||||
|
|
|
@ -264,7 +264,7 @@ static int __init mv_rtc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (pdata->irq >= 0)
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
else
|
||||
clear_bit(RTC_FEATURE_ALARM, pdata->rtc->features);
|
||||
|
||||
|
@ -287,7 +287,7 @@ static void __exit mv_rtc_remove(struct platform_device *pdev)
|
|||
struct rtc_plat_data *pdata = platform_get_drvdata(pdev);
|
||||
|
||||
if (pdata->irq >= 0)
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
|
||||
if (!IS_ERR(pdata->clk))
|
||||
clk_disable_unprepare(pdata->clk);
|
||||
|
|
|
@ -377,7 +377,7 @@ static int mxc_rtc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
if (pdata->irq >= 0) {
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
ret = dev_pm_set_wake_irq(&pdev->dev, pdata->irq);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to enable irq wake\n");
|
||||
|
|
|
@ -302,7 +302,7 @@ static int mxc_rtc_probe(struct platform_device *pdev)
|
|||
if (pdata->irq < 0)
|
||||
return pdata->irq;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
ret = dev_pm_set_wake_irq(&pdev->dev, pdata->irq);
|
||||
if (ret)
|
||||
dev_err(&pdev->dev, "failed to enable irq wake\n");
|
||||
|
|
|
@ -920,7 +920,7 @@ static void omap_rtc_remove(struct platform_device *pdev)
|
|||
omap_rtc_power_off_rtc = NULL;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
|
||||
if (!IS_ERR(rtc->clk))
|
||||
clk_disable_unprepare(rtc->clk);
|
||||
|
|
|
@ -287,7 +287,7 @@ static int palmas_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
palmas_rtc->irq = platform_get_irq(pdev, 0);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
palmas_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&palmas_rtc_ops, THIS_MODULE);
|
||||
if (IS_ERR(palmas_rtc->rtc)) {
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/i2c.h>
|
||||
#include <linux/spi/spi.h>
|
||||
#include <linux/bcd.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/rtc.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -48,6 +49,7 @@
|
|||
#define PCF2127_BIT_CTRL3_BLF BIT(2)
|
||||
#define PCF2127_BIT_CTRL3_BF BIT(3)
|
||||
#define PCF2127_BIT_CTRL3_BTSE BIT(4)
|
||||
#define PCF2127_CTRL3_PM GENMASK(7, 5)
|
||||
/* Time and date registers */
|
||||
#define PCF2127_REG_TIME_BASE 0x03
|
||||
#define PCF2127_BIT_SC_OSF BIT(7)
|
||||
|
@ -331,6 +333,84 @@ static int pcf2127_rtc_set_time(struct device *dev, struct rtc_time *tm)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int pcf2127_param_get(struct device *dev, struct rtc_param *param)
|
||||
{
|
||||
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
|
||||
u32 value;
|
||||
int ret;
|
||||
|
||||
switch (param->param) {
|
||||
case RTC_PARAM_BACKUP_SWITCH_MODE:
|
||||
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
value = FIELD_GET(PCF2127_CTRL3_PM, value);
|
||||
|
||||
if (value < 0x3)
|
||||
param->uvalue = RTC_BSM_LEVEL;
|
||||
else if (value < 0x6)
|
||||
param->uvalue = RTC_BSM_DIRECT;
|
||||
else
|
||||
param->uvalue = RTC_BSM_DISABLED;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcf2127_param_set(struct device *dev, struct rtc_param *param)
|
||||
{
|
||||
struct pcf2127 *pcf2127 = dev_get_drvdata(dev);
|
||||
u8 mode = 0;
|
||||
u32 value;
|
||||
int ret;
|
||||
|
||||
switch (param->param) {
|
||||
case RTC_PARAM_BACKUP_SWITCH_MODE:
|
||||
ret = regmap_read(pcf2127->regmap, PCF2127_REG_CTRL3, &value);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
value = FIELD_GET(PCF2127_CTRL3_PM, value);
|
||||
|
||||
if (value > 5)
|
||||
value -= 5;
|
||||
else if (value > 2)
|
||||
value -= 3;
|
||||
|
||||
switch (param->uvalue) {
|
||||
case RTC_BSM_LEVEL:
|
||||
break;
|
||||
case RTC_BSM_DIRECT:
|
||||
mode = 3;
|
||||
break;
|
||||
case RTC_BSM_DISABLED:
|
||||
if (value == 0)
|
||||
value = 1;
|
||||
mode = 5;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return regmap_update_bits(pcf2127->regmap, PCF2127_REG_CTRL3,
|
||||
PCF2127_CTRL3_PM,
|
||||
FIELD_PREP(PCF2127_CTRL3_PM, mode + value));
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcf2127_rtc_ioctl(struct device *dev,
|
||||
unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
|
@ -741,6 +821,8 @@ static const struct rtc_class_ops pcf2127_rtc_ops = {
|
|||
.read_alarm = pcf2127_rtc_read_alarm,
|
||||
.set_alarm = pcf2127_rtc_set_alarm,
|
||||
.alarm_irq_enable = pcf2127_rtc_alarm_irq_enable,
|
||||
.param_get = pcf2127_param_get,
|
||||
.param_set = pcf2127_param_set,
|
||||
};
|
||||
|
||||
/* sysfs interface */
|
||||
|
|
|
@ -322,7 +322,16 @@ static const struct rtc_class_ops pcf85063_rtc_ops = {
|
|||
static int pcf85063_nvmem_read(void *priv, unsigned int offset,
|
||||
void *val, size_t bytes)
|
||||
{
|
||||
return regmap_read(priv, PCF85063_REG_RAM, val);
|
||||
unsigned int tmp;
|
||||
int ret;
|
||||
|
||||
ret = regmap_read(priv, PCF85063_REG_RAM, &tmp);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
*(u8 *)val = tmp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int pcf85063_nvmem_write(void *priv, unsigned int offset,
|
||||
|
|
|
@ -330,7 +330,7 @@ static int pic32_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
pic32_rtc_enable(pdata, 1);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
pdata->rtc->ops = &pic32_rtcops;
|
||||
pdata->rtc->range_min = RTC_TIMESTAMP_BEGIN_2000;
|
||||
|
|
|
@ -503,7 +503,7 @@ static int pm8xxx_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
platform_set_drvdata(pdev, rtc_dd);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
rtc_dd->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(rtc_dd->rtc))
|
||||
|
|
|
@ -360,7 +360,7 @@ static int __init pxa_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(dev, 1);
|
||||
device_init_wakeup(dev, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -245,7 +245,7 @@ static int rc5t583_rtc_probe(struct platform_device *pdev)
|
|||
dev_err(&pdev->dev, "IRQ is not free.\n");
|
||||
return ret;
|
||||
}
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
ricoh_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&rc5t583_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -414,7 +414,7 @@ static int rc5t619_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
} else {
|
||||
/* enable wake */
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
enable_irq_wake(rtc->irq);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -768,7 +768,7 @@ static int rtca3_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
priv->rtc_dev = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(priv->rtc_dev))
|
||||
|
|
|
@ -418,7 +418,7 @@ static int rk808_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
rk808_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(rk808_rtc->rtc))
|
||||
|
|
|
@ -456,7 +456,7 @@ static int s3c_rtc_probe(struct platform_device *pdev)
|
|||
dev_dbg(&pdev->dev, "s3c2410_rtc: RTCCON=%02x\n",
|
||||
readw(info->base + S3C2410_RTCCON));
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
info->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(info->rtc)) {
|
||||
|
|
|
@ -729,7 +729,7 @@ static int s5m_rtc_probe(struct platform_device *pdev)
|
|||
info->irq, ret);
|
||||
return ret;
|
||||
}
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
}
|
||||
|
||||
return devm_rtc_register_device(info->rtc_dev);
|
||||
|
|
|
@ -292,7 +292,7 @@ static int sa1100_rtc_probe(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
platform_set_drvdata(pdev, info);
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
return sa1100_rtc_init(pdev, info);
|
||||
}
|
||||
|
|
|
@ -613,14 +613,14 @@ static int sprd_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
rtc->rtc->ops = &sprd_rtc_ops;
|
||||
rtc->rtc->range_min = 0;
|
||||
rtc->rtc->range_max = 5662310399LL;
|
||||
ret = devm_rtc_register_device(rtc->rtc);
|
||||
if (ret) {
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
@ -611,7 +611,7 @@ static int __init sh_rtc_probe(struct platform_device *pdev)
|
|||
if (ret)
|
||||
goto err_unmap;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
return 0;
|
||||
|
||||
err_unmap:
|
||||
|
|
|
@ -395,7 +395,7 @@ static int spear_rtc_probe(struct platform_device *pdev)
|
|||
goto err_disable_clock;
|
||||
|
||||
if (!device_can_wakeup(&pdev->dev))
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -411,7 +411,7 @@ static void spear_rtc_remove(struct platform_device *pdev)
|
|||
|
||||
spear_rtc_disable_interrupt(config);
|
||||
clk_disable_unprepare(config->clk);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
|
|
@ -1074,26 +1074,18 @@ static int stm32_rtc_probe(struct platform_device *pdev)
|
|||
regs = &rtc->data->regs;
|
||||
|
||||
if (rtc->data->need_dbp) {
|
||||
rtc->dbp = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
||||
"st,syscfg");
|
||||
unsigned int args[2];
|
||||
|
||||
rtc->dbp = syscon_regmap_lookup_by_phandle_args(pdev->dev.of_node,
|
||||
"st,syscfg",
|
||||
2, args);
|
||||
if (IS_ERR(rtc->dbp)) {
|
||||
dev_err(&pdev->dev, "no st,syscfg\n");
|
||||
return PTR_ERR(rtc->dbp);
|
||||
}
|
||||
|
||||
ret = of_property_read_u32_index(pdev->dev.of_node, "st,syscfg",
|
||||
1, &rtc->dbp_reg);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "can't read DBP register offset\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = of_property_read_u32_index(pdev->dev.of_node, "st,syscfg",
|
||||
2, &rtc->dbp_mask);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "can't read DBP register mask\n");
|
||||
return ret;
|
||||
}
|
||||
rtc->dbp_reg = args[0];
|
||||
rtc->dbp_mask = args[1];
|
||||
}
|
||||
|
||||
if (!rtc->data->has_pclk) {
|
||||
|
|
|
@ -826,7 +826,7 @@ static int sun6i_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
clk_prepare_enable(chip->losc);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
chip->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(chip->rtc))
|
||||
|
|
|
@ -269,7 +269,7 @@ static int sp_rtc_probe(struct platform_device *plat_dev)
|
|||
if (ret)
|
||||
goto free_reset_assert;
|
||||
|
||||
device_init_wakeup(&plat_dev->dev, 1);
|
||||
device_init_wakeup(&plat_dev->dev, true);
|
||||
dev_set_drvdata(&plat_dev->dev, sp_rtc);
|
||||
|
||||
sp_rtc->rtc = devm_rtc_allocate_device(&plat_dev->dev);
|
||||
|
@ -307,7 +307,7 @@ static void sp_rtc_remove(struct platform_device *plat_dev)
|
|||
{
|
||||
struct sunplus_rtc *sp_rtc = dev_get_drvdata(&plat_dev->dev);
|
||||
|
||||
device_init_wakeup(&plat_dev->dev, 0);
|
||||
device_init_wakeup(&plat_dev->dev, false);
|
||||
reset_control_assert(sp_rtc->rstc);
|
||||
clk_disable_unprepare(sp_rtc->rtcclk);
|
||||
}
|
||||
|
|
|
@ -319,7 +319,7 @@ static int tegra_rtc_probe(struct platform_device *pdev)
|
|||
writel(0xffffffff, info->base + TEGRA_RTC_REG_INTR_STATUS);
|
||||
writel(0, info->base + TEGRA_RTC_REG_INTR_MASK);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, info->irq, tegra_rtc_irq_handler,
|
||||
IRQF_TRIGGER_HIGH, dev_name(&pdev->dev),
|
||||
|
|
|
@ -132,7 +132,7 @@ static int test_probe(struct platform_device *plat_dev)
|
|||
break;
|
||||
default:
|
||||
rtd->rtc->ops = &test_rtc_ops;
|
||||
device_init_wakeup(&plat_dev->dev, 1);
|
||||
device_init_wakeup(&plat_dev->dev, true);
|
||||
}
|
||||
|
||||
timer_setup(&rtd->alarm, test_rtc_alarm_handler, 0);
|
||||
|
|
|
@ -241,7 +241,7 @@ static int tps6586x_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
platform_set_drvdata(pdev, rtc);
|
||||
rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
|
|
|
@ -418,7 +418,7 @@ static int tps65910_rtc_probe(struct platform_device *pdev)
|
|||
tps_rtc->irq = irq;
|
||||
if (irq != -1) {
|
||||
if (device_property_present(tps65910->dev, "wakeup-source"))
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
else
|
||||
device_set_wakeup_capable(&pdev->dev, 1);
|
||||
} else {
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
#define MAX_OFFSET (277774)
|
||||
|
||||
// Number of ticks per hour
|
||||
#define TICKS_PER_HOUR (32768 * 3600)
|
||||
#define TICKS_PER_HOUR (32768 * 3600LL)
|
||||
|
||||
// Multiplier for ppb conversions
|
||||
#define PPB_MULT NANO
|
||||
|
|
|
@ -572,7 +572,7 @@ static int twl_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
|
||||
platform_set_drvdata(pdev, twl_rtc);
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
twl_rtc->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
|
||||
&twl_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -420,7 +420,7 @@ static int wm831x_rtc_probe(struct platform_device *pdev)
|
|||
if (ret & WM831X_RTC_ALM_ENA)
|
||||
wm831x_rtc->alarm_enabled = 1;
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
wm831x_rtc->rtc = devm_rtc_allocate_device(&pdev->dev);
|
||||
if (IS_ERR(wm831x_rtc->rtc))
|
||||
|
|
|
@ -420,7 +420,7 @@ static int wm8350_rtc_probe(struct platform_device *pdev)
|
|||
}
|
||||
}
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
wm_rtc->rtc = devm_rtc_device_register(&pdev->dev, "wm8350",
|
||||
&wm8350_rtc_ops, THIS_MODULE);
|
||||
|
|
|
@ -174,7 +174,7 @@ static int xgene_rtc_probe(struct platform_device *pdev)
|
|||
/* Turn on the clock and the crystal */
|
||||
writel(RTC_CCR_EN, pdata->csr_base + RTC_CCR);
|
||||
|
||||
ret = device_init_wakeup(&pdev->dev, 1);
|
||||
ret = device_init_wakeup(&pdev->dev, true);
|
||||
if (ret) {
|
||||
clk_disable_unprepare(pdata->clk);
|
||||
return ret;
|
||||
|
@ -197,7 +197,7 @@ static void xgene_rtc_remove(struct platform_device *pdev)
|
|||
struct xgene_rtc_dev *pdata = platform_get_drvdata(pdev);
|
||||
|
||||
xgene_rtc_alarm_irq_enable(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
clk_disable_unprepare(pdata->clk);
|
||||
}
|
||||
|
||||
|
|
|
@ -318,8 +318,8 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Getting the rtc_clk info */
|
||||
xrtcdev->rtc_clk = devm_clk_get_optional(&pdev->dev, "rtc_clk");
|
||||
/* Getting the rtc info */
|
||||
xrtcdev->rtc_clk = devm_clk_get_optional(&pdev->dev, "rtc");
|
||||
if (IS_ERR(xrtcdev->rtc_clk)) {
|
||||
if (PTR_ERR(xrtcdev->rtc_clk) != -EPROBE_DEFER)
|
||||
dev_warn(&pdev->dev, "Device clock not found.\n");
|
||||
|
@ -337,7 +337,7 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
|
|||
|
||||
xlnx_init_rtc(xrtcdev);
|
||||
|
||||
device_init_wakeup(&pdev->dev, 1);
|
||||
device_init_wakeup(&pdev->dev, true);
|
||||
|
||||
return devm_rtc_register_device(xrtcdev->rtc);
|
||||
}
|
||||
|
@ -345,7 +345,7 @@ static int xlnx_rtc_probe(struct platform_device *pdev)
|
|||
static void xlnx_rtc_remove(struct platform_device *pdev)
|
||||
{
|
||||
xlnx_rtc_alarm_irq_enable(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, 0);
|
||||
device_init_wakeup(&pdev->dev, false);
|
||||
}
|
||||
|
||||
static int __maybe_unused xlnx_rtc_suspend(struct device *dev)
|
||||
|
|
Loading…
Reference in New Issue