Sfoglia il codice sorgente

mtd: rawnand: gpmi: remove direct_dma_map_ok from driver data struct

Instead of putting direct_dma_map_ok into driver struct pass it around
between functions to make the code more readable.

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Signed-off-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>
Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com>
Sascha Hauer 7 anni fa
parent
commit
111bfed4f3

+ 3 - 2
drivers/mtd/nand/raw/gpmi-nand/gpmi-lib.c

@@ -636,6 +636,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len)
 	int chip = this->current_chip;
 	int chip = this->current_chip;
 	int ret;
 	int ret;
 	u32 pio[2];
 	u32 pio[2];
+	bool direct;
 
 
 	/* [1] : send PIO */
 	/* [1] : send PIO */
 	pio[0] = BF_GPMI_CTRL0_COMMAND_MODE(BV_GPMI_CTRL0_COMMAND_MODE__READ)
 	pio[0] = BF_GPMI_CTRL0_COMMAND_MODE(BV_GPMI_CTRL0_COMMAND_MODE__READ)
@@ -652,7 +653,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len)
 		return -EINVAL;
 		return -EINVAL;
 
 
 	/* [2] : send DMA request */
 	/* [2] : send DMA request */
-	prepare_data_dma(this, buf, len, DMA_FROM_DEVICE);
+	direct = prepare_data_dma(this, buf, len, DMA_FROM_DEVICE);
 	desc = dmaengine_prep_slave_sg(channel, &this->data_sgl,
 	desc = dmaengine_prep_slave_sg(channel, &this->data_sgl,
 					1, DMA_DEV_TO_MEM,
 					1, DMA_DEV_TO_MEM,
 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
 					DMA_PREP_INTERRUPT | DMA_CTRL_ACK);
@@ -664,7 +665,7 @@ int gpmi_read_data(struct gpmi_nand_data *this, void *buf, int len)
 	ret = start_dma_without_bch_irq(this, desc);
 	ret = start_dma_without_bch_irq(this, desc);
 
 
 	dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE);
 	dma_unmap_sg(this->dev, &this->data_sgl, 1, DMA_FROM_DEVICE);
-	if (this->direct_dma_map_ok == false)
+	if (!direct)
 		memcpy(buf, this->data_buffer_dma, len);
 		memcpy(buf, this->data_buffer_dma, len);
 
 
 	return ret;
 	return ret;

+ 7 - 8
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.c

@@ -447,7 +447,7 @@ struct dma_chan *get_dma_chan(struct gpmi_nand_data *this)
 }
 }
 
 
 /* Can we use the upper's buffer directly for DMA? */
 /* Can we use the upper's buffer directly for DMA? */
-void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len,
+bool prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len,
 		      enum dma_data_direction dr)
 		      enum dma_data_direction dr)
 {
 {
 	struct scatterlist *sgl = &this->data_sgl;
 	struct scatterlist *sgl = &this->data_sgl;
@@ -460,8 +460,7 @@ void prepare_data_dma(struct gpmi_nand_data *this, const void *buf, int len,
 		if (ret == 0)
 		if (ret == 0)
 			goto map_fail;
 			goto map_fail;
 
 
-		this->direct_dma_map_ok = true;
-		return;
+		return true;
 	}
 	}
 
 
 map_fail:
 map_fail:
@@ -473,7 +472,7 @@ map_fail:
 
 
 	dma_map_sg(this->dev, sgl, 1, dr);
 	dma_map_sg(this->dev, sgl, 1, dr);
 
 
-	this->direct_dma_map_ok = false;
+	return false;
 }
 }
 
 
 /* This will be called after the DMA operation is finished. */
 /* This will be called after the DMA operation is finished. */
@@ -966,12 +965,12 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip,
 	unsigned char *status;
 	unsigned char *status;
 	unsigned int  max_bitflips = 0;
 	unsigned int  max_bitflips = 0;
 	int           ret;
 	int           ret;
+	bool          direct = false;
 
 
 	dev_dbg(this->dev, "page number is : %d\n", page);
 	dev_dbg(this->dev, "page number is : %d\n", page);
 
 
 	payload_virt = this->payload_virt;
 	payload_virt = this->payload_virt;
 	payload_phys = this->payload_phys;
 	payload_phys = this->payload_phys;
-	this->direct_dma_map_ok = false;
 
 
 	if (virt_addr_valid(buf)) {
 	if (virt_addr_valid(buf)) {
 		dma_addr_t dest_phys;
 		dma_addr_t dest_phys;
@@ -981,7 +980,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip,
 		if (!dma_mapping_error(this->dev, dest_phys)) {
 		if (!dma_mapping_error(this->dev, dest_phys)) {
 			payload_virt = buf;
 			payload_virt = buf;
 			payload_phys = dest_phys;
 			payload_phys = dest_phys;
-			this->direct_dma_map_ok = true;
+			direct = true;
 		}
 		}
 	}
 	}
 
 
@@ -991,7 +990,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip,
 	/* go! */
 	/* go! */
 	ret = gpmi_read_page(this, payload_phys, auxiliary_phys);
 	ret = gpmi_read_page(this, payload_phys, auxiliary_phys);
 
 
-	if (this->direct_dma_map_ok)
+	if (direct)
 		dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size,
 		dma_unmap_single(this->dev, payload_phys, nfc_geo->payload_size,
 				 DMA_FROM_DEVICE);
 				 DMA_FROM_DEVICE);
 
 
@@ -1003,7 +1002,7 @@ static int gpmi_ecc_read_page_data(struct nand_chip *chip,
 	/* Loop over status bytes, accumulating ECC status. */
 	/* Loop over status bytes, accumulating ECC status. */
 	status = auxiliary_virt + nfc_geo->auxiliary_status_offset;
 	status = auxiliary_virt + nfc_geo->auxiliary_status_offset;
 
 
-	if (!this->direct_dma_map_ok)
+	if (!direct)
 		memcpy(buf, this->payload_virt, nfc_geo->payload_size);
 		memcpy(buf, this->payload_virt, nfc_geo->payload_size);
 
 
 	for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) {
 	for (i = 0; i < nfc_geo->ecc_chunk_count; i++, status++) {

+ 1 - 4
drivers/mtd/nand/raw/gpmi-nand/gpmi-nand.h

@@ -141,9 +141,6 @@ struct gpmi_nand_data {
 	int			current_chip;
 	int			current_chip;
 	unsigned int		command_length;
 	unsigned int		command_length;
 
 
-	/* for DMA operations */
-	bool			direct_dma_map_ok;
-
 	struct scatterlist	cmd_sgl;
 	struct scatterlist	cmd_sgl;
 	char			*cmd_buffer;
 	char			*cmd_buffer;
 
 
@@ -174,7 +171,7 @@ struct gpmi_nand_data {
 /* Common Services */
 /* Common Services */
 int common_nfc_set_geometry(struct gpmi_nand_data *);
 int common_nfc_set_geometry(struct gpmi_nand_data *);
 struct dma_chan *get_dma_chan(struct gpmi_nand_data *);
 struct dma_chan *get_dma_chan(struct gpmi_nand_data *);
-void prepare_data_dma(struct gpmi_nand_data *, const void *buf, int len,
+bool prepare_data_dma(struct gpmi_nand_data *, const void *buf, int len,
 		      enum dma_data_direction dr);
 		      enum dma_data_direction dr);
 int start_dma_without_bch_irq(struct gpmi_nand_data *,
 int start_dma_without_bch_irq(struct gpmi_nand_data *,
 			      struct dma_async_tx_descriptor *);
 			      struct dma_async_tx_descriptor *);