From nobody Tue Mar 4 15:14:25 2025 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4Z6fNd4gyzz5qDHm; Tue, 04 Mar 2025 15:14:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4Z6fNd40ftz3kZG; Tue, 04 Mar 2025 15:14:25 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741101265; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ZgC/7g5DW5poEicOBuRRQxmTTvvW94cwaoiYwN8AYoU=; b=yMCBzGyGGQ2CcuQE4Ue5LJqI0fvZO6UqxwLPtRMg7tM1zIlLw6pqWKdzLeXMpD33k6ze9g moPiiC59CTbUIvHRQ5P/x3CbO7Rxj2Gfao3DjaJcR4I+95eeWnMfATrx0jwtwRhNShFCzN l6Ea+CU3y/7Jl4PNOtkH0Os6QRe5I/8BCNOmBTMQBGwp8k+VMLFnJ7kmhLXXQJuqiqoT2u EoQ00xLh+69RRwKBKM6HTgS0jG/P5+ctAe1TSN+0GEDqTEbHcCVUoi3G3Y6FFkgWAgadO/ +wpY8E5ZQNuUVsozQERwLXo5wLYDm8BJlWKx3EdaH5+9S7ZgGefOXYYRNtwaIA== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1741101265; a=rsa-sha256; cv=none; b=hu13Fr3mNjpGG1J5gQ3dGLR80B6WbbHYZaglVM1tGiivw5IlCCl76U7c9+Btots0QgWufm OMvQPB7Kt4MGcFuXUVJw/N9/TpiHZBX28jjC+fTyoNE8hZy73e7KaeB2TGvfk0L0u3tQEe MaWugeQ7G3xZ0i9jkJumkWsk5cdpQC/p/Jcbs2NLN/nE5H4nZaeakQd67Xd9lE0fwJ0Mip cCnPMagh8FU+Nck9cAAE6Wna30TAmE5OD4EcsTxh68MvbqD55AqxhaO9BvM7qZPbkqXxHh LyP6MOUpQIyjAICflZ7BD9LmNXkVC2aX5CuPn57zWvegZ10JVkxc6OM4RHTf4g== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1741101265; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=ZgC/7g5DW5poEicOBuRRQxmTTvvW94cwaoiYwN8AYoU=; b=bSPDadqdNDDwYeCYOVwRLn0v9dZEoOX+FeJ9HCVE63fUBxv8dcw8F/+22dC5CWFi35AdW1 HjjnRxbniHE8L2hVNwJIeWskTGri4ELNpt3k+fPGRKawuPTzlOzRyny81GMX2LAJoHl0Dr MBFuh3RX5bGkuXgpfZ3GSaWzokvRcp6gq5PoPDbYSod3LExdTNeEreWiXgR9UuRDdLHAXL ZrzLC3xtUtshMFsI/DPmKNKI/jESnE2rFQK2w84KtQBnF9Y4YREhUEd5d5da13ybbzVYBl bBBrduhwrPLsSD6JhS6c+lg7mDCNuys+9fwQg80i7Xt11k5QLe+2brEQIDrkFQ== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4Z6fNd3Xtfz792; Tue, 04 Mar 2025 15:14:25 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 524FEPAQ091921; Tue, 4 Mar 2025 15:14:25 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 524FEPZV091918; Tue, 4 Mar 2025 15:14:25 GMT (envelope-from git) Date: Tue, 4 Mar 2025 15:14:25 GMT Message-Id: <202503041514.524FEPZV091918@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Mitchell Horne Subject: git: d09ec2eeb0d8 - stable/14 - armada38x: implement gateclk clkdev methods List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-all@freebsd.org Sender: owner-dev-commits-src-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: mhorne X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: d09ec2eeb0d81528066fdb05db8a121f0f1e0c01 Auto-Submitted: auto-generated The branch stable/14 has been updated by mhorne: URL: https://cgit.FreeBSD.org/src/commit/?id=d09ec2eeb0d81528066fdb05db8a121f0f1e0c01 commit d09ec2eeb0d81528066fdb05db8a121f0f1e0c01 Author: Mitchell Horne AuthorDate: 2024-04-15 20:18:25 +0000 Commit: Mitchell Horne CommitDate: 2025-03-04 15:11:46 +0000 armada38x: implement gateclk clkdev methods Implement basic clkdev methods required by the generic clk_gate device. This should make it functional, and prevent panics when invoking the clock's CLKNODE_GET_GATE method (e.g. with `sysctl -a`). Additionally, we need to fill in other key fields of the clk_gate_def structure before registering each clk. PR: 278188 Reported by: solo_code@protonmail.com Tested by: solo_code@protonmail.com MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D48419 (cherry picked from commit 6f2775548278c76e7c33b15aaaaa759270a8dcd5) --- sys/arm/mv/clk/armada38x_gateclk.c | 99 ++++++++++++++++++++++++++++++++++++-- 1 file changed, 94 insertions(+), 5 deletions(-) diff --git a/sys/arm/mv/clk/armada38x_gateclk.c b/sys/arm/mv/clk/armada38x_gateclk.c index d00a01b0da67..1be3830cf375 100644 --- a/sys/arm/mv/clk/armada38x_gateclk.c +++ b/sys/arm/mv/clk/armada38x_gateclk.c @@ -44,11 +44,22 @@ #include "clkdev_if.h" +#define ARMADA38X_GATECLK_MAXREG 0 + +static struct resource_spec armada38x_gateclk_specs[] = { + { SYS_RES_MEMORY, 0, RF_ACTIVE }, + { -1, 0 } +}; + +#define RD4(_sc, addr) bus_read_4(_sc->res, addr) +#define WR4(_sc, addr, val) bus_write_4(_sc->res, addr, val) + struct armada38x_gateclk_softc { - struct clkdom *clkdom; - struct mtx mtx; - const char* parent; + struct resource *res; + struct clkdom *clkdom; + struct mtx mtx; + const char* parent; }; static struct clk_gate_def gateclk_nodes[] = @@ -220,10 +231,75 @@ static struct clk_gate_def gateclk_nodes[] = static int armada38x_gateclk_probe(device_t dev); static int armada38x_gateclk_attach(device_t dev); +static int +armada38x_gateclk_write_4(device_t dev, bus_addr_t addr, uint32_t val) +{ + struct armada38x_gateclk_softc *sc = device_get_softc(dev); + + if (addr > ARMADA38X_GATECLK_MAXREG) + return (EINVAL); + + WR4(sc, addr, val); + return (0); +} + +static int +armada38x_gateclk_read_4(device_t dev, bus_addr_t addr, uint32_t *val) +{ + struct armada38x_gateclk_softc *sc = device_get_softc(dev); + + if (addr > ARMADA38X_GATECLK_MAXREG) + return (EINVAL); + + *val = RD4(sc, addr); + return (0); +} + +static int +armada38x_gateclk_modify_4(device_t dev, bus_addr_t addr, uint32_t clr, + uint32_t set) +{ + struct armada38x_gateclk_softc *sc = device_get_softc(dev); + uint32_t reg; + + if (addr > ARMADA38X_GATECLK_MAXREG) + return (EINVAL); + + reg = RD4(sc, addr); + reg &= ~clr; + reg |= set; + WR4(sc, addr, reg); + + return (0); +} + +static void +armada38x_gateclk_device_lock(device_t dev) +{ + struct armada38x_gateclk_softc *sc = device_get_softc(dev); + + mtx_lock(&sc->mtx); +} + +static void +armada38x_gateclk_device_unlock(device_t dev) +{ + struct armada38x_gateclk_softc *sc = device_get_softc(dev); + + mtx_unlock(&sc->mtx); +} + static device_method_t armada38x_gateclk_methods[] = { DEVMETHOD(device_probe, armada38x_gateclk_probe), DEVMETHOD(device_attach, armada38x_gateclk_attach), + /* clkdev interface */ + DEVMETHOD(clkdev_write_4, armada38x_gateclk_write_4), + DEVMETHOD(clkdev_read_4, armada38x_gateclk_read_4), + DEVMETHOD(clkdev_modify_4, armada38x_gateclk_modify_4), + DEVMETHOD(clkdev_device_lock, armada38x_gateclk_device_lock), + DEVMETHOD(clkdev_device_unlock, armada38x_gateclk_device_unlock), + DEVMETHOD_END }; @@ -255,6 +331,7 @@ static int armada38x_gateclk_attach(device_t dev) { struct armada38x_gateclk_softc *sc; + struct clk_gate_def *defp; phandle_t node; int i, error; clk_t clock; @@ -262,6 +339,11 @@ armada38x_gateclk_attach(device_t dev) sc = device_get_softc(dev); node = ofw_bus_get_node(dev); + if (bus_alloc_resources(dev, armada38x_gateclk_specs, &sc->res) != 0) { + device_printf(dev, "Cannot allocate resources.\n"); + return (ENXIO); + } + mtx_init(&sc->mtx, device_get_nameunit(dev), NULL, MTX_DEF); sc->clkdom = clkdom_create(dev); @@ -277,8 +359,15 @@ armada38x_gateclk_attach(device_t dev) sc->parent = clk_get_name(clock); for (i = 0; i < nitems(gateclk_nodes); ++i) { - gateclk_nodes[i].clkdef.parent_names = &sc->parent; - error = clknode_gate_register(sc->clkdom, &gateclk_nodes[i]); + /* Fill clk_gate fields. */ + defp = &gateclk_nodes[i]; + defp->clkdef.parent_names = &sc->parent; + defp->offset = 0; + defp->mask = 0x1; + defp->on_value = 1; + defp->off_value = 0; + + error = clknode_gate_register(sc->clkdom, defp); if (error != 0) { device_printf(dev, "Cannot create gate nodes\n"); return (error);