static int dspi_setup_transfer(struct spi_device *spi, struct spi_transfer *t)
{
	struct chip_data *chip;
	struct fsl_dspi *dspi = spi_master_get_devdata(spi->master);
	unsigned char br = 0, pbr = 0, fmsz = 0;

	/* Only alloc on first setup */
	chip = spi_get_ctldata(spi);
	if (chip == NULL) {
		chip = kcalloc(1, sizeof(struct chip_data), GFP_KERNEL);
		if (!chip)
			return -ENOMEM;
	}

	chip->mcr_val = SPI_MCR_MASTER | SPI_MCR_PCSIS |
		SPI_MCR_CLR_TXF | SPI_MCR_CLR_RXF;
	if ((spi->bits_per_word >= 4) && (spi->bits_per_word <= 16)) {
		fmsz = spi->bits_per_word - 1;
	} else {
		pr_err("Invalid wordsize\n");
		kfree(chip);
		return -ENODEV;
	}

	chip->void_write_data = 0;

	hz_to_spi_baud(&pbr, &br,
			spi->max_speed_hz, clk_get_rate(dspi->clk));

	chip->ctar_val =  SPI_CTAR_FMSZ(fmsz)
		| SPI_CTAR_CPOL(spi->mode & SPI_CPOL ? 1 : 0)
		| SPI_CTAR_CPHA(spi->mode & SPI_CPHA ? 1 : 0)
		| SPI_CTAR_LSBFE(spi->mode & SPI_LSB_FIRST ? 1 : 0)
		| SPI_CTAR_PBR(pbr)
		| SPI_CTAR_BR(br);

	spi_set_ctldata(spi, chip);

	return 0;
}
Example #2
0
static int __init bfspi_init( void ) {
	int	status, ret;
	int i, msz;
	dev_t dev = 0;
	struct bfspi_data	*mbfspi;
	int baud;
	#if 1
	
	wrcount = rdcount = 0;
	baud = hz_to_spi_baud((u32)spibaud*1000);
	if (baud <= 4)
		baud = 48;
	if (cardno < 0)
		cardno = 0;
	if (spimode > 3) 
		spimode = 0;
	msz = sizeof( struct bfspi_data);
	/* Allocate driver data */
	for (i=0; i < MAX_BFSPI_CLIENT; i++) {
		bfspi[i] = kzalloc(sizeof(struct bfspi_data), GFP_KERNEL);
		if (!bfspi[i]) {
			while (--i >= 0) {
				kfree(bfspi[i]);
			}
			return -ENOMEM;
		}
	}
		
	//BUILD_BUG_ON(N_BFSPI_MINORS > 256);
	PRINTK("\nkern>> INIT: alloc bfspi device cardno: %d!, baud: %d, mode: %d\n", cardno, spibaud, spimode);
	if ((ret = alloc_chrdev_region(&dev, 1, MAX_BFSPI_CLIENT, "bfspi")) < 0)
	{
		PRINTK("kern>> INIT: alloc bfspi device Failure to alloc chardev!\n");
		return ret;
	}
	
	BFSPI_MAJOR = MAJOR(dev);

	bfspi_class = class_create(THIS_MODULE, "bfspi");
	if (IS_ERR(bfspi_class)) {
		unregister_chrdev_region(dev, 1);
		PRINTK("kern>> INIT: alloc bfspi device Failure to register chardev!\n");
		return PTR_ERR(bfspi_class);
	}
	/* Initialize the driver data */
	//bfspi->spi = spi;
	

	//INIT_LIST_HEAD(&bfspi->device_entry);

	/* If we can allocate a minor number, hook up this device.
	 * Reusing minors is fine so long as udev or mdev is working.
	 */
	mutex_lock(&device_list_lock);
	for (i=0; i < MAX_BFSPI_CLIENT; i++) {
		mbfspi = bfspi[i];
		//minor = find_first_zero_bit(minors, N_BFSPI_MINORS);
		//if (minor < N_BFSPI_MINORS) {
		struct device *device;
		
		spin_lock_init(&mbfspi->spi_lock);
		mutex_init(&mbfspi->buf_lock);
		cdev_init(&mbfspi->cdev, &bfspi_fops);
		mbfspi->cdev.owner = THIS_MODULE;
		mbfspi->cardno = cardno;
		portno = mbfspi->portno = i+1;
		
		mbfspi->devt = MKDEV(BFSPI_MAJOR, i+1);
		
		cdev_add(&mbfspi->cdev, mbfspi->devt, 1);
		
		device = device_create(bfspi_class, NULL, mbfspi->devt, NULL,
							"bfspi%d.%d", cardno, portno);
							
		status = IS_ERR(device) ? PTR_ERR(device) : 0;
		if (status == 0)
			PRINTK("kern>> init: allocate %d bfspi%d.%d Succses!\n", BFSPI_MAJOR, cardno, portno);
	}
	mutex_unlock(&device_list_lock);
	#endif
	
	//if (spibaud <= 0)
	//	spibaud = 10;

	bfspi_hardware_init(baud, ((1 << SPI_NCSA) | (1 << SPI_NCSB)));
	//bfspi_reset(RESET_BIT);
	return status;
}