/*! * This function is used to configure a pin through the IOMUX module. * FIXED ME: for backward compatible. Will be static function! * @param pin a pin number as defined in \b #iomux_pin_name_t * @param cfg an output function as defined in \b #iomux_pin_cfg_t * * @return 0 if successful; Non-zero otherwise */ static int iomux_config_mux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg) { u32 ret = 0; u32 pin_index = PIN_TO_IOMUX_INDEX(pin); u32 mux_reg = PIN_TO_IOMUX_MUX(pin); u8 *rp; BUG_ON(pin_index > MUX_PIN_NUM_MAX); if (mux_reg != NON_MUX_I) { mux_reg += IOMUXGPR; BUG_ON((mux_reg > IOMUXSW_MUX_END) || (mux_reg < IOMUXSW_MUX_CTL)); spin_lock(&gpio_mux_lock); __raw_writel(cfg, mux_reg); /* * Log a warning if a pin changes ownership */ rp = iomux_pin_res_table + pin_index; if (*rp && *rp != (cfg | MUX_USED)) { /*Console: how to do */ printk(KERN_ERR "iomux_config_mux: Warning: iomux pin" " config changed, index=%d register=%d, " " prev=0x%x new=0x%x\n", pin_index, mux_reg, *rp, cfg); ret = -EINVAL; } *rp = cfg | MUX_USED; spin_unlock(&gpio_mux_lock); } return ret; }
/*! * Release ownership for an IO pin * * @param pin a name defined by \b iomux_pin_name_t * @param config config as defined in \b #iomux_pin_ocfg_t */ void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t config) { u32 pin_index = PIN_TO_IOMUX_INDEX(pin); u8 *rp = iomux_pin_res_table + pin_index; int gpio = IOMUX_TO_GPIO(pin); BUG_ON(pin_index > MUX_PIN_NUM_MAX); *rp = 0; if ((gpio < MXC_GPIO_IRQS) && ((config == IOMUX_CONFIG_GPIO) || (config == PIN_TO_ALT_GPIO(pin)))) { gpio_free(gpio); } }
/*! * Release ownership for an IO pin * * @param pin a name defined by \b iomux_pin_name_t * @param cfg an input function as defined in \b #iomux_pin_cfg_t */ void mxc_free_iomux(iomux_pin_name_t pin, iomux_pin_cfg_t cfg) { u32 pin_index = PIN_TO_IOMUX_INDEX(pin); u8 *rp = iomux_pin_res_table + pin_index; BUG_ON((pin_index > MUX_PIN_NUM_MAX)); *rp = 0; if (GPIO_TO_PORT(IOMUX_TO_GPIO(pin)) < GPIO_PORT_NUM) { if (((cfg & (~MUX_CONFIG_SION)) == MUX_CONFIG_GPIO) || (((cfg & (~MUX_CONFIG_SION)) == MUX_CONFIG_FUNC) && ((pin == MX35_PIN_GPIO1_0) || (pin == MX35_PIN_GPIO1_1) || (pin == MX35_PIN_GPIO2_0) || (pin == MX35_PIN_GPIO3_0)))) mxc_free_gpio(pin); } }
/*! * This function is used to configure a pin through the IOMUX module. * @param pin a pin number as defined in \b #iomux_pin_name_t * @param config a configuration as defined in \b #iomux_pin_cfg_t * * @return 0 if successful; Non-zero otherwise */ static int iomux_config_mux(iomux_pin_name_t pin, iomux_pin_cfg_t config) { u32 ret = 0; u32 pin_index = PIN_TO_IOMUX_INDEX(pin); void *mux_reg = IOMUXSW_MUX_CTL + PIN_TO_IOMUX_MUX(pin); u32 mux_data = 0; u8 *rp; BUG_ON((mux_reg > IOMUXSW_MUX_END) || (mux_reg < IOMUXSW_MUX_CTL)); spin_lock(&gpio_mux_lock); if (config == IOMUX_CONFIG_GPIO) { mux_data = PIN_TO_ALT_GPIO(pin); } else { mux_data = config; } __raw_writel(mux_data, mux_reg); /* * Log a warning if a pin changes ownership */ rp = iomux_pin_res_table + pin_index; if ((mux_data & *rp) && (*rp != mux_data)) { /* * Don't call printk if we're tweaking the console uart or * we'll deadlock. */ printk(KERN_ERR "iomux_config_mux: Warning: iomux pin" " config changed, pin=%p, " " prev=0x%x new=0x%x\n", mux_reg, *rp, mux_data); ret = -EINVAL; } *rp = mux_data; spin_unlock(&gpio_mux_lock); return ret; }