1. void __init at32_select_periph2(unsigned int port, u32 pin_mask, unsigned int periph,
  2. unsigned long flags)
  3. {
  4. int i;
  5. int i_a = port == 64 ? 19 : 0;
  6. int i_b = port == 64 ? 32 : 19;
  7. struct pio_device *pio;
  8.  
  9. for(i = i_a; i < i_b; i++) {
  10. unsigned int pin = port + i;
  11. unsigned int pin_index = pin & 0x1f;
  12. u32 mask = 1 << pin_index;
  13.  
  14. if(!((i << 1) & pin_mask))
  15. continue;
  16.  
  17. pio = gpio_to_pio(pin);
  18. if (unlikely(!pio)) {
  19. printk("pio: invalid pin %u\n", pin);
  20. goto fail;
  21. }
  22.  
  23. if (unlikely(test_and_set_bit(pin_index, &pio->pinmux_mask)
  24. || gpiochip_is_requested(&pio->chip, pin_index))) {
  25. printk("%s: pin %u is busy\n", pio->name, pin_index);
  26. goto fail;
  27. }
  28.  
  29. pio_writel(pio, PUER, mask);
  30. if (periph)
  31. pio_writel(pio, BSR, mask);
  32. else
  33. pio_writel(pio, ASR, mask);
  34.  
  35. pio_writel(pio, PDR, mask);
  36. if (!(flags & AT32_GPIOF_PULLUP))
  37. pio_writel(pio, PUDR, mask);
  38. }
  39.  
  40. return;
  41.  
  42. fail:
  43. dump_stack();
  44. }
  45.  
  46. function call:
  47. at32_select_periph(GPIO_PIOC_BASE, data->periph, GPIO_PERIPH_A,0);
  48. at32_select_periph(GPIO_PIOD_BASE, data->periph, GPIO_PERIPH_A,0);
  49.