Unverified Commit e570f787 authored by Tudor Ambarus's avatar Tudor Ambarus
Browse files

mtd: spi-nor: Allow post_sfdp hook to return errors

Multi die flashes like s25hl02gt need to determine the page_size at
run-time by querying a configuration register for each die. Since the
number of dice is determined in an optional SFDP table, SCCR MC, the
page size configuration must be done in the post_sfdp hook. Allow
post_sfdp to return errors, as reading the configuration register might
return errors.

Link: https://lore.kernel.org/r/924ab710f128448ec62537cfbb377336e390043c.1680849425.git.Takahiro.Kuwano@infineon.com


Signed-off-by: default avatarTudor Ambarus <tudor.ambarus@linaro.org>
parent 120c94a6
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -426,7 +426,7 @@ struct spi_nor_fixups {
	int (*post_bfpt)(struct spi_nor *nor,
			 const struct sfdp_parameter_header *bfpt_header,
			 const struct sfdp_bfpt *bfpt);
	void (*post_sfdp)(struct spi_nor *nor);
	int (*post_sfdp)(struct spi_nor *nor);
	void (*late_init)(struct spi_nor *nor);
};

+3 −1
Original line number Diff line number Diff line
@@ -131,7 +131,7 @@ static void mt35xu512aba_default_init(struct spi_nor *nor)
	nor->params->octal_dtr_enable = micron_st_nor_octal_dtr_enable;
}

static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
static int mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
{
	/* Set the Fast Read settings. */
	nor->params->hwcaps.mask |= SNOR_HWCAPS_READ_8_8_8_DTR;
@@ -149,6 +149,8 @@ static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor)
	 * disable it.
	 */
	nor->params->quad_enable = NULL;

	return 0;
}

static const struct spi_nor_fixups mt35xu512aba_fixups = {
+12 −5
Original line number Diff line number Diff line
@@ -1260,14 +1260,21 @@ static int spi_nor_parse_sccr(struct spi_nor *nor,
 * Used to tweak various flash parameters when information provided by the SFDP
 * tables are wrong.
 */
static void spi_nor_post_sfdp_fixups(struct spi_nor *nor)
static int spi_nor_post_sfdp_fixups(struct spi_nor *nor)
{
	int ret;

	if (nor->manufacturer && nor->manufacturer->fixups &&
	    nor->manufacturer->fixups->post_sfdp)
		nor->manufacturer->fixups->post_sfdp(nor);
	    nor->manufacturer->fixups->post_sfdp) {
		ret = nor->manufacturer->fixups->post_sfdp(nor);
		if (ret)
			return ret;
	}

	if (nor->info->fixups && nor->info->fixups->post_sfdp)
		nor->info->fixups->post_sfdp(nor);
		return nor->info->fixups->post_sfdp(nor);

	return 0;
}

/**
@@ -1477,7 +1484,7 @@ int spi_nor_parse_sfdp(struct spi_nor *nor)
		}
	}

	spi_nor_post_sfdp_fixups(nor);
	err = spi_nor_post_sfdp_fixups(nor);
exit:
	kfree(param_headers);
	return err;
+9 −3
Original line number Diff line number Diff line
@@ -370,7 +370,7 @@ s25fs256t_post_bfpt_fixup(struct spi_nor *nor,
	return cypress_nor_get_page_size(nor);
}

static void s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
static int s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
{
	struct spi_nor_flash_parameter *params = nor->params;

@@ -379,6 +379,8 @@ static void s25fs256t_post_sfdp_fixup(struct spi_nor *nor)
	spi_nor_set_pp_settings(&params->page_programs[SNOR_CMD_PP_1_1_4],
				SPINOR_OP_PP_1_1_4_4B,
				SNOR_PROTO_1_1_4);

	return 0;
}

static void s25fs256t_late_init(struct spi_nor *nor)
@@ -409,7 +411,7 @@ s25hx_t_post_bfpt_fixup(struct spi_nor *nor,
	return cypress_nor_get_page_size(nor);
}

static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
static int s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
{
	struct spi_nor_erase_type *erase_type =
					nor->params->erase_map.erase_type;
@@ -431,6 +433,8 @@ static void s25hx_t_post_sfdp_fixup(struct spi_nor *nor)
			break;
		}
	}

	return 0;
}

static void s25hx_t_late_init(struct spi_nor *nor)
@@ -463,7 +467,7 @@ static int cypress_nor_octal_dtr_enable(struct spi_nor *nor, bool enable)
			cypress_nor_octal_dtr_dis(nor);
}

static void s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
static int s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
{
	/*
	 * On older versions of the flash the xSPI Profile 1.0 table has the
@@ -489,6 +493,8 @@ static void s28hx_t_post_sfdp_fixup(struct spi_nor *nor)
	 * actual value for that is 4.
	 */
	nor->params->rdsr_addr_nbytes = 4;

	return 0;
}

static int s28hx_t_post_bfpt_fixup(struct spi_nor *nor,