13d0407baSopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
23d0407baSopenharmony_ci/*
33d0407baSopenharmony_ci *  Copyright (c) 2010-2011 Jeremy Kerr <jeremy.kerr@canonical.com>
43d0407baSopenharmony_ci *  Copyright (C) 2011-2012 Linaro Ltd <mturquette@linaro.org>
53d0407baSopenharmony_ci */
63d0407baSopenharmony_ci#ifndef __LINUX_CLK_PROVIDER_H
73d0407baSopenharmony_ci#define __LINUX_CLK_PROVIDER_H
83d0407baSopenharmony_ci
93d0407baSopenharmony_ci#include <linux/of.h>
103d0407baSopenharmony_ci#include <linux/of_clk.h>
113d0407baSopenharmony_ci
123d0407baSopenharmony_ci/*
133d0407baSopenharmony_ci * flags used across common struct clk.  these flags should only affect the
143d0407baSopenharmony_ci * top-level framework.  custom flags for dealing with hardware specifics
153d0407baSopenharmony_ci * belong in struct clk_foo
163d0407baSopenharmony_ci *
173d0407baSopenharmony_ci * Please update clk_flags[] in drivers/clk/clk.c when making changes here!
183d0407baSopenharmony_ci */
193d0407baSopenharmony_ci#define CLK_SET_RATE_GATE BIT(0)        /* must be gated across rate change */
203d0407baSopenharmony_ci#define CLK_SET_PARENT_GATE BIT(1)      /* must be gated across re-parent */
213d0407baSopenharmony_ci#define CLK_SET_RATE_PARENT BIT(2)      /* propagate rate change up one level */
223d0407baSopenharmony_ci#define CLK_IGNORE_UNUSED BIT(3)        /* do not gate even if unused */
233d0407baSopenharmony_ci                                        /* unused */
243d0407baSopenharmony_ci                                        /* unused */
253d0407baSopenharmony_ci#define CLK_GET_RATE_NOCACHE BIT(6)     /* do not use the cached clk rate */
263d0407baSopenharmony_ci#define CLK_SET_RATE_NO_REPARENT BIT(7) /* don't re-parent on rate change */
273d0407baSopenharmony_ci#define CLK_GET_ACCURACY_NOCACHE BIT(8) /* do not use the cached clk accuracy */
283d0407baSopenharmony_ci#define CLK_RECALC_NEW_RATES BIT(9)     /* recalc rates after notifications */
293d0407baSopenharmony_ci#define CLK_SET_RATE_UNGATE BIT(10)     /* clock needs to run to set rate */
303d0407baSopenharmony_ci#define CLK_IS_CRITICAL BIT(11)         /* do not gate, ever */
313d0407baSopenharmony_ci/* parents need enable during gate/ungate, set rate and re-parent */
323d0407baSopenharmony_ci#define CLK_OPS_PARENT_ENABLE BIT(12)
333d0407baSopenharmony_ci/* duty cycle call may be forwarded to the parent clock */
343d0407baSopenharmony_ci#define CLK_DUTY_CYCLE_PARENT BIT(13)
353d0407baSopenharmony_ci
363d0407baSopenharmony_cistruct clk;
373d0407baSopenharmony_cistruct clk_hw;
383d0407baSopenharmony_cistruct clk_core;
393d0407baSopenharmony_cistruct dentry;
403d0407baSopenharmony_ci
413d0407baSopenharmony_ci/**
423d0407baSopenharmony_ci * struct clk_rate_request - Structure encoding the clk constraints that
433d0407baSopenharmony_ci * a clock user might require.
443d0407baSopenharmony_ci *
453d0407baSopenharmony_ci * @rate:        Requested clock rate. This field will be adjusted by
463d0407baSopenharmony_ci *            clock drivers according to hardware capabilities.
473d0407baSopenharmony_ci * @min_rate:        Minimum rate imposed by clk users.
483d0407baSopenharmony_ci * @max_rate:        Maximum rate imposed by clk users.
493d0407baSopenharmony_ci * @best_parent_rate:    The best parent rate a parent can provide to fulfill the
503d0407baSopenharmony_ci *            requested constraints.
513d0407baSopenharmony_ci * @best_parent_hw:    The most appropriate parent clock that fulfills the
523d0407baSopenharmony_ci *            requested constraints.
533d0407baSopenharmony_ci *
543d0407baSopenharmony_ci */
553d0407baSopenharmony_cistruct clk_rate_request {
563d0407baSopenharmony_ci    unsigned long rate;
573d0407baSopenharmony_ci    unsigned long min_rate;
583d0407baSopenharmony_ci    unsigned long max_rate;
593d0407baSopenharmony_ci    unsigned long best_parent_rate;
603d0407baSopenharmony_ci    struct clk_hw *best_parent_hw;
613d0407baSopenharmony_ci};
623d0407baSopenharmony_ci
633d0407baSopenharmony_ci/**
643d0407baSopenharmony_ci * struct clk_duty - Struture encoding the duty cycle ratio of a clock
653d0407baSopenharmony_ci *
663d0407baSopenharmony_ci * @num:    Numerator of the duty cycle ratio
673d0407baSopenharmony_ci * @den:    Denominator of the duty cycle ratio
683d0407baSopenharmony_ci */
693d0407baSopenharmony_cistruct clk_duty {
703d0407baSopenharmony_ci    unsigned int num;
713d0407baSopenharmony_ci    unsigned int den;
723d0407baSopenharmony_ci};
733d0407baSopenharmony_ci
743d0407baSopenharmony_ci/**
753d0407baSopenharmony_ci * struct clk_ops -  Callback operations for hardware clocks; these are to
763d0407baSopenharmony_ci * be provided by the clock implementation, and will be called by drivers
773d0407baSopenharmony_ci * through the clk_* api.
783d0407baSopenharmony_ci *
793d0407baSopenharmony_ci * @prepare:    Prepare the clock for enabling. This must not return until
803d0407baSopenharmony_ci *        the clock is fully prepared, and it's safe to call clk_enable.
813d0407baSopenharmony_ci *        This callback is intended to allow clock implementations to
823d0407baSopenharmony_ci *        do any initialisation that may sleep. Called with
833d0407baSopenharmony_ci *        prepare_lock held.
843d0407baSopenharmony_ci *
853d0407baSopenharmony_ci * @unprepare:    Release the clock from its prepared state. This will typically
863d0407baSopenharmony_ci *        undo any work done in the @prepare callback. Called with
873d0407baSopenharmony_ci *        prepare_lock held.
883d0407baSopenharmony_ci *
893d0407baSopenharmony_ci * @is_prepared: Queries the hardware to determine if the clock is prepared.
903d0407baSopenharmony_ci *        This function is allowed to sleep. Optional, if this op is not
913d0407baSopenharmony_ci *        set then the prepare count will be used.
923d0407baSopenharmony_ci *
933d0407baSopenharmony_ci * @unprepare_unused: Unprepare the clock atomically.  Only called from
943d0407baSopenharmony_ci *        clk_disable_unused for prepare clocks with special needs.
953d0407baSopenharmony_ci *        Called with prepare mutex held. This function may sleep.
963d0407baSopenharmony_ci *
973d0407baSopenharmony_ci * @enable:    Enable the clock atomically. This must not return until the
983d0407baSopenharmony_ci *        clock is generating a valid clock signal, usable by consumer
993d0407baSopenharmony_ci *        devices. Called with enable_lock held. This function must not
1003d0407baSopenharmony_ci *        sleep.
1013d0407baSopenharmony_ci *
1023d0407baSopenharmony_ci * @disable:    Disable the clock atomically. Called with enable_lock held.
1033d0407baSopenharmony_ci *        This function must not sleep.
1043d0407baSopenharmony_ci *
1053d0407baSopenharmony_ci * @is_enabled:    Queries the hardware to determine if the clock is enabled.
1063d0407baSopenharmony_ci *        This function must not sleep. Optional, if this op is not
1073d0407baSopenharmony_ci *        set then the enable count will be used.
1083d0407baSopenharmony_ci *
1093d0407baSopenharmony_ci * @disable_unused: Disable the clock atomically.  Only called from
1103d0407baSopenharmony_ci *        clk_disable_unused for gate clocks with special needs.
1113d0407baSopenharmony_ci *        Called with enable_lock held.  This function must not
1123d0407baSopenharmony_ci *        sleep.
1133d0407baSopenharmony_ci *
1143d0407baSopenharmony_ci * @save_context: Save the context of the clock in prepration for poweroff.
1153d0407baSopenharmony_ci *
1163d0407baSopenharmony_ci * @restore_context: Restore the context of the clock after a restoration
1173d0407baSopenharmony_ci *        of power.
1183d0407baSopenharmony_ci *
1193d0407baSopenharmony_ci * @recalc_rate    Recalculate the rate of this clock, by querying hardware. The
1203d0407baSopenharmony_ci *        parent rate is an input parameter.  It is up to the caller to
1213d0407baSopenharmony_ci *        ensure that the prepare_mutex is held across this call.
1223d0407baSopenharmony_ci *        Returns the calculated rate.  Optional, but recommended - if
1233d0407baSopenharmony_ci *        this op is not set then clock rate will be initialized to 0.
1243d0407baSopenharmony_ci *
1253d0407baSopenharmony_ci * @round_rate:    Given a target rate as input, returns the closest rate actually
1263d0407baSopenharmony_ci *        supported by the clock. The parent rate is an input/output
1273d0407baSopenharmony_ci *        parameter.
1283d0407baSopenharmony_ci *
1293d0407baSopenharmony_ci * @determine_rate: Given a target rate as input, returns the closest rate
1303d0407baSopenharmony_ci *        actually supported by the clock, and optionally the parent clock
1313d0407baSopenharmony_ci *        that should be used to provide the clock rate.
1323d0407baSopenharmony_ci *
1333d0407baSopenharmony_ci * @set_parent:    Change the input source of this clock; for clocks with multiple
1343d0407baSopenharmony_ci *        possible parents specify a new parent by passing in the index
1353d0407baSopenharmony_ci *        as a u8 corresponding to the parent in either the .parent_names
1363d0407baSopenharmony_ci *        or .parents arrays.  This function in affect translates an
1373d0407baSopenharmony_ci *        array index into the value programmed into the hardware.
1383d0407baSopenharmony_ci *        Returns 0 on success, -EERROR otherwise.
1393d0407baSopenharmony_ci *
1403d0407baSopenharmony_ci * @get_parent:    Queries the hardware to determine the parent of a clock.  The
1413d0407baSopenharmony_ci *        return value is a u8 which specifies the index corresponding to
1423d0407baSopenharmony_ci *        the parent clock.  This index can be applied to either the
1433d0407baSopenharmony_ci *        .parent_names or .parents arrays.  In short, this function
1443d0407baSopenharmony_ci *        translates the parent value read from hardware into an array
1453d0407baSopenharmony_ci *        index.  Currently only called when the clock is initialized by
1463d0407baSopenharmony_ci *        __clk_init.  This callback is mandatory for clocks with
1473d0407baSopenharmony_ci *        multiple parents.  It is optional (and unnecessary) for clocks
1483d0407baSopenharmony_ci *        with 0 or 1 parents.
1493d0407baSopenharmony_ci *
1503d0407baSopenharmony_ci * @set_rate:    Change the rate of this clock. The requested rate is specified
1513d0407baSopenharmony_ci *        by the second argument, which should typically be the return
1523d0407baSopenharmony_ci *        of .round_rate call.  The third argument gives the parent rate
1533d0407baSopenharmony_ci *        which is likely helpful for most .set_rate implementation.
1543d0407baSopenharmony_ci *        Returns 0 on success, -EERROR otherwise.
1553d0407baSopenharmony_ci *
1563d0407baSopenharmony_ci * @set_rate_and_parent: Change the rate and the parent of this clock. The
1573d0407baSopenharmony_ci *        requested rate is specified by the second argument, which
1583d0407baSopenharmony_ci *        should typically be the return of .round_rate call.  The
1593d0407baSopenharmony_ci *        third argument gives the parent rate which is likely helpful
1603d0407baSopenharmony_ci *        for most .set_rate_and_parent implementation. The fourth
1613d0407baSopenharmony_ci *        argument gives the parent index. This callback is optional (and
1623d0407baSopenharmony_ci *        unnecessary) for clocks with 0 or 1 parents as well as
1633d0407baSopenharmony_ci *        for clocks that can tolerate switching the rate and the parent
1643d0407baSopenharmony_ci *        separately via calls to .set_parent and .set_rate.
1653d0407baSopenharmony_ci *        Returns 0 on success, -EERROR otherwise.
1663d0407baSopenharmony_ci *
1673d0407baSopenharmony_ci * @recalc_accuracy: Recalculate the accuracy of this clock. The clock accuracy
1683d0407baSopenharmony_ci *        is expressed in ppb (parts per billion). The parent accuracy is
1693d0407baSopenharmony_ci *        an input parameter.
1703d0407baSopenharmony_ci *        Returns the calculated accuracy.  Optional - if    this op is not
1713d0407baSopenharmony_ci *        set then clock accuracy will be initialized to parent accuracy
1723d0407baSopenharmony_ci *        or 0 (perfect clock) if clock has no parent.
1733d0407baSopenharmony_ci *
1743d0407baSopenharmony_ci * @get_phase:    Queries the hardware to get the current phase of a clock.
1753d0407baSopenharmony_ci *        Returned values are 0-359 degrees on success, negative
1763d0407baSopenharmony_ci *        error codes on failure.
1773d0407baSopenharmony_ci *
1783d0407baSopenharmony_ci * @set_phase:    Shift the phase this clock signal in degrees specified
1793d0407baSopenharmony_ci *        by the second argument. Valid values for degrees are
1803d0407baSopenharmony_ci *        0-359. Return 0 on success, otherwise -EERROR.
1813d0407baSopenharmony_ci *
1823d0407baSopenharmony_ci * @get_duty_cycle: Queries the hardware to get the current duty cycle ratio
1833d0407baSopenharmony_ci *              of a clock. Returned values denominator cannot be 0 and must be
1843d0407baSopenharmony_ci *              superior or equal to the numerator.
1853d0407baSopenharmony_ci *
1863d0407baSopenharmony_ci * @set_duty_cycle: Apply the duty cycle ratio to this clock signal specified by
1873d0407baSopenharmony_ci *              the numerator (2nd argurment) and denominator (3rd  argument).
1883d0407baSopenharmony_ci *              Argument must be a valid ratio (denominator > 0
1893d0407baSopenharmony_ci *              and >= numerator) Return 0 on success, otherwise -EERROR.
1903d0407baSopenharmony_ci *
1913d0407baSopenharmony_ci * @init:    Perform platform-specific initialization magic.
1923d0407baSopenharmony_ci *        This is not used by any of the basic clock types.
1933d0407baSopenharmony_ci *        This callback exist for HW which needs to perform some
1943d0407baSopenharmony_ci *        initialisation magic for CCF to get an accurate view of the
1953d0407baSopenharmony_ci *        clock. It may also be used dynamic resource allocation is
1963d0407baSopenharmony_ci *        required. It shall not used to deal with clock parameters,
1973d0407baSopenharmony_ci *        such as rate or parents.
1983d0407baSopenharmony_ci *        Returns 0 on success, -EERROR otherwise.
1993d0407baSopenharmony_ci *
2003d0407baSopenharmony_ci * @terminate:  Free any resource allocated by init.
2013d0407baSopenharmony_ci *
2023d0407baSopenharmony_ci * @debug_init:    Set up type-specific debugfs entries for this clock.  This
2033d0407baSopenharmony_ci *        is called once, after the debugfs directory entry for this
2043d0407baSopenharmony_ci *        clock has been created.  The dentry pointer representing that
2053d0407baSopenharmony_ci *        directory is provided as an argument.  Called with
2063d0407baSopenharmony_ci *        prepare_lock held.  Returns 0 on success, -EERROR otherwise.
2073d0407baSopenharmony_ci *
2083d0407baSopenharmony_ci *
2093d0407baSopenharmony_ci * The clk_enable/clk_disable and clk_prepare/clk_unprepare pairs allow
2103d0407baSopenharmony_ci * implementations to split any work between atomic (enable) and sleepable
2113d0407baSopenharmony_ci * (prepare) contexts.  If enabling a clock requires code that might sleep,
2123d0407baSopenharmony_ci * this must be done in clk_prepare.  Clock enable code that will never be
2133d0407baSopenharmony_ci * called in a sleepable context may be implemented in clk_enable.
2143d0407baSopenharmony_ci *
2153d0407baSopenharmony_ci * Typically, drivers will call clk_prepare when a clock may be needed later
2163d0407baSopenharmony_ci * (eg. when a device is opened), and clk_enable when the clock is actually
2173d0407baSopenharmony_ci * required (eg. from an interrupt). Note that clk_prepare MUST have been
2183d0407baSopenharmony_ci * called before clk_enable.
2193d0407baSopenharmony_ci */
2203d0407baSopenharmony_cistruct clk_ops {
2213d0407baSopenharmony_ci    int (*prepare)(struct clk_hw *hw);
2223d0407baSopenharmony_ci    void (*unprepare)(struct clk_hw *hw);
2233d0407baSopenharmony_ci    int (*is_prepared)(struct clk_hw *hw);
2243d0407baSopenharmony_ci    void (*unprepare_unused)(struct clk_hw *hw);
2253d0407baSopenharmony_ci    int (*enable)(struct clk_hw *hw);
2263d0407baSopenharmony_ci    void (*disable)(struct clk_hw *hw);
2273d0407baSopenharmony_ci    int (*is_enabled)(struct clk_hw *hw);
2283d0407baSopenharmony_ci    void (*disable_unused)(struct clk_hw *hw);
2293d0407baSopenharmony_ci    int (*save_context)(struct clk_hw *hw);
2303d0407baSopenharmony_ci    void (*restore_context)(struct clk_hw *hw);
2313d0407baSopenharmony_ci    unsigned long (*recalc_rate)(struct clk_hw *hw, unsigned long parent_rate);
2323d0407baSopenharmony_ci    long (*round_rate)(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate);
2333d0407baSopenharmony_ci    int (*determine_rate)(struct clk_hw *hw, struct clk_rate_request *req);
2343d0407baSopenharmony_ci    int (*set_parent)(struct clk_hw *hw, u8 index);
2353d0407baSopenharmony_ci    u8 (*get_parent)(struct clk_hw *hw);
2363d0407baSopenharmony_ci    int (*set_rate)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate);
2373d0407baSopenharmony_ci    int (*set_rate_and_parent)(struct clk_hw *hw, unsigned long rate, unsigned long parent_rate, u8 index);
2383d0407baSopenharmony_ci    unsigned long (*recalc_accuracy)(struct clk_hw *hw, unsigned long parent_accuracy);
2393d0407baSopenharmony_ci    int (*get_phase)(struct clk_hw *hw);
2403d0407baSopenharmony_ci    int (*set_phase)(struct clk_hw *hw, int degrees);
2413d0407baSopenharmony_ci    int (*get_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty);
2423d0407baSopenharmony_ci    int (*set_duty_cycle)(struct clk_hw *hw, struct clk_duty *duty);
2433d0407baSopenharmony_ci    int (*init)(struct clk_hw *hw);
2443d0407baSopenharmony_ci    void (*terminate)(struct clk_hw *hw);
2453d0407baSopenharmony_ci    void (*debug_init)(struct clk_hw *hw, struct dentry *dentry);
2463d0407baSopenharmony_ci};
2473d0407baSopenharmony_ci
2483d0407baSopenharmony_ci/**
2493d0407baSopenharmony_ci * struct clk_parent_data - clk parent information
2503d0407baSopenharmony_ci * @hw: parent clk_hw pointer (used for clk providers with internal clks)
2513d0407baSopenharmony_ci * @fw_name: parent name local to provider registering clk
2523d0407baSopenharmony_ci * @name: globally unique parent name (used as a fallback)
2533d0407baSopenharmony_ci * @index: parent index local to provider registering clk (if @fw_name absent)
2543d0407baSopenharmony_ci */
2553d0407baSopenharmony_cistruct clk_parent_data {
2563d0407baSopenharmony_ci    const struct clk_hw *hw;
2573d0407baSopenharmony_ci    const char *fw_name;
2583d0407baSopenharmony_ci    const char *name;
2593d0407baSopenharmony_ci    int index;
2603d0407baSopenharmony_ci};
2613d0407baSopenharmony_ci
2623d0407baSopenharmony_ci/**
2633d0407baSopenharmony_ci * struct clk_init_data - holds init data that's common to all clocks and is
2643d0407baSopenharmony_ci * shared between the clock provider and the common clock framework.
2653d0407baSopenharmony_ci *
2663d0407baSopenharmony_ci * @name: clock name
2673d0407baSopenharmony_ci * @ops: operations this clock supports
2683d0407baSopenharmony_ci * @parent_names: array of string names for all possible parents
2693d0407baSopenharmony_ci * @parent_data: array of parent data for all possible parents (when some
2703d0407baSopenharmony_ci *               parents are external to the clk controller)
2713d0407baSopenharmony_ci * @parent_hws: array of pointers to all possible parents (when all parents
2723d0407baSopenharmony_ci *              are internal to the clk controller)
2733d0407baSopenharmony_ci * @num_parents: number of possible parents
2743d0407baSopenharmony_ci * @flags: framework-level hints and quirks
2753d0407baSopenharmony_ci */
2763d0407baSopenharmony_cistruct clk_init_data {
2773d0407baSopenharmony_ci    const char *name;
2783d0407baSopenharmony_ci    const struct clk_ops *ops;
2793d0407baSopenharmony_ci    /* Only one of the following three should be assigned */
2803d0407baSopenharmony_ci    const char *const *parent_names;
2813d0407baSopenharmony_ci    const struct clk_parent_data *parent_data;
2823d0407baSopenharmony_ci    const struct clk_hw **parent_hws;
2833d0407baSopenharmony_ci    u8 num_parents;
2843d0407baSopenharmony_ci    unsigned long flags;
2853d0407baSopenharmony_ci};
2863d0407baSopenharmony_ci
2873d0407baSopenharmony_ci/**
2883d0407baSopenharmony_ci * struct clk_hw - handle for traversing from a struct clk to its corresponding
2893d0407baSopenharmony_ci * hardware-specific structure.  struct clk_hw should be declared within struct
2903d0407baSopenharmony_ci * clk_foo and then referenced by the struct clk instance that uses struct
2913d0407baSopenharmony_ci * clk_foo's clk_ops
2923d0407baSopenharmony_ci *
2933d0407baSopenharmony_ci * @core: pointer to the struct clk_core instance that points back to this
2943d0407baSopenharmony_ci * struct clk_hw instance
2953d0407baSopenharmony_ci *
2963d0407baSopenharmony_ci * @clk: pointer to the per-user struct clk instance that can be used to call
2973d0407baSopenharmony_ci * into the clk API
2983d0407baSopenharmony_ci *
2993d0407baSopenharmony_ci * @init: pointer to struct clk_init_data that contains the init data shared
3003d0407baSopenharmony_ci * with the common clock framework. This pointer will be set to NULL once
3013d0407baSopenharmony_ci * a clk_register() variant is called on this clk_hw pointer.
3023d0407baSopenharmony_ci */
3033d0407baSopenharmony_cistruct clk_hw {
3043d0407baSopenharmony_ci    struct clk_core *core;
3053d0407baSopenharmony_ci    struct clk *clk;
3063d0407baSopenharmony_ci    const struct clk_init_data *init;
3073d0407baSopenharmony_ci};
3083d0407baSopenharmony_ci
3093d0407baSopenharmony_ci/*
3103d0407baSopenharmony_ci * DOC: Basic clock implementations common to many platforms
3113d0407baSopenharmony_ci *
3123d0407baSopenharmony_ci * Each basic clock hardware type is comprised of a structure describing the
3133d0407baSopenharmony_ci * clock hardware, implementations of the relevant callbacks in struct clk_ops,
3143d0407baSopenharmony_ci * unique flags for that hardware type, a registration function and an
3153d0407baSopenharmony_ci * alternative macro for static initialization
3163d0407baSopenharmony_ci */
3173d0407baSopenharmony_ci
3183d0407baSopenharmony_ci/**
3193d0407baSopenharmony_ci * struct clk_fixed_rate - fixed-rate clock
3203d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
3213d0407baSopenharmony_ci * @fixed_rate:    constant frequency of clock
3223d0407baSopenharmony_ci * @fixed_accuracy: constant accuracy of clock in ppb (parts per billion)
3233d0407baSopenharmony_ci * @flags:    hardware specific flags
3243d0407baSopenharmony_ci *
3253d0407baSopenharmony_ci * Flags:
3263d0407baSopenharmony_ci * * CLK_FIXED_RATE_PARENT_ACCURACY - Use the accuracy of the parent clk
3273d0407baSopenharmony_ci *                                    instead of what's set in @fixed_accuracy.
3283d0407baSopenharmony_ci */
3293d0407baSopenharmony_cistruct clk_fixed_rate {
3303d0407baSopenharmony_ci    struct clk_hw hw;
3313d0407baSopenharmony_ci    unsigned long fixed_rate;
3323d0407baSopenharmony_ci    unsigned long fixed_accuracy;
3333d0407baSopenharmony_ci    unsigned long flags;
3343d0407baSopenharmony_ci};
3353d0407baSopenharmony_ci
3363d0407baSopenharmony_ci#define CLK_FIXED_RATE_PARENT_ACCURACY BIT(0)
3373d0407baSopenharmony_ci
3383d0407baSopenharmony_ciextern const struct clk_ops clk_fixed_rate_ops;
3393d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_fixed_rate(struct device *dev, struct device_node *np, const char *name,
3403d0407baSopenharmony_ci                                            const char *parent_name, const struct clk_hw *parent_hw,
3413d0407baSopenharmony_ci                                            const struct clk_parent_data *parent_data, unsigned long flags,
3423d0407baSopenharmony_ci                                            unsigned long fixed_rate, unsigned long fixed_accuracy,
3433d0407baSopenharmony_ci                                            unsigned long clk_fixed_flags);
3443d0407baSopenharmony_cistruct clk *clk_register_fixed_rate(struct device *dev, const char *name, const char *parent_name, unsigned long flags,
3453d0407baSopenharmony_ci                                    unsigned long fixed_rate);
3463d0407baSopenharmony_ci/**
3473d0407baSopenharmony_ci * clk_hw_register_fixed_rate - register fixed-rate clock with the clock
3483d0407baSopenharmony_ci * framework
3493d0407baSopenharmony_ci * @dev: device that is registering this clock
3503d0407baSopenharmony_ci * @name: name of this clock
3513d0407baSopenharmony_ci * @parent_name: name of clock's parent
3523d0407baSopenharmony_ci * @flags: framework-specific flags
3533d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
3543d0407baSopenharmony_ci */
3553d0407baSopenharmony_ci#define clk_hw_register_fixed_rate(dev, name, parent_name, flags, fixed_rate)                                          \
3563d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (fixed_rate), 0, 0)
3573d0407baSopenharmony_ci/**
3583d0407baSopenharmony_ci * clk_hw_register_fixed_rate_parent_hw - register fixed-rate clock with
3593d0407baSopenharmony_ci * the clock framework
3603d0407baSopenharmony_ci * @dev: device that is registering this clock
3613d0407baSopenharmony_ci * @name: name of this clock
3623d0407baSopenharmony_ci * @parent_hw: pointer to parent clk
3633d0407baSopenharmony_ci * @flags: framework-specific flags
3643d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
3653d0407baSopenharmony_ci */
3663d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_parent_hw(dev, name, parent_hw, flags, fixed_rate)                                  \
3673d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (fixed_rate), 0, 0)
3683d0407baSopenharmony_ci/**
3693d0407baSopenharmony_ci * clk_hw_register_fixed_rate_parent_data - register fixed-rate clock with
3703d0407baSopenharmony_ci * the clock framework
3713d0407baSopenharmony_ci * @dev: device that is registering this clock
3723d0407baSopenharmony_ci * @name: name of this clock
3733d0407baSopenharmony_ci * @parent_data: parent clk data
3743d0407baSopenharmony_ci * @flags: framework-specific flags
3753d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
3763d0407baSopenharmony_ci */
3773d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_parent_data(dev, name, parent_hw, flags, fixed_rate)                                \
3783d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (fixed_rate), 0, 0)
3793d0407baSopenharmony_ci/**
3803d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy - register fixed-rate clock with
3813d0407baSopenharmony_ci * the clock framework
3823d0407baSopenharmony_ci * @dev: device that is registering this clock
3833d0407baSopenharmony_ci * @name: name of this clock
3843d0407baSopenharmony_ci * @parent_name: name of clock's parent
3853d0407baSopenharmony_ci * @flags: framework-specific flags
3863d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
3873d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy
3883d0407baSopenharmony_ci */
3893d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy(dev, name, parent_name, flags, fixed_rate, fixed_accuracy)            \
3903d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (fixed_rate),                \
3913d0407baSopenharmony_ci                                 (fixed_accuracy), 0)
3923d0407baSopenharmony_ci/**
3933d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy_parent_hw - register fixed-rate
3943d0407baSopenharmony_ci * clock with the clock framework
3953d0407baSopenharmony_ci * @dev: device that is registering this clock
3963d0407baSopenharmony_ci * @name: name of this clock
3973d0407baSopenharmony_ci * @parent_hw: pointer to parent clk
3983d0407baSopenharmony_ci * @flags: framework-specific flags
3993d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
4003d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy
4013d0407baSopenharmony_ci */
4023d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy_parent_hw(dev, name, parent_hw, flags, fixed_rate, fixed_accuracy)    \
4033d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, (parent_hw)NULL, NULL, (flags), (fixed_rate),              \
4043d0407baSopenharmony_ci                                 (fixed_accuracy), 0)
4053d0407baSopenharmony_ci/**
4063d0407baSopenharmony_ci * clk_hw_register_fixed_rate_with_accuracy_parent_data - register fixed-rate
4073d0407baSopenharmony_ci * clock with the clock framework
4083d0407baSopenharmony_ci * @dev: device that is registering this clock
4093d0407baSopenharmony_ci * @name: name of this clock
4103d0407baSopenharmony_ci * @parent_name: name of clock's parent
4113d0407baSopenharmony_ci * @flags: framework-specific flags
4123d0407baSopenharmony_ci * @fixed_rate: non-adjustable clock rate
4133d0407baSopenharmony_ci * @fixed_accuracy: non-adjustable clock accuracy
4143d0407baSopenharmony_ci */
4153d0407baSopenharmony_ci#define clk_hw_register_fixed_rate_with_accuracy_parent_data(dev, name, parent_data, flags, fixed_rate,                \
4163d0407baSopenharmony_ci                                                             fixed_accuracy)                                           \
4173d0407baSopenharmony_ci    __clk_hw_register_fixed_rate((dev), NULL, (name), NULL, NULL, (parent_data), NULL, (flags), (fixed_rate),          \
4183d0407baSopenharmony_ci                                 (fixed_accuracy), 0)
4193d0407baSopenharmony_ci
4203d0407baSopenharmony_civoid clk_unregister_fixed_rate(struct clk *clk);
4213d0407baSopenharmony_civoid clk_hw_unregister_fixed_rate(struct clk_hw *hw);
4223d0407baSopenharmony_ci
4233d0407baSopenharmony_civoid of_fixed_clk_setup(struct device_node *np);
4243d0407baSopenharmony_ci
4253d0407baSopenharmony_ci/**
4263d0407baSopenharmony_ci * struct clk_gate - gating clock
4273d0407baSopenharmony_ci *
4283d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
4293d0407baSopenharmony_ci * @reg:    register controlling gate
4303d0407baSopenharmony_ci * @bit_idx:    single bit controlling gate
4313d0407baSopenharmony_ci * @flags:    hardware-specific flags
4323d0407baSopenharmony_ci * @lock:    register lock
4333d0407baSopenharmony_ci *
4343d0407baSopenharmony_ci * Clock which can gate its output.  Implements .enable & .disable
4353d0407baSopenharmony_ci *
4363d0407baSopenharmony_ci * Flags:
4373d0407baSopenharmony_ci * CLK_GATE_SET_TO_DISABLE - by default this clock sets the bit at bit_idx to
4383d0407baSopenharmony_ci *    enable the clock.  Setting this flag does the opposite: setting the bit
4393d0407baSopenharmony_ci *    disable the clock and clearing it enables the clock
4403d0407baSopenharmony_ci * CLK_GATE_HIWORD_MASK - The gate settings are only in lower 16-bit
4413d0407baSopenharmony_ci *    of this register, and mask of gate bits are in higher 16-bit of this
4423d0407baSopenharmony_ci *    register.  While setting the gate bits, higher 16-bit should also be
4433d0407baSopenharmony_ci *    updated to indicate changing gate bits.
4443d0407baSopenharmony_ci * CLK_GATE_BIG_ENDIAN - by default little endian register accesses are used for
4453d0407baSopenharmony_ci *    the gate register.  Setting this flag makes the register accesses big
4463d0407baSopenharmony_ci *    endian.
4473d0407baSopenharmony_ci */
4483d0407baSopenharmony_cistruct clk_gate {
4493d0407baSopenharmony_ci    struct clk_hw hw;
4503d0407baSopenharmony_ci    void __iomem *reg;
4513d0407baSopenharmony_ci    u8 bit_idx;
4523d0407baSopenharmony_ci    u8 flags;
4533d0407baSopenharmony_ci    spinlock_t *lock;
4543d0407baSopenharmony_ci};
4553d0407baSopenharmony_ci
4563d0407baSopenharmony_ci#define to_clk_gate(_hw) container_of(_hw, struct clk_gate, hw)
4573d0407baSopenharmony_ci
4583d0407baSopenharmony_ci#define CLK_GATE_SET_TO_DISABLE BIT(0)
4593d0407baSopenharmony_ci#define CLK_GATE_HIWORD_MASK BIT(1)
4603d0407baSopenharmony_ci#define CLK_GATE_BIG_ENDIAN BIT(2)
4613d0407baSopenharmony_ci
4623d0407baSopenharmony_ciextern const struct clk_ops clk_gate_ops;
4633d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_gate(struct device *dev, struct device_node *np, const char *name,
4643d0407baSopenharmony_ci                                      const char *parent_name, const struct clk_hw *parent_hw,
4653d0407baSopenharmony_ci                                      const struct clk_parent_data *parent_data, unsigned long flags, void __iomem *reg,
4663d0407baSopenharmony_ci                                      u8 bit_idx, u8 clk_gate_flags, spinlock_t *lock);
4673d0407baSopenharmony_cistruct clk *clk_register_gate(struct device *dev, const char *name, const char *parent_name, unsigned long flags,
4683d0407baSopenharmony_ci                              void __iomem *reg, u8 bit_idx, u8 clk_gate_flags, spinlock_t *lock);
4693d0407baSopenharmony_ci/**
4703d0407baSopenharmony_ci * clk_hw_register_gate - register a gate clock with the clock framework
4713d0407baSopenharmony_ci * @dev: device that is registering this clock
4723d0407baSopenharmony_ci * @name: name of this clock
4733d0407baSopenharmony_ci * @parent_name: name of this clock's parent
4743d0407baSopenharmony_ci * @flags: framework-specific flags for this clock
4753d0407baSopenharmony_ci * @reg: register address to control gating of this clock
4763d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock
4773d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock
4783d0407baSopenharmony_ci * @lock: shared register lock for this clock
4793d0407baSopenharmony_ci */
4803d0407baSopenharmony_ci#define clk_hw_register_gate(dev, name, parent_name, flags, reg, bit_idx, clk_gate_flags, lock)                        \
4813d0407baSopenharmony_ci    __clk_hw_register_gate((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (bit_idx),                  \
4823d0407baSopenharmony_ci                           (clk_gate_flags), (lock))
4833d0407baSopenharmony_ci/**
4843d0407baSopenharmony_ci * clk_hw_register_gate_parent_hw - register a gate clock with the clock
4853d0407baSopenharmony_ci * framework
4863d0407baSopenharmony_ci * @dev: device that is registering this clock
4873d0407baSopenharmony_ci * @name: name of this clock
4883d0407baSopenharmony_ci * @parent_hw: pointer to parent clk
4893d0407baSopenharmony_ci * @flags: framework-specific flags for this clock
4903d0407baSopenharmony_ci * @reg: register address to control gating of this clock
4913d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock
4923d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock
4933d0407baSopenharmony_ci * @lock: shared register lock for this clock
4943d0407baSopenharmony_ci */
4953d0407baSopenharmony_ci#define clk_hw_register_gate_parent_hw(dev, name, parent_hw, flags, reg, bit_idx, clk_gate_flags, lock)                \
4963d0407baSopenharmony_ci    __clk_hw_register_gate((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (bit_idx), (clk_gate_flags),  \
4973d0407baSopenharmony_ci                           (lock))
4983d0407baSopenharmony_ci/**
4993d0407baSopenharmony_ci * clk_hw_register_gate_parent_data - register a gate clock with the clock
5003d0407baSopenharmony_ci * framework
5013d0407baSopenharmony_ci * @dev: device that is registering this clock
5023d0407baSopenharmony_ci * @name: name of this clock
5033d0407baSopenharmony_ci * @parent_data: parent clk data
5043d0407baSopenharmony_ci * @flags: framework-specific flags for this clock
5053d0407baSopenharmony_ci * @reg: register address to control gating of this clock
5063d0407baSopenharmony_ci * @bit_idx: which bit in the register controls gating of this clock
5073d0407baSopenharmony_ci * @clk_gate_flags: gate-specific flags for this clock
5083d0407baSopenharmony_ci * @lock: shared register lock for this clock
5093d0407baSopenharmony_ci */
5103d0407baSopenharmony_ci#define clk_hw_register_gate_parent_data(dev, name, parent_data, flags, reg, bit_idx, clk_gate_flags, lock)            \
5113d0407baSopenharmony_ci    __clk_hw_register_gate((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (bit_idx),                  \
5123d0407baSopenharmony_ci                           (clk_gate_flags), (lock))
5133d0407baSopenharmony_civoid clk_unregister_gate(struct clk *clk);
5143d0407baSopenharmony_civoid clk_hw_unregister_gate(struct clk_hw *hw);
5153d0407baSopenharmony_ciint clk_gate_is_enabled(struct clk_hw *hw);
5163d0407baSopenharmony_ci
5173d0407baSopenharmony_cistruct clk_div_table {
5183d0407baSopenharmony_ci    unsigned int val;
5193d0407baSopenharmony_ci    unsigned int div;
5203d0407baSopenharmony_ci};
5213d0407baSopenharmony_ci
5223d0407baSopenharmony_ci/**
5233d0407baSopenharmony_ci * struct clk_divider - adjustable divider clock
5243d0407baSopenharmony_ci *
5253d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
5263d0407baSopenharmony_ci * @reg:    register containing the divider
5273d0407baSopenharmony_ci * @shift:    shift to the divider bit field
5283d0407baSopenharmony_ci * @width:    width of the divider bit field
5293d0407baSopenharmony_ci * @table:    array of value/divider pairs, last entry should have div = 0
5303d0407baSopenharmony_ci * @lock:    register lock
5313d0407baSopenharmony_ci *
5323d0407baSopenharmony_ci * Clock with an adjustable divider affecting its output frequency.  Implements
5333d0407baSopenharmony_ci * .recalc_rate, .set_rate and .round_rate
5343d0407baSopenharmony_ci *
5353d0407baSopenharmony_ci * Flags:
5363d0407baSopenharmony_ci * CLK_DIVIDER_ONE_BASED - by default the divisor is the value read from the
5373d0407baSopenharmony_ci *    register plus one.  If CLK_DIVIDER_ONE_BASED is set then the divider is
5383d0407baSopenharmony_ci *    the raw value read from the register, with the value of zero considered
5393d0407baSopenharmony_ci *    invalid, unless CLK_DIVIDER_ALLOW_ZERO is set.
5403d0407baSopenharmony_ci * CLK_DIVIDER_POWER_OF_TWO - clock divisor is 2 raised to the value read from
5413d0407baSopenharmony_ci *    the hardware register
5423d0407baSopenharmony_ci * CLK_DIVIDER_ALLOW_ZERO - Allow zero divisors.  For dividers which have
5433d0407baSopenharmony_ci *    CLK_DIVIDER_ONE_BASED set, it is possible to end up with a zero divisor.
5443d0407baSopenharmony_ci *    Some hardware implementations gracefully handle this case and allow a
5453d0407baSopenharmony_ci *    zero divisor by not modifying their input clock
5463d0407baSopenharmony_ci *    (divide by one / bypass).
5473d0407baSopenharmony_ci * CLK_DIVIDER_HIWORD_MASK - The divider settings are only in lower 16-bit
5483d0407baSopenharmony_ci *    of this register, and mask of divider bits are in higher 16-bit of this
5493d0407baSopenharmony_ci *    register.  While setting the divider bits, higher 16-bit should also be
5503d0407baSopenharmony_ci *    updated to indicate changing divider bits.
5513d0407baSopenharmony_ci * CLK_DIVIDER_ROUND_CLOSEST - Makes the best calculated divider to be rounded
5523d0407baSopenharmony_ci *    to the closest integer instead of the up one.
5533d0407baSopenharmony_ci * CLK_DIVIDER_READ_ONLY - The divider settings are preconfigured and should
5543d0407baSopenharmony_ci *    not be changed by the clock framework.
5553d0407baSopenharmony_ci * CLK_DIVIDER_MAX_AT_ZERO - For dividers which are like CLK_DIVIDER_ONE_BASED
5563d0407baSopenharmony_ci *    except when the value read from the register is zero, the divisor is
5573d0407baSopenharmony_ci *    2^width of the field.
5583d0407baSopenharmony_ci * CLK_DIVIDER_BIG_ENDIAN - By default little endian register accesses are used
5593d0407baSopenharmony_ci *    for the divider register.  Setting this flag makes the register accesses
5603d0407baSopenharmony_ci *    big endian.
5613d0407baSopenharmony_ci */
5623d0407baSopenharmony_cistruct clk_divider {
5633d0407baSopenharmony_ci    struct clk_hw hw;
5643d0407baSopenharmony_ci    void __iomem *reg;
5653d0407baSopenharmony_ci    u8 shift;
5663d0407baSopenharmony_ci    u8 width;
5673d0407baSopenharmony_ci    u8 flags;
5683d0407baSopenharmony_ci    unsigned long max_prate;
5693d0407baSopenharmony_ci    const struct clk_div_table *table;
5703d0407baSopenharmony_ci    spinlock_t *lock;
5713d0407baSopenharmony_ci};
5723d0407baSopenharmony_ci
5733d0407baSopenharmony_ci#define clk_div_mask(width) ((1 << (width)) - 1)
5743d0407baSopenharmony_ci#define to_clk_divider(_hw) container_of(_hw, struct clk_divider, hw)
5753d0407baSopenharmony_ci
5763d0407baSopenharmony_ci#define CLK_DIVIDER_ONE_BASED BIT(0)
5773d0407baSopenharmony_ci#define CLK_DIVIDER_POWER_OF_TWO BIT(1)
5783d0407baSopenharmony_ci#define CLK_DIVIDER_ALLOW_ZERO BIT(2)
5793d0407baSopenharmony_ci#define CLK_DIVIDER_HIWORD_MASK BIT(3)
5803d0407baSopenharmony_ci#define CLK_DIVIDER_ROUND_CLOSEST BIT(4)
5813d0407baSopenharmony_ci#define CLK_DIVIDER_READ_ONLY BIT(5)
5823d0407baSopenharmony_ci#define CLK_DIVIDER_MAX_AT_ZERO BIT(6)
5833d0407baSopenharmony_ci#define CLK_DIVIDER_BIG_ENDIAN BIT(7)
5843d0407baSopenharmony_ci
5853d0407baSopenharmony_ciextern const struct clk_ops clk_divider_ops;
5863d0407baSopenharmony_ciextern const struct clk_ops clk_divider_ro_ops;
5873d0407baSopenharmony_ci
5883d0407baSopenharmony_ciunsigned long divider_recalc_rate(struct clk_hw *hw, unsigned long parent_rate, unsigned int val,
5893d0407baSopenharmony_ci                                  const struct clk_div_table *table, unsigned long flags, unsigned long width);
5903d0407baSopenharmony_cilong divider_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, unsigned long rate, unsigned long *prate,
5913d0407baSopenharmony_ci                               const struct clk_div_table *table, u8 width, unsigned long flags);
5923d0407baSopenharmony_cilong divider_ro_round_rate_parent(struct clk_hw *hw, struct clk_hw *parent, unsigned long rate, unsigned long *prate,
5933d0407baSopenharmony_ci                                  const struct clk_div_table *table, u8 width, unsigned long flags, unsigned int val);
5943d0407baSopenharmony_ciint divider_get_val(unsigned long rate, unsigned long parent_rate, const struct clk_div_table *table, u8 width,
5953d0407baSopenharmony_ci                    unsigned long flags);
5963d0407baSopenharmony_ci
5973d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_divider(struct device *dev, struct device_node *np, const char *name,
5983d0407baSopenharmony_ci                                         const char *parent_name, const struct clk_hw *parent_hw,
5993d0407baSopenharmony_ci                                         const struct clk_parent_data *parent_data, unsigned long flags,
6003d0407baSopenharmony_ci                                         void __iomem *reg, u8 shift, u8 width, u8 clk_divider_flags,
6013d0407baSopenharmony_ci                                         const struct clk_div_table *table, spinlock_t *lock);
6023d0407baSopenharmony_cistruct clk *clk_register_divider_table(struct device *dev, const char *name, const char *parent_name,
6033d0407baSopenharmony_ci                                       unsigned long flags, void __iomem *reg, u8 shift, u8 width, u8 clk_divider_flags,
6043d0407baSopenharmony_ci                                       const struct clk_div_table *table, spinlock_t *lock);
6053d0407baSopenharmony_ci/**
6063d0407baSopenharmony_ci * clk_register_divider - register a divider clock with the clock framework
6073d0407baSopenharmony_ci * @dev: device registering this clock
6083d0407baSopenharmony_ci * @name: name of this clock
6093d0407baSopenharmony_ci * @parent_name: name of clock's parent
6103d0407baSopenharmony_ci * @flags: framework-specific flags
6113d0407baSopenharmony_ci * @reg: register address to adjust divider
6123d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6133d0407baSopenharmony_ci * @width: width of the bitfield
6143d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6153d0407baSopenharmony_ci * @lock: shared register lock for this clock
6163d0407baSopenharmony_ci */
6173d0407baSopenharmony_ci#define clk_register_divider(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, lock)                \
6183d0407baSopenharmony_ci    clk_register_divider_table((dev), (name), (parent_name), (flags), (reg), (shift), (width), (clk_divider_flags),    \
6193d0407baSopenharmony_ci                               NULL, (lock))
6203d0407baSopenharmony_ci/**
6213d0407baSopenharmony_ci * clk_hw_register_divider - register a divider clock with the clock framework
6223d0407baSopenharmony_ci * @dev: device registering this clock
6233d0407baSopenharmony_ci * @name: name of this clock
6243d0407baSopenharmony_ci * @parent_name: name of clock's parent
6253d0407baSopenharmony_ci * @flags: framework-specific flags
6263d0407baSopenharmony_ci * @reg: register address to adjust divider
6273d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6283d0407baSopenharmony_ci * @width: width of the bitfield
6293d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6303d0407baSopenharmony_ci * @lock: shared register lock for this clock
6313d0407baSopenharmony_ci */
6323d0407baSopenharmony_ci#define clk_hw_register_divider(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, lock)             \
6333d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (shift), (width),        \
6343d0407baSopenharmony_ci                              (clk_divider_flags), NULL, (lock))
6353d0407baSopenharmony_ci/**
6363d0407baSopenharmony_ci * clk_hw_register_divider_parent_hw - register a divider clock with the clock
6373d0407baSopenharmony_ci * framework
6383d0407baSopenharmony_ci * @dev: device registering this clock
6393d0407baSopenharmony_ci * @name: name of this clock
6403d0407baSopenharmony_ci * @parent_hw: pointer to parent clk
6413d0407baSopenharmony_ci * @flags: framework-specific flags
6423d0407baSopenharmony_ci * @reg: register address to adjust divider
6433d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6443d0407baSopenharmony_ci * @width: width of the bitfield
6453d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6463d0407baSopenharmony_ci * @lock: shared register lock for this clock
6473d0407baSopenharmony_ci */
6483d0407baSopenharmony_ci#define clk_hw_register_divider_parent_hw(dev, name, parent_hw, flags, reg, shift, width, clk_divider_flags, lock)     \
6493d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (shift), (width),          \
6503d0407baSopenharmony_ci                              (clk_divider_flags), NULL, (lock))
6513d0407baSopenharmony_ci/**
6523d0407baSopenharmony_ci * clk_hw_register_divider_parent_data - register a divider clock with the clock
6533d0407baSopenharmony_ci * framework
6543d0407baSopenharmony_ci * @dev: device registering this clock
6553d0407baSopenharmony_ci * @name: name of this clock
6563d0407baSopenharmony_ci * @parent_data: parent clk data
6573d0407baSopenharmony_ci * @flags: framework-specific flags
6583d0407baSopenharmony_ci * @reg: register address to adjust divider
6593d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6603d0407baSopenharmony_ci * @width: width of the bitfield
6613d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6623d0407baSopenharmony_ci * @lock: shared register lock for this clock
6633d0407baSopenharmony_ci */
6643d0407baSopenharmony_ci#define clk_hw_register_divider_parent_data(dev, name, parent_data, flags, reg, shift, width, clk_divider_flags, lock) \
6653d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (shift), (width),        \
6663d0407baSopenharmony_ci                              (clk_divider_flags), NULL, (lock))
6673d0407baSopenharmony_ci/**
6683d0407baSopenharmony_ci * clk_hw_register_divider_table - register a table based divider clock with
6693d0407baSopenharmony_ci * the clock framework
6703d0407baSopenharmony_ci * @dev: device registering this clock
6713d0407baSopenharmony_ci * @name: name of this clock
6723d0407baSopenharmony_ci * @parent_name: name of clock's parent
6733d0407baSopenharmony_ci * @flags: framework-specific flags
6743d0407baSopenharmony_ci * @reg: register address to adjust divider
6753d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6763d0407baSopenharmony_ci * @width: width of the bitfield
6773d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6783d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0
6793d0407baSopenharmony_ci * @lock: shared register lock for this clock
6803d0407baSopenharmony_ci */
6813d0407baSopenharmony_ci#define clk_hw_register_divider_table(dev, name, parent_name, flags, reg, shift, width, clk_divider_flags, table,      \
6823d0407baSopenharmony_ci                                      lock)                                                                            \
6833d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), (parent_name), NULL, NULL, (flags), (reg), (shift), (width),        \
6843d0407baSopenharmony_ci                              (clk_divider_flags), (table), (lock))
6853d0407baSopenharmony_ci/**
6863d0407baSopenharmony_ci * clk_hw_register_divider_table_parent_hw - register a table based divider
6873d0407baSopenharmony_ci * clock with the clock framework
6883d0407baSopenharmony_ci * @dev: device registering this clock
6893d0407baSopenharmony_ci * @name: name of this clock
6903d0407baSopenharmony_ci * @parent_hw: pointer to parent clk
6913d0407baSopenharmony_ci * @flags: framework-specific flags
6923d0407baSopenharmony_ci * @reg: register address to adjust divider
6933d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
6943d0407baSopenharmony_ci * @width: width of the bitfield
6953d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
6963d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0
6973d0407baSopenharmony_ci * @lock: shared register lock for this clock
6983d0407baSopenharmony_ci */
6993d0407baSopenharmony_ci#define clk_hw_register_divider_table_parent_hw(dev, name, parent_hw, flags, reg, shift, width, clk_divider_flags,     \
7003d0407baSopenharmony_ci                                                table, lock)                                                           \
7013d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), NULL, (parent_hw), NULL, (flags), (reg), (shift), (width),          \
7023d0407baSopenharmony_ci                              (clk_divider_flags), (table), (lock))
7033d0407baSopenharmony_ci/**
7043d0407baSopenharmony_ci * clk_hw_register_divider_table_parent_data - register a table based divider
7053d0407baSopenharmony_ci * clock with the clock framework
7063d0407baSopenharmony_ci * @dev: device registering this clock
7073d0407baSopenharmony_ci * @name: name of this clock
7083d0407baSopenharmony_ci * @parent_data: parent clk data
7093d0407baSopenharmony_ci * @flags: framework-specific flags
7103d0407baSopenharmony_ci * @reg: register address to adjust divider
7113d0407baSopenharmony_ci * @shift: number of bits to shift the bitfield
7123d0407baSopenharmony_ci * @width: width of the bitfield
7133d0407baSopenharmony_ci * @clk_divider_flags: divider-specific flags for this clock
7143d0407baSopenharmony_ci * @table: array of divider/value pairs ending with a div set to 0
7153d0407baSopenharmony_ci * @lock: shared register lock for this clock
7163d0407baSopenharmony_ci */
7173d0407baSopenharmony_ci#define clk_hw_register_divider_table_parent_data(dev, name, parent_data, flags, reg, shift, width, clk_divider_flags, \
7183d0407baSopenharmony_ci                                                  table, lock)                                                         \
7193d0407baSopenharmony_ci    __clk_hw_register_divider((dev), NULL, (name), NULL, NULL, (parent_data), (flags), (reg), (shift), (width),        \
7203d0407baSopenharmony_ci                              (clk_divider_flags), (table), (lock))
7213d0407baSopenharmony_ci
7223d0407baSopenharmony_civoid clk_unregister_divider(struct clk *clk);
7233d0407baSopenharmony_civoid clk_hw_unregister_divider(struct clk_hw *hw);
7243d0407baSopenharmony_ci
7253d0407baSopenharmony_ci/**
7263d0407baSopenharmony_ci * struct clk_mux - multiplexer clock
7273d0407baSopenharmony_ci *
7283d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
7293d0407baSopenharmony_ci * @reg:    register controlling multiplexer
7303d0407baSopenharmony_ci * @table:    array of register values corresponding to the parent index
7313d0407baSopenharmony_ci * @shift:    shift to multiplexer bit field
7323d0407baSopenharmony_ci * @mask:    mask of mutliplexer bit field
7333d0407baSopenharmony_ci * @flags:    hardware-specific flags
7343d0407baSopenharmony_ci * @lock:    register lock
7353d0407baSopenharmony_ci *
7363d0407baSopenharmony_ci * Clock with multiple selectable parents.  Implements .get_parent, .set_parent
7373d0407baSopenharmony_ci * and .recalc_rate
7383d0407baSopenharmony_ci *
7393d0407baSopenharmony_ci * Flags:
7403d0407baSopenharmony_ci * CLK_MUX_INDEX_ONE - register index starts at 1, not 0
7413d0407baSopenharmony_ci * CLK_MUX_INDEX_BIT - register index is a single bit (power of two)
7423d0407baSopenharmony_ci * CLK_MUX_HIWORD_MASK - The mux settings are only in lower 16-bit of this
7433d0407baSopenharmony_ci *    register, and mask of mux bits are in higher 16-bit of this register.
7443d0407baSopenharmony_ci *    While setting the mux bits, higher 16-bit should also be updated to
7453d0407baSopenharmony_ci *    indicate changing mux bits.
7463d0407baSopenharmony_ci * CLK_MUX_READ_ONLY - The mux registers can't be written, only read in the
7473d0407baSopenharmony_ci *     .get_parent clk_op.
7483d0407baSopenharmony_ci * CLK_MUX_ROUND_CLOSEST - Use the parent rate that is closest to the desired
7493d0407baSopenharmony_ci *    frequency.
7503d0407baSopenharmony_ci * CLK_MUX_BIG_ENDIAN - By default little endian register accesses are used for
7513d0407baSopenharmony_ci *    the mux register.  Setting this flag makes the register accesses big
7523d0407baSopenharmony_ci *    endian.
7533d0407baSopenharmony_ci */
7543d0407baSopenharmony_cistruct clk_mux {
7553d0407baSopenharmony_ci    struct clk_hw hw;
7563d0407baSopenharmony_ci    void __iomem *reg;
7573d0407baSopenharmony_ci    u32 *table;
7583d0407baSopenharmony_ci    u32 mask;
7593d0407baSopenharmony_ci    u8 shift;
7603d0407baSopenharmony_ci    u8 flags;
7613d0407baSopenharmony_ci    spinlock_t *lock;
7623d0407baSopenharmony_ci};
7633d0407baSopenharmony_ci
7643d0407baSopenharmony_ci#define to_clk_mux(_hw) container_of(_hw, struct clk_mux, hw)
7653d0407baSopenharmony_ci
7663d0407baSopenharmony_ci#define CLK_MUX_INDEX_ONE BIT(0)
7673d0407baSopenharmony_ci#define CLK_MUX_INDEX_BIT BIT(1)
7683d0407baSopenharmony_ci#define CLK_MUX_HIWORD_MASK BIT(2)
7693d0407baSopenharmony_ci#define CLK_MUX_READ_ONLY BIT(3) /* mux can't be changed */
7703d0407baSopenharmony_ci#define CLK_MUX_ROUND_CLOSEST BIT(4)
7713d0407baSopenharmony_ci#define CLK_MUX_BIG_ENDIAN BIT(5)
7723d0407baSopenharmony_ci
7733d0407baSopenharmony_ciextern const struct clk_ops clk_mux_ops;
7743d0407baSopenharmony_ciextern const struct clk_ops clk_mux_ro_ops;
7753d0407baSopenharmony_ci
7763d0407baSopenharmony_cistruct clk_hw *__clk_hw_register_mux(struct device *dev, struct device_node *np, const char *name, u8 num_parents,
7773d0407baSopenharmony_ci                                     const char *const *parent_names, const struct clk_hw **parent_hws,
7783d0407baSopenharmony_ci                                     const struct clk_parent_data *parent_data, unsigned long flags, void __iomem *reg,
7793d0407baSopenharmony_ci                                     u8 shift, u32 mask, u8 clk_mux_flags, u32 *table, spinlock_t *lock);
7803d0407baSopenharmony_cistruct clk *clk_register_mux_table(struct device *dev, const char *name, const char *const *parent_names,
7813d0407baSopenharmony_ci                                   u8 num_parents, unsigned long flags, void __iomem *reg, u8 shift, u32 mask,
7823d0407baSopenharmony_ci                                   u8 clk_mux_flags, u32 *table, spinlock_t *lock);
7833d0407baSopenharmony_ci
7843d0407baSopenharmony_ci#define clk_register_mux(dev, name, parent_names, num_parents, flags, reg, shift, width, clk_mux_flags, lock)          \
7853d0407baSopenharmony_ci    clk_register_mux_table((dev), (name), (parent_names), (num_parents), (flags), (reg), (shift), BIT((width)) - 1,    \
7863d0407baSopenharmony_ci                           (clk_mux_flags), NULL, (lock))
7873d0407baSopenharmony_ci#define clk_hw_register_mux_table(dev, name, parent_names, num_parents, flags, reg, shift, mask, clk_mux_flags, table, \
7883d0407baSopenharmony_ci                                  lock)                                                                                \
7893d0407baSopenharmony_ci    __clk_hw_register_mux((dev), NULL, (name), (num_parents), (parent_names), NULL, NULL, (flags), (reg), (shift),     \
7903d0407baSopenharmony_ci                          (mask), (clk_mux_flags), (table), (lock))
7913d0407baSopenharmony_ci#define clk_hw_register_mux(dev, name, parent_names, num_parents, flags, reg, shift, width, clk_mux_flags, lock)       \
7923d0407baSopenharmony_ci    __clk_hw_register_mux((dev), NULL, (name), (num_parents), (parent_names), NULL, NULL, (flags), (reg), (shift),     \
7933d0407baSopenharmony_ci                          BIT((width)) - 1, (clk_mux_flags), NULL, (lock))
7943d0407baSopenharmony_ci#define clk_hw_register_mux_hws(dev, name, parent_hws, num_parents, flags, reg, shift, width, clk_mux_flags, lock)     \
7953d0407baSopenharmony_ci    __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, (parent_hws), NULL, (flags), (reg), (shift),       \
7963d0407baSopenharmony_ci                          BIT((width)) - 1, (clk_mux_flags), NULL, (lock))
7973d0407baSopenharmony_ci#define clk_hw_register_mux_parent_data(dev, name, parent_data, num_parents, flags, reg, shift, width, clk_mux_flags,  \
7983d0407baSopenharmony_ci                                        lock)                                                                          \
7993d0407baSopenharmony_ci    __clk_hw_register_mux((dev), NULL, (name), (num_parents), NULL, NULL, (parent_data), (flags), (reg), (shift),      \
8003d0407baSopenharmony_ci                          BIT((width)) - 1, (clk_mux_flags), NULL, (lock))
8013d0407baSopenharmony_ci
8023d0407baSopenharmony_ciint clk_mux_val_to_index(struct clk_hw *hw, u32 *table, unsigned int flags, unsigned int val);
8033d0407baSopenharmony_ciunsigned int clk_mux_index_to_val(u32 *table, unsigned int flags, u8 index);
8043d0407baSopenharmony_ci
8053d0407baSopenharmony_civoid clk_unregister_mux(struct clk *clk);
8063d0407baSopenharmony_civoid clk_hw_unregister_mux(struct clk_hw *hw);
8073d0407baSopenharmony_ci
8083d0407baSopenharmony_civoid of_fixed_factor_clk_setup(struct device_node *node);
8093d0407baSopenharmony_ci
8103d0407baSopenharmony_ci/**
8113d0407baSopenharmony_ci * struct clk_fixed_factor - fixed multiplier and divider clock
8123d0407baSopenharmony_ci *
8133d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
8143d0407baSopenharmony_ci * @mult:    multiplier
8153d0407baSopenharmony_ci * @div:    divider
8163d0407baSopenharmony_ci *
8173d0407baSopenharmony_ci * Clock with a fixed multiplier and divider. The output frequency is the
8183d0407baSopenharmony_ci * parent clock rate divided by div and multiplied by mult.
8193d0407baSopenharmony_ci * Implements .recalc_rate, .set_rate and .round_rate
8203d0407baSopenharmony_ci */
8213d0407baSopenharmony_ci
8223d0407baSopenharmony_cistruct clk_fixed_factor {
8233d0407baSopenharmony_ci    struct clk_hw hw;
8243d0407baSopenharmony_ci    unsigned int mult;
8253d0407baSopenharmony_ci    unsigned int div;
8263d0407baSopenharmony_ci};
8273d0407baSopenharmony_ci
8283d0407baSopenharmony_ci#define to_clk_fixed_factor(_hw) container_of(_hw, struct clk_fixed_factor, hw)
8293d0407baSopenharmony_ci
8303d0407baSopenharmony_ciextern const struct clk_ops clk_fixed_factor_ops;
8313d0407baSopenharmony_cistruct clk *clk_register_fixed_factor(struct device *dev, const char *name, const char *parent_name,
8323d0407baSopenharmony_ci                                      unsigned long flags, unsigned int mult, unsigned int div);
8333d0407baSopenharmony_civoid clk_unregister_fixed_factor(struct clk *clk);
8343d0407baSopenharmony_cistruct clk_hw *clk_hw_register_fixed_factor(struct device *dev, const char *name, const char *parent_name,
8353d0407baSopenharmony_ci                                            unsigned long flags, unsigned int mult, unsigned int div);
8363d0407baSopenharmony_civoid clk_hw_unregister_fixed_factor(struct clk_hw *hw);
8373d0407baSopenharmony_ci
8383d0407baSopenharmony_ci/**
8393d0407baSopenharmony_ci * struct clk_fractional_divider - adjustable fractional divider clock
8403d0407baSopenharmony_ci *
8413d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
8423d0407baSopenharmony_ci * @reg:    register containing the divider
8433d0407baSopenharmony_ci * @mshift:    shift to the numerator bit field
8443d0407baSopenharmony_ci * @mwidth:    width of the numerator bit field
8453d0407baSopenharmony_ci * @nshift:    shift to the denominator bit field
8463d0407baSopenharmony_ci * @nwidth:    width of the denominator bit field
8473d0407baSopenharmony_ci * @lock:    register lock
8483d0407baSopenharmony_ci *
8493d0407baSopenharmony_ci * Clock with adjustable fractional divider affecting its output frequency.
8503d0407baSopenharmony_ci *
8513d0407baSopenharmony_ci * Flags:
8523d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_ZERO_BASED - by default the numerator and denominator
8533d0407baSopenharmony_ci *    is the value read from the register. If CLK_FRAC_DIVIDER_ZERO_BASED
8543d0407baSopenharmony_ci *    is set then the numerator and denominator are both the value read
8553d0407baSopenharmony_ci *    plus one.
8563d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_BIG_ENDIAN - By default little endian register accesses are
8573d0407baSopenharmony_ci *    used for the divider register.  Setting this flag makes the register
8583d0407baSopenharmony_ci *    accesses big endian.
8593d0407baSopenharmony_ci * CLK_FRAC_DIVIDER_NO_LIMIT - not need to follow the 20 times limit on
8603d0407baSopenharmony_ci *    fractional divider
8613d0407baSopenharmony_ci */
8623d0407baSopenharmony_cistruct clk_fractional_divider {
8633d0407baSopenharmony_ci    struct clk_hw hw;
8643d0407baSopenharmony_ci    void __iomem *reg;
8653d0407baSopenharmony_ci    u8 mshift;
8663d0407baSopenharmony_ci    u8 mwidth;
8673d0407baSopenharmony_ci    u32 mmask;
8683d0407baSopenharmony_ci    u8 nshift;
8693d0407baSopenharmony_ci    u8 nwidth;
8703d0407baSopenharmony_ci    u32 nmask;
8713d0407baSopenharmony_ci    u8 flags;
8723d0407baSopenharmony_ci    unsigned long max_prate;
8733d0407baSopenharmony_ci    void (*approximation)(struct clk_hw *hw, unsigned long rate, unsigned long *parent_rate, unsigned long *m,
8743d0407baSopenharmony_ci                          unsigned long *n);
8753d0407baSopenharmony_ci    spinlock_t *lock;
8763d0407baSopenharmony_ci};
8773d0407baSopenharmony_ci
8783d0407baSopenharmony_ci#define to_clk_fd(_hw) container_of(_hw, struct clk_fractional_divider, hw)
8793d0407baSopenharmony_ci
8803d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_ZERO_BASED BIT(0)
8813d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_BIG_ENDIAN BIT(1)
8823d0407baSopenharmony_ci#define CLK_FRAC_DIVIDER_NO_LIMIT BIT(2)
8833d0407baSopenharmony_ci
8843d0407baSopenharmony_ciextern const struct clk_ops clk_fractional_divider_ops;
8853d0407baSopenharmony_cistruct clk *clk_register_fractional_divider(struct device *dev, const char *name, const char *parent_name,
8863d0407baSopenharmony_ci                                            unsigned long flags, void __iomem *reg, u8 mshift, u8 mwidth, u8 nshift,
8873d0407baSopenharmony_ci                                            u8 nwidth, u8 clk_divider_flags, spinlock_t *lock);
8883d0407baSopenharmony_cistruct clk_hw *clk_hw_register_fractional_divider(struct device *dev, const char *name, const char *parent_name,
8893d0407baSopenharmony_ci                                                  unsigned long flags, void __iomem *reg, u8 mshift, u8 mwidth,
8903d0407baSopenharmony_ci                                                  u8 nshift, u8 nwidth, u8 clk_divider_flags, spinlock_t *lock);
8913d0407baSopenharmony_civoid clk_hw_unregister_fractional_divider(struct clk_hw *hw);
8923d0407baSopenharmony_ci
8933d0407baSopenharmony_ci/**
8943d0407baSopenharmony_ci * struct clk_multiplier - adjustable multiplier clock
8953d0407baSopenharmony_ci *
8963d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
8973d0407baSopenharmony_ci * @reg:    register containing the multiplier
8983d0407baSopenharmony_ci * @shift:    shift to the multiplier bit field
8993d0407baSopenharmony_ci * @width:    width of the multiplier bit field
9003d0407baSopenharmony_ci * @lock:    register lock
9013d0407baSopenharmony_ci *
9023d0407baSopenharmony_ci * Clock with an adjustable multiplier affecting its output frequency.
9033d0407baSopenharmony_ci * Implements .recalc_rate, .set_rate and .round_rate
9043d0407baSopenharmony_ci *
9053d0407baSopenharmony_ci * Flags:
9063d0407baSopenharmony_ci * CLK_MULTIPLIER_ZERO_BYPASS - By default, the multiplier is the value read
9073d0407baSopenharmony_ci *    from the register, with 0 being a valid value effectively
9083d0407baSopenharmony_ci *    zeroing the output clock rate. If CLK_MULTIPLIER_ZERO_BYPASS is
9093d0407baSopenharmony_ci *    set, then a null multiplier will be considered as a bypass,
9103d0407baSopenharmony_ci *    leaving the parent rate unmodified.
9113d0407baSopenharmony_ci * CLK_MULTIPLIER_ROUND_CLOSEST - Makes the best calculated divider to be
9123d0407baSopenharmony_ci *    rounded to the closest integer instead of the down one.
9133d0407baSopenharmony_ci * CLK_MULTIPLIER_BIG_ENDIAN - By default little endian register accesses are
9143d0407baSopenharmony_ci *    used for the multiplier register.  Setting this flag makes the register
9153d0407baSopenharmony_ci *    accesses big endian.
9163d0407baSopenharmony_ci */
9173d0407baSopenharmony_cistruct clk_multiplier {
9183d0407baSopenharmony_ci    struct clk_hw hw;
9193d0407baSopenharmony_ci    void __iomem *reg;
9203d0407baSopenharmony_ci    u8 shift;
9213d0407baSopenharmony_ci    u8 width;
9223d0407baSopenharmony_ci    u8 flags;
9233d0407baSopenharmony_ci    spinlock_t *lock;
9243d0407baSopenharmony_ci};
9253d0407baSopenharmony_ci
9263d0407baSopenharmony_ci#define to_clk_multiplier(_hw) container_of(_hw, struct clk_multiplier, hw)
9273d0407baSopenharmony_ci
9283d0407baSopenharmony_ci#define CLK_MULTIPLIER_ZERO_BYPASS BIT(0)
9293d0407baSopenharmony_ci#define CLK_MULTIPLIER_ROUND_CLOSEST BIT(1)
9303d0407baSopenharmony_ci#define CLK_MULTIPLIER_BIG_ENDIAN BIT(2)
9313d0407baSopenharmony_ci
9323d0407baSopenharmony_ciextern const struct clk_ops clk_multiplier_ops;
9333d0407baSopenharmony_ci
9343d0407baSopenharmony_ci/***
9353d0407baSopenharmony_ci * struct clk_composite - aggregate clock of mux, divider and gate clocks
9363d0407baSopenharmony_ci *
9373d0407baSopenharmony_ci * @hw:        handle between common and hardware-specific interfaces
9383d0407baSopenharmony_ci * @mux_hw:    handle between composite and hardware-specific mux clock
9393d0407baSopenharmony_ci * @rate_hw:    handle between composite and hardware-specific rate clock
9403d0407baSopenharmony_ci * @gate_hw:    handle between composite and hardware-specific gate clock
9413d0407baSopenharmony_ci * @brother_hw: a member of clk_composite who has the common parent clocks
9423d0407baSopenharmony_ci *              with another clk_composite, and it's also a handle between
9433d0407baSopenharmony_ci *              common and hardware-specific interfaces
9443d0407baSopenharmony_ci * @mux_ops:    clock ops for mux
9453d0407baSopenharmony_ci * @rate_ops:    clock ops for rate
9463d0407baSopenharmony_ci * @gate_ops:    clock ops for gate
9473d0407baSopenharmony_ci */
9483d0407baSopenharmony_cistruct clk_composite {
9493d0407baSopenharmony_ci    struct clk_hw hw;
9503d0407baSopenharmony_ci    struct clk_ops ops;
9513d0407baSopenharmony_ci
9523d0407baSopenharmony_ci    struct clk_hw *mux_hw;
9533d0407baSopenharmony_ci    struct clk_hw *rate_hw;
9543d0407baSopenharmony_ci    struct clk_hw *gate_hw;
9553d0407baSopenharmony_ci    struct clk_hw *brother_hw;
9563d0407baSopenharmony_ci
9573d0407baSopenharmony_ci    const struct clk_ops *mux_ops;
9583d0407baSopenharmony_ci    const struct clk_ops *rate_ops;
9593d0407baSopenharmony_ci    const struct clk_ops *gate_ops;
9603d0407baSopenharmony_ci};
9613d0407baSopenharmony_ci
9623d0407baSopenharmony_ci#define to_clk_composite(_hw) container_of(_hw, struct clk_composite, hw)
9633d0407baSopenharmony_ci
9643d0407baSopenharmony_cistruct clk *clk_register_composite(struct device *dev, const char *name, const char *const *parent_names,
9653d0407baSopenharmony_ci                                   int num_parents, struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
9663d0407baSopenharmony_ci                                   struct clk_hw *rate_hw, const struct clk_ops *rate_ops, struct clk_hw *gate_hw,
9673d0407baSopenharmony_ci                                   const struct clk_ops *gate_ops, unsigned long flags);
9683d0407baSopenharmony_cistruct clk *clk_register_composite_pdata(struct device *dev, const char *name,
9693d0407baSopenharmony_ci                                         const struct clk_parent_data *parent_data, int num_parents,
9703d0407baSopenharmony_ci                                         struct clk_hw *mux_hw, const struct clk_ops *mux_ops, struct clk_hw *rate_hw,
9713d0407baSopenharmony_ci                                         const struct clk_ops *rate_ops, struct clk_hw *gate_hw,
9723d0407baSopenharmony_ci                                         const struct clk_ops *gate_ops, unsigned long flags);
9733d0407baSopenharmony_civoid clk_unregister_composite(struct clk *clk);
9743d0407baSopenharmony_cistruct clk_hw *clk_hw_register_composite(struct device *dev, const char *name, const char *const *parent_names,
9753d0407baSopenharmony_ci                                         int num_parents, struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
9763d0407baSopenharmony_ci                                         struct clk_hw *rate_hw, const struct clk_ops *rate_ops, struct clk_hw *gate_hw,
9773d0407baSopenharmony_ci                                         const struct clk_ops *gate_ops, unsigned long flags);
9783d0407baSopenharmony_cistruct clk_hw *clk_hw_register_composite_pdata(struct device *dev, const char *name,
9793d0407baSopenharmony_ci                                               const struct clk_parent_data *parent_data, int num_parents,
9803d0407baSopenharmony_ci                                               struct clk_hw *mux_hw, const struct clk_ops *mux_ops,
9813d0407baSopenharmony_ci                                               struct clk_hw *rate_hw, const struct clk_ops *rate_ops,
9823d0407baSopenharmony_ci                                               struct clk_hw *gate_hw, const struct clk_ops *gate_ops,
9833d0407baSopenharmony_ci                                               unsigned long flags);
9843d0407baSopenharmony_civoid clk_hw_unregister_composite(struct clk_hw *hw);
9853d0407baSopenharmony_ci
9863d0407baSopenharmony_cistruct clk *clk_register(struct device *dev, struct clk_hw *hw);
9873d0407baSopenharmony_cistruct clk *devm_clk_register(struct device *dev, struct clk_hw *hw);
9883d0407baSopenharmony_ci
9893d0407baSopenharmony_ciint __must_check clk_hw_register(struct device *dev, struct clk_hw *hw);
9903d0407baSopenharmony_ciint __must_check devm_clk_hw_register(struct device *dev, struct clk_hw *hw);
9913d0407baSopenharmony_ciint __must_check of_clk_hw_register(struct device_node *node, struct clk_hw *hw);
9923d0407baSopenharmony_ci
9933d0407baSopenharmony_civoid clk_unregister(struct clk *clk);
9943d0407baSopenharmony_civoid devm_clk_unregister(struct device *dev, struct clk *clk);
9953d0407baSopenharmony_ci
9963d0407baSopenharmony_civoid clk_hw_unregister(struct clk_hw *hw);
9973d0407baSopenharmony_civoid devm_clk_hw_unregister(struct device *dev, struct clk_hw *hw);
9983d0407baSopenharmony_ci
9993d0407baSopenharmony_ci/* helper functions */
10003d0407baSopenharmony_ciconst char *__clk_get_name(const struct clk *clk);
10013d0407baSopenharmony_ciconst char *clk_hw_get_name(const struct clk_hw *hw);
10023d0407baSopenharmony_ci#ifdef CONFIG_COMMON_CLK
10033d0407baSopenharmony_cistruct clk_hw *__clk_get_hw(struct clk *clk);
10043d0407baSopenharmony_ci#else
10053d0407baSopenharmony_cistatic inline struct clk_hw *__clk_get_hw(struct clk *clk)
10063d0407baSopenharmony_ci{
10073d0407baSopenharmony_ci    return (struct clk_hw *)clk;
10083d0407baSopenharmony_ci}
10093d0407baSopenharmony_ci#endif
10103d0407baSopenharmony_ciunsigned int clk_hw_get_num_parents(const struct clk_hw *hw);
10113d0407baSopenharmony_cistruct clk_hw *clk_hw_get_parent(const struct clk_hw *hw);
10123d0407baSopenharmony_cistruct clk_hw *clk_hw_get_parent_by_index(const struct clk_hw *hw, unsigned int index);
10133d0407baSopenharmony_ciint clk_hw_get_parent_index(struct clk_hw *hw);
10143d0407baSopenharmony_ciint clk_hw_set_parent(struct clk_hw *hw, struct clk_hw *new_parent);
10153d0407baSopenharmony_ciunsigned int __clk_get_enable_count(struct clk *clk);
10163d0407baSopenharmony_ciunsigned long clk_hw_get_rate(const struct clk_hw *hw);
10173d0407baSopenharmony_ciunsigned long clk_hw_get_flags(const struct clk_hw *hw);
10183d0407baSopenharmony_ci#define clk_hw_can_set_rate_parent(hw) (clk_hw_get_flags((hw)) & CLK_SET_RATE_PARENT)
10193d0407baSopenharmony_ci
10203d0407baSopenharmony_cibool clk_hw_is_prepared(const struct clk_hw *hw);
10213d0407baSopenharmony_cibool clk_hw_rate_is_protected(const struct clk_hw *hw);
10223d0407baSopenharmony_cibool clk_hw_is_enabled(const struct clk_hw *hw);
10233d0407baSopenharmony_cibool __clk_is_enabled(struct clk *clk);
10243d0407baSopenharmony_cistruct clk *__clk_lookup(const char *name);
10253d0407baSopenharmony_ciint __clk_mux_determine_rate(struct clk_hw *hw, struct clk_rate_request *req);
10263d0407baSopenharmony_ciint __clk_determine_rate(struct clk_hw *core, struct clk_rate_request *req);
10273d0407baSopenharmony_ciint __clk_mux_determine_rate_closest(struct clk_hw *hw, struct clk_rate_request *req);
10283d0407baSopenharmony_ciint clk_mux_determine_rate_flags(struct clk_hw *hw, struct clk_rate_request *req, unsigned long flags);
10293d0407baSopenharmony_civoid clk_hw_reparent(struct clk_hw *hw, struct clk_hw *new_parent);
10303d0407baSopenharmony_civoid clk_hw_set_rate_range(struct clk_hw *hw, unsigned long min_rate, unsigned long max_rate);
10313d0407baSopenharmony_ci
10323d0407baSopenharmony_cistatic inline void __clk_hw_set_clk(struct clk_hw *dst, struct clk_hw *src)
10333d0407baSopenharmony_ci{
10343d0407baSopenharmony_ci    dst->clk = src->clk;
10353d0407baSopenharmony_ci    dst->core = src->core;
10363d0407baSopenharmony_ci}
10373d0407baSopenharmony_ci
10383d0407baSopenharmony_cistatic inline long divider_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate,
10393d0407baSopenharmony_ci                                      const struct clk_div_table *table, u8 width, unsigned long flags)
10403d0407baSopenharmony_ci{
10413d0407baSopenharmony_ci    return divider_round_rate_parent(hw, clk_hw_get_parent(hw), rate, prate, table, width, flags);
10423d0407baSopenharmony_ci}
10433d0407baSopenharmony_ci
10443d0407baSopenharmony_cistatic inline long divider_ro_round_rate(struct clk_hw *hw, unsigned long rate, unsigned long *prate,
10453d0407baSopenharmony_ci                                         const struct clk_div_table *table, u8 width, unsigned long flags,
10463d0407baSopenharmony_ci                                         unsigned int val)
10473d0407baSopenharmony_ci{
10483d0407baSopenharmony_ci    return divider_ro_round_rate_parent(hw, clk_hw_get_parent(hw), rate, prate, table, width, flags, val);
10493d0407baSopenharmony_ci}
10503d0407baSopenharmony_ci
10513d0407baSopenharmony_ci/*
10523d0407baSopenharmony_ci * clock api without lock protection
10533d0407baSopenharmony_ci */
10543d0407baSopenharmony_ciunsigned long clk_hw_round_rate(struct clk_hw *hw, unsigned long rate);
10553d0407baSopenharmony_ci
10563d0407baSopenharmony_cistruct clk_onecell_data {
10573d0407baSopenharmony_ci    struct clk **clks;
10583d0407baSopenharmony_ci    unsigned int clk_num;
10593d0407baSopenharmony_ci};
10603d0407baSopenharmony_ci
10613d0407baSopenharmony_cistruct clk_hw_onecell_data {
10623d0407baSopenharmony_ci    unsigned int num;
10633d0407baSopenharmony_ci    struct clk_hw *hws[];
10643d0407baSopenharmony_ci};
10653d0407baSopenharmony_ci
10663d0407baSopenharmony_ci#define CLK_OF_DECLARE(name, compat, fn) OF_DECLARE_1(clk, name, compat, fn)
10673d0407baSopenharmony_ci
10683d0407baSopenharmony_ci/*
10693d0407baSopenharmony_ci * Use this macro when you have a driver that requires two initialization
10703d0407baSopenharmony_ci * routines, one at of_clk_init(), and one at platform device probe
10713d0407baSopenharmony_ci */
10723d0407baSopenharmony_ci#define CLK_OF_DECLARE_DRIVER(name, compat, fn)                                                                        \
10733d0407baSopenharmony_ci    static void __init name##_of_clk_init_driver(struct device_node *np)                                               \
10743d0407baSopenharmony_ci    {                                                                                                                  \
10753d0407baSopenharmony_ci        of_node_clear_flag(np, OF_POPULATED);                                                                          \
10763d0407baSopenharmony_ci        fn(np);                                                                                                        \
10773d0407baSopenharmony_ci    }                                                                                                                  \
10783d0407baSopenharmony_ci    OF_DECLARE_1(clk, name, compat, name##_of_clk_init_driver)
10793d0407baSopenharmony_ci
10803d0407baSopenharmony_ci#define CLK_HW_INIT(_name, _parent, _ops, _flags)                                                                      \
10813d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
10823d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
10833d0407baSopenharmony_ci        .name = (_name),                                                                                               \
10843d0407baSopenharmony_ci        .parent_names = (const char *[]) {_parent},                                                                    \
10853d0407baSopenharmony_ci        .num_parents = 1,                                                                                              \
10863d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
10873d0407baSopenharmony_ci    })
10883d0407baSopenharmony_ci
10893d0407baSopenharmony_ci#define CLK_HW_INIT_HW(_name, _parent, _ops, _flags)                                                                   \
10903d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
10913d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
10923d0407baSopenharmony_ci        .name = (_name),                                                                                               \
10933d0407baSopenharmony_ci        .parent_hws = (const struct clk_hw *[]) {_parent},                                                             \
10943d0407baSopenharmony_ci        .num_parents = 1,                                                                                              \
10953d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
10963d0407baSopenharmony_ci    })
10973d0407baSopenharmony_ci
10983d0407baSopenharmony_ci/*
10993d0407baSopenharmony_ci * This macro is intended for drivers to be able to share the otherwise
11003d0407baSopenharmony_ci * individual struct clk_hw[] compound literals created by the compiler
11013d0407baSopenharmony_ci * when using CLK_HW_INIT_HW. It does NOT support multiple parents.
11023d0407baSopenharmony_ci */
11033d0407baSopenharmony_ci#define CLK_HW_INIT_HWS(_name, _parent, _ops, _flags)                                                                  \
11043d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11053d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11063d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11073d0407baSopenharmony_ci        .parent_hws = (_parent),                                                                                       \
11083d0407baSopenharmony_ci        .num_parents = 1,                                                                                              \
11093d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11103d0407baSopenharmony_ci    })
11113d0407baSopenharmony_ci
11123d0407baSopenharmony_ci#define CLK_HW_INIT_FW_NAME(_name, _parent, _ops, _flags)                                                              \
11133d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11143d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11153d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11163d0407baSopenharmony_ci        .parent_data =                                                                                                 \
11173d0407baSopenharmony_ci            (const struct clk_parent_data[]) {                                                                         \
11183d0407baSopenharmony_ci                {.fw_name = _parent},                                                                                  \
11193d0407baSopenharmony_ci            },                                                                                                         \
11203d0407baSopenharmony_ci        .num_parents = 1,                                                                                              \
11213d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11223d0407baSopenharmony_ci    })
11233d0407baSopenharmony_ci
11243d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS(_name, _parents, _ops, _flags)                                                             \
11253d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11263d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11273d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11283d0407baSopenharmony_ci        .parent_names = (_parents),                                                                                    \
11293d0407baSopenharmony_ci        .num_parents = ARRAY_SIZE(_parents),                                                                           \
11303d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11313d0407baSopenharmony_ci    })
11323d0407baSopenharmony_ci
11333d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS_HW(_name, _parents, _ops, _flags)                                                          \
11343d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11353d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11363d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11373d0407baSopenharmony_ci        .parent_hws = (_parents),                                                                                      \
11383d0407baSopenharmony_ci        .num_parents = ARRAY_SIZE(_parents),                                                                           \
11393d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11403d0407baSopenharmony_ci    })
11413d0407baSopenharmony_ci
11423d0407baSopenharmony_ci#define CLK_HW_INIT_PARENTS_DATA(_name, _parents, _ops, _flags)                                                        \
11433d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11443d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11453d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11463d0407baSopenharmony_ci        .parent_data = (_parents),                                                                                     \
11473d0407baSopenharmony_ci        .num_parents = ARRAY_SIZE(_parents),                                                                           \
11483d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11493d0407baSopenharmony_ci    })
11503d0407baSopenharmony_ci
11513d0407baSopenharmony_ci#define CLK_HW_INIT_NO_PARENT(_name, _ops, _flags)                                                                     \
11523d0407baSopenharmony_ci    (&(struct clk_init_data) {                                                                                         \
11533d0407baSopenharmony_ci        .flags = (_flags),                                                                                             \
11543d0407baSopenharmony_ci        .name = (_name),                                                                                               \
11553d0407baSopenharmony_ci        .parent_names = NULL,                                                                                          \
11563d0407baSopenharmony_ci        .num_parents = 0,                                                                                              \
11573d0407baSopenharmony_ci        .ops = (_ops),                                                                                                 \
11583d0407baSopenharmony_ci    })
11593d0407baSopenharmony_ci
11603d0407baSopenharmony_ci#define CLK_FIXED_FACTOR(_struct, _name, _parent, _div, _mult, _flags)                                                 \
11613d0407baSopenharmony_ci    struct clk_fixed_factor _struct = {                                                                                \
11623d0407baSopenharmony_ci        .div = (_div),                                                                                                 \
11633d0407baSopenharmony_ci        .mult = (_mult),                                                                                               \
11643d0407baSopenharmony_ci        .hw.init = CLK_HW_INIT(_name, _parent, &clk_fixed_factor_ops, _flags),                                         \
11653d0407baSopenharmony_ci    }
11663d0407baSopenharmony_ci
11673d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_HW(_struct, _name, _parent, _div, _mult, _flags)                                              \
11683d0407baSopenharmony_ci    struct clk_fixed_factor _struct = {                                                                                \
11693d0407baSopenharmony_ci        .div = (_div),                                                                                                 \
11703d0407baSopenharmony_ci        .mult = _mult,                                                                                                 \
11713d0407baSopenharmony_ci        .hw.init = CLK_HW_INIT_HW(_name, _parent, &clk_fixed_factor_ops, _flags),                                      \
11723d0407baSopenharmony_ci    }
11733d0407baSopenharmony_ci
11743d0407baSopenharmony_ci/*
11753d0407baSopenharmony_ci * This macro allows the driver to reuse the _parent array for multiple
11763d0407baSopenharmony_ci * fixed factor clk declarations.
11773d0407baSopenharmony_ci */
11783d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_HWS(_struct, _name, _parent, _div, _mult, _flags)                                             \
11793d0407baSopenharmony_ci    struct clk_fixed_factor _struct = {                                                                                \
11803d0407baSopenharmony_ci        .div = (_div),                                                                                                 \
11813d0407baSopenharmony_ci        .mult = (_mult),                                                                                               \
11823d0407baSopenharmony_ci        .hw.init = CLK_HW_INIT_HWS(_name, _parent, &clk_fixed_factor_ops, _flags),                                     \
11833d0407baSopenharmony_ci    }
11843d0407baSopenharmony_ci
11853d0407baSopenharmony_ci#define CLK_FIXED_FACTOR_FW_NAME(_struct, _name, _parent, _div, _mult, _flags)                                         \
11863d0407baSopenharmony_ci    struct clk_fixed_factor _struct = {                                                                                \
11873d0407baSopenharmony_ci        .div = (_div),                                                                                                 \
11883d0407baSopenharmony_ci        .mult = (_mult),                                                                                               \
11893d0407baSopenharmony_ci        .hw.init = CLK_HW_INIT_FW_NAME(_name, _parent, &clk_fixed_factor_ops, _flags),                                 \
11903d0407baSopenharmony_ci    }
11913d0407baSopenharmony_ci
11923d0407baSopenharmony_ci#ifdef CONFIG_OF
11933d0407baSopenharmony_ciint of_clk_add_provider(struct device_node *np, struct clk *(*clk_src_get)(struct of_phandle_args *args, void *data),
11943d0407baSopenharmony_ci                        void *data);
11953d0407baSopenharmony_ciint of_clk_add_hw_provider(struct device_node *np, struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data),
11963d0407baSopenharmony_ci                           void *data);
11973d0407baSopenharmony_ciint devm_of_clk_add_hw_provider(struct device *dev, struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data),
11983d0407baSopenharmony_ci                                void *data);
11993d0407baSopenharmony_civoid of_clk_del_provider(struct device_node *np);
12003d0407baSopenharmony_civoid devm_of_clk_del_provider(struct device *dev);
12013d0407baSopenharmony_cistruct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, void *data);
12023d0407baSopenharmony_cistruct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data);
12033d0407baSopenharmony_cistruct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data);
12043d0407baSopenharmony_cistruct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data);
12053d0407baSopenharmony_ciint of_clk_parent_fill(struct device_node *np, const char **parents, unsigned int size);
12063d0407baSopenharmony_ciint of_clk_detect_critical(struct device_node *np, int index, unsigned long *flags);
12073d0407baSopenharmony_ci
12083d0407baSopenharmony_ci#else  /* !CONFIG_OF */
12093d0407baSopenharmony_ci
12103d0407baSopenharmony_cistatic inline int of_clk_add_provider(struct device_node *np,
12113d0407baSopenharmony_ci                                      struct clk *(*clk_src_get)(struct of_phandle_args *args, void *data), void *data)
12123d0407baSopenharmony_ci{
12133d0407baSopenharmony_ci    return 0;
12143d0407baSopenharmony_ci}
12153d0407baSopenharmony_cistatic inline int of_clk_add_hw_provider(struct device_node *np,
12163d0407baSopenharmony_ci                                         struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data), void *data)
12173d0407baSopenharmony_ci{
12183d0407baSopenharmony_ci    return 0;
12193d0407baSopenharmony_ci}
12203d0407baSopenharmony_cistatic inline int devm_of_clk_add_hw_provider(struct device *dev,
12213d0407baSopenharmony_ci                                              struct clk_hw *(*get)(struct of_phandle_args *clkspec, void *data),
12223d0407baSopenharmony_ci                                              void *data)
12233d0407baSopenharmony_ci{
12243d0407baSopenharmony_ci    return 0;
12253d0407baSopenharmony_ci}
12263d0407baSopenharmony_cistatic inline void of_clk_del_provider(struct device_node *np)
12273d0407baSopenharmony_ci{
12283d0407baSopenharmony_ci}
12293d0407baSopenharmony_cistatic inline void devm_of_clk_del_provider(struct device *dev)
12303d0407baSopenharmony_ci{
12313d0407baSopenharmony_ci}
12323d0407baSopenharmony_cistatic inline struct clk *of_clk_src_simple_get(struct of_phandle_args *clkspec, void *data)
12333d0407baSopenharmony_ci{
12343d0407baSopenharmony_ci    return ERR_PTR(-ENOENT);
12353d0407baSopenharmony_ci}
12363d0407baSopenharmony_cistatic inline struct clk_hw *of_clk_hw_simple_get(struct of_phandle_args *clkspec, void *data)
12373d0407baSopenharmony_ci{
12383d0407baSopenharmony_ci    return ERR_PTR(-ENOENT);
12393d0407baSopenharmony_ci}
12403d0407baSopenharmony_cistatic inline struct clk *of_clk_src_onecell_get(struct of_phandle_args *clkspec, void *data)
12413d0407baSopenharmony_ci{
12423d0407baSopenharmony_ci    return ERR_PTR(-ENOENT);
12433d0407baSopenharmony_ci}
12443d0407baSopenharmony_cistatic inline struct clk_hw *of_clk_hw_onecell_get(struct of_phandle_args *clkspec, void *data)
12453d0407baSopenharmony_ci{
12463d0407baSopenharmony_ci    return ERR_PTR(-ENOENT);
12473d0407baSopenharmony_ci}
12483d0407baSopenharmony_cistatic inline int of_clk_parent_fill(struct device_node *np, const char **parents, unsigned int size)
12493d0407baSopenharmony_ci{
12503d0407baSopenharmony_ci    return 0;
12513d0407baSopenharmony_ci}
12523d0407baSopenharmony_cistatic inline int of_clk_detect_critical(struct device_node *np, int index, unsigned long *flags)
12533d0407baSopenharmony_ci{
12543d0407baSopenharmony_ci    return 0;
12553d0407baSopenharmony_ci}
12563d0407baSopenharmony_ci#endif /* CONFIG_OF */
12573d0407baSopenharmony_ci
12583d0407baSopenharmony_civoid clk_gate_restore_context(struct clk_hw *hw);
12593d0407baSopenharmony_ci
12603d0407baSopenharmony_ci#endif /* CLK_PROVIDER_H */
1261