Patch "memory/atmel-ebi: Fix ns <-> cycles conversions" has been added to the 4.10-stable tree
This is a note to let you know that I've just added the patch titled
memory/atmel-ebi: Fix ns <-> cycles conversions
to the 4.10-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
memory-atmel-ebi-fix-ns-cycles-conversions.patch
and it can be found in the queue-4.10 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
ee194289502a6901cc77dc9a893bf2afd351ac5eMon Sep 17 00:00:00 2001
From: Boris Brezillon <[email protected]>
Date: Mon, 28 Nov 2016 16:17:56 +0100
Subject: memory/atmel-ebi: Fix ns <-> cycles conversions
From: Boris Brezillon <[email protected]>
commit ee194289502a6901cc77dc9a893bf2afd351ac5e upstream.
at91sam9_ebi_get_config() is incorrectly converting timings in clock cycles into timings in nanoseconds by multiplying the cycle values by the clk rate instead of the clk period.
at91sam9_ebi_xslate_config() has the same problem for the tdf_ns -> tdf_cycles conversion.
--- drivers/memory/atmel-ebi.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
drivers/memory/atmel-ebi.c +14 -13
@@ -93,7 +93,7 @@ static void at91sam9_ebi_get_config(stru struct at91_ebi_dev_config *conf) {struct at91sam9_smc_generic_fields *fields = &ebid->ebi->sam9; -unsigned int clk_rate =clk_get_rate (ebid->ebi->clk); +unsigned int clk_period =NSEC_PER_SEC /clk_get_rate (ebid->ebi->clk);struct at91sam9_ebi_dev_config *config = &conf->sam9;struct at91sam9_smc_timings *timings = &config->timings;unsigned int val;
@@ -102,43 +102,43 @@ static void at91sam9_ebi_get_config(stru config->mode = val & ~AT91_SMC_TDF ; val = (val &AT91_SMC_TDF ) >>16 ; - timings->tdf_ns = clk_rate * val; + timings->tdf_ns = clk_period * val;regmap_fields_read (fields->setup, conf->cs, &val); timings->ncs_rd_setup_ns = (val >>24 ) &0x1f ; timings->ncs_rd_setup_ns += ((val >>29 ) &0x1 ) *128 ; - timings->ncs_rd_setup_ns *= clk_rate; + timings->ncs_rd_setup_ns *= clk_period; timings->nrd_setup_ns = (val >>16 ) &0x1f ; timings->nrd_setup_ns += ((val >>21 ) &0x1 ) *128 ; - timings->nrd_setup_ns *= clk_rate; + timings->nrd_setup_ns *= clk_period; timings->ncs_wr_setup_ns = (val >>8 ) &0x1f ; timings->ncs_wr_setup_ns += ((val >>13 ) &0x1 ) *128 ; - timings->ncs_wr_setup_ns *= clk_rate; + timings->ncs_wr_setup_ns *= clk_period; timings->nwe_setup_ns = val &0x1f ; timings->nwe_setup_ns += ((val >>5 ) &0x1 ) *128 ; - timings->nwe_setup_ns *= clk_rate; + timings->nwe_setup_ns *= clk_period;regmap_fields_read (fields->pulse, conf->cs, &val); timings->ncs_rd_pulse_ns = (val >>24 ) &0x3f ; timings->ncs_rd_pulse_ns += ((val >>30 ) &0x1 ) *256 ; - timings->ncs_rd_pulse_ns *= clk_rate; + timings->ncs_rd_pulse_ns *= clk_period; timings->nrd_pulse_ns = (val >>16 ) &0x3f ; timings->nrd_pulse_ns += ((val >>22 ) &0x1 ) *256 ; - timings->nrd_pulse_ns *= clk_rate; + timings->nrd_pulse_ns *= clk_period; timings->ncs_wr_pulse_ns = (val >>8 ) &0x3f ; timings->ncs_wr_pulse_ns += ((val >>14 ) &0x1 ) *256 ; - timings->ncs_wr_pulse_ns *= clk_rate; + timings->ncs_wr_pulse_ns *= clk_period; timings->nwe_pulse_ns = val &0x3f ; timings->nwe_pulse_ns += ((val >>6 ) &0x1 ) *256 ; - timings->nwe_pulse_ns *= clk_rate; + timings->nwe_pulse_ns *= clk_period;regmap_fields_read (fields->cycle, conf->cs, &val); timings->nrd_cycle_ns = (val >>16 ) &0x7f ; timings->nrd_cycle_ns += ((val >>23 ) &0x3 ) *256 ; - timings->nrd_cycle_ns *= clk_rate; + timings->nrd_cycle_ns *= clk_period; timings->nwe_cycle_ns = val &0x7f ; timings->nwe_cycle_ns += ((val >>7 ) &0x3 ) *256 ; - timings->nwe_cycle_ns *= clk_rate; + timings->nwe_cycle_ns *= clk_period; } static int at91_xlate_timing(struct device_node *np, const char *prop,
@@ -334,6 +334,7 @@ static int at91sam9_ebi_apply_config(str struct at91_ebi_dev_config *conf) {unsigned int clk_rate =clk_get_rate (ebid->ebi->clk); +unsigned int clk_period =NSEC_PER_SEC / clk_rate;struct at91sam9_ebi_dev_config *config = &conf->sam9;struct at91sam9_smc_timings *timings = &config->timings;struct at91sam9_smc_generic_fields *fields = &ebid->ebi->sam9;
@@ -376,7 +377,7 @@ static int at91sam9_ebi_apply_config(str val |=AT91SAM9_SMC_NWECYCLE (coded_val);regmap_fields_write (fields->cycle, conf->cs, val); - val =DIV_ROUND_UP (timings->tdf_ns, clk_rate); + val =DIV_ROUND_UP (timings->tdf_ns, clk_period);if (val >AT91_SMC_TDF_MAX ) val =AT91_SMC_TDF_MAX ; regmap_fields_write(fields->mode, conf->cs,
Patches currently in stable-queue which might be from [email protected] are
queue-4.10/memory-atmel-ebi-fix-ns-cycles-conversions.patch