static void __exit scc_enet_cleanup(void) { struct rtnet_device *rtdev = rtdev_root; struct scc_enet_private *cep = (struct scc_enet_private *)rtdev->priv; volatile cpm8xx_t *cp = cpmp; volatile scc_enet_t *ep; if (rtdev) { rtdm_irq_disable(&cep->irq_handle); rtdm_irq_free(&cep->irq_handle); ep = (scc_enet_t *)(&cp->cp_dparam[PROFF_ENET]); m8xx_cpm_dpfree(ep->sen_genscc.scc_rbase); m8xx_cpm_dpfree(ep->sen_genscc.scc_tbase); rt_stack_disconnect(rtdev); rt_unregister_rtnetdev(rtdev); rt_rtdev_disconnect(rtdev); printk("%s: unloaded\n", rtdev->name); rtskb_pool_release(&cep->skb_pool); rtdev_free(rtdev); rtdev_root = NULL; } }
static void __exit cpm_load_cleanup (void) { int i; volatile immap_t *immap = (immap_t *) IMAP_ADDR; volatile cpm8xx_t *cp = &immap->im_cpm; volatile risc_timer_t *rtram = (risc_timer_t *) & cp->cp_dparam[PROFF_RTIMER]; remove_proc_entry (PROC_NAME, NULL); /* Stop the general purpose timers. */ immap->im_cpmtimer.cpmt_tgcr |= CPMTIMER_TGCR_STP1 | CPMTIMER_TGCR_STP2; /* Stop the RISC timers. */ #ifdef RCCR_BUG *(uint *) & (immap->im_cpm.cp_rccr) &= ~0x80000000; #else immap->im_cpm.cp_rccr &= ~0x8000; #endif /* Disable RISC timers. */ for (i = 0; i < RISC_TIMER_MAX; i++) { rtram->tm_cmd = (i << 16); /* Wait for a previous command to clear. */ while (cp->cp_cpcr & CPM_CR_FLG); /* Issue SET TIMER command. */ cp->cp_cpcr = mk_cr_cmd (CPM_CR_CH_TIMER, CPM_CR_SET_TIMER) | CPM_CR_FLG; #if 0 while (cp->cp_cpcr & CPM_CR_FLG); #endif } m8xx_cpm_dpfree (risc_dpram_timers); }