|
@@ -135,7 +135,28 @@ fail:
|
|
dump_stack();
|
|
dump_stack();
|
|
}
|
|
}
|
|
|
|
|
|
-/*--------------------------------------------------------------------------*/
|
|
|
|
|
|
+/* Reserve a pin, preventing anyone else from changing its configuration. */
|
|
|
|
+void __init at32_reserve_pin(unsigned int pin)
|
|
|
|
+{
|
|
|
|
+ struct pio_device *pio;
|
|
|
|
+ unsigned int pin_index = pin & 0x1f;
|
|
|
|
+
|
|
|
|
+ pio = gpio_to_pio(pin);
|
|
|
|
+ if (unlikely(!pio)) {
|
|
|
|
+ printk("pio: invalid pin %u\n", pin);
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (unlikely(test_and_set_bit(pin_index, &pio->pinmux_mask))) {
|
|
|
|
+ printk("%s: pin %u is busy\n", pio->name, pin_index);
|
|
|
|
+ goto fail;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return;
|
|
|
|
+
|
|
|
|
+fail:
|
|
|
|
+ dump_stack();
|
|
|
|
+}
|
|
|
|
|
|
/*--------------------------------------------------------------------------*/
|
|
/*--------------------------------------------------------------------------*/
|
|
|
|
|