#include <linux/interrupt.h>
 #include <linux/kernel.h>
 #include <linux/mfd/mt6323/registers.h>
+#include <linux/mfd/mt6358/registers.h>
 #include <linux/mfd/mt6397/core.h>
 #include <linux/mfd/mt6397/registers.h>
 #include <linux/module.h>
        .pmic_rst_reg = MT6323_TOP_RST_MISC,
 };
 
+static const struct mtk_pmic_regs mt6358_regs = {
+       .keys_regs[MTK_PMIC_PWRKEY_INDEX] =
+               MTK_PMIC_KEYS_REGS(MT6358_TOPSTATUS,
+                                  0x2, MT6358_PSC_TOP_INT_CON0, 0x5),
+       .keys_regs[MTK_PMIC_HOMEKEY_INDEX] =
+               MTK_PMIC_KEYS_REGS(MT6358_TOPSTATUS,
+                                  0x8, MT6358_PSC_TOP_INT_CON0, 0xa),
+       .pmic_rst_reg = MT6358_TOP_RST_MISC,
+};
+
 struct mtk_pmic_keys_info {
        struct mtk_pmic_keys *keys;
        const struct mtk_pmic_keys_regs *regs;
        unsigned int keycode;
        int irq;
+       int irq_r; /* optional: release irq if different */
        bool wakeup:1;
 };
 
                return ret;
        }
 
+       if (info->irq_r > 0) {
+               ret = devm_request_threaded_irq(keys->dev, info->irq_r, NULL,
+                                               mtk_pmic_keys_irq_handler_thread,
+                                               IRQF_ONESHOT | IRQF_TRIGGER_HIGH,
+                                               "mtk-pmic-keys", info);
+               if (ret) {
+                       dev_err(keys->dev, "Failed to request IRQ_r: %d: %d\n",
+                               info->irq, ret);
+                       return ret;
+               }
+       }
+
        input_set_capability(keys->input_dev, EV_KEY, info->keycode);
 
        return 0;
        int index;
 
        for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {
-               if (keys->keys[index].wakeup)
+               if (keys->keys[index].wakeup) {
                        enable_irq_wake(keys->keys[index].irq);
+                       if (keys->keys[index].irq_r > 0)
+                               enable_irq_wake(keys->keys[index].irq_r);
+               }
        }
 
        return 0;
        int index;
 
        for (index = 0; index < MTK_PMIC_MAX_KEY_COUNT; index++) {
-               if (keys->keys[index].wakeup)
+               if (keys->keys[index].wakeup) {
                        disable_irq_wake(keys->keys[index].irq);
+                       if (keys->keys[index].irq_r > 0)
+                               disable_irq_wake(keys->keys[index].irq_r);
+               }
        }
 
        return 0;
        }, {
                .compatible = "mediatek,mt6323-keys",
                .data = &mt6323_regs,
+       }, {
+               .compatible = "mediatek,mt6358-keys",
+               .data = &mt6358_regs,
        }, {
                /* sentinel */
        }
        struct mt6397_chip *pmic_chip = dev_get_drvdata(pdev->dev.parent);
        struct device_node *node = pdev->dev.of_node, *child;
        static const char *const irqnames[] = { "powerkey", "homekey" };
+       static const char *const irqnames_r[] = { "powerkey_r", "homekey_r" };
        struct mtk_pmic_keys *keys;
        const struct mtk_pmic_regs *mtk_pmic_regs;
        struct input_dev *input_dev;
                        return keys->keys[index].irq;
                }
 
+               if (of_device_is_compatible(node, "mediatek,mt6358-keys")) {
+                       keys->keys[index].irq_r = platform_get_irq_byname(pdev,
+                                                                         irqnames_r[index]);
+
+                       if (keys->keys[index].irq_r < 0) {
+                               of_node_put(child);
+                               return keys->keys[index].irq_r;
+                       }
+               }
+
                error = of_property_read_u32(child,
                        "linux,keycodes", &keys->keys[index].keycode);
                if (error) {