root/drivers/clk/aspeed/clk-aspeed.h
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
 * Structures used by ASPEED clock drivers
 *
 * Copyright 2019 IBM Corp.
 */

#include <linux/clk-provider.h>
#include <linux/kernel.h>
#include <linux/reset-controller.h>
#include <linux/spinlock.h>

struct clk_div_table;
struct regmap;

/**
 * struct aspeed_gate_data - Aspeed gated clocks
 * @clock_idx: bit used to gate this clock in the clock register
 * @reset_idx: bit used to reset this IP in the reset register. -1 if no
 *             reset is required when enabling the clock
 * @name: the clock name
 * @parent_name: the name of the parent clock
 * @flags: standard clock framework flags
 */
struct aspeed_gate_data {
        u8              clock_idx;
        s8              reset_idx;
        const char      *name;
        const char      *parent_name;
        unsigned long   flags;
};

/**
 * struct aspeed_clk_gate - Aspeed specific clk_gate structure
 * @hw:         handle between common and hardware-specific interfaces
 * @reg:        register controlling gate
 * @clock_idx:  bit used to gate this clock in the clock register
 * @reset_idx:  bit used to reset this IP in the reset register. -1 if no
 *              reset is required when enabling the clock
 * @flags:      hardware-specific flags
 * @lock:       register lock
 *
 * Some of the clocks in the Aspeed SoC must be put in reset before enabling.
 * This modified version of clk_gate allows an optional reset bit to be
 * specified.
 */
struct aspeed_clk_gate {
        struct clk_hw   hw;
        struct regmap   *map;
        u8              clock_idx;
        s8              reset_idx;
        u8              flags;
        spinlock_t      *lock;
};

#define to_aspeed_clk_gate(_hw) container_of(_hw, struct aspeed_clk_gate, hw)

/**
 * struct aspeed_reset - Aspeed reset controller
 * @map: regmap to access the containing system controller
 * @rcdev: reset controller device
 */
struct aspeed_reset {
        struct regmap                   *map;
        struct reset_controller_dev     rcdev;
};

#define to_aspeed_reset(p) container_of((p), struct aspeed_reset, rcdev)

/**
 * struct aspeed_clk_soc_data - Aspeed SoC specific divisor information
 * @div_table: Common divider lookup table
 * @eclk_div_table: Divider lookup table for ECLK
 * @mac_div_table: Divider lookup table for MAC (Ethernet) clocks
 * @calc_pll: Callback to maculate common PLL settings
 */
struct aspeed_clk_soc_data {
        const struct clk_div_table *div_table;
        const struct clk_div_table *eclk_div_table;
        const struct clk_div_table *mac_div_table;
        struct clk_hw *(*calc_pll)(const char *name, u32 val);
};