linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCHv3 0/6] dw_dmac: few cleanups to the driver
@ 2012-10-18 14:34 Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 1/6] dmaengine: dw_dmac: remove CLK dependency Andy Shevchenko
                   ` (7 more replies)
  0 siblings, 8 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Andy Shevchenko

There are few cleanups to the driver which partialy acked and reviewed.

Since v2:
 - add one more clean up (patch 6/6)
 - make a separate patch to WARN a user in dwc_handle_error (suggested by
   Felipe Balbi)
 - add a description to patch 4/6

Andy Shevchenko (4):
  dw_dmac: change dev_printk() to corresponding macros
  dw_dmac: don't call platform_get_drvdata twice
  dw_dmac: change dev_crit to dev_WARN in dwc_handle_error
  dw_dmac: introduce to_dw_desc() macro

Heikki Krogerus (2):
  dmaengine: dw_dmac: remove CLK dependency
  dmaengine: dw_dmac: amend description and indentation

 drivers/dma/Kconfig        |    1 -
 drivers/dma/dw_dmac.c      |   33 ++++++++++++++-------------------
 drivers/dma/dw_dmac_regs.h |    2 ++
 3 files changed, 16 insertions(+), 20 deletions(-)

-- 
1.7.10.4


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCHv3 1/6] dmaengine: dw_dmac: remove CLK dependency
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 2/6] dmaengine: dw_dmac: amend description and indentation Andy Shevchenko
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Heikki Krogerus, Andy Shevchenko

From: Heikki Krogerus <heikki.krogerus@linux.intel.com>

This driver could be used on different platforms. Thus, the HAVE_CLK dependency
is dropped away.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Felipe Balbi <balbi@ti.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/dma/Kconfig |    1 -
 1 file changed, 1 deletion(-)

diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 677cd6e..df32537 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -83,7 +83,6 @@ config INTEL_IOP_ADMA
 
 config DW_DMAC
 	tristate "Synopsys DesignWare AHB DMA support"
-	depends on HAVE_CLK
 	select DMA_ENGINE
 	default y if CPU_AT32AP7000
 	help
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv3 2/6] dmaengine: dw_dmac: amend description and indentation
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 1/6] dmaengine: dw_dmac: remove CLK dependency Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 3/6] dw_dmac: change dev_printk() to corresponding macros Andy Shevchenko
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Heikki Krogerus, Andy Shevchenko

From: Heikki Krogerus <heikki.krogerus@linux.intel.com>

The driver will be used as a core part for various implementations of the
DesignWare DMA device. The patch adjusts description on the top and corrects
paragraph indentation in few places across the code.

Signed-off-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
---
 drivers/dma/dw_dmac.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index c4b0eb3..c27c125 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1,6 +1,5 @@
 /*
- * Driver for the Synopsys DesignWare DMA Controller (aka DMACA on
- * AVR32 systems.)
+ * Core driver for the Synopsys DesignWare DMA Controller
  *
  * Copyright (C) 2007-2008 Atmel Corporation
  * Copyright (C) 2010-2011 ST Microelectronics
@@ -9,6 +8,7 @@
  * it under the terms of the GNU General Public License version 2 as
  * published by the Free Software Foundation.
  */
+
 #include <linux/bitops.h>
 #include <linux/clk.h>
 #include <linux/delay.h>
@@ -222,7 +222,6 @@ static inline void dwc_dump_chan_regs(struct dw_dma_chan *dwc)
 		channel_readl(dwc, CTL_LO));
 }
 
-
 static inline void dwc_chan_disable(struct dw_dma *dw, struct dw_dma_chan *dwc)
 {
 	channel_clear_bit(dw, CH_EN, dwc->mask);
@@ -1679,6 +1678,7 @@ static int dw_resume_noirq(struct device *dev)
 
 	clk_prepare_enable(dw->clk);
 	dma_writel(dw, CFG, DW_CFG_DMA_EN);
+
 	return 0;
 }
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv3 3/6] dw_dmac: change dev_printk() to corresponding macros
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 1/6] dmaengine: dw_dmac: remove CLK dependency Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 2/6] dmaengine: dw_dmac: amend description and indentation Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 4/6] dw_dmac: don't call platform_get_drvdata twice Andy Shevchenko
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Andy Shevchenko

Change printk(KERN_INFO ..., dev_name(...), ...) to dev_info() as well.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw_dmac.c |   15 ++++++---------
 1 file changed, 6 insertions(+), 9 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index c27c125..d4ddf48 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -456,9 +456,8 @@ static void dwc_scan_descriptors(struct dw_dma *dw, struct dw_dma_chan *dwc)
 
 static inline void dwc_dump_lli(struct dw_dma_chan *dwc, struct dw_lli *lli)
 {
-	dev_printk(KERN_CRIT, chan2dev(&dwc->chan),
-			"  desc: s0x%x d0x%x l0x%x c0x%x:%x\n",
-			lli->sar, lli->dar, lli->llp, lli->ctlhi, lli->ctllo);
+	dev_crit(chan2dev(&dwc->chan), "  desc: s0x%x d0x%x l0x%x c0x%x:%x\n",
+		 lli->sar, lli->dar, lli->llp, lli->ctlhi, lli->ctllo);
 }
 
 static void dwc_handle_error(struct dw_dma *dw, struct dw_dma_chan *dwc)
@@ -492,10 +491,8 @@ static void dwc_handle_error(struct dw_dma *dw, struct dw_dma_chan *dwc)
 	 * controller flagged an error instead of scribbling over
 	 * random memory locations.
 	 */
-	dev_printk(KERN_CRIT, chan2dev(&dwc->chan),
-			"Bad descriptor submitted for DMA!\n");
-	dev_printk(KERN_CRIT, chan2dev(&dwc->chan),
-			"  cookie: %d\n", bad_desc->txd.cookie);
+	dev_crit(chan2dev(&dwc->chan), "Bad descriptor submitted for DMA!\n");
+	dev_crit(chan2dev(&dwc->chan), "  cookie: %d\n", bad_desc->txd.cookie);
 	dwc_dump_lli(dwc, &bad_desc->lli);
 	list_for_each_entry(child, &bad_desc->tx_list, desc_node)
 		dwc_dump_lli(dwc, &child->lli);
@@ -1625,8 +1622,8 @@ static int __devinit dw_probe(struct platform_device *pdev)
 
 	dma_writel(dw, CFG, DW_CFG_DMA_EN);
 
-	printk(KERN_INFO "%s: DesignWare DMA Controller, %d channels\n",
-			dev_name(&pdev->dev), nr_channels);
+	dev_info(&pdev->dev, "DesignWare DMA Controller, %d channels\n",
+		 nr_channels);
 
 	dma_async_device_register(&dw->dma);
 
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv3 4/6] dw_dmac: don't call platform_get_drvdata twice
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
                   ` (2 preceding siblings ...)
  2012-10-18 14:34 ` [PATCHv3 3/6] dw_dmac: change dev_printk() to corresponding macros Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 5/6] dw_dmac: change dev_crit to dev_WARN in dwc_handle_error Andy Shevchenko
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Andy Shevchenko

There is no need to call platform_get_drvdata twice as we have it already in dw
variable.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Reviewed-by: Felipe Balbi <balbi@ti.com>
---
 drivers/dma/dw_dmac.c |    4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index d4ddf48..180ffd5 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -1653,7 +1653,7 @@ static void dw_shutdown(struct platform_device *pdev)
 {
 	struct dw_dma	*dw = platform_get_drvdata(pdev);
 
-	dw_dma_off(platform_get_drvdata(pdev));
+	dw_dma_off(dw);
 	clk_disable_unprepare(dw->clk);
 }
 
@@ -1662,7 +1662,7 @@ static int dw_suspend_noirq(struct device *dev)
 	struct platform_device *pdev = to_platform_device(dev);
 	struct dw_dma	*dw = platform_get_drvdata(pdev);
 
-	dw_dma_off(platform_get_drvdata(pdev));
+	dw_dma_off(dw);
 	clk_disable_unprepare(dw->clk);
 
 	return 0;
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv3 5/6] dw_dmac: change dev_crit to dev_WARN in dwc_handle_error
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
                   ` (3 preceding siblings ...)
  2012-10-18 14:34 ` [PATCHv3 4/6] dw_dmac: don't call platform_get_drvdata twice Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 14:34 ` [PATCHv3 6/6] dw_dmac: introduce to_dw_desc() macro Andy Shevchenko
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Andy Shevchenko

In case of handling a bad descriptor the dwc_handle_error() will dump a stack
as well. It's a lot more verbose and more likely to get user's attention.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw_dmac.c |    6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 180ffd5..826ff8d 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -485,14 +485,14 @@ static void dwc_handle_error(struct dw_dma *dw, struct dw_dma_chan *dwc)
 		dwc_dostart(dwc, dwc_first_active(dwc));
 
 	/*
-	 * KERN_CRITICAL may seem harsh, but since this only happens
+	 * WARN may seem harsh, but since this only happens
 	 * when someone submits a bad physical address in a
 	 * descriptor, we should consider ourselves lucky that the
 	 * controller flagged an error instead of scribbling over
 	 * random memory locations.
 	 */
-	dev_crit(chan2dev(&dwc->chan), "Bad descriptor submitted for DMA!\n");
-	dev_crit(chan2dev(&dwc->chan), "  cookie: %d\n", bad_desc->txd.cookie);
+	dev_WARN(chan2dev(&dwc->chan), "Bad descriptor submitted for DMA!\n"
+				       "  cookie: %d\n", bad_desc->txd.cookie);
 	dwc_dump_lli(dwc, &bad_desc->lli);
 	list_for_each_entry(child, &bad_desc->tx_list, desc_node)
 		dwc_dump_lli(dwc, &child->lli);
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* [PATCHv3 6/6] dw_dmac: introduce to_dw_desc() macro
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
                   ` (4 preceding siblings ...)
  2012-10-18 14:34 ` [PATCHv3 5/6] dw_dmac: change dev_crit to dev_WARN in dwc_handle_error Andy Shevchenko
@ 2012-10-18 14:34 ` Andy Shevchenko
  2012-10-18 17:04 ` [PATCHv3 0/6] dw_dmac: few cleanups to the driver viresh kumar
  2012-10-25  8:06 ` Vinod Koul
  7 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2012-10-18 14:34 UTC (permalink / raw)
  To: Viresh Kumar, Vinod Koul, linux-kernel, spear-devel, balbi
  Cc: Andy Shevchenko

The to_dw_desc() macro helps to retrieve the dw_desc node from the
corresponding list_head structure.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
 drivers/dma/dw_dmac.c      |    6 ++----
 drivers/dma/dw_dmac_regs.h |    2 ++
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/dma/dw_dmac.c b/drivers/dma/dw_dmac.c
index 826ff8d..cb89c2a 100644
--- a/drivers/dma/dw_dmac.c
+++ b/drivers/dma/dw_dmac.c
@@ -93,7 +93,7 @@ static struct device *chan2parent(struct dma_chan *chan)
 
 static struct dw_desc *dwc_first_active(struct dw_dma_chan *dwc)
 {
-	return list_entry(dwc->active_list.next, struct dw_desc, desc_node);
+	return to_dw_desc(dwc->active_list.next);
 }
 
 static struct dw_desc *dwc_desc_get(struct dw_dma_chan *dwc)
@@ -600,9 +600,7 @@ static void dw_dma_tasklet(unsigned long data)
 			if (test_bit(DW_DMA_IS_SOFT_LLP, &dwc->flags)) {
 				if (dwc->tx_node_active != dwc->tx_list) {
 					struct dw_desc *desc =
-						list_entry(dwc->tx_node_active,
-							   struct dw_desc,
-							   desc_node);
+						to_dw_desc(dwc->tx_node_active);
 
 					dma_writel(dw, CLEAR.XFER, dwc->mask);
 
diff --git a/drivers/dma/dw_dmac_regs.h b/drivers/dma/dw_dmac_regs.h
index ff39fa6..de90a1b 100644
--- a/drivers/dma/dw_dmac_regs.h
+++ b/drivers/dma/dw_dmac_regs.h
@@ -287,6 +287,8 @@ struct dw_desc {
 	size_t				len;
 };
 
+#define to_dw_desc(h)	list_entry(h, struct dw_desc, desc_node)
+
 static inline struct dw_desc *
 txd_to_dw_desc(struct dma_async_tx_descriptor *txd)
 {
-- 
1.7.10.4


^ permalink raw reply related	[flat|nested] 10+ messages in thread

* Re: [PATCHv3 0/6] dw_dmac: few cleanups to the driver
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
                   ` (5 preceding siblings ...)
  2012-10-18 14:34 ` [PATCHv3 6/6] dw_dmac: introduce to_dw_desc() macro Andy Shevchenko
@ 2012-10-18 17:04 ` viresh kumar
  2012-10-18 17:28   ` Felipe Balbi
  2012-10-25  8:06 ` Vinod Koul
  7 siblings, 1 reply; 10+ messages in thread
From: viresh kumar @ 2012-10-18 17:04 UTC (permalink / raw)
  To: Andy Shevchenko; +Cc: Vinod Koul, linux-kernel, spear-devel, balbi

On Thu, Oct 18, 2012 at 8:04 PM, Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
> There are few cleanups to the driver which partialy acked and reviewed.
>
> Since v2:
>  - add one more clean up (patch 6/6)
>  - make a separate patch to WARN a user in dwc_handle_error (suggested by
>    Felipe Balbi)
>  - add a description to patch 4/6

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCHv3 0/6] dw_dmac: few cleanups to the driver
  2012-10-18 17:04 ` [PATCHv3 0/6] dw_dmac: few cleanups to the driver viresh kumar
@ 2012-10-18 17:28   ` Felipe Balbi
  0 siblings, 0 replies; 10+ messages in thread
From: Felipe Balbi @ 2012-10-18 17:28 UTC (permalink / raw)
  To: viresh kumar
  Cc: Andy Shevchenko, Vinod Koul, linux-kernel, spear-devel, balbi

[-- Attachment #1: Type: text/plain, Size: 597 bytes --]

Hi,

On Thu, Oct 18, 2012 at 10:34:38PM +0530, viresh kumar wrote:
> On Thu, Oct 18, 2012 at 8:04 PM, Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
> > There are few cleanups to the driver which partialy acked and reviewed.
> >
> > Since v2:
> >  - add one more clean up (patch 6/6)
> >  - make a separate patch to WARN a user in dwc_handle_error (suggested by
> >    Felipe Balbi)
> >  - add a description to patch 4/6
> 
> Acked-by: Viresh Kumar <viresh.kumar@linaro.org>

FWIW:

Reviewed-by: Felipe Balbi <balbi@ti.com>

(for the entire series)

-- 
balbi

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 836 bytes --]

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCHv3 0/6] dw_dmac: few cleanups to the driver
  2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
                   ` (6 preceding siblings ...)
  2012-10-18 17:04 ` [PATCHv3 0/6] dw_dmac: few cleanups to the driver viresh kumar
@ 2012-10-25  8:06 ` Vinod Koul
  7 siblings, 0 replies; 10+ messages in thread
From: Vinod Koul @ 2012-10-25  8:06 UTC (permalink / raw)
  To: Andy Shevchenko
  Cc: vinod.koul, Viresh Kumar, linux-kernel, spear-devel, balbi

On Thu, 2012-10-18 at 17:34 +0300, Andy Shevchenko wrote:
> There are few cleanups to the driver which partialy acked and reviewed.
> 
> Since v2:
>  - add one more clean up (patch 6/6)
>  - make a separate patch to WARN a user in dwc_handle_error (suggested by
>    Felipe Balbi)
>  - add a description to patch 4/6
> 
> Andy Shevchenko (4):
>   dw_dmac: change dev_printk() to corresponding macros
>   dw_dmac: don't call platform_get_drvdata twice
>   dw_dmac: change dev_crit to dev_WARN in dwc_handle_error
>   dw_dmac: introduce to_dw_desc() macro
> 
> Heikki Krogerus (2):
>   dmaengine: dw_dmac: remove CLK dependency
>   dmaengine: dw_dmac: amend description and indentation
> 
>  drivers/dma/Kconfig        |    1 -
>  drivers/dma/dw_dmac.c      |   33 ++++++++++++++-------------------
>  drivers/dma/dw_dmac_regs.h |    2 ++
>  3 files changed, 16 insertions(+), 20 deletions(-)
> 

Applied thanks

-- 
Vinod Koul
Intel Corp.


^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2012-10-25  8:21 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-10-18 14:34 [PATCHv3 0/6] dw_dmac: few cleanups to the driver Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 1/6] dmaengine: dw_dmac: remove CLK dependency Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 2/6] dmaengine: dw_dmac: amend description and indentation Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 3/6] dw_dmac: change dev_printk() to corresponding macros Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 4/6] dw_dmac: don't call platform_get_drvdata twice Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 5/6] dw_dmac: change dev_crit to dev_WARN in dwc_handle_error Andy Shevchenko
2012-10-18 14:34 ` [PATCHv3 6/6] dw_dmac: introduce to_dw_desc() macro Andy Shevchenko
2012-10-18 17:04 ` [PATCHv3 0/6] dw_dmac: few cleanups to the driver viresh kumar
2012-10-18 17:28   ` Felipe Balbi
2012-10-25  8:06 ` Vinod Koul

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).