static int omap4_sar_not_accessible(void) { u32 usbhost_state, usbtll_state; /* * Make sure that USB host and TLL modules are not * enabled before attempting to save the context * registers, otherwise this will trigger an exception. */ usbhost_state = omap4_cminst_read_inst_reg(OMAP4430_CM2_PARTITION, OMAP4430_CM2_L3INIT_INST, OMAP4_CM_L3INIT_USB_HOST_CLKCTRL_OFFSET) & (OMAP4430_STBYST_MASK | OMAP4430_IDLEST_MASK); usbtll_state = omap4_cminst_read_inst_reg(OMAP4430_CM2_PARTITION, OMAP4430_CM2_L3INIT_INST, OMAP4_CM_L3INIT_USB_TLL_CLKCTRL_OFFSET) & OMAP4430_IDLEST_MASK; if ((usbhost_state == (OMAP4430_STBYST_MASK | OMAP4430_IDLEST_MASK)) && (usbtll_state == (OMAP4430_IDLEST_MASK))) return 0; else return -EBUSY; }
/** * _clkctrl_idlest - read a CM_*_CLKCTRL register; mask & shift IDLEST bitfield * @part: PRCM partition ID that the CM_CLKCTRL register exists in * @inst: CM instance register offset (*_INST macro) * @cdoffs: Clockdomain register offset (*_CDOFFS macro) * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) * * Return the IDLEST bitfield of a CM_*_CLKCTRL register, shifted down to * bit 0. */ static u32 _clkctrl_idlest(u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) { u32 v = omap4_cminst_read_inst_reg(part, inst, clkctrl_offs); v &= OMAP4430_IDLEST_MASK; v >>= OMAP4430_IDLEST_SHIFT; return v; }
/** * omap4_cminst_module_disable - Disable the module inside CLKCTRL * @part: PRCM partition ID that the CM_CLKCTRL register exists in * @inst: CM instance register offset (*_INST macro) * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) * * No return value. */ static void omap4_cminst_module_disable(u8 part, u16 inst, u16 clkctrl_offs) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, clkctrl_offs); v &= ~OMAP4430_MODULEMODE_MASK; omap4_cminst_write_inst_reg(v, part, inst, clkctrl_offs); }
/** * _clktrctrl_write - write @c to a CM_CLKSTCTRL.CLKTRCTRL register bitfield * @c: CLKTRCTRL register bitfield (LSB = bit 0, i.e., unshifted) * @part: PRCM partition ID that the CM_CLKSTCTRL register exists in * @inst: CM instance register offset (*_INST macro) * @cdoffs: Clockdomain register offset (*_CDOFFS macro) * * @c must be the unshifted value for CLKTRCTRL - i.e., this function * will handle the shift itself. */ static void _clktrctrl_write(u8 c, u8 part, u16 inst, u16 cdoffs) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, cdoffs + OMAP4_CM_CLKSTCTRL); v &= ~OMAP4430_CLKTRCTRL_MASK; v |= c << OMAP4430_CLKTRCTRL_SHIFT; omap4_cminst_write_inst_reg(v, part, inst, cdoffs + OMAP4_CM_CLKSTCTRL); }
static int omap4_clkdm_save_context(struct clockdomain *clkdm) { clkdm->context = omap4_cminst_read_inst_reg(clkdm->prcm_partition, clkdm->cm_inst, clkdm->clkdm_offs + OMAP4_CM_CLKSTCTRL); clkdm->context &= OMAP4430_MODULEMODE_MASK; return 0; }
/** * omap4_cminst_module_enable - Enable the modulemode inside CLKCTRL * @mode: Module mode (SW or HW) * @part: PRCM partition ID that the CM_CLKCTRL register exists in * @inst: CM instance register offset (*_INST macro) * @cdoffs: Clockdomain register offset (*_CDOFFS macro) * @clkctrl_offs: Module clock control register offset (*_CLKCTRL macro) * * No return value. */ void omap4_cminst_module_enable(u8 mode, u8 part, u16 inst, s16 cdoffs, u16 clkctrl_offs) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, clkctrl_offs); v &= ~OMAP4430_MODULEMODE_MASK; v |= mode << OMAP4430_MODULEMODE_SHIFT; omap4_cminst_write_inst_reg(v, part, inst, clkctrl_offs); }
/** * omap4_cminst_is_clkdm_in_hwsup - is a clockdomain in hwsup idle mode? * @part: PRCM partition ID that the CM_CLKSTCTRL register exists in * @inst: CM instance register offset (*_INST macro) * @cdoffs: Clockdomain register offset (*_CDOFFS macro) * * Returns true if the clockdomain referred to by (@part, @inst, @cdoffs) * is in hardware-supervised idle mode, or 0 otherwise. */ bool omap4_cminst_is_clkdm_in_hwsup(u8 part, u16 inst, u16 cdoffs) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, cdoffs + OMAP4_CM_CLKSTCTRL); v &= OMAP4430_CLKTRCTRL_MASK; v >>= OMAP4430_CLKTRCTRL_SHIFT; return (v == OMAP34XX_CLKSTCTRL_ENABLE_AUTO) ? true : false; }
u32 omap4_cminst_read_inst_reg_bits(u8 part, u16 inst, s16 idx, u32 mask) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, idx); v &= mask; v >>= __ffs(mask); return v; }
/* Read-modify-write a register in CM1. Caller must lock */ u32 omap4_cminst_rmw_inst_reg_bits(u32 mask, u32 bits, u8 part, u16 inst, s16 idx) { u32 v; v = omap4_cminst_read_inst_reg(part, inst, idx); v &= ~mask; v |= bits; omap4_cminst_write_inst_reg(v, part, inst, idx); return v; }
static u32 bb2d_clkctrl(void) { return omap4_cminst_read_inst_reg(OMAP4430_CM2_PARTITION, OMAP4430_CM2_DSS_INST, OMAP4_CM_DSS_BB2D_CLKCTRL_OFFSET); }