|
@@ -193,6 +193,12 @@ nandc_set_reg(nandc, NAND_READ_LOCATION_##reg, \
|
|
|
((size) << READ_LOCATION_SIZE) | \
|
|
|
((is_last) << READ_LOCATION_LAST))
|
|
|
|
|
|
+/*
|
|
|
+ * Returns the actual register address for all NAND_DEV_ registers
|
|
|
+ * (i.e. NAND_DEV_CMD0, NAND_DEV_CMD1, NAND_DEV_CMD2 and NAND_DEV_CMD_VLD)
|
|
|
+ */
|
|
|
+#define dev_cmd_reg_addr(nandc, reg) ((nandc)->props->dev_cmd_reg_start + (reg))
|
|
|
+
|
|
|
#define QPIC_PER_CW_CMD_SGL 32
|
|
|
#define QPIC_PER_CW_DATA_SGL 8
|
|
|
|
|
@@ -429,10 +435,12 @@ struct qcom_nand_host {
|
|
|
* among different NAND controllers.
|
|
|
* @ecc_modes - ecc mode for NAND
|
|
|
* @is_bam - whether NAND controller is using BAM
|
|
|
+ * @dev_cmd_reg_start - NAND_DEV_CMD_* registers starting offset
|
|
|
*/
|
|
|
struct qcom_nandc_props {
|
|
|
u32 ecc_modes;
|
|
|
bool is_bam;
|
|
|
+ u32 dev_cmd_reg_start;
|
|
|
};
|
|
|
|
|
|
/* Frees the BAM transaction memory */
|
|
@@ -848,6 +856,9 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
|
|
|
if (first == NAND_READ_ID || first == NAND_FLASH_STATUS)
|
|
|
flow_control = true;
|
|
|
|
|
|
+ if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
|
|
|
+ first = dev_cmd_reg_addr(nandc, first);
|
|
|
+
|
|
|
size = num_regs * sizeof(u32);
|
|
|
vaddr = nandc->reg_read_buf + nandc->reg_read_pos;
|
|
|
nandc->reg_read_pos += num_regs;
|
|
@@ -886,11 +897,11 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
|
|
|
if (first == NAND_EXEC_CMD)
|
|
|
flags |= NAND_BAM_NWD;
|
|
|
|
|
|
- if (first == NAND_DEV_CMD1_RESTORE)
|
|
|
- first = NAND_DEV_CMD1;
|
|
|
+ if (first == NAND_DEV_CMD1_RESTORE || first == NAND_DEV_CMD1)
|
|
|
+ first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD1);
|
|
|
|
|
|
- if (first == NAND_DEV_CMD_VLD_RESTORE)
|
|
|
- first = NAND_DEV_CMD_VLD;
|
|
|
+ if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
|
|
|
+ first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
|
|
|
|
|
|
size = num_regs * sizeof(u32);
|
|
|
|
|
@@ -2498,7 +2509,8 @@ static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
|
|
|
|
|
|
/* kill onenand */
|
|
|
nandc_write(nandc, SFLASHC_BURST_CFG, 0);
|
|
|
- nandc_write(nandc, NAND_DEV_CMD_VLD, NAND_DEV_CMD_VLD_VAL);
|
|
|
+ nandc_write(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD),
|
|
|
+ NAND_DEV_CMD_VLD_VAL);
|
|
|
|
|
|
/* enable ADM or BAM DMA */
|
|
|
if (nandc->props->is_bam) {
|
|
@@ -2509,7 +2521,7 @@ static int qcom_nandc_setup(struct qcom_nand_controller *nandc)
|
|
|
}
|
|
|
|
|
|
/* save the original values of these registers */
|
|
|
- nandc->cmd1 = nandc_read(nandc, NAND_DEV_CMD1);
|
|
|
+ nandc->cmd1 = nandc_read(nandc, dev_cmd_reg_addr(nandc, NAND_DEV_CMD1));
|
|
|
nandc->vld = NAND_DEV_CMD_VLD_VAL;
|
|
|
|
|
|
return 0;
|
|
@@ -2758,6 +2770,7 @@ static int qcom_nandc_remove(struct platform_device *pdev)
|
|
|
static const struct qcom_nandc_props ipq806x_nandc_props = {
|
|
|
.ecc_modes = (ECC_RS_4BIT | ECC_BCH_8BIT),
|
|
|
.is_bam = false,
|
|
|
+ .dev_cmd_reg_start = 0x0,
|
|
|
};
|
|
|
|
|
|
/*
|