Skip to content

Commit

Permalink
memory: ti-aemif: Create aemif_check_cs_timings()
Browse files Browse the repository at this point in the history
aemif_calc_rate() checks the validity of a new computed timing against a
'max' value given as input. This isn't convenient if we want to check
the CS timing configuration somewhere else in the code.

Wrap the verification of all the chip select's timing configuration into a
single function to ease its exportation in upcoming patches.
Remove the validity check from aemif_calc_rate(). Also remove the no
longer used 'max' input and change the return type to u32.
Remove the check of the aemif_calc_rate()'s return value during
device-tree parsing as aemif_calc_rate() can't fail anymore.

Signed-off-by: Bastien Curutchet <bastien.curutchet@bootlin.com>
Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
Link: https://lore.kernel.org/r/20241204094319.1050826-5-bastien.curutchet@bootlin.com
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
  • Loading branch information
Bastien Curutchet authored and Krzysztof Kozlowski committed Dec 9, 2024
1 parent 30b4da6 commit 2c7b585
Showing 1 changed file with 51 additions and 60 deletions.
111 changes: 51 additions & 60 deletions drivers/memory/ti-aemif.c
Original file line number Diff line number Diff line change
@@ -133,18 +133,48 @@ struct aemif_device {
struct aemif_cs_data cs_data[NUM_CS];
};

/**
* aemif_check_cs_timings() - Check the validity of a CS timing configuration.
* @timings: timings configuration
*
* @return: 0 if the timing configuration is valid, negative error number otherwise.
*/
static int aemif_check_cs_timings(struct aemif_cs_timings *timings)
{
if (timings->ta > TA_MAX)
return -EINVAL;

if (timings->rhold > RHOLD_MAX)
return -EINVAL;

if (timings->rstrobe > RSTROBE_MAX)
return -EINVAL;

if (timings->rsetup > RSETUP_MAX)
return -EINVAL;

if (timings->whold > WHOLD_MAX)
return -EINVAL;

if (timings->wstrobe > WSTROBE_MAX)
return -EINVAL;

if (timings->wsetup > WSETUP_MAX)
return -EINVAL;

return 0;
}

/**
* aemif_calc_rate - calculate timing data.
* @pdev: platform device to calculate for
* @wanted: The cycle time needed in nanoseconds.
* @clk: The input clock rate in kHz.
* @max: The maximum divider value that can be programmed.
*
* On success, returns the calculated timing value minus 1 for easy
* programming into AEMIF timing registers, else negative errno.
* @return: the calculated timing value minus 1 for easy
* programming into AEMIF timing registers.
*/
static int aemif_calc_rate(struct platform_device *pdev, int wanted,
unsigned long clk, int max)
static u32 aemif_calc_rate(struct platform_device *pdev, int wanted, unsigned long clk)
{
int result;

@@ -157,10 +187,6 @@ static int aemif_calc_rate(struct platform_device *pdev, int wanted,
if (result < 0)
result = 0;

/* ... But configuring tighter timings is not an option. */
else if (result > max)
result = -EINVAL;

return result;
}

@@ -250,7 +276,6 @@ static int of_aemif_parse_abus_config(struct platform_device *pdev,
struct aemif_device *aemif = platform_get_drvdata(pdev);
unsigned long clk_rate = aemif->clk_rate;
struct aemif_cs_data *data;
int ret;
u32 cs;
u32 val;

@@ -276,68 +301,34 @@ static int of_aemif_parse_abus_config(struct platform_device *pdev,
aemif_get_hw_params(pdev, aemif->num_cs++);

/* override the values from device node */
if (!of_property_read_u32(np, "ti,cs-min-turnaround-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, TA_MAX);
if (ret < 0)
return ret;

data->timings.ta = ret;
}
if (!of_property_read_u32(np, "ti,cs-min-turnaround-ns", &val))
data->timings.ta = aemif_calc_rate(pdev, val, clk_rate);

if (!of_property_read_u32(np, "ti,cs-read-hold-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, RHOLD_MAX);
if (ret < 0)
return ret;

data->timings.rhold = ret;
}
if (!of_property_read_u32(np, "ti,cs-read-hold-ns", &val))
data->timings.rhold = aemif_calc_rate(pdev, val, clk_rate);

if (!of_property_read_u32(np, "ti,cs-read-strobe-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, RSTROBE_MAX);
if (ret < 0)
return ret;
if (!of_property_read_u32(np, "ti,cs-read-strobe-ns", &val))
data->timings.rstrobe = aemif_calc_rate(pdev, val, clk_rate);

data->timings.rstrobe = ret;
}
if (!of_property_read_u32(np, "ti,cs-read-setup-ns", &val))
data->timings.rsetup = aemif_calc_rate(pdev, val, clk_rate);

if (!of_property_read_u32(np, "ti,cs-read-setup-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, RSETUP_MAX);
if (ret < 0)
return ret;
if (!of_property_read_u32(np, "ti,cs-write-hold-ns", &val))
data->timings.whold = aemif_calc_rate(pdev, val, clk_rate);

data->timings.rsetup = ret;
}
if (!of_property_read_u32(np, "ti,cs-write-strobe-ns", &val))
data->timings.wstrobe = aemif_calc_rate(pdev, val, clk_rate);

if (!of_property_read_u32(np, "ti,cs-write-hold-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, WHOLD_MAX);
if (ret < 0)
return ret;

data->timings.whold = ret;
}

if (!of_property_read_u32(np, "ti,cs-write-strobe-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, WSTROBE_MAX);
if (ret < 0)
return ret;

data->timings.wstrobe = ret;
}

if (!of_property_read_u32(np, "ti,cs-write-setup-ns", &val)) {
ret = aemif_calc_rate(pdev, val, clk_rate, WSETUP_MAX);
if (ret < 0)
return ret;

data->timings.wsetup = ret;
}
if (!of_property_read_u32(np, "ti,cs-write-setup-ns", &val))
data->timings.wsetup = aemif_calc_rate(pdev, val, clk_rate);

if (!of_property_read_u32(np, "ti,cs-bus-width", &val))
if (val == 16)
data->asize = 1;
data->enable_ew = of_property_read_bool(np, "ti,cs-extended-wait-mode");
data->enable_ss = of_property_read_bool(np, "ti,cs-select-strobe-mode");
return 0;

return aemif_check_cs_timings(&data->timings);
}

static const struct of_device_id aemif_of_match[] = {

0 comments on commit 2c7b585

Please sign in to comment.