|
@@ -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)
|