2 * Tegra ACONNECT Bus Driver
4 * Copyright (C) 2016, NVIDIA CORPORATION. All rights reserved.
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
11 #include <linux/clk.h>
12 #include <linux/module.h>
13 #include <linux/of_platform.h>
14 #include <linux/platform_device.h>
15 #include <linux/pm_runtime.h>
17 struct tegra_aconnect
{
19 struct clk
*apb2ape_clk
;
22 static int tegra_aconnect_probe(struct platform_device
*pdev
)
24 struct tegra_aconnect
*aconnect
;
26 if (!pdev
->dev
.of_node
)
29 aconnect
= devm_kzalloc(&pdev
->dev
, sizeof(struct tegra_aconnect
),
34 aconnect
->ape_clk
= devm_clk_get(&pdev
->dev
, "ape");
35 if (IS_ERR(aconnect
->ape_clk
)) {
36 dev_err(&pdev
->dev
, "Can't retrieve ape clock\n");
37 return PTR_ERR(aconnect
->ape_clk
);
40 aconnect
->apb2ape_clk
= devm_clk_get(&pdev
->dev
, "apb2ape");
41 if (IS_ERR(aconnect
->apb2ape_clk
)) {
42 dev_err(&pdev
->dev
, "Can't retrieve apb2ape clock\n");
43 return PTR_ERR(aconnect
->apb2ape_clk
);
46 dev_set_drvdata(&pdev
->dev
, aconnect
);
47 pm_runtime_enable(&pdev
->dev
);
49 of_platform_populate(pdev
->dev
.of_node
, NULL
, NULL
, &pdev
->dev
);
51 dev_info(&pdev
->dev
, "Tegra ACONNECT bus registered\n");
56 static void tegra_aconnect_remove(struct platform_device
*pdev
)
58 pm_runtime_disable(&pdev
->dev
);
61 static int tegra_aconnect_runtime_resume(struct device
*dev
)
63 struct tegra_aconnect
*aconnect
= dev_get_drvdata(dev
);
66 ret
= clk_prepare_enable(aconnect
->ape_clk
);
68 dev_err(dev
, "ape clk_enable failed: %d\n", ret
);
72 ret
= clk_prepare_enable(aconnect
->apb2ape_clk
);
74 clk_disable_unprepare(aconnect
->ape_clk
);
75 dev_err(dev
, "apb2ape clk_enable failed: %d\n", ret
);
82 static int tegra_aconnect_runtime_suspend(struct device
*dev
)
84 struct tegra_aconnect
*aconnect
= dev_get_drvdata(dev
);
86 clk_disable_unprepare(aconnect
->ape_clk
);
87 clk_disable_unprepare(aconnect
->apb2ape_clk
);
92 static const struct dev_pm_ops tegra_aconnect_pm_ops
= {
93 SET_RUNTIME_PM_OPS(tegra_aconnect_runtime_suspend
,
94 tegra_aconnect_runtime_resume
, NULL
)
95 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend
,
96 pm_runtime_force_resume
)
99 static const struct of_device_id tegra_aconnect_of_match
[] = {
100 { .compatible
= "nvidia,tegra210-aconnect", },
103 MODULE_DEVICE_TABLE(of
, tegra_aconnect_of_match
);
105 static struct platform_driver tegra_aconnect_driver
= {
106 .probe
= tegra_aconnect_probe
,
107 .remove
= tegra_aconnect_remove
,
109 .name
= "tegra-aconnect",
110 .of_match_table
= tegra_aconnect_of_match
,
111 .pm
= &tegra_aconnect_pm_ops
,
114 module_platform_driver(tegra_aconnect_driver
);
116 MODULE_DESCRIPTION("NVIDIA Tegra ACONNECT Bus Driver");
117 MODULE_AUTHOR("Jon Hunter <jonathanh@nvidia.com>");
118 MODULE_LICENSE("GPL v2");