Received: by 10.192.165.148 with SMTP id m20csp916600imm; Wed, 25 Apr 2018 09:35:03 -0700 (PDT) X-Google-Smtp-Source: AIpwx4+h+kqME2/S2kurQyG5Oc02kN9uc6ch68nM9rfHW+ucGhlZkuvJTy5AadcOjXWkyvbbG1gW X-Received: by 10.98.144.85 with SMTP id a82mr28763496pfe.14.1524674103280; Wed, 25 Apr 2018 09:35:03 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1524674103; cv=none; d=google.com; s=arc-20160816; b=qoNDwaUR3XaToCVQaFT1WKWAlq5bzLsttiMBzAh+mw8dqJ+7rriTHh36BZ3tszjwGs rJ0/ZDwJYvwq/wALaz4BhCY6Qux85W/ZkJdzJhZPsM+cBzbwPOrz6cWTTzrFxES2GvnA +kXNUtt/ggkPE/GFWK+TU+VVNIPa2Y6MbYoZ1R0siYtPOf/4uuv7+TIrgy+/CJUI4jeW vYr/1vFmYCtt7lgqb5DpH2ADLUbSnoLd3GbcEozA+tJSZ+HJv5Zi8pI4LtVpTjF1HhBi Z4dblzhXvuxduSAYxSMZ9anDMdUO1q5Iv8NjsOgM/wC9JeHFJIhQs5HAbpzCWjn4zqmP q5zg== 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=k8doM3Xut4z6qJPkRM23gynhGKlKlifeL1rRfu286Zg=; b=topX+PUTo2lbSrOSM0ELPf846gPaLWyEaM6NJZvbko3LFOeHgmp+h24FxsLwrhSBfj flY3HEEOxtd3YC94u3+GYXd4LoWvxJWov5FZ4KbhzOt/ZDXfZcOfCFLBPzgbXHMItCAd L7uH8enPqmAJC70ywOf38GOpudV/fLLN2K1QXrgWN9R/k1lXxhIeJKF0RKdJxCIpnIfw y7Ofyxs0qAWP5EGhsxydjXqi0u9vnm0pnTQawkBfsFiJIDWwh40LKs5tm7782y2O+H7l h7ve55MVty36SBOmz0vI2kGgHDfUgf8YIoYmf33RQa6QcobqwIpBueoemlYDyAWdR8nK NJCA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Kjt0QtvK; 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 n30si14218523pgc.231.2018.04.25.09.34.48; Wed, 25 Apr 2018 09:35:03 -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; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=Kjt0QtvK; 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 S1755929AbeDYQd0 (ORCPT + 99 others); Wed, 25 Apr 2018 12:33:26 -0400 Received: from mail-wm0-f65.google.com ([74.125.82.65]:56312 "EHLO mail-wm0-f65.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755314AbeDYQdO (ORCPT ); Wed, 25 Apr 2018 12:33:14 -0400 Received: by mail-wm0-f65.google.com with SMTP id a8so8235777wmg.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=QrpNVIRW/FNJP8oL5dI+QULOkhlVE+08rMZmYKSPTDhWyokKOPqkoPWGvei9FHOyAj CBXH2rJe6T3T0XbMiZn/6/A6Fq5p7cqzsqI/D8ttjWfC4z7Al6OII/Q7L1341rhST0yv zT8pCZVObK8lm8qd7g71IZygSc7Gm03OGidS/GkZNMLd7J8NFXGTrS2CbrfK/AzZyvn2 w3TmZkPb/ALMq8VTLUL7EVBoHtKC5oo4cYMT9aRGUL1LFrND6Ndw8TMoJh+5VLZRPGmY +URH9gIS7sbhVCHxAXai1FppzbyT2Vu1ArwwVHYsZ6CiSu1tBSsxn0NZPEA1UZgi+5mQ w2vg== X-Gm-Message-State: ALQs6tBwrO6bh220DX2p+XZPO3zBPCmnKOD8BYRrUo26Y3uyDWZQCvlU mfVpqQy8naT0CG986k5PKodThg== 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: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@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 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 */ -- 2.14.3