static void __exit gpio_exit(void) { int i; for (i = 0; i < ARRAYSIZE(gpio_file); i++) devfs_unregister(gpio_file[i].handle); devfs_unregister(gpio_dir); devfs_unregister_chrdev(gpio_major, "gpio"); sb_detach(gpio_sbh);}
mod_exit_t sflash_mtd_exit(void) { #ifdef CONFIG_MTD_PARTITIONS del_mtd_partitions(&sflash.mtd); #else del_mtd_device(&sflash.mtd); #endif iounmap((void *) sflash.cc); sb_detach(sflash.sbh); }
/* * Linux: Deinit API */ void bcm_api_deinit() { #ifdef __KERNEL__ #ifdef BCM5380 if (robo) robosw_detach(robo); if (hSb) sb_detach(hSb); #else if (robo) robosw_detach_pmii(robo); #endif #else robo_fd_instance--; if (0 == robo_fd_instance) { if (-1 != robo_fd) close(robo_fd); robo_fd = -1; } #endif }
mod_init_t sflash_mtd_init(void) { struct pci_dev *pdev; int ret = 0; struct sflash *info; uint i; #ifdef CONFIG_MTD_PARTITIONS struct mtd_partition *parts; #endif if (!(pdev = pci_find_device(VENDOR_BROADCOM, SB_CC, NULL))) { printk(KERN_ERR "sflash: chipcommon not found\n"); return -ENODEV; } memset(&sflash, 0, sizeof(struct sflash_mtd)); init_MUTEX(&sflash.lock); /* attach to the backplane */ if (!(sflash.sbh = sb_kattach(SB_OSH))) { printk(KERN_ERR "sflash: error attaching to backplane\n"); ret = -EIO; goto fail; } /* Map registers and flash base */ if (!(sflash.cc = ioremap_nocache(pci_resource_start(pdev, 0), pci_resource_len(pdev, 0)))) { printk(KERN_ERR "sflash: error mapping registers\n"); ret = -EIO; goto fail; } /* Initialize serial flash access */ if (!(info = sflash_init(sflash.sbh, sflash.cc))) { printk(KERN_ERR "sflash: found no supported devices\n"); ret = -ENODEV; goto fail; } printk(KERN_INFO "sflash: found serial flash; blocksize=%dKB, numblocks=%d, size=%dKB\n",info->blocksize/1024,info->numblocks,info->size/1024); /* Setup region info */ sflash.region.offset = 0; sflash.region.erasesize = info->blocksize; sflash.region.numblocks = info->numblocks; if (sflash.region.erasesize > sflash.mtd.erasesize) sflash.mtd.erasesize = sflash.region.erasesize; sflash.mtd.size = info->size; sflash.mtd.numeraseregions = 1; /* Register with MTD */ sflash.mtd.name = "sflash"; sflash.mtd.type = MTD_NORFLASH; sflash.mtd.flags = MTD_CAP_NORFLASH; sflash.mtd.eraseregions = &sflash.region; sflash.mtd.module = THIS_MODULE; sflash.mtd.erase = sflash_mtd_erase; sflash.mtd.read = sflash_mtd_read; sflash.mtd.write = sflash_mtd_write; sflash.mtd.priv = &sflash; #ifdef CONFIG_MTD_PARTITIONS parts = init_mtd_partitions(&sflash.mtd, sflash.mtd.size); for (i = 0; parts[i].name; i++); ret = add_mtd_partitions(&sflash.mtd, parts, i); #else ret = add_mtd_device(&sflash.mtd); #endif if (ret) { printk(KERN_ERR "sflash: add_mtd failed\n"); goto fail; } return 0; fail: if (sflash.cc) iounmap((void *) sflash.cc); if (sflash.sbh) sb_detach(sflash.sbh); return ret; }