usb: xhci-mtk: use clock bulk to get clocks
Use clock bulk helpers to get/enable/disable clocks, meanwhile make sys_ck optional, then will be easier to handle clocks. Signed-off-by: Chunfeng Yun <chunfeng.yun@mediatek.com> Link: https://lore.kernel.org/r/1618031406-15347-4-git-send-email-chunfeng.yun@mediatek.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
04284eb74e
commit
7fed6368eb
@ -7,7 +7,6 @@
|
||||
* Chunfeng Yun <chunfeng.yun@mediatek.com>
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/iopoll.h>
|
||||
#include <linux/kernel.h>
|
||||
@ -220,89 +219,6 @@ static int xhci_mtk_ssusb_config(struct xhci_hcd_mtk *mtk)
|
||||
return xhci_mtk_host_enable(mtk);
|
||||
}
|
||||
|
||||
static int xhci_mtk_clks_get(struct xhci_hcd_mtk *mtk)
|
||||
{
|
||||
struct device *dev = mtk->dev;
|
||||
|
||||
mtk->sys_clk = devm_clk_get(dev, "sys_ck");
|
||||
if (IS_ERR(mtk->sys_clk)) {
|
||||
dev_err(dev, "fail to get sys_ck\n");
|
||||
return PTR_ERR(mtk->sys_clk);
|
||||
}
|
||||
|
||||
mtk->xhci_clk = devm_clk_get_optional(dev, "xhci_ck");
|
||||
if (IS_ERR(mtk->xhci_clk))
|
||||
return PTR_ERR(mtk->xhci_clk);
|
||||
|
||||
mtk->ref_clk = devm_clk_get_optional(dev, "ref_ck");
|
||||
if (IS_ERR(mtk->ref_clk))
|
||||
return PTR_ERR(mtk->ref_clk);
|
||||
|
||||
mtk->mcu_clk = devm_clk_get_optional(dev, "mcu_ck");
|
||||
if (IS_ERR(mtk->mcu_clk))
|
||||
return PTR_ERR(mtk->mcu_clk);
|
||||
|
||||
mtk->dma_clk = devm_clk_get_optional(dev, "dma_ck");
|
||||
return PTR_ERR_OR_ZERO(mtk->dma_clk);
|
||||
}
|
||||
|
||||
static int xhci_mtk_clks_enable(struct xhci_hcd_mtk *mtk)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = clk_prepare_enable(mtk->ref_clk);
|
||||
if (ret) {
|
||||
dev_err(mtk->dev, "failed to enable ref_clk\n");
|
||||
goto ref_clk_err;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(mtk->sys_clk);
|
||||
if (ret) {
|
||||
dev_err(mtk->dev, "failed to enable sys_clk\n");
|
||||
goto sys_clk_err;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(mtk->xhci_clk);
|
||||
if (ret) {
|
||||
dev_err(mtk->dev, "failed to enable xhci_clk\n");
|
||||
goto xhci_clk_err;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(mtk->mcu_clk);
|
||||
if (ret) {
|
||||
dev_err(mtk->dev, "failed to enable mcu_clk\n");
|
||||
goto mcu_clk_err;
|
||||
}
|
||||
|
||||
ret = clk_prepare_enable(mtk->dma_clk);
|
||||
if (ret) {
|
||||
dev_err(mtk->dev, "failed to enable dma_clk\n");
|
||||
goto dma_clk_err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
dma_clk_err:
|
||||
clk_disable_unprepare(mtk->mcu_clk);
|
||||
mcu_clk_err:
|
||||
clk_disable_unprepare(mtk->xhci_clk);
|
||||
xhci_clk_err:
|
||||
clk_disable_unprepare(mtk->sys_clk);
|
||||
sys_clk_err:
|
||||
clk_disable_unprepare(mtk->ref_clk);
|
||||
ref_clk_err:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void xhci_mtk_clks_disable(struct xhci_hcd_mtk *mtk)
|
||||
{
|
||||
clk_disable_unprepare(mtk->dma_clk);
|
||||
clk_disable_unprepare(mtk->mcu_clk);
|
||||
clk_disable_unprepare(mtk->xhci_clk);
|
||||
clk_disable_unprepare(mtk->sys_clk);
|
||||
clk_disable_unprepare(mtk->ref_clk);
|
||||
}
|
||||
|
||||
/* only clocks can be turn off for ip-sleep wakeup mode */
|
||||
static void usb_wakeup_ip_sleep_set(struct xhci_hcd_mtk *mtk, bool enable)
|
||||
{
|
||||
@ -367,6 +283,19 @@ static void usb_wakeup_set(struct xhci_hcd_mtk *mtk, bool enable)
|
||||
usb_wakeup_ip_sleep_set(mtk, enable);
|
||||
}
|
||||
|
||||
static int xhci_mtk_clks_get(struct xhci_hcd_mtk *mtk)
|
||||
{
|
||||
struct clk_bulk_data *clks = mtk->clks;
|
||||
|
||||
clks[0].id = "sys_ck";
|
||||
clks[1].id = "xhci_ck";
|
||||
clks[2].id = "ref_ck";
|
||||
clks[3].id = "mcu_ck";
|
||||
clks[4].id = "dma_ck";
|
||||
|
||||
return devm_clk_bulk_get_optional(mtk->dev, BULK_CLKS_NUM, clks);
|
||||
}
|
||||
|
||||
static int xhci_mtk_ldos_enable(struct xhci_hcd_mtk *mtk)
|
||||
{
|
||||
int ret;
|
||||
@ -532,7 +461,7 @@ static int xhci_mtk_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
goto disable_pm;
|
||||
|
||||
ret = xhci_mtk_clks_enable(mtk);
|
||||
ret = clk_bulk_prepare_enable(BULK_CLKS_NUM, mtk->clks);
|
||||
if (ret)
|
||||
goto disable_ldos;
|
||||
|
||||
@ -636,7 +565,7 @@ put_usb2_hcd:
|
||||
usb_put_hcd(hcd);
|
||||
|
||||
disable_clk:
|
||||
xhci_mtk_clks_disable(mtk);
|
||||
clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
|
||||
|
||||
disable_ldos:
|
||||
xhci_mtk_ldos_disable(mtk);
|
||||
@ -666,7 +595,7 @@ static int xhci_mtk_remove(struct platform_device *pdev)
|
||||
usb_put_hcd(shared_hcd);
|
||||
usb_put_hcd(hcd);
|
||||
xhci_mtk_sch_exit(mtk);
|
||||
xhci_mtk_clks_disable(mtk);
|
||||
clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
|
||||
xhci_mtk_ldos_disable(mtk);
|
||||
|
||||
pm_runtime_disable(dev);
|
||||
@ -693,7 +622,7 @@ static int __maybe_unused xhci_mtk_suspend(struct device *dev)
|
||||
if (ret)
|
||||
goto restart_poll_rh;
|
||||
|
||||
xhci_mtk_clks_disable(mtk);
|
||||
clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
|
||||
usb_wakeup_set(mtk, true);
|
||||
return 0;
|
||||
|
||||
@ -714,7 +643,7 @@ static int __maybe_unused xhci_mtk_resume(struct device *dev)
|
||||
int ret;
|
||||
|
||||
usb_wakeup_set(mtk, false);
|
||||
ret = xhci_mtk_clks_enable(mtk);
|
||||
ret = clk_bulk_prepare_enable(BULK_CLKS_NUM, mtk->clks);
|
||||
if (ret)
|
||||
goto enable_wakeup;
|
||||
|
||||
@ -730,7 +659,7 @@ static int __maybe_unused xhci_mtk_resume(struct device *dev)
|
||||
return 0;
|
||||
|
||||
disable_clks:
|
||||
xhci_mtk_clks_disable(mtk);
|
||||
clk_bulk_disable_unprepare(BULK_CLKS_NUM, mtk->clks);
|
||||
enable_wakeup:
|
||||
usb_wakeup_set(mtk, true);
|
||||
return ret;
|
||||
|
@ -9,8 +9,12 @@
|
||||
#ifndef _XHCI_MTK_H_
|
||||
#define _XHCI_MTK_H_
|
||||
|
||||
#include <linux/clk.h>
|
||||
|
||||
#include "xhci.h"
|
||||
|
||||
#define BULK_CLKS_NUM 5
|
||||
|
||||
/**
|
||||
* To simplify scheduler algorithm, set a upper limit for ESIT,
|
||||
* if a synchromous ep's ESIT is larger than @XHCI_MTK_MAX_ESIT,
|
||||
@ -140,11 +144,7 @@ struct xhci_hcd_mtk {
|
||||
int u3p_dis_msk;
|
||||
struct regulator *vusb33;
|
||||
struct regulator *vbus;
|
||||
struct clk *sys_clk; /* sys and mac clock */
|
||||
struct clk *xhci_clk;
|
||||
struct clk *ref_clk;
|
||||
struct clk *mcu_clk;
|
||||
struct clk *dma_clk;
|
||||
struct clk_bulk_data clks[BULK_CLKS_NUM];
|
||||
struct regmap *pericfg;
|
||||
struct phy **phys;
|
||||
int num_phys;
|
||||
|
Loading…
x
Reference in New Issue
Block a user