summaryrefslogtreecommitdiff
path: root/drivers/irqchip
diff options
context:
space:
mode:
authorFugang Duan <fugang.duan@nxp.com>2017-06-05 11:31:10 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:26:40 +0800
commit9f0efcd4b25a5926006213f08fbb2cf281423d17 (patch)
tree5a222b46afc216bb68fcca5d9f07a9d8edbebb32 /drivers/irqchip
parente14e981b45079bb919c7cf9a7938f5d419cc6276 (diff)
MLK-15005-03 irqchip: irqsteer: add ipg clock support
Some subsystems have lpcg sw_bit to control the ipg_clk to LIS, so add the ipg clock for the module. Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Diffstat (limited to 'drivers/irqchip')
-rw-r--r--drivers/irqchip/irq-imx-irqsteer.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c
index f2affacc7498..1a961f4ea06c 100644
--- a/drivers/irqchip/irq-imx-irqsteer.c
+++ b/drivers/irqchip/irq-imx-irqsteer.c
@@ -8,6 +8,7 @@
#include <linux/kernel.h>
#include <linux/module.h>
+#include <linux/clk.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/irqchip/chained_irq.h>
@@ -27,6 +28,7 @@ struct irqsteer_irqchip_data {
spinlock_t lock;
struct platform_device *pdev;
void __iomem *regs;
+ struct clk *ipg_clk;
int irq;
int channum;
struct irq_domain *domain;
@@ -170,10 +172,23 @@ static int imx_irqsteer_probe(struct platform_device *pdev)
return -ENODEV;
}
+ irqsteer_data->ipg_clk = devm_clk_get(&pdev->dev, "ipg");
+ if (IS_ERR(irqsteer_data->ipg_clk)) {
+ ret = PTR_ERR(irqsteer_data->ipg_clk);
+ dev_err(&pdev->dev, "failed to get ipg clk: %d\n", ret);
+ return ret;
+ }
+
irqsteer_data->channum = channum;
irqsteer_data->pdev = pdev;
spin_lock_init(&irqsteer_data->lock);
+ ret = clk_prepare_enable(irqsteer_data->ipg_clk);
+ if (ret) {
+ dev_err(&pdev->dev, "failed to enable ipg clk: %d\n", ret);
+ return ret;
+ }
+
imx_irqsteer_init(irqsteer_data);
irqsteer_data->domain = irq_domain_add_linear(np,
@@ -204,6 +219,7 @@ static int imx_irqsteer_remove(struct platform_device *pdev)
irq_domain_remove(irqsteer_data->domain);
platform_set_drvdata(pdev, NULL);
+ clk_disable_unprepare(irqsteer_data->ipg_clk);
return 0;
}