From: kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org To: Mark Brown <broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>, Eric Anholt <eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org>, Stefan Wahren <stefan.wahren-eS4NqCHxEME@public.gmane.org>, Hubert Denkmair <h.denkmair-4pT7WzY1KUiELgA04lAiVw@public.gmane.org>, linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org Subject: [PATCH 5/9] spi: bcm2835aux: make the polling duration limits configurable Date: Sun, 24 Feb 2019 12:54:36 +0000 [thread overview] Message-ID: <20190224125440.16117-6-kernel@martin.sperl.org> (raw) In-Reply-To: <20190224125440.16117-1-kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org> From: Martin Sperl <kernel@martin.sperl.org> Under some circumstances the default 30 us polling limit is not optimal and may lead to long delays because we are waiting on the interrupt handler resulting in poor spi bus utilization. With this patch we have the possibility to influence this policy by making this limit configurable via a module parameters Signed-off-by: Martin Sperl <kernel@martin.sperl.org> --- Note that this patch relies on the effective_speed_hz patch for the driver to be applied! --- drivers/spi/spi-bcm2835aux.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c index 0a5f21eb3b99..af668cb6b38b 100644 --- a/drivers/spi/spi-bcm2835aux.c +++ b/drivers/spi/spi-bcm2835aux.c @@ -37,6 +37,12 @@ #include <linux/spi/spi.h> #include <linux/spinlock.h> +/* define polling limits */ +unsigned int polling_limit_us = 30; +module_param(polling_limit_us, uint, 0664); +MODULE_PARM_DESC(polling_limit_us, + "time in us to run a transfer in polling mode\n"); + /* * spi register defines * @@ -89,10 +95,6 @@ #define BCM2835_AUX_SPI_STAT_BUSY 0x00000040 #define BCM2835_AUX_SPI_STAT_BITCOUNT 0x0000003F -/* timeout values */ -#define BCM2835_AUX_SPI_POLLING_LIMIT_US 30 -#define BCM2835_AUX_SPI_POLLING_JIFFIES 2 - struct bcm2835aux_spi { void __iomem *regs; struct clk *clk; @@ -335,8 +337,8 @@ static int bcm2835aux_spi_transfer_one_poll(struct spi_master *master, bcm2835aux_wr(bs, BCM2835_AUX_SPI_CNTL1, bs->cntl[1]); bcm2835aux_wr(bs, BCM2835_AUX_SPI_CNTL0, bs->cntl[0]); - /* set the timeout */ - timeout = jiffies + BCM2835_AUX_SPI_POLLING_JIFFIES; + /* set the timeout to at least 2 jiffies */ + timeout = jiffies + 2 + HZ * polling_limit_us / 1000000; /* loop until finished the transfer */ while (bs->rx_len) { @@ -381,7 +383,7 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, struct spi_transfer *tfr) { struct bcm2835aux_spi *bs = spi_master_get_devdata(master); - unsigned long spi_hz, clk_hz, speed; + unsigned long spi_hz, clk_hz, speed, hz_per_byte, byte_limit; /* calculate the registers to handle * @@ -425,14 +427,15 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, * of Hz per byte per polling limit. E.g., we can transfer 1 byte in * 30 µs per 300,000 Hz of bus clock. */ -#define HZ_PER_BYTE ((9 * 1000000) / BCM2835_AUX_SPI_POLLING_LIMIT_US) + hz_per_byte = polling_limit_us ? (9 * 1000000) / polling_limit_us : 0; + byte_limit = hz_per_byte ? tfr->effective_speed_hz / hz_per_byte : 1; + /* run in polling mode for short transfers */ - if (tfr->len < tfr->effective_speed_hz / HZ_PER_BYTE) + if (tfr->len < byte_limit) return bcm2835aux_spi_transfer_one_poll(master, spi, tfr); /* run in interrupt mode for all others */ return bcm2835aux_spi_transfer_one_irq(master, spi, tfr); -#undef HZ_PER_BYTE } static int bcm2835aux_spi_prepare_message(struct spi_master *master, -- 2.11.0 _______________________________________________ linux-rpi-kernel mailing list linux-rpi-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-rpi-kernel
WARNING: multiple messages have this Message-ID (diff)
From: kernel@martin.sperl.org To: Mark Brown <broonie@kernel.org>, Eric Anholt <eric@anholt.net>, Stefan Wahren <stefan.wahren@i2se.com>, Hubert Denkmair <h.denkmair@intence.de>, linux-spi@vger.kernel.org, linux-rpi-kernel@lists.infradead.org, linux-arm-kernel@lists.infradead.org Cc: Martin Sperl <kernel@martin.sperl.org> Subject: [PATCH 5/9] spi: bcm2835aux: make the polling duration limits configurable Date: Sun, 24 Feb 2019 12:54:36 +0000 [thread overview] Message-ID: <20190224125440.16117-6-kernel@martin.sperl.org> (raw) In-Reply-To: <20190224125440.16117-1-kernel@martin.sperl.org> From: Martin Sperl <kernel@martin.sperl.org> Under some circumstances the default 30 us polling limit is not optimal and may lead to long delays because we are waiting on the interrupt handler resulting in poor spi bus utilization. With this patch we have the possibility to influence this policy by making this limit configurable via a module parameters Signed-off-by: Martin Sperl <kernel@martin.sperl.org> --- Note that this patch relies on the effective_speed_hz patch for the driver to be applied! --- drivers/spi/spi-bcm2835aux.c | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/drivers/spi/spi-bcm2835aux.c b/drivers/spi/spi-bcm2835aux.c index 0a5f21eb3b99..af668cb6b38b 100644 --- a/drivers/spi/spi-bcm2835aux.c +++ b/drivers/spi/spi-bcm2835aux.c @@ -37,6 +37,12 @@ #include <linux/spi/spi.h> #include <linux/spinlock.h> +/* define polling limits */ +unsigned int polling_limit_us = 30; +module_param(polling_limit_us, uint, 0664); +MODULE_PARM_DESC(polling_limit_us, + "time in us to run a transfer in polling mode\n"); + /* * spi register defines * @@ -89,10 +95,6 @@ #define BCM2835_AUX_SPI_STAT_BUSY 0x00000040 #define BCM2835_AUX_SPI_STAT_BITCOUNT 0x0000003F -/* timeout values */ -#define BCM2835_AUX_SPI_POLLING_LIMIT_US 30 -#define BCM2835_AUX_SPI_POLLING_JIFFIES 2 - struct bcm2835aux_spi { void __iomem *regs; struct clk *clk; @@ -335,8 +337,8 @@ static int bcm2835aux_spi_transfer_one_poll(struct spi_master *master, bcm2835aux_wr(bs, BCM2835_AUX_SPI_CNTL1, bs->cntl[1]); bcm2835aux_wr(bs, BCM2835_AUX_SPI_CNTL0, bs->cntl[0]); - /* set the timeout */ - timeout = jiffies + BCM2835_AUX_SPI_POLLING_JIFFIES; + /* set the timeout to at least 2 jiffies */ + timeout = jiffies + 2 + HZ * polling_limit_us / 1000000; /* loop until finished the transfer */ while (bs->rx_len) { @@ -381,7 +383,7 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, struct spi_transfer *tfr) { struct bcm2835aux_spi *bs = spi_master_get_devdata(master); - unsigned long spi_hz, clk_hz, speed; + unsigned long spi_hz, clk_hz, speed, hz_per_byte, byte_limit; /* calculate the registers to handle * @@ -425,14 +427,15 @@ static int bcm2835aux_spi_transfer_one(struct spi_master *master, * of Hz per byte per polling limit. E.g., we can transfer 1 byte in * 30 µs per 300,000 Hz of bus clock. */ -#define HZ_PER_BYTE ((9 * 1000000) / BCM2835_AUX_SPI_POLLING_LIMIT_US) + hz_per_byte = polling_limit_us ? (9 * 1000000) / polling_limit_us : 0; + byte_limit = hz_per_byte ? tfr->effective_speed_hz / hz_per_byte : 1; + /* run in polling mode for short transfers */ - if (tfr->len < tfr->effective_speed_hz / HZ_PER_BYTE) + if (tfr->len < byte_limit) return bcm2835aux_spi_transfer_one_poll(master, spi, tfr); /* run in interrupt mode for all others */ return bcm2835aux_spi_transfer_one_irq(master, spi, tfr); -#undef HZ_PER_BYTE } static int bcm2835aux_spi_prepare_message(struct spi_master *master, -- 2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2019-02-24 12:54 UTC|newest] Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-02-24 12:54 [PATCH 0/9] spi: bcm2835aux: bug fixes and improvements kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` [PATCH 1/9] spi: bcm2835aux: fix driver to not allow 65535 (=-1) cs-gpios kernel 2019-02-24 12:54 ` kernel [not found] ` <20190224125440.16117-1-kernel-TqfNSX0MhmxHKSADF0wUEw@public.gmane.org> 2019-02-24 12:54 ` [PATCH 2/9] spi: bcm2835aux: warn in dmesg that native cs is not really supported kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` [PATCH 3/9] spi: bcm2835aux: setup gpio-cs to output and correct level during setup kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` [PATCH 4/9] spi: bcm2835aux: add driver specific stats to debugfs kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` kernel-TqfNSX0MhmxHKSADF0wUEw [this message] 2019-02-24 12:54 ` [PATCH 5/9] spi: bcm2835aux: make the polling duration limits configurable kernel 2019-02-24 12:54 ` [PATCH 7/9] spi: bcm2835aux: remove dangerous uncontrolled read of fifo kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` [PATCH 8/9] spi: bcm2835aux: use BCM2835_AUX_SPI_STAT_RX_LVL kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 12:54 ` [PATCH 9/9] spi: bcm2835aux: remove dead code kernel-TqfNSX0MhmxHKSADF0wUEw 2019-02-24 12:54 ` kernel 2019-02-24 19:22 ` [PATCH 0/9] spi: bcm2835aux: bug fixes and improvements Stefan Wahren 2019-02-24 19:22 ` Stefan Wahren 2019-02-24 20:11 ` kernel 2019-02-24 20:11 ` kernel 2019-02-24 12:54 ` [PATCH 6/9] spi: bcm2835aux: unifying code between polling and interrupt driven code kernel 2019-02-24 12:54 ` kernel
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20190224125440.16117-6-kernel@martin.sperl.org \ --to=kernel-tqfnsx0mhmxhksadf0wuew@public.gmane.org \ --cc=broonie-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \ --cc=eric-WhKQ6XTQaPysTnJN9+BGXg@public.gmane.org \ --cc=h.denkmair-4pT7WzY1KUiELgA04lAiVw@public.gmane.org \ --cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \ --cc=linux-rpi-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \ --cc=linux-spi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \ --cc=stefan.wahren-eS4NqCHxEME@public.gmane.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.