From: Grant Likely <grant.likely@secretlab.ca>
To: Mark Brown <broonie@opensource.wolfsonmicro.com>,
Kukjin Kim <kgene.kim@samsung.com>,
Linus Walleij <linus.walleij@linaro.org>
Cc: spi-devel-general@lists.sourceforge.net,
linux-samsung-soc@vger.kernel.org,
Mark Brown <broonie@opensource.wolfsonmicro.com>
Subject: Re: [PATCH] spi/s3c64xx: Convert to using core message queue
Date: Fri, 09 Mar 2012 14:40:34 -0700 [thread overview]
Message-ID: <20120309214035.0824B3E0880@localhost> (raw)
In-Reply-To: <1329346112-1647-1-git-send-email-broonie@opensource.wolfsonmicro.com>
On Wed, 15 Feb 2012 14:48:32 -0800, Mark Brown <broonie@opensource.wolfsonmicro.com> wrote:
> Convert the s3c64xx driver to using the new message queue factored out of
> the pl022 driver by Linus Walleij, saving us a nice block of code and
> getting the benefits of improvements implemented in the core.
>
> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
Applied, thanks
g.
> ---
>
> Only lightly tested thus far. Linus, it'd be really nice if you could
> add this to your patch queue for this feature until it's merged by
> Grant.
>
> drivers/spi/spi-s3c64xx.c | 125 ++++++++-------------------------------------
> 1 files changed, 22 insertions(+), 103 deletions(-)
>
> diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c
> index b899af66..1174d80 100644
> --- a/drivers/spi/spi-s3c64xx.c
> +++ b/drivers/spi/spi-s3c64xx.c
> @@ -128,8 +128,6 @@
>
> #define msecs_to_loops(t) (loops_per_jiffy / 1000 * HZ * t)
>
> -#define SUSPND (1<<0)
> -#define SPIBUSY (1<<1)
> #define RXBUSY (1<<2)
> #define TXBUSY (1<<3)
>
> @@ -144,10 +142,8 @@ struct s3c64xx_spi_dma_data {
> * @clk: Pointer to the spi clock.
> * @src_clk: Pointer to the clock used to generate SPI signals.
> * @master: Pointer to the SPI Protocol master.
> - * @workqueue: Work queue for the SPI xfer requests.
> * @cntrlr_info: Platform specific data for the controller this driver manages.
> * @tgl_spi: Pointer to the last CS left untoggled by the cs_change hint.
> - * @work: Work
> * @queue: To log SPI xfer requests.
> * @lock: Controller specific lock.
> * @state: Set of FLAGS to indicate status.
> @@ -167,10 +163,8 @@ struct s3c64xx_spi_driver_data {
> struct clk *src_clk;
> struct platform_device *pdev;
> struct spi_master *master;
> - struct workqueue_struct *workqueue;
> struct s3c64xx_spi_info *cntrlr_info;
> struct spi_device *tgl_spi;
> - struct work_struct work;
> struct list_head queue;
> spinlock_t lock;
> unsigned long sfr_start;
> @@ -637,9 +631,10 @@ static void s3c64xx_spi_unmap_mssg(struct s3c64xx_spi_driver_data *sdd,
> }
> }
>
> -static void handle_msg(struct s3c64xx_spi_driver_data *sdd,
> - struct spi_message *msg)
> +static int s3c64xx_spi_transfer_one_message(struct spi_master *master,
> + struct spi_message *msg)
> {
> + struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
> struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
> struct spi_device *spi = msg->spi;
> struct s3c64xx_spi_csinfo *cs = spi->controller_data;
> @@ -771,13 +766,15 @@ out:
>
> if (msg->complete)
> msg->complete(msg->context);
> +
> + spi_finalize_current_message(master);
> +
> + return 0;
> }
>
> -static void s3c64xx_spi_work(struct work_struct *work)
> +static int s3c64xx_spi_prepare_transfer(struct spi_master *spi)
> {
> - struct s3c64xx_spi_driver_data *sdd = container_of(work,
> - struct s3c64xx_spi_driver_data, work);
> - unsigned long flags;
> + struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi);
>
> /* Acquire DMA channels */
> while (!acquire_dma(sdd))
> @@ -785,61 +782,18 @@ static void s3c64xx_spi_work(struct work_struct *work)
>
> pm_runtime_get_sync(&sdd->pdev->dev);
>
> - spin_lock_irqsave(&sdd->lock, flags);
> -
> - while (!list_empty(&sdd->queue)
> - && !(sdd->state & SUSPND)) {
> -
> - struct spi_message *msg;
> -
> - msg = container_of(sdd->queue.next, struct spi_message, queue);
> -
> - list_del_init(&msg->queue);
> -
> - /* Set Xfer busy flag */
> - sdd->state |= SPIBUSY;
> -
> - spin_unlock_irqrestore(&sdd->lock, flags);
> -
> - handle_msg(sdd, msg);
> -
> - spin_lock_irqsave(&sdd->lock, flags);
> -
> - sdd->state &= ~SPIBUSY;
> - }
> + return 0;
> +}
>
> - spin_unlock_irqrestore(&sdd->lock, flags);
> +static int s3c64xx_spi_unprepare_transfer(struct spi_master *spi)
> +{
> + struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(spi);
>
> /* Free DMA channels */
> sdd->ops->release(sdd->rx_dma.ch, &s3c64xx_spi_dma_client);
> sdd->ops->release(sdd->tx_dma.ch, &s3c64xx_spi_dma_client);
>
> pm_runtime_put(&sdd->pdev->dev);
> -}
> -
> -static int s3c64xx_spi_transfer(struct spi_device *spi,
> - struct spi_message *msg)
> -{
> - struct s3c64xx_spi_driver_data *sdd;
> - unsigned long flags;
> -
> - sdd = spi_master_get_devdata(spi->master);
> -
> - spin_lock_irqsave(&sdd->lock, flags);
> -
> - if (sdd->state & SUSPND) {
> - spin_unlock_irqrestore(&sdd->lock, flags);
> - return -ESHUTDOWN;
> - }
> -
> - msg->status = -EINPROGRESS;
> - msg->actual_length = 0;
> -
> - list_add_tail(&msg->queue, &sdd->queue);
> -
> - queue_work(sdd->workqueue, &sdd->work);
> -
> - spin_unlock_irqrestore(&sdd->lock, flags);
>
> return 0;
> }
> @@ -879,13 +833,6 @@ static int s3c64xx_spi_setup(struct spi_device *spi)
> }
> }
>
> - if (sdd->state & SUSPND) {
> - spin_unlock_irqrestore(&sdd->lock, flags);
> - dev_err(&spi->dev,
> - "setup: SPI-%d not active!\n", spi->master->bus_num);
> - return -ESHUTDOWN;
> - }
> -
> spin_unlock_irqrestore(&sdd->lock, flags);
>
> if (spi->bits_per_word != 8
> @@ -1073,7 +1020,9 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
>
> master->bus_num = pdev->id;
> master->setup = s3c64xx_spi_setup;
> - master->transfer = s3c64xx_spi_transfer;
> + master->prepare_transfer_hardware = s3c64xx_spi_prepare_transfer;
> + master->transfer_one_message = s3c64xx_spi_transfer_one_message;
> + master->unprepare_transfer_hardware = s3c64xx_spi_unprepare_transfer;
> master->num_chipselect = sci->num_cs;
> master->dma_alignment = 8;
> /* the spi->mode bits understood by this driver: */
> @@ -1128,27 +1077,18 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
> goto err6;
> }
>
> - sdd->workqueue = create_singlethread_workqueue(
> - dev_name(master->dev.parent));
> - if (sdd->workqueue == NULL) {
> - dev_err(&pdev->dev, "Unable to create workqueue\n");
> - ret = -ENOMEM;
> - goto err7;
> - }
> -
> /* Setup Deufult Mode */
> s3c64xx_spi_hwinit(sdd, pdev->id);
>
> spin_lock_init(&sdd->lock);
> init_completion(&sdd->xfer_completion);
> - INIT_WORK(&sdd->work, s3c64xx_spi_work);
> INIT_LIST_HEAD(&sdd->queue);
>
> ret = request_irq(irq, s3c64xx_spi_irq, 0, "spi-s3c64xx", sdd);
> if (ret != 0) {
> dev_err(&pdev->dev, "Failed to request IRQ %d: %d\n",
> irq, ret);
> - goto err8;
> + goto err7;
> }
>
> writel(S3C64XX_SPI_INT_RX_OVERRUN_EN | S3C64XX_SPI_INT_RX_UNDERRUN_EN |
> @@ -1158,7 +1098,7 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
> if (spi_register_master(master)) {
> dev_err(&pdev->dev, "cannot register SPI master\n");
> ret = -EBUSY;
> - goto err9;
> + goto err8;
> }
>
> dev_dbg(&pdev->dev, "Samsung SoC SPI Driver loaded for Bus SPI-%d "
> @@ -1172,10 +1112,8 @@ static int __init s3c64xx_spi_probe(struct platform_device *pdev)
>
> return 0;
>
> -err9:
> - free_irq(irq, sdd);
> err8:
> - destroy_workqueue(sdd->workqueue);
> + free_irq(irq, sdd);
> err7:
> clk_disable(sdd->src_clk);
> err6:
> @@ -1201,25 +1139,15 @@ static int s3c64xx_spi_remove(struct platform_device *pdev)
> struct spi_master *master = spi_master_get(platform_get_drvdata(pdev));
> struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
> struct resource *mem_res;
> - unsigned long flags;
>
> pm_runtime_disable(&pdev->dev);
>
> - spin_lock_irqsave(&sdd->lock, flags);
> - sdd->state |= SUSPND;
> - spin_unlock_irqrestore(&sdd->lock, flags);
> -
> - while (sdd->state & SPIBUSY)
> - msleep(10);
> -
> spi_unregister_master(master);
>
> writel(0, sdd->regs + S3C64XX_SPI_INT_EN);
>
> free_irq(platform_get_irq(pdev, 0), sdd);
>
> - destroy_workqueue(sdd->workqueue);
> -
> clk_disable(sdd->src_clk);
> clk_put(sdd->src_clk);
>
> @@ -1243,14 +1171,8 @@ static int s3c64xx_spi_suspend(struct device *dev)
> {
> struct spi_master *master = spi_master_get(dev_get_drvdata(dev));
> struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
> - unsigned long flags;
> -
> - spin_lock_irqsave(&sdd->lock, flags);
> - sdd->state |= SUSPND;
> - spin_unlock_irqrestore(&sdd->lock, flags);
>
> - while (sdd->state & SPIBUSY)
> - msleep(10);
> + spi_master_suspend(master);
>
> /* Disable the clock */
> clk_disable(sdd->src_clk);
> @@ -1267,7 +1189,6 @@ static int s3c64xx_spi_resume(struct device *dev)
> struct spi_master *master = spi_master_get(dev_get_drvdata(dev));
> struct s3c64xx_spi_driver_data *sdd = spi_master_get_devdata(master);
> struct s3c64xx_spi_info *sci = sdd->cntrlr_info;
> - unsigned long flags;
>
> sci->cfg_gpio(pdev);
>
> @@ -1277,9 +1198,7 @@ static int s3c64xx_spi_resume(struct device *dev)
>
> s3c64xx_spi_hwinit(sdd, pdev->id);
>
> - spin_lock_irqsave(&sdd->lock, flags);
> - sdd->state &= ~SUSPND;
> - spin_unlock_irqrestore(&sdd->lock, flags);
> + spi_master_resume(master);
>
> return 0;
> }
> --
> 1.7.9.rc1
>
--
Grant Likely, B.Sc, P.Eng.
Secret Lab Technologies,Ltd.
prev parent reply other threads:[~2012-03-09 21:40 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-15 22:48 [PATCH] spi/s3c64xx: Convert to using core message queue Mark Brown
2012-02-15 22:51 ` Linus Walleij
2012-02-22 9:07 ` Linus Walleij
2012-03-09 21:40 ` Grant Likely [this message]
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=20120309214035.0824B3E0880@localhost \
--to=grant.likely@secretlab.ca \
--cc=broonie@opensource.wolfsonmicro.com \
--cc=kgene.kim@samsung.com \
--cc=linus.walleij@linaro.org \
--cc=linux-samsung-soc@vger.kernel.org \
--cc=spi-devel-general@lists.sourceforge.net \
/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: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).