|  | @@ -333,3 +333,143 @@ static int portmux_group_check(unsigned short per)
 | 
	
		
			
				|  |  |  	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  |  	u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
 | 
	
		
			
				|  |  |  	u16 pin, gpiopin, pfunc;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	for (pin = 0; pin < GPIO_BANKSIZE; ++pin) {
 | 
	
		
			
				|  |  | +		if (offset != pmux_offset[gpio_bank(ident)][pin])
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		gpiopin = gpio_bank(ident) * GPIO_BANKSIZE + pin;
 | 
	
		
			
				|  |  | +		if (gpiopin == ident)
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +		if (!is_reserved(peri, gpiopin, 1))
 | 
	
		
			
				|  |  | +			continue;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		pfunc = *port_mux[gpio_bank(ident)];
 | 
	
		
			
				|  |  | +		pfunc = (pfunc >> offset) & 3;
 | 
	
		
			
				|  |  | +		if (pfunc != function) {
 | 
	
		
			
				|  |  | +			pr_err("pin group conflict! request pin %d func %d conflict with pin %d func %d\n",
 | 
	
		
			
				|  |  | +				ident, function, gpiopin, pfunc);
 | 
	
		
			
				|  |  | +			return -EINVAL;
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +inline void portmux_setup(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	u16 ident = P_IDENT(per);
 | 
	
		
			
				|  |  | +	u16 function = P_FUNCT2MUX(per);
 | 
	
		
			
				|  |  | +	u8 offset = pmux_offset[gpio_bank(ident)][gpio_sub_n(ident)];
 | 
	
		
			
				|  |  | +	u16 pmux;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	pmux = *port_mux[gpio_bank(ident)];
 | 
	
		
			
				|  |  | +	if  (((pmux >> offset) & 3) == function)
 | 
	
		
			
				|  |  | +		return;
 | 
	
		
			
				|  |  | +	pmux &= ~(3 << offset);
 | 
	
		
			
				|  |  | +	pmux |= (function & 3) << offset;
 | 
	
		
			
				|  |  | +	*port_mux[gpio_bank(ident)] = pmux;
 | 
	
		
			
				|  |  | +	SSYNC();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#else
 | 
	
		
			
				|  |  | +# define portmux_setup(...)  do { } while (0)
 | 
	
		
			
				|  |  | +static int portmux_group_check(unsigned short per)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	return 0;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#if !(defined(CONFIG_BF54x) || defined(CONFIG_BF60x))
 | 
	
		
			
				|  |  | +/***********************************************************
 | 
	
		
			
				|  |  | +*
 | 
	
		
			
				|  |  | +* FUNCTIONS: Blackfin General Purpose Ports Access Functions
 | 
	
		
			
				|  |  | +*
 | 
	
		
			
				|  |  | +* INPUTS/OUTPUTS:
 | 
	
		
			
				|  |  | +* gpio - GPIO Number between 0 and MAX_BLACKFIN_GPIOS
 | 
	
		
			
				|  |  | +*
 | 
	
		
			
				|  |  | +*
 | 
	
		
			
				|  |  | +* DESCRIPTION: These functions abstract direct register access
 | 
	
		
			
				|  |  | +*              to Blackfin processor General Purpose
 | 
	
		
			
				|  |  | +*              Ports Regsiters
 | 
	
		
			
				|  |  | +*
 | 
	
		
			
				|  |  | +* CAUTION: These functions do not belong to the GPIO Driver API
 | 
	
		
			
				|  |  | +*************************************************************
 | 
	
		
			
				|  |  | +* MODIFICATION HISTORY :
 | 
	
		
			
				|  |  | +**************************************************************/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/* Set a specific bit */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define SET_GPIO(name) \
 | 
	
		
			
				|  |  | +void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
 | 
	
		
			
				|  |  | +{ \
 | 
	
		
			
				|  |  | +	unsigned long flags; \
 | 
	
		
			
				|  |  | +	flags = hard_local_irq_save(); \
 | 
	
		
			
				|  |  | +	if (arg) \
 | 
	
		
			
				|  |  | +		gpio_array[gpio_bank(gpio)]->name |= gpio_bit(gpio); \
 | 
	
		
			
				|  |  | +	else \
 | 
	
		
			
				|  |  | +		gpio_array[gpio_bank(gpio)]->name &= ~gpio_bit(gpio); \
 | 
	
		
			
				|  |  | +	AWA_DUMMY_READ(name); \
 | 
	
		
			
				|  |  | +	hard_local_irq_restore(flags); \
 | 
	
		
			
				|  |  | +} \
 | 
	
		
			
				|  |  | +EXPORT_SYMBOL(set_gpio_ ## name);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +SET_GPIO(dir)   /* set_gpio_dir() */
 | 
	
		
			
				|  |  | +SET_GPIO(inen)  /* set_gpio_inen() */
 | 
	
		
			
				|  |  | +SET_GPIO(polar) /* set_gpio_polar() */
 | 
	
		
			
				|  |  | +SET_GPIO(edge)  /* set_gpio_edge() */
 | 
	
		
			
				|  |  | +SET_GPIO(both)  /* set_gpio_both() */
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define SET_GPIO_SC(name) \
 | 
	
		
			
				|  |  | +void set_gpio_ ## name(unsigned gpio, unsigned short arg) \
 | 
	
		
			
				|  |  | +{ \
 | 
	
		
			
				|  |  | +	unsigned long flags; \
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323) \
 | 
	
		
			
				|  |  | +		flags = hard_local_irq_save(); \
 | 
	
		
			
				|  |  | +	if (arg) \
 | 
	
		
			
				|  |  | +		gpio_array[gpio_bank(gpio)]->name ## _set = gpio_bit(gpio); \
 | 
	
		
			
				|  |  | +	else \
 | 
	
		
			
				|  |  | +		gpio_array[gpio_bank(gpio)]->name ## _clear = gpio_bit(gpio); \
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323) { \
 | 
	
		
			
				|  |  | +		AWA_DUMMY_READ(name); \
 | 
	
		
			
				|  |  | +		hard_local_irq_restore(flags); \
 | 
	
		
			
				|  |  | +	} \
 | 
	
		
			
				|  |  | +} \
 | 
	
		
			
				|  |  | +EXPORT_SYMBOL(set_gpio_ ## name);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +SET_GPIO_SC(maska)
 | 
	
		
			
				|  |  | +SET_GPIO_SC(maskb)
 | 
	
		
			
				|  |  | +SET_GPIO_SC(data)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void set_gpio_toggle(unsigned gpio)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +	unsigned long flags;
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323)
 | 
	
		
			
				|  |  | +		flags = hard_local_irq_save();
 | 
	
		
			
				|  |  | +	gpio_array[gpio_bank(gpio)]->toggle = gpio_bit(gpio);
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323) {
 | 
	
		
			
				|  |  | +		AWA_DUMMY_READ(toggle);
 | 
	
		
			
				|  |  | +		hard_local_irq_restore(flags);
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +EXPORT_SYMBOL(set_gpio_toggle);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +/*Set current PORT date (16-bit word)*/
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +#define SET_GPIO_P(name) \
 | 
	
		
			
				|  |  | +void set_gpiop_ ## name(unsigned gpio, unsigned short arg) \
 | 
	
		
			
				|  |  | +{ \
 | 
	
		
			
				|  |  | +	unsigned long flags; \
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323) \
 | 
	
		
			
				|  |  | +		flags = hard_local_irq_save(); \
 | 
	
		
			
				|  |  | +	gpio_array[gpio_bank(gpio)]->name = arg; \
 | 
	
		
			
				|  |  | +	if (ANOMALY_05000311 || ANOMALY_05000323) { \
 | 
	
		
			
				|  |  | +		AWA_DUMMY_READ(name); \
 | 
	
		
			
				|  |  | +		hard_local_irq_restore(flags); \
 | 
	
		
			
				|  |  | +	} \
 | 
	
		
			
				|  |  | +} \
 | 
	
		
			
				|  |  | +EXPORT_SYMBOL(set_gpiop_ ## name);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +SET_GPIO_P(data)
 | 
	
		
			
				|  |  | +SET_GPIO_P(dir)
 |