Commit 3faae16b authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'rtc-6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux

Pull RTC updates from Alexandre Belloni:
 "Subsytem:
   - rtc_class is now const

  Drivers:
   - ds1511: cleanup, set date and time range and alarm offset limit
   - max31335: fix interrupt handler
   - pcf8523: improve suspend support"

* tag 'rtc-6.9' of git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux: (28 commits)
  MAINTAINER: Include linux-arm-msm for Qualcomm RTC patches
  dt-bindings: rtc: zynqmp: Add support for Versal/Versal NET SoCs
  rtc: class: make rtc_class constant
  dt-bindings: rtc: abx80x: Improve checks on trickle charger constraints
  MAINTAINERS: adjust file entry in ARM/Mediatek RTC DRIVER
  rtc: nct3018y: fix possible NULL dereference
  rtc: max31335: fix interrupt status reg
  rtc: mt6397: select IRQ_DOMAIN instead of depending on it
  dt-bindings: rtc: abx80x: convert to yaml
  rtc: m41t80: Use the unified property API get the wakeup-source property
  dt-bindings: at91rm9260-rtt: add sam9x7 compatible
  dt-bindings: rtc: convert MT7622 RTC to the json-schema
  dt-bindings: rtc: convert MT2717 RTC to the json-schema
  rtc: pcf8523: add suspend handlers for alarm IRQ
  rtc: ds1511: set alarm offset limit
  rtc: ds1511: set range
  rtc: ds1511: drop inline/noinline hints
  rtc: ds1511: rename pdata
  rtc: ds1511: implement ds1511_rtc_read_alarm properly
  rtc: ds1511: remove partial alarm support
  ...
parents 00453419 f7cee094
Abracon ABX80X I2C ultra low power RTC/Alarm chip
The Abracon ABX80X family consist of the ab0801, ab0803, ab0804, ab0805, ab1801,
ab1803, ab1804 and ab1805. The ab0805 is the superset of ab080x and the ab1805
is the superset of ab180x.
Required properties:
- "compatible": should one of:
"abracon,abx80x"
"abracon,ab0801"
"abracon,ab0803"
"abracon,ab0804"
"abracon,ab0805"
"abracon,ab1801"
"abracon,ab1803"
"abracon,ab1804"
"abracon,ab1805"
"microcrystal,rv1805"
Using "abracon,abx80x" will enable chip autodetection.
- "reg": I2C bus address of the device
Optional properties:
The abx804 and abx805 have a trickle charger that is able to charge the
connected battery or supercap. Both the following properties have to be defined
and valid to enable charging:
- "abracon,tc-diode": should be "standard" (0.6V) or "schottky" (0.3V)
- "abracon,tc-resistor": should be <0>, <3>, <6> or <11>. 0 disables the output
resistor, the other values are in kOhm.
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/rtc/abracon,abx80x.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Abracon ABX80X I2C ultra low power RTC/Alarm chip
maintainers:
- linux-rtc@vger.kernel.org
properties:
compatible:
description:
The wildcard 'abracon,abx80x' may be used to support a mix
of different abracon rtc`s. In this case the driver
must perform auto-detection from ID register.
enum:
- abracon,abx80x
- abracon,ab0801
- abracon,ab0803
- abracon,ab0804
- abracon,ab0805
- abracon,ab1801
- abracon,ab1803
- abracon,ab1804
- abracon,ab1805
- microcrystal,rv1805
reg:
maxItems: 1
interrupts:
maxItems: 1
abracon,tc-diode:
description:
Trickle-charge diode type.
Required to enable charging backup battery.
Supported are 'standard' diodes with a 0.6V drop
and 'schottky' diodes with a 0.3V drop.
$ref: /schemas/types.yaml#/definitions/string
enum:
- standard
- schottky
abracon,tc-resistor:
description:
Trickle-charge resistor value in kOhm.
Required to enable charging backup battery.
$ref: /schemas/types.yaml#/definitions/uint32
enum: [0, 3, 6, 11]
dependentRequired:
abracon,tc-diode: ["abracon,tc-resistor"]
abracon,tc-resistor: ["abracon,tc-diode"]
required:
- compatible
- reg
allOf:
- $ref: rtc.yaml#
- if:
properties:
compatible:
not:
contains:
enum:
- abracon,abx80x
- abracon,ab0804
- abracon,ab1804
- abracon,ab0805
- abracon,ab1805
then:
properties:
abracon,tc-diode: false
abracon,tc-resistor: false
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/irq.h>
i2c {
#address-cells = <1>;
#size-cells = <0>;
rtc@69 {
compatible = "abracon,abx80x";
reg = <0x69>;
abracon,tc-diode = "schottky";
abracon,tc-resistor = <3>;
interrupts = <44 IRQ_TYPE_EDGE_FALLING>;
};
};
...@@ -19,7 +19,9 @@ properties: ...@@ -19,7 +19,9 @@ properties:
- items: - items:
- const: atmel,at91sam9260-rtt - const: atmel,at91sam9260-rtt
- items: - items:
- const: microchip,sam9x60-rtt - enum:
- microchip,sam9x60-rtt
- microchip,sam9x7-rtt
- const: atmel,at91sam9260-rtt - const: atmel,at91sam9260-rtt
- items: - items:
- const: microchip,sama7g5-rtt - const: microchip,sama7g5-rtt
......
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/rtc/mediatek,mt2712-rtc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MediaTek MT2712 on-SoC RTC
allOf:
- $ref: rtc.yaml#
maintainers:
- Ran Bi <ran.bi@mediatek.com>
properties:
compatible:
const: mediatek,mt2712-rtc
reg:
maxItems: 1
interrupts:
maxItems: 1
required:
- reg
- interrupts
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/interrupt-controller/arm-gic.h>
rtc@10011000 {
compatible = "mediatek,mt2712-rtc";
reg = <0x10011000 0x1000>;
interrupts = <GIC_SPI 239 IRQ_TYPE_LEVEL_LOW>;
};
# SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause
%YAML 1.2
---
$id: http://devicetree.org/schemas/rtc/mediatek,mt7622-rtc.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: MediaTek MT7622 on-SoC RTC
allOf:
- $ref: rtc.yaml#
maintainers:
- Sean Wang <sean.wang@mediatek.com>
properties:
compatible:
items:
- const: mediatek,mt7622-rtc
- const: mediatek,soc-rtc
reg:
maxItems: 1
interrupts:
maxItems: 1
clocks:
maxItems: 1
clock-names:
const: rtc
required:
- reg
- interrupts
- clocks
- clock-names
unevaluatedProperties: false
examples:
- |
#include <dt-bindings/clock/mt7622-clk.h>
#include <dt-bindings/interrupt-controller/arm-gic.h>
rtc@10212800 {
compatible = "mediatek,mt7622-rtc", "mediatek,soc-rtc";
reg = <0x10212800 0x200>;
interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_LOW>;
clocks = <&topckgen CLK_TOP_RTC>;
clock-names = "rtc";
};
Device-Tree bindings for MediaTek SoC based RTC
Required properties:
- compatible : Should be "mediatek,mt2712-rtc" : for MT2712 SoC
- reg : Specifies base physical address and size of the registers;
- interrupts : Should contain the interrupt for RTC alarm;
Example:
rtc: rtc@10011000 {
compatible = "mediatek,mt2712-rtc";
reg = <0 0x10011000 0 0x1000>;
interrupts = <GIC_SPI 239 IRQ_TYPE_LEVEL_LOW>;
};
Device-Tree bindings for MediaTek SoC based RTC
Required properties:
- compatible : Should be
"mediatek,mt7622-rtc", "mediatek,soc-rtc" : for MT7622 SoC
- reg : Specifies base physical address and size of the registers;
- interrupts : Should contain the interrupt for RTC alarm;
- clocks : Specifies list of clock specifiers, corresponding to
entries in clock-names property;
- clock-names : Should contain "rtc" entries
Example:
rtc: rtc@10212800 {
compatible = "mediatek,mt7622-rtc",
"mediatek,soc-rtc";
reg = <0 0x10212800 0 0x200>;
interrupts = <GIC_SPI 129 IRQ_TYPE_LEVEL_LOW>;
clocks = <&topckgen CLK_TOP_RTC>;
clock-names = "rtc";
};
...@@ -18,7 +18,13 @@ allOf: ...@@ -18,7 +18,13 @@ allOf:
properties: properties:
compatible: compatible:
const: xlnx,zynqmp-rtc oneOf:
- const: xlnx,zynqmp-rtc
- items:
- enum:
- xlnx,versal-rtc
- xlnx,versal-net-rtc
- const: xlnx,zynqmp-rtc
reg: reg:
maxItems: 1 maxItems: 1
...@@ -48,6 +54,9 @@ properties: ...@@ -48,6 +54,9 @@ properties:
default: 0x198233 default: 0x198233
deprecated: true deprecated: true
power-domains:
maxItems: 1
required: required:
- compatible - compatible
- reg - reg
......
...@@ -2377,8 +2377,8 @@ M: Sean Wang <sean.wang@mediatek.com> ...@@ -2377,8 +2377,8 @@ M: Sean Wang <sean.wang@mediatek.com>
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers) L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
L: linux-mediatek@lists.infradead.org (moderated for non-subscribers) L: linux-mediatek@lists.infradead.org (moderated for non-subscribers)
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/rtc/rtc-mt2712.txt F: Documentation/devicetree/bindings/rtc/mediatek,mt2712-rtc.yaml
F: Documentation/devicetree/bindings/rtc/rtc-mt7622.txt F: Documentation/devicetree/bindings/rtc/mediatek,mt7622-rtc.yaml
F: drivers/rtc/rtc-mt2712.c F: drivers/rtc/rtc-mt2712.c
F: drivers/rtc/rtc-mt6397.c F: drivers/rtc/rtc-mt6397.c
F: drivers/rtc/rtc-mt7622.c F: drivers/rtc/rtc-mt7622.c
...@@ -2617,6 +2617,7 @@ F: drivers/pci/controller/dwc/pcie-qcom.c ...@@ -2617,6 +2617,7 @@ F: drivers/pci/controller/dwc/pcie-qcom.c
F: drivers/phy/qualcomm/ F: drivers/phy/qualcomm/
F: drivers/power/*/msm* F: drivers/power/*/msm*
F: drivers/reset/reset-qcom-* F: drivers/reset/reset-qcom-*
F: drivers/rtc/rtc-pm8xxx.c
F: drivers/spi/spi-geni-qcom.c F: drivers/spi/spi-geni-qcom.c
F: drivers/spi/spi-qcom-qspi.c F: drivers/spi/spi-qcom-qspi.c
F: drivers/spi/spi-qup.c F: drivers/spi/spi-qup.c
......
...@@ -1858,7 +1858,8 @@ config RTC_DRV_MT2712 ...@@ -1858,7 +1858,8 @@ config RTC_DRV_MT2712
config RTC_DRV_MT6397 config RTC_DRV_MT6397
tristate "MediaTek PMIC based RTC" tristate "MediaTek PMIC based RTC"
depends on MFD_MT6397 || (COMPILE_TEST && IRQ_DOMAIN) depends on MFD_MT6397 || COMPILE_TEST
select IRQ_DOMAIN
help help
This selects the MediaTek(R) RTC driver. RTC is part of MediaTek This selects the MediaTek(R) RTC driver. RTC is part of MediaTek
MT6397 PMIC. You should enable MT6397 PMIC MFD before select MT6397 PMIC. You should enable MT6397 PMIC MFD before select
......
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include "rtc-core.h" #include "rtc-core.h"
static DEFINE_IDA(rtc_ida); static DEFINE_IDA(rtc_ida);
struct class *rtc_class;
static void rtc_device_release(struct device *dev) static void rtc_device_release(struct device *dev)
{ {
...@@ -199,6 +198,11 @@ static SIMPLE_DEV_PM_OPS(rtc_class_dev_pm_ops, rtc_suspend, rtc_resume); ...@@ -199,6 +198,11 @@ static SIMPLE_DEV_PM_OPS(rtc_class_dev_pm_ops, rtc_suspend, rtc_resume);
#define RTC_CLASS_DEV_PM_OPS NULL #define RTC_CLASS_DEV_PM_OPS NULL
#endif #endif
const struct class rtc_class = {
.name = "rtc",
.pm = RTC_CLASS_DEV_PM_OPS,
};
/* Ensure the caller will set the id before releasing the device */ /* Ensure the caller will set the id before releasing the device */
static struct rtc_device *rtc_allocate_device(void) static struct rtc_device *rtc_allocate_device(void)
{ {
...@@ -220,7 +224,7 @@ static struct rtc_device *rtc_allocate_device(void) ...@@ -220,7 +224,7 @@ static struct rtc_device *rtc_allocate_device(void)
rtc->irq_freq = 1; rtc->irq_freq = 1;
rtc->max_user_freq = 64; rtc->max_user_freq = 64;
rtc->dev.class = rtc_class; rtc->dev.class = &rtc_class;
rtc->dev.groups = rtc_get_dev_attribute_groups(); rtc->dev.groups = rtc_get_dev_attribute_groups();
rtc->dev.release = rtc_device_release; rtc->dev.release = rtc_device_release;
...@@ -475,13 +479,14 @@ EXPORT_SYMBOL_GPL(devm_rtc_device_register); ...@@ -475,13 +479,14 @@ EXPORT_SYMBOL_GPL(devm_rtc_device_register);
static int __init rtc_init(void) static int __init rtc_init(void)
{ {
rtc_class = class_create("rtc"); int err;
if (IS_ERR(rtc_class)) {
pr_err("couldn't create class\n"); err = class_register(&rtc_class);
return PTR_ERR(rtc_class); if (err)
} return err;
rtc_class->pm = RTC_CLASS_DEV_PM_OPS;
rtc_dev_init(); rtc_dev_init();
return 0; return 0;
} }
subsys_initcall(rtc_init); subsys_initcall(rtc_init);
...@@ -696,7 +696,7 @@ struct rtc_device *rtc_class_open(const char *name) ...@@ -696,7 +696,7 @@ struct rtc_device *rtc_class_open(const char *name)
struct device *dev; struct device *dev;
struct rtc_device *rtc = NULL; struct rtc_device *rtc = NULL;
dev = class_find_device_by_name(rtc_class, name); dev = class_find_device_by_name(&rtc_class, name);
if (dev) if (dev)
rtc = to_rtc_device(dev); rtc = to_rtc_device(dev);
......
This diff is collapsed.
...@@ -909,10 +909,7 @@ static int m41t80_probe(struct i2c_client *client) ...@@ -909,10 +909,7 @@ static int m41t80_probe(struct i2c_client *client)
if (IS_ERR(m41t80_data->rtc)) if (IS_ERR(m41t80_data->rtc))
return PTR_ERR(m41t80_data->rtc); return PTR_ERR(m41t80_data->rtc);
#ifdef CONFIG_OF wakeup_source = device_property_read_bool(&client->dev, "wakeup-source");
wakeup_source = of_property_read_bool(client->dev.of_node,
"wakeup-source");
#endif
if (client->irq > 0) { if (client->irq > 0) {
unsigned long irqflags = IRQF_TRIGGER_LOW; unsigned long irqflags = IRQF_TRIGGER_LOW;
......
...@@ -204,7 +204,7 @@ static bool max31335_volatile_reg(struct device *dev, unsigned int reg) ...@@ -204,7 +204,7 @@ static bool max31335_volatile_reg(struct device *dev, unsigned int reg)
return true; return true;
/* interrupt status register */ /* interrupt status register */
if (reg == MAX31335_INT_EN1_A1IE) if (reg == MAX31335_STATUS1)
return true; return true;
/* temperature registers */ /* temperature registers */
......
...@@ -102,6 +102,8 @@ static int nct3018y_get_alarm_mode(struct i2c_client *client, unsigned char *ala ...@@ -102,6 +102,8 @@ static int nct3018y_get_alarm_mode(struct i2c_client *client, unsigned char *ala
if (flags < 0) if (flags < 0)
return flags; return flags;
*alarm_enable = flags & NCT3018Y_BIT_AIE; *alarm_enable = flags & NCT3018Y_BIT_AIE;
dev_dbg(&client->dev, "%s:alarm_enable:%x\n", __func__, *alarm_enable);
} }
if (alarm_flag) { if (alarm_flag) {
...@@ -110,11 +112,9 @@ static int nct3018y_get_alarm_mode(struct i2c_client *client, unsigned char *ala ...@@ -110,11 +112,9 @@ static int nct3018y_get_alarm_mode(struct i2c_client *client, unsigned char *ala
if (flags < 0) if (flags < 0)
return flags; return flags;
*alarm_flag = flags & NCT3018Y_BIT_AF; *alarm_flag = flags & NCT3018Y_BIT_AF;
dev_dbg(&client->dev, "%s:alarm_flag:%x\n", __func__, *alarm_flag);
} }
dev_dbg(&client->dev, "%s:alarm_enable:%x alarm_flag:%x\n",
__func__, *alarm_enable, *alarm_flag);
return 0; return 0;
} }
......
...@@ -370,6 +370,30 @@ static int pcf8523_rtc_set_offset(struct device *dev, long offset) ...@@ -370,6 +370,30 @@ static int pcf8523_rtc_set_offset(struct device *dev, long offset)
return regmap_write(pcf8523->regmap, PCF8523_REG_OFFSET, value); return regmap_write(pcf8523->regmap, PCF8523_REG_OFFSET, value);
} }
#ifdef CONFIG_PM_SLEEP
static int pcf8523_suspend(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
if (client->irq > 0 && device_may_wakeup(dev))
enable_irq_wake(client->irq);
return 0;
}
static int pcf8523_resume(struct device *dev)
{
struct i2c_client *client = to_i2c_client(dev);
if (client->irq > 0 && device_may_wakeup(dev))
disable_irq_wake(client->irq);
return 0;
}
#endif
static SIMPLE_DEV_PM_OPS(pcf8523_pm, pcf8523_suspend, pcf8523_resume);
static const struct rtc_class_ops pcf8523_rtc_ops = { static const struct rtc_class_ops pcf8523_rtc_ops = {
.read_time = pcf8523_rtc_read_time, .read_time = pcf8523_rtc_read_time,
.set_time = pcf8523_rtc_set_time, .set_time = pcf8523_rtc_set_time,
...@@ -487,6 +511,7 @@ static struct i2c_driver pcf8523_driver = { ...@@ -487,6 +511,7 @@ static struct i2c_driver pcf8523_driver = {
.driver = { .driver = {
.name = "rtc-pcf8523", .name = "rtc-pcf8523",
.of_match_table = pcf8523_of_match, .of_match_table = pcf8523_of_match,
.pm = &pcf8523_pm,
}, },
.probe = pcf8523_probe, .probe = pcf8523_probe,
.id_table = pcf8523_id, .id_table = pcf8523_id,
......
...@@ -42,7 +42,7 @@ static inline time64_t rtc_tm_sub(struct rtc_time *lhs, struct rtc_time *rhs) ...@@ -42,7 +42,7 @@ static inline time64_t rtc_tm_sub(struct rtc_time *lhs, struct rtc_time *rhs)
#include <linux/timerqueue.h> #include <linux/timerqueue.h>
#include <linux/workqueue.h> #include <linux/workqueue.h>
extern struct class *rtc_class; extern const struct class rtc_class;
/* /*
* For these RTC methods the device parameter is the physical device * For these RTC methods the device parameter is the physical device
......
...@@ -201,7 +201,7 @@ static int __init test_suspend(void) ...@@ -201,7 +201,7 @@ static int __init test_suspend(void)
} }
/* RTCs have initialized by now too ... can we use one? */ /* RTCs have initialized by now too ... can we use one? */
dev = class_find_device(rtc_class, NULL, NULL, has_wakealarm); dev = class_find_device(&rtc_class, NULL, NULL, has_wakealarm);
if (dev) { if (dev) {
rtc = rtc_class_open(dev_name(dev)); rtc = rtc_class_open(dev_name(dev));
put_device(dev); put_device(dev);
......
...@@ -134,7 +134,7 @@ static struct class_interface alarmtimer_rtc_interface = { ...@@ -134,7 +134,7 @@ static struct class_interface alarmtimer_rtc_interface = {
static int alarmtimer_rtc_interface_setup(void) static int alarmtimer_rtc_interface_setup(void)
{ {
alarmtimer_rtc_interface.class = rtc_class; alarmtimer_rtc_interface.class = &rtc_class;
return class_interface_register(&alarmtimer_rtc_interface); return class_interface_register(&alarmtimer_rtc_interface);
} }
static void alarmtimer_rtc_interface_remove(void) static void alarmtimer_rtc_interface_remove(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment