Skip to contentSkip to conversation

spi: dw: round up result of calculation for clock divider

PATCH In review Matthias Seidel 2 participants 6 messages Sep 4, 2016 – Sep 12, 2016 2 messages not in the archive SPI

lore
Share & tools
lore
#0 lore raw

PATCH v2 2/2 spi: dw: round up result of calculation for clock divider

Avoid ending up with a higher frequency than requested

---
Previously failing example:
requested transfer freq: 16MHz
max_freq = 200MHz
calculated clk_div = 12
actual frequency = 200/12 = 16.6666MHz

---
 drivers/spi/spi-dw.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/spi/spi-dw.c +2 -1
index c85e4b3..2fd517d 100644
@@ -300,7 +300,8 @@ static int dw_spi_transfer_one(struct spi_master *master,
 	if (transfer->speed_hz != dws->current_freq) {
 		if (transfer->speed_hz != chip->speed_hz) {
 			/* clk_div doesn't support odd number */
-			chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
+			chip->clk_div = ((dws->max_freq + transfer->speed_hz) /
+				transfer->speed_hz + 1) & 0xfffe;
 			chip->speed_hz = transfer->speed_hz;
 		}
 		dws->current_freq = transfer->speed_hz;
Signature · 8 lines
2.7.4



--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#1 lore raw

drivers/spi/spi-dw.c static int dw_spi_transfer_one(struct spi_master *master, · line 304

Quoted 4 lines · Matthias Seidel
drivers/spi/spi-dw.c +2 -1
 			/* clk_div doesn't support odd number */
-			chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
+			chip->clk_div = ((dws->max_freq + transfer->speed_hz) /
+				transfer->speed_hz + 1) & 0xfffe;

Can we not use DIV_ROUND_UP here if that's what we're trying to do? The above probably needs a comment if not, I'm finding the intent rather confusing looking at the code.

#3 lore raw

PATCH v3 2/2 spi: dw: round up result of calculation for clock divider

In reply to a message not in the archive

Avoid ending up with a higher frequency than requested

---
Previously failing example:
requested transfer freq: 16MHz
max_freq = 200MHz
calculated clk_div = 12
actual frequency = 200/12 = 16.6666MHz

v3: I wasn't aware of this macro, better readability.

---
 drivers/spi/spi-dw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-dw.c +1 -1
index c85e4b3..27960e4 100644
@@ -300,7 +300,7 @@ static int dw_spi_transfer_one(struct spi_master *master,
 	if (transfer->speed_hz != dws->current_freq) {
 		if (transfer->speed_hz != chip->speed_hz) {
 			/* clk_div doesn't support odd number */
-			chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
+			chip->clk_div = (DIV_ROUND_UP(dws->max_freq, transfer->speed_hz) + 1) & 0xfffe;
 			chip->speed_hz = transfer->speed_hz;
 		}
 		dws->current_freq = transfer->speed_hz;
Signature · 6 lines
2.7.4

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#4 lore raw
Quoted 1 line · Matthias Seidel

Avoid ending up with a higher frequency than requested

I'm missing patch 1/2 here?

#6 lore raw

PATCH v4 1/1 spi: dw: round up result of calculation for clock divider

In reply to a message not in the archive

Avoid ending up with a higher frequency than requested

---
v4: Corrected subject, thanks for your work!

Previously failing example:
requested transfer freq: 16MHz
max_freq = 200MHz
calculated clk_div = 12
actual frequency = 200/12 = 16.6666MHz

---
 drivers/spi/spi-dw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-dw.c +1 -1
index c85e4b3..27960e4 100644
@@ -300,7 +300,7 @@ static int dw_spi_transfer_one(struct spi_master *master,
 	if (transfer->speed_hz != dws->current_freq) {
 		if (transfer->speed_hz != chip->speed_hz) {
 			/* clk_div doesn't support odd number */
-			chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
+			chip->clk_div = (DIV_ROUND_UP(dws->max_freq, transfer->speed_hz) + 1) & 0xfffe;
 			chip->speed_hz = transfer->speed_hz;
 		}
 		dws->current_freq = transfer->speed_hz;
Signature · 8 lines
2.7.4



--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
#7 lore raw

Applied "spi: dw: round up result of calculation for clock divider" to the spi tree

In reply to Matthias Seidel

The patch

spi: dw: round up result of calculation for clock divider

has been applied to the spi tree at

git://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi.git

All being well this means that it will be integrated into the linux-next tree (usually sometime in the next 24 hours) and sent to Linus during the next merge window (or sooner if it is a bug fix), however if problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing and review of the tree, please engage with people reporting problems and send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they should be sent as incremental updates against current git, existing patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying to this mail.

Thanks,
Mark

Quoted 1 line

From 3aef463222eaf1ca505629e93a0b64e4040a4472 Mon Sep 17 00:00:00 2001

From: Matthias Seidel <[email protected]>
Date: Wed, 7 Sep 2016 17:45:30 +0200
Subject: [PATCH] spi: dw: round up result of calculation for clock divider

Avoid ending up with a higher frequency than requested

---
 drivers/spi/spi-dw.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/spi/spi-dw.c +1 -1
index c85e4b327a4a..27960e46135d 100644
@@ -300,7 +300,7 @@ static int dw_spi_transfer_one(struct spi_master *master,
 	if (transfer->speed_hz != dws->current_freq) {
 		if (transfer->speed_hz != chip->speed_hz) {
 			/* clk_div doesn't support odd number */
-			chip->clk_div = (dws->max_freq / transfer->speed_hz + 1) & 0xfffe;
+			chip->clk_div = (DIV_ROUND_UP(dws->max_freq, transfer->speed_hz) + 1) & 0xfffe;
 			chip->speed_hz = transfer->speed_hz;
 		}
 		dws->current_freq = transfer->speed_hz;
Signature · 6 lines
2.8.1

--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html