73 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Copyright (c) 2017 Chen-Yu Tsai. All rights reserved.4 */5 6#ifndef _CCU_SDM_H7#define _CCU_SDM_H8 9#include <linux/clk-provider.h>10 11#include "ccu_common.h"12 13struct ccu_sdm_setting {14 unsigned long rate;15 16 /*17 * XXX We don't know what the step and bottom register fields18 * mean. Just copy the whole register value from the vendor19 * kernel for now.20 */21 u32 pattern;22 23 /*24 * M and N factors here should be the values used in25 * calculation, not the raw values written to registers26 */27 u32 m;28 u32 n;29};30 31struct ccu_sdm_internal {32 struct ccu_sdm_setting *table;33 u32 table_size;34 /* early SoCs don't have the SDM enable bit in the PLL register */35 u32 enable;36 /* second enable bit in tuning register */37 u32 tuning_enable;38 u16 tuning_reg;39};40 41#define _SUNXI_CCU_SDM(_table, _enable, \42 _reg, _reg_enable) \43 { \44 .table = _table, \45 .table_size = ARRAY_SIZE(_table), \46 .enable = _enable, \47 .tuning_enable = _reg_enable, \48 .tuning_reg = _reg, \49 }50 51bool ccu_sdm_helper_is_enabled(struct ccu_common *common,52 struct ccu_sdm_internal *sdm);53void ccu_sdm_helper_enable(struct ccu_common *common,54 struct ccu_sdm_internal *sdm,55 unsigned long rate);56void ccu_sdm_helper_disable(struct ccu_common *common,57 struct ccu_sdm_internal *sdm);58 59bool ccu_sdm_helper_has_rate(struct ccu_common *common,60 struct ccu_sdm_internal *sdm,61 unsigned long rate);62 63unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common,64 struct ccu_sdm_internal *sdm,65 u32 m, u32 n);66 67int ccu_sdm_helper_get_factors(struct ccu_common *common,68 struct ccu_sdm_internal *sdm,69 unsigned long rate,70 unsigned long *m, unsigned long *n);71 72#endif73