Init function
Prev | Chapter 4. Basic board driver | Next

## Init function

The init function allocates memory and sets up all the board specific parameters and function pointers. When everything is set up nand_scan() is called. This function tries to detect and identify then chip. If a chip is found all the internal data fields are initialized accordingly. The structure(s) have to be zeroed out first and then filled with the neccecary information about the device.

    int __init board_init (void)
    {
    	struct nand_chip *this;
    	int err = 0;

    	/* Allocate memory for MTD device structure and private data */
    	board_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip), GFP_KERNEL);
    	if (!board_mtd) {
    		printk ("Unable to allocate NAND MTD device structure.\n");
    		err = -ENOMEM;
    		goto out;
    	}

    	/* Initialize structures */
    	memset ((char *) board_mtd, 0, sizeof(struct mtd_info) + sizeof(struct nand_chip));

    	/* map physical adress */
    	baseaddr = (unsigned long)ioremap(CHIP_PHYSICAL_ADDRESS, 1024);
    	if(!baseaddr){
    		printk("Ioremap to access NAND chip failed\n");
    		err = -EIO;
    		goto out_mtd;
    	}

    	/* Get pointer to private data */
    	this = (struct nand_chip *) ();
    	/* Link the private data with the MTD structure */
    	board_mtd->priv = this;

    	/* Set address of NAND IO lines */
    	this->IO_ADDR_R = baseaddr;
    	this->IO_ADDR_W = baseaddr;
    	/* Reference hardware control function */
    	this->hwcontrol = board_hwcontrol;
    	/* Set command delay time, see datasheet for correct value */
    	this->chip_delay = CHIP_DEPENDEND_COMMAND_DELAY;
    	/* Assign the device ready function, if available */
    	this->dev_ready = board_dev_ready;
    	this->eccmode = NAND_ECC_SOFT;

    	/* Scan to find existance of the device */
    	if (nand_scan (board_mtd, 1)) {
    		err = -ENXIO;
    		goto out_ior;
    	}

    	add_mtd_partitions(board_mtd, partition_info, NUM_PARTITIONS);
    	goto out;

    out_ior:
    	iounmap((void *)baseaddr);
    out_mtd:
    	kfree (board_mtd);
    out:
    	return err;
    }
    module_init(board_init);

Prev | Up | Next
Device ready function | Home | Exit function