omapl138 -- pinmux配置管理


struct mux_config {
 const char *name;
 const char *mux_reg_name;
 const unsigned char mux_reg;
 const unsigned char mask_offset;
 const unsigned char mask;
 const unsigned char mode;
 bool debug;
};

/*
 * Device specific mux setup
 */
static const struct mux_config da850_pins[] = {
#ifdef CONFIG_DAVINCI_MUX
 /* UART0 function */
 MUX_CFG(DA850, NUART0_CTS, 3, 24, 15, 2, false)
 MUX_CFG(DA850, NUART0_RTS, 3, 28, 15, 2, false)
 MUX_CFG(DA850, UART0_RXD, 3, 16, 15, 2, false)
 MUX_CFG(DA850, UART0_TXD, 3, 20, 15, 2, false)
 /* UART1 function */
 MUX_CFG(DA850, UART1_RXD, 4, 24, 15, 2, false)
 MUX_CFG(DA850, UART1_TXD, 4, 28, 15, 2, false)
 /* UART2 function */
 MUX_CFG(DA850, UART2_RXD, 4, 16, 15, 2, false)
 MUX_CFG(DA850, UART2_TXD, 4, 20, 15, 2, false)
 /* I2C1 function */
 MUX_CFG(DA850, I2C1_SCL, 4, 16, 15, 4, false)
 MUX_CFG(DA850, I2C1_SDA, 4, 20, 15, 4, false)
 /* I2C0 function */
 MUX_CFG(DA850, I2C0_SDA, 4, 12, 15, 2, false)
 MUX_CFG(DA850, I2C0_SCL, 4, 8, 15, 2, false)
 /* EMAC function */
 MUX_CFG(DA850, MII_TXEN, 2, 4, 15, 8, false)
 MUX_CFG(DA850, MII_TXCLK, 2, 8, 15, 8, false)
 MUX_CFG(DA850, MII_COL,  2, 12, 15, 8, false)
 MUX_CFG(DA850, MII_TXD_3, 2, 16, 15, 8, false)
 MUX_CFG(DA850, MII_TXD_2, 2, 20, 15, 8, false)
 MUX_CFG(DA850, MII_TXD_1, 2, 24, 15, 8, false)
 MUX_CFG(DA850, MII_TXD_0, 2, 28, 15, 8, false)
 MUX_CFG(DA850, MII_RXCLK, 3, 0, 15, 8, false)
 MUX_CFG(DA850, MII_RXDV, 3, 4, 15, 8, false)
 MUX_CFG(DA850, MII_RXER, 3, 8, 15, 8, false)
 MUX_CFG(DA850, MII_CRS,  3, 12, 15, 8, false)
 MUX_CFG(DA850, MII_RXD_3, 3, 16, 15, 8, false)
 MUX_CFG(DA850, MII_RXD_2, 3, 20, 15, 8, false)
 MUX_CFG(DA850, MII_RXD_1, 3, 24, 15, 8, false)
 MUX_CFG(DA850, MII_RXD_0, 3, 28, 15, 8, false)
 MUX_CFG(DA850, MDIO_CLK, 4, 0, 15, 8, false)
 MUX_CFG(DA850, MDIO_D,  4, 4, 15, 8, false)
 MUX_CFG(DA850, RMII_TXD_0, 14, 12, 15, 8, false)
 MUX_CFG(DA850, RMII_TXD_1, 14, 8, 15, 8, false)
 MUX_CFG(DA850, RMII_TXEN, 14, 16, 15, 8, false)
 MUX_CFG(DA850, RMII_CRS_DV, 15, 4, 15, 8, false)
 MUX_CFG(DA850, RMII_RXD_0, 14, 24, 15, 8, false)
 MUX_CFG(DA850, RMII_RXD_1, 14, 20, 15, 8, false)
 MUX_CFG(DA850, RMII_RXER, 14, 28, 15, 8, false)
 MUX_CFG(DA850, RMII_MHZ_50_CLK, 15, 0, 15, 0, false)
 /* McASP function */
 MUX_CFG(DA850, ACLKR,  0, 0, 15, 1, false)
 MUX_CFG(DA850, ACLKX,  0, 4, 15, 1, false)
 MUX_CFG(DA850, AFSR,  0, 8, 15, 1, false)
 MUX_CFG(DA850, AFSX,  0, 12, 15, 1, false)
 MUX_CFG(DA850, AHCLKR,  0, 16, 15, 1, false)
 MUX_CFG(DA850, AHCLKX,  0, 20, 15, 1, false)
 MUX_CFG(DA850, AMUTE,  0, 24, 15, 1, false)
 MUX_CFG(DA850, AXR_15,  1, 0, 15, 1, false)
 MUX_CFG(DA850, AXR_14,  1, 4, 15, 1, false)
 MUX_CFG(DA850, AXR_13,  1, 8, 15, 1, false)
 MUX_CFG(DA850, AXR_12,  1, 12, 15, 1, false)
 MUX_CFG(DA850, AXR_11,  1, 16, 15, 1, false)
 MUX_CFG(DA850, AXR_10,  1, 20, 15, 1, false)
 MUX_CFG(DA850, AXR_9,  1, 24, 15, 1, false)
 MUX_CFG(DA850, AXR_8,  1, 28, 15, 1, false)
 MUX_CFG(DA850, AXR_7,  2, 0, 15, 1, false)
 MUX_CFG(DA850, AXR_6,  2, 4, 15, 1, false)
 MUX_CFG(DA850, AXR_5,  2, 8, 15, 1, false)
 MUX_CFG(DA850, AXR_4,  2, 12, 15, 1, false)
 MUX_CFG(DA850, AXR_3,  2, 16, 15, 1, false)
 MUX_CFG(DA850, AXR_2,  2, 20, 15, 1, false)
 MUX_CFG(DA850, AXR_1,  2, 24, 15, 1, false)
 MUX_CFG(DA850, AXR_0,  2, 28, 15, 1, false)
 /* LCD function */
 MUX_CFG(DA850, LCD_D_7,  16, 8, 15, 2, false)
 MUX_CFG(DA850, LCD_D_6,  16, 12, 15, 2, false)
 MUX_CFG(DA850, LCD_D_5,  16, 16, 15, 2, false)
 MUX_CFG(DA850, LCD_D_4,  16, 20, 15, 2, false)
 MUX_CFG(DA850, LCD_D_3,  16, 24, 15, 2, false)
 MUX_CFG(DA850, LCD_D_2,  16, 28, 15, 2, false)
 MUX_CFG(DA850, LCD_D_1,  17, 0, 15, 2, false)
 MUX_CFG(DA850, LCD_D_0,  17, 4, 15, 2, false)
 MUX_CFG(DA850, LCD_D_15, 17, 8, 15, 2, false)
 MUX_CFG(DA850, LCD_D_14, 17, 12, 15, 2, false)
 MUX_CFG(DA850, LCD_D_13, 17, 16, 15, 2, false)
 MUX_CFG(DA850, LCD_D_12, 17, 20, 15, 2, false)
 MUX_CFG(DA850, LCD_D_11, 17, 24, 15, 2, false)
 MUX_CFG(DA850, LCD_D_10, 17, 28, 15, 2, false)
 MUX_CFG(DA850, LCD_D_9,  18, 0, 15, 2, false)
 MUX_CFG(DA850, LCD_D_8,  18, 4, 15, 2, false)
 MUX_CFG(DA850, LCD_PCLK, 18, 24, 15, 2, false)
 MUX_CFG(DA850, LCD_MCLK, 18, 28, 15, 2, false)
 MUX_CFG(DA850, LCD_HSYNC, 19, 0, 15, 2, false)
 MUX_CFG(DA850, LCD_VSYNC, 19, 4, 15, 2, false)
 MUX_CFG(DA850, NLCD_AC_ENB_CS, 19, 24, 15, 2, false)
 /* MMC/SD0 function */
 MUX_CFG(DA850, MMCSD0_DAT_0, 10, 8, 15, 2, false)
 MUX_CFG(DA850, MMCSD0_DAT_1, 10, 12, 15, 2, false)
 MUX_CFG(DA850, MMCSD0_DAT_2, 10, 16, 15, 2, false)
 MUX_CFG(DA850, MMCSD0_DAT_3, 10, 20, 15, 2, false)
 MUX_CFG(DA850, MMCSD0_CLK, 10, 0, 15, 2, false)
 MUX_CFG(DA850, MMCSD0_CMD, 10, 4, 15, 2, false)
 /* EMIF2.5/EMIFA function */
 MUX_CFG(DA850, EMA_D_7,  9, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_D_6,  9, 4, 15, 1, false)
 MUX_CFG(DA850, EMA_D_5,  9, 8, 15, 1, false)
 MUX_CFG(DA850, EMA_D_4,  9, 12, 15, 1, false)
 MUX_CFG(DA850, EMA_D_3,  9, 16, 15, 1, false)
 MUX_CFG(DA850, EMA_D_2,  9, 20, 15, 1, false)
 MUX_CFG(DA850, EMA_D_1,  9, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_D_0,  9, 28, 15, 1, false)
 MUX_CFG(DA850, EMA_A_1,  12, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_A_2,  12, 20, 15, 1, false)
 MUX_CFG(DA850, NEMA_CS_3, 7, 4, 15, 1, false)
 MUX_CFG(DA850, NEMA_CS_4, 7, 8, 15, 1, false)
 MUX_CFG(DA850, NEMA_WE,  7, 16, 15, 1, false)
 MUX_CFG(DA850, NEMA_OE,  7, 20, 15, 1, false)
 MUX_CFG(DA850, EMA_A_0,  12, 28, 15, 1, false)
 MUX_CFG(DA850, EMA_A_3,  12, 16, 15, 1, false)
 MUX_CFG(DA850, EMA_A_4,  12, 12, 15, 1, false)
 MUX_CFG(DA850, EMA_A_5,  12, 8, 15, 1, false)
 MUX_CFG(DA850, EMA_A_6,  12, 4, 15, 1, false)
 MUX_CFG(DA850, EMA_A_7,  12, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_A_8,  11, 28, 15, 1, false)
 MUX_CFG(DA850, EMA_A_9,  11, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_A_10, 11, 20, 15, 1, false)
 MUX_CFG(DA850, EMA_A_11, 11, 16, 15, 1, false)
 MUX_CFG(DA850, EMA_A_12, 11, 12, 15, 1, false)
 MUX_CFG(DA850, EMA_A_13, 11, 8, 15, 1, false)
 MUX_CFG(DA850, EMA_A_14, 11, 4, 15, 1, false)
 MUX_CFG(DA850, EMA_A_15, 11, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_A_16, 10, 28, 15, 1, false)
 MUX_CFG(DA850, EMA_A_17, 10, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_A_18, 10, 20, 15, 1, false)
 MUX_CFG(DA850, EMA_A_19, 10, 16, 15, 1, false)
 MUX_CFG(DA850, EMA_A_20, 10, 12, 15, 1, false)
 MUX_CFG(DA850, EMA_A_21, 10, 8, 15, 1, false)
 MUX_CFG(DA850, EMA_A_22, 10, 4, 15, 1, false)
 MUX_CFG(DA850, EMA_A_23, 10, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_D_8,  8, 28, 15, 1, false)
 MUX_CFG(DA850, EMA_D_9,  8, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_D_10, 8, 20, 15, 1, false)
 MUX_CFG(DA850, EMA_D_11, 8, 16, 15, 1, false)
 MUX_CFG(DA850, EMA_D_12, 8, 12, 15, 1, false)
 MUX_CFG(DA850, EMA_D_13, 8, 8, 15, 1, false)
 MUX_CFG(DA850, EMA_D_14, 8, 4, 15, 1, false)
 MUX_CFG(DA850, EMA_D_15, 8, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_BA_1, 5, 24, 15, 1, false)
 MUX_CFG(DA850, EMA_CLK,  6, 0, 15, 1, false)
 MUX_CFG(DA850, EMA_WAIT_1, 6, 24, 15, 1, false)
 MUX_CFG(DA850, NEMA_CS_2, 7, 0, 15, 1, false)
 /* SPI1 function */
 MUX_CFG(DA850, SPI1_CS_0, 5, 4, 15, 1, false)
 MUX_CFG(DA850, SPI1_CLK, 5, 8, 15, 1, false)
 MUX_CFG(DA850, SPI1_SOMI, 5, 16, 15, 1, false)
 MUX_CFG(DA850, SPI1_SIMO, 5, 20, 15, 1, false)
 /* GPIO function */
 MUX_CFG(DA850, GPIO2_6,  6, 4, 15, 8, false)
 MUX_CFG(DA850, GPIO2_8,  13, 28, 15, 8, false

 MUX_CFG(DA850, GPIO2_15, 13, 24, 15, 8, false)

 MUX_CFG(DA850, GPIO4_0,  10, 28, 15, 8, false)
 MUX_CFG(DA850, GPIO4_1,  10, 24, 15, 8, false)
 MUX_CFG(DA850, GPIO2_4,  6, 12, 15, 8, false)
 MUX_CFG(DA850, GPIO6_13, 13, 8, 15, 8, false)
 MUX_CFG(DA850, GPIO7_4,  17, 20, 15, 8, false)
 /* McBSP0 function */
 MUX_CFG(DA850, MCBSP0_CLKR, 2, 4, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_CLKX, 2, 8, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_FSR, 2, 12, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_FSX, 2, 16, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_DR, 2, 20, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_DX, 2, 24, 15, 2, false)
 MUX_CFG(DA850, MCBSP0_CLKS, 2, 28, 15, 0, false)
 /* McBSP1 function */
 MUX_CFG(DA850, MCBSP1_CLKR, 1, 4, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_CLKX, 1, 8, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_FSR, 1, 12, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_FSX, 1, 16, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_DR, 1, 20, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_DX, 1, 24, 15, 2, false)
 MUX_CFG(DA850, MCBSP1_CLKS, 1, 28, 15, 2, false)
#endif
};

const short da850_i2c0_pins[] __initdata = {
 DA850_I2C0_SDA, DA850_I2C0_SCL,
 -1
};

static struct davinci_soc_info davinci_soc_info_da850 = {
 .io_desc  = da850_io_desc,
 .io_desc_num  = ARRAY_SIZE(da850_io_desc),
 .ids   = da850_ids,
 .ids_num  = ARRAY_SIZE(da850_ids),
 .cpu_clks  = da850_clks,
 .psc_bases  = da850_psc_bases,
 .psc_bases_num  = ARRAY_SIZE(da850_psc_bases),
 .pinmux_pins  = da850_pins,
 .pinmux_pins_num = ARRAY_SIZE(da850_pins),
 .intc_base  = (void __iomem *)DA8XX_CP_INTC_VIRT,
 .intc_type  = DAVINCI_INTC_TYPE_CP_INTC,
 .intc_irq_prios  = da850_default_priorities,
 .intc_irq_num  = DA850_N_CP_INTC_IRQ,
 .timer_info  = &da850_timer_info,
 .gpio_base  = IO_ADDRESS(DA8XX_GPIO_BASE),
 .gpio_num  = 144,
 .gpio_irq  = IRQ_DA8XX_GPIO0,
 .serial_dev  = &da8xx_serial_device,
 .emac_pdata  = &da8xx_emac_pdata,
 .init_cpufreq_table = da850_init_cpufreq_table,
};

/*
 * I/O mapping
 */
#define IO_PHYS    0x01c00000
#define IO_OFFSET   0xfd000000 /* Virtual IO = 0xfec00000 */
#define IO_SIZE    0x00400000
#define IO_VIRT    (IO_PHYS + IO_OFFSET)
#define io_v2p(va)   ((va) - IO_OFFSET)
#define __IO_ADDRESS(x)   ((x) + IO_OFFSET)
#define IO_ADDRESS(pa)   IOMEM(__IO_ADDRESS(pa))

#define DA8XX_SYSCFG_BASE (IO_PHYS + 0x14000)
#define DA8XX_SYSCFG_VIRT(x) (da8xx_syscfg_base + (x))

void __init da850_init(void)
{
 da8xx_syscfg_base = ioremap(DA8XX_SYSCFG_BASE, SZ_4K);
 if (WARN(!da8xx_syscfg_base, "Unable to map syscfg module"))
  return;

 davinci_soc_info_da850.jtag_id_base =
     DA8XX_SYSCFG_VIRT(DA8XX_JTAG_ID_REG);
 davinci_soc_info_da850.pinmux_base = DA8XX_SYSCFG_VIRT(0x120);

 davinci_common_init(&davinci_soc_info_da850);

 /*
  * Move the clock source of Async3 domain to PLL1 SYSCLK2.
  * This helps keeping the peripherals on this domain insulated
  * from CPU frequency changes caused by DVFS. The firmware sets
  * both PLL0 and PLL1 to the same frequency so, there should not
  * be any noticible change even in non-DVFS use cases.
  */
 da850_set_async3_src(1);
}

int __init_or_module davinci_cfg_reg(const unsigned long index)
{
cfg = &soc_info->pinmux_pins[index];

/* Update the mux register in question */
 if (cfg->mask) {
  unsigned tmp1, tmp2;

  spin_lock_irqsave(&mux_spin_lock, flags);
  reg_orig = __raw_readl(base + cfg->mux_reg);

  mask = (cfg->mask << cfg->mask_offset);
  tmp1 = reg_orig & mask;
  reg = reg_orig & ~mask;

  tmp2 = (cfg->mode << cfg->mask_offset);
  reg |= tmp2;

  if (tmp1 != tmp2)
   warn = 1;

  __raw_writel(reg, base + cfg->mux_reg);
  spin_unlock_irqrestore(&mux_spin_lock, flags);
 }

}

int da8xx_pinmux_setup(const short pins[])
{
 int i, error = -EINVAL;

        if (pins)
  for (i = 0; pins[i] >= 0; i++) {
   error = davinci_cfg_reg(pins[i]);
   if (error)
    break;
  }

 return error;
}

posted on 2011-07-31 00:15  嵌入式操作系统  阅读(3371)  评论(0编辑  收藏  举报

导航