void mxc_gpio_mode(int gpio_mode) { unsigned int pin = gpio_mode & GPIO_PIN_MASK; unsigned int port = (gpio_mode & GPIO_PORT_MASK) >> GPIO_PORT_SHIFT; unsigned int ocr = (gpio_mode & GPIO_OCR_MASK) >> GPIO_OCR_SHIFT; unsigned int tmp; tmp = __raw_readl(VA_GPIO_BASE + MXC_PUEN(port)); if (gpio_mode & GPIO_PUEN) tmp |= (1 << pin); else tmp &= ~(1 << pin); __raw_writel(tmp, VA_GPIO_BASE + MXC_PUEN(port)); tmp = __raw_readl(VA_GPIO_BASE + MXC_DDIR(port)); if (gpio_mode & GPIO_OUT) tmp |= 1 << pin; else tmp &= ~(1 << pin); __raw_writel(tmp, VA_GPIO_BASE + MXC_DDIR(port)); tmp = __raw_readl(VA_GPIO_BASE + MXC_GPR(port)); if (gpio_mode & GPIO_AF) tmp |= (1 << pin); else tmp &= ~(1 << pin); __raw_writel(tmp, VA_GPIO_BASE + MXC_GPR(port)); tmp = __raw_readl(VA_GPIO_BASE + MXC_GIUS(port)); if (gpio_mode & (GPIO_PF | GPIO_AF)) tmp &= ~(1 << pin); else tmp |= (1 << pin); __raw_writel(tmp, VA_GPIO_BASE + MXC_GIUS(port)); if (pin < 16) { tmp = __raw_readl(VA_GPIO_BASE + MXC_OCR1(port)); tmp &= ~(3 << (pin * 2)); tmp |= (ocr << (pin * 2)); __raw_writel(tmp, VA_GPIO_BASE + MXC_OCR1(port)); tmp = __raw_readl(VA_GPIO_BASE + MXC_ICONFA1(port)); tmp &= ~(3 << (pin * 2)); tmp |= ((gpio_mode >> GPIO_AOUT_SHIFT) & 3) << (pin * 2); __raw_writel(tmp, VA_GPIO_BASE + MXC_ICONFA1(port)); tmp = __raw_readl(VA_GPIO_BASE + MXC_ICONFB1(port)); tmp &= ~(3 << (pin * 2)); tmp |= ((gpio_mode >> GPIO_BOUT_SHIFT) & 3) << (pin * 2); __raw_writel(tmp, VA_GPIO_BASE + MXC_ICONFB1(port)); } else {
static inline void imx_iomuxv1_set_ddir( unsigned int port, unsigned int pin, int out) { unsigned long mask = 1 << pin; imx_iomuxv1_rmwl(MXC_DDIR(port), mask, out ? mask : 0); }