[PATCH v13 2/8] mtd: rawnand: qcom: cleanup qcom_nandc driver
Md Sadre Alam
quic_mdalam at quicinc.com
Tue Nov 12 04:15:07 PST 2024
On 11/12/2024 12:00 AM, Miquel Raynal wrote:
> On 30/10/2024 at 17:49:13 +0530, Md Sadre Alam <quic_mdalam at quicinc.com> wrote:
>
>> cleanup qcom_nandc driver as below
>
> Perform a global cleanup of the Qualcomm NAND controller driver with the
> following improvements:
Ok
>>
>> - Remove register value indirection api
>
> API
Ok
>
>>
>> - Remove set_reg() api
>
> API
Ok
>
>>
>> - Convert read_loc_first & read_loc_last macro to function
>
> functions
Ok
>
>>
>> - Renamed multiple variables
>
> Rename
Ok
>
> ...
>
>> @@ -549,17 +535,17 @@ struct qcom_nand_host {
>> * among different NAND controllers.
>> * @ecc_modes - ecc mode for NAND
>> * @dev_cmd_reg_start - NAND_DEV_CMD_* registers starting offset
>> - * @is_bam - whether NAND controller is using BAM
>> - * @is_qpic - whether NAND CTRL is part of qpic IP
>> - * @qpic_v2 - flag to indicate QPIC IP version 2
>> + * @supports_bam - whether NAND controller is using BAM
>
> Use the plain letters BAM acronym at least here
Ok
>
>> + * @nandc_part_of_qpic - whether NAND controller is part of qpic IP
>> + * @qpic_version2 - flag to indicate QPIC IP version 2
>> * @use_codeword_fixup - whether NAND has different layout for boot partitions
>> */
>> struct qcom_nandc_props {
>> u32 ecc_modes;
>> u32 dev_cmd_reg_start;
>> - bool is_bam;
>> - bool is_qpic;
>> - bool qpic_v2;
>> + bool supports_bam;
>> + bool nandc_part_of_qpic;
>> + bool qpic_version2;
>> bool use_codeword_fixup;
>> };
>>
>> @@ -613,19 +599,11 @@ static void clear_bam_transaction(struct qcom_nand_controller *nandc)
>> {
>> struct bam_transaction *bam_txn = nandc->bam_txn;
>>
>> - if (!nandc->props->is_bam)
>> + if (!nandc->props->supports_bam)
>> return;
>>
>> - bam_txn->bam_ce_pos = 0;
>> - bam_txn->bam_ce_start = 0;
>> - bam_txn->cmd_sgl_pos = 0;
>> - bam_txn->cmd_sgl_start = 0;
>> - bam_txn->tx_sgl_pos = 0;
>> - bam_txn->tx_sgl_start = 0;
>> - bam_txn->rx_sgl_pos = 0;
>> - bam_txn->rx_sgl_start = 0;
>> + memset(&bam_txn->bam_ce_pos, 0, sizeof(u32) * 8);
>> bam_txn->last_data_desc = NULL;
>> - bam_txn->wait_second_completion = false;
>>
>> sg_init_table(bam_txn->cmd_sgl, nandc->max_cwperpage *
>> QPIC_PER_CW_CMD_SGL);
>> @@ -640,17 +618,7 @@ static void qpic_bam_dma_done(void *data)
>> {
>> struct bam_transaction *bam_txn = data;
>>
>> - /*
>> - * In case of data transfer with NAND, 2 callbacks will be generated.
>> - * One for command channel and another one for data channel.
>> - * If current transaction has data descriptors
>> - * (i.e. wait_second_completion is true), then set this to false
>> - * and wait for second DMA descriptor completion.
>> - */
>> - if (bam_txn->wait_second_completion)
>> - bam_txn->wait_second_completion = false;
>> - else
>> - complete(&bam_txn->txn_done);
>> + complete(&bam_txn->txn_done);
>> }
>>
>> static inline struct qcom_nand_host *to_qcom_nand_host(struct nand_chip *chip)
>> @@ -676,10 +644,9 @@ static inline void nandc_write(struct qcom_nand_controller *nandc, int offset,
>> iowrite32(val, nandc->base + offset);
>> }
>>
>> -static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc,
>> - bool is_cpu)
>> +static inline void nandc_dev_to_mem(struct qcom_nand_controller *nandc, bool is_cpu)
>
> No static inline in C code, you can also remove it.
Ok
>
>> {
>> - if (!nandc->props->is_bam)
>> + if (!nandc->props->supports_bam)
>> return;
>>
>> if (is_cpu)
>> @@ -694,93 +661,90 @@ static inline void nandc_read_buffer_sync(struct qcom_nand_controller *nandc,
>> DMA_FROM_DEVICE);
>> }
>
> ...
>
>> +/* Helper to check the code word, whether it is last cw or not */
>
> Helper to check whether this is the last CW or not
Ok
>
>
>> +static bool qcom_nandc_is_last_cw(struct nand_ecc_ctrl *ecc, int cw)
>> +{
>> + return cw == (ecc->steps - 1);
>> }
>>
>> -static void nandc_set_reg(struct nand_chip *chip, int offset,
>> - u32 val)
>> +/**
>> + * nandc_set_read_loc_first() - to set read location first register
>> + * @chip: NAND Private Flash Chip Data
>> + * @reg_base: location register base
>> + * @cw_offset: code word offset
>> + * @read_size: code word read length
>> + * @is_last_read_loc: is this the last read location
>> + *
>> + * This function will set location register value
>> + */
>
> ...
>
>> if (host->use_ecc) {
>> - cfg0 = (host->cfg0 & ~(7U << CW_PER_PAGE)) |
>> - (num_cw - 1) << CW_PER_PAGE;
>> + cfg0 = cpu_to_le32((host->cfg0 & ~(7U << CW_PER_PAGE)) |
>> + (num_cw - 1) << CW_PER_PAGE);
>>
>> - cfg1 = host->cfg1;
>> - ecc_bch_cfg = host->ecc_bch_cfg;
>> + cfg1 = cpu_to_le32(host->cfg1);
>> + ecc_bch_cfg = cpu_to_le32(host->ecc_bch_cfg);
>> } else {
>> - cfg0 = (host->cfg0_raw & ~(7U << CW_PER_PAGE)) |
>> - (num_cw - 1) << CW_PER_PAGE;
>> + cfg0 = cpu_to_le32((host->cfg0_raw & ~(7U << CW_PER_PAGE)) |
>> + (num_cw - 1) << CW_PER_PAGE);
>>
>> - cfg1 = host->cfg1_raw;
>> - ecc_bch_cfg = 1 << ECC_CFG_ECC_DISABLE;
>> + cfg1 = cpu_to_le32(host->cfg1_raw);
>> + ecc_bch_cfg = cpu_to_le32(1 << ECC_CFG_ECC_DISABLE);
>> }
>>
>> - nandc_set_reg(chip, NAND_FLASH_CMD, cmd);
>> - nandc_set_reg(chip, NAND_DEV0_CFG0, cfg0);
>> - nandc_set_reg(chip, NAND_DEV0_CFG1, cfg1);
>> - nandc_set_reg(chip, NAND_DEV0_ECC_CFG, ecc_bch_cfg);
>> - if (!nandc->props->qpic_v2)
>> - nandc_set_reg(chip, NAND_EBI2_ECC_BUF_CFG, host->ecc_buf_cfg);
>> - nandc_set_reg(chip, NAND_FLASH_STATUS, host->clrflashstatus);
>> - nandc_set_reg(chip, NAND_READ_STATUS, host->clrreadstatus);
>> - nandc_set_reg(chip, NAND_EXEC_CMD, 1);
>> + nandc->regs->cmd = cmd;
>> + nandc->regs->cfg0 = cfg0;
>> + nandc->regs->cfg1 = cfg1;
>> + nandc->regs->ecc_bch_cfg = ecc_bch_cfg;
>> +
>> + if (!nandc->props->qpic_version2)
>> + nandc->regs->ecc_buf_cfg = cpu_to_le32(host->ecc_buf_cfg);
>> +
>> + nandc->regs->clrflashstatus = cpu_to_le32(host->clrflashstatus);
>> + nandc->regs->clrreadstatus = cpu_to_le32(host->clrreadstatus);
>> + nandc->regs->exec = cpu_to_le32(1);
>>
>> if (read)
>> nandc_set_read_loc(chip, cw, 0, 0, host->use_ecc ?
>> @@ -1121,7 +1088,7 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
>> if (first == NAND_DEV_CMD_VLD || first == NAND_DEV_CMD1)
>> first = dev_cmd_reg_addr(nandc, first);
>>
>> - if (nandc->props->is_bam)
>> + if (nandc->props->supports_bam)
>> return prep_bam_dma_desc_cmd(nandc, true, first, vaddr,
>> num_regs, flags);
>>
>> @@ -1136,25 +1103,16 @@ static int read_reg_dma(struct qcom_nand_controller *nandc, int first,
>> * write_reg_dma: prepares a descriptor to write a given number of
>> * contiguous registers
>> *
>> + * @vaddr: contnigeous memory from where register value
>> will
>
> Please run a spell checker on your commits.
Ok
>
>> + * be written
>> * @first: offset of the first register in the contiguous block
>> * @num_regs: number of registers to write
>> * @flags: flags to control DMA descriptor preparation
>> */
>> -static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
>> - int num_regs, unsigned int flags)
>> +static int write_reg_dma(struct qcom_nand_controller *nandc, __le32 *vaddr,
>> + int first, int num_regs, unsigned int flags)
>> {
>> bool flow_control = false;
>> - struct nandc_regs *regs = nandc->regs;
>> - void *vaddr;
>> -
>> - vaddr = offset_to_nandc_reg(regs, first);
>> -
>> - if (first == NAND_ERASED_CW_DETECT_CFG) {
>> - if (flags & NAND_ERASED_CW_SET)
>> - vaddr = ®s->erased_cw_detect_cfg_set;
>> - else
>> - vaddr = ®s->erased_cw_detect_cfg_clr;
>> - }
>>
>> if (first == NAND_EXEC_CMD)
>> flags |= NAND_BAM_NWD;
>> @@ -1165,7 +1123,7 @@ static int write_reg_dma(struct qcom_nand_controller *nandc, int first,
>> if (first == NAND_DEV_CMD_VLD_RESTORE || first == NAND_DEV_CMD_VLD)
>> first = dev_cmd_reg_addr(nandc, NAND_DEV_CMD_VLD);
>>
>> - if (nandc->props->is_bam)
>> + if (nandc->props->supports_bam)
>> return prep_bam_dma_desc_cmd(nandc, false, first, vaddr,
>> num_regs, flags);
>>
>
> ...
>
>> @@ -2872,38 +2823,38 @@ static int qcom_param_page_type_exec(struct nand_chip *chip, const struct nand_
>> clear_read_regs(nandc);
>> clear_bam_transaction(nandc);
>>
>> - nandc_set_reg(chip, NAND_FLASH_CMD, q_op.cmd_reg);
>> -
>> - nandc_set_reg(chip, NAND_ADDR0, 0);
>> - nandc_set_reg(chip, NAND_ADDR1, 0);
>> - nandc_set_reg(chip, NAND_DEV0_CFG0, 0 << CW_PER_PAGE
>> - | 512 << UD_SIZE_BYTES
>> - | 5 << NUM_ADDR_CYCLES
>> - | 0 << SPARE_SIZE_BYTES);
>> - nandc_set_reg(chip, NAND_DEV0_CFG1, 7 << NAND_RECOVERY_CYCLES
>> - | 0 << CS_ACTIVE_BSY
>> - | 17 << BAD_BLOCK_BYTE_NUM
>> - | 1 << BAD_BLOCK_IN_SPARE_AREA
>> - | 2 << WR_RD_BSY_GAP
>> - | 0 << WIDE_FLASH
>> - | 1 << DEV0_CFG1_ECC_DISABLE);
>
> Please fix the coding style. The '|' should be at the end of the line.
Ok
Thanks for the review. Will fix all the comments in next revision.
>
> Thanks,
> Miquèl
More information about the linux-mtd
mailing list