int get_periph_clock_info(enum periph_id periph_id, int *mux_bits, int *divider_bits, int *type) { enum periphc_internal_id internal_id; if (!clock_periph_id_isvalid(periph_id)) return -1; internal_id = periph_id_to_internal_id[periph_id]; if (!periphc_internal_id_isvalid(internal_id)) return -1; *type = clock_periph_type[internal_id]; if (!clock_type_id_isvalid(*type)) return -1; *mux_bits = clock_source[*type][CLOCK_MAX_MUX]; if (*type == CLOCK_TYPE_PCMT16) *divider_bits = 16; else *divider_bits = 8; return 0; }
int get_periph_clock_info(enum periph_id periph_id, int *mux_bits, int *divider_bits, int *type) { enum periphc_internal_id internal_id; if (!clock_periph_id_isvalid(periph_id)) return -1; internal_id = periph_id_to_internal_id[periph_id]; if (!periphc_internal_id_isvalid(internal_id)) return -1; *type = clock_periph_type[internal_id]; if (!clock_type_id_isvalid(*type)) return -1; /* * Special cases here for the clock with a 4-bit source mux and I2C * with its 16-bit divisor */ if (*type == CLOCK_TYPE_PCXTS) *mux_bits = MASK_BITS_31_28; else *mux_bits = MASK_BITS_31_30; if (*type == CLOCK_TYPE_PCMT16) *divider_bits = 16; else *divider_bits = 8; return 0; }
/** * Given a peripheral ID and the required source clock, this returns which * value should be programmed into the source mux for that peripheral. * * There is special code here to handle the one source type with 5 sources. * * @param periph_id peripheral to start * @param source PLL id of required parent clock * @param mux_bits Set to number of bits in mux register: 2 or 4 * @param divider_bits Set to number of divider bits (8 or 16) * @return mux value (0-4, or -1 if not found) */ int get_periph_clock_source(enum periph_id periph_id, enum clock_id parent, int *mux_bits, int *divider_bits) { enum clock_type_id type; enum periphc_internal_id internal_id; int mux; assert(clock_periph_id_isvalid(periph_id)); internal_id = periph_id_to_internal_id[periph_id]; assert(periphc_internal_id_isvalid(internal_id)); type = clock_periph_type[internal_id]; assert(clock_type_id_isvalid(type)); *mux_bits = clock_source[type][CLOCK_MAX_MUX]; if (type == CLOCK_TYPE_PCMT16) *divider_bits = 16; else *divider_bits = 8; for (mux = 0; mux < CLOCK_MAX_MUX; mux++) if (clock_source[type][mux] == parent) return mux; /* if we get here, either us or the caller has made a mistake */ printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, parent); return -1; }
/** * Given a peripheral ID and the required source clock, this returns which * value should be programmed into the source mux for that peripheral. * * There is special code here to handle the one source type with 5 sources. * * @param periph_id peripheral to start * @param source PLL id of required parent clock * @param mux_bits Set to number of bits in mux register: 2 or 4 * @param divider_bits Set to number of divider bits (8 or 16) * @return mux value (0-4, or -1 if not found) */ int get_periph_clock_source(enum periph_id periph_id, enum clock_id parent, int *mux_bits, int *divider_bits) { enum clock_type_id type; enum periphc_internal_id internal_id; int mux; assert(clock_periph_id_isvalid(periph_id)); internal_id = periph_id_to_internal_id[periph_id]; assert(periphc_internal_id_isvalid(internal_id)); type = clock_periph_type[internal_id]; assert(clock_type_id_isvalid(type)); /* * Special cases here for the clock with a 4-bit source mux and I2C * with its 16-bit divisor */ if (type == CLOCK_TYPE_PCXTS) *mux_bits = MASK_BITS_31_28; else *mux_bits = MASK_BITS_31_30; if (type == CLOCK_TYPE_PCMT16) *divider_bits = 16; else *divider_bits = 8; for (mux = 0; mux < CLOCK_MAX_MUX; mux++) if (clock_source[type][mux] == parent) return mux; /* * Not found: it might be looking for the 'S' in CLOCK_TYPE_PCXTS * which is not in our table. If not, then they are asking for a * source which this peripheral can't access through its mux. */ assert(type == CLOCK_TYPE_PCXTS); assert(parent == CLOCK_ID_SFROM32KHZ); if (type == CLOCK_TYPE_PCXTS && parent == CLOCK_ID_SFROM32KHZ) return 4; /* mux value for this clock */ /* if we get here, either us or the caller has made a mistake */ printf("Caller requested bad clock: periph=%d, parent=%d\n", periph_id, parent); return -1; }
enum clock_id get_periph_clock_id(enum periph_id periph_id, int source) { enum periphc_internal_id internal_id; int type; if (!clock_periph_id_isvalid(periph_id)) return CLOCK_ID_NONE; internal_id = periph_id_to_internal_id[periph_id]; if (!periphc_internal_id_isvalid(internal_id)) return CLOCK_ID_NONE; type = clock_periph_type[internal_id]; if (!clock_type_id_isvalid(type)) return CLOCK_ID_NONE; return clock_source[type][source]; }