* [PATCH v4 0/2] Add support for nuvoton ma35d1 keypad controller
@ 2024-12-04 2:10 Ming-Jen Chen
2024-12-04 2:10 ` [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1 Ming-Jen Chen
2024-12-04 2:10 ` [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad Ming-Jen Chen
0 siblings, 2 replies; 7+ messages in thread
From: Ming-Jen Chen @ 2024-12-04 2:10 UTC (permalink / raw)
To: linux-kernel, devicetree, linux-input, linux-arm-kernel,
mjchen0829, sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt, robh,
dmitry.torokhov
This patch series adds keypad driver for the nuvoton ma35 ARMv8 SoC.
It includes DT binding documentation and the ma35d1 keypad driver.
v4:
- Update nuvoton,ma35d1-keypad.yaml
- Kept the same order of properties as in the required block.
- Changed register addresses to lowercase.
v3:
- Update nuvoton,ma35d1-keypad.yaml
- Removed vendor-specific properties and replaced them with common properties
- Update ma35d1_keypad.c
- Modified the driver to reflect changes in the YAML properties
v2:
- Update nuvoton,ma35d1-keypad.yaml
- Fixed warnings and errors generated by running checkpatch.pl
- Removed the previous version's properties and rewrote the
properties in the Device Tree schema.
- Renamed the Device Tree binding file to nuvoton,ma35d1-keypad.yaml
- Update Kconfig
- Added COMPILE_TEST to the depends on line in the Kconfig
- Update ma35d1_keypad.c
- Refactored error handling within the probe function.
- Fixed the mixed use of devm and non-devm resource management.
- Corrected alignment issues in the code.
- Updated suspend and resume handling methods.
- Fixed variable naming to remove camel casing.
- Used for_each_set_bit() to check key states.
- Modified the code to align with updates in the device tree binding
Ming-Jen Chen (2):
input: keypad: add new keypad driver for MA35D1
dt-bindings: input: Add Nuvoton MA35D1 keypad
.../bindings/input/nuvoton,ma35d1-keypad.yaml | 69 ++++
drivers/input/keyboard/Kconfig | 10 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/ma35d1_keypad.c | 386 ++++++++++++++++++
4 files changed, 466 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/nuvoton,ma35d1-keypad.yaml
create mode 100644 drivers/input/keyboard/ma35d1_keypad.c
--
2.25.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1
2024-12-04 2:10 [PATCH v4 0/2] Add support for nuvoton ma35d1 keypad controller Ming-Jen Chen
@ 2024-12-04 2:10 ` Ming-Jen Chen
2024-12-04 14:48 ` kernel test robot
2024-12-04 17:13 ` kernel test robot
2024-12-04 2:10 ` [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad Ming-Jen Chen
1 sibling, 2 replies; 7+ messages in thread
From: Ming-Jen Chen @ 2024-12-04 2:10 UTC (permalink / raw)
To: linux-kernel, devicetree, linux-input, linux-arm-kernel,
mjchen0829, sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt, robh,
dmitry.torokhov
Adds a new keypad driver for the MA35D1 platform.
The driver supports key scanning and interrupt handling.
Signed-off-by: Ming-Jen Chen <mjchen0829@gmail.com>
---
drivers/input/keyboard/Kconfig | 10 +
drivers/input/keyboard/Makefile | 1 +
drivers/input/keyboard/ma35d1_keypad.c | 386 +++++++++++++++++++++++++
3 files changed, 397 insertions(+)
create mode 100644 drivers/input/keyboard/ma35d1_keypad.c
diff --git a/drivers/input/keyboard/Kconfig b/drivers/input/keyboard/Kconfig
index 721ab69e84ac..d7c0d0f4a88d 100644
--- a/drivers/input/keyboard/Kconfig
+++ b/drivers/input/keyboard/Kconfig
@@ -797,4 +797,14 @@ config KEYBOARD_CYPRESS_SF
To compile this driver as a module, choose M here: the
module will be called cypress-sf.
+config KEYBOARD_MA35D1
+ tristate "Nuvoton MA35D1 keypad driver"
+ depends on ARCH_MA35 || COMPILE_TEST
+ select INPUT_MATRIXKMAP
+ help
+ Say Y here if you want to use Nuvoton MA35D1 keypad.
+
+ To compile this driver as a module, choose M here: the
+ module will be called ma35d1-keypad.
+
endif
diff --git a/drivers/input/keyboard/Makefile b/drivers/input/keyboard/Makefile
index 1e0721c30709..9b858cdd1b6b 100644
--- a/drivers/input/keyboard/Makefile
+++ b/drivers/input/keyboard/Makefile
@@ -70,3 +70,4 @@ obj-$(CONFIG_KEYBOARD_TEGRA) += tegra-kbc.o
obj-$(CONFIG_KEYBOARD_TM2_TOUCHKEY) += tm2-touchkey.o
obj-$(CONFIG_KEYBOARD_TWL4030) += twl4030_keypad.o
obj-$(CONFIG_KEYBOARD_XTKBD) += xtkbd.o
+obj-$(CONFIG_KEYBOARD_MA35D1) += ma35d1_keypad.o
diff --git a/drivers/input/keyboard/ma35d1_keypad.c b/drivers/input/keyboard/ma35d1_keypad.c
new file mode 100644
index 000000000000..8410f7dd2e56
--- /dev/null
+++ b/drivers/input/keyboard/ma35d1_keypad.c
@@ -0,0 +1,386 @@
+// SPDX-License-Identifier: GPL-2.0+
+/*
+ * MA35D1 keypad driver
+ * Copyright (C) 2024 Nuvoton Technology Corp.
+ */
+
+#include <linux/bitfield.h>
+#include <linux/interrupt.h>
+#include <linux/input.h>
+#include <linux/platform_device.h>
+#include <linux/input/matrix_keypad.h>
+#include <linux/clk.h>
+#include <linux/of.h>
+#include <linux/bitops.h>
+#include <linux/pm_wakeirq.h>
+
+/* Keypad Interface Registers */
+#define KPI_CONF 0x00
+#define KPI_3KCONF 0x04
+#define KPI_STATUS 0x08
+#define KPI_RSTC 0x0C
+#define KPI_KEST 0x10
+#define KPI_KPE0 0x18
+#define KPI_KPE1 0x1C
+#define KPI_KRE0 0x20
+#define KPI_KRE1 0x24
+#define KPI_PRESCALDIV 0x28
+
+/* KPI_CONF - Keypad Configuration Register */
+#define KROW GENMASK(30, 28) /* Keypad Matrix ROW number */
+#define KCOL GENMASK(26, 24) /* Keypad Matrix COL Number */
+#define DB_CLKSEL GENMASK(19, 16) /* De-bounce sampling cycle selection */
+#define PRESCALE GENMASK(15, 8) /* Row Scan Cycle Pre-scale Value */
+#define WAKEUP BIT(5) /* Lower Power Wakeup Enable */
+#define INTEN BIT(3) /* Key Interrupt Enable Control */
+#define RKINTEN BIT(2) /* Release Key Interrupt Enable */
+#define PKINTEN BIT(1) /* Press Key Interrupt Enable Control */
+#define ENKP BIT(0) /* Keypad Scan Enable */
+
+/* KPI_STATUS - Keypad Status Register */
+#define PKEY_INT BIT(4) /* Press key interrupt */
+#define RKEY_INT BIT(3) /* Release key interrupt */
+#define KEY_INT BIT(2) /* Key Interrupt */
+#define RST_3KEY BIT(1) /* 3-Keys Reset Flag */
+#define PDWAKE BIT(0) /* Power Down Wakeup Flag */
+
+#define KEY_EVENT_BITS 64
+
+#define NUM_SETTINGS 12
+#define PRE_SCALE_MAX 256
+#define PRE_SCALE_DIV_MAX 256
+
+static const unsigned int debounce_values[NUM_SETTINGS] = {
+ 0, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192
+};
+
+static const unsigned int debounce_register[NUM_SETTINGS] = {
+ 0x0, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x9, 0xA, 0xB, 0xC, 0xD
+};
+
+struct ma35d1_keypad {
+ struct clk *clk;
+ struct input_dev *input_dev;
+ void __iomem *mmio_base;
+ int irq;
+ u32 kpi_row;
+ u32 kpi_col;
+ u32 debounce_val;
+ u32 pre_scale;
+ u32 pre_scale_div;
+};
+
+static void ma35d1_keypad_scan_matrix(struct ma35d1_keypad *keypad, unsigned int status)
+{
+ struct input_dev *input_dev = keypad->input_dev;
+ u32 row_shift = get_count_order(keypad->kpi_col);
+ u32 *keymap = input_dev->keycode;
+ u32 code, key, index;
+ u32 key_event[4];
+ u64 pressed_keys = 0, released_keys = 0;
+
+ /* Read key event status */
+ key_event[0] = readl(keypad->mmio_base + KPI_KPE0);
+ key_event[1] = readl(keypad->mmio_base + KPI_KPE1);
+ key_event[2] = readl(keypad->mmio_base + KPI_KRE0);
+ key_event[3] = readl(keypad->mmio_base + KPI_KRE1);
+
+ /* Clear key event status */
+ writel(key_event[0], (keypad->mmio_base + KPI_KPE0));
+ writel(key_event[1], (keypad->mmio_base + KPI_KPE1));
+ writel(key_event[2], (keypad->mmio_base + KPI_KRE0));
+ writel(key_event[3], (keypad->mmio_base + KPI_KRE1));
+
+ pressed_keys = key_event[0] | ((u64)key_event[1] << 32);
+ released_keys = key_event[2] | ((u64)key_event[3] << 32);
+
+ /* Process pressed keys */
+ for_each_set_bit(index, (const unsigned long *)&pressed_keys, KEY_EVENT_BITS) {
+ code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
+ key = keymap[code];
+
+ input_event(input_dev, EV_MSC, MSC_SCAN, code);
+ input_report_key(input_dev, key, 1);
+ }
+
+ /* Process released keys */
+ for_each_set_bit(index, (const unsigned long *)&released_keys, KEY_EVENT_BITS) {
+ code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
+ key = keymap[code];
+
+ input_event(input_dev, EV_MSC, MSC_SCAN, code);
+ input_report_key(input_dev, key, 0);
+ }
+
+ input_sync(input_dev);
+}
+
+static irqreturn_t ma35d1_keypad_interrupt(int irq, void *dev_id)
+{
+ struct ma35d1_keypad *keypad = dev_id;
+ unsigned int kstatus;
+
+ kstatus = readl(keypad->mmio_base + KPI_STATUS);
+
+ if (kstatus & (PKEY_INT | RKEY_INT)) {
+ ma35d1_keypad_scan_matrix(keypad, kstatus);
+ } else {
+ if (kstatus & PDWAKE)
+ writel(PDWAKE, (keypad->mmio_base + KPI_STATUS));
+ }
+
+ return IRQ_HANDLED;
+}
+
+static int ma35d1_keypad_open(struct input_dev *dev)
+{
+ struct ma35d1_keypad *keypad = input_get_drvdata(dev);
+ u32 val, config;
+
+ val = RKINTEN | PKINTEN | INTEN | ENKP;
+ val |= FIELD_PREP(KCOL, (keypad->kpi_col - 1)) | FIELD_PREP(KROW, (keypad->kpi_row - 1));
+
+ config = FIELD_PREP(PRESCALE, (keypad->pre_scale - 1)) |
+ FIELD_PREP(DB_CLKSEL, keypad->debounce_val);
+
+ val |= config;
+
+ writel(val, keypad->mmio_base + KPI_CONF);
+ writel((keypad->pre_scale_div - 1), keypad->mmio_base + KPI_PRESCALDIV);
+
+ return 0;
+}
+
+static void ma35d1_keypad_close(struct input_dev *dev)
+{
+ struct ma35d1_keypad *keypad = input_get_drvdata(dev);
+ u32 val;
+
+ val = readl(keypad->mmio_base + KPI_KPE0) & ~ENKP;
+ writel(val, keypad->mmio_base + KPI_CONF);
+}
+
+static int ma35d1_parse_dt(struct ma35d1_keypad *keypad, u32 debounce_ms, u32 scan_interval)
+{
+ u32 clk_rate = clk_get_rate(keypad->clk);
+ u32 min_diff = debounce_values[NUM_SETTINGS];
+ u32 i, clk_cycles, diff, p, d;
+ u32 best_diff = 0xffff;
+
+ /* Calculate debounce cycles */
+ clk_cycles = clk_rate * debounce_ms / 1000;
+
+ keypad->debounce_val = debounce_register[NUM_SETTINGS];
+
+ for (i = 0; i < NUM_SETTINGS; i++) {
+ diff = abs((s32)(clk_cycles - debounce_values[i]));
+ if (diff < min_diff) {
+ min_diff = diff;
+ keypad->debounce_val = debounce_register[i];
+ }
+ }
+
+ /* Find scan time setting */
+ clk_cycles = clk_rate * scan_interval / 1000;
+ clk_cycles = clk_cycles / keypad->kpi_row;
+
+ if (clk_cycles == 0) {
+ keypad->pre_scale = 1;
+ keypad->pre_scale_div = 1;
+ } else if (clk_cycles >= PRE_SCALE_MAX * PRE_SCALE_DIV_MAX) {
+ keypad->pre_scale = PRE_SCALE_MAX;
+ keypad->pre_scale_div = PRE_SCALE_DIV_MAX;
+ } else {
+ for (p = 1; p <= PRE_SCALE_MAX; p++) {
+ d = (clk_cycles + (p / 2)) / p;
+
+ if (d > 0 && d <= PRE_SCALE_DIV_MAX) {
+ diff = abs((s32)(p * d) - clk_cycles);
+
+ if (diff < best_diff) {
+ best_diff = diff;
+ keypad->pre_scale = p;
+ keypad->pre_scale_div = d;
+
+ if (diff == 0)
+ break;
+ }
+ }
+ }
+ }
+
+ /*
+ * Hardware Limitation:
+ * Due to the hardware design, the keypad debounce time must not exceed
+ * half of the row scan time.
+ *
+ * The row scan time is determined by the formula:
+ * Row Scan Time = pre_scale * pre_scale_div
+ *
+ * Therefore, the debounce time must satisfy the following condition:
+ * Debounce Time < (Row Scan Time / 2)
+ *
+ * For example:
+ * If pre_scale = 64, pre_scale_div = 32,
+ * then Row Scan Time = 64 * 32 = 2048 keypad clock.
+ * Hence, the maximum allowable debounce time is 1024 keypad clock.
+ */
+
+ if (keypad->debounce_val >= (keypad->pre_scale * keypad->pre_scale_div) / 2)
+ return -EINVAL;
+
+ return 0;
+}
+
+static int ma35d1_keypad_probe(struct platform_device *pdev)
+{
+ struct ma35d1_keypad *keypad;
+ struct input_dev *input_dev;
+ struct resource *res;
+ u32 debounce, scan_interval;
+ int error = 0;
+
+ keypad = devm_kzalloc(&pdev->dev, sizeof(*keypad), GFP_KERNEL);
+ if (!keypad)
+ return -ENOMEM;
+
+ input_dev = devm_input_allocate_device(&pdev->dev);
+ if (!input_dev)
+ return -ENOMEM;
+
+ res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+ if (!res)
+ return -ENODEV;
+
+ keypad->mmio_base = devm_ioremap_resource(&pdev->dev, res);
+ if (IS_ERR(keypad->mmio_base))
+ return dev_err_probe(&pdev->dev, PTR_ERR(keypad->mmio_base),
+ "failed to remap I/O memor\n");
+
+ keypad->irq = platform_get_irq(pdev, 0);
+ if (keypad->irq < 0) {
+ dev_err(&pdev->dev, "failed to get IRQ\n");
+ return keypad->irq;
+ }
+
+ keypad->clk = devm_clk_get_enabled(&pdev->dev, NULL);
+ if (IS_ERR(keypad->clk))
+ return dev_err_probe(&pdev->dev, PTR_ERR(keypad->clk), "failed to get core clk\n");
+
+ error = matrix_keypad_parse_properties(&pdev->dev, &keypad->kpi_row, &keypad->kpi_col);
+ if (error) {
+ dev_err(&pdev->dev, "failed to parse keypad params\n");
+ return error;
+ }
+
+ error = matrix_keypad_build_keymap(NULL, NULL, keypad->kpi_row, keypad->kpi_col,
+ NULL, input_dev);
+ if (error) {
+ dev_err(&pdev->dev, "failed to build keymap\n");
+ return error;
+ }
+
+ keypad->input_dev = input_dev;
+ input_dev->name = pdev->name;
+ input_dev->id.bustype = BUS_HOST;
+ input_dev->open = ma35d1_keypad_open;
+ input_dev->close = ma35d1_keypad_close;
+ input_dev->dev.parent = &pdev->dev;
+
+ error = device_property_read_u32(&pdev->dev, "debounce-delay-ms", &debounce);
+ if (error) {
+ dev_err(&pdev->dev, "failed to acquire 'debounce-delay-ms'\n");
+ return error;
+ }
+
+ error = device_property_read_u32(&pdev->dev, "scan-interval-ms", &scan_interval);
+ if (error) {
+ dev_err(&pdev->dev, "failed to acquire 'scan-interval'\n");
+ return error;
+ }
+
+ error = ma35d1_parse_dt(keypad, debounce, scan_interval);
+ if (error) {
+ dev_err(&pdev->dev, "keypad dt params error\n");
+ return error;
+ }
+
+ __set_bit(EV_REP, input_dev->evbit);
+ input_set_drvdata(input_dev, keypad);
+ input_set_capability(input_dev, EV_MSC, MSC_SCAN);
+
+ error = devm_request_irq(&pdev->dev, keypad->irq, ma35d1_keypad_interrupt,
+ IRQF_NO_SUSPEND, pdev->name, keypad);
+ if (error) {
+ dev_err(&pdev->dev, "failed to request IRQ\n");
+ return error;
+ }
+
+ platform_set_drvdata(pdev, keypad);
+ device_init_wakeup(&pdev->dev, 1);
+
+ error = dev_pm_set_wake_irq(&pdev->dev, keypad->irq);
+ if (error) {
+ dev_err(&pdev->dev, "failed to enable irq wake\n");
+ return error;
+ }
+
+ error = input_register_device(input_dev);
+ if (error) {
+ dev_err(&pdev->dev, "failed to register input device\n");
+ return error;
+ }
+
+ return 0;
+}
+
+static void ma35d1_keypad_remove(struct platform_device *pdev)
+{
+ struct ma35d1_keypad *keypad = platform_get_drvdata(pdev);
+
+ input_unregister_device(keypad->input_dev);
+}
+
+static int ma35d1_keypad_suspend(struct device *dev)
+{
+ struct ma35d1_keypad *keypad = dev_get_drvdata(dev);
+
+ if (device_may_wakeup(dev))
+ writel(readl(keypad->mmio_base + KPI_CONF) | WAKEUP, keypad->mmio_base + KPI_CONF);
+
+ return 0;
+}
+
+static int ma35d1_keypad_resume(struct device *dev)
+{
+ struct ma35d1_keypad *keypad = dev_get_drvdata(dev);
+
+ if (device_may_wakeup(dev))
+ writel(readl(keypad->mmio_base + KPI_CONF) & ~(WAKEUP),
+ keypad->mmio_base + KPI_CONF);
+
+ return 0;
+}
+
+static DEFINE_SIMPLE_DEV_PM_OPS(ma35d1_pm_ops, ma35d1_keypad_suspend, ma35d1_keypad_resume);
+
+static const struct of_device_id ma35d1_kpi_of_match[] = {
+ { .compatible = "nuvoton,ma35d1-kpi"},
+ {},
+};
+MODULE_DEVICE_TABLE(of, ma35d1_kpi_of_match);
+
+static struct platform_driver ma35d1_keypad_driver = {
+ .probe = ma35d1_keypad_probe,
+ .remove = ma35d1_keypad_remove,
+ .driver = {
+ .name = "ma35d1-kpi",
+ .pm = pm_sleep_ptr(&ma35d1_pm_ops),
+ .of_match_table = ma35d1_kpi_of_match,
+ },
+};
+module_platform_driver(ma35d1_keypad_driver);
+
+MODULE_AUTHOR("Ming-Jen Chen");
+MODULE_DESCRIPTION("MA35D1 Keypad Driver");
+MODULE_LICENSE("GPL");
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad
2024-12-04 2:10 [PATCH v4 0/2] Add support for nuvoton ma35d1 keypad controller Ming-Jen Chen
2024-12-04 2:10 ` [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1 Ming-Jen Chen
@ 2024-12-04 2:10 ` Ming-Jen Chen
2024-12-04 7:49 ` Krzysztof Kozlowski
1 sibling, 1 reply; 7+ messages in thread
From: Ming-Jen Chen @ 2024-12-04 2:10 UTC (permalink / raw)
To: linux-kernel, devicetree, linux-input, linux-arm-kernel,
mjchen0829, sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt, robh,
dmitry.torokhov
Add YAML bindings for MA35D1 SoC keypad.
Signed-off-by: Ming-Jen Chen <mjchen0829@gmail.com>
---
.../bindings/input/nuvoton,ma35d1-keypad.yaml | 69 +++++++++++++++++++
1 file changed, 69 insertions(+)
create mode 100644 Documentation/devicetree/bindings/input/nuvoton,ma35d1-keypad.yaml
diff --git a/Documentation/devicetree/bindings/input/nuvoton,ma35d1-keypad.yaml b/Documentation/devicetree/bindings/input/nuvoton,ma35d1-keypad.yaml
new file mode 100644
index 000000000000..54a81583bf2b
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/nuvoton,ma35d1-keypad.yaml
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/nuvoton,ma35d1-keypad.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: Nuvoton MA35D1 Keypad
+
+maintainers:
+ - Ming-jen Chen <mjchen0829@gmail.com>
+
+allOf:
+ - $ref: /schemas/input/matrix-keymap.yaml#
+
+properties:
+ compatible:
+ const: nuvoton,ma35d1-kpi
+
+ reg:
+ maxItems: 1
+
+ interrupts:
+ maxItems: 1
+
+ clocks:
+ maxItems: 1
+
+ debounce-delay-ms:
+ description: Debounce delay time in milliseconds.
+ maxItems: 1
+
+ scan-interval-ms:
+ description: Scan interval time in milliseconds.
+ maxItems: 1
+
+required:
+ - compatible
+ - reg
+ - interrupts
+ - clocks
+ - debounce-delay-ms
+ - scan-interval-ms
+ - linux,keymap
+ - keypad,num-rows
+ - keypad,num-columns
+
+unevaluatedProperties: false
+
+examples:
+ - |
+ #include <dt-bindings/input/input.h>
+ keypad@404a0000 {
+ compatible = "nuvoton,ma35d1-kpi";
+ reg = <0x404a0000 0x10000>;
+ interrupts = <79>;
+ clocks = <&clk>;
+ keypad,num-rows = <2>;
+ keypad,num-columns = <2>;
+
+ linux,keymap = <
+ MATRIX_KEY(0, 0, KEY_ENTER)
+ MATRIX_KEY(0, 1, KEY_ENTER)
+ MATRIX_KEY(1, 0, KEY_SPACE)
+ MATRIX_KEY(1, 1, KEY_Z)
+ >;
+
+ debounce-delay-ms = <1>;
+ scan-interval-ms = <20>;
+ };
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad
2024-12-04 2:10 ` [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad Ming-Jen Chen
@ 2024-12-04 7:49 ` Krzysztof Kozlowski
2024-12-10 5:23 ` Ming-Jen Chen
0 siblings, 1 reply; 7+ messages in thread
From: Krzysztof Kozlowski @ 2024-12-04 7:49 UTC (permalink / raw)
To: Ming-Jen Chen
Cc: linux-kernel, devicetree, linux-input, linux-arm-kernel,
sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt, robh,
dmitry.torokhov
On Wed, Dec 04, 2024 at 02:10:14AM +0000, Ming-Jen Chen wrote:
> Add YAML bindings for MA35D1 SoC keypad.
>
> Signed-off-by: Ming-Jen Chen <mjchen0829@gmail.com>
Repeating same comment third or fourth time is a waste of my time.
NAK.
It seems my or other reviewer's previous comments were not fully
addressed. Maybe the feedback got lost between the quotes, maybe you
just forgot to apply it. Please go back to the previous discussion and
either implement all requested changes or keep discussing them.
Best regards,
Krzysztof
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1
2024-12-04 2:10 ` [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1 Ming-Jen Chen
@ 2024-12-04 14:48 ` kernel test robot
2024-12-04 17:13 ` kernel test robot
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2024-12-04 14:48 UTC (permalink / raw)
To: Ming-Jen Chen, linux-kernel, devicetree, linux-input,
linux-arm-kernel, sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt,
robh, dmitry.torokhov
Cc: oe-kbuild-all
Hi Ming-Jen,
kernel test robot noticed the following build errors:
[auto build test ERROR on dtor-input/next]
[also build test ERROR on dtor-input/for-linus hid/for-next soc/for-next linus/master v6.13-rc1 next-20241203]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ming-Jen-Chen/input-keypad-add-new-keypad-driver-for-MA35D1/20241204-123001
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link: https://lore.kernel.org/r/20241204021014.5083-2-mjchen0829%40gmail.com
patch subject: [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1
config: s390-allyesconfig (https://download.01.org/0day-ci/archive/20241204/202412042245.5jwzbfGS-lkp@intel.com/config)
compiler: s390-linux-gcc (GCC) 14.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241204/202412042245.5jwzbfGS-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412042245.5jwzbfGS-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/input/keyboard/ma35d1_keypad.c: In function 'ma35d1_keypad_scan_matrix':
drivers/input/keyboard/ma35d1_keypad.c:83:24: error: implicit declaration of function 'readl' [-Wimplicit-function-declaration]
83 | key_event[0] = readl(keypad->mmio_base + KPI_KPE0);
| ^~~~~
>> drivers/input/keyboard/ma35d1_keypad.c:89:9: error: implicit declaration of function 'writel' [-Wimplicit-function-declaration]
89 | writel(key_event[0], (keypad->mmio_base + KPI_KPE0));
| ^~~~~~
vim +/writel +89 drivers/input/keyboard/ma35d1_keypad.c
72
73 static void ma35d1_keypad_scan_matrix(struct ma35d1_keypad *keypad, unsigned int status)
74 {
75 struct input_dev *input_dev = keypad->input_dev;
76 u32 row_shift = get_count_order(keypad->kpi_col);
77 u32 *keymap = input_dev->keycode;
78 u32 code, key, index;
79 u32 key_event[4];
80 u64 pressed_keys = 0, released_keys = 0;
81
82 /* Read key event status */
83 key_event[0] = readl(keypad->mmio_base + KPI_KPE0);
84 key_event[1] = readl(keypad->mmio_base + KPI_KPE1);
85 key_event[2] = readl(keypad->mmio_base + KPI_KRE0);
86 key_event[3] = readl(keypad->mmio_base + KPI_KRE1);
87
88 /* Clear key event status */
> 89 writel(key_event[0], (keypad->mmio_base + KPI_KPE0));
90 writel(key_event[1], (keypad->mmio_base + KPI_KPE1));
91 writel(key_event[2], (keypad->mmio_base + KPI_KRE0));
92 writel(key_event[3], (keypad->mmio_base + KPI_KRE1));
93
94 pressed_keys = key_event[0] | ((u64)key_event[1] << 32);
95 released_keys = key_event[2] | ((u64)key_event[3] << 32);
96
97 /* Process pressed keys */
98 for_each_set_bit(index, (const unsigned long *)&pressed_keys, KEY_EVENT_BITS) {
99 code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
100 key = keymap[code];
101
102 input_event(input_dev, EV_MSC, MSC_SCAN, code);
103 input_report_key(input_dev, key, 1);
104 }
105
106 /* Process released keys */
107 for_each_set_bit(index, (const unsigned long *)&released_keys, KEY_EVENT_BITS) {
108 code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
109 key = keymap[code];
110
111 input_event(input_dev, EV_MSC, MSC_SCAN, code);
112 input_report_key(input_dev, key, 0);
113 }
114
115 input_sync(input_dev);
116 }
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1
2024-12-04 2:10 ` [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1 Ming-Jen Chen
2024-12-04 14:48 ` kernel test robot
@ 2024-12-04 17:13 ` kernel test robot
1 sibling, 0 replies; 7+ messages in thread
From: kernel test robot @ 2024-12-04 17:13 UTC (permalink / raw)
To: Ming-Jen Chen, linux-kernel, devicetree, linux-input,
linux-arm-kernel, sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt,
robh, dmitry.torokhov
Cc: llvm, oe-kbuild-all
Hi Ming-Jen,
kernel test robot noticed the following build errors:
[auto build test ERROR on dtor-input/next]
[also build test ERROR on dtor-input/for-linus hid/for-next soc/for-next linus/master v6.13-rc1 next-20241203]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Ming-Jen-Chen/input-keypad-add-new-keypad-driver-for-MA35D1/20241204-123001
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link: https://lore.kernel.org/r/20241204021014.5083-2-mjchen0829%40gmail.com
patch subject: [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1
config: s390-allmodconfig (https://download.01.org/0day-ci/archive/20241205/202412050142.nkbl6PnK-lkp@intel.com/config)
compiler: clang version 20.0.0git (https://github.com/llvm/llvm-project 592c0fe55f6d9a811028b5f3507be91458ab2713)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20241205/202412050142.nkbl6PnK-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202412050142.nkbl6PnK-lkp@intel.com/
All errors (new ones prefixed by >>):
In file included from drivers/input/keyboard/ma35d1_keypad.c:9:
In file included from include/linux/input.h:19:
In file included from include/linux/device.h:32:
In file included from include/linux/device/driver.h:21:
In file included from include/linux/module.h:19:
In file included from include/linux/elf.h:6:
In file included from arch/s390/include/asm/elf.h:181:
In file included from arch/s390/include/asm/mmu_context.h:11:
In file included from arch/s390/include/asm/pgalloc.h:18:
In file included from include/linux/mm.h:2228:
include/linux/vmstat.h:503:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
503 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
504 | item];
| ~~~~
include/linux/vmstat.h:510:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
510 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
511 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
include/linux/vmstat.h:517:36: warning: arithmetic between different enumeration types ('enum node_stat_item' and 'enum lru_list') [-Wenum-enum-conversion]
517 | return node_stat_name(NR_LRU_BASE + lru) + 3; // skip "nr_"
| ~~~~~~~~~~~ ^ ~~~
include/linux/vmstat.h:523:43: warning: arithmetic between different enumeration types ('enum zone_stat_item' and 'enum numa_stat_item') [-Wenum-enum-conversion]
523 | return vmstat_text[NR_VM_ZONE_STAT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~ ^
524 | NR_VM_NUMA_EVENT_ITEMS +
| ~~~~~~~~~~~~~~~~~~~~~~
>> drivers/input/keyboard/ma35d1_keypad.c:83:17: error: call to undeclared function 'readl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
83 | key_event[0] = readl(keypad->mmio_base + KPI_KPE0);
| ^
drivers/input/keyboard/ma35d1_keypad.c:89:2: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
89 | writel(key_event[0], (keypad->mmio_base + KPI_KPE0));
| ^
drivers/input/keyboard/ma35d1_keypad.c:123:12: error: call to undeclared function 'readl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
123 | kstatus = readl(keypad->mmio_base + KPI_STATUS);
| ^
drivers/input/keyboard/ma35d1_keypad.c:129:4: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
129 | writel(PDWAKE, (keypad->mmio_base + KPI_STATUS));
| ^
drivers/input/keyboard/ma35d1_keypad.c:148:2: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
148 | writel(val, keypad->mmio_base + KPI_CONF);
| ^
drivers/input/keyboard/ma35d1_keypad.c:159:8: error: call to undeclared function 'readl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
159 | val = readl(keypad->mmio_base + KPI_KPE0) & ~ENKP;
| ^
drivers/input/keyboard/ma35d1_keypad.c:160:2: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
160 | writel(val, keypad->mmio_base + KPI_CONF);
| ^
drivers/input/keyboard/ma35d1_keypad.c:166:17: warning: array index 12 is past the end of the array (that has type 'const unsigned int[12]') [-Warray-bounds]
166 | u32 min_diff = debounce_values[NUM_SETTINGS];
| ^ ~~~~~~~~~~~~
drivers/input/keyboard/ma35d1_keypad.c:53:1: note: array 'debounce_values' declared here
53 | static const unsigned int debounce_values[NUM_SETTINGS] = {
| ^
drivers/input/keyboard/ma35d1_keypad.c:173:25: warning: array index 12 is past the end of the array (that has type 'const unsigned int[12]') [-Warray-bounds]
173 | keypad->debounce_val = debounce_register[NUM_SETTINGS];
| ^ ~~~~~~~~~~~~
drivers/input/keyboard/ma35d1_keypad.c:57:1: note: array 'debounce_register' declared here
57 | static const unsigned int debounce_register[NUM_SETTINGS] = {
| ^
drivers/input/keyboard/ma35d1_keypad.c:349:3: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
349 | writel(readl(keypad->mmio_base + KPI_CONF) | WAKEUP, keypad->mmio_base + KPI_CONF);
| ^
drivers/input/keyboard/ma35d1_keypad.c:349:10: error: call to undeclared function 'readl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
349 | writel(readl(keypad->mmio_base + KPI_CONF) | WAKEUP, keypad->mmio_base + KPI_CONF);
| ^
drivers/input/keyboard/ma35d1_keypad.c:359:3: error: call to undeclared function 'writel'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
359 | writel(readl(keypad->mmio_base + KPI_CONF) & ~(WAKEUP),
| ^
drivers/input/keyboard/ma35d1_keypad.c:359:10: error: call to undeclared function 'readl'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
359 | writel(readl(keypad->mmio_base + KPI_CONF) & ~(WAKEUP),
| ^
6 warnings and 11 errors generated.
vim +/readl +83 drivers/input/keyboard/ma35d1_keypad.c
72
73 static void ma35d1_keypad_scan_matrix(struct ma35d1_keypad *keypad, unsigned int status)
74 {
75 struct input_dev *input_dev = keypad->input_dev;
76 u32 row_shift = get_count_order(keypad->kpi_col);
77 u32 *keymap = input_dev->keycode;
78 u32 code, key, index;
79 u32 key_event[4];
80 u64 pressed_keys = 0, released_keys = 0;
81
82 /* Read key event status */
> 83 key_event[0] = readl(keypad->mmio_base + KPI_KPE0);
84 key_event[1] = readl(keypad->mmio_base + KPI_KPE1);
85 key_event[2] = readl(keypad->mmio_base + KPI_KRE0);
86 key_event[3] = readl(keypad->mmio_base + KPI_KRE1);
87
88 /* Clear key event status */
89 writel(key_event[0], (keypad->mmio_base + KPI_KPE0));
90 writel(key_event[1], (keypad->mmio_base + KPI_KPE1));
91 writel(key_event[2], (keypad->mmio_base + KPI_KRE0));
92 writel(key_event[3], (keypad->mmio_base + KPI_KRE1));
93
94 pressed_keys = key_event[0] | ((u64)key_event[1] << 32);
95 released_keys = key_event[2] | ((u64)key_event[3] << 32);
96
97 /* Process pressed keys */
98 for_each_set_bit(index, (const unsigned long *)&pressed_keys, KEY_EVENT_BITS) {
99 code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
100 key = keymap[code];
101
102 input_event(input_dev, EV_MSC, MSC_SCAN, code);
103 input_report_key(input_dev, key, 1);
104 }
105
106 /* Process released keys */
107 for_each_set_bit(index, (const unsigned long *)&released_keys, KEY_EVENT_BITS) {
108 code = MATRIX_SCAN_CODE(index / 8, (index % 8), row_shift);
109 key = keymap[code];
110
111 input_event(input_dev, EV_MSC, MSC_SCAN, code);
112 input_report_key(input_dev, key, 0);
113 }
114
115 input_sync(input_dev);
116 }
117
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad
2024-12-04 7:49 ` Krzysztof Kozlowski
@ 2024-12-10 5:23 ` Ming-Jen Chen
0 siblings, 0 replies; 7+ messages in thread
From: Ming-Jen Chen @ 2024-12-10 5:23 UTC (permalink / raw)
To: Krzysztof Kozlowski
Cc: linux-kernel, devicetree, linux-input, linux-arm-kernel,
sudeep.holla, arnd, peng.fan, conor+dt, krzk+dt, robh,
dmitry.torokhov
On 2024/12/4 下午 03:49, Krzysztof Kozlowski wrote:
> On Wed, Dec 04, 2024 at 02:10:14AM +0000, Ming-Jen Chen wrote:
>> Add YAML bindings for MA35D1 SoC keypad.
>>
>> Signed-off-by: Ming-Jen Chen <mjchen0829@gmail.com>
>
>
> Repeating same comment third or fourth time is a waste of my time.
>
> NAK.
>
> It seems my or other reviewer's previous comments were not fully
> addressed. Maybe the feedback got lost between the quotes, maybe you
> just forgot to apply it. Please go back to the previous discussion and
> either implement all requested changes or keep discussing them.
>
> Best regards,
> Krzysztof
>
I will carefully review the v3 discussion thread to ensure that all
feedback is properly implemented. Once I’ve addressed the issues, I’d
like to confirm the next steps with you:
1. Should I drop v4 entirely and submit a revised patch as v5?
2. Alternatively, would you prefer me to resend v4 with the necessary
corrections?
Please let me know your preference so I can proceed accordingly and
ensure a smoother review process.
Thank you again for your guidance and understanding.
Best regards,
Ming-Jen Chen
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2024-12-10 5:23 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-12-04 2:10 [PATCH v4 0/2] Add support for nuvoton ma35d1 keypad controller Ming-Jen Chen
2024-12-04 2:10 ` [PATCH v4 1/2] input: keypad: add new keypad driver for MA35D1 Ming-Jen Chen
2024-12-04 14:48 ` kernel test robot
2024-12-04 17:13 ` kernel test robot
2024-12-04 2:10 ` [PATCH v4 2/2] dt-bindings: input: Add Nuvoton MA35D1 keypad Ming-Jen Chen
2024-12-04 7:49 ` Krzysztof Kozlowski
2024-12-10 5:23 ` Ming-Jen Chen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).