Received: by 10.192.165.148 with SMTP id m20csp2526735imm; Sun, 22 Apr 2018 08:53:33 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+nHsPCzTPaPkL1XVpxeLvPVFAdbGjb7zn3gd/2ekEB1qvjXcm0/CiH81vzBIPEo/octYkd X-Received: by 2002:a17:902:9688:: with SMTP id n8-v6mr17723381plp.366.1524412413868; Sun, 22 Apr 2018 08:53:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524412413; cv=none; d=google.com; s=arc-20160816; b=WC8+3sSGjGJRAxZHJZDQ1QEfP3C/nWYzt7bMG27Wl2v6h8Xbs71LUp6iwFZn/O04C3 5YQNf/drjHADXp3j6mYumufaqQXOqZO8jyUCI0qjTOopMx/EIeGhCSOipwCg8qTmStzJ q3c5sSAYW/zUYqNaGeL7jR8fGbGDZxGHrGrhzfG/PiuUELWrg8wVZxTYo+3CZn2OcG0b +/1Nntii6WZl4Lp7gRP6TMvub4l/gleq58NoLCZdqu1yYzzI44HdbgYPsS6WzUejMxR3 YrhlMEZ1ZN9NKX4NorAEPlbbR0SkJmZJQMD8sC0I9RAfmsPw6ffQFCpgLipuhHEBUOVr Ii0Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=CtUaahiZtycWWYompxwRDji4YJlX8yH5Rn+1bim4ZkY=; b=kXAhJrxMDv7OEACveAki+qiVPJgsTaOeif9DMck+3BllAv6DComLPAd67yXfT7dPfz AEaOUGwXhD+fzvqNl1azXCVDL4c7wj6EFuPg72XleTTao6zz7AlmFPtOK+VHZ+dpxerg Q7l7BG2X5P6AuWC3mJXqW9UWAckBWTxEEq3HVYAR+CX5h63JTj8EKcZ4/sm50myX4Xyh pOvPvVAMfSHF57c4IOZf+3hSJnQB8uGyHZ1il10Bn0/QQ06OqGZLT0OSQ3M/AJgrcs/S 8zsUuqAKPJ1Vw8bDDXVsJw/pk3Ts8zmNJdKrQ3gimQ/zwCHiLSLhlWESrAxfB2n0Jn2K 2OmA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id i7si8804487pgf.521.2018.04.22.08.53.19; Sun, 22 Apr 2018 08:53:33 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754631AbeDVOBA (ORCPT + 99 others); Sun, 22 Apr 2018 10:01:00 -0400 Received: from mail.linuxfoundation.org ([140.211.169.12]:47660 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754611AbeDVOAx (ORCPT ); Sun, 22 Apr 2018 10:00:53 -0400 Received: from localhost (LFbn-1-12247-202.w90-92.abo.wanadoo.fr [90.92.61.202]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id BE22BBC8; Sun, 22 Apr 2018 14:00:52 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Sean Wang , Matthias Brugger , Zhi Mao , John Crispin , Thierry Reding Subject: [PATCH 4.16 145/196] pwm: mediatek: Fix up PWM4 and PWM5 malfunction on MT7623 Date: Sun, 22 Apr 2018 15:52:45 +0200 Message-Id: <20180422135111.731088434@linuxfoundation.org> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180422135104.278511750@linuxfoundation.org> References: <20180422135104.278511750@linuxfoundation.org> User-Agent: quilt/0.65 X-stable: review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.16-stable review patch. If anyone has any objections, please let me know. ------------------ From: Sean Wang commit 360cc036563db27881ce08049f69138438f2ddd0 upstream. Since the offset for both registers, PWMDWIDTH and PWMTHRES, used to control PWM4 or PWM5 are distinct from the other PWMs, whose wrong programming on PWM hardware causes waveform cannot be output as expected. Thus, the patch adds the extra condition for fixing up the weird case to let PWM4 or PWM5 able to work on MT7623. v1 -> v2: use pwm45_fixup naming instead of pwm45_quirk v2 -> v3: add more tags for Reviewed-by, Fixes, and Cc stable Cc: stable@vger.kernel.org Fixes: caf065f8fd58 ("pwm: Add MediaTek PWM support") Signed-off-by: Sean Wang Reviewed-by: Matthias Brugger Cc: Zhi Mao Cc: John Crispin Cc: Matthias Brugger Signed-off-by: Thierry Reding Signed-off-by: Greg Kroah-Hartman --- drivers/pwm/pwm-mediatek.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) --- a/drivers/pwm/pwm-mediatek.c +++ b/drivers/pwm/pwm-mediatek.c @@ -29,7 +29,9 @@ #define PWMGDUR 0x0c #define PWMWAVENUM 0x28 #define PWMDWIDTH 0x2c +#define PWM45DWIDTH_FIXUP 0x30 #define PWMTHRES 0x30 +#define PWM45THRES_FIXUP 0x34 #define PWM_CLK_DIV_MAX 7 @@ -54,6 +56,7 @@ static const char * const mtk_pwm_clk_na struct mtk_pwm_platform_data { unsigned int num_pwms; + bool pwm45_fixup; }; /** @@ -66,6 +69,7 @@ struct mtk_pwm_chip { struct pwm_chip chip; void __iomem *regs; struct clk *clks[MTK_CLK_MAX]; + const struct mtk_pwm_platform_data *soc; }; static const unsigned int mtk_pwm_reg_offset[] = { @@ -131,7 +135,8 @@ static int mtk_pwm_config(struct pwm_chi { struct mtk_pwm_chip *pc = to_mtk_pwm_chip(chip); struct clk *clk = pc->clks[MTK_CLK_PWM1 + pwm->hwpwm]; - u32 resolution, clkdiv = 0; + u32 resolution, clkdiv = 0, reg_width = PWMDWIDTH, + reg_thres = PWMTHRES; int ret; ret = mtk_pwm_clk_enable(chip, pwm); @@ -151,9 +156,18 @@ static int mtk_pwm_config(struct pwm_chi return -EINVAL; } + if (pc->soc->pwm45_fixup && pwm->hwpwm > 2) { + /* + * PWM[4,5] has distinct offset for PWMDWIDTH and PWMTHRES + * from the other PWMs on MT7623. + */ + reg_width = PWM45DWIDTH_FIXUP; + reg_thres = PWM45THRES_FIXUP; + } + mtk_pwm_writel(pc, pwm->hwpwm, PWMCON, BIT(15) | clkdiv); - mtk_pwm_writel(pc, pwm->hwpwm, PWMDWIDTH, period_ns / resolution); - mtk_pwm_writel(pc, pwm->hwpwm, PWMTHRES, duty_ns / resolution); + mtk_pwm_writel(pc, pwm->hwpwm, reg_width, period_ns / resolution); + mtk_pwm_writel(pc, pwm->hwpwm, reg_thres, duty_ns / resolution); mtk_pwm_clk_disable(chip, pwm); @@ -211,6 +225,7 @@ static int mtk_pwm_probe(struct platform data = of_device_get_match_data(&pdev->dev); if (data == NULL) return -EINVAL; + pc->soc = data; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); pc->regs = devm_ioremap_resource(&pdev->dev, res); @@ -251,14 +266,17 @@ static int mtk_pwm_remove(struct platfor static const struct mtk_pwm_platform_data mt2712_pwm_data = { .num_pwms = 8, + .pwm45_fixup = false, }; static const struct mtk_pwm_platform_data mt7622_pwm_data = { .num_pwms = 6, + .pwm45_fixup = false, }; static const struct mtk_pwm_platform_data mt7623_pwm_data = { .num_pwms = 5, + .pwm45_fixup = true, }; static const struct of_device_id mtk_pwm_of_match[] = {