staging: spectra: move all init logic into nand_pci_probe

Currently there are some driver initialization logic that
is not part of nand_pci_probe function. This will result in
that part of driver initialization code executing even on
platforms without the corresponding hardware which is always
dangerous.

Signed-off-by: Chuanxiao Dong <chuanxiao.dong@intel.com>
Signed-off-by: Yong Wang <yong.y.wang@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
Yong Wang 2010-11-17 22:08:28 +08:00 committed by Greg Kroah-Hartman
parent 237a1a1aef
commit 6f5a416216
4 changed files with 149 additions and 133 deletions

View file

@ -729,34 +729,16 @@ static void create_sysfs_entry(struct device *dev)
} }
*/ */
static int GLOB_SBD_init(void) int register_spectra_ftl()
{ {
int i; int i;
/* Set debug output level (0~3) here. 3 is most verbose */
printk(KERN_ALERT "Spectra: %s\n", GLOB_version);
mutex_init(&spectra_lock);
GLOB_SBD_majornum = register_blkdev(0, GLOB_SBD_NAME);
if (GLOB_SBD_majornum <= 0) {
printk(KERN_ERR "Unable to get the major %d for Spectra",
GLOB_SBD_majornum);
return -EBUSY;
}
if (PASS != GLOB_FTL_Flash_Init()) {
printk(KERN_ERR "Spectra: Unable to Initialize Flash Device. "
"Aborting\n");
goto out_flash_register;
}
/* create_sysfs_entry(&dev->dev); */ /* create_sysfs_entry(&dev->dev); */
if (PASS != GLOB_FTL_IdentifyDevice(&IdentifyDeviceData)) { if (PASS != GLOB_FTL_IdentifyDevice(&IdentifyDeviceData)) {
printk(KERN_ERR "Spectra: Unable to Read Flash Device. " printk(KERN_ERR "Spectra: Unable to Read Flash Device. "
"Aborting\n"); "Aborting\n");
goto out_flash_register; return -ENOMEM;
} else { } else {
nand_dbg_print(NAND_DBG_WARN, "In GLOB_SBD_init: " nand_dbg_print(NAND_DBG_WARN, "In GLOB_SBD_init: "
"Num blocks=%d, pagesperblock=%d, " "Num blocks=%d, pagesperblock=%d, "
@ -775,24 +757,46 @@ static int GLOB_SBD_init(void)
} }
printk(KERN_ALERT "Spectra: block table has been found.\n"); printk(KERN_ALERT "Spectra: block table has been found.\n");
GLOB_SBD_majornum = register_blkdev(0, GLOB_SBD_NAME);
if (GLOB_SBD_majornum <= 0) {
printk(KERN_ERR "Unable to get the major %d for Spectra",
GLOB_SBD_majornum);
goto out_ftl_flash_register;
}
for (i = 0; i < NUM_DEVICES; i++) for (i = 0; i < NUM_DEVICES; i++)
if (SBD_setup_device(&nand_device[i], i) == -ENOMEM) if (SBD_setup_device(&nand_device[i], i) == -ENOMEM)
goto out_ftl_flash_register; goto out_blk_register;
nand_dbg_print(NAND_DBG_DEBUG, nand_dbg_print(NAND_DBG_DEBUG,
"Spectra: module loaded with major number %d\n", "Spectra: module loaded with major number %d\n",
GLOB_SBD_majornum); GLOB_SBD_majornum);
return 0; return PASS;
out_blk_register:
unregister_blkdev(GLOB_SBD_majornum, GLOB_SBD_NAME);
out_ftl_flash_register: out_ftl_flash_register:
GLOB_FTL_Cache_Release(); GLOB_FTL_Cache_Release();
out_flash_register:
GLOB_FTL_Flash_Release();
unregister_blkdev(GLOB_SBD_majornum, GLOB_SBD_NAME);
printk(KERN_ERR "Spectra: Module load failed.\n"); printk(KERN_ERR "Spectra: Module load failed.\n");
return -ENOMEM; return FAIL;
}
EXPORT_SYMBOL_GPL(register_spectra_ftl);
static int GLOB_SBD_init(void)
{
/* Set debug output level (0~3) here. 3 is most verbose */
printk(KERN_ALERT "Spectra: %s\n", GLOB_version);
mutex_init(&spectra_lock);
if (PASS != GLOB_FTL_Flash_Init()) {
printk(KERN_ERR "Spectra: Unable to Initialize Flash Device. "
"Aborting\n");
return -ENODEV;
}
return 0;
} }
static void __exit GLOB_SBD_exit(void) static void __exit GLOB_SBD_exit(void)

View file

@ -80,5 +80,6 @@ extern int nand_debug_level;
extern int GLOB_Calc_Used_Bits(u32 n); extern int GLOB_Calc_Used_Bits(u32 n);
extern u64 GLOB_u64_Div(u64 addr, u32 divisor); extern u64 GLOB_u64_Div(u64 addr, u32 divisor);
extern u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type); extern u64 GLOB_u64_Remainder(u64 addr, u32 divisor_type);
extern int register_spectra_ftl(void);
#endif /* _FFSPORT_ */ #endif /* _FFSPORT_ */

View file

@ -1258,9 +1258,7 @@ int GLOB_FTL_Flash_Init(void)
g_SBDCmdIndex = 0; g_SBDCmdIndex = 0;
GLOB_LLD_Flash_Init(); status = GLOB_LLD_Flash_Init();
status = GLOB_LLD_Read_Device_ID();
return status; return status;
} }

View file

@ -2395,112 +2395,9 @@ static int nand_pci_probe(struct pci_dev *dev, const struct pci_device_id *id)
unsigned long csr_base; unsigned long csr_base;
unsigned long csr_len; unsigned long csr_len;
struct mrst_nand_info *pndev = &info; struct mrst_nand_info *pndev = &info;
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
__FILE__, __LINE__, __func__);
ret = pci_enable_device(dev);
if (ret) {
printk(KERN_ERR "Spectra: pci_enable_device failed.\n");
return ret;
}
pci_set_master(dev);
pndev->dev = dev;
csr_base = pci_resource_start(dev, 0);
if (!csr_base) {
printk(KERN_ERR "Spectra: pci_resource_start failed!\n");
ret = -ENODEV;
goto failed_req_csr;
}
csr_len = pci_resource_len(dev, 0);
if (!csr_len) {
printk(KERN_ERR "Spectra: pci_resource_len failed!\n");
ret = -ENODEV;
goto failed_req_csr;
}
ret = pci_request_regions(dev, SPECTRA_NAND_NAME);
if (ret) {
printk(KERN_ERR "Spectra: Unable to request "
"memory region\n");
goto failed_req_csr;
}
pndev->ioaddr = ioremap_nocache(csr_base, csr_len);
if (!pndev->ioaddr) {
printk(KERN_ERR "Spectra: Unable to remap memory region\n");
ret = -ENOMEM;
goto failed_remap_csr;
}
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: CSR 0x%08lx -> 0x%p (0x%lx)\n",
csr_base, pndev->ioaddr, csr_len);
init_completion(&pndev->complete);
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: IRQ %d\n", dev->irq);
#if CMD_DMA
if (request_irq(dev->irq, cdma_isr, IRQF_SHARED,
SPECTRA_NAND_NAME, &info)) {
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
ret = -ENODEV;
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
#else
if (request_irq(dev->irq, ddma_isr, IRQF_SHARED,
SPECTRA_NAND_NAME, &info)) {
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
ret = -ENODEV;
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
#endif
pci_set_drvdata(dev, pndev);
return 0;
failed_remap_csr:
pci_release_regions(dev);
failed_req_csr:
pci_disable_device(dev);
return ret;
}
static void nand_pci_remove(struct pci_dev *dev)
{
struct mrst_nand_info *pndev = pci_get_drvdata(dev);
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
__FILE__, __LINE__, __func__);
#if CMD_DMA
free_irq(dev->irq, pndev);
#endif
iounmap(pndev->ioaddr);
pci_release_regions(dev);
pci_disable_device(dev);
}
MODULE_DEVICE_TABLE(pci, nand_pci_ids);
static struct pci_driver nand_pci_driver = {
.name = SPECTRA_NAND_NAME,
.id_table = nand_pci_ids,
.probe = nand_pci_probe,
.remove = nand_pci_remove,
};
int NAND_Flash_Init(void)
{
int retval;
u32 int_mask; u32 int_mask;
nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n", nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
__FILE__, __LINE__, __func__); __FILE__, __LINE__, __func__);
FlashReg = ioremap_nocache(GLOB_HWCTL_REG_BASE, FlashReg = ioremap_nocache(GLOB_HWCTL_REG_BASE,
@ -2582,6 +2479,122 @@ int NAND_Flash_Init(void)
iowrite32(0, FlashReg + TWO_ROW_ADDR_CYCLES); iowrite32(0, FlashReg + TWO_ROW_ADDR_CYCLES);
iowrite32(1, FlashReg + ECC_ENABLE); iowrite32(1, FlashReg + ECC_ENABLE);
enable_ecc = 1; enable_ecc = 1;
ret = pci_enable_device(dev);
if (ret) {
printk(KERN_ERR "Spectra: pci_enable_device failed.\n");
goto failed_req_csr;
}
pci_set_master(dev);
pndev->dev = dev;
csr_base = pci_resource_start(dev, 0);
if (!csr_base) {
printk(KERN_ERR "Spectra: pci_resource_start failed!\n");
ret = -ENODEV;
goto failed_req_csr;
}
csr_len = pci_resource_len(dev, 0);
if (!csr_len) {
printk(KERN_ERR "Spectra: pci_resource_len failed!\n");
ret = -ENODEV;
goto failed_req_csr;
}
ret = pci_request_regions(dev, SPECTRA_NAND_NAME);
if (ret) {
printk(KERN_ERR "Spectra: Unable to request "
"memory region\n");
goto failed_req_csr;
}
pndev->ioaddr = ioremap_nocache(csr_base, csr_len);
if (!pndev->ioaddr) {
printk(KERN_ERR "Spectra: Unable to remap memory region\n");
ret = -ENOMEM;
goto failed_remap_csr;
}
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: CSR 0x%08lx -> 0x%p (0x%lx)\n",
csr_base, pndev->ioaddr, csr_len);
init_completion(&pndev->complete);
nand_dbg_print(NAND_DBG_DEBUG, "Spectra: IRQ %d\n", dev->irq);
#if CMD_DMA
if (request_irq(dev->irq, cdma_isr, IRQF_SHARED,
SPECTRA_NAND_NAME, &info)) {
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
ret = -ENODEV;
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
#else
if (request_irq(dev->irq, ddma_isr, IRQF_SHARED,
SPECTRA_NAND_NAME, &info)) {
printk(KERN_ERR "Spectra: Unable to allocate IRQ\n");
ret = -ENODEV;
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
#endif
pci_set_drvdata(dev, pndev);
ret = GLOB_LLD_Read_Device_ID();
if (ret) {
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
ret = register_spectra_ftl();
if (ret) {
iounmap(pndev->ioaddr);
goto failed_remap_csr;
}
return 0;
failed_remap_csr:
pci_release_regions(dev);
failed_req_csr:
pci_disable_device(dev);
iounmap(FlashMem);
iounmap(FlashReg);
return ret;
}
static void nand_pci_remove(struct pci_dev *dev)
{
struct mrst_nand_info *pndev = pci_get_drvdata(dev);
nand_dbg_print(NAND_DBG_WARN, "%s, Line %d, Function: %s\n",
__FILE__, __LINE__, __func__);
#if CMD_DMA
free_irq(dev->irq, pndev);
#endif
iounmap(pndev->ioaddr);
pci_release_regions(dev);
pci_disable_device(dev);
}
MODULE_DEVICE_TABLE(pci, nand_pci_ids);
static struct pci_driver nand_pci_driver = {
.name = SPECTRA_NAND_NAME,
.id_table = nand_pci_ids,
.probe = nand_pci_probe,
.remove = nand_pci_remove,
};
int NAND_Flash_Init(void)
{
int retval;
nand_dbg_print(NAND_DBG_TRACE, "%s, Line %d, Function: %s\n",
__FILE__, __LINE__, __func__);
retval = pci_register_driver(&nand_pci_driver); retval = pci_register_driver(&nand_pci_driver);
if (retval) if (retval)