From patchwork Tue Aug 8 15:41:28 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Wu X-Patchwork-Id: 9888865 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 2D389601EB for ; Tue, 8 Aug 2017 17:50:30 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 1B7AA28880 for ; Tue, 8 Aug 2017 17:50:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 0FF37289BC; Tue, 8 Aug 2017 17:50:30 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-0.2 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID, RCVD_IN_DNSWL_NONE, URIBL_BLACK autolearn=no version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [65.50.211.133]) (using TLSv1.2 with cipher AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E29D328880 for ; Tue, 8 Aug 2017 17:50:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:MIME-Version:Cc:List-Subscribe: List-Help:List-Post:List-Archive:List-Unsubscribe:List-Id:References: In-Reply-To:Message-Id:Date:Subject:To:From:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=+HsUWdMHdLF/On5gFS0f9xDM8u7X7yks8YSNE3U10tY=; b=lvRVsCRPXRwKBKaH+h7qqxIekp mqVFxYxnoLuTG7CeOD1h7+wk6VvVUvK60hj8ZlifSh9FVqiedaQYPO1IL1qAHgYajCZBAqB9sJVPI x4076OqgxPqzye5ktI+Dv5m9c9c5ryXGT4i3lS0a4/F1bGerRXuC1D9zhgc6Ct9zLiQbTNS6nQWMj kGtKolicm+0XuBjgGs1xTgB4bI24ZmscfGiaR788Y0xk/IT0pigo1Kmq8I8LlFc5IwyxYWn2ZGpxF hD3GN/Ga2E3xqC/ZcQe8rCI/0DA3ASI0sOrF8F4Eb4ZLuI9Ajx8g+DHtqXhcc7+zBV04QGJRZA0VV oynq5sXQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.87 #1 (Red Hat Linux)) id 1df8eC-0006YA-8X; Tue, 08 Aug 2017 17:50:28 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1df8d8-0004Ly-TC; Tue, 08 Aug 2017 17:49:23 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=References:In-Reply-To:Message-Id:Date: Subject:Cc:To:From:Sender:Reply-To:MIME-Version:Content-Type: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=fxOD8kOwCq+ztUuQwT1w7dMXV8U66+fsWZb99ZOhZKY=; b=QaP+A0ecfuW0i3YhWquD/5zt1 hG6yU9tReSPh9zn15J4ukKoA6vgnphfrnWS+2LxldEN8JaHabSpieATKOfyp5FctAhX4/F1OgQDM/ hdkJleqDyInxeh2/guv8zXVTu822K4nWGLLKOLYHe27Qpdt0JrplojuWmBUYMEWHUabmOWnGfpI6K WggYCke0KkSUdyEfLKZjdVZUjhwpV+2JqWKwn0HC6YkPlEpugGsv300EDigAnxkwPFudGul24SbgJ dZhurTfKe6XmLXRdvYCSN/7xcsVVG8xVvF3tWwq53IFtmc90wCk8z6HhwaHm8NUvEDHy3D6kbUrSn s7ugEnhJA==; Received: from lucky1.263xmail.com ([211.157.147.133]) by merlin.infradead.org with esmtps (Exim 4.87 #1 (Red Hat Linux)) id 1df6Ze-0003oT-RE; Tue, 08 Aug 2017 15:37:40 +0000 Received: from david.wu?rock-chips.com (unknown [192.168.167.231]) by lucky1.263xmail.com (Postfix) with ESMTP id C113C8F77A; Tue, 8 Aug 2017 23:37:00 +0800 (CST) X-263anti-spam: KSV:0; X-MAIL-GRAY: 1 X-MAIL-DELIVERY: 0 X-KSVirus-check: 0 X-ABS-CHECKED: 4 Received: from localhost.localdomain (localhost [127.0.0.1]) by smtp.263.net (Postfix) with ESMTPA id 23F59387; Tue, 8 Aug 2017 23:36:58 +0800 (CST) X-RL-SENDER: david.wu@rock-chips.com X-FST-TO: thierry.reding@gmail.com X-SENDER-IP: 58.22.7.114 X-LOGIN-NAME: david.wu@rock-chips.com X-UNIQUE-TAG: <4f40382b7ee177b157033a8d6f15ea03> X-ATTACHMENT-NUM: 0 X-SENDER: wdc@rock-chips.com X-DNS-TYPE: 0 Received: from localhost.localdomain (unknown [58.22.7.114]) by smtp.263.net (Postfix) whith ESMTP id 10778CYO7DC; Tue, 08 Aug 2017 23:37:00 +0800 (CST) From: David Wu To: thierry.reding@gmail.com, heiko@sntech.de, boris.brezillon@free-electrons.com, robh+dt@kernel.org Subject: [PATCH v3 5/7] pwm: rockchip: Use same pwm ops for each IP Date: Tue, 8 Aug 2017 23:41:28 +0800 Message-Id: <1502206888-24302-1-git-send-email-david.wu@rock-chips.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1502206715-24174-1-git-send-email-david.wu@rock-chips.com> References: <1502206715-24174-1-git-send-email-david.wu@rock-chips.com> X-BeenThere: linux-rockchip@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: Upstream kernel work for Rockchip platforms List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, huangtao@rock-chips.com, linux-pwm@vger.kernel.org, catalin.marinas@arm.com, briannorris@chromium.org, dianders@chromium.org, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, devicetree@vger.kernel.org, David Wu , linux-arm-kernel@lists.infradead.org MIME-Version: 1.0 Sender: "Linux-rockchip" Errors-To: linux-rockchip-bounces+patchwork-linux-rockchip=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP Just use the same pwm ops for each IP, and get rid of the ops in the struct of rockchip_pwm_data, but still define the 3 different rockchip_pwm_data to use common interface for each IP. Signed-off-by: David Wu --- drivers/pwm/pwm-rockchip.c | 147 ++++++++++++--------------------------------- 1 file changed, 38 insertions(+), 109 deletions(-) diff --git a/drivers/pwm/pwm-rockchip.c b/drivers/pwm/pwm-rockchip.c index fbd9c1a..a3fcb40 100644 --- a/drivers/pwm/pwm-rockchip.c +++ b/drivers/pwm/pwm-rockchip.c @@ -50,12 +50,7 @@ struct rockchip_pwm_data { struct rockchip_pwm_regs regs; unsigned int prescaler; bool supports_polarity; - const struct pwm_ops *ops; - - void (*get_state)(struct pwm_chip *chip, struct pwm_device *pwm, - struct pwm_state *state); - int (*pwm_apply)(struct pwm_chip *chip, struct pwm_device *pwm, - struct pwm_state *state); + u32 enable_conf; }; static inline struct rockchip_pwm_chip *to_rockchip_pwm_chip(struct pwm_chip *c) @@ -63,45 +58,15 @@ static inline struct rockchip_pwm_chip *to_rockchip_pwm_chip(struct pwm_chip *c) return container_of(c, struct rockchip_pwm_chip, chip); } -static void rockchip_pwm_get_state_v1(struct pwm_chip *chip, - struct pwm_device *pwm, - struct pwm_state *state) -{ - struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); - u32 enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN; - u32 val; - - val = readl_relaxed(pc->base + pc->data->regs.ctrl); - if ((val & enable_conf) == enable_conf) - state->enabled = true; -} - -static void rockchip_pwm_get_state_v2(struct pwm_chip *chip, - struct pwm_device *pwm, - struct pwm_state *state) -{ - struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); - u32 enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | - PWM_CONTINUOUS; - u32 val; - - val = readl_relaxed(pc->base + pc->data->regs.ctrl); - if ((val & enable_conf) != enable_conf) - return; - - state->enabled = true; - - if (!(val & PWM_DUTY_POSITIVE)) - state->polarity = PWM_POLARITY_INVERSED; -} - static void rockchip_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm, struct pwm_state *state) { struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); + u32 enable_conf = pc->data->enable_conf; unsigned long clk_rate; u64 tmp; + u32 val; int ret; ret = clk_enable(pc->pclk); @@ -116,9 +81,20 @@ static void rockchip_pwm_get_state(struct pwm_chip *chip, tmp = readl_relaxed(pc->base + pc->data->regs.duty); tmp *= pc->data->prescaler * NSEC_PER_SEC; - state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate); + state->duty_cycle = DIV_ROUND_CLOSEST_ULL(tmp, clk_rate); - pc->data->get_state(chip, pwm, state); + val = readl_relaxed(pc->base + pc->data->regs.ctrl); + if (pc->data->supports_polarity) + state->enabled = ((val & enable_conf) != enable_conf) ? + false : true; + else + state->enabled = ((val & enable_conf) == enable_conf) ? + true : false; + + if (pc->data->supports_polarity) { + if (!(val & PWM_DUTY_POSITIVE)) + state->polarity = PWM_POLARITY_INVERSED; + } clk_disable(pc->pclk); } @@ -161,10 +137,10 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm, static int rockchip_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm, - bool enable, - u32 enable_conf) + bool enable) { struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); + u32 enable_conf = pc->data->enable_conf; int ret; u32 val; @@ -189,73 +165,35 @@ static int rockchip_pwm_enable(struct pwm_chip *chip, return 0; } -static int rockchip_pwm_apply_v1(struct pwm_chip *chip, struct pwm_device *pwm, - struct pwm_state *state) +static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, + struct pwm_state *state) { - u32 enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN; + struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); struct pwm_state curstate; bool enabled; int ret = 0; + ret = clk_enable(pc->pclk); + if (ret) + return ret; + pwm_get_state(pwm, &curstate); enabled = curstate.enabled; if (state->polarity != curstate.polarity && enabled) { - ret = rockchip_pwm_enable(chip, pwm, false, enable_conf); + ret = rockchip_pwm_enable(chip, pwm, false); if (ret) - return ret; + goto out; enabled = false; } rockchip_pwm_config(chip, pwm, state); - if (state->enabled != enabled) - ret = rockchip_pwm_enable(chip, pwm, state->enabled, - enable_conf); - - return ret; -} - -static int rockchip_pwm_apply_v2(struct pwm_chip *chip, struct pwm_device *pwm, - struct pwm_state *state) -{ - u32 enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | - PWM_CONTINUOUS; - struct pwm_state curstate; - bool enabled; - int ret = 0; - - pwm_get_state(pwm, &curstate); - enabled = curstate.enabled; - - if (state->polarity != curstate.polarity && enabled) { - ret = rockchip_pwm_enable(chip, pwm, false, enable_conf); + if (state->enabled != enabled) { + ret = rockchip_pwm_enable(chip, pwm, state->enabled); if (ret) - return ret; - enabled = false; + goto out; } - rockchip_pwm_config(chip, pwm, state); - if (state->enabled != enabled) - ret = rockchip_pwm_enable(chip, pwm, state->enabled, - enable_conf); - - return ret; -} - -static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, - struct pwm_state *state) -{ - struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip); - int ret; - - ret = clk_enable(pc->pclk); - if (ret) - return ret; - - ret = pc->data->pwm_apply(chip, pwm, state); - if (ret) - goto out; - /* * Update the state with the real hardware, which can differ a bit * because of period/duty_cycle approximation. @@ -268,13 +206,7 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, return ret; } -static const struct pwm_ops rockchip_pwm_ops_v1 = { - .get_state = rockchip_pwm_get_state, - .apply = rockchip_pwm_apply, - .owner = THIS_MODULE, -}; - -static const struct pwm_ops rockchip_pwm_ops_v2 = { +static const struct pwm_ops rockchip_pwm_ops = { .get_state = rockchip_pwm_get_state, .apply = rockchip_pwm_apply, .owner = THIS_MODULE, @@ -288,9 +220,8 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, .ctrl = 0x0c, }, .prescaler = 2, - .ops = &rockchip_pwm_ops_v1, - .get_state = rockchip_pwm_get_state_v1, - .pwm_apply = rockchip_pwm_apply_v1, + .supports_polarity = false, + .enable_conf = PWM_CTRL_OUTPUT_EN | PWM_CTRL_TIMER_EN, }; static const struct rockchip_pwm_data pwm_data_v2 = { @@ -302,9 +233,8 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, }, .prescaler = 1, .supports_polarity = true, - .ops = &rockchip_pwm_ops_v2, - .get_state = rockchip_pwm_get_state_v2, - .pwm_apply = rockchip_pwm_apply_v2, + .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | + PWM_CONTINUOUS, }; static const struct rockchip_pwm_data pwm_data_vop = { @@ -316,9 +246,8 @@ static int rockchip_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm, }, .prescaler = 1, .supports_polarity = true, - .ops = &rockchip_pwm_ops_v2, - .get_state = rockchip_pwm_get_state_v2, - .pwm_apply = rockchip_pwm_apply_v2, + .enable_conf = PWM_OUTPUT_LEFT | PWM_LP_DISABLE | PWM_ENABLE | + PWM_CONTINUOUS, }; static const struct of_device_id rockchip_pwm_dt_ids[] = { @@ -391,7 +320,7 @@ static int rockchip_pwm_probe(struct platform_device *pdev) pc->data = id->data; pc->chip.dev = &pdev->dev; - pc->chip.ops = pc->data->ops; + pc->chip.ops = &rockchip_pwm_ops; pc->chip.base = -1; pc->chip.npwm = 1;