19c92ab61SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 205d2eaacSChen-Yu Tsai /* 305d2eaacSChen-Yu Tsai * Copyright (c) 2017 Chen-Yu Tsai. All rights reserved. 405d2eaacSChen-Yu Tsai */ 505d2eaacSChen-Yu Tsai 605d2eaacSChen-Yu Tsai #ifndef _CCU_SDM_H 705d2eaacSChen-Yu Tsai #define _CCU_SDM_H 805d2eaacSChen-Yu Tsai 905d2eaacSChen-Yu Tsai #include <linux/clk-provider.h> 1005d2eaacSChen-Yu Tsai 1105d2eaacSChen-Yu Tsai #include "ccu_common.h" 1205d2eaacSChen-Yu Tsai 1305d2eaacSChen-Yu Tsai struct ccu_sdm_setting { 1405d2eaacSChen-Yu Tsai unsigned long rate; 1505d2eaacSChen-Yu Tsai 1605d2eaacSChen-Yu Tsai /* 1705d2eaacSChen-Yu Tsai * XXX We don't know what the step and bottom register fields 1805d2eaacSChen-Yu Tsai * mean. Just copy the whole register value from the vendor 1905d2eaacSChen-Yu Tsai * kernel for now. 2005d2eaacSChen-Yu Tsai */ 2105d2eaacSChen-Yu Tsai u32 pattern; 2205d2eaacSChen-Yu Tsai 2305d2eaacSChen-Yu Tsai /* 2405d2eaacSChen-Yu Tsai * M and N factors here should be the values used in 2505d2eaacSChen-Yu Tsai * calculation, not the raw values written to registers 2605d2eaacSChen-Yu Tsai */ 2705d2eaacSChen-Yu Tsai u32 m; 2805d2eaacSChen-Yu Tsai u32 n; 2905d2eaacSChen-Yu Tsai }; 3005d2eaacSChen-Yu Tsai 3105d2eaacSChen-Yu Tsai struct ccu_sdm_internal { 3205d2eaacSChen-Yu Tsai struct ccu_sdm_setting *table; 3305d2eaacSChen-Yu Tsai u32 table_size; 3405d2eaacSChen-Yu Tsai /* early SoCs don't have the SDM enable bit in the PLL register */ 3505d2eaacSChen-Yu Tsai u32 enable; 3605d2eaacSChen-Yu Tsai /* second enable bit in tuning register */ 3705d2eaacSChen-Yu Tsai u32 tuning_enable; 3805d2eaacSChen-Yu Tsai u16 tuning_reg; 3905d2eaacSChen-Yu Tsai }; 4005d2eaacSChen-Yu Tsai 4105d2eaacSChen-Yu Tsai #define _SUNXI_CCU_SDM(_table, _enable, \ 4205d2eaacSChen-Yu Tsai _reg, _reg_enable) \ 4305d2eaacSChen-Yu Tsai { \ 4405d2eaacSChen-Yu Tsai .table = _table, \ 4505d2eaacSChen-Yu Tsai .table_size = ARRAY_SIZE(_table), \ 4605d2eaacSChen-Yu Tsai .enable = _enable, \ 4705d2eaacSChen-Yu Tsai .tuning_enable = _reg_enable, \ 4805d2eaacSChen-Yu Tsai .tuning_reg = _reg, \ 4905d2eaacSChen-Yu Tsai } 5005d2eaacSChen-Yu Tsai 5105d2eaacSChen-Yu Tsai bool ccu_sdm_helper_is_enabled(struct ccu_common *common, 5205d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm); 5305d2eaacSChen-Yu Tsai void ccu_sdm_helper_enable(struct ccu_common *common, 5405d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm, 5505d2eaacSChen-Yu Tsai unsigned long rate); 5605d2eaacSChen-Yu Tsai void ccu_sdm_helper_disable(struct ccu_common *common, 5705d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm); 5805d2eaacSChen-Yu Tsai 5905d2eaacSChen-Yu Tsai bool ccu_sdm_helper_has_rate(struct ccu_common *common, 6005d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm, 6105d2eaacSChen-Yu Tsai unsigned long rate); 6205d2eaacSChen-Yu Tsai 6305d2eaacSChen-Yu Tsai unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common, 6405d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm, 6505d2eaacSChen-Yu Tsai u32 m, u32 n); 6605d2eaacSChen-Yu Tsai 6705d2eaacSChen-Yu Tsai int ccu_sdm_helper_get_factors(struct ccu_common *common, 6805d2eaacSChen-Yu Tsai struct ccu_sdm_internal *sdm, 6905d2eaacSChen-Yu Tsai unsigned long rate, 7005d2eaacSChen-Yu Tsai unsigned long *m, unsigned long *n); 7105d2eaacSChen-Yu Tsai 7205d2eaacSChen-Yu Tsai #endif 73