static int __init pxa95x_init(void) { int ret = 0, i; if (cpu_is_pxa95x()) { mfp_init_base(io_p2v(MFPR_BASE)); mfp_init_addr(pxa95x_mfp_addr_map); reset_status = ARSR; /* */ ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S); clkdev_add_table(pxa95x_clkregs, ARRAY_SIZE(pxa95x_clkregs)); if ((ret = pxa_init_dma(IRQ_DMA, 32))) return ret; register_syscore_ops(&pxa_irq_syscore_ops); register_syscore_ops(&pxa3xx_clock_syscore_ops); ret = platform_add_devices(devices, ARRAY_SIZE(devices)); } return ret; }
static int __init pxa95x_init(void) { int ret = 0, i; if (cpu_is_pxa95x()) { mfp_init_base(io_p2v(MFPR_BASE)); mfp_init_addr(pxa95x_mfp_addr_map); reset_status = ARSR; /* * clear RDH bit every time after reset * * Note: the last 3 bits DxS are write-1-to-clear so carefully * preserve them here in case they will be referenced later */ ASCR &= ~(ASCR_RDH | ASCR_D1S | ASCR_D2S | ASCR_D3S); clkdev_add_table(pxa95x_clkregs, ARRAY_SIZE(pxa95x_clkregs)); if ((ret = pxa_init_dma(IRQ_DMA, 32))) return ret; register_syscore_ops(&pxa_irq_syscore_ops); register_syscore_ops(&pxa_gpio_syscore_ops); register_syscore_ops(&pxa3xx_clock_syscore_ops); ret = platform_add_devices(devices, ARRAY_SIZE(devices)); } return ret; }
void mfp_config(unsigned long *mfp_cfgs, int num) { unsigned long flags; int i, drv_b11 = 0, no_lpm = 0; #ifdef CONFIG_ARCH_MMP if (cpu_is_pxa910() || cpu_is_pxa988() || cpu_is_pxa986() || cpu_is_mmp2() || cpu_is_mmp3() || cpu_is_pxa1088()) drv_b11 = 1; if (cpu_is_pxa168() || cpu_is_pxa910()) no_lpm = 1; #elif defined(CONFIG_ARCH_PXA) if (cpu_is_pxa95x()) drv_b11 = 1; #endif spin_lock_irqsave(&mfp_spin_lock, flags); for (i = 0; i < num; i++, mfp_cfgs++) { unsigned long tmp, c = *mfp_cfgs; struct mfp_pin *p; int pin, af, drv, lpm, edge, pull; pin = MFP_PIN(c); BUG_ON(pin >= MFP_PIN_MAX); p = &mfp_table[pin]; af = MFP_AF(c); drv = MFP_DS(c); lpm = MFP_LPM_STATE(c); edge = MFP_LPM_EDGE(c); pull = MFP_PULL(c); if (drv_b11) drv = drv << 1; if (no_lpm) lpm = 0; tmp = MFPR_AF_SEL(af) | MFPR_DRIVE(drv); tmp |= mfpr_pull[pull] | mfpr_lpm[lpm] | mfpr_edge[edge]; p->mfpr_run = tmp; p->mfpr_lpm = p->mfpr_run; p->config = c; __mfp_config_run(p); } mfpr_sync(); spin_unlock_irqrestore(&mfp_spin_lock, flags); }