Commit 8cdc43af authored by John Crispin's avatar John Crispin Committed by Thierry Reding

pwm: mediatek: Add MT7628 support

Add support for MT7628. The SoC is legacy MIPS and hence has no complex
clock tree. This patch add an extra flag to the SoC specific data
indicating, that no clocks are present.
Signed-off-by: default avatarJohn Crispin <john@phrozen.org>
Reviewed-by: default avatarMatthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent 935be8e0
...@@ -286,7 +286,7 @@ config PWM_MTK_DISP ...@@ -286,7 +286,7 @@ config PWM_MTK_DISP
config PWM_MEDIATEK config PWM_MEDIATEK
tristate "MediaTek PWM support" tristate "MediaTek PWM support"
depends on ARCH_MEDIATEK || COMPILE_TEST depends on ARCH_MEDIATEK || RALINK || COMPILE_TEST
help help
Generic PWM framework driver for Mediatek ARM SoC. Generic PWM framework driver for Mediatek ARM SoC.
......
...@@ -57,6 +57,7 @@ static const char * const mtk_pwm_clk_name[MTK_CLK_MAX] = { ...@@ -57,6 +57,7 @@ static const char * const mtk_pwm_clk_name[MTK_CLK_MAX] = {
struct mtk_pwm_platform_data { struct mtk_pwm_platform_data {
unsigned int num_pwms; unsigned int num_pwms;
bool pwm45_fixup; bool pwm45_fixup;
bool has_clks;
}; };
/** /**
...@@ -86,6 +87,9 @@ static int mtk_pwm_clk_enable(struct pwm_chip *chip, struct pwm_device *pwm) ...@@ -86,6 +87,9 @@ static int mtk_pwm_clk_enable(struct pwm_chip *chip, struct pwm_device *pwm)
struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip); struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip);
int ret; int ret;
if (!pc->soc->has_clks)
return 0;
ret = clk_prepare_enable(pc->clks[MTK_CLK_TOP]); ret = clk_prepare_enable(pc->clks[MTK_CLK_TOP]);
if (ret < 0) if (ret < 0)
return ret; return ret;
...@@ -112,6 +116,9 @@ static void mtk_pwm_clk_disable(struct pwm_chip *chip, struct pwm_device *pwm) ...@@ -112,6 +116,9 @@ static void mtk_pwm_clk_disable(struct pwm_chip *chip, struct pwm_device *pwm)
{ {
struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip); struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip);
if (!pc->soc->has_clks)
return;
clk_disable_unprepare(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]); clk_disable_unprepare(pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]);
clk_disable_unprepare(pc->clks[MTK_CLK_MAIN]); clk_disable_unprepare(pc->clks[MTK_CLK_MAIN]);
clk_disable_unprepare(pc->clks[MTK_CLK_TOP]); clk_disable_unprepare(pc->clks[MTK_CLK_TOP]);
...@@ -239,7 +246,7 @@ static int mtk_pwm_probe(struct platform_device *pdev) ...@@ -239,7 +246,7 @@ static int mtk_pwm_probe(struct platform_device *pdev)
if (IS_ERR(pc->regs)) if (IS_ERR(pc->regs))
return PTR_ERR(pc->regs); return PTR_ERR(pc->regs);
for (i = 0; i < data->num_pwms + 2; i++) { for (i = 0; i < data->num_pwms + 2 && pc->soc->has_clks; i++) {
pc->clks[i] = devm_clk_get(&pdev->dev, mtk_pwm_clk_name[i]); pc->clks[i] = devm_clk_get(&pdev->dev, mtk_pwm_clk_name[i]);
if (IS_ERR(pc->clks[i])) { if (IS_ERR(pc->clks[i])) {
dev_err(&pdev->dev, "clock: %s fail: %ld\n", dev_err(&pdev->dev, "clock: %s fail: %ld\n",
...@@ -274,22 +281,32 @@ static int mtk_pwm_remove(struct platform_device *pdev) ...@@ -274,22 +281,32 @@ static int mtk_pwm_remove(struct platform_device *pdev)
static const struct mtk_pwm_platform_data mt2712_pwm_data = { static const struct mtk_pwm_platform_data mt2712_pwm_data = {
.num_pwms = 8, .num_pwms = 8,
.pwm45_fixup = false, .pwm45_fixup = false,
.has_clks = true,
}; };
static const struct mtk_pwm_platform_data mt7622_pwm_data = { static const struct mtk_pwm_platform_data mt7622_pwm_data = {
.num_pwms = 6, .num_pwms = 6,
.pwm45_fixup = false, .pwm45_fixup = false,
.has_clks = true,
}; };
static const struct mtk_pwm_platform_data mt7623_pwm_data = { static const struct mtk_pwm_platform_data mt7623_pwm_data = {
.num_pwms = 5, .num_pwms = 5,
.pwm45_fixup = true, .pwm45_fixup = true,
.has_clks = true,
};
static const struct mtk_pwm_platform_data mt7628_pwm_data = {
.num_pwms = 4,
.pwm45_fixup = true,
.has_clks = false,
}; };
static const struct of_device_id mtk_pwm_of_match[] = { static const struct of_device_id mtk_pwm_of_match[] = {
{ .compatible = "mediatek,mt2712-pwm", .data = &mt2712_pwm_data }, { .compatible = "mediatek,mt2712-pwm", .data = &mt2712_pwm_data },
{ .compatible = "mediatek,mt7622-pwm", .data = &mt7622_pwm_data }, { .compatible = "mediatek,mt7622-pwm", .data = &mt7622_pwm_data },
{ .compatible = "mediatek,mt7623-pwm", .data = &mt7623_pwm_data }, { .compatible = "mediatek,mt7623-pwm", .data = &mt7623_pwm_data },
{ .compatible = "mediatek,mt7628-pwm", .data = &mt7628_pwm_data },
{ }, { },
}; };
MODULE_DEVICE_TABLE(of, mtk_pwm_of_match); MODULE_DEVICE_TABLE(of, mtk_pwm_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment