[Patch v6] dmaengine: Add dma router for pl08x in LPC32XX SoC

2024-06-28 Thread Piotr Wojtaszczyk
LPC32XX connects few of its peripherals to pl08x DMA thru a multiplexer,
this driver allows to route a signal request line thru the multiplexer for
given peripheral.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v6:
- Select LPC32XX_DMAMUX config when AMBA_PL08X is selected

Changes for v5:
- Fix struct declaration order
- Removed unused variables
- Break search loop if expected lpc32xx_muxes[i].signal is found

Changes for v4:
- This patch is new in v4

 MAINTAINERS   |   1 +
 arch/arm/mach-lpc32xx/Kconfig |   1 +
 drivers/dma/Kconfig   |   9 ++
 drivers/dma/Makefile  |   1 +
 drivers/dma/lpc32xx-dmamux.c  | 195 ++
 5 files changed, 207 insertions(+)
 create mode 100644 drivers/dma/lpc32xx-dmamux.c

diff --git a/MAINTAINERS b/MAINTAINERS
index ceec359c68fc..118d48747641 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2404,6 +2404,7 @@ R:Vladimir Zapolskiy 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Maintained
 F: Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
+F: drivers/dma/lpc32xx-dmamux.c
 
 ARM/Marvell Dove/MV78xx0/Orion SOC support
 M: Andrew Lunn 
diff --git a/arch/arm/mach-lpc32xx/Kconfig b/arch/arm/mach-lpc32xx/Kconfig
index 35730d3696d0..138599545c24 100644
--- a/arch/arm/mach-lpc32xx/Kconfig
+++ b/arch/arm/mach-lpc32xx/Kconfig
@@ -8,5 +8,6 @@ config ARCH_LPC32XX
select CLKSRC_LPC32XX
select CPU_ARM926T
select GPIOLIB
+   select LPC32XX_DMAMUX if AMBA_PL08X
help
  Support for the NXP LPC32XX family of processors
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 002a5ec80620..aeace3d7e066 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -378,6 +378,15 @@ config LPC18XX_DMAMUX
  Enable support for DMA on NXP LPC18xx/43xx platforms
  with PL080 and multiplexed DMA request lines.
 
+config LPC32XX_DMAMUX
+   bool "NXP LPC32xx DMA MUX for PL080"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   depends on OF && AMBA_PL08X
+   select MFD_SYSCON
+   help
+ Support for PL080 multiplexed DMA request lines on
+ LPC32XX platrofm.
+
 config LS2X_APB_DMA
tristate "Loongson LS2X APB DMA support"
depends on LOONGARCH || COMPILE_TEST
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 802ca916f05f..6f1350b62e7f 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -50,6 +50,7 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
 obj-y += idxd/
 obj-$(CONFIG_K3_DMA) += k3dma.o
 obj-$(CONFIG_LPC18XX_DMAMUX) += lpc18xx-dmamux.o
+obj-$(CONFIG_LPC32XX_DMAMUX) += lpc32xx-dmamux.o
 obj-$(CONFIG_LS2X_APB_DMA) += ls2x-apb-dma.o
 obj-$(CONFIG_MILBEAUT_HDMAC) += milbeaut-hdmac.o
 obj-$(CONFIG_MILBEAUT_XDMAC) += milbeaut-xdmac.o
diff --git a/drivers/dma/lpc32xx-dmamux.c b/drivers/dma/lpc32xx-dmamux.c
new file mode 100644
index ..351d7e23e615
--- /dev/null
+++ b/drivers/dma/lpc32xx-dmamux.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright 2024 Timesys Corporation 
+//
+// Based on TI DMA Crossbar driver by:
+//   Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
+//   Author: Peter Ujfalusi 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define LPC32XX_SSP_CLK_CTRL 0x78
+#define LPC32XX_I2S_CLK_CTRL 0x7c
+
+struct lpc32xx_dmamux {
+   int signal;
+   char *name_sel0;
+   char *name_sel1;
+   int muxval;
+   int muxreg;
+   int bit;
+   bool busy;
+};
+
+struct lpc32xx_dmamux_data {
+   struct dma_router dmarouter;
+   struct regmap *reg;
+   spinlock_t lock; /* protects busy status flag */
+};
+
+/* From LPC32x0 User manual "3.2.1 DMA request signals" */
+static struct lpc32xx_dmamux lpc32xx_muxes[] = {
+   {
+   .signal = 3,
+   .name_sel0 = "spi2-rx-tx",
+   .name_sel1 = "ssp1-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 5,
+   },
+   {
+   .signal = 10,
+   .name_sel0 = "uart7-rx",
+   .name_sel1 = "i2s1-dma1",
+   .muxreg = LPC32XX_I2S_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 11,
+   .name_sel0 = "spi1-rx-tx",
+   .name_sel1 = "ssp1-tx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 14,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 3,
+   },
+   {
+   .signal = 15,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-tx",
+

[Patch v6] i2c: pnx: Fix potential deadlock warning from del_timer_sync() call in isr

2024-06-28 Thread Piotr Wojtaszczyk
When del_timer_sync() is called in an interrupt context it throws a warning
because of potential deadlock. The timer is used only to exit from
wait_for_completion() after a timeout so replacing the call with
wait_for_completion_timeout() allows to remove the problematic timer and
its related functions altogether.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v6:
- Fixed typo in the patch subject

Changes for v5:
- Replaced wait_for_completion() with wait_for_completion_timeout().
- Removed unneded "alg_data->mif.timer" and its functions
- Request irq with devm_request_irq() as before the patch
- Renamed the patch and reword description for the new way to fix
  the warning

Changes for v4:
- Request irq with devm_request_threaded_irq() to prevent the warning

 drivers/i2c/busses/i2c-pnx.c | 48 
 1 file changed, 10 insertions(+), 38 deletions(-)

diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c
index a12525b3186b..f448505d5468 100644
--- a/drivers/i2c/busses/i2c-pnx.c
+++ b/drivers/i2c/busses/i2c-pnx.c
@@ -15,7 +15,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -32,7 +31,6 @@ struct i2c_pnx_mif {
int ret;/* Return value */
int mode;   /* Interface mode */
struct completion   complete;   /* I/O completion */
-   struct timer_list   timer;  /* Timeout */
u8 *buf;/* Data buffer */
int len;/* Length of data buffer */
int order;  /* RX Bytes to order via TX */
@@ -117,24 +115,6 @@ static inline int wait_reset(struct i2c_pnx_algo_data 
*data)
return (timeout <= 0);
 }
 
-static inline void i2c_pnx_arm_timer(struct i2c_pnx_algo_data *alg_data)
-{
-   struct timer_list *timer = _data->mif.timer;
-   unsigned long expires = msecs_to_jiffies(alg_data->timeout);
-
-   if (expires <= 1)
-   expires = 2;
-
-   del_timer_sync(timer);
-
-   dev_dbg(_data->adapter.dev, "Timer armed at %lu plus %lu 
jiffies.\n",
-   jiffies, expires);
-
-   timer->expires = jiffies + expires;
-
-   add_timer(timer);
-}
-
 /**
  * i2c_pnx_start - start a device
  * @slave_addr:slave address
@@ -259,8 +239,6 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data 
*alg_data)
~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
  I2C_REG_CTL(alg_data));
 
-   del_timer_sync(_data->mif.timer);
-
dev_dbg(_data->adapter.dev,
"%s(): Waking up xfer routine.\n",
__func__);
@@ -276,8 +254,6 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data 
*alg_data)
~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
  I2C_REG_CTL(alg_data));
 
-   /* Stop timer. */
-   del_timer_sync(_data->mif.timer);
dev_dbg(_data->adapter.dev,
"%s(): Waking up xfer routine after zero-xfer.\n",
__func__);
@@ -364,8 +340,6 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data 
*alg_data)
 mcntrl_drmie | mcntrl_daie);
iowrite32(ctl, I2C_REG_CTL(alg_data));
 
-   /* Kill timer. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
}
}
@@ -400,8 +374,6 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
 mcntrl_drmie);
iowrite32(ctl, I2C_REG_CTL(alg_data));
 
-   /* Stop timer, to prevent timeout. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
} else if (stat & mstatus_nai) {
/* Slave did not acknowledge, generate a STOP */
@@ -419,8 +391,6 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
/* Our return value. */
alg_data->mif.ret = -EIO;
 
-   /* Stop timer, to prevent timeout. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
} else {
/*
@@ -453,9 +423,8 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
return IRQ_HANDLED;
 }
 
-static void i2c_pnx_timeout(struct timer_list *t)
+static void i2c_pnx_timeout(struct i2c_pnx_algo_data *alg_data)
 {
-   struct i2c_pnx_algo_data *alg_data = from_timer(alg_data, t, mif.timer);
u32 ctl;
 
dev_err(_data->adapter.dev,
@@ -472,7 +441,6 @@ static void i2c_pnx_tim

Re: [Patch v4 08/10] mtd: rawnand: lpx32xx: Request DMA channels using DT entries

2024-06-28 Thread Piotr Wojtaszczyk
On Mon, Jun 24, 2024 at 8:39 AM Miquel Raynal  wrote:
> > > I don't see any change regarding the NAND controller node in the device
> > > tree, is there any dependency with other patches from the same patchset
> > > or may I apply this directly to nand/next?
> > >
> > > Thanks,
> > > Miquèl
> >
> > Yes, this patch depends on "[v4,04/10] ARM: dts: lpc32xx: Add missing
> > dma and i2s properties"
> > which will be splitted into two or more separate patches per request
> > in the comments.
> > I'd like to keep driver changes and corresponding changes in DTS in
> > the same patch
> > but I've made a separate patch for DTS per request from v2 of the patch set.
>
> These changes won't be applied to the same tries so they must be split.
>
> So I will not take this patch for the next merge window and instead
> will take it for the one after, if the DT patches have been applied.
> Please ping me at -rc1 again if the DT patches have gone through.
>
> Thanks,
> Miquèl

Hi Miquèl, please check v5 of the patch, I've added fallback if a DMA can't be
requested using DT, this is backward compatible with platform data and no
longer depends on the DT changes.
https://patchwork.ozlabs.org/project/linuxppc-dev/patch/20240627150046.258795-11-piotr.wojtaszc...@timesys.com/

--
Piotr Wojtaszczyk
Timesys


[Patch v5 12/12] i2x: pnx: Fix potential deadlock warning from del_timer_sync() call in isr

2024-06-27 Thread Piotr Wojtaszczyk
When del_timer_sync() is called in an interrupt context it throws a warning
because of potential deadlock. The timer is used only to exit from
wait_for_completion() after a timeout so replacing the call with
wait_for_completion_timeout() allows to remove the problematic timer and
its related functions altogether.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Replaced wait_for_completion() with wait_for_completion_timeout().
- Removed unneded "alg_data->mif.timer" and its functions
- Request irq with devm_request_irq() as before the patch
- Renamed the patch and reword description for the new way to fix
  the warning

Changes for v4:
- Request irq with devm_request_threaded_irq() to prevent the warning

 drivers/i2c/busses/i2c-pnx.c | 48 
 1 file changed, 10 insertions(+), 38 deletions(-)

diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c
index a12525b3186b..f448505d5468 100644
--- a/drivers/i2c/busses/i2c-pnx.c
+++ b/drivers/i2c/busses/i2c-pnx.c
@@ -15,7 +15,6 @@
 #include 
 #include 
 #include 
-#include 
 #include 
 #include 
 #include 
@@ -32,7 +31,6 @@ struct i2c_pnx_mif {
int ret;/* Return value */
int mode;   /* Interface mode */
struct completion   complete;   /* I/O completion */
-   struct timer_list   timer;  /* Timeout */
u8 *buf;/* Data buffer */
int len;/* Length of data buffer */
int order;  /* RX Bytes to order via TX */
@@ -117,24 +115,6 @@ static inline int wait_reset(struct i2c_pnx_algo_data 
*data)
return (timeout <= 0);
 }
 
-static inline void i2c_pnx_arm_timer(struct i2c_pnx_algo_data *alg_data)
-{
-   struct timer_list *timer = _data->mif.timer;
-   unsigned long expires = msecs_to_jiffies(alg_data->timeout);
-
-   if (expires <= 1)
-   expires = 2;
-
-   del_timer_sync(timer);
-
-   dev_dbg(_data->adapter.dev, "Timer armed at %lu plus %lu 
jiffies.\n",
-   jiffies, expires);
-
-   timer->expires = jiffies + expires;
-
-   add_timer(timer);
-}
-
 /**
  * i2c_pnx_start - start a device
  * @slave_addr:slave address
@@ -259,8 +239,6 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data 
*alg_data)
~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
  I2C_REG_CTL(alg_data));
 
-   del_timer_sync(_data->mif.timer);
-
dev_dbg(_data->adapter.dev,
"%s(): Waking up xfer routine.\n",
__func__);
@@ -276,8 +254,6 @@ static int i2c_pnx_master_xmit(struct i2c_pnx_algo_data 
*alg_data)
~(mcntrl_afie | mcntrl_naie | mcntrl_drmie),
  I2C_REG_CTL(alg_data));
 
-   /* Stop timer. */
-   del_timer_sync(_data->mif.timer);
dev_dbg(_data->adapter.dev,
"%s(): Waking up xfer routine after zero-xfer.\n",
__func__);
@@ -364,8 +340,6 @@ static int i2c_pnx_master_rcv(struct i2c_pnx_algo_data 
*alg_data)
 mcntrl_drmie | mcntrl_daie);
iowrite32(ctl, I2C_REG_CTL(alg_data));
 
-   /* Kill timer. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
}
}
@@ -400,8 +374,6 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
 mcntrl_drmie);
iowrite32(ctl, I2C_REG_CTL(alg_data));
 
-   /* Stop timer, to prevent timeout. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
} else if (stat & mstatus_nai) {
/* Slave did not acknowledge, generate a STOP */
@@ -419,8 +391,6 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
/* Our return value. */
alg_data->mif.ret = -EIO;
 
-   /* Stop timer, to prevent timeout. */
-   del_timer_sync(_data->mif.timer);
complete(_data->mif.complete);
} else {
/*
@@ -453,9 +423,8 @@ static irqreturn_t i2c_pnx_interrupt(int irq, void *dev_id)
return IRQ_HANDLED;
 }
 
-static void i2c_pnx_timeout(struct timer_list *t)
+static void i2c_pnx_timeout(struct i2c_pnx_algo_data *alg_data)
 {
-   struct i2c_pnx_algo_data *alg_data = from_timer(alg_data, t, mif.timer);
u32 ctl;
 
dev_err(_data->adapter.dev,
@@ -472,7 +441,6 @@ static void i2c_pnx_timeout(struct timer_list *t)
iowrite32(ctl, I2C_REG_C

[Patch v5 11/12] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-27 Thread Piotr Wojtaszczyk
This driver was ported from an old version in linux 2.6.27 and adjusted
for the new ASoC framework and DMA API.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Removed "N:" from the MAINTAINERS entry
- Removed unused filter_data and flags variables

Changes for v4:
- Add to MAINTAINERS
- Use guard(mutex)(_info_p->lock) when possible
- Request dma chennels using DT entries in devm_snd_dmaengine_pcm_register

Changes for v3:
- Split previous commit for separate subsystems
- Add support and  as a maintainer for the driver
- Replaced `SND_SOC` config dependency with COMPILE_TEST
- Moved `snd-soc-fsl-lpc3xxx-y` in Makefile up in the list to maintain 
alfabedical order
- Changed comment to c++ format
- replaced custom absd32() with standard abs() function
- Added clock provider check in lpc3xxx_i2s_set_dai_fmt()
- Removed empty lpc32xx_i2s_remove() function
- Reworked i2s regs definitions to include LPC3XXX prefix
- Replaced custom _BIT, _SBD with standard BIT and FIELD_PREP macros

Changes for v2:
- Coding Style cleanup
- Use dev_err_probe() for error handling in probe function
- Removed unneded err_clk_disable label
- Removed empty function
- Droped of_match_ptr in lpc32xx_i2s_match DT match table
- ASoC struct adjustmes for the latest 6.10-rc3 kernel

 MAINTAINERS |   1 +
 sound/soc/fsl/Kconfig   |   7 +
 sound/soc/fsl/Makefile  |   2 +
 sound/soc/fsl/lpc3xxx-i2s.c | 375 
 sound/soc/fsl/lpc3xxx-i2s.h |  79 
 sound/soc/fsl/lpc3xxx-pcm.c |  72 +++
 6 files changed, 536 insertions(+)
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 118d48747641..adfe07a99c1a 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8927,6 +8927,7 @@ L:alsa-de...@alsa-project.org (moderated for 
non-subscribers)
 L: linuxppc-dev@lists.ozlabs.org
 S: Maintained
 F: Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
+F: sound/soc/fsl/lpc3xxx-*
 
 FREESCALE SOC SOUND QMC DRIVER
 M: Herve Codina 
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index 270726c134b3..72f2d4d15696 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -130,6 +130,13 @@ config SND_SOC_FSL_RPMSG
  This option is only useful for out-of-tree drivers since
  in-tree drivers select it automatically.
 
+config SND_SOC_FSL_LPC3XXX
+   tristate "SoC Audio for NXP LPC32XX CPUs"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   select SND_SOC_GENERIC_DMAENGINE_PCM
+   help
+ Say Y or M if you want to add support for the LPC3XXX I2S interface.
+
 config SND_SOC_IMX_PCM_DMA
tristate
select SND_SOC_GENERIC_DMAENGINE_PCM
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile
index 2fe78eed3a48..2a61e2f96438 100644
--- a/sound/soc/fsl/Makefile
+++ b/sound/soc/fsl/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_SND_SOC_P1022_RDK) += snd-soc-p1022-rdk.o
 snd-soc-fsl-audmix-y := fsl_audmix.o
 snd-soc-fsl-asoc-card-y := fsl-asoc-card.o
 snd-soc-fsl-asrc-y := fsl_asrc.o fsl_asrc_dma.o
+snd-soc-fsl-lpc3xxx-y := lpc3xxx-pcm.o lpc3xxx-i2s.o
 snd-soc-fsl-sai-y := fsl_sai.o
 snd-soc-fsl-ssi-y := fsl_ssi.o
 snd-soc-fsl-ssi-$(CONFIG_DEBUG_FS) += fsl_ssi_dbg.o
@@ -29,6 +30,7 @@ snd-soc-fsl-qmc-audio-y := fsl_qmc_audio.o
 obj-$(CONFIG_SND_SOC_FSL_AUDMIX) += snd-soc-fsl-audmix.o
 obj-$(CONFIG_SND_SOC_FSL_ASOC_CARD) += snd-soc-fsl-asoc-card.o
 obj-$(CONFIG_SND_SOC_FSL_ASRC) += snd-soc-fsl-asrc.o
+obj-$(CONFIG_SND_SOC_FSL_LPC3XXX) += snd-soc-fsl-lpc3xxx.o
 obj-$(CONFIG_SND_SOC_FSL_SAI) += snd-soc-fsl-sai.o
 obj-$(CONFIG_SND_SOC_FSL_SSI) += snd-soc-fsl-ssi.o
 obj-$(CONFIG_SND_SOC_FSL_SPDIF) += snd-soc-fsl-spdif.o
diff --git a/sound/soc/fsl/lpc3xxx-i2s.c b/sound/soc/fsl/lpc3xxx-i2s.c
new file mode 100644
index ..0e5b4d5202ff
--- /dev/null
+++ b/sound/soc/fsl/lpc3xxx-i2s.c
@@ -0,0 +1,375 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Author: Kevin Wells 
+//
+// Copyright (C) 2008 NXP Semiconductors
+// Copyright 2023 Timesys Corporation 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "lpc3xxx-i2s.h"
+
+#define I2S_PLAYBACK_FLAG 0x1
+#define I2S_CAPTURE_FLAG 0x2
+
+#define LPC3XXX_I2S_RATES ( \
+   SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
+   SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
+   SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
+
+#define LPC3XXX_I2S_FORMATS ( \
+   SNDRV_PCM_FMTBIT_S8 | \
+   SNDRV_PCM_FMTBIT_S16_LE | \
+   SNDRV_PCM_FMTBIT_S32_LE)
+
+static void __lpc3xxx_find_clkdiv(u32 *clkx, u32 *clky, int freq, int xbytes, 
u32 clkrate)
+{
+   u32 i2srate;
+   u32 idxx, idyy;
+   u32 savedbitclkrate, diff, trate, baseclk;
+
+   /* Adjust rate for 

[Patch v5 10/12] mtd: rawnand: lpx32xx: Request DMA channels using DT entries

2024-06-27 Thread Piotr Wojtaszczyk
Move away from pl08x platform data towards device tree.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Added fallback dma channel request for backward compatibility with DMA with
  platform data instead DT

Changes for v4:
- This patch is new in v4

 drivers/mtd/nand/raw/lpc32xx_mlc.c | 26 +++---
 drivers/mtd/nand/raw/lpc32xx_slc.c | 26 +++---
 2 files changed, 30 insertions(+), 22 deletions(-)

diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c 
b/drivers/mtd/nand/raw/lpc32xx_mlc.c
index 677fcb03f9be..92cebe871bb4 100644
--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c
@@ -574,18 +574,22 @@ static int lpc32xx_dma_setup(struct lpc32xx_nand_host 
*host)
struct mtd_info *mtd = nand_to_mtd(>nand_chip);
dma_cap_mask_t mask;
 
-   if (!host->pdata || !host->pdata->dma_filter) {
-   dev_err(mtd->dev.parent, "no DMA platform data\n");
-   return -ENOENT;
-   }
-
-   dma_cap_zero(mask);
-   dma_cap_set(DMA_SLAVE, mask);
-   host->dma_chan = dma_request_channel(mask, host->pdata->dma_filter,
-"nand-mlc");
+   host->dma_chan = dma_request_chan(mtd->dev.parent, "rx-tx");
if (!host->dma_chan) {
-   dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
-   return -EBUSY;
+   /* fallback to request using platform data */
+   if (!host->pdata || !host->pdata->dma_filter) {
+   dev_err(mtd->dev.parent, "no DMA platform data\n");
+   return -ENOENT;
+   }
+
+   dma_cap_zero(mask);
+   dma_cap_set(DMA_SLAVE, mask);
+   host->dma_chan = dma_request_channel(mask, 
host->pdata->dma_filter, "nand-mlc");
+
+   if (!host->dma_chan) {
+   dev_err(mtd->dev.parent, "Failed to request DMA 
channel\n");
+   return -EBUSY;
+   }
}
 
/*
diff --git a/drivers/mtd/nand/raw/lpc32xx_slc.c 
b/drivers/mtd/nand/raw/lpc32xx_slc.c
index 1c5fa855b9f2..3b7e3d259785 100644
--- a/drivers/mtd/nand/raw/lpc32xx_slc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_slc.c
@@ -721,18 +721,22 @@ static int lpc32xx_nand_dma_setup(struct 
lpc32xx_nand_host *host)
struct mtd_info *mtd = nand_to_mtd(>nand_chip);
dma_cap_mask_t mask;
 
-   if (!host->pdata || !host->pdata->dma_filter) {
-   dev_err(mtd->dev.parent, "no DMA platform data\n");
-   return -ENOENT;
-   }
-
-   dma_cap_zero(mask);
-   dma_cap_set(DMA_SLAVE, mask);
-   host->dma_chan = dma_request_channel(mask, host->pdata->dma_filter,
-"nand-slc");
+   host->dma_chan = dma_request_chan(mtd->dev.parent, "rx-tx");
if (!host->dma_chan) {
-   dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
-   return -EBUSY;
+   /* fallback to request using platform data */
+   if (!host->pdata || !host->pdata->dma_filter) {
+   dev_err(mtd->dev.parent, "no DMA platform data\n");
+   return -ENOENT;
+   }
+
+   dma_cap_zero(mask);
+   dma_cap_set(DMA_SLAVE, mask);
+   host->dma_chan = dma_request_channel(mask, 
host->pdata->dma_filter, "nand-slc");
+
+   if (!host->dma_chan) {
+   dev_err(mtd->dev.parent, "Failed to request DMA 
channel\n");
+   return -EBUSY;
+   }
}
 
return 0;
-- 
2.25.1



[Patch v5 09/12] ARM: lpc32xx: Remove pl08x platform data in favor for device tree

2024-06-27 Thread Piotr Wojtaszczyk
With the driver for nxp,lpc3220-dmamux we can remove the pl08x platform
data and let pl08x driver to create peripheral channels from the DT
properties.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 arch/arm/mach-lpc32xx/phy3250.c | 54 -
 1 file changed, 54 deletions(-)

diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c
index 66701bf43248..0c7797a0e44e 100644
--- a/arch/arm/mach-lpc32xx/phy3250.c
+++ b/arch/arm/mach-lpc32xx/phy3250.c
@@ -16,64 +16,10 @@
 #include 
 #include "common.h"
 
-static struct pl08x_channel_data pl08x_slave_channels[] = {
-   {
-   .bus_id = "nand-slc",
-   .min_signal = 1, /* SLC NAND Flash */
-   .max_signal = 1,
-   .periph_buses = PL08X_AHB1,
-   },
-   {
-   .bus_id = "nand-mlc",
-   .min_signal = 12, /* MLC NAND Flash */
-   .max_signal = 12,
-   .periph_buses = PL08X_AHB1,
-   },
-};
-
-static int pl08x_get_signal(const struct pl08x_channel_data *cd)
-{
-   return cd->min_signal;
-}
-
-static void pl08x_put_signal(const struct pl08x_channel_data *cd, int ch)
-{
-}
-
-static struct pl08x_platform_data pl08x_pd = {
-   /* Some reasonable memcpy defaults */
-   .memcpy_burst_size = PL08X_BURST_SZ_256,
-   .memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS,
-   .slave_channels = _slave_channels[0],
-   .num_slave_channels = ARRAY_SIZE(pl08x_slave_channels),
-   .get_xfer_signal = pl08x_get_signal,
-   .put_xfer_signal = pl08x_put_signal,
-   .lli_buses = PL08X_AHB1,
-   .mem_buses = PL08X_AHB1,
-};
-
-static struct lpc32xx_slc_platform_data lpc32xx_slc_data = {
-   .dma_filter = pl08x_filter_id,
-};
-
-static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = {
-   .dma_filter = pl08x_filter_id,
-};
-
-static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
-   OF_DEV_AUXDATA("arm,pl080", 0x3100, "pl08xdmac", _pd),
-   OF_DEV_AUXDATA("nxp,lpc3220-slc", 0x2002, "2002.flash",
-  _slc_data),
-   OF_DEV_AUXDATA("nxp,lpc3220-mlc", 0x200a8000, "200a8000.flash",
-  _mlc_data),
-   { }
-};
-
 static void __init lpc3250_machine_init(void)
 {
lpc32xx_serial_init();
 
-   of_platform_default_populate(NULL, lpc32xx_auxdata_lookup, NULL);
 }
 
 static const char *const lpc32xx_dt_compat[] __initconst = {
-- 
2.25.1



[Patch v5 08/12] dmaengine: Add dma router for pl08x in LPC32XX SoC

2024-06-27 Thread Piotr Wojtaszczyk
LPC32XX connects few of its peripherals to pl08x DMA thru a multiplexer,
this driver allows to route a signal request line thru the multiplexer for
given peripheral.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Fix struct declaration order
- Removed unused variables
- Break search loop if expected lpc32xx_muxes[i].signal is found

Changes for v4:
- This patch is new in v4

 MAINTAINERS  |   1 +
 drivers/dma/Kconfig  |   9 ++
 drivers/dma/Makefile |   1 +
 drivers/dma/lpc32xx-dmamux.c | 195 +++
 4 files changed, 206 insertions(+)
 create mode 100644 drivers/dma/lpc32xx-dmamux.c

diff --git a/MAINTAINERS b/MAINTAINERS
index ceec359c68fc..118d48747641 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2404,6 +2404,7 @@ R:Vladimir Zapolskiy 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Maintained
 F: Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
+F: drivers/dma/lpc32xx-dmamux.c
 
 ARM/Marvell Dove/MV78xx0/Orion SOC support
 M: Andrew Lunn 
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 002a5ec80620..aeace3d7e066 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -378,6 +378,15 @@ config LPC18XX_DMAMUX
  Enable support for DMA on NXP LPC18xx/43xx platforms
  with PL080 and multiplexed DMA request lines.
 
+config LPC32XX_DMAMUX
+   bool "NXP LPC32xx DMA MUX for PL080"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   depends on OF && AMBA_PL08X
+   select MFD_SYSCON
+   help
+ Support for PL080 multiplexed DMA request lines on
+ LPC32XX platrofm.
+
 config LS2X_APB_DMA
tristate "Loongson LS2X APB DMA support"
depends on LOONGARCH || COMPILE_TEST
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 802ca916f05f..6f1350b62e7f 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -50,6 +50,7 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
 obj-y += idxd/
 obj-$(CONFIG_K3_DMA) += k3dma.o
 obj-$(CONFIG_LPC18XX_DMAMUX) += lpc18xx-dmamux.o
+obj-$(CONFIG_LPC32XX_DMAMUX) += lpc32xx-dmamux.o
 obj-$(CONFIG_LS2X_APB_DMA) += ls2x-apb-dma.o
 obj-$(CONFIG_MILBEAUT_HDMAC) += milbeaut-hdmac.o
 obj-$(CONFIG_MILBEAUT_XDMAC) += milbeaut-xdmac.o
diff --git a/drivers/dma/lpc32xx-dmamux.c b/drivers/dma/lpc32xx-dmamux.c
new file mode 100644
index ..351d7e23e615
--- /dev/null
+++ b/drivers/dma/lpc32xx-dmamux.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright 2024 Timesys Corporation 
+//
+// Based on TI DMA Crossbar driver by:
+//   Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
+//   Author: Peter Ujfalusi 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define LPC32XX_SSP_CLK_CTRL 0x78
+#define LPC32XX_I2S_CLK_CTRL 0x7c
+
+struct lpc32xx_dmamux {
+   int signal;
+   char *name_sel0;
+   char *name_sel1;
+   int muxval;
+   int muxreg;
+   int bit;
+   bool busy;
+};
+
+struct lpc32xx_dmamux_data {
+   struct dma_router dmarouter;
+   struct regmap *reg;
+   spinlock_t lock; /* protects busy status flag */
+};
+
+/* From LPC32x0 User manual "3.2.1 DMA request signals" */
+static struct lpc32xx_dmamux lpc32xx_muxes[] = {
+   {
+   .signal = 3,
+   .name_sel0 = "spi2-rx-tx",
+   .name_sel1 = "ssp1-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 5,
+   },
+   {
+   .signal = 10,
+   .name_sel0 = "uart7-rx",
+   .name_sel1 = "i2s1-dma1",
+   .muxreg = LPC32XX_I2S_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 11,
+   .name_sel0 = "spi1-rx-tx",
+   .name_sel1 = "ssp1-tx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 14,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 3,
+   },
+   {
+   .signal = 15,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-tx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 2,
+   },
+};
+
+static void lpc32xx_dmamux_release(struct device *dev, void *route_data)
+{
+   struct lpc32xx_dmamux_data *dmamux = dev_get_drvdata(dev);
+   struct lpc32xx_dmamux *mux = route_data;
+
+   dev_dbg(dev, "releasing dma request signal %d routed to %s\n",
+   mux->signal, mux->muxval ? mux->name_sel1 : mux->name_sel1);
+
+   guard(spinlock)(>lock);
+
+   mux->busy = false;
+}
+
+static void *lpc32xx_dmamu

[Patch v5 07/12] clk: lpc32xx: initialize regmap using parent syscon

2024-06-27 Thread Piotr Wojtaszczyk
This allows to share the regmap with other simple-mfd devices like
nxp,lpc32xx-dmamux

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Add fallback regmap for previous simple-bus DT entry

Changes for v4:
- This patch is new in v4

 drivers/clk/Kconfig   |  1 +
 drivers/clk/nxp/clk-lpc32xx.c | 26 +++---
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 3e9099504fad..85ef57d5cccf 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -346,6 +346,7 @@ config COMMON_CLK_LOONGSON2
 config COMMON_CLK_NXP
def_bool COMMON_CLK && (ARCH_LPC18XX || ARCH_LPC32XX)
select REGMAP_MMIO if ARCH_LPC32XX
+   select MFD_SYSCON if ARCH_LPC32XX
select MFD_SYSCON if ARCH_LPC18XX
help
  Support for clock providers on NXP platforms.
diff --git a/drivers/clk/nxp/clk-lpc32xx.c b/drivers/clk/nxp/clk-lpc32xx.c
index d0f870eff0d6..b8de7f66d1b5 100644
--- a/drivers/clk/nxp/clk-lpc32xx.c
+++ b/drivers/clk/nxp/clk-lpc32xx.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -1511,18 +1512,21 @@ static void __init lpc32xx_clk_init(struct device_node 
*np)
return;
}
 
-   base = of_iomap(np, 0);
-   if (!base) {
-   pr_err("failed to map system control block registers\n");
-   return;
-   }
-
-   clk_regmap = regmap_init_mmio(NULL, base, _scb_regmap_config);
+   clk_regmap = syscon_node_to_regmap(np->parent);
if (IS_ERR(clk_regmap)) {
-   pr_err("failed to regmap system control block: %ld\n",
-   PTR_ERR(clk_regmap));
-   iounmap(base);
-   return;
+   /* fallback to mmio if syscon fails */
+   base = of_iomap(np, 0);
+   if (!base) {
+   pr_err("failed to map system control block 
registers\n");
+   return;
+   }
+   clk_regmap = regmap_init_mmio(NULL, base, 
_scb_regmap_config);
+   if (IS_ERR(clk_regmap)) {
+   pr_err("failed to regmap system control block: %ld\n",
+  PTR_ERR(clk_regmap));
+   iounmap(base);
+   return;
+   }
}
 
/*
-- 
2.25.1



[Patch v5 06/12] ARM: dts: lpc32xx: Add missing i2s properties

2024-06-27 Thread Piotr Wojtaszczyk
Adds properties declared in the new DT binding nxp,lpc3220-i2s.yaml

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- This patch is new in v5
- Split previous patch for lpc32xx.dtsi in to 3 patches

 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi | 6 ++
 1 file changed, 6 insertions(+)

diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 6135ce4dde61..c58dc127e59f 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -240,8 +240,11 @@ spi2: spi@2009 {
i2s0: i2s@20094000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x20094000 0x1000>;
+   interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+   clocks = < LPC32XX_CLK_I2S0>;
dmas = < 0 1>, < 13 1>;
dma-names = "rx", "tx";
+   #sound-dai-cells = <0>;
status = "disabled";
};
 
@@ -260,8 +263,11 @@ sd: sd@20098000 {
i2s1: i2s@2009c000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x2009c000 0x1000>;
+   interrupts = <23 IRQ_TYPE_LEVEL_HIGH>;
+   clocks = < LPC32XX_CLK_I2S1>;
dmas = < 2 1>, < 10 1 1>;
dma-names = "rx", "tx";
+   #sound-dai-cells = <0>;
status = "disabled";
};
 
-- 
2.25.1



[Patch v5 05/12] ARM: dts: lpc32xx: Add missing dma properties

2024-06-27 Thread Piotr Wojtaszczyk
Adds properties declared in the new DT binding nxp,lpc3220-dmamux.yaml
and corresponding phandles.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- This patch is new in v5
- Split previous patch for lpc32xx.dtsi in to 3 patches

 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi | 38 ++
 1 file changed, 38 insertions(+)

diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 8bf88d141e5b..6135ce4dde61 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -67,6 +67,8 @@ slc: flash@2002 {
reg = <0x2002 0x1000>;
clocks = < LPC32XX_CLK_SLC>;
status = "disabled";
+   dmas = < 1 1>;
+   dma-names = "rx-tx";
};
 
mlc: flash@200a8000 {
@@ -75,6 +77,8 @@ mlc: flash@200a8000 {
interrupts = <11 IRQ_TYPE_LEVEL_HIGH>;
clocks = < LPC32XX_CLK_MLC>;
status = "disabled";
+   dmas = < 12 1>;
+   dma-names = "rx-tx";
};
 
dma: dma@3100 {
@@ -83,6 +87,13 @@ dma: dma@3100 {
interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
clocks = < LPC32XX_CLK_DMA>;
clock-names = "apb_pclk";
+   #dma-cells = <2>;
+   dma-channels = <8>;
+   dma-requests = <16>;
+   lli-bus-interface-ahb1;
+   mem-bus-interface-ahb1;
+   memcpy-burst-size = <256>;
+   memcpy-bus-width = <32>;
};
 
usb {
@@ -182,6 +193,8 @@ ssp0: spi@20084000 {
clock-names = "apb_pclk";
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 14 1 1>, < 15 1 1>;
+   dma-names = "rx", "tx";
status = "disabled";
};
 
@@ -191,6 +204,8 @@ spi1: spi@20088000 {
clocks = < LPC32XX_CLK_SPI1>;
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 11 1 0>;
+   dma-names = "rx-tx";
status = "disabled";
};
 
@@ -206,6 +221,8 @@ ssp1: spi@2008c000 {
clock-names = "apb_pclk";
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 3 1 1>, < 11 1 1>;
+   dma-names = "rx", "tx";
status = "disabled";
};
 
@@ -215,12 +232,16 @@ spi2: spi@2009 {
clocks = < LPC32XX_CLK_SPI2>;
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 3 1 0>;
+   dma-names = "rx-tx";
status = "disabled";
};
 
i2s0: i2s@20094000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x20094000 0x1000>;
+   dmas = < 0 1>, < 13 1>;
+   dma-names = "rx", "tx";
status = "disabled";
};
 
@@ -231,12 +252,16 @@ sd: sd@20098000 {
 <13 IRQ_TYPE_LEVEL_HIGH>;
clocks = < LPC32XX_CLK_SD>;
clock-names = "apb_pclk";
+   dmas = < 4 1>;
+   dma-names = "rx";
status = "disabled";
};
 
i2s1: i2s@2009c000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x2009c000 0x1000>;
+   dmas = < 2 1>, < 10 1 1>;
+   dma-names = "rx", "tx";
stat

[Patch v5 04/12] ARM: dts: lpc32xx: Use simple-mfd for clock control block

2024-06-27 Thread Piotr Wojtaszczyk
The clock control block shares registers with other Soc components

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- This patch is new in v5
- Split previous patch for lpc32xx.dtsi in to 3 patches

 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi | 9 -
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 974410918f35..8bf88d141e5b 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -312,18 +312,17 @@ fab {
compatible = "simple-bus";
ranges = <0x2000 0x2000 0x3000>;
 
-   /* System Control Block */
-   scb {
-   compatible = "simple-bus";
-   ranges = <0x0 0x40004000 0x1000>;
+   syscon@40004000 {
+   compatible = "nxp,lpc3220-creg", "syscon", 
"simple-mfd";
+   reg = <0x40004000 0x114>;
#address-cells = <1>;
#size-cells = <1>;
+   ranges = <0 0x40004000 0x114>;
 
clk: clock-controller@0 {
compatible = "nxp,lpc3220-clk";
reg = <0x00 0x114>;
#clock-cells = <1>;
-
clocks = <_32k>, <>;
clock-names = "xtal_32k", "xtal";
};
-- 
2.25.1



[Patch v5 03/12] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-27 Thread Piotr Wojtaszczyk
Add nxp,lpc3220-i2s DT binding documentation.

Signed-off-by: Piotr Wojtaszczyk 
Reviewed-by: Krzysztof Kozlowski 
---
Changes for v5:
- Removed "N:" from the MAINTAINERS entry

Changes for v4:
- Custom dma-vc-names property with standard dmas and dma-names
- Added to MAINTAINERS

Changes for v3:
- Added '$ref: dai-common.yaml#' and '#sound-dai-cells'
- Dropped all clock-names, references
- Dropped status property from the example
- Added interrupts property
- 'make dt_binding_check' pass

Changes for v2:
- Added maintainers field
- Dropped clock-names
- Dropped unused unneded interrupts field

 .../bindings/sound/nxp,lpc3220-i2s.yaml   | 73 +++
 MAINTAINERS   |  9 +++
 2 files changed, 82 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml

diff --git a/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml 
b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
new file mode 100644
index ..40a0877a8aba
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/nxp,lpc3220-i2s.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP LPC32XX I2S Controller
+
+description:
+  The I2S controller in LPC32XX SoCs, ASoC DAI.
+
+maintainers:
+  - J.M.B. Downing 
+  - Piotr Wojtaszczyk 
+
+allOf:
+  - $ref: dai-common.yaml#
+
+properties:
+  compatible:
+enum:
+  - nxp,lpc3220-i2s
+
+  reg:
+maxItems: 1
+
+  interrupts:
+maxItems: 1
+
+  clocks:
+items:
+  - description: input clock of the peripheral.
+
+  dmas:
+items:
+  - description: RX DMA Channel
+  - description: TX DMA Channel
+
+  dma-names:
+items:
+  - const: rx
+  - const: tx
+
+  "#sound-dai-cells":
+const: 0
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - dmas
+  - dma-names
+  - '#sound-dai-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+i2s@20094000 {
+  compatible = "nxp,lpc3220-i2s";
+  reg = <0x20094000 0x1000>;
+  interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+  clocks = < LPC32XX_CLK_I2S0>;
+  dmas = < 0 1>, < 13 1>;
+  dma-names = "rx", "tx";
+  #sound-dai-cells = <0>;
+};
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index 79b44addc139..ceec359c68fc 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8918,6 +8918,15 @@ S:   Maintained
 F: sound/soc/fsl/fsl*
 F: sound/soc/fsl/imx*
 
+FREESCALE SOC LPC32XX SOUND DRIVERS
+M: J.M.B. Downing 
+M: Piotr Wojtaszczyk 
+R: Vladimir Zapolskiy 
+L: alsa-de...@alsa-project.org (moderated for non-subscribers)
+L: linuxppc-dev@lists.ozlabs.org
+S: Maintained
+F: Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
+
 FREESCALE SOC SOUND QMC DRIVER
 M: Herve Codina 
 L: alsa-de...@alsa-project.org (moderated for non-subscribers)
-- 
2.25.1



[Patch v5 02/12] dt-bindings: dma: Add lpc32xx DMA mux binding

2024-06-27 Thread Piotr Wojtaszczyk
LPC32XX SoCs use pl080 dma controller which have few request signals
multiplexed between peripherals. This binding describes how devices can
use the multiplexed request signals.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v5:
- Corrected property order
- Added maxItems to properties
- Fixed example
- Removed "N:: from the MAINTAINERS entry
- Added Piotr Wojtaszczyk  to LPC32XX maintainers

Changes for v4:
- This patch is new in v4

 .../bindings/dma/nxp,lpc3220-dmamux.yaml  | 49 +++
 MAINTAINERS   |  9 
 2 files changed, 58 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml

diff --git a/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml 
b/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
new file mode 100644
index ..32f208744154
--- /dev/null
+++ b/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
@@ -0,0 +1,49 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/nxp,lpc3220-dmamux.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: DMA multiplexer for LPC32XX SoC (DMA request router)
+
+maintainers:
+  - J.M.B. Downing 
+  - Piotr Wojtaszczyk 
+
+allOf:
+  - $ref: dma-router.yaml#
+
+properties:
+  compatible:
+const: nxp,lpc3220-dmamux
+
+  reg:
+maxItems: 1
+
+  dma-masters:
+description: phandle to a dma node compatible with arm,pl080
+maxItems: 1
+
+  "#dma-cells":
+const: 3
+description: |
+  First two cells same as for device pointed in dma-masters.
+  Third cell represents mux value for the request.
+
+required:
+  - compatible
+  - reg
+  - dma-masters
+
+additionalProperties: false
+
+examples:
+  - |
+dma-router@7c {
+  compatible = "nxp,lpc3220-dmamux";
+  reg = <0x7c 0x8>;
+  dma-masters = <>;
+  #dma-cells = <3>;
+};
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index aacccb376c28..79b44addc139 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2384,6 +2384,7 @@ N:lpc18xx
 
 ARM/LPC32XX SOC SUPPORT
 M: Vladimir Zapolskiy 
+M: Piotr Wojtaszczyk 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Maintained
 T: git git://github.com/vzapolskiy/linux-lpc32xx.git
@@ -2396,6 +2397,14 @@ F:   drivers/usb/host/ohci-nxp.c
 F: drivers/watchdog/pnx4008_wdt.c
 N: lpc32xx
 
+LPC32XX DMAMUX SUPPORT
+M:     J.M.B. Downing 
+M: Piotr Wojtaszczyk 
+R: Vladimir Zapolskiy 
+L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
+S: Maintained
+F: Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
+
 ARM/Marvell Dove/MV78xx0/Orion SOC support
 M: Andrew Lunn 
 M: Sebastian Hesselbarth 
-- 
2.25.1



[Patch v5 01/12] dt-bindings: dma: pl08x: Add dma-cells description

2024-06-27 Thread Piotr Wojtaszczyk
Recover dma-cells description from the legacy DT binding.

Signed-off-by: Piotr Wojtaszczyk 
Fixes: 6f64aa5746d2 ("dt-bindings: dma: convert arm-pl08x to yaml")
Reviewed-by: Krzysztof Kozlowski 
---
Changes for v4:
- This patch is new in v4

 Documentation/devicetree/bindings/dma/arm-pl08x.yaml | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/dma/arm-pl08x.yaml 
b/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
index ab25ae63d2c3..191215d36c85 100644
--- a/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
+++ b/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
@@ -52,6 +52,13 @@ properties:
   clock-names:
 maxItems: 1
 
+  "#dma-cells":
+const: 2
+description: |
+  First cell should contain the DMA request,
+  second cell should contain either 1 or 2 depending on
+  which AHB master that is used.
+
   lli-bus-interface-ahb1:
 type: boolean
 description: if AHB master 1 is eligible for fetching LLIs
-- 
2.25.1



[Patch v5 00/12] Add audio support for LPC32XX CPUs

2024-06-27 Thread Piotr Wojtaszczyk
This pach set is to bring back audio to machines with a LPC32XX CPU.
The legacy LPC32XX SoC used to have audio spport in linux 2.6.27.
The support was dropped due to lack of interest from mainaeners.

Piotr Wojtaszczyk (12):
  dt-bindings: dma: pl08x: Add dma-cells description
  dt-bindings: dma: Add lpc32xx DMA mux binding
  ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding
  ARM: dts: lpc32xx: Use simple-mfd for clock control block
  ARM: dts: lpc32xx: Add missing dma properties
  ARM: dts: lpc32xx: Add missing i2s properties
  clk: lpc32xx: initialize regmap using parent syscon
  dmaengine: Add dma router for pl08x in LPC32XX SoC
  ARM: lpc32xx: Remove pl08x platform data in favor for device tree
  mtd: rawnand: lpx32xx: Request DMA channels using DT entries
  ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs
  i2x: pnx: Fix potential deadlock warning from del_timer_sync() call in
isr

 .../devicetree/bindings/dma/arm-pl08x.yaml|   7 +
 .../bindings/dma/nxp,lpc3220-dmamux.yaml  |  49 +++
 .../bindings/sound/nxp,lpc3220-i2s.yaml   |  73 
 MAINTAINERS   |  20 +
 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi|  53 ++-
 arch/arm/mach-lpc32xx/phy3250.c   |  54 ---
 drivers/clk/Kconfig   |   1 +
 drivers/clk/nxp/clk-lpc32xx.c |  26 +-
 drivers/dma/Kconfig   |   9 +
 drivers/dma/Makefile  |   1 +
 drivers/dma/lpc32xx-dmamux.c  | 195 +
 drivers/i2c/busses/i2c-pnx.c  |  48 +--
 drivers/mtd/nand/raw/lpc32xx_mlc.c|  26 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c|  26 +-
 sound/soc/fsl/Kconfig |   7 +
 sound/soc/fsl/Makefile|   2 +
 sound/soc/fsl/lpc3xxx-i2s.c   | 375 ++
 sound/soc/fsl/lpc3xxx-i2s.h   |  79 
 sound/soc/fsl/lpc3xxx-pcm.c   |  72 
 19 files changed, 993 insertions(+), 130 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
 create mode 100644 drivers/dma/lpc32xx-dmamux.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

-- 
2.25.1



Re: [Patch v4 10/10] i2x: pnx: Use threaded irq to fix warning from del_timer_sync()

2024-06-27 Thread Piotr Wojtaszczyk
On Tue, Jun 25, 2024 at 11:12 PM Andi Shyti  wrote:
>
> Hi Piotr,
>
> On Fri, Jun 21, 2024 at 02:08:03PM GMT, Piotr Wojtaszczyk wrote:
> > On Fri, Jun 21, 2024 at 12:57 AM Andi Shyti  wrote:
> > > On Thu, Jun 20, 2024 at 07:56:41PM GMT, Piotr Wojtaszczyk wrote:
> > > > When del_timer_sync() is called in an interrupt context it throws a 
> > > > warning
> > > > because of potential deadlock. Threaded irq handler fixes the potential
> > > > problem.
> > > >
> > > > Signed-off-by: Piotr Wojtaszczyk 
> > >
> > > did you run into a lockdep splat?
> > >
> > > Anything against using del_timer(), instead? Have you tried?
> >
> > I didn't get a lockdep splat but console was flooded with warnings from
> > https://github.com/torvalds/linux/blob/v6.10-rc4/kernel/time/timer.c#L1655
> > In the linux kernel v5.15 I didn't see these warnings.
> >
> > I'm not a maintainer of the driver and I didn't do any research on
> > what kind of impact
> > would have using del_timer() instad. Maybe Vladimir Zapolskiy will know 
> > that.
>
> Your patch is definitely correct, no doubt about that.
>
> And I don't have anything aginast changing irq handlers to
> threaded handlers. But I would be careful at doing that depending
> on the use of the controller and for accepting such change I
> would need an ack from someone who knows the device. Vladimir,
> perhaps?
>
> There are cases where using threaded handlers are not totally
> right, for example when the controller is used at early boot for
> power management handling. I don't think it's the case for this
> driver, but I can't be 100% sure.
>
> If you were able to see the flood of WARN_ON's, would be
> interesting to know how it behaves with del_timer(). Mind
> giving it a test?
>
> Thanks,
> Andi

I took some time to take a closer look at this and it turns out that the
timer is used only to exit from the wait_for_completion(), after each
del_timer_sync() there is a complete() call. So I will remove the timer
all together and replace wait_for_completion() with
wait_for_completion_timeout()


-- 
Piotr Wojtaszczyk
Timesys


Re: [Patch v4 06/10] dmaengine: Add dma router for pl08x in LPC32XX SoC

2024-06-24 Thread Piotr Wojtaszczyk
On Mon, Jun 24, 2024 at 7:39 AM Vinod Koul  wrote:
> Any reason why dmaengine parts cant be sent separately, why are they
> clubbed together, I dont see any obvious dependencies...

The I2S driver depends on the dmaengine parts

> On 20-06-24, 19:56, Piotr Wojtaszczyk wrote:
> > LPC32XX connects few of its peripherals to pl08x DMA thru a multiplexer,
> > this driver allows to route a signal request line thru the multiplexer for
> > given peripheral.
>
> What is the difference b/w this and lpc18xx driver, why not reuse that
> one?

The lpc18xx used the same dma peripheral (pl08x) but the request signal
multiplexer around pl08x is completely different - there are no common parts.

-- 
Piotr Wojtaszczyk
Timesys


Re: [Patch v4 08/10] mtd: rawnand: lpx32xx: Request DMA channels using DT entries

2024-06-21 Thread Piotr Wojtaszczyk
On Fri, Jun 21, 2024 at 10:30 AM Miquel Raynal
 wrote:
>
> Hi Piotr,
>
> piotr.wojtaszc...@timesys.com wrote on Thu, 20 Jun 2024 19:56:39 +0200:
>
> > Move away from pl08x platform data towards device tree.
> >
> > Signed-off-by: Piotr Wojtaszczyk 
>
> I don't see any change regarding the NAND controller node in the device
> tree, is there any dependency with other patches from the same patchset
> or may I apply this directly to nand/next?
>
> Thanks,
> Miquèl

Yes, this patch depends on "[v4,04/10] ARM: dts: lpc32xx: Add missing
dma and i2s properties"
which will be splitted into two or more separate patches per request
in the comments.
I'd like to keep driver changes and corresponding changes in DTS in
the same patch
but I've made a separate patch for DTS per request from v2 of the patch set.

--
Piotr Wojtaszczyk
Timesys


Re: [Patch v4 10/10] i2x: pnx: Use threaded irq to fix warning from del_timer_sync()

2024-06-21 Thread Piotr Wojtaszczyk
Hi Andi,

On Fri, Jun 21, 2024 at 12:57 AM Andi Shyti  wrote:
> On Thu, Jun 20, 2024 at 07:56:41PM GMT, Piotr Wojtaszczyk wrote:
> > When del_timer_sync() is called in an interrupt context it throws a warning
> > because of potential deadlock. Threaded irq handler fixes the potential
> > problem.
> >
> > Signed-off-by: Piotr Wojtaszczyk 
>
> did you run into a lockdep splat?
>
> Anything against using del_timer(), instead? Have you tried?

I didn't get a lockdep splat but console was flooded with warnings from
https://github.com/torvalds/linux/blob/v6.10-rc4/kernel/time/timer.c#L1655
In the linux kernel v5.15 I didn't see these warnings.

I'm not a maintainer of the driver and I didn't do any research on
what kind of impact
would have using del_timer() instad. Maybe Vladimir Zapolskiy will know that.

-- 
Piotr Wojtaszczyk
Timesys


[Patch v4 10/10] i2x: pnx: Use threaded irq to fix warning from del_timer_sync()

2024-06-20 Thread Piotr Wojtaszczyk
When del_timer_sync() is called in an interrupt context it throws a warning
because of potential deadlock. Threaded irq handler fixes the potential
problem.

Signed-off-by: Piotr Wojtaszczyk 
---
 drivers/i2c/busses/i2c-pnx.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/i2c/busses/i2c-pnx.c b/drivers/i2c/busses/i2c-pnx.c
index a12525b3186b..b2ab6fb168bf 100644
--- a/drivers/i2c/busses/i2c-pnx.c
+++ b/drivers/i2c/busses/i2c-pnx.c
@@ -718,8 +718,8 @@ static int i2c_pnx_probe(struct platform_device *pdev)
ret = alg_data->irq;
goto out_clock;
}
-   ret = devm_request_irq(>dev, alg_data->irq, i2c_pnx_interrupt,
-  0, pdev->name, alg_data);
+   ret = devm_request_threaded_irq(>dev, alg_data->irq, NULL, 
i2c_pnx_interrupt,
+   IRQF_ONESHOT, pdev->name, alg_data);
if (ret)
goto out_clock;
 
-- 
2.25.1



[Patch v4 09/10] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-20 Thread Piotr Wojtaszczyk
This driver was ported from an old version in linux 2.6.27 and adjusted
for the new ASoC framework and DMA API.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- Add to MAINTAINERS
- Use guard(mutex)(_info_p->lock) when possible
- Request dma chennels using DT entries in devm_snd_dmaengine_pcm_register

Changes for v3:
- Split previous commit for separate subsystems
- Add support and  as a maintainer for the driver
- Replaced `SND_SOC` config dependency with COMPILE_TEST
- Moved `snd-soc-fsl-lpc3xxx-y` in Makefile up in the list to maintain 
alfabedical order
- Changed comment to c++ format
- replaced custom absd32() with standard abs() function
- Added clock provider check in lpc3xxx_i2s_set_dai_fmt()
- Removed empty lpc32xx_i2s_remove() function
- Reworked i2s regs definitions to include LPC3XXX prefix
- Replaced custom _BIT, _SBD with standard BIT and FIELD_PREP macros

Changes for v2:
- Coding Style cleanup
- Use dev_err_probe() for error handling in probe function
- Removed unneded err_clk_disable label
- Removed empty function
- Droped of_match_ptr in lpc32xx_i2s_match DT match table
- ASoC struct adjustmes for the latest 6.10-rc3 kernel

 MAINTAINERS |   1 +
 sound/soc/fsl/Kconfig   |   7 +
 sound/soc/fsl/Makefile  |   2 +
 sound/soc/fsl/lpc3xxx-i2s.c | 376 
 sound/soc/fsl/lpc3xxx-i2s.h |  79 
 sound/soc/fsl/lpc3xxx-pcm.c |  73 +++
 6 files changed, 538 insertions(+)
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

diff --git a/MAINTAINERS b/MAINTAINERS
index 5ffe988ee282..2705f48c967d 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8927,6 +8927,7 @@ L:alsa-de...@alsa-project.org (moderated for 
non-subscribers)
 L: linuxppc-dev@lists.ozlabs.org
 S: Maintained
 F: Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
+F: sound/soc/fsl/lpc3xxx-*
 N: lpc32xx
 
 FREESCALE SOC SOUND QMC DRIVER
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index 270726c134b3..72f2d4d15696 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -130,6 +130,13 @@ config SND_SOC_FSL_RPMSG
  This option is only useful for out-of-tree drivers since
  in-tree drivers select it automatically.
 
+config SND_SOC_FSL_LPC3XXX
+   tristate "SoC Audio for NXP LPC32XX CPUs"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   select SND_SOC_GENERIC_DMAENGINE_PCM
+   help
+ Say Y or M if you want to add support for the LPC3XXX I2S interface.
+
 config SND_SOC_IMX_PCM_DMA
tristate
select SND_SOC_GENERIC_DMAENGINE_PCM
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile
index 2fe78eed3a48..2a61e2f96438 100644
--- a/sound/soc/fsl/Makefile
+++ b/sound/soc/fsl/Makefile
@@ -11,6 +11,7 @@ obj-$(CONFIG_SND_SOC_P1022_RDK) += snd-soc-p1022-rdk.o
 snd-soc-fsl-audmix-y := fsl_audmix.o
 snd-soc-fsl-asoc-card-y := fsl-asoc-card.o
 snd-soc-fsl-asrc-y := fsl_asrc.o fsl_asrc_dma.o
+snd-soc-fsl-lpc3xxx-y := lpc3xxx-pcm.o lpc3xxx-i2s.o
 snd-soc-fsl-sai-y := fsl_sai.o
 snd-soc-fsl-ssi-y := fsl_ssi.o
 snd-soc-fsl-ssi-$(CONFIG_DEBUG_FS) += fsl_ssi_dbg.o
@@ -29,6 +30,7 @@ snd-soc-fsl-qmc-audio-y := fsl_qmc_audio.o
 obj-$(CONFIG_SND_SOC_FSL_AUDMIX) += snd-soc-fsl-audmix.o
 obj-$(CONFIG_SND_SOC_FSL_ASOC_CARD) += snd-soc-fsl-asoc-card.o
 obj-$(CONFIG_SND_SOC_FSL_ASRC) += snd-soc-fsl-asrc.o
+obj-$(CONFIG_SND_SOC_FSL_LPC3XXX) += snd-soc-fsl-lpc3xxx.o
 obj-$(CONFIG_SND_SOC_FSL_SAI) += snd-soc-fsl-sai.o
 obj-$(CONFIG_SND_SOC_FSL_SSI) += snd-soc-fsl-ssi.o
 obj-$(CONFIG_SND_SOC_FSL_SPDIF) += snd-soc-fsl-spdif.o
diff --git a/sound/soc/fsl/lpc3xxx-i2s.c b/sound/soc/fsl/lpc3xxx-i2s.c
new file mode 100644
index ..7fdba451c643
--- /dev/null
+++ b/sound/soc/fsl/lpc3xxx-i2s.c
@@ -0,0 +1,376 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Author: Kevin Wells 
+//
+// Copyright (C) 2008 NXP Semiconductors
+// Copyright 2023 Timesys Corporation 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "lpc3xxx-i2s.h"
+
+#define I2S_PLAYBACK_FLAG 0x1
+#define I2S_CAPTURE_FLAG 0x2
+
+#define LPC3XXX_I2S_RATES ( \
+   SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
+   SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
+   SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
+
+#define LPC3XXX_I2S_FORMATS ( \
+   SNDRV_PCM_FMTBIT_S8 | \
+   SNDRV_PCM_FMTBIT_S16_LE | \
+   SNDRV_PCM_FMTBIT_S32_LE)
+
+static void __lpc3xxx_find_clkdiv(u32 *clkx, u32 *clky, int freq, int xbytes, 
u32 clkrate)
+{
+   u32 i2srate;
+   u32 idxx, idyy;
+   u32 savedbitclkrate, diff, trate, baseclk;
+
+   /* Adjust rate for sample size (bits) and 2 channels and offset for
+* divider in clock output
+*/
+   i2srate = (freq /

[Patch v4 08/10] mtd: rawnand: lpx32xx: Request DMA channels using DT entries

2024-06-20 Thread Piotr Wojtaszczyk
Move away from pl08x platform data towards device tree.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 drivers/mtd/nand/raw/lpc32xx_mlc.c | 10 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c | 10 +-
 2 files changed, 2 insertions(+), 18 deletions(-)

diff --git a/drivers/mtd/nand/raw/lpc32xx_mlc.c 
b/drivers/mtd/nand/raw/lpc32xx_mlc.c
index 677fcb03f9be..e504e3c5af11 100644
--- a/drivers/mtd/nand/raw/lpc32xx_mlc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_mlc.c
@@ -574,15 +574,7 @@ static int lpc32xx_dma_setup(struct lpc32xx_nand_host 
*host)
struct mtd_info *mtd = nand_to_mtd(>nand_chip);
dma_cap_mask_t mask;
 
-   if (!host->pdata || !host->pdata->dma_filter) {
-   dev_err(mtd->dev.parent, "no DMA platform data\n");
-   return -ENOENT;
-   }
-
-   dma_cap_zero(mask);
-   dma_cap_set(DMA_SLAVE, mask);
-   host->dma_chan = dma_request_channel(mask, host->pdata->dma_filter,
-"nand-mlc");
+   host->dma_chan = dma_request_chan(mtd->dev.parent, "rx-tx");
if (!host->dma_chan) {
dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
return -EBUSY;
diff --git a/drivers/mtd/nand/raw/lpc32xx_slc.c 
b/drivers/mtd/nand/raw/lpc32xx_slc.c
index 1c5fa855b9f2..f83a31411bde 100644
--- a/drivers/mtd/nand/raw/lpc32xx_slc.c
+++ b/drivers/mtd/nand/raw/lpc32xx_slc.c
@@ -721,15 +721,7 @@ static int lpc32xx_nand_dma_setup(struct lpc32xx_nand_host 
*host)
struct mtd_info *mtd = nand_to_mtd(>nand_chip);
dma_cap_mask_t mask;
 
-   if (!host->pdata || !host->pdata->dma_filter) {
-   dev_err(mtd->dev.parent, "no DMA platform data\n");
-   return -ENOENT;
-   }
-
-   dma_cap_zero(mask);
-   dma_cap_set(DMA_SLAVE, mask);
-   host->dma_chan = dma_request_channel(mask, host->pdata->dma_filter,
-"nand-slc");
+   host->dma_chan = dma_request_chan(mtd->dev.parent, "rx-tx");
if (!host->dma_chan) {
dev_err(mtd->dev.parent, "Failed to request DMA channel\n");
return -EBUSY;
-- 
2.25.1



[Patch v4 07/10] ARM: lpc32xx: Remove pl08x platform data in favor for device tree

2024-06-20 Thread Piotr Wojtaszczyk
With the driver for nxp,lpc3220-dmamux we can remove the pl08x platform
data and let pl08x driver to create peripheral channels from the DT
properties.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 arch/arm/mach-lpc32xx/phy3250.c | 54 -
 1 file changed, 54 deletions(-)

diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c
index 66701bf43248..0c7797a0e44e 100644
--- a/arch/arm/mach-lpc32xx/phy3250.c
+++ b/arch/arm/mach-lpc32xx/phy3250.c
@@ -16,64 +16,10 @@
 #include 
 #include "common.h"
 
-static struct pl08x_channel_data pl08x_slave_channels[] = {
-   {
-   .bus_id = "nand-slc",
-   .min_signal = 1, /* SLC NAND Flash */
-   .max_signal = 1,
-   .periph_buses = PL08X_AHB1,
-   },
-   {
-   .bus_id = "nand-mlc",
-   .min_signal = 12, /* MLC NAND Flash */
-   .max_signal = 12,
-   .periph_buses = PL08X_AHB1,
-   },
-};
-
-static int pl08x_get_signal(const struct pl08x_channel_data *cd)
-{
-   return cd->min_signal;
-}
-
-static void pl08x_put_signal(const struct pl08x_channel_data *cd, int ch)
-{
-}
-
-static struct pl08x_platform_data pl08x_pd = {
-   /* Some reasonable memcpy defaults */
-   .memcpy_burst_size = PL08X_BURST_SZ_256,
-   .memcpy_bus_width = PL08X_BUS_WIDTH_32_BITS,
-   .slave_channels = _slave_channels[0],
-   .num_slave_channels = ARRAY_SIZE(pl08x_slave_channels),
-   .get_xfer_signal = pl08x_get_signal,
-   .put_xfer_signal = pl08x_put_signal,
-   .lli_buses = PL08X_AHB1,
-   .mem_buses = PL08X_AHB1,
-};
-
-static struct lpc32xx_slc_platform_data lpc32xx_slc_data = {
-   .dma_filter = pl08x_filter_id,
-};
-
-static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = {
-   .dma_filter = pl08x_filter_id,
-};
-
-static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
-   OF_DEV_AUXDATA("arm,pl080", 0x3100, "pl08xdmac", _pd),
-   OF_DEV_AUXDATA("nxp,lpc3220-slc", 0x2002, "2002.flash",
-  _slc_data),
-   OF_DEV_AUXDATA("nxp,lpc3220-mlc", 0x200a8000, "200a8000.flash",
-  _mlc_data),
-   { }
-};
-
 static void __init lpc3250_machine_init(void)
 {
lpc32xx_serial_init();
 
-   of_platform_default_populate(NULL, lpc32xx_auxdata_lookup, NULL);
 }
 
 static const char *const lpc32xx_dt_compat[] __initconst = {
-- 
2.25.1



[Patch v4 06/10] dmaengine: Add dma router for pl08x in LPC32XX SoC

2024-06-20 Thread Piotr Wojtaszczyk
LPC32XX connects few of its peripherals to pl08x DMA thru a multiplexer,
this driver allows to route a signal request line thru the multiplexer for
given peripheral.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 MAINTAINERS  |   1 +
 drivers/dma/Kconfig  |   9 ++
 drivers/dma/Makefile |   1 +
 drivers/dma/lpc32xx-dmamux.c | 195 +++
 4 files changed, 206 insertions(+)
 create mode 100644 drivers/dma/lpc32xx-dmamux.c

diff --git a/MAINTAINERS b/MAINTAINERS
index fadf1baafd89..5ffe988ee282 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2403,6 +2403,7 @@ R:Vladimir Zapolskiy 
 L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
 S: Maintained
 F: Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
+F: drivers/dma/lpc32xx-dmamux.c
 N: lpc32xx
 
 ARM/Marvell Dove/MV78xx0/Orion SOC support
diff --git a/drivers/dma/Kconfig b/drivers/dma/Kconfig
index 002a5ec80620..aeace3d7e066 100644
--- a/drivers/dma/Kconfig
+++ b/drivers/dma/Kconfig
@@ -378,6 +378,15 @@ config LPC18XX_DMAMUX
  Enable support for DMA on NXP LPC18xx/43xx platforms
  with PL080 and multiplexed DMA request lines.
 
+config LPC32XX_DMAMUX
+   bool "NXP LPC32xx DMA MUX for PL080"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   depends on OF && AMBA_PL08X
+   select MFD_SYSCON
+   help
+ Support for PL080 multiplexed DMA request lines on
+ LPC32XX platrofm.
+
 config LS2X_APB_DMA
tristate "Loongson LS2X APB DMA support"
depends on LOONGARCH || COMPILE_TEST
diff --git a/drivers/dma/Makefile b/drivers/dma/Makefile
index 802ca916f05f..6f1350b62e7f 100644
--- a/drivers/dma/Makefile
+++ b/drivers/dma/Makefile
@@ -50,6 +50,7 @@ obj-$(CONFIG_INTEL_IOATDMA) += ioat/
 obj-y += idxd/
 obj-$(CONFIG_K3_DMA) += k3dma.o
 obj-$(CONFIG_LPC18XX_DMAMUX) += lpc18xx-dmamux.o
+obj-$(CONFIG_LPC32XX_DMAMUX) += lpc32xx-dmamux.o
 obj-$(CONFIG_LS2X_APB_DMA) += ls2x-apb-dma.o
 obj-$(CONFIG_MILBEAUT_HDMAC) += milbeaut-hdmac.o
 obj-$(CONFIG_MILBEAUT_XDMAC) += milbeaut-xdmac.o
diff --git a/drivers/dma/lpc32xx-dmamux.c b/drivers/dma/lpc32xx-dmamux.c
new file mode 100644
index ..4e6ce6026164
--- /dev/null
+++ b/drivers/dma/lpc32xx-dmamux.c
@@ -0,0 +1,195 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Copyright 2024 Timesys Corporation 
+//
+// Based on TI DMA Crossbar driver by:
+//   Copyright (C) 2015 Texas Instruments Incorporated - http://www.ti.com
+//   Author: Peter Ujfalusi 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define LPC32XX_SSP_CLK_CTRL 0x78
+#define LPC32XX_I2S_CLK_CTRL 0x7c
+
+struct lpc32xx_dmamux {
+   int signal;
+   char *name_sel0;
+   char *name_sel1;
+   int muxval;
+   int muxreg;
+   int bit;
+   bool busy;
+};
+
+/* From LPC32x0 User manual "3.2.1 DMA request signals" */
+static struct lpc32xx_dmamux lpc32xx_muxes[] = {
+   {
+   .signal = 3,
+   .name_sel0 = "spi2-rx-tx",
+   .name_sel1 = "ssp1-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 5,
+   },
+   {
+   .signal = 10,
+   .name_sel0 = "uart7-rx",
+   .name_sel1 = "i2s1-dma1",
+   .muxreg = LPC32XX_I2S_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 11,
+   .name_sel0 = "spi1-rx-tx",
+   .name_sel1 = "ssp1-tx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 4,
+   },
+   {
+   .signal = 14,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-rx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 3,
+   },
+   {
+   .signal = 15,
+   .name_sel0 = "none",
+   .name_sel1 = "ssp0-tx",
+   .muxreg = LPC32XX_SSP_CLK_CTRL,
+   .bit = 2,
+   },
+};
+
+struct lpc32xx_dmamux_data {
+   struct dma_router dmarouter;
+   struct regmap *reg;
+   spinlock_t lock; /* protects busy status flag */
+};
+
+static void lpc32xx_dmamux_release(struct device *dev, void *route_data)
+{
+   struct lpc32xx_dmamux_data *dmamux = dev_get_drvdata(dev);
+   struct lpc32xx_dmamux *mux = route_data;
+   unsigned long flags;
+
+   dev_dbg(dev, "releasing dma request signal %d routed to %s\n",
+   mux->signal, mux->muxval ? mux->name_sel1 : mux->name_sel1);
+
+   guard(spinlock)(>lock);
+
+   mux->busy = false;
+}
+
+static void *lpc32xx_dmamux_reserve(struct of_phandle_args *dma_spec,
+   struct of_dma *ofdma)
+{
+   struc

[Patch v4 05/10] clk: lpc32xx: initialize regmap using parent syscon

2024-06-20 Thread Piotr Wojtaszczyk
This allows to share the regmap with other simple-mfd devices like
nxp,lpc32xx-dmamux

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 drivers/clk/Kconfig   |  1 +
 drivers/clk/nxp/clk-lpc32xx.c | 10 ++
 2 files changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/clk/Kconfig b/drivers/clk/Kconfig
index 3e9099504fad..85ef57d5cccf 100644
--- a/drivers/clk/Kconfig
+++ b/drivers/clk/Kconfig
@@ -346,6 +346,7 @@ config COMMON_CLK_LOONGSON2
 config COMMON_CLK_NXP
def_bool COMMON_CLK && (ARCH_LPC18XX || ARCH_LPC32XX)
select REGMAP_MMIO if ARCH_LPC32XX
+   select MFD_SYSCON if ARCH_LPC32XX
select MFD_SYSCON if ARCH_LPC18XX
help
  Support for clock providers on NXP platforms.
diff --git a/drivers/clk/nxp/clk-lpc32xx.c b/drivers/clk/nxp/clk-lpc32xx.c
index d0f870eff0d6..2a183a9ded93 100644
--- a/drivers/clk/nxp/clk-lpc32xx.c
+++ b/drivers/clk/nxp/clk-lpc32xx.c
@@ -7,6 +7,7 @@
 #include 
 #include 
 #include 
+#include 
 #include 
 
 #include 
@@ -1511,17 +1512,10 @@ static void __init lpc32xx_clk_init(struct device_node 
*np)
return;
}
 
-   base = of_iomap(np, 0);
-   if (!base) {
-   pr_err("failed to map system control block registers\n");
-   return;
-   }
-
-   clk_regmap = regmap_init_mmio(NULL, base, _scb_regmap_config);
+   clk_regmap = syscon_node_to_regmap(np->parent);
if (IS_ERR(clk_regmap)) {
pr_err("failed to regmap system control block: %ld\n",
PTR_ERR(clk_regmap));
-   iounmap(base);
return;
}
 
-- 
2.25.1



[Patch v4 04/10] ARM: dts: lpc32xx: Add missing dma and i2s properties

2024-06-20 Thread Piotr Wojtaszczyk
Adds properties declared in the new DT bindings:
 - nxp,lpc3220-i2s.yaml
 - nxp,lpc3220-dmamux.yaml
for dma router/mux and I2S interface.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is renamed from
  "ARM: dts: lpc32xx: Add missing properties for the i2s interfaces"
  to describe dma changes as well
- Added dmas and dma-names properties in to all node which have dma request 
signals
- Add bus properties to pl08x dma node since they are removed from platform 
data in phy3250.c
- Put clock-controller@0 and dma-router@7c under the same syscon, simple-mfd 
device

Changes for v3:
- Split previous commit for separate subsystems
- Add properties to match dt binding

 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi | 53 +++---
 1 file changed, 48 insertions(+), 5 deletions(-)

diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 974410918f35..c58dc127e59f 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -67,6 +67,8 @@ slc: flash@2002 {
reg = <0x2002 0x1000>;
clocks = < LPC32XX_CLK_SLC>;
status = "disabled";
+   dmas = < 1 1>;
+   dma-names = "rx-tx";
};
 
mlc: flash@200a8000 {
@@ -75,6 +77,8 @@ mlc: flash@200a8000 {
interrupts = <11 IRQ_TYPE_LEVEL_HIGH>;
clocks = < LPC32XX_CLK_MLC>;
status = "disabled";
+   dmas = < 12 1>;
+   dma-names = "rx-tx";
};
 
dma: dma@3100 {
@@ -83,6 +87,13 @@ dma: dma@3100 {
interrupts = <28 IRQ_TYPE_LEVEL_HIGH>;
clocks = < LPC32XX_CLK_DMA>;
clock-names = "apb_pclk";
+   #dma-cells = <2>;
+   dma-channels = <8>;
+   dma-requests = <16>;
+   lli-bus-interface-ahb1;
+   mem-bus-interface-ahb1;
+   memcpy-burst-size = <256>;
+   memcpy-bus-width = <32>;
};
 
usb {
@@ -182,6 +193,8 @@ ssp0: spi@20084000 {
clock-names = "apb_pclk";
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 14 1 1>, < 15 1 1>;
+   dma-names = "rx", "tx";
status = "disabled";
};
 
@@ -191,6 +204,8 @@ spi1: spi@20088000 {
clocks = < LPC32XX_CLK_SPI1>;
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 11 1 0>;
+   dma-names = "rx-tx";
status = "disabled";
};
 
@@ -206,6 +221,8 @@ ssp1: spi@2008c000 {
clock-names = "apb_pclk";
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 3 1 1>, < 11 1 1>;
+   dma-names = "rx", "tx";
status = "disabled";
};
 
@@ -215,12 +232,19 @@ spi2: spi@2009 {
clocks = < LPC32XX_CLK_SPI2>;
#address-cells = <1>;
#size-cells = <0>;
+   dmas = < 3 1 0>;
+   dma-names = "rx-tx";
status = "disabled";
};
 
i2s0: i2s@20094000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x20094000 0x1000>;
+   interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+   clocks = < LPC32XX_CLK_I2S0>;
+   dmas = < 0 1>, < 13 1>;
+   dma-names = "rx", "tx";
+   #sound-dai-cells = <0>;
status = "disabled";
};
 
@@ -231,12 +255,19 @@ sd: sd@20098000 {
 <13 IRQ_TYPE_LEVEL_HIGH>;
 

[Patch v4 03/10] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-20 Thread Piotr Wojtaszczyk
Add nxp,lpc3220-i2s DT binding documentation.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- Custom dma-vc-names property with standard dmas and dma-names
- Added to MAINTAINERS

Changes for v3:
- Added '$ref: dai-common.yaml#' and '#sound-dai-cells'
- Dropped all clock-names, references
- Dropped status property from the example
- Added interrupts property
- 'make dt_binding_check' pass

Changes for v2:
- Added maintainers field
- Dropped clock-names
- Dropped unused unneded interrupts field

 .../bindings/sound/nxp,lpc3220-i2s.yaml   | 73 +++
 MAINTAINERS   | 10 +++
 2 files changed, 83 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml

diff --git a/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml 
b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
new file mode 100644
index ..40a0877a8aba
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
@@ -0,0 +1,73 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/nxp,lpc3220-i2s.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP LPC32XX I2S Controller
+
+description:
+  The I2S controller in LPC32XX SoCs, ASoC DAI.
+
+maintainers:
+  - J.M.B. Downing 
+  - Piotr Wojtaszczyk 
+
+allOf:
+  - $ref: dai-common.yaml#
+
+properties:
+  compatible:
+enum:
+  - nxp,lpc3220-i2s
+
+  reg:
+maxItems: 1
+
+  interrupts:
+maxItems: 1
+
+  clocks:
+items:
+  - description: input clock of the peripheral.
+
+  dmas:
+items:
+  - description: RX DMA Channel
+  - description: TX DMA Channel
+
+  dma-names:
+items:
+  - const: rx
+  - const: tx
+
+  "#sound-dai-cells":
+const: 0
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - dmas
+  - dma-names
+  - '#sound-dai-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+i2s@20094000 {
+  compatible = "nxp,lpc3220-i2s";
+  reg = <0x20094000 0x1000>;
+  interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+  clocks = < LPC32XX_CLK_I2S0>;
+  dmas = < 0 1>, < 13 1>;
+  dma-names = "rx", "tx";
+  #sound-dai-cells = <0>;
+};
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index f7adf9f66dfa..fadf1baafd89 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8918,6 +8918,16 @@ S:   Maintained
 F: sound/soc/fsl/fsl*
 F: sound/soc/fsl/imx*
 
+FREESCALE SOC LPC32XX SOUND DRIVERS
+M: J.M.B. Downing 
+M: Piotr Wojtaszczyk 
+R: Vladimir Zapolskiy 
+L: alsa-de...@alsa-project.org (moderated for non-subscribers)
+L: linuxppc-dev@lists.ozlabs.org
+S: Maintained
+F: Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
+N: lpc32xx
+
 FREESCALE SOC SOUND QMC DRIVER
 M: Herve Codina 
 L: alsa-de...@alsa-project.org (moderated for non-subscribers)
-- 
2.25.1



[Patch v4 02/10] dt-bindings: dma: Add lpc32xx DMA mux binding

2024-06-20 Thread Piotr Wojtaszczyk
LPC32XX SoCs use pl080 dma controller which have few request signals
multiplexed between peripherals. This binding describes how devices can
use the multiplexed request signals.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 .../bindings/dma/nxp,lpc3220-dmamux.yaml  | 56 +++
 MAINTAINERS   |  9 +++
 2 files changed, 65 insertions(+)
 create mode 100644 
Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml

diff --git a/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml 
b/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
new file mode 100644
index ..a5384b6c67fc
--- /dev/null
+++ b/Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
@@ -0,0 +1,56 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/dma/nxp,lpc3220-dmamux.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: DMA multiplexer for LPC32XX SoC (DMA request router)
+
+maintainers:
+  - J.M.B. Downing 
+  - Piotr Wojtaszczyk 
+
+allOf:
+  - $ref: dma-router.yaml#
+
+properties:
+  "#dma-cells":
+const: 3
+description: |
+  First two cells same as for device pointed in dma-masters.
+  Third cell represents mux value for the request.
+
+  compatible:
+const: nxp,lpc3220-dmamux
+
+  dma-masters:
+description: phandle to a dma node compatible with arm,pl080
+
+  reg:
+maxItems: 1
+
+required:
+  - compatible
+  - reg
+  - dma-masters
+
+additionalProperties: false
+
+examples:
+  - |
+syscon@40004000 {
+  compatible = "nxp,lpc3220-creg", "syscon", "simple-mfd";
+  reg = <0x40004000 0x114>;
+  ranges = <0 0x40004000 0x114>;
+  #address-cells = <1>;
+  #size-cells = <1>;
+
+  dma-router@7c {
+compatible = "nxp,lpc3220-dmamux";
+reg = <0x7c 0x8>;
+#dma-cells = <3>;
+dma-masters = <>;
+  };
+};
+
+...
diff --git a/MAINTAINERS b/MAINTAINERS
index aacccb376c28..f7adf9f66dfa 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -2396,6 +2396,15 @@ F:   drivers/usb/host/ohci-nxp.c
 F: drivers/watchdog/pnx4008_wdt.c
 N: lpc32xx
 
+ARM/LPC32XX DMAMUX SUPPORT
+M: J.M.B. Downing 
+M: Piotr Wojtaszczyk 
+R: Vladimir Zapolskiy 
+L: linux-arm-ker...@lists.infradead.org (moderated for non-subscribers)
+S: Maintained
+F: Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
+N: lpc32xx
+
 ARM/Marvell Dove/MV78xx0/Orion SOC support
 M: Andrew Lunn 
 M: Sebastian Hesselbarth 
-- 
2.25.1



[Patch v4 01/10] dt-bindings: dma: pl08x: Add dma-cells description

2024-06-20 Thread Piotr Wojtaszczyk
Recover dma-cells description from the legacy DT binding.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v4:
- This patch is new in v4

 Documentation/devicetree/bindings/dma/arm-pl08x.yaml | 7 +++
 1 file changed, 7 insertions(+)

diff --git a/Documentation/devicetree/bindings/dma/arm-pl08x.yaml 
b/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
index ab25ae63d2c3..191215d36c85 100644
--- a/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
+++ b/Documentation/devicetree/bindings/dma/arm-pl08x.yaml
@@ -52,6 +52,13 @@ properties:
   clock-names:
 maxItems: 1
 
+  "#dma-cells":
+const: 2
+description: |
+  First cell should contain the DMA request,
+  second cell should contain either 1 or 2 depending on
+  which AHB master that is used.
+
   lli-bus-interface-ahb1:
 type: boolean
 description: if AHB master 1 is eligible for fetching LLIs
-- 
2.25.1



[Patch v4 00/10] Add audio support for LPC32XX CPUs

2024-06-20 Thread Piotr Wojtaszczyk
This pach set is to bring back audio to machines with a LPC32XX CPU.
The legacy LPC32XX SoC used to have audio spport in linux 2.6.27.
The support was dropped due to lack of interest from mainaeners.

Piotr Wojtaszczyk (10):
  dt-bindings: dma: pl08x: Add dma-cells description
  dt-bindings: dma: Add lpc32xx DMA mux binding
  ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding
  ARM: dts: lpc32xx: Add missing dma and i2s properties
  clk: lpc32xx: initialize regmap using parent syscon
  dmaengine: Add dma router for pl08x in LPC32XX SoC
  ARM: lpc32xx: Remove pl08x platform data in favor for device tree
  mtd: rawnand: lpx32xx: Request DMA channels using DT entries
  ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs
  i2x: pnx: Use threaded irq to fix warning from del_timer_sync()

 .../devicetree/bindings/dma/arm-pl08x.yaml|   7 +
 .../bindings/dma/nxp,lpc3220-dmamux.yaml  |  56 +++
 .../bindings/sound/nxp,lpc3220-i2s.yaml   |  73 
 MAINTAINERS   |  21 +
 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi|  53 ++-
 arch/arm/mach-lpc32xx/phy3250.c   |  54 ---
 drivers/clk/Kconfig   |   1 +
 drivers/clk/nxp/clk-lpc32xx.c |  10 +-
 drivers/dma/Kconfig   |   9 +
 drivers/dma/Makefile  |   1 +
 drivers/dma/lpc32xx-dmamux.c  | 195 +
 drivers/i2c/busses/i2c-pnx.c  |   4 +-
 drivers/mtd/nand/raw/lpc32xx_mlc.c|  10 +-
 drivers/mtd/nand/raw/lpc32xx_slc.c|  10 +-
 sound/soc/fsl/Kconfig |   7 +
 sound/soc/fsl/Makefile|   2 +
 sound/soc/fsl/lpc3xxx-i2s.c   | 376 ++
 sound/soc/fsl/lpc3xxx-i2s.h   |  79 
 sound/soc/fsl/lpc3xxx-pcm.c   |  73 
 19 files changed, 954 insertions(+), 87 deletions(-)
 create mode 100644 
Documentation/devicetree/bindings/dma/nxp,lpc3220-dmamux.yaml
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
 create mode 100644 drivers/dma/lpc32xx-dmamux.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

-- 
2.25.1



Re: [PATCH v3 4/4] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-18 Thread Piotr Wojtaszczyk
On Mon, Jun 17, 2024 at 9:30 PM Markus Elfring  wrote:
> Would you become interested to apply a statement like 
> “guard(mutex)(_info_p->lock);”?
> https://elixir.bootlin.com/linux/v6.10-rc4/source/include/linux/mutex.h#L196

I take it. Thanks.


-- 
Piotr Wojtaszczyk
Timesys


Re: [PATCH v3 1/4] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-17 Thread Piotr Wojtaszczyk
On Mon, Jun 17, 2024 at 5:48 PM Krzysztof Kozlowski  wrote:
>
> On 17/06/2024 16:04, Piotr Wojtaszczyk wrote:
> >>
> >>> It's used by snd_soc_dai_init_dma_data() in [PATCH v3 4/4] to give the
> >>> dmaengine a
> >>> hint which dma config to use. The LPC32xx doesn't have yet a dmamux 
> >>> driver like
> >>
> >> and if I change driver platform data to foo and bar, does the DTS work? No.
> >
> > They shouldn't change the same way as expected dma-names shouldn't change.
> > Lots of drivers expect the dma-names to be "rx", "tx"
> >
> >>
> >>> lpc18xx-dmamux.c therefore it still uses platform data entries for
> >>> pl08x dma channels
> >>> and 'SND_DMAENGINE_PCM_FLAG_NO_DT | SND_DMAENGINE_PCM_FLAG_COMPAT'
> >>> flags in the devm_snd_dmaengine_pcm_register().
> >>> Typically instead of this platform data you would use regular 'dma'
> >>> and 'dma-names' if it had
> >>> proper dmamux driver like lpc18xx-dmamux.c
> >>
> >> Exactly. Use these.
> >
> > Then I need to write a lpc32xx dma mux driver, device tree binding for
> > it and adjust the
> > LPC32xx I2S driver for it. Is this a hard requirement to accept this
> > patch set for the
> > legacy LPC32xx SoC?
>
> I do not see at all analogy with dma-names. dma-names are used ONLY by
> the consumer to pick up proper property "dmas" from DT. They are not
> passed to DMA code. They are not used to configure DMA provider at all.
>
> You parse string from DT and pass it further as DMA filtering code. This
> is abuse of hardware description for programming your driver and their
> dependencies.
>
> Why you cannot hard-code them?
>
> Sorry, to be clear: NAK

That's fine, clear answers are always good.
I considered to hardcode this as it was in the first version of the patch set
but LPC32XX has two I2S interfaces which use different DMA signals
and mux settings and I really didn't want to pick the virtual DMA channel
name based on hardcoded I2S node name therefore I thought having a DT
property to select proper dma channel is a better solution.

-- 
Piotr Wojtaszczyk
Timesys


Re: [PATCH v3 1/4] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-17 Thread Piotr Wojtaszczyk
On Mon, Jun 17, 2024 at 2:14 PM Krzysztof Kozlowski  wrote:
>
> On 17/06/2024 11:33, Piotr Wojtaszczyk wrote:
> > On Sat, Jun 15, 2024 at 12:01 PM Krzysztof Kozlowski  
> > wrote:
> >> Do not attach (thread) your patchsets to some other threads (unrelated
> >> or older versions). This buries them deep in the mailbox and might
> >> interfere with applying entire sets.
> >
> > I'm sorry about that, it won't happen again.
> >
> >>> +  dma-vc-names:
> >>
> >> Missing vendor prefix... but I don't really get what's the point of this
> >> property.
> >
> > Is "nxp,lpc3xxx-dma-vc-names" acceptable?
>
> No, because it does not help me to understand:
> " what's the point of this property."
>
> >
> >>
> >>> +$ref: /schemas/types.yaml#/definitions/string-array
> >>> +description: |
> >>> +  names of virtual pl08x dma channels for tx and rx
> >>> +  directions in this order.
> >>> +minItems: 2
> >>> +maxItems: 2
> >>
> >> What part of hardware or board configuration this represents?
> >>
> >> It wasn't here and nothing in changelog explained it.
> >
> > That's information which DMA signal and mux setting an I2S interface uses.
> > It's a name (bus_id field) of platform data entry from phy3250.c in
> > [PATCH v3 3/4].
>
> platform entries from driver do not seem related at all to hardware
> description. You know encode driver model into bindings, so obviously no-go.

In this case platform entries do exactly that, they define which dma
signal number is
routed to peripherals in LPC32xx. They describe hardware capabilities
of the pl08x dma
and which AHB bus the dma is connected to. This was carried over from
linux versions
before DT was introduced.

>
> > It's used by snd_soc_dai_init_dma_data() in [PATCH v3 4/4] to give the
> > dmaengine a
> > hint which dma config to use. The LPC32xx doesn't have yet a dmamux driver 
> > like
>
> and if I change driver platform data to foo and bar, does the DTS work? No.

They shouldn't change the same way as expected dma-names shouldn't change.
Lots of drivers expect the dma-names to be "rx", "tx"

>
> > lpc18xx-dmamux.c therefore it still uses platform data entries for
> > pl08x dma channels
> > and 'SND_DMAENGINE_PCM_FLAG_NO_DT | SND_DMAENGINE_PCM_FLAG_COMPAT'
> > flags in the devm_snd_dmaengine_pcm_register().
> > Typically instead of this platform data you would use regular 'dma'
> > and 'dma-names' if it had
> > proper dmamux driver like lpc18xx-dmamux.c
>
> Exactly. Use these.

Then I need to write a lpc32xx dma mux driver, device tree binding for
it and adjust the
LPC32xx I2S driver for it. Is this a hard requirement to accept this
patch set for the
legacy LPC32xx SoC?

>
> >
> >>
> >> Drop.
> >>
> >>
> >>> +
> >>> +  "#sound-dai-cells":
> >>> +const: 0
> >>> +
> >
> > The "dai-common.yam" doesn't declare a default value for this so
>
> Where is my comment to which you refer to? Please do not drop context
> from replies. I have no clue what you want to discuss here.
Well I didn't remove the context, you said:
"
Drop.
(...)
+  "#sound-dai-cells":
+const: 0
"
So I'm confused whether the "#sound-dai-cells" should be in the dt
binding or not.

-- 
Piotr Wojtaszczyk
Timesys


Re: [PATCH v3 1/4] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-17 Thread Piotr Wojtaszczyk
On Sat, Jun 15, 2024 at 12:01 PM Krzysztof Kozlowski  wrote:
> Do not attach (thread) your patchsets to some other threads (unrelated
> or older versions). This buries them deep in the mailbox and might
> interfere with applying entire sets.

I'm sorry about that, it won't happen again.

> > +  dma-vc-names:
>
> Missing vendor prefix... but I don't really get what's the point of this
> property.

Is "nxp,lpc3xxx-dma-vc-names" acceptable?

>
> > +$ref: /schemas/types.yaml#/definitions/string-array
> > +description: |
> > +  names of virtual pl08x dma channels for tx and rx
> > +  directions in this order.
> > +minItems: 2
> > +maxItems: 2
>
> What part of hardware or board configuration this represents?
>
> It wasn't here and nothing in changelog explained it.

That's information which DMA signal and mux setting an I2S interface uses.
It's a name (bus_id field) of platform data entry from phy3250.c in
[PATCH v3 3/4].
It's used by snd_soc_dai_init_dma_data() in [PATCH v3 4/4] to give the
dmaengine a
hint which dma config to use. The LPC32xx doesn't have yet a dmamux driver like
lpc18xx-dmamux.c therefore it still uses platform data entries for
pl08x dma channels
and 'SND_DMAENGINE_PCM_FLAG_NO_DT | SND_DMAENGINE_PCM_FLAG_COMPAT'
flags in the devm_snd_dmaengine_pcm_register().
Typically instead of this platform data you would use regular 'dma'
and 'dma-names' if it had
proper dmamux driver like lpc18xx-dmamux.c

>
> Drop.
>
>
> > +
> > +  "#sound-dai-cells":
> > +const: 0
> > +

The "dai-common.yam" doesn't declare a default value for this so
isn't it required? It's declared in others yaml files like:
Documentation/devicetree/bindings/sound/qcom,q6apm.yaml


--
Piotr Wojtaszczyk
Timesys


Re: [Patch v2 1/2] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-14 Thread Piotr Wojtaszczyk
On Fri, Jun 14, 2024 at 6:42 PM Mark Brown  wrote:
>
> On Fri, Jun 14, 2024 at 06:24:50PM +0200, Piotr Wojtaszczyk wrote:
> > On Tue, Jun 11, 2024 at 12:36 PM Mark Brown  wrote:
>
> > > On a quick scan I can't see any architecture dependency for build,
> > > please add an || COMPILE_TEST for improved coverage.  As for all the
> > > other things enabled in this Kconfig file there is no need to explicitly
> > > depend on SND_SOC.
>
> > Ok. Later I will add a sound card driver to phytec3250 board which uses
> > arch/arm/configs/lpc32xx_defconfig config file so that the COMPILE_TEST
> > won't be needed.
>
> Why would a defconfig affect the Kconfig?
I guess when lpc32xx_defconfig enables the SND_SOC_FSL_LPC3XXX then the
COMPILE_TEST won't be needed or does it?


-- 
Piotr Wojtaszczyk
Timesys


[PATCH v3 4/4] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-14 Thread Piotr Wojtaszczyk
This driver was ported from an old version in linux 2.6.27 and adjusted
for the new ASoC framework and DMA API.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v3:
- Split previous commit for separate subsystems
- Add support and  as a maintainer for the driver
- Replaced `SND_SOC` config dependency with COMPILE_TEST
- Moved `snd-soc-fsl-lpc3xxx-y` in Makefile up in the list to maintain 
alfabedical order
- Changed comment to c++ format
- replaced custom absd32() with standard abs() function
- Added clock provider check in lpc3xxx_i2s_set_dai_fmt()
- Removed empty lpc32xx_i2s_remove() function
- Reworked i2s regs definitions to include LPC3XXX prefix
- Replaced custom _BIT, _SBD with standard BIT and FIELD_PREP macros

Changes for v2:
- Coding Style cleanup
- Use dev_err_probe() for error handling in probe function
- Removed unneded err_clk_disable label
- Removed empty function
- Droped of_match_ptr in lpc32xx_i2s_match DT match table
- ASoC struct adjustmes for the latest 6.10-rc3 kernel

 MAINTAINERS |   8 +
 sound/soc/fsl/Kconfig   |   7 +
 sound/soc/fsl/Makefile  |   2 +
 sound/soc/fsl/lpc3xxx-i2s.c | 393 
 sound/soc/fsl/lpc3xxx-i2s.h |  79 
 sound/soc/fsl/lpc3xxx-pcm.c |  74 +++
 6 files changed, 563 insertions(+)
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

diff --git a/MAINTAINERS b/MAINTAINERS
index aacccb376c28..9789c1e4e291 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8909,6 +8909,14 @@ S:   Maintained
 F: sound/soc/fsl/fsl*
 F: sound/soc/fsl/imx*
 
+FREESCALE SOC LPC32XX SOUND DRIVERS
+M: J.M.B. Downing 
+M: Piotr Wojtaszczyk 
+L: alsa-de...@alsa-project.org (moderated for non-subscribers)
+L: linuxppc-dev@lists.ozlabs.org
+S: Maintained
+F: sound/soc/fsl/lpc3xxx-*
+
 FREESCALE SOC SOUND QMC DRIVER
 M: Herve Codina 
 L: alsa-de...@alsa-project.org (moderated for non-subscribers)
diff --git a/sound/soc/fsl/Kconfig b/sound/soc/fsl/Kconfig
index acadec3e8947..839a35214acb 100644
--- a/sound/soc/fsl/Kconfig
+++ b/sound/soc/fsl/Kconfig
@@ -136,6 +136,13 @@ config SND_SOC_FSL_RPMSG
  This option is only useful for out-of-tree drivers since
  in-tree drivers select it automatically.
 
+config SND_SOC_FSL_LPC3XXX
+   tristate "SoC Audio for NXP LPC32XX CPUs"
+   depends on ARCH_LPC32XX || COMPILE_TEST
+   select SND_SOC_GENERIC_DMAENGINE_PCM
+   help
+ Say Y or M if you want to add support for the LPC3XXX I2S interface.
+
 config SND_SOC_IMX_PCM_DMA
tristate
select SND_SOC_GENERIC_DMAENGINE_PCM
diff --git a/sound/soc/fsl/Makefile b/sound/soc/fsl/Makefile
index 550d1e3aced1..7b1ca557e953 100644
--- a/sound/soc/fsl/Makefile
+++ b/sound/soc/fsl/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_SND_SOC_P1022_RDK) += snd-soc-p1022-rdk.o
 snd-soc-fsl-audmix-y := fsl_audmix.o
 snd-soc-fsl-asoc-card-y := fsl-asoc-card.o
 snd-soc-fsl-asrc-y := fsl_asrc.o fsl_asrc_dma.o
+snd-soc-fsl-lpc3xxx-y := lpc3xxx-pcm.o lpc3xxx-i2s.o
 snd-soc-fsl-sai-y := fsl_sai.o
 snd-soc-fsl-ssi-y := fsl_ssi.o
 snd-soc-fsl-ssi-$(CONFIG_DEBUG_FS) += fsl_ssi_dbg.o
@@ -30,6 +31,7 @@ snd-soc-fsl-qmc-audio-y := fsl_qmc_audio.o
 obj-$(CONFIG_SND_SOC_FSL_AUDMIX) += snd-soc-fsl-audmix.o
 obj-$(CONFIG_SND_SOC_FSL_ASOC_CARD) += snd-soc-fsl-asoc-card.o
 obj-$(CONFIG_SND_SOC_FSL_ASRC) += snd-soc-fsl-asrc.o
+obj-$(CONFIG_SND_SOC_FSL_LPC3XXX) += snd-soc-fsl-lpc3xxx.o
 obj-$(CONFIG_SND_SOC_FSL_SAI) += snd-soc-fsl-sai.o
 obj-$(CONFIG_SND_SOC_FSL_SSI) += snd-soc-fsl-ssi.o
 obj-$(CONFIG_SND_SOC_FSL_SPDIF) += snd-soc-fsl-spdif.o
diff --git a/sound/soc/fsl/lpc3xxx-i2s.c b/sound/soc/fsl/lpc3xxx-i2s.c
new file mode 100644
index ..480e1e8deded
--- /dev/null
+++ b/sound/soc/fsl/lpc3xxx-i2s.c
@@ -0,0 +1,393 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+//
+// Author: Kevin Wells 
+//
+// Copyright (C) 2008 NXP Semiconductors
+// Copyright 2023 Timesys Corporation 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#include "lpc3xxx-i2s.h"
+
+#define I2S_PLAYBACK_FLAG 0x1
+#define I2S_CAPTURE_FLAG 0x2
+
+#define LPC3XXX_I2S_RATES ( \
+   SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
+   SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | \
+   SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
+
+#define LPC3XXX_I2S_FORMATS ( \
+   SNDRV_PCM_FMTBIT_S8 | \
+   SNDRV_PCM_FMTBIT_S16_LE | \
+   SNDRV_PCM_FMTBIT_S32_LE)
+
+static void __lpc3xxx_find_clkdiv(u32 *clkx, u32 *clky, int freq, int xbytes, 
u32 clkrate)
+{
+   u32 i2srate;
+   u32 idxx, idyy;
+   u32 savedbitclkrate, diff, trate, baseclk;
+
+   /* Adjust rate for sample size (bits) and 2 channels and offset for
+* divider in clock output
+*/
+   i2srate = (

[PATCH v3 3/4] ARM: lpc32xx: Add pl08x virtual dma channels for spi and i2s

2024-06-14 Thread Piotr Wojtaszczyk
Some of the signals are multiplexed, multiplexer configured at a signal
request.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v3:
- Split previous commit for separate subsystems
- Add pl08x virtual dma channels for i2s1
- Add dma mux handling, required when requesting tx dma signal for i2s1

 arch/arm/mach-lpc32xx/phy3250.c | 111 +++-
 1 file changed, 110 insertions(+), 1 deletion(-)

diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c
index 5371bfaed799..2ec0411964f9 100644
--- a/arch/arm/mach-lpc32xx/phy3250.c
+++ b/arch/arm/mach-lpc32xx/phy3250.c
@@ -9,14 +9,18 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
+#include 
 
 #include 
 #include "common.h"
 #include "lpc32xx.h"
 
+static DEFINE_SPINLOCK(lpc32xx_pl08x_lock);
+
 static struct pl08x_channel_data pl08x_slave_channels[] = {
{
.bus_id = "nand-slc",
@@ -30,11 +34,97 @@ static struct pl08x_channel_data pl08x_slave_channels[] = {
.max_signal = 12,
.periph_buses = PL08X_AHB1,
},
+   {
+   .bus_id = "i2s0-tx",
+   .min_signal = 13,
+   .max_signal = 13,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "i2s0-rx",
+   .min_signal = 0,
+   .max_signal = 0,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "i2s1-tx",
+   .min_signal = 10,
+   .max_signal = 10,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "i2s1-rx",
+   .min_signal = 2,
+   .max_signal = 2,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp0-tx",
+   .min_signal = 15,
+   .max_signal = 15,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp0-rx",
+   .min_signal = 14,
+   .max_signal = 14,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp1-tx",
+   .min_signal = 11,
+   .max_signal = 11,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp1-rx",
+   .min_signal = 3,
+   .max_signal = 3,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+};
+
+struct lpc32xx_pl08x_mux {
+   int signal;
+   void __iomem *addr;
+   int bit;
+};
+
+/* From LPC32x0 User manual "3.2.1 DMA request signals" */
+static const struct lpc32xx_pl08x_mux dma_mux[] = {
+   {3, LPC32XX_CLKPWR_SSP_CLK_CTRL, 5},
+   {10, LPC32XX_CLKPWR_I2S_CLK_CTRL, 4},
+   {11, LPC32XX_CLKPWR_SSP_CLK_CTRL, 4},
+   {14, LPC32XX_CLKPWR_SSP_CLK_CTRL, 3},
+   {15, LPC32XX_CLKPWR_SSP_CLK_CTRL, 2},
 };
 
 static int pl08x_get_signal(const struct pl08x_channel_data *cd)
 {
-   return cd->min_signal;
+   const int signal = cd->min_signal;
+   unsigned long flags;
+   int i, tmp;
+
+   /* Set corresponding dma mux bit if muxed */
+   for (i = 0; i < ARRAY_SIZE(dma_mux); i++) {
+   if (dma_mux[i].signal == signal) {
+   spin_lock_irqsave(_pl08x_lock, flags);
+   tmp = __raw_readl(dma_mux[i].addr);
+   if (cd->muxval)
+   tmp |= BIT(dma_mux[i].bit);
+   else
+   tmp &= ~BIT(dma_mux[i].bit);
+   __raw_writel(tmp, dma_mux[i].addr);
+   spin_unlock_irqrestore(_pl08x_lock, flags);
+   break;
+   }
+   }
+   return signal;
 }
 
 static void pl08x_put_signal(const struct pl08x_channel_data *cd, int ch)
@@ -61,12 +151,31 @@ static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = 
{
.dma_filter = pl08x_filter_id,
 };
 
+static struct pl022_ssp_controller lpc32xx_ssp_data[] = {
+   {
+   .bus_id = 0,
+   .enable_dma = 0,
+   .dma_filter = pl08x_filter_id,
+   .dma_tx_param = "ssp0-tx",
+   .dma_rx_param = "ssp0-rx",
+   },
+   {
+   .bus_id = 1,
+   .enable_dma = 0,
+   .dma_filter = pl08x_filter_id,
+   .dma_tx_param = "ssp1-tx",
+   .dma_rx_param = "ssp1-rx",
+   }
+};
+
 static const struct of_dev_auxdata lpc32xx_auxdata_lookup[] __initconst = {
OF_DEV_AUXDATA("arm,pl080", 0x3100, "pl08xdmac", _pd),
OF_DEV_

[PATCH v3 2/4] ARM: dts: lpc32xx: Add missing properties for the i2s interfaces

2024-06-14 Thread Piotr Wojtaszczyk
The 'dma-vc-names' correspond to virtual pl08x dma channels declared in
the 'phy3250.c' platform file.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v3:
- Split previous commit for separate subsystems
- Add properties to match dt binding

 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi | 8 
 1 file changed, 8 insertions(+)

diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 974410918f35..bbd2b8b6963c 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -221,6 +221,10 @@ spi2: spi@2009 {
i2s0: i2s@20094000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x20094000 0x1000>;
+   interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+   clocks = < LPC32XX_CLK_I2S0>;
+   dma-vc-names = "i2s0-tx", "i2s0-rx";
+   #sound-dai-cells = <0>;
status = "disabled";
};
 
@@ -237,6 +241,10 @@ sd: sd@20098000 {
i2s1: i2s@2009c000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x2009c000 0x1000>;
+   interrupts = <23 IRQ_TYPE_LEVEL_HIGH>;
+   clocks = < LPC32XX_CLK_I2S1>;
+   dma-vc-names = "i2s1-tx", "i2s1-rx";
+   #sound-dai-cells = <0>;
status = "disabled";
};
 
-- 
2.25.1



[PATCH v3 1/4] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-14 Thread Piotr Wojtaszczyk
Add nxp,lpc3220-i2s DT binding documentation.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v3:
- Added '$ref: dai-common.yaml#' and '#sound-dai-cells'
- Dropped all clock-names, references
- Dropped status property from the example
- Added interrupts property
- 'make dt_binding_check' pass

Changes for v2:
- Added maintainers field
- Dropped clock-names
- Dropped unused unneded interrupts field

 .../bindings/sound/nxp,lpc3220-i2s.yaml   | 69 +++
 1 file changed, 69 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml

diff --git a/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml 
b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
new file mode 100644
index ..04a1090f70cc
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
@@ -0,0 +1,69 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/nxp,lpc3220-i2s.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP LPC32XX I2S Controller
+
+description:
+  The I2S controller in LPC32XX SoCs, ASoC DAI.
+
+maintainers:
+  - J.M.B. Downing 
+  - Piotr Wojtaszczyk 
+
+allOf:
+  - $ref: dai-common.yaml#
+
+properties:
+  compatible:
+enum:
+  - nxp,lpc3220-i2s
+
+  reg:
+maxItems: 1
+
+  interrupts:
+maxItems: 1
+
+  clocks:
+items:
+  - description: input clock of the peripheral.
+
+  dma-vc-names:
+$ref: /schemas/types.yaml#/definitions/string-array
+description: |
+  names of virtual pl08x dma channels for tx and rx
+  directions in this order.
+minItems: 2
+maxItems: 2
+
+  "#sound-dai-cells":
+const: 0
+
+required:
+  - compatible
+  - reg
+  - interrupts
+  - clocks
+  - dma-vc-names
+  - '#sound-dai-cells'
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+#include 
+
+i2s@20094000 {
+  compatible = "nxp,lpc3220-i2s";
+  reg = <0x20094000 0x1000>;
+  interrupts = <22 IRQ_TYPE_LEVEL_HIGH>;
+  clocks = < LPC32XX_CLK_I2S0>;
+  dma-vc-names = "i2s0-tx", "i2s0-rx";
+  #sound-dai-cells = <0>;
+};
+
+...
-- 
2.25.1



[PATCH v3 0/4] Add audio support for LPC32XX CPUs

2024-06-14 Thread Piotr Wojtaszczyk
This pach set is to bring back audio to machines with a LPC32XX CPU.
The legacy LPC32XX SoC used to have audio spport in linux 2.6.27.
The support was dropped due to lack of interest from mainaeners.

Piotr Wojtaszczyk (4):
  ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding
  ARM: dts: lpc32xx: Add missing properties for the i2s interfaces
  ARM: lpc32xx: Add pl08x virtual dma channels for spi and i2s
  ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

 .../bindings/sound/nxp,lpc3220-i2s.yaml   |  69 +++
 MAINTAINERS   |   8 +
 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi|   8 +
 arch/arm/mach-lpc32xx/phy3250.c   | 111 -
 sound/soc/fsl/Kconfig |   7 +
 sound/soc/fsl/Makefile|   2 +
 sound/soc/fsl/lpc3xxx-i2s.c   | 393 ++
 sound/soc/fsl/lpc3xxx-i2s.h   |  79 
 sound/soc/fsl/lpc3xxx-pcm.c   |  74 
 9 files changed, 750 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

-- 
2.25.1



Re: [Patch v2 1/2] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-14 Thread Piotr Wojtaszczyk
On Tue, Jun 11, 2024 at 12:36 PM Mark Brown  wrote:
> > +config SND_SOC_FSL_LPC3XXX
> > + tristate "SoC Audio for NXP LPC32XX CPUs"
> > + depends on ARCH_LPC32XX && SND_SOC
>
> On a quick scan I can't see any architecture dependency for build,
> please add an || COMPILE_TEST for improved coverage.  As for all the
> other things enabled in this Kconfig file there is no need to explicitly
> depend on SND_SOC.
Ok. Later I will add a sound card driver to phytec3250 board which uses
arch/arm/configs/lpc32xx_defconfig config file so that the COMPILE_TEST
won't be needed.

--
Piotr Wojtaszczyk
Timesys


Re: [Patch v2 2/2] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-12 Thread Piotr Wojtaszczyk
On Tue, Jun 11, 2024 at 12:45 PM Krzysztof Kozlowski  wrote:
> > Changes for v2:
> > - Added maintainers field
> > - Dropped clock-names
> > - Dropped unused unneded interrupts field
>
> Does the device has interrupts or not? This should justify decision, not
> current usage by drivers.
Yes the device has interrupts but feeding data FIFOs is handled by DMA
(amba-pl08x.c).
Should I declare interrupts despite they are not used in the compatible driver?

-- 
Piotr Wojtaszczyk
Timesys


Re: [Patch v2 2/2] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-12 Thread Piotr Wojtaszczyk
On Tue, Jun 11, 2024 at 12:18 PM Krzysztof Kozlowski  wrote:
> I do not see my comment about DAI being addressed.
Were you asking if it's a DAI? yes it is.

-- 
Piotr Wojtaszczyk
Timesys


Re: [Patch v2 1/2] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-12 Thread Piotr Wojtaszczyk
On Tue, Jun 11, 2024 at 12:36 PM Mark Brown  wrote:
> > +FREESCALE SOC LPC32XX SOUND DRIVERS
> > +M:   Piotr Wojtaszczyk 
> > +L:   alsa-de...@alsa-project.org (moderated for non-subscribers)
> > +L:   linuxppc-dev@lists.ozlabs.org
> > +S:   Orphan
> > +F:   sound/soc/fsl/lpc3xxx-*
> > +
>
> It seems a bit odd to add yourself as a maintainer while also marking
> the driver as orphan?
Nautel Ltd agreed to maintain this driver, I will add them.

> > + i2s_info_p->clk = devm_clk_get(dev, "i2s_clk");
> > + if (IS_ERR(i2s_info_p->clk))
> > + return dev_err_probe(dev, PTR_ERR(i2s_info_p->clk), "Can't 
> > get clock\n");
> > +
> > + i2s_info_p->clkrate = clk_get_rate(i2s_info_p->clk);
> > + if (i2s_info_p->clkrate == 0)
> > + return dev_err_probe(dev, -EINVAL, "Invalid returned clock 
> > rate\n");
>
> Nothing ever enables this clock.
It's enabled in lpc3xxx_i2s_startup() and disabled in lpc3xxx_i2s_shutdown().
When the clock is enabled the bit clock on I2S interface always runs.
So this is to avoid active clock when the interface isn't used.

-- 
Piotr Wojtaszczyk
Timesys


Re: [Patch v2 1/2] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-12 Thread Piotr Wojtaszczyk
On Tue, Jun 11, 2024 at 12:15 PM Krzysztof Kozlowski  wrote:
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index aacccb376c28..7616f61d6327 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -8909,6 +8909,13 @@ S: Maintained
> >  F:   sound/soc/fsl/fsl*
> >  F:   sound/soc/fsl/imx*
> >
> > +FREESCALE SOC LPC32XX SOUND DRIVERS
> > +M:   Piotr Wojtaszczyk 
> > +L:   alsa-de...@alsa-project.org (moderated for non-subscribers)
> > +L:   linuxppc-dev@lists.ozlabs.org
> > +S:   Orphan
>
> Not sure if we want it in the first place. Why would we like to support
> orphaned drivers? Sorry, if there is no one to care about it, then it
> should not be merged.
>
I contacted Nautel Ltd they agreed to maintain this driver so I will add
J.M.B. Downing 
as a maintainer.

> > +static int lpc32xx_i2s_remove(struct platform_device *pdev)
> > +{
> > +     return 0;
> > +}
>
> You did not respond to comment about this. Drop.
I will remove empty functions

--
Piotr Wojtaszczyk
Timesys


[Patch v2 1/2] ASoC: fsl: Add i2s and pcm drivers for LPC32xx CPUs

2024-06-11 Thread Piotr Wojtaszczyk
This driver was ported from an old version in linux 2.6.27 and adjusted
for the new ASoC framework and DMA API.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v2:
- Coding Style cleanup
- Use dev_err_probe() for error handling in probe function
- Removed unneded err_clk_disable label
- Removed empty function
- Droped of_match_ptr in lpc32xx_i2s_match DT match table
- ASoC struct adjustmes for the latest 6.10-rc3 kernel

 MAINTAINERS|   7 +
 arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi |   4 +
 arch/arm/mach-lpc32xx/phy3250.c|  60 
 sound/soc/fsl/Kconfig  |   7 +
 sound/soc/fsl/Makefile |   2 +
 sound/soc/fsl/lpc3xxx-i2s.c| 383 +
 sound/soc/fsl/lpc3xxx-i2s.h|  94 ++
 sound/soc/fsl/lpc3xxx-pcm.c|  75 +
 8 files changed, 632 insertions(+)
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.c
 create mode 100644 sound/soc/fsl/lpc3xxx-i2s.h
 create mode 100644 sound/soc/fsl/lpc3xxx-pcm.c

diff --git a/MAINTAINERS b/MAINTAINERS
index aacccb376c28..7616f61d6327 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -8909,6 +8909,13 @@ S:   Maintained
 F: sound/soc/fsl/fsl*
 F: sound/soc/fsl/imx*
 
+FREESCALE SOC LPC32XX SOUND DRIVERS
+M: Piotr Wojtaszczyk 
+L: alsa-de...@alsa-project.org (moderated for non-subscribers)
+L: linuxppc-dev@lists.ozlabs.org
+S: Orphan
+F: sound/soc/fsl/lpc3xxx-*
+
 FREESCALE SOC SOUND QMC DRIVER
 M: Herve Codina 
 L: alsa-de...@alsa-project.org (moderated for non-subscribers)
diff --git a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi 
b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
index 974410918f35..3fa12e3a0093 100644
--- a/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
+++ b/arch/arm/boot/dts/nxp/lpc/lpc32xx.dtsi
@@ -221,6 +221,8 @@ spi2: spi@2009 {
i2s0: i2s@20094000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x20094000 0x1000>;
+   clocks = < LPC32XX_CLK_I2S0>;
+   clock-names = "i2s_clk";
status = "disabled";
};
 
@@ -237,6 +239,8 @@ sd: sd@20098000 {
i2s1: i2s@2009c000 {
compatible = "nxp,lpc3220-i2s";
reg = <0x2009c000 0x1000>;
+   clocks = < LPC32XX_CLK_I2S1>;
+   clock-names = "i2s_clk";
status = "disabled";
};
 
diff --git a/arch/arm/mach-lpc32xx/phy3250.c b/arch/arm/mach-lpc32xx/phy3250.c
index 66701bf43248..b866b9a75558 100644
--- a/arch/arm/mach-lpc32xx/phy3250.c
+++ b/arch/arm/mach-lpc32xx/phy3250.c
@@ -9,6 +9,7 @@
  */
 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -29,6 +30,46 @@ static struct pl08x_channel_data pl08x_slave_channels[] = {
.max_signal = 12,
.periph_buses = PL08X_AHB1,
},
+   {
+   .bus_id = "i2s-tx",
+   .min_signal = 13,
+   .max_signal = 13,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "i2s-rx",
+   .min_signal = 0,
+   .max_signal = 0,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp0-tx",
+   .min_signal = 15,
+   .max_signal = 15,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp0-rx",
+   .min_signal = 14,
+   .max_signal = 14,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp1-tx",
+   .min_signal = 11,
+   .max_signal = 11,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
+   {
+   .bus_id = "ssp1-rx",
+   .min_signal = 3,
+   .max_signal = 3,
+   .muxval = 1,
+   .periph_buses = PL08X_AHB1,
+   },
 };
 
 static int pl08x_get_signal(const struct pl08x_channel_data *cd)
@@ -60,12 +101,31 @@ static struct lpc32xx_mlc_platform_data lpc32xx_mlc_data = 
{
.dma_filter = pl08x_filter_id,
 };
 
+static struct pl022_ssp_controller lpc32xx_ssp_data[] = {
+   {
+   .bus_id = 0,
+   .enable_dma = 0,
+   .dma_filter = pl08x_filter_id,
+   .dma_tx_param = "ssp0-tx",
+   .dma_rx_param = "ssp0-rx",
+   },
+   {
+   .bus_id = 1,
+   .enable_dma = 0,
+   .dma_filter = pl08x_filter_id,
+   .dma_tx_param = "ssp1

[Patch v2 2/2] ASoC: dt-bindings: lpc32xx: Add lpc32xx i2s DT binding

2024-06-11 Thread Piotr Wojtaszczyk
Add nxp,lpc3220-i2s DT binding documentation.

Signed-off-by: Piotr Wojtaszczyk 
---
Changes for v2:
- Added maintainers field
- Dropped clock-names
- Dropped unused unneded interrupts field

 .../bindings/sound/nxp,lpc3220-i2s.yaml   | 47 +++
 1 file changed, 47 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml

diff --git a/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml 
b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
new file mode 100644
index ..66e48d8a5a1b
--- /dev/null
+++ b/Documentation/devicetree/bindings/sound/nxp,lpc3220-i2s.yaml
@@ -0,0 +1,47 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/sound/nxp,lpc3220-i2s.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: NXP LPC32XX I2S Controller
+
+description:
+  The I2S controller in LPC32XX SoCs to interface codecs and other audo 
devices.
+
+maintainers:
+  - Piotr Wojtaszczyk 
+
+properties:
+  compatible:
+enum:
+  - nxp,lpc3220-i2s
+
+  reg:
+maxItems: 1
+
+  clocks:
+items:
+  - description: input clock of the peripheral.
+
+required:
+  - compatible
+  - reg
+  - clocks
+  - clock-names
+
+additionalProperties: false
+
+examples:
+  - |
+#include 
+
+i2s0: i2s@20094000 {
+  compatible = "nxp,lpc3220-i2s";
+  reg = <0x20094000 0x1000>;
+  clocks = < LPC32XX_CLK_I2S0>;
+  clock-names = "i2s_clk";
+  status = "disabled";
+};
+
+...
-- 
2.25.1