1. arch/avr32/mach-at32ap/pio.c
  2. /* Pin multiplexing API */
  3. void __init at32_select_periph(unsigned int port, u32 pin_mask, unsigned int periph,
  4. unsigned long flags)
  5. {
  6. int i;
  7. struct pio_device *pio;
  8.  
  9. for(i = 0; i < 32; i++) {
  10. unsigned int pin = port + i;
  11. unsigned int pin_index = pin & 0x1f;
  12. u32 mask = 1 << pin_index;
  13.  
  14. if(!((1 << i) & pin_mask))
  15. continue;
  16. ...
  17. }
  18.  
  19. arch/avr32/boards/hammerhead/setup.c
  20. static u32 get_pin_mask(unsigned int port);
  21. struct atmel_lcdfb_info __initdata hammerhead_lcdc_data = {
  22. .default_bpp = 24,
  23. .default_dmacon = ATMEL_LCDC_DMAEN | ATMEL_LCDC_DMA2DEN,
  24. .default_lcdcon2 = (ATMEL_LCDC_DISTYPE_TFT
  25. | ATMEL_LCDC_INVCLK
  26. | ATMEL_LCDC_CLKMOD_ALWAYSACTIVE
  27. | ATMEL_LCDC_MEMOR_BIG),
  28. .default_monspecs = &hammerhead_hda350t_monspecs,
  29. .guard_time = 2,
  30. .get_pin_mask = get_pin_mask,
  31. };
  32.  
  33.  
  34. static u32 get_pin_mask(unsigned int port) {
  35. u32 pin_mask = 0;
  36.  
  37. switch(port) {
  38. case GPIO_PIOC_BASE:
  39. pin_mask = LCD_PERIPH_HSYNC | LCD_PERIPH_PCLK | LCD_PERIPH_VSYNC | LCD_PERIPH_PWR |
  40. LCD_PERIPH_DATA0 | LCD_PERIPH_DATA1 | LCD_PERIPH_DATA2 | LCD_PERIPH_DATA3 |
  41. LCD_PERIPH_DATA4 | LCD_PERIPH_DATA5;
  42. break;
  43. case GPIO_PIOD_BASE:
  44. pin_mask = LCD_PERIPH_DATA6 | LCD_PERIPH_DATA7 | LCD_PERIPH_DATA8 | LCD_PERIPH_DATA9 |
  45. LCD_PERIPH_DATA10 | LCD_PERIPH_DATA11 | LCD_PERIPH_DATA12 | LCD_PERIPH_DATA13 |
  46. LCD_PERIPH_DATA14 | LCD_PERIPH_DATA15 | LCD_PERIPH_DATA16 | LCD_PERIPH_DATA17 |
  47. LCD_PERIPH_DATA18 | LCD_PERIPH_DATA19 | LCD_PERIPH_DATA20 | LCD_PERIPH_DATA21 |
  48. LCD_PERIPH_DATA22 | LCD_PERIPH_DATA23;
  49. break;
  50. default:
  51. printk("Unsupported PORT");
  52. }
  53.  
  54. return pin_mask;
  55. }
  56.  
  57. arch/avr32/mach-at32ap/at32ap700x.c
  58. if(data->get_pin_mask) {
  59. at32_select_periph2(GPIO_PIOC_BASE, data->get_pin_mask(GPIO_PIOC_BASE), GPIO_PERIPH_A, 0);
  60. at32_select_periph2(GPIO_PIOD_BASE, data->get_pin_mask(GPIO_PIOD_BASE), GPIO_PERIPH_A, 0);
  61. }