pwm: mediatek: Add MT7628 support
authorJohn Crispin <john@phrozen.org>
Wed, 25 Jul 2018 09:52:09 +0000 (11:52 +0200)
committerThierry Reding <thierry.reding@gmail.com>
Mon, 20 Aug 2018 09:36:07 +0000 (11:36 +0200)
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: John Crispin <john@phrozen.org>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
drivers/pwm/Kconfig
drivers/pwm/pwm-mediatek.c

index a4d262db9945ff10a1d0f67409cb0b03c76026b8..504d252716f2e10db4914c8de651dff05106b82c 100644 (file)
@@ -286,7 +286,7 @@ config PWM_MTK_DISP
 
 config PWM_MEDIATEK
        tristate "MediaTek PWM support"
-       depends on ARCH_MEDIATEK || COMPILE_TEST
+       depends on ARCH_MEDIATEK || RALINK || COMPILE_TEST
        help
          Generic PWM framework driver for Mediatek ARM SoC.
 
index 328c124773b23e6501a70f8320d02f4900e6d71a..eb6674ce995ff1bda4da866cd06edb553f78a59a 100644 (file)
@@ -57,6 +57,7 @@ static const char * const mtk_pwm_clk_name[MTK_CLK_MAX] = {
 struct mtk_pwm_platform_data {
        unsigned int num_pwms;
        bool pwm45_fixup;
+       bool has_clks;
 };
 
 /**
@@ -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);
        int ret;
 
+       if (!pc->soc->has_clks)
+               return 0;
+
        ret = clk_prepare_enable(pc->clks[MTK_CLK_TOP]);
        if (ret < 0)
                return ret;
@@ -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);
 
+       if (!pc->soc->has_clks)
+               return;
+
        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_TOP]);
@@ -239,7 +246,7 @@ static int mtk_pwm_probe(struct platform_device *pdev)
        if (IS_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]);
                if (IS_ERR(pc->clks[i])) {
                        dev_err(&pdev->dev, "clock: %s fail: %ld\n",
@@ -274,22 +281,32 @@ static int mtk_pwm_remove(struct platform_device *pdev)
 static const struct mtk_pwm_platform_data mt2712_pwm_data = {
        .num_pwms = 8,
        .pwm45_fixup = false,
+       .has_clks = true,
 };
 
 static const struct mtk_pwm_platform_data mt7622_pwm_data = {
        .num_pwms = 6,
        .pwm45_fixup = false,
+       .has_clks = true,
 };
 
 static const struct mtk_pwm_platform_data mt7623_pwm_data = {
        .num_pwms = 5,
        .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[] = {
        { .compatible = "mediatek,mt2712-pwm", .data = &mt2712_pwm_data },
        { .compatible = "mediatek,mt7622-pwm", .data = &mt7622_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);