|
@@ -233,3 +233,103 @@ static const s8 port_mux[] = {
|
|
|
[GPIO_PF7] = 8,
|
|
|
[GPIO_PF8 ... GPIO_PF15] = -1,
|
|
|
[GPIO_PG0 ... GPIO_PG7] = -1,
|
|
|
+ [GPIO_PG8] = 9,
|
|
|
+ [GPIO_PG9] = 9,
|
|
|
+ [GPIO_PG10] = 10,
|
|
|
+ [GPIO_PG11] = 10,
|
|
|
+ [GPIO_PG12] = 10,
|
|
|
+ [GPIO_PG13] = 11,
|
|
|
+ [GPIO_PG14] = 11,
|
|
|
+ [GPIO_PG15] = 11,
|
|
|
+ [GPIO_PH0 ... GPIO_PH15] = -1,
|
|
|
+ [PORT_PJ0 ... PORT_PJ3] = -1,
|
|
|
+ [PORT_PJ4] = 1,
|
|
|
+ [PORT_PJ5] = 1,
|
|
|
+ [PORT_PJ6 ... PORT_PJ9] = -1,
|
|
|
+ [PORT_PJ10] = 0,
|
|
|
+ [PORT_PJ11] = 0,
|
|
|
+};
|
|
|
+
|
|
|
+static int portmux_group_check(unsigned short per)
|
|
|
+{
|
|
|
+ u16 ident = P_IDENT(per);
|
|
|
+ u16 function = P_FUNCT2MUX(per);
|
|
|
+ s8 offset = port_mux[ident];
|
|
|
+ u16 m, pmux, pfunc;
|
|
|
+
|
|
|
+ if (offset < 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ pmux = bfin_read_PORT_MUX();
|
|
|
+ for (m = 0; m < ARRAY_SIZE(port_mux); ++m) {
|
|
|
+ if (m == ident)
|
|
|
+ continue;
|
|
|
+ if (port_mux[m] != offset)
|
|
|
+ continue;
|
|
|
+ if (!is_reserved(peri, m, 1))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (offset == 1)
|
|
|
+ pfunc = (pmux >> offset) & 3;
|
|
|
+ else
|
|
|
+ pfunc = (pmux >> offset) & 1;
|
|
|
+ if (pfunc != function) {
|
|
|
+ pr_err("pin group conflict! request pin %d func %d conflict with pin %d func %d\n",
|
|
|
+ ident, function, m, pfunc);
|
|
|
+ return -EINVAL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static void portmux_setup(unsigned short per)
|
|
|
+{
|
|
|
+ u16 ident = P_IDENT(per);
|
|
|
+ u16 function = P_FUNCT2MUX(per);
|
|
|
+ s8 offset = port_mux[ident];
|
|
|
+ u16 pmux;
|
|
|
+
|
|
|
+ if (offset == -1)
|
|
|
+ return;
|
|
|
+
|
|
|
+ pmux = bfin_read_PORT_MUX();
|
|
|
+ if (offset != 1)
|
|
|
+ pmux &= ~(1 << offset);
|
|
|
+ else
|
|
|
+ pmux &= ~(3 << 1);
|
|
|
+ pmux |= (function << offset);
|
|
|
+ bfin_write_PORT_MUX(pmux);
|
|
|
+}
|
|
|
+#elif defined(CONFIG_BF54x) || defined(CONFIG_BF60x)
|
|
|
+inline void portmux_setup(unsigned short per)
|
|
|
+{
|
|
|
+ u16 ident = P_IDENT(per);
|
|
|
+ u16 function = P_FUNCT2MUX(per);
|
|
|
+ u32 pmux;
|
|
|
+
|
|
|
+ pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
|
|
+
|
|
|
+ pmux &= ~(0x3 << (2 * gpio_sub_n(ident)));
|
|
|
+ pmux |= (function & 0x3) << (2 * gpio_sub_n(ident));
|
|
|
+
|
|
|
+ gpio_array[gpio_bank(ident)]->port_mux = pmux;
|
|
|
+}
|
|
|
+
|
|
|
+inline u16 get_portmux(unsigned short per)
|
|
|
+{
|
|
|
+ u16 ident = P_IDENT(per);
|
|
|
+ u32 pmux = gpio_array[gpio_bank(ident)]->port_mux;
|
|
|
+ return (pmux >> (2 * gpio_sub_n(ident)) & 0x3);
|
|
|
+}
|
|
|
+static int portmux_group_check(unsigned short per)
|
|
|
+{
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+#elif defined(CONFIG_BF52x) || defined(CONFIG_BF51x)
|
|
|
+static int portmux_group_check(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 pin, gpiopin, pfunc;
|