/*** struct clk_ops - operaciones de reloj estándar * @set_rate: establezca la frecuencia de reloj, vea clk_set_rate (). * @get_rate: obtenga la velocidad de reloj, vea clk_get_rate (). * @round_rate: redondee una velocidad de reloj dada, vea clk_round_rate (). * @set_parent: configura el padre del reloj, vea clk_set_parent (). ** Agrupe las implementaciones comunes del reloj para que * no tengamos que seguir configurando los mismos campos de nuevo. Dejamos * enable in struct clk. ** Agregar una capa adicional de direccionamiento indirecto al proceso no debería ser un problema, ya que es poco probable que estas operaciones deban ser llamadas rápidamente *.
struct clk_ops
{int (* set_rate) (struct clk * c, tasa larga sin signo); unsigned long (* get_rate) (struct clk * c); unsigned long (* round_rate) (struct clk * c, unsigned long rate); int ( * set_parent) (struct clk * c, struct clk * parent);}; struct clk
{struct list_head list; struct module * owner; struct clk * parent; const char * name; int id; int uso; tasa larga sin firma; ctrlbit largo sin firma; struct clk_ops * ops; int (* habilitar) (struct clk *, int habilitar);}; /*** struct clksrc_sources: lista de fuentes para un reloj dado * @sources: conjunto de punteros a relojes * @nr_sources: el tamaño de @ sources * /struct clksrc_sources
{unsigned int nr_sources; struct clk * *fuentes;}; /*** struct clksrc_reg: definición de registro para los bits de control del reloj * @reg: puntero al registro en la memoria virtual. * @ cambio: el desplazamiento en los bits donde está el campo de bits. * @size: el tamaño en bits del campo de bits . ** Esto especifica el tamaño y la posición de los bits en los que estamos interesados * dentro del registro especificado por @reg. * /Struct clksrc_reg
{void __iomem * reg; cambio corto sin signo; tamaño corto sin signo;}; /*** struct clksrc_clk - clase de reloj para dispositivos samsung de estilo más nuevo. * @clk: la representación de reloj estándar * @sources: las fuentes para este reloj * @reg_src: la definición de registro para seleccionar la fuente del reloj * @reg_div: la definición de registro para el divisor de salida del reloj ** Este reloj implementa las funciones requeridas por los SoC más nuevos donde * el bloque de reloj estándar proporciona una entrada mux y un divisor post-mux * para proporcionar el reloj del periperhal. ** El conjunto de @sources proporciona la asignación de la posición mux al * clock, y @reg_src muestra el código donde modificar para cambiar la posición mux *. @Reg_div define cómo cambiar la configuración del divisor en * la salida. * /Struct clksrc_clk
{struct clk clk; struct clksrc_sources * sources; struct clksrc_reg reg_src; struct clksrc_reg reg_div;}; /* MOUT APLL * /static struct clksrc_clk clk_mout_apll = {.clk = {.name = " mout_apll ",. Id = -1,} ,. sources = &clk_src_apll, .reg_src =} = 0, tamaño = 1},}; /* MOUT MPLL * /static struct clksrc_clk clk_mout_mpll = {.clk = {.name = " mout_mpll ",. Id = -1,} ,. sources = &clk_src_mpll, .reg_src =} = 4, .size = 1},}; /* MOUT EPLL * /static struct clksrc_clk clk_mout_epll = {.clk = {.name = " mout_epll ",. Id = -1,} ,. sources = &clk_src_epll, .reg_src = {.reg = S5P_CLK_SRC0, .shift = 8, .size = 1},}; /* Posibles fuentes de reloj para APLL Mux * /static struct clk * clk_src_apll_list
[] = {[0] = &clk_fin_apll, [1] = &clk_fout_apll,}; struct clksrc_sources clk_src_apll = {.sources = clk_src_apll_list, .nr_sources = ARRAY_SIZE (clk_src_apll_list),}; /* Posibles fuentes de reloj para MPLL Mux * /static struct clk * clk_src_mpll_list [] = {[0] = &clk_fin_mpll, [1] = &clk_fout_mpll,}; struct clksrc_sources clk_src_mpll = {.sources = clk_src_mpll_list, .nr_sources = ARRAY_SIZE (clk_src_mpll_list),}; /* Posibles fuentes de reloj para EPLL Mux * /static struct clk * clk_src_epll_list [] = {[0] = &clk_fin_epll, [1] = &clk_fout_epll,}; struct clksrc_sources clk_src_epll = {.sources = clk_src_epll_list, .nr_sources = ARRAY_SIZE (clk_src_epll_list),}; #define clk_fin_apll clk_ext_xtal_mux # definir clk_fin_mpll clk_ext_xtal_mux # define clk_fin_epll clk_ext_xtal_mux # define clk_fin_vpll clk_ext_xtal_mux /* fin_apll, fin_mpll y fin_epll son todos el mismo reloj, lo que llamamos * clk_ext_xtal_mux * /struct CLK clk_ext_xtal_mux = {.name = ". ext_xtal ", .id = -1,};获取 时钟 , 和 频率 xtal_clk = clk_get (NULL, " ext_xtal "); xtal = clk_get_rate (xtal_clk);