Received: by 10.223.176.5 with SMTP id f5csp415440wra; Wed, 7 Feb 2018 01:15:41 -0800 (PST) X-Google-Smtp-Source: AH8x224IxMLLHT41H70iNXukE4yT9InSbvS06GXzS5Unb7vGrfDpym3Z8eC+Qm3qSY6P+o9+O3Ol X-Received: by 2002:a17:902:8304:: with SMTP id bd4-v6mr5421031plb.123.1517994941872; Wed, 07 Feb 2018 01:15:41 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1517994941; cv=none; d=google.com; s=arc-20160816; b=HYWyXFCfkP7hFPCPyZIU81pqHEDUICWkzlychCSTiIhGurCCF2ZdLSOgf2hTtnLoNa ujDizpb8LEK2N0lsONet5z9YUCNhBB2nnmnFNC5EnZNeZEQKNGPLKDRhlMqcOUj6BT0N l3Rv8FqS15UUemGQZZvXTPgUcUWB81YpZndPhCMd2h8y5dGBjR4f5NMcg2gKxPmEN8LE IPIVcELoQYqdXoHpTboVc6YEl/8WpEKDe0yhDrMc33v6uBAAroMY+7ggaMoyqvB+WP3T YaqObhuR9dK1JKwW8hChoF9FKQnbtFcVS+vhM30KVwo+YRrbK2U6r/vwNLXaCRZZFlPc /0vQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:message-id:date:subject:cc :to:from:arc-authentication-results; bh=pg2uxz/3MQTZC/UeBmlBa+oxoRlazaN0RjdMDNJCip4=; b=0uMvUDz29Esj7YZspdzD0iqQoy/zEpaml2vyTTkCWsYUjFUac9VBCxisGMTCMAXR2S DXhj73IuIBsHtY7/nshFUbkPGkEml1LxtYAnnp8BnwyxyiTn29OGe+QSdy8d6s3cyYVV 7OJrIM1S4SY0z8RjJEhNBhnBOhfWB8zrC24MfqlL6Al79JBaADOa+uQYDHCgn9fgKaSa E92oZ06wSbj2ghmCWE/oijNFyeJvp1Bugvdq+gL/Fp8a7qbAN1oWdxXCCMWvkbg26QFS scKRkW/Fiaz2DsgCd1mv9hSv5c+oin164kjK/Gpc+6l8wDlR52DJ72v1qefZBNfCoHjN qTFQ== 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 b184si679829pgc.786.2018.02.07.01.15.27; Wed, 07 Feb 2018 01:15:41 -0800 (PST) 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 S1753700AbeBGJOZ (ORCPT + 99 others); Wed, 7 Feb 2018 04:14:25 -0500 Received: from mailgw02.mediatek.com ([210.61.82.184]:58071 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1753436AbeBGJOV (ORCPT ); Wed, 7 Feb 2018 04:14:21 -0500 X-UUID: ad6071150561442c8e22832ece5fc4e7-20180207 Received: from mtkcas09.mediatek.inc [(172.21.101.178)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 451692702; Wed, 07 Feb 2018 17:14:19 +0800 Received: from mtkcas08.mediatek.inc (172.21.101.126) by mtkmbs08n1.mediatek.inc (172.21.101.55) with Microsoft SMTP Server (TLS) id 15.0.1210.3; Wed, 7 Feb 2018 17:14:17 +0800 Received: from mtkswgap22.mediatek.inc (172.21.77.33) by mtkcas08.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1210.3 via Frontend Transport; Wed, 7 Feb 2018 17:14:18 +0800 From: To: , CC: , , , , Sean Wang , Zhi Mao , John Crispin Subject: [PATCH v2] pwm: mediatek: fix up PWM4 and PWM5 malfunction on MT7623 Date: Wed, 7 Feb 2018 17:14:17 +0800 Message-ID: X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 Content-Type: text/plain X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Sean Wang 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 Signed-off-by: Sean Wang Cc: Zhi Mao Cc: John Crispin Cc: Matthias Brugger --- drivers/pwm/pwm-mediatek.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/drivers/pwm/pwm-mediatek.c b/drivers/pwm/pwm-mediatek.c index f5d97e0..796baea 100644 --- 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_name[MTK_CLK_MAX] = { 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_chip *chip, struct pwm_device *pwm, { 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_chip *chip, struct pwm_device *pwm, 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_device *pdev) 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 platform_device *pdev) 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[] = { -- 2.7.4