diff options
Diffstat (limited to 'drivers/mtd/nand/atmel_nand.c')
| -rw-r--r-- | drivers/mtd/nand/atmel_nand.c | 134 | 
1 files changed, 67 insertions, 67 deletions
| diff --git a/drivers/mtd/nand/atmel_nand.c b/drivers/mtd/nand/atmel_nand.c index 583cdd9bb971..bddcf83d6859 100644 --- a/drivers/mtd/nand/atmel_nand.c +++ b/drivers/mtd/nand/atmel_nand.c @@ -116,7 +116,6 @@ static struct atmel_nfc	nand_nfc;  struct atmel_nand_host {  	struct nand_chip	nand_chip; -	struct mtd_info		mtd;  	void __iomem		*io_base;  	dma_addr_t		io_phys;  	struct atmel_nand_data	board; @@ -128,7 +127,7 @@ struct atmel_nand_host {  	struct atmel_nfc	*nfc; -	struct atmel_nand_caps	*caps; +	const struct atmel_nand_caps	*caps;  	bool			has_pmecc;  	u8			pmecc_corr_cap;  	u16			pmecc_sector_size; @@ -182,8 +181,8 @@ static void atmel_nand_disable(struct atmel_nand_host *host)   */  static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	if (ctrl & NAND_CTRL_CHANGE) {  		if (ctrl & NAND_NCE) @@ -205,8 +204,8 @@ static void atmel_nand_cmd_ctrl(struct mtd_info *mtd, int cmd, unsigned int ctrl   */  static int atmel_nand_device_ready(struct mtd_info *mtd)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	return gpio_get_value(host->board.rdy_pin) ^                  !!host->board.rdy_pin_active_low; @@ -215,8 +214,8 @@ static int atmel_nand_device_ready(struct mtd_info *mtd)  /* Set up for hardware ready pin and enable pin. */  static int atmel_nand_set_enable_ready_pins(struct mtd_info *mtd)  { -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	int res = 0;  	if (gpio_is_valid(host->board.rdy_pin)) { @@ -267,8 +266,8 @@ static int atmel_nand_set_enable_ready_pins(struct mtd_info *mtd)   */  static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len)  { -	struct nand_chip	*nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip	*nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) {  		memcpy(buf, host->nfc->data_in_sram, len); @@ -280,8 +279,8 @@ static void atmel_read_buf8(struct mtd_info *mtd, u8 *buf, int len)  static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len)  { -	struct nand_chip	*nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip	*nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	if (host->nfc && host->nfc->use_nfc_sram && host->nfc->data_in_sram) {  		memcpy(buf, host->nfc->data_in_sram, len); @@ -293,14 +292,14 @@ static void atmel_read_buf16(struct mtd_info *mtd, u8 *buf, int len)  static void atmel_write_buf8(struct mtd_info *mtd, const u8 *buf, int len)  { -	struct nand_chip	*nand_chip = mtd->priv; +	struct nand_chip	*nand_chip = mtd_to_nand(mtd);  	__raw_writesb(nand_chip->IO_ADDR_W, buf, len);  }  static void atmel_write_buf16(struct mtd_info *mtd, const u8 *buf, int len)  { -	struct nand_chip	*nand_chip = mtd->priv; +	struct nand_chip	*nand_chip = mtd_to_nand(mtd);  	__raw_writesw(nand_chip->IO_ADDR_W, buf, len / 2);  } @@ -317,8 +316,10 @@ static int nfc_set_sram_bank(struct atmel_nand_host *host, unsigned int bank)  		return -EINVAL;  	if (bank) { +		struct mtd_info *mtd = nand_to_mtd(&host->nand_chip); +  		/* Only for a 2k-page or lower flash, NFC can handle 2 banks */ -		if (host->mtd.writesize > 2048) +		if (mtd->writesize > 2048)  			return -EINVAL;  		nfc_writel(host->nfc->hsmc_regs, BANK, ATMEL_HSMC_NFC_BANK1);  	} else { @@ -352,8 +353,8 @@ static int atmel_nand_dma_op(struct mtd_info *mtd, void *buf, int len,  	dma_addr_t dma_src_addr, dma_dst_addr, phys_addr;  	struct dma_async_tx_descriptor *tx = NULL;  	dma_cookie_t cookie; -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	void *p = buf;  	int err = -EIO;  	enum dma_data_direction dir = is_read ? DMA_FROM_DEVICE : DMA_TO_DEVICE; @@ -425,8 +426,8 @@ err_buf:  static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)  { -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	if (use_dma && len > mtd->oobsize)  		/* only use DMA for bigger than oob size: better performances */ @@ -441,8 +442,8 @@ static void atmel_read_buf(struct mtd_info *mtd, u8 *buf, int len)  static void atmel_write_buf(struct mtd_info *mtd, const u8 *buf, int len)  { -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	if (use_dma && len > mtd->oobsize)  		/* only use DMA for bigger than oob size: better performances */ @@ -533,8 +534,8 @@ static int pmecc_data_alloc(struct atmel_nand_host *host)  static void pmecc_gen_syndrome(struct mtd_info *mtd, int sector)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	int i;  	uint32_t value; @@ -550,8 +551,8 @@ static void pmecc_gen_syndrome(struct mtd_info *mtd, int sector)  static void pmecc_substitute(struct mtd_info *mtd)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	int16_t __iomem *alpha_to = host->pmecc_alpha_to;  	int16_t __iomem *index_of = host->pmecc_index_of;  	int16_t *partial_syn = host->pmecc_partial_syn; @@ -592,8 +593,8 @@ static void pmecc_substitute(struct mtd_info *mtd)  static void pmecc_get_sigma(struct mtd_info *mtd)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	int16_t *lmu = host->pmecc_lmu;  	int16_t *si = host->pmecc_si; @@ -750,8 +751,8 @@ static void pmecc_get_sigma(struct mtd_info *mtd)  static int pmecc_err_location(struct mtd_info *mtd)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	unsigned long end_time;  	const int cap = host->pmecc_corr_cap;  	const int num = 2 * cap + 1; @@ -802,8 +803,8 @@ static int pmecc_err_location(struct mtd_info *mtd)  static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,  		int sector_num, int extra_bytes, int err_nbr)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	int i = 0;  	int byte_pos, bit_pos, sector_size, pos;  	uint32_t tmp; @@ -848,8 +849,8 @@ static void pmecc_correct_data(struct mtd_info *mtd, uint8_t *buf, uint8_t *ecc,  static int pmecc_correction(struct mtd_info *mtd, u32 pmecc_stat, uint8_t *buf,  	u8 *ecc)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	int i, err_nbr;  	uint8_t *buf_pos;  	int max_bitflips = 0; @@ -919,7 +920,7 @@ static void pmecc_enable(struct atmel_nand_host *host, int ecc_op)  static int atmel_nand_pmecc_read_page(struct mtd_info *mtd,  	struct nand_chip *chip, uint8_t *buf, int oob_required, int page)  { -	struct atmel_nand_host *host = chip->priv; +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	int eccsize = chip->ecc.size * chip->ecc.steps;  	uint8_t *oob = chip->oob_poi;  	uint32_t *eccpos = chip->ecc.layout->eccpos; @@ -957,7 +958,7 @@ static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,  		struct nand_chip *chip, const uint8_t *buf, int oob_required,  		int page)  { -	struct atmel_nand_host *host = chip->priv; +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	uint32_t *eccpos = chip->ecc.layout->eccpos;  	int i, j;  	unsigned long end_time; @@ -992,8 +993,8 @@ static int atmel_nand_pmecc_write_page(struct mtd_info *mtd,  static void atmel_pmecc_core_init(struct mtd_info *mtd)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	uint32_t val = 0;  	struct nand_ecclayout *ecc_layout; @@ -1159,8 +1160,8 @@ static uint16_t *create_lookup_table(struct device *dev, int sector_size)  static int atmel_pmecc_nand_init_params(struct platform_device *pdev,  					 struct atmel_nand_host *host)  { -	struct mtd_info *mtd = &host->mtd;  	struct nand_chip *nand_chip = &host->nand_chip; +	struct mtd_info *mtd = nand_to_mtd(nand_chip);  	struct resource *regs, *regs_pmerr, *regs_rom;  	uint16_t *galois_table;  	int cap, sector_size, err_no; @@ -1308,8 +1309,8 @@ err:  static int atmel_nand_calculate(struct mtd_info *mtd,  		const u_char *dat, unsigned char *ecc_code)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	unsigned int ecc_value;  	/* get the first 2 ECC bytes */ @@ -1355,7 +1356,7 @@ static int atmel_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,  	 * Workaround: Reset the parity registers before reading the  	 * actual data.  	 */ -	struct atmel_nand_host *host = chip->priv; +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	if (host->board.need_reset_workaround)  		ecc_writel(host->ecc, CR, ATMEL_ECC_RST); @@ -1412,8 +1413,8 @@ static int atmel_nand_read_page(struct mtd_info *mtd, struct nand_chip *chip,  static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,  		u_char *read_ecc, u_char *isnull)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	unsigned int ecc_status;  	unsigned int ecc_word, ecc_bit; @@ -1444,7 +1445,7 @@ static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,  		 * We can't correct so many errors */  		dev_dbg(host->dev, "atmel_nand : multiple errors detected."  				" Unable to correct.\n"); -		return -EIO; +		return -EBADMSG;  	}  	/* if there's a single bit error : we can correct it */ @@ -1478,8 +1479,8 @@ static int atmel_nand_correct(struct mtd_info *mtd, u_char *dat,   */  static void atmel_nand_hwctl(struct mtd_info *mtd, int mode)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	if (host->board.need_reset_workaround)  		ecc_writel(host->ecc, CR, ATMEL_ECC_RST); @@ -1586,8 +1587,8 @@ static int atmel_of_init_port(struct atmel_nand_host *host,  static int atmel_hw_nand_init_params(struct platform_device *pdev,  					 struct atmel_nand_host *host)  { -	struct mtd_info *mtd = &host->mtd;  	struct nand_chip *nand_chip = &host->nand_chip; +	struct mtd_info *mtd = nand_to_mtd(nand_chip);  	struct resource		*regs;  	regs = platform_get_resource(pdev, IORESOURCE_MEM, 1); @@ -1771,8 +1772,8 @@ static int nfc_send_command(struct atmel_nand_host *host,  static int nfc_device_ready(struct mtd_info *mtd)  {  	u32 status, mask; -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	status = nfc_read_status(host);  	mask = nfc_readl(host->nfc->hsmc_regs, IMR); @@ -1787,8 +1788,8 @@ static int nfc_device_ready(struct mtd_info *mtd)  static void nfc_select_chip(struct mtd_info *mtd, int chip)  { -	struct nand_chip *nand_chip = mtd->priv; -	struct atmel_nand_host *host = nand_chip->priv; +	struct nand_chip *nand_chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(nand_chip);  	if (chip == -1)  		nfc_writel(host->nfc->hsmc_regs, CTRL, NFC_CTRL_DISABLE); @@ -1799,7 +1800,7 @@ static void nfc_select_chip(struct mtd_info *mtd, int chip)  static int nfc_make_addr(struct mtd_info *mtd, int command, int column,  		int page_addr, unsigned int *addr1234, unsigned int *cycle0)  { -	struct nand_chip *chip = mtd->priv; +	struct nand_chip *chip = mtd_to_nand(mtd);  	int acycle = 0;  	unsigned char addr_bytes[8]; @@ -1839,8 +1840,8 @@ static int nfc_make_addr(struct mtd_info *mtd, int command, int column,  static void nfc_nand_command(struct mtd_info *mtd, unsigned int command,  				int column, int page_addr)  { -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	unsigned long timeout;  	unsigned int nfc_addr_cmd = 0; @@ -1966,7 +1967,7 @@ static int nfc_sram_write_page(struct mtd_info *mtd, struct nand_chip *chip,  {  	int cfg, len;  	int status = 0; -	struct atmel_nand_host *host = chip->priv; +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	void *sram = host->nfc->sram_bank0 + nfc_get_sram_off(host);  	/* Subpage write is not supported */ @@ -2026,8 +2027,8 @@ static int nfc_sram_write_page(struct mtd_info *mtd, struct nand_chip *chip,  static int nfc_sram_init(struct mtd_info *mtd)  { -	struct nand_chip *chip = mtd->priv; -	struct atmel_nand_host *host = chip->priv; +	struct nand_chip *chip = mtd_to_nand(mtd); +	struct atmel_nand_host *host = nand_get_controller_data(chip);  	int res = 0;  	/* Initialize the NFC CFG register */ @@ -2093,7 +2094,6 @@ static int atmel_nand_probe(struct platform_device *pdev)  	struct mtd_info *mtd;  	struct nand_chip *nand_chip;  	struct resource *mem; -	struct mtd_part_parser_data ppdata = {};  	int res, irq;  	/* Allocate memory for the device structure (and zero it) */ @@ -2113,10 +2113,11 @@ static int atmel_nand_probe(struct platform_device *pdev)  	}  	host->io_phys = (dma_addr_t)mem->start; -	mtd = &host->mtd;  	nand_chip = &host->nand_chip; +	mtd = nand_to_mtd(nand_chip);  	host->dev = &pdev->dev;  	if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) { +		nand_set_flash_node(nand_chip, pdev->dev.of_node);  		/* Only when CONFIG_OF is enabled of_node can be parsed */  		res = atmel_of_init_port(host, pdev->dev.of_node);  		if (res) @@ -2126,8 +2127,8 @@ static int atmel_nand_probe(struct platform_device *pdev)  		       sizeof(struct atmel_nand_data));  	} -	nand_chip->priv = host;		/* link the private data structures */ -	mtd->priv = nand_chip; +	 /* link the private data structures */ +	nand_set_controller_data(nand_chip, host);  	mtd->dev.parent = &pdev->dev;  	/* Set address of NAND IO lines */ @@ -2259,9 +2260,8 @@ static int atmel_nand_probe(struct platform_device *pdev)  	}  	mtd->name = "atmel_nand"; -	ppdata.of_node = pdev->dev.of_node; -	res = mtd_device_parse_register(mtd, NULL, &ppdata, -			host->board.parts, host->board.num_parts); +	res = mtd_device_register(mtd, host->board.parts, +				  host->board.num_parts);  	if (!res)  		return res; @@ -2284,7 +2284,7 @@ err_nand_ioremap:  static int atmel_nand_remove(struct platform_device *pdev)  {  	struct atmel_nand_host *host = platform_get_drvdata(pdev); -	struct mtd_info *mtd = &host->mtd; +	struct mtd_info *mtd = nand_to_mtd(&host->nand_chip);  	nand_release(mtd); @@ -2304,11 +2304,11 @@ static int atmel_nand_remove(struct platform_device *pdev)  	return 0;  } -static struct atmel_nand_caps at91rm9200_caps = { +static const struct atmel_nand_caps at91rm9200_caps = {  	.pmecc_correct_erase_page = false,  }; -static struct atmel_nand_caps sama5d4_caps = { +static const struct atmel_nand_caps sama5d4_caps = {  	.pmecc_correct_erase_page = true,  }; | 
