From patchwork Wed Apr 25 16:32:59 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jerome Brunet X-Patchwork-Id: 134369 Delivered-To: patch@linaro.org Received: by 10.46.151.6 with SMTP id r6csp1084290lji; Wed, 25 Apr 2018 09:33:23 -0700 (PDT) X-Google-Smtp-Source: AIpwx4/Yprj2KqMiKOCbiggciuRcXMB9LG1EWe5Q332Aq2X3DqUu0HqnHBhSR5affguwFeIt8pzi X-Received: by 10.99.96.193 with SMTP id u184mr20528024pgb.122.1524674003314; Wed, 25 Apr 2018 09:33:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524674003; cv=none; d=google.com; s=arc-20160816; b=TktT8NwVnSYYWbwU20Q63Pch2CePlCg+x+8po05+qoKRFN8ZsFBBuhYCN+pkk+jq7o ut/JxGgtK/rfeTacmLr3Es2v9Z7ju+WiigbfgAsSnsWvaeaOCZ41oH59AcDRlN296Brf iF1Kh2ny+kVmpStSjKhbmL17WgY0I0QUt1X4XN6+YWnIpsK37Maa+45xPYymlp8xb3kA /hrbBxgnPhKuHJ7b6KeTQf1kHjAGp28xLF3xPFxNxlgwqmaayPhkCbnHRComFLxsfROE itu/Ue+oP5zD9fYQCsgp2CTdjPI6zKZGOWf1xfxtVS3gMovx2f9QHxpyAfRfxlwUDxao +N7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=DpI1UoVjw7AtbHr4JRkwoHNM1CIr6aNB/kiRmrkKc8M=; b=kK0BYjWgDWReJ3yCFRvba2LVHyQe2I3rin//CP9+Z/kFWk6XW1WnpLqiQnnrPzZByN 13zjER3rw6ufO8ju1hShWKC618ysQ1OL8Y3RvEq1c1xy5EBF1OWN6zZuJ5Lk/SQ7yt2l K4vp4fy4mDbW7+ZxWlVSE6OAwtHVAWRZqLxo/A8Tcrp8F/azP4uaKaqapGq0hJE/S+C9 GqmvqlFa/kDVeqT53iRnHBhCJrvslXdv6MN+RmEMQ4XbxGMeU3hF0pNZZO7pSf/rakn8 +t5UXrGCPUUowppP9Jx8C5d4Am7Y0XEn2d8j4g/vb43FfP6DQveET3LNItQn7A2Jsbhs mc4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Kjt0QtvK; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-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 t22-v6si17680687plj.595.2018.04.25.09.33.23; Wed, 25 Apr 2018 09:33:23 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Kjt0QtvK; spf=pass (google.com: best guess record for domain of devicetree-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=devicetree-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755706AbeDYQdV (ORCPT + 6 others); Wed, 25 Apr 2018 12:33:21 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:56313 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755312AbeDYQdO (ORCPT ); Wed, 25 Apr 2018 12:33:14 -0400 Received: by mail-wm0-f66.google.com with SMTP id a8so8235778wmg.5 for ; Wed, 25 Apr 2018 09:33:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=baylibre-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=k8doM3Xut4z6qJPkRM23gynhGKlKlifeL1rRfu286Zg=; b=Kjt0QtvKJNxbPPdVIzv2HuSma4xxqbwRSiBmlP9iH3G+C/K34XdEBupDIeWsOuQ0u7 HLcdXt/Fm4QKMWEt2Q/LeOCvK/W8x7pm3kEqmNoPP89CNYXdjjHU4arj8AKP7wjXJ/Gn Y+LhuYGCYyA012zQ7YmT3zl2B8Ns4pcxdRPgNp/QX+Kb9pK4jiVaBq8Cfng7NnOXACxi 2US150s1O/g6f2AIcpPgP/cEqi0oZhRMlYclC4VLZ8mP1z+Mt7qHOPxxseZVtG6/HLfd zzURZdQfdj7DRw1MjcJzuZvhB5jMF1uxFLA+InSggmcQGNGpuh/6t7GJU3HBiHKJq+sl fnmw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=k8doM3Xut4z6qJPkRM23gynhGKlKlifeL1rRfu286Zg=; b=qBEn5wG7JclnmR2g9HfQIsjAaK2dfcPVKgdsktl9FHxsno1PKiECRS0IzH2FFvwje1 GAdDxMiFsuPDlB2B9Ovg129bJr/cCf3cXEIY282wHo5Oe4W2f9tnKUzGqIlPe8WP96QG qUUg+9TX3sKidnS8g7hM3qlZmqUy2Dd5OjYJ1lM8G4/OVbLNe0FqKcs8vmPNQPVZDjCm 3Osd1Vnp0hujNWJbCIcx7AqJPPYoLyEY65NWBrQpu04ZYMHC4xEx9Vn4AEuj/4ArzWBG 582oAlL6apxTwY9YsH6ZGtWbHn42VpgfpX7ahuqbF7pKMua7GRKquWT+bVbZxjlVaLXn USJg== X-Gm-Message-State: ALQs6tAdt0A6mA/ytZZYYdoNQgnhCZXZnCrEUgYg2EAv5GZf1dISnQue bILbl0VeHjYVTuzz3iYATR8VyA== X-Received: by 10.28.109.88 with SMTP id i85mr15097915wmc.150.1524673992599; Wed, 25 Apr 2018 09:33:12 -0700 (PDT) Received: from boomer.baylibre.local ([2a01:e34:eeb6:4690:3146:aafc:91d9:4b96]) by smtp.googlemail.com with ESMTPSA id 44-v6sm17300548wrk.48.2018.04.25.09.33.10 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 25 Apr 2018 09:33:11 -0700 (PDT) From: Jerome Brunet To: Neil Armstrong , Carlo Caione , Kevin Hilman Cc: Jerome Brunet , Michael Turquette , Stephen Boyd , linux-amlogic@lists.infradead.org, linux-clk@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/7] clk: meson: add clk-phase clock driver Date: Wed, 25 Apr 2018 18:32:59 +0200 Message-Id: <20180425163304.10852-3-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180425163304.10852-1-jbrunet@baylibre.com> References: <20180425163304.10852-1-jbrunet@baylibre.com> Sender: devicetree-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Add a driver based meson clk-regmap to control clock phase on amlogic SoCs Signed-off-by: Jerome Brunet --- drivers/clk/meson/Makefile | 1 + drivers/clk/meson/clk-phase.c | 63 +++++++++++++++++++++++++++++++++++++++++++ drivers/clk/meson/clkc.h | 8 ++++++ 3 files changed, 72 insertions(+) create mode 100644 drivers/clk/meson/clk-phase.c -- 2.14.3 -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Acked-by: Neil Armstrong diff --git a/drivers/clk/meson/Makefile b/drivers/clk/meson/Makefile index ffee82e60b7a..352fb848c406 100644 --- a/drivers/clk/meson/Makefile +++ b/drivers/clk/meson/Makefile @@ -3,6 +3,7 @@ # obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-pll.o clk-mpll.o clk-audio-divider.o +obj-$(CONFIG_COMMON_CLK_AMLOGIC) += clk-phase.o obj-$(CONFIG_COMMON_CLK_MESON8B) += meson8b.o obj-$(CONFIG_COMMON_CLK_GXBB) += gxbb.o gxbb-aoclk.o gxbb-aoclk-32k.o obj-$(CONFIG_COMMON_CLK_AXG) += axg.o diff --git a/drivers/clk/meson/clk-phase.c b/drivers/clk/meson/clk-phase.c new file mode 100644 index 000000000000..96e70497ef1b --- /dev/null +++ b/drivers/clk/meson/clk-phase.c @@ -0,0 +1,63 @@ +// SPDX-License-Identifier: (GPL-2.0+ OR MIT) +/* + * Copyright (c) 2018 BayLibre, SAS. + * Author: Jerome Brunet + */ + +#include +#include "clkc.h" + +#define phase_step(_width) (360 / (1 << (_width))) + +static inline struct meson_clk_phase_data * +meson_clk_phase_data(struct clk_regmap *clk) +{ + return (struct meson_clk_phase_data *)clk->data; +} + +int meson_clk_degrees_from_val(unsigned int val, unsigned int width) +{ + return phase_step(width) * val; +} +EXPORT_SYMBOL_GPL(meson_clk_degrees_from_val); + +unsigned int meson_clk_degrees_to_val(int degrees, unsigned int width) +{ + unsigned int val = DIV_ROUND_CLOSEST(degrees, phase_step(width)); + + /* + * This last calculation is here for cases when degrees is rounded + * to 360, in which case val == (1 << width). + */ + return val % (1 << width); +} +EXPORT_SYMBOL_GPL(meson_clk_degrees_to_val); + +static int meson_clk_phase_get_phase(struct clk_hw *hw) +{ + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_phase_data *phase = meson_clk_phase_data(clk); + unsigned int val; + + val = meson_parm_read(clk->map, &phase->ph); + + return meson_clk_degrees_from_val(val, phase->ph.width); +} + +static int meson_clk_phase_set_phase(struct clk_hw *hw, int degrees) +{ + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_phase_data *phase = meson_clk_phase_data(clk); + unsigned int val; + + val = meson_clk_degrees_to_val(degrees, phase->ph.width); + meson_parm_write(clk->map, &phase->ph, val); + + return 0; +} + +const struct clk_ops meson_clk_phase_ops = { + .get_phase = meson_clk_phase_get_phase, + .set_phase = meson_clk_phase_set_phase, +}; +EXPORT_SYMBOL_GPL(meson_clk_phase_ops); diff --git a/drivers/clk/meson/clkc.h b/drivers/clk/meson/clkc.h index 8fe73c4edca8..9a17d6705e0a 100644 --- a/drivers/clk/meson/clkc.h +++ b/drivers/clk/meson/clkc.h @@ -104,6 +104,13 @@ struct meson_clk_audio_div_data { u8 flags; }; +struct meson_clk_phase_data { + struct parm ph; +}; + +int meson_clk_degrees_from_val(unsigned int val, unsigned int width); +unsigned int meson_clk_degrees_to_val(int degrees, unsigned int width); + #define MESON_GATE(_name, _reg, _bit) \ struct clk_regmap _name = { \ .data = &(struct clk_regmap_gate_data){ \ @@ -127,5 +134,6 @@ extern const struct clk_ops meson_clk_mpll_ro_ops; extern const struct clk_ops meson_clk_mpll_ops; extern const struct clk_ops meson_clk_audio_divider_ro_ops; extern const struct clk_ops meson_clk_audio_divider_ops; +extern const struct clk_ops meson_clk_phase_ops; #endif /* __CLKC_H */