root/drivers/clk/sunxi-ng/ccu_sdm.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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_H
   7 #define _CCU_SDM_H
   8 
   9 #include <linux/clk-provider.h>
  10 
  11 #include "ccu_common.h"
  12 
  13 struct ccu_sdm_setting {
  14         unsigned long   rate;
  15 
  16         /*
  17          * XXX We don't know what the step and bottom register fields
  18          * mean. Just copy the whole register value from the vendor
  19          * kernel for now.
  20          */
  21         u32             pattern;
  22 
  23         /*
  24          * M and N factors here should be the values used in
  25          * calculation, not the raw values written to registers
  26          */
  27         u32             m;
  28         u32             n;
  29 };
  30 
  31 struct 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 
  51 bool ccu_sdm_helper_is_enabled(struct ccu_common *common,
  52                                struct ccu_sdm_internal *sdm);
  53 void ccu_sdm_helper_enable(struct ccu_common *common,
  54                            struct ccu_sdm_internal *sdm,
  55                            unsigned long rate);
  56 void ccu_sdm_helper_disable(struct ccu_common *common,
  57                             struct ccu_sdm_internal *sdm);
  58 
  59 bool ccu_sdm_helper_has_rate(struct ccu_common *common,
  60                              struct ccu_sdm_internal *sdm,
  61                              unsigned long rate);
  62 
  63 unsigned long ccu_sdm_helper_read_rate(struct ccu_common *common,
  64                                        struct ccu_sdm_internal *sdm,
  65                                        u32 m, u32 n);
  66 
  67 int 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 #endif

/* [<][>][^][v][top][bottom][index][help] */