예제 #1
0
파일: spi-flash.c 프로젝트: mirsys/xboot
static bool_t spi_flash_unregister(struct resource_t * res)
{
	struct block_t * blk;
	char name[64];

	snprintf(name, sizeof(name), "%s.%d", res->name, res->id);

	blk = search_block(name);
	if(!blk)
		return FALSE;

	if(!unregister_block(blk))
		return FALSE;

	spi_device_free(((struct spi_flash_private_data_t *)blk->priv)->dev);
	free(blk->priv);
	free(blk->name);
	free(blk);
	return TRUE;
}
예제 #2
0
파일: l-spi.c 프로젝트: xboot/xboot
static int m_spi_gc(lua_State * L)
{
	struct lspi_t * spi = luaL_checkudata(L, 1, MT_HARDWARE_SPI);
	spi_device_free(spi->dev);
	return 0;
}
예제 #3
0
파일: spi-flash.c 프로젝트: mirsys/xboot
static bool_t spi_flash_register(struct resource_t * res)
{
	struct spi_flash_data_t * rdat = (struct spi_flash_data_t *)res->data;
	struct spi_flash_private_data_t * dat;
	struct spi_device_t * dev;
	struct spi_flash_id_t * id;
	struct block_t * blk;
	char name[64];

	dev = spi_device_alloc(rdat->spibus, rdat->mode, 8, rdat->speed);
	if(!dev)
		return FALSE;

	id = spi_flash_read_id(dev);
	if(!id)
	{
		spi_device_free(dev);
		return FALSE;
	}

	dat = malloc(sizeof(struct spi_flash_private_data_t));
	if(!dat)
	{
		spi_device_free(dev);
		return FALSE;
	}

	blk = malloc(sizeof(struct block_t));
	if(!blk)
	{
		spi_device_free(dev);
		free(dat);
		return FALSE;
	}

	snprintf(name, sizeof(name), "%s.%d", res->name, res->id);
	dat->dev = dev;
	dat->id = id;

	blk->name = strdup(name);
	if(id->flags & SECTOR_4K)
	{
		blk->blksz = 4096;
		blk->blkcnt = id->sector_size * id->sector_count / 4096;
	}
	else
	{
		blk->blksz = id->sector_size;
		blk->blkcnt = id->sector_count;
	}
	blk->read = spi_flash_read;
	blk->write = spi_flash_write;
	blk->sync = spi_flash_sync;
	blk->suspend = spi_flash_suspend;
	blk->resume = spi_flash_resume;
	blk->priv = dat;

	spi_flash_write_enable(dev);
	spi_flash_write_status_register(dev, 0);

	if(register_block(blk))
		return TRUE;

	spi_device_free(dev);
	free(blk->priv);
	free(blk->name);
	free(blk);
	return FALSE;
}