* [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm
2022-12-26 2:39 [PATCH v2 0/4] Add nxp bbnsm module support Jacky Bai
@ 2022-12-26 2:39 ` Jacky Bai
2022-12-26 21:55 ` Rob Herring
2022-12-26 2:39 ` [PATCH v2 2/4] input: bbnsm_pwrkey: Add bbnsm power key support Jacky Bai
` (2 subsequent siblings)
3 siblings, 1 reply; 9+ messages in thread
From: Jacky Bai @ 2022-12-26 2:39 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, shawnguo, s.hauer,
dmitry.torokhov, a.zummo, alexandre.belloni
Cc: devicetree, linux-arm-kernel, linux-input, linux-rtc, kernel,
linux-imx, festevam
Add binding for NXP BBNSM(Battery-Backed Non-Secure Module).
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
---
- v2 changes:
- remove the redundant 'bindings' string
- add ref to rtc.yaml
- add start-year property
- rename 'regmap' to 'nxp,bbnsm-regmap' and add description & type define
- add header files including in the example and correct the indentation
---
.../devicetree/bindings/mfd/nxp,bbnsm.yaml | 113 ++++++++++++++++++
1 file changed, 113 insertions(+)
create mode 100644 Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
diff --git a/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml b/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
new file mode 100644
index 000000000000..8d213bce9119
--- /dev/null
+++ b/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
@@ -0,0 +1,113 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/mfd/nxp,bbnsm.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP Battery-Backed Non-Secure Module
+
+maintainers:
+ - Jacky Bai <ping.bai@nxp.com>
+
+description: |
+ NXP BBNSM serves as non-volatile logic and storage for the system.
+ it Intergrates RTC & ON/OFF control.
+ The RTC can retain its state and continues counting even when the
+ main chip is power down. A time alarm is generated once the most
+ significant 32 bits of the real-time counter match the value in the
+ Time Alarm register.
+ The ON/OFF logic inside the BBNSM allows for connecting directly to
+ a PMIC or other voltage regulator device. both smart PMIC mode and
+ Dumb PMIC mode supported.
+
+properties:
+ compatible:
+ items:
+ - enum:
+ - nxp,bbnsm
+ - const: syscon
+ - const: simple-mfd
+
+ reg:
+ maxItems: 1
+
+ rtc:
+ type: object
+ $ref: /schemas/rtc/rtc.yaml#
+
+ properties:
+ compatible:
+ const: nxp,bbnsm-rtc
+
+ nxp,bbnsm-regmap:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ phandle of the bbnsm node
+
+ interrupts:
+ maxItems: 1
+
+ start-year: true
+
+ required:
+ - compatible
+ - nxp,bbnsm-regmap
+ - interrupts
+
+ additionalProperties: false
+
+ pwrkey:
+ type: object
+ $ref: /schemas/input/input.yaml#
+
+ properties:
+ compatible:
+ const: nxp,bbnsm-pwrkey
+
+ nxp,bbnsm-regmap:
+ $ref: /schemas/types.yaml#/definitions/phandle
+ description:
+ phandle of the bbnsm node
+
+ interrupts:
+ maxItems: 1
+
+ linux,code: true
+
+ required:
+ - compatible
+ - nxp,bbnsm-regmap
+ - interrupts
+
+ additionalProperties: false
+
+required:
+ - compatible
+ - reg
+ - rtc
+ - pwrkey
+
+additionalProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/input/linux-event-codes.h>
+ #include <dt-bindings/interrupt-controller/arm-gic.h>
+
+ bbnsm: bbnsm@44440000 {
+ compatible = "nxp,bbnsm", "syscon", "simple-mfd";
+ reg = <0x44440000 0x10000>;
+
+ bbnsm_rtc: rtc {
+ compatible = "nxp,bbnsm-rtc";
+ nxp,bbnsm-regmap = <&bbnsm>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ bbnsm_pwrkey: pwrkey {
+ compatible = "nxp,bbnsm-pwrkey";
+ nxp,bbnsm-regmap = <&bbnsm>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ linux,code = <KEY_POWER>;
+ };
+ };
--
2.37.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm
2022-12-26 2:39 ` [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm Jacky Bai
@ 2022-12-26 21:55 ` Rob Herring
2022-12-27 1:54 ` Jacky Bai
0 siblings, 1 reply; 9+ messages in thread
From: Rob Herring @ 2022-12-26 21:55 UTC (permalink / raw)
To: Jacky Bai
Cc: lee, krzysztof.kozlowski+dt, shawnguo, s.hauer, dmitry.torokhov,
a.zummo, alexandre.belloni, devicetree, linux-arm-kernel,
linux-input, linux-rtc, kernel, linux-imx, festevam
On Mon, Dec 26, 2022 at 10:39:39AM +0800, Jacky Bai wrote:
> Add binding for NXP BBNSM(Battery-Backed Non-Secure Module).
>
> Signed-off-by: Jacky Bai <ping.bai@nxp.com>
> ---
> - v2 changes:
> - remove the redundant 'bindings' string
> - add ref to rtc.yaml
> - add start-year property
> - rename 'regmap' to 'nxp,bbnsm-regmap' and add description & type define
> - add header files including in the example and correct the indentation
> ---
> .../devicetree/bindings/mfd/nxp,bbnsm.yaml | 113 ++++++++++++++++++
> 1 file changed, 113 insertions(+)
> create mode 100644 Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
>
> diff --git a/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml b/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
> new file mode 100644
> index 000000000000..8d213bce9119
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/mfd/nxp,bbnsm.yaml
> @@ -0,0 +1,113 @@
> +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
> +%YAML 1.2
> +---
> +$id: http://devicetree.org/schemas/mfd/nxp,bbnsm.yaml#
> +$schema: http://devicetree.org/meta-schemas/core.yaml#
> +
> +title: NXP Battery-Backed Non-Secure Module
> +
> +maintainers:
> + - Jacky Bai <ping.bai@nxp.com>
> +
> +description: |
> + NXP BBNSM serves as non-volatile logic and storage for the system.
> + it Intergrates RTC & ON/OFF control.
> + The RTC can retain its state and continues counting even when the
> + main chip is power down. A time alarm is generated once the most
> + significant 32 bits of the real-time counter match the value in the
> + Time Alarm register.
> + The ON/OFF logic inside the BBNSM allows for connecting directly to
> + a PMIC or other voltage regulator device. both smart PMIC mode and
> + Dumb PMIC mode supported.
> +
> +properties:
> + compatible:
> + items:
> + - enum:
> + - nxp,bbnsm
> + - const: syscon
> + - const: simple-mfd
> +
> + reg:
> + maxItems: 1
> +
> + rtc:
> + type: object
> + $ref: /schemas/rtc/rtc.yaml#
> +
> + properties:
> + compatible:
> + const: nxp,bbnsm-rtc
> +
> + nxp,bbnsm-regmap:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description:
> + phandle of the bbnsm node
You don't need this now, it's the parent node.
> +
> + interrupts:
> + maxItems: 1
> +
> + start-year: true
> +
> + required:
> + - compatible
> + - nxp,bbnsm-regmap
> + - interrupts
> +
> + additionalProperties: false
> +
> + pwrkey:
> + type: object
> + $ref: /schemas/input/input.yaml#
> +
> + properties:
> + compatible:
> + const: nxp,bbnsm-pwrkey
> +
> + nxp,bbnsm-regmap:
> + $ref: /schemas/types.yaml#/definitions/phandle
> + description:
> + phandle of the bbnsm node
Same here.
> +
> + interrupts:
> + maxItems: 1
> +
> + linux,code: true
> +
> + required:
> + - compatible
> + - nxp,bbnsm-regmap
> + - interrupts
> +
> + additionalProperties: false
> +
> +required:
> + - compatible
> + - reg
> + - rtc
> + - pwrkey
> +
> +additionalProperties: false
> +
> +examples:
> + - |
> + #include <dt-bindings/input/linux-event-codes.h>
> + #include <dt-bindings/interrupt-controller/arm-gic.h>
> +
> + bbnsm: bbnsm@44440000 {
> + compatible = "nxp,bbnsm", "syscon", "simple-mfd";
> + reg = <0x44440000 0x10000>;
> +
> + bbnsm_rtc: rtc {
> + compatible = "nxp,bbnsm-rtc";
> + nxp,bbnsm-regmap = <&bbnsm>;
> + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
> + };
> +
> + bbnsm_pwrkey: pwrkey {
> + compatible = "nxp,bbnsm-pwrkey";
> + nxp,bbnsm-regmap = <&bbnsm>;
> + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
> + linux,code = <KEY_POWER>;
> + };
> + };
> --
> 2.37.1
>
>
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm
2022-12-26 21:55 ` Rob Herring
@ 2022-12-27 1:54 ` Jacky Bai
0 siblings, 0 replies; 9+ messages in thread
From: Jacky Bai @ 2022-12-27 1:54 UTC (permalink / raw)
To: Rob Herring
Cc: lee@kernel.org, krzysztof.kozlowski+dt@linaro.org,
shawnguo@kernel.org, s.hauer@pengutronix.de,
dmitry.torokhov@gmail.com, a.zummo@towertech.it,
alexandre.belloni@bootlin.com, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-input@vger.kernel.org,
linux-rtc@vger.kernel.org, kernel@pengutronix.de, dl-linux-imx,
festevam@gmail.com
Hi Rob,
> Subject: Re: [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm
>
> On Mon, Dec 26, 2022 at 10:39:39AM +0800, Jacky Bai wrote:
> > Add binding for NXP BBNSM(Battery-Backed Non-Secure Module).
> >
> > Signed-off-by: Jacky Bai <ping.bai@nxp.com>
> > ---
> > - v2 changes:
> > - remove the redundant 'bindings' string
> > - add ref to rtc.yaml
> > - add start-year property
> > - rename 'regmap' to 'nxp,bbnsm-regmap' and add description & type
> define
> > - add header files including in the example and correct the
> > indentation
> > ---
> > +
> > + nxp,bbnsm-regmap:
> > + $ref: /schemas/types.yaml#/definitions/phandle
> > + description:
> > + phandle of the bbnsm node
>
> You don't need this now, it's the parent node.
Thx for review. yes, it is redundant, will remove it and refine the code in V3.
BR
>
> > +
> > + interrupts:
> > + maxItems: 1
> > +
> > + start-year: true
> > +
> > + required:
> > + - compatible
> > + - nxp,bbnsm-regmap
> > + - interrupts
> > +
> > + additionalProperties: false
> > +
> > + pwrkey:
> > + type: object
> > + $ref: /schemas/input/input.yaml#
> > +
> > + properties:
> > + compatible:
> > + const: nxp,bbnsm-pwrkey
> > +
> > + nxp,bbnsm-regmap:
> > + $ref: /schemas/types.yaml#/definitions/phandle
> > + description:
> > + phandle of the bbnsm node
>
> Same here.
>
> > +
> > + interrupts:
> > + maxItems: 1
> > +
> > + linux,code: true
> > +
> > + required:
> > + - compatible
> > + - nxp,bbnsm-regmap
> > + - interrupts
> > +
> > + additionalProperties: false
> > +
> > +required:
> > + - compatible
> > + - reg
> > + - rtc
> > + - pwrkey
> > +
> > +additionalProperties: false
> > +
> > +examples:
> > + - |
> > + #include <dt-bindings/input/linux-event-codes.h>
> > + #include <dt-bindings/interrupt-controller/arm-gic.h>
> > +
> > + bbnsm: bbnsm@44440000 {
> > + compatible = "nxp,bbnsm", "syscon", "simple-mfd";
> > + reg = <0x44440000 0x10000>;
> > +
> > + bbnsm_rtc: rtc {
> > + compatible = "nxp,bbnsm-rtc";
> > + nxp,bbnsm-regmap = <&bbnsm>;
> > + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
> > + };
> > +
> > + bbnsm_pwrkey: pwrkey {
> > + compatible = "nxp,bbnsm-pwrkey";
> > + nxp,bbnsm-regmap = <&bbnsm>;
> > + interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
> > + linux,code = <KEY_POWER>;
> > + };
> > + };
> > --
> > 2.37.1
> >
> >
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 2/4] input: bbnsm_pwrkey: Add bbnsm power key support
2022-12-26 2:39 [PATCH v2 0/4] Add nxp bbnsm module support Jacky Bai
2022-12-26 2:39 ` [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm Jacky Bai
@ 2022-12-26 2:39 ` Jacky Bai
2022-12-26 2:39 ` [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support Jacky Bai
2022-12-26 2:39 ` [PATCH v2 4/4] arm64: dts: imx93: Add the bbnsm dts node Jacky Bai
3 siblings, 0 replies; 9+ messages in thread
From: Jacky Bai @ 2022-12-26 2:39 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, shawnguo, s.hauer,
dmitry.torokhov, a.zummo, alexandre.belloni
Cc: devicetree, linux-arm-kernel, linux-input, linux-rtc, kernel,
linux-imx, festevam
The ON/OFF logic inside the BBNSM allows for connecting directly
into a PMIC or other voltage regulator device. The module has an
button input signal and a wakeup request input signal. It also
has two interrupts (set_pwr_off_irq and set_pwr_on_irq) and an
active-low PMIC enable (pmic_en_b) output.
Add the power key support for the ON/OFF button function found in
BBNSM module.
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
---
- v2 changes:
- use device_property_read_u32() to read the property
- clean up the goto return, return directly
- sort the header file alphabetically
- rename the file to add 'nxp' prefix
---
drivers/input/keyboard/Kconfig | 11 ++
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/nxp-bbnsm-pwrkey.c | 190 ++++++++++++++++++++++
3 files changed, 202 insertions(+)
create mode 100644 drivers/input/keyboard/nxp-bbnsm-pwrkey.c
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 00292118b79b..8efcd95492b3 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -456,6 +456,17 @@ config KEYBOARD_SNVS_PWRKEY
To compile this driver as a module, choose M here; the
module will be called snvs_pwrkey.
+config KEYBOARD_BBNSM_PWRKEY
+ tristate "NXP BBNSM Power Key Driver"
+ depends on ARCH_MXC || COMPILE_TEST
+ depends on OF
+ help
+ This is the bbnsm powerkey driver for the NXP i.MX application
+ processors.
+
+ To compile this driver as a module, choose M here; the
+ module will be called bbnsm_pwrkey.
+
config KEYBOARD_IMX
tristate "IMX keypad support"
depends on ARCH_MXC || COMPILE_TEST
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 5f67196bb2c1..e34dd65a34c3 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -13,6 +13,7 @@ obj-$(CONFIG_KEYBOARD_AMIGA) += amikbd.o
obj-$(CONFIG_KEYBOARD_APPLESPI) += applespi.o
obj-$(CONFIG_KEYBOARD_ATARI) += atakbd.o
obj-$(CONFIG_KEYBOARD_ATKBD) += atkbd.o
+obj-$(CONFIG_KEYBOARD_BBNSM_PWRKEY) += nxp-bbnsm-pwrkey.o
obj-$(CONFIG_KEYBOARD_BCM) += bcm-keypad.o
obj-$(CONFIG_KEYBOARD_CAP11XX) += cap11xx.o
obj-$(CONFIG_KEYBOARD_CLPS711X) += clps711x-keypad.o
diff --git a/drivers/input/keyboard/nxp-bbnsm-pwrkey.c b/drivers/input/keyboard/nxp-bbnsm-pwrkey.c
new file mode 100644
index 000000000000..2aaf44f9354b
--- /dev/null
+++ b/drivers/input/keyboard/nxp-bbnsm-pwrkey.c
@@ -0,0 +1,190 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2022 NXP.
+
+#include <linux/device.h>
+#include <linux/err.h>
+#include <linux/init.h>
+#include <linux/input.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/jiffies.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/platform_device.h>
+#include <linux/pm_wakeirq.h>
+#include <linux/regmap.h>
+
+#define BBNSM_CTRL 0x8
+#define BBNSM_INT_EN 0x10
+#define BBNSM_EVENTS 0x14
+#define BBNSM_PAD_CTRL 0x24
+
+#define BBNSM_BTN_PRESSED BIT(7)
+#define BBNSM_PWR_ON BIT(6)
+#define BBNSM_BTN_OFF BIT(5)
+#define BBNSM_EMG_OFF BIT(4)
+#define BBNSM_PWRKEY_EVENTS (BBNSM_PWR_ON | BBNSM_BTN_OFF | BBNSM_EMG_OFF)
+#define BBNSM_DP_EN BIT(24)
+
+#define DEBOUNCE_TIME 30
+#define REPEAT_INTERVAL 60
+
+struct bbnsm_pwrkey {
+ struct regmap *regmap;
+ int irq;
+ int keycode;
+ int keystate; /* 1:pressed */
+ struct timer_list check_timer;
+ struct input_dev *input;
+};
+
+static void bbnsm_pwrkey_check_for_events(struct timer_list *t)
+{
+ struct bbnsm_pwrkey *bbnsm = from_timer(bbnsm, t, check_timer);
+ struct input_dev *input = bbnsm->input;
+ u32 state;
+
+ regmap_read(bbnsm->regmap, BBNSM_EVENTS, &state);
+
+ state = state & BBNSM_BTN_PRESSED ? 1 : 0;
+
+ /* only report new event if status changed */
+ if (state ^ bbnsm->keystate) {
+ bbnsm->keystate = state;
+ input_event(input, EV_KEY, bbnsm->keycode, state);
+ input_sync(input);
+ pm_relax(bbnsm->input->dev.parent);
+ }
+
+ /* repeat check if pressed long */
+ if (state) {
+ mod_timer(&bbnsm->check_timer,
+ jiffies + msecs_to_jiffies(REPEAT_INTERVAL));
+ }
+}
+
+static irqreturn_t bbnsm_pwrkey_interrupt(int irq, void *dev_id)
+{
+ struct platform_device *pdev = dev_id;
+ struct bbnsm_pwrkey *bbnsm = platform_get_drvdata(pdev);
+ struct input_dev *input = bbnsm->input;
+ u32 event;
+
+ regmap_read(bbnsm->regmap, BBNSM_EVENTS, &event);
+ if (event & BBNSM_BTN_OFF)
+ mod_timer(&bbnsm->check_timer, jiffies + msecs_to_jiffies(DEBOUNCE_TIME));
+ else
+ return IRQ_NONE;
+
+ pm_wakeup_event(input->dev.parent, 0);
+
+ /* clear PWR OFF */
+ regmap_write(bbnsm->regmap, BBNSM_EVENTS, BBNSM_BTN_OFF);
+
+ return IRQ_HANDLED;
+}
+
+static void bbnsm_pwrkey_act(void *pdata)
+{
+ struct bbnsm_pwrkey *bbnsm = pdata;
+
+ del_timer_sync(&bbnsm->check_timer);
+}
+
+static int bbnsm_pwrkey_probe(struct platform_device *pdev)
+{
+ struct bbnsm_pwrkey *bbnsm;
+ struct input_dev *input;
+ struct device_node *np = pdev->dev.of_node;
+ int error;
+
+ bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL);
+ if (!bbnsm)
+ return -ENOMEM;
+
+ bbnsm->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "nxp,bbnsm-regmap");
+ if (IS_ERR(bbnsm->regmap)) {
+ dev_err(&pdev->dev, "bbnsm pwerkey get regmap failed\n");
+ return PTR_ERR(bbnsm->regmap);
+ }
+
+ if (of_property_read_u32(np, "linux,code", &bbnsm->keycode)) {
+ bbnsm->keycode = KEY_POWER;
+ dev_warn(&pdev->dev, "KEY_POWER without setting in dts\n");
+ }
+
+ bbnsm->irq = platform_get_irq(pdev, 0);
+ if (bbnsm->irq < 0)
+ return -EINVAL;
+
+ /* config the BBNSM power related register */
+ regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, BBNSM_DP_EN, BBNSM_DP_EN);
+
+ /* clear the unexpected interrupt before driver ready */
+ regmap_write_bits(bbnsm->regmap, BBNSM_EVENTS, BBNSM_PWRKEY_EVENTS, BBNSM_PWRKEY_EVENTS);
+
+ timer_setup(&bbnsm->check_timer, bbnsm_pwrkey_check_for_events, 0);
+
+ input = devm_input_allocate_device(&pdev->dev);
+ if (!input) {
+ dev_err(&pdev->dev, "failed to allocate the input device\n");
+ return -ENOMEM;
+ }
+
+ input->name = pdev->name;
+ input->phys = "bbnsm-pwrkey/input0";
+ input->id.bustype = BUS_HOST;
+
+ input_set_capability(input, EV_KEY, bbnsm->keycode);
+
+ /* input customer action to cancel release timer */
+ error = devm_add_action(&pdev->dev, bbnsm_pwrkey_act, bbnsm);
+ if (error) {
+ dev_err(&pdev->dev, "failed to register remove action\n");
+ return error;
+ }
+
+ bbnsm->input = input;
+ platform_set_drvdata(pdev, bbnsm);
+
+ error = devm_request_irq(&pdev->dev, bbnsm->irq, bbnsm_pwrkey_interrupt,
+ IRQF_SHARED, pdev->name, pdev);
+ if (error) {
+ dev_err(&pdev->dev, "interrupt not available.\n");
+ return error;
+ }
+
+ error = input_register_device(input);
+ if (error < 0) {
+ dev_err(&pdev->dev, "failed to register input device\n");
+ return error;
+ }
+
+ device_init_wakeup(&pdev->dev, true);
+ dev_pm_set_wake_irq(&pdev->dev, bbnsm->irq);
+
+ return 0;
+}
+
+static const struct of_device_id bbnsm_pwrkey_ids[] = {
+ { .compatible = "nxp,bbnsm-pwrkey" },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, bbnsm_pwrkey_ids);
+
+static struct platform_driver bbnsm_pwrkey_driver = {
+ .driver = {
+ .name = "bbnsm_pwrkey",
+ .of_match_table = bbnsm_pwrkey_ids,
+ },
+ .probe = bbnsm_pwrkey_probe,
+};
+module_platform_driver(bbnsm_pwrkey_driver);
+
+MODULE_AUTHOR("Jacky Bai <ping.bai@nxp.com>");
+MODULE_DESCRIPTION("NXP bbnsm power key Driver");
+MODULE_LICENSE("GPL");
--
2.37.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support
2022-12-26 2:39 [PATCH v2 0/4] Add nxp bbnsm module support Jacky Bai
2022-12-26 2:39 ` [PATCH v2 1/4] dt-bindings: mfd: Add nxp bbnsm Jacky Bai
2022-12-26 2:39 ` [PATCH v2 2/4] input: bbnsm_pwrkey: Add bbnsm power key support Jacky Bai
@ 2022-12-26 2:39 ` Jacky Bai
2022-12-28 11:16 ` Alexandre Belloni
2022-12-26 2:39 ` [PATCH v2 4/4] arm64: dts: imx93: Add the bbnsm dts node Jacky Bai
3 siblings, 1 reply; 9+ messages in thread
From: Jacky Bai @ 2022-12-26 2:39 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, shawnguo, s.hauer,
dmitry.torokhov, a.zummo, alexandre.belloni
Cc: devicetree, linux-arm-kernel, linux-input, linux-rtc, kernel,
linux-imx, festevam
The BBNSM module includes a real time counter with alarm.
Add a RTC driver for this function.
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
Reviewed-by: Peng Fan <peng.fan@nxp.com>
---
- v2 changes:
- sort the header file alphabetically
- rename the file to add 'nxp' prefix
- refine bbnsm_rtc_irq_handler function, remove the unnecessary
event variable
- add rtc enable check in .read_time, remove rtc enable in probe function
- remove unnecessary dev_err log in probe function
---
drivers/rtc/Kconfig | 12 ++
drivers/rtc/Makefile | 1 +
drivers/rtc/rtc-nxp-bbnsm.c | 225 ++++++++++++++++++++++++++++++++++++
3 files changed, 238 insertions(+)
create mode 100644 drivers/rtc/rtc-nxp-bbnsm.c
diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig
index ab9a1f814119..0c8534a49c78 100644
--- a/drivers/rtc/Kconfig
+++ b/drivers/rtc/Kconfig
@@ -1786,6 +1786,18 @@ config RTC_DRV_SNVS
This driver can also be built as a module, if so, the module
will be called "rtc-snvs".
+config RTC_DRV_BBNSM
+ tristate "NXP BBNSM RTC support"
+ select REGMAP_MMIO
+ depends on ARCH_MXC || COMPILE_TEST
+ depends on HAS_IOMEM
+ depends on OF
+ help
+ If you say yes here you get support for the NXP BBNSM RTC module.
+
+ This driver can also be built as a module, if so, the module
+ will be called "rtc-bbnsm".
+
config RTC_DRV_IMX_SC
depends on IMX_SCU
depends on HAVE_ARM_SMCCC
diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile
index d3c042dcbc73..0f11027a7388 100644
--- a/drivers/rtc/Makefile
+++ b/drivers/rtc/Makefile
@@ -33,6 +33,7 @@ obj-$(CONFIG_RTC_DRV_ASPEED) += rtc-aspeed.o
obj-$(CONFIG_RTC_DRV_AT91RM9200)+= rtc-at91rm9200.o
obj-$(CONFIG_RTC_DRV_AT91SAM9) += rtc-at91sam9.o
obj-$(CONFIG_RTC_DRV_AU1XXX) += rtc-au1xxx.o
+obj-$(CONFIG_RTC_DRV_BBNSM) += rtc-nxp-bbnsm.o
obj-$(CONFIG_RTC_DRV_BD70528) += rtc-bd70528.o
obj-$(CONFIG_RTC_DRV_BQ32K) += rtc-bq32k.o
obj-$(CONFIG_RTC_DRV_BQ4802) += rtc-bq4802.o
diff --git a/drivers/rtc/rtc-nxp-bbnsm.c b/drivers/rtc/rtc-nxp-bbnsm.c
new file mode 100644
index 000000000000..4704a7901341
--- /dev/null
+++ b/drivers/rtc/rtc-nxp-bbnsm.c
@@ -0,0 +1,225 @@
+// SPDX-License-Identifier: GPL-2.0+
+//
+// Copyright 2022 NXP.
+
+#include <linux/init.h>
+#include <linux/io.h>
+#include <linux/kernel.h>
+#include <linux/mfd/syscon.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/platform_device.h>
+#include <linux/pm_wakeirq.h>
+#include <linux/regmap.h>
+#include <linux/rtc.h>
+
+#define BBNSM_CTRL 0x8
+#define BBNSM_INT_EN 0x10
+#define BBNSM_EVENTS 0x14
+#define BBNSM_RTC_LS 0x40
+#define BBNSM_RTC_MS 0x44
+#define BBNSM_TA 0x50
+
+#define RTC_EN 0x2
+#define RTC_EN_MSK 0x3
+#define TA_EN (0x2 << 2)
+#define TA_DIS (0x1 << 2)
+#define TA_EN_MSK (0x3 << 2)
+#define RTC_INT_EN 0x2
+#define TA_INT_EN (0x2 << 2)
+
+#define BBNSM_EVENT_TA (0x2 << 2)
+
+#define CNTR_TO_SECS_SH 15
+
+struct bbnsm_rtc {
+ struct rtc_device *rtc;
+ struct regmap *regmap;
+ int irq;
+ struct clk *clk;
+};
+
+static u32 bbnsm_read_counter(struct bbnsm_rtc *bbnsm)
+{
+ u32 rtc_msb, rtc_lsb;
+ unsigned int timeout = 100;
+ u32 time;
+ u32 tmp = 0;
+
+ do {
+ time = tmp;
+ /* read the msb */
+ regmap_read(bbnsm->regmap, BBNSM_RTC_MS, &rtc_msb);
+ /* read the lsb */
+ regmap_read(bbnsm->regmap, BBNSM_RTC_LS, &rtc_lsb);
+ /* convert to seconds */
+ tmp = (rtc_msb << 17) | (rtc_lsb >> 15);
+ } while (tmp != time && --timeout);
+
+ return time;
+}
+
+static int bbnsm_rtc_read_time(struct device *dev, struct rtc_time *tm)
+{
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+ unsigned long time;
+ u32 val;
+
+ regmap_read(bbnsm->regmap, BBNSM_CTRL, &val);
+ if ((val & RTC_EN_MSK) != RTC_EN) {
+ dev_warn(dev, "RTC is not enabled, time is invalid!\n");
+ return -EINVAL;
+ }
+
+ time = bbnsm_read_counter(bbnsm);
+ rtc_time64_to_tm(time, tm);
+
+ return 0;
+}
+
+static int bbnsm_rtc_set_time(struct device *dev, struct rtc_time *tm)
+{
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+ unsigned long time = rtc_tm_to_time64(tm);
+
+ /* disable the RTC first */
+ regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, RTC_EN_MSK, 0);
+
+ /* write the 32bit sec time to 47 bit timer counter, leaving 15 LSBs blank */
+ regmap_write(bbnsm->regmap, BBNSM_RTC_LS, time << CNTR_TO_SECS_SH);
+ regmap_write(bbnsm->regmap, BBNSM_RTC_MS, time >> (32 - CNTR_TO_SECS_SH));
+
+ /* Enable the RTC again */
+ regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, RTC_EN_MSK, RTC_EN);
+
+ return 0;
+}
+
+static int bbnsm_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+ u32 bbnsm_events, bbnsm_ta;
+
+ regmap_read(bbnsm->regmap, BBNSM_TA, &bbnsm_ta);
+ rtc_time64_to_tm(bbnsm_ta, &alrm->time);
+
+ regmap_read(bbnsm->regmap, BBNSM_EVENTS, &bbnsm_events);
+ alrm->pending = (bbnsm_events & BBNSM_EVENT_TA) ? 1 : 0;
+
+ return 0;
+}
+
+static int bbnsm_rtc_alarm_irq_enable(struct device *dev, unsigned int enable)
+{
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+
+ /* enable the alarm event */
+ regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, TA_EN_MSK, enable ? TA_EN : TA_DIS);
+ /* enable the alarm interrupt */
+ regmap_update_bits(bbnsm->regmap, BBNSM_INT_EN, TA_EN_MSK, enable ? TA_EN : TA_DIS);
+
+ return 0;
+}
+
+static int bbnsm_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
+{
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+ unsigned long time = rtc_tm_to_time64(&alrm->time);
+
+ /* disable the alarm */
+ regmap_update_bits(bbnsm->regmap, BBNSM_CTRL, TA_EN, TA_EN);
+
+ /* write the seconds to TA */
+ regmap_write(bbnsm->regmap, BBNSM_TA, time);
+
+ return bbnsm_rtc_alarm_irq_enable(dev, alrm->enabled);
+}
+
+static const struct rtc_class_ops bbnsm_rtc_ops = {
+ .read_time = bbnsm_rtc_read_time,
+ .set_time = bbnsm_rtc_set_time,
+ .read_alarm = bbnsm_rtc_read_alarm,
+ .set_alarm = bbnsm_rtc_set_alarm,
+ .alarm_irq_enable = bbnsm_rtc_alarm_irq_enable,
+};
+
+static irqreturn_t bbnsm_rtc_irq_handler(int irq, void *dev_id)
+{
+ struct device *dev = dev_id;
+ struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
+ u32 val;
+
+ regmap_read(bbnsm->regmap, BBNSM_EVENTS, &val);
+ if (val & BBNSM_EVENT_TA) {
+ bbnsm_rtc_alarm_irq_enable(dev, false);
+ /* clear the alarm event */
+ regmap_write_bits(bbnsm->regmap, BBNSM_EVENTS, TA_EN_MSK, BBNSM_EVENT_TA);
+ rtc_update_irq(bbnsm->rtc, 1, RTC_AF | RTC_IRQF);
+
+ return IRQ_HANDLED;
+ }
+
+ return IRQ_NONE;
+}
+
+static int bbnsm_rtc_probe(struct platform_device *pdev)
+{
+ struct bbnsm_rtc *bbnsm;
+ int ret;
+
+ bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL);
+ if (!bbnsm)
+ return -ENOMEM;
+
+ bbnsm->rtc = devm_rtc_allocate_device(&pdev->dev);
+
+ bbnsm->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "nxp,bbnsm-regmap");
+ if (IS_ERR(bbnsm->regmap)) {
+ dev_err(&pdev->dev, "bbnsm get regmap failed\n");
+ return PTR_ERR(bbnsm->regmap);
+ }
+
+ bbnsm->irq = platform_get_irq(pdev, 0);
+ if (bbnsm->irq < 0)
+ return bbnsm->irq;
+
+ platform_set_drvdata(pdev, bbnsm);
+
+ /* clear all the pending events */
+ regmap_write(bbnsm->regmap, BBNSM_EVENTS, 0x7A);
+
+ device_init_wakeup(&pdev->dev, true);
+ dev_pm_set_wake_irq(&pdev->dev, bbnsm->irq);
+
+ ret = devm_request_irq(&pdev->dev, bbnsm->irq, bbnsm_rtc_irq_handler,
+ IRQF_SHARED, "rtc alarm", &pdev->dev);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to request irq %d: %d\n",
+ bbnsm->irq, ret);
+ return ret;
+ }
+
+ bbnsm->rtc->ops = &bbnsm_rtc_ops;
+ bbnsm->rtc->range_max = U32_MAX;
+
+ return devm_rtc_register_device(bbnsm->rtc);
+}
+
+static const struct of_device_id bbnsm_dt_ids[] = {
+ { .compatible = "nxp,bbnsm-rtc", },
+ { /* sentinel */ },
+};
+MODULE_DEVICE_TABLE(of, bbnsm_dt_ids);
+
+static struct platform_driver bbnsm_rtc_driver = {
+ .driver = {
+ .name = "bbnsm_rtc",
+ .of_match_table = bbnsm_dt_ids,
+ },
+ .probe = bbnsm_rtc_probe,
+};
+module_platform_driver(bbnsm_rtc_driver);
+
+MODULE_AUTHOR("Jacky Bai <ping.bai@nxp.com>");
+MODULE_DESCRIPTION("NXP BBNSM RTC Driver");
+MODULE_LICENSE("GPL");
--
2.37.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support
2022-12-26 2:39 ` [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support Jacky Bai
@ 2022-12-28 11:16 ` Alexandre Belloni
2023-01-03 1:23 ` Jacky Bai
0 siblings, 1 reply; 9+ messages in thread
From: Alexandre Belloni @ 2022-12-28 11:16 UTC (permalink / raw)
To: Jacky Bai
Cc: lee, robh+dt, krzysztof.kozlowski+dt, shawnguo, s.hauer,
dmitry.torokhov, a.zummo, devicetree, linux-arm-kernel,
linux-input, linux-rtc, kernel, linux-imx, festevam
On 26/12/2022 10:39:41+0800, Jacky Bai wrote:
> +static int bbnsm_rtc_read_time(struct device *dev, struct rtc_time *tm)
> +{
> + struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
> + unsigned long time;
> + u32 val;
> +
> + regmap_read(bbnsm->regmap, BBNSM_CTRL, &val);
> + if ((val & RTC_EN_MSK) != RTC_EN) {
> + dev_warn(dev, "RTC is not enabled, time is invalid!\n");
I don't think this message is necessary.
> + return -EINVAL;
> + }
> +
> + time = bbnsm_read_counter(bbnsm);
> + rtc_time64_to_tm(time, tm);
> +
> + return 0;
> +}
> +
[...]
> +static int bbnsm_rtc_probe(struct platform_device *pdev)
> +{
> + struct bbnsm_rtc *bbnsm;
> + int ret;
> +
> + bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL);
> + if (!bbnsm)
> + return -ENOMEM;
> +
> + bbnsm->rtc = devm_rtc_allocate_device(&pdev->dev);
> +
> + bbnsm->regmap = syscon_regmap_lookup_by_phandle(pdev->dev.of_node, "nxp,bbnsm-regmap");
> + if (IS_ERR(bbnsm->regmap)) {
> + dev_err(&pdev->dev, "bbnsm get regmap failed\n");
Maybe this should be a dev_dbg?
> + return PTR_ERR(bbnsm->regmap);
> + }
> +
> + bbnsm->irq = platform_get_irq(pdev, 0);
> + if (bbnsm->irq < 0)
> + return bbnsm->irq;
> +
> + platform_set_drvdata(pdev, bbnsm);
> +
> + /* clear all the pending events */
> + regmap_write(bbnsm->regmap, BBNSM_EVENTS, 0x7A);
> +
> + device_init_wakeup(&pdev->dev, true);
> + dev_pm_set_wake_irq(&pdev->dev, bbnsm->irq);
> +
> + ret = devm_request_irq(&pdev->dev, bbnsm->irq, bbnsm_rtc_irq_handler,
> + IRQF_SHARED, "rtc alarm", &pdev->dev);
> + if (ret) {
> + dev_err(&pdev->dev, "failed to request irq %d: %d\n",
> + bbnsm->irq, ret);
> + return ret;
> + }
> +
> + bbnsm->rtc->ops = &bbnsm_rtc_ops;
> + bbnsm->rtc->range_max = U32_MAX;
> +
> + return devm_rtc_register_device(bbnsm->rtc);
> +}
> +
> +static const struct of_device_id bbnsm_dt_ids[] = {
> + { .compatible = "nxp,bbnsm-rtc", },
> + { /* sentinel */ },
> +};
> +MODULE_DEVICE_TABLE(of, bbnsm_dt_ids);
> +
> +static struct platform_driver bbnsm_rtc_driver = {
> + .driver = {
> + .name = "bbnsm_rtc",
> + .of_match_table = bbnsm_dt_ids,
> + },
> + .probe = bbnsm_rtc_probe,
> +};
> +module_platform_driver(bbnsm_rtc_driver);
> +
> +MODULE_AUTHOR("Jacky Bai <ping.bai@nxp.com>");
> +MODULE_DESCRIPTION("NXP BBNSM RTC Driver");
> +MODULE_LICENSE("GPL");
> --
> 2.37.1
>
--
Alexandre Belloni, co-owner and COO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com
^ permalink raw reply [flat|nested] 9+ messages in thread
* RE: [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support
2022-12-28 11:16 ` Alexandre Belloni
@ 2023-01-03 1:23 ` Jacky Bai
0 siblings, 0 replies; 9+ messages in thread
From: Jacky Bai @ 2023-01-03 1:23 UTC (permalink / raw)
To: Alexandre Belloni
Cc: lee@kernel.org, robh+dt@kernel.org,
krzysztof.kozlowski+dt@linaro.org, shawnguo@kernel.org,
s.hauer@pengutronix.de, dmitry.torokhov@gmail.com,
a.zummo@towertech.it, devicetree@vger.kernel.org,
linux-arm-kernel@lists.infradead.org, linux-input@vger.kernel.org,
linux-rtc@vger.kernel.org, kernel@pengutronix.de, dl-linux-imx,
festevam@gmail.com
> Subject: Re: [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support
>
> On 26/12/2022 10:39:41+0800, Jacky Bai wrote:
> > +static int bbnsm_rtc_read_time(struct device *dev, struct rtc_time
> > +*tm) {
> > + struct bbnsm_rtc *bbnsm = dev_get_drvdata(dev);
> > + unsigned long time;
> > + u32 val;
> > +
> > + regmap_read(bbnsm->regmap, BBNSM_CTRL, &val);
> > + if ((val & RTC_EN_MSK) != RTC_EN) {
> > + dev_warn(dev, "RTC is not enabled, time is invalid!\n");
>
> I don't think this message is necessary.
>
Ok, will remove it.
> > + return -EINVAL;
> > + }
> > +
> > + time = bbnsm_read_counter(bbnsm);
> > + rtc_time64_to_tm(time, tm);
> > +
> > + return 0;
> > +}
> > +
>
> [...]
>
> > +static int bbnsm_rtc_probe(struct platform_device *pdev) {
> > + struct bbnsm_rtc *bbnsm;
> > + int ret;
> > +
> > + bbnsm = devm_kzalloc(&pdev->dev, sizeof(*bbnsm), GFP_KERNEL);
> > + if (!bbnsm)
> > + return -ENOMEM;
> > +
> > + bbnsm->rtc = devm_rtc_allocate_device(&pdev->dev);
> > +
> > + bbnsm->regmap =
> syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
> "nxp,bbnsm-regmap");
> > + if (IS_ERR(bbnsm->regmap)) {
> > + dev_err(&pdev->dev, "bbnsm get regmap failed\n");
>
> Maybe this should be a dev_dbg?
Fine, will fix in V3.
BR
>
> > + return PTR_ERR(bbnsm->regmap);
> > + }
> > +
> > + bbnsm->irq = platform_get_irq(pdev, 0);
> > + if (bbnsm->irq < 0)
> > + return bbnsm->irq;
> > +
> > + platform_set_drvdata(pdev, bbnsm);
> > +
> > + /* clear all the pending events */
> > + regmap_write(bbnsm->regmap, BBNSM_EVENTS, 0x7A);
> > +
> > + device_init_wakeup(&pdev->dev, true);
> > + dev_pm_set_wake_irq(&pdev->dev, bbnsm->irq);
> > +
> > + ret = devm_request_irq(&pdev->dev, bbnsm->irq,
> bbnsm_rtc_irq_handler,
> > + IRQF_SHARED, "rtc alarm", &pdev->dev);
> > + if (ret) {
> > + dev_err(&pdev->dev, "failed to request irq %d: %d\n",
> > + bbnsm->irq, ret);
> > + return ret;
> > + }
> > +
> > + bbnsm->rtc->ops = &bbnsm_rtc_ops;
> > + bbnsm->rtc->range_max = U32_MAX;
> > +
> > + return devm_rtc_register_device(bbnsm->rtc);
> > +}
> > +
> > +static const struct of_device_id bbnsm_dt_ids[] = {
> > + { .compatible = "nxp,bbnsm-rtc", },
> > + { /* sentinel */ },
> > +};
> > +MODULE_DEVICE_TABLE(of, bbnsm_dt_ids);
> > +
> > +static struct platform_driver bbnsm_rtc_driver = {
> > + .driver = {
> > + .name = "bbnsm_rtc",
> > + .of_match_table = bbnsm_dt_ids,
> > + },
> > + .probe = bbnsm_rtc_probe,
> > +};
> > +module_platform_driver(bbnsm_rtc_driver);
> > +
> > +MODULE_AUTHOR("Jacky Bai <ping.bai@nxp.com>");
> > +MODULE_DESCRIPTION("NXP BBNSM RTC Driver");
> MODULE_LICENSE("GPL");
> > --
> > 2.37.1
> >
>
> --
> Alexandre Belloni, co-owner and COO, Bootlin
> Embedded Linux and Kernel engineering
> https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fbootlin
> .com%2F&data=05%7C01%7Cping.bai%40nxp.com%7C2a4980d832274ceac4
> e908dae8c4ec12%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C6
> 38078229719156877%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwM
> DAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%
> 7C&sdata=nfDGoPytTNjULmOzC8IMF8r%2FrHiNJehsEls6m3lPsGc%3D&reser
> ved=0
^ permalink raw reply [flat|nested] 9+ messages in thread
* [PATCH v2 4/4] arm64: dts: imx93: Add the bbnsm dts node
2022-12-26 2:39 [PATCH v2 0/4] Add nxp bbnsm module support Jacky Bai
` (2 preceding siblings ...)
2022-12-26 2:39 ` [PATCH v2 3/4] rtc: bbnsm: Add the bbnsm rtc support Jacky Bai
@ 2022-12-26 2:39 ` Jacky Bai
3 siblings, 0 replies; 9+ messages in thread
From: Jacky Bai @ 2022-12-26 2:39 UTC (permalink / raw)
To: lee, robh+dt, krzysztof.kozlowski+dt, shawnguo, s.hauer,
dmitry.torokhov, a.zummo, alexandre.belloni
Cc: devicetree, linux-arm-kernel, linux-input, linux-rtc, kernel,
linux-imx, festevam
Add the bbnsm node for RTC & ON/OFF button support
Signed-off-by: Jacky Bai <ping.bai@nxp.com>
---
- v2 changes:
- update the regmap property to align with binding doc
---
arch/arm64/boot/dts/freescale/imx93.dtsi | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/arch/arm64/boot/dts/freescale/imx93.dtsi b/arch/arm64/boot/dts/freescale/imx93.dtsi
index 5d79663b3b84..5d7cf2d99444 100644
--- a/arch/arm64/boot/dts/freescale/imx93.dtsi
+++ b/arch/arm64/boot/dts/freescale/imx93.dtsi
@@ -229,6 +229,24 @@ iomuxc: pinctrl@443c0000 {
status = "okay";
};
+ bbnsm: bbnsm@44440000 {
+ compatible = "nxp,bbnsm", "syscon", "simple-mfd";
+ reg = <0x44440000 0x10000>;
+
+ bbnsm_rtc: rtc {
+ compatible = "nxp,bbnsm-rtc";
+ nxp,bbnsm-regmap = <&bbnsm>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ };
+
+ bbnsm_pwrkey: pwrkey {
+ compatible = "nxp,bbnsm-pwrkey";
+ nxp,bbnsm-regmap = <&bbnsm>;
+ interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>;
+ linux,code = <KEY_POWER>;
+ };
+ };
+
clk: clock-controller@44450000 {
compatible = "fsl,imx93-ccm";
reg = <0x44450000 0x10000>;
--
2.37.1
^ permalink raw reply related [flat|nested] 9+ messages in thread