Received: by 10.223.185.116 with SMTP id b49csp2397249wrg; Mon, 12 Feb 2018 08:55:47 -0800 (PST) X-Google-Smtp-Source: AH8x225V5zhLYthZovbhbowkNu18s7Jr984VJTH4x1coFzNX5w7AMi7wEAWc/XPg+kb8JEQ0FzYa X-Received: by 2002:a17:902:5914:: with SMTP id o20-v6mr1307858pli.60.1518454547728; Mon, 12 Feb 2018 08:55:47 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1518454547; cv=none; d=google.com; s=arc-20160816; b=xoHjLjood0qXUQbo+FCQ4dpF9z9ZEulblwBNk2d5kNiX/acvihxbp0nPgA2EGkYnVq +uhGNgc+nYKAaDVv/0uKWgR4rC+bWj0+XhEUe8K/X3Zmzghz7uYFmw7rubfU2n0fDmaY 5T3G6MWFnJgXkMrWE/3XW/ObD38+0KzqWZH1g0GlPxL62oOO7EzoQCdExfAXK0CBHV/z JLzRQilZPyTBkg9szbDMkHbTXT54q4AG17dJzYxjm762h8RBEnIcYUwzxLsO8L9EW/PV CvemT3RB8w703/IcX5IZ4AVYY6HjKxMdG09qcKNEjbk8s5xgByzCtRy+cA6CdyVfY3QU b9mw== 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=G0mO/yQ7naAggvJbVx/EZC+YMJlQRZ+i25SPAmiGJZo=; b=p5XO3aZIYe0leUUo2m3rIO6T3HD5LYtHlcR6hNxv9PTNlCpNWTGZAk2WjAByxCzHOw Da+y4u3KEVEPxfRtBGxaEt3S7quq4aP4PETHVs8x3Ki2vYxX+zz9hw5TSaCAL2voNvwM En0A02HbSxQ3m+F0d9A5MWS521HRgXsZWZ7ztQQYHkFDMdZijaY5MKJN7dLK3rsDgVbY 4AzV/TWZvD5luc89cy6d5EqR/xo17gnSXbNyV824EoxfxIQggNNYc850W45n3rmFsOTO FH0p9cpd4owNCjpYoDEax7ymJnUHF/SLAOCLMA1pEilQw7ujMPtRYug2GK/s86P6sG7e +JVg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=cauyul5G; 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 j12si103225pgn.115.2018.02.12.08.55.33; Mon, 12 Feb 2018 08:55:47 -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; dkim=pass header.i=@baylibre-com.20150623.gappssmtp.com header.s=20150623 header.b=cauyul5G; 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 S933861AbeBLPCr (ORCPT + 99 others); Mon, 12 Feb 2018 10:02:47 -0500 Received: from mail-wr0-f194.google.com ([209.85.128.194]:44152 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932469AbeBLO7H (ORCPT ); Mon, 12 Feb 2018 09:59:07 -0500 Received: by mail-wr0-f194.google.com with SMTP id v65so8696692wrc.11 for ; Mon, 12 Feb 2018 06:59:07 -0800 (PST) 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=G0mO/yQ7naAggvJbVx/EZC+YMJlQRZ+i25SPAmiGJZo=; b=cauyul5GG10o3+Yo/QUpBZFir7//4f/G+J2sFcasLlk8BkBTXQqMC4SxaztziGSXm/ 1wkjqSGxnS807Tj+Q28awFPFqVJx0F6cVleMIFTa+uNFgPD+LNNQTgLVuh7ot4z71UHn NNBxnnKWoC44XOvJsMeY4/gLrrTbJHykkZh4ERwQ2A9F5eUvKRwJh2HkChDZ0uBJ/IiE IjafjrREyqSDqC351zQNmX425IQhvoN9s1c7n8BcpvJ8Qa60+I7nAwTjdIuoEvsK+DGO XUVloeODL6Fugyp+PDK15M+Uqhnne1sRBUKC0rx87vp0VmjCSCKeV+1ifBxEInWv1+0+ 6Efg== 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=G0mO/yQ7naAggvJbVx/EZC+YMJlQRZ+i25SPAmiGJZo=; b=tNdz6P6HH5EUBWOXr3UQnp7COFWKaFyz55U9J4w0fXte1jX8O/bqvXdmETe5mHk3qO Khk+N/gcRoOGoPtA1e9zKEZ7ObbEok9JxgkMRW3alYJt/JdLBjiyBjuUMDTjlyi0PeTM noFirC3B8u7z8NauMZZ1AdAv1Rm1/cAcdKbRJPIjzk2y0whAVjRhULwyBCuVUrsOO4/u w4ZwiJKbg1Wn4Irhr3crCAgsxxTdB+obWhH5q3sTS2/21iBStsiwFixJuPqGIzvjKY7b elRKW5osxiVhS2rRKTT+K0xV1LW6RwgFnL/ccHHhGRNzY9dXc/n1wYm0JhV5Wo5WxjiT LUrw== X-Gm-Message-State: APf1xPCeDDvVSGrx2VUCLE0z/BZ5Hgw+KiXwh5X97wWrPbOfmlK9dXwy 6cUkP/bfpPgfrhw3N5Z+3filIA== X-Received: by 10.223.198.200 with SMTP id c8mr10452957wrh.79.1518447546167; Mon, 12 Feb 2018 06:59:06 -0800 (PST) Received: from boomer.baylibre.local ([90.63.244.31]) by smtp.googlemail.com with ESMTPSA id p21sm4633218wmc.28.2018.02.12.06.59.05 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 12 Feb 2018 06:59:05 -0800 (PST) From: Jerome Brunet To: Neil Armstrong , Kevin Hilman Cc: Jerome Brunet , Stephen Boyd , Michael Turquette , Carlo Caione , linux-amlogic@lists.infradead.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v2 14/19] clk: meson: migrate the audio divider clock to clk_regmap Date: Mon, 12 Feb 2018 15:58:41 +0100 Message-Id: <20180212145846.19380-15-jbrunet@baylibre.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180212145846.19380-1-jbrunet@baylibre.com> References: <20180212145846.19380-1-jbrunet@baylibre.com> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Rework meson audio divider driver to use clk_regmap and move gxbb clock using meson_clk_audio_divider to clk_regmap. Signed-off-by: Jerome Brunet --- drivers/clk/meson/clk-audio-divider.c | 63 +++++++++++------------------------ drivers/clk/meson/clkc.h | 5 +-- drivers/clk/meson/gxbb.c | 30 +++++------------ 3 files changed, 30 insertions(+), 68 deletions(-) diff --git a/drivers/clk/meson/clk-audio-divider.c b/drivers/clk/meson/clk-audio-divider.c index 6c07db06642d..f7ab5b1db342 100644 --- a/drivers/clk/meson/clk-audio-divider.c +++ b/drivers/clk/meson/clk-audio-divider.c @@ -28,8 +28,11 @@ #include #include "clkc.h" -#define to_meson_clk_audio_divider(_hw) container_of(_hw, \ - struct meson_clk_audio_divider, hw) +static inline struct meson_clk_audio_div_data * +meson_clk_audio_div_data(struct clk_regmap *clk) +{ + return (struct meson_clk_audio_div_data *)clk->data; +} static int _div_round(unsigned long parent_rate, unsigned long rate, unsigned long flags) @@ -45,15 +48,9 @@ static int _get_val(unsigned long parent_rate, unsigned long rate) return DIV_ROUND_UP_ULL((u64)parent_rate, rate) - 1; } -static int _valid_divider(struct clk_hw *hw, int divider) +static int _valid_divider(unsigned int width, int divider) { - struct meson_clk_audio_divider *adiv = - to_meson_clk_audio_divider(hw); - int max_divider; - u8 width; - - width = adiv->div.width; - max_divider = 1 << width; + int max_divider = 1 << width; return clamp(divider, 1, max_divider); } @@ -61,14 +58,11 @@ static int _valid_divider(struct clk_hw *hw, int divider) static unsigned long audio_divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) { - struct meson_clk_audio_divider *adiv = - to_meson_clk_audio_divider(hw); - struct parm *p; - unsigned long reg, divider; + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_audio_div_data *adiv = meson_clk_audio_div_data(clk); + unsigned long divider; - p = &adiv->div; - reg = readl(adiv->base + p->reg_off); - divider = PARM_GET(p->width, p->shift, reg) + 1; + divider = meson_parm_read(clk->map, &adiv->div); return DIV_ROUND_UP_ULL((u64)parent_rate, divider); } @@ -77,14 +71,14 @@ static long audio_divider_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate) { - struct meson_clk_audio_divider *adiv = - to_meson_clk_audio_divider(hw); + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_audio_div_data *adiv = meson_clk_audio_div_data(clk); unsigned long max_prate; int divider; if (!(clk_hw_get_flags(hw) & CLK_SET_RATE_PARENT)) { divider = _div_round(*parent_rate, rate, adiv->flags); - divider = _valid_divider(hw, divider); + divider = _valid_divider(adiv->div.width, divider); return DIV_ROUND_UP_ULL((u64)*parent_rate, divider); } @@ -93,7 +87,7 @@ static long audio_divider_round_rate(struct clk_hw *hw, /* Get the corresponding rounded down divider */ divider = max_prate / rate; - divider = _valid_divider(hw, divider); + divider = _valid_divider(adiv->div.width, divider); /* Get actual rate of the parent */ *parent_rate = clk_hw_round_rate(clk_hw_get_parent(hw), @@ -106,28 +100,11 @@ static int audio_divider_set_rate(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate) { - struct meson_clk_audio_divider *adiv = - to_meson_clk_audio_divider(hw); - struct parm *p; - unsigned long reg, flags = 0; - int val; - - val = _get_val(parent_rate, rate); - - if (adiv->lock) - spin_lock_irqsave(adiv->lock, flags); - else - __acquire(adiv->lock); - - p = &adiv->div; - reg = readl(adiv->base + p->reg_off); - reg = PARM_SET(p->width, p->shift, reg, val); - writel(reg, adiv->base + p->reg_off); - - if (adiv->lock) - spin_unlock_irqrestore(adiv->lock, flags); - else - __release(adiv->lock); + struct clk_regmap *clk = to_clk_regmap(hw); + struct meson_clk_audio_div_data *adiv = meson_clk_audio_div_data(clk); + int val = _get_val(parent_rate, rate); + + meson_parm_write(clk->map, &adiv->div, val); return 0; } diff --git a/drivers/clk/meson/clkc.h b/drivers/clk/meson/clkc.h index 08a1ebfc65dc..a4a526cbca4c 100644 --- a/drivers/clk/meson/clkc.h +++ b/drivers/clk/meson/clkc.h @@ -142,12 +142,9 @@ struct meson_clk_mpll_data { spinlock_t *lock; }; -struct meson_clk_audio_divider { - struct clk_hw hw; - void __iomem *base; +struct meson_clk_audio_div_data { struct parm div; u8 flags; - spinlock_t *lock; }; #define MESON_GATE(_name, _reg, _bit) \ diff --git a/drivers/clk/meson/gxbb.c b/drivers/clk/meson/gxbb.c index d2724a7ce9e7..196557f11608 100644 --- a/drivers/clk/meson/gxbb.c +++ b/drivers/clk/meson/gxbb.c @@ -826,14 +826,15 @@ static struct clk_regmap gxbb_cts_amclk_sel = { }, }; -static struct meson_clk_audio_divider gxbb_cts_amclk_div = { - .div = { - .reg_off = HHI_AUD_CLK_CNTL, - .shift = 0, - .width = 8, +static struct clk_regmap gxbb_cts_amclk_div = { + .data = &(struct meson_clk_audio_div_data){ + .div = { + .reg_off = HHI_AUD_CLK_CNTL, + .shift = 0, + .width = 8, + }, + .flags = CLK_DIVIDER_ROUND_CLOSEST, }, - .flags = CLK_DIVIDER_ROUND_CLOSEST, - .lock = &meson_clk_lock, .hw.init = &(struct clk_init_data){ .name = "cts_amclk_div", .ops = &meson_clk_audio_divider_ops, @@ -1777,10 +1778,6 @@ static struct meson_clk_pll *const gxl_clk_plls[] = { &gxl_gp0_pll, }; -static struct meson_clk_audio_divider *const gxbb_audio_dividers[] = { - &gxbb_cts_amclk_div, -}; - static struct clk_regmap *const gx_clk_regmaps[] = { &gxbb_clk81, &gxbb_ddr, @@ -1912,29 +1909,24 @@ static struct clk_regmap *const gx_clk_regmaps[] = { &gxbb_mpll0, &gxbb_mpll1, &gxbb_mpll2, + &gxbb_cts_amclk_div, }; struct clkc_data { struct meson_clk_pll *const *clk_plls; unsigned int clk_plls_count; - struct meson_clk_audio_divider *const *clk_audio_dividers; - unsigned int clk_audio_dividers_count; struct clk_hw_onecell_data *hw_onecell_data; }; static const struct clkc_data gxbb_clkc_data = { .clk_plls = gxbb_clk_plls, .clk_plls_count = ARRAY_SIZE(gxbb_clk_plls), - .clk_audio_dividers = gxbb_audio_dividers, - .clk_audio_dividers_count = ARRAY_SIZE(gxbb_audio_dividers), .hw_onecell_data = &gxbb_hw_onecell_data, }; static const struct clkc_data gxl_clkc_data = { .clk_plls = gxl_clk_plls, .clk_plls_count = ARRAY_SIZE(gxl_clk_plls), - .clk_audio_dividers = gxbb_audio_dividers, - .clk_audio_dividers_count = ARRAY_SIZE(gxbb_audio_dividers), .hw_onecell_data = &gxl_hw_onecell_data, }; @@ -1981,10 +1973,6 @@ static int gxbb_clkc_probe(struct platform_device *pdev) for (i = 0; i < clkc_data->clk_plls_count; i++) clkc_data->clk_plls[i]->base = clk_base; - /* Populate base address for the audio dividers */ - for (i = 0; i < clkc_data->clk_audio_dividers_count; i++) - clkc_data->clk_audio_dividers[i]->base = clk_base; - /* Populate regmap for the common regmap backed clocks */ for (i = 0; i < ARRAY_SIZE(gx_clk_regmaps); i++) gx_clk_regmaps[i]->map = map; -- 2.14.3