* Re: [PATCH v2 07/11] ASoC: fsl_xcvr: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:19 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-8-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:20PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/fsl_xcvr.c | 29 ++++++++++++-----------------
> 1 file changed, 12 insertions(+), 17 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_xcvr.c b/sound/soc/fsl/fsl_xcvr.c
> index 6677d3bf36ec..41d100500534 100644
> --- a/sound/soc/fsl/fsl_xcvr.c
> +++ b/sound/soc/fsl/fsl_xcvr.c
> @@ -797,10 +797,9 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> {
> struct fsl_xcvr *xcvr = snd_soc_dai_get_drvdata(dai);
> bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
> - unsigned long lock_flags;
> int ret = 0;
>
> - spin_lock_irqsave(&xcvr->lock, lock_flags);
> + guard(spinlock_irqsave)(&xcvr->lock);
>
> switch (cmd) {
> case SNDRV_PCM_TRIGGER_START:
> @@ -812,7 +811,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_EXT_CTRL_DPTH_RESET(tx));
> if (ret < 0) {
> dev_err(dai->dev, "Failed to set DPATH RESET: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> if (tx) {
> @@ -824,7 +823,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_ISR_CMDC_TX_EN);
> if (ret < 0) {
> dev_err(dai->dev, "err updating isr %d\n", ret);
> - goto release_lock;
> + return ret;
> }
> fallthrough;
> case FSL_XCVR_MODE_SPDIF:
> @@ -833,7 +832,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_TX_DPTH_CTRL_STRT_DATA_TX);
> if (ret < 0) {
> dev_err(dai->dev, "Failed to start DATA_TX: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
> break;
> }
> @@ -844,14 +843,14 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_EXT_CTRL_DMA_DIS(tx), 0);
> if (ret < 0) {
> dev_err(dai->dev, "Failed to enable DMA: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
> FSL_XCVR_IRQ_EARC_ALL, FSL_XCVR_IRQ_EARC_ALL);
> if (ret < 0) {
> dev_err(dai->dev, "Error while setting IER0: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> /* clear DPATH RESET */
> @@ -860,7 +859,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> 0);
> if (ret < 0) {
> dev_err(dai->dev, "Failed to clear DPATH RESET: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> break;
> @@ -873,14 +872,14 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_EXT_CTRL_DMA_DIS(tx));
> if (ret < 0) {
> dev_err(dai->dev, "Failed to disable DMA: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> ret = regmap_update_bits(xcvr->regmap, FSL_XCVR_EXT_IER0,
> FSL_XCVR_IRQ_EARC_ALL, 0);
> if (ret < 0) {
> dev_err(dai->dev, "Failed to clear IER0: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
>
> if (tx) {
> @@ -891,7 +890,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> FSL_XCVR_TX_DPTH_CTRL_STRT_DATA_TX);
> if (ret < 0) {
> dev_err(dai->dev, "Failed to stop DATA_TX: %d\n", ret);
> - goto release_lock;
> + return ret;
> }
> if (xcvr->soc_data->spdif_only)
> break;
> @@ -905,7 +904,7 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> if (ret < 0) {
> dev_err(dai->dev,
> "Err updating ISR %d\n", ret);
> - goto release_lock;
> + return ret;
> }
> break;
> }
> @@ -916,8 +915,6 @@ static int fsl_xcvr_trigger(struct snd_pcm_substream *substream, int cmd,
> break;
> }
>
> -release_lock:
> - spin_unlock_irqrestore(&xcvr->lock, lock_flags);
> return ret;
> }
>
> @@ -1448,11 +1445,10 @@ static void reset_rx_work(struct work_struct *work)
> {
> struct fsl_xcvr *xcvr = container_of(work, struct fsl_xcvr, work_rst);
> struct device *dev = &xcvr->pdev->dev;
> - unsigned long lock_flags;
> u32 ext_ctrl;
>
> dev_dbg(dev, "reset rx path\n");
> - spin_lock_irqsave(&xcvr->lock, lock_flags);
> + guard(spinlock_irqsave)(&xcvr->lock);
> regmap_read(xcvr->regmap, FSL_XCVR_EXT_CTRL, &ext_ctrl);
>
> if (!(ext_ctrl & FSL_XCVR_EXT_CTRL_DMA_RD_DIS)) {
> @@ -1469,7 +1465,6 @@ static void reset_rx_work(struct work_struct *work)
> FSL_XCVR_EXT_CTRL_RX_DPTH_RESET,
> 0);
> }
> - spin_unlock_irqrestore(&xcvr->lock, lock_flags);
> }
>
> static irqreturn_t irq0_isr(int irq, void *devid)
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH v2 01/11] ASoC: fsl_asrc: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:18 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-2-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:14PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/fsl_asrc.c | 10 ++--------
> 1 file changed, 2 insertions(+), 8 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_asrc.c b/sound/soc/fsl/fsl_asrc.c
> index 5fda9b647c70..0b28bcfa47fe 100644
> --- a/sound/soc/fsl/fsl_asrc.c
> +++ b/sound/soc/fsl/fsl_asrc.c
> @@ -222,10 +222,9 @@ static int fsl_asrc_request_pair(int channels, struct fsl_asrc_pair *pair)
> enum asrc_pair_index index = ASRC_INVALID_PAIR;
> struct fsl_asrc *asrc = pair->asrc;
> struct device *dev = &asrc->pdev->dev;
> - unsigned long lock_flags;
> int i, ret = 0;
>
> - spin_lock_irqsave(&asrc->lock, lock_flags);
> + guard(spinlock_irqsave)(&asrc->lock);
>
> for (i = ASRC_PAIR_A; i < ASRC_PAIR_MAX_NUM; i++) {
> if (asrc->pair[i] != NULL)
> @@ -250,8 +249,6 @@ static int fsl_asrc_request_pair(int channels, struct fsl_asrc_pair *pair)
> pair->index = index;
> }
>
> - spin_unlock_irqrestore(&asrc->lock, lock_flags);
> -
> return ret;
> }
>
> @@ -265,19 +262,16 @@ static void fsl_asrc_release_pair(struct fsl_asrc_pair *pair)
> {
> struct fsl_asrc *asrc = pair->asrc;
> enum asrc_pair_index index = pair->index;
> - unsigned long lock_flags;
>
> /* Make sure the pair is disabled */
> regmap_update_bits(asrc->regmap, REG_ASRCTR,
> ASRCTR_ASRCEi_MASK(index), 0);
>
> - spin_lock_irqsave(&asrc->lock, lock_flags);
> + guard(spinlock_irqsave)(&asrc->lock);
>
> asrc->channel_avail += pair->channels;
> asrc->pair[index] = NULL;
> pair->error = 0;
> -
> - spin_unlock_irqrestore(&asrc->lock, lock_flags);
> }
>
> /**
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH net-next v7 01/12] net: phylink: keep and use MAC supported_interfaces in phylink struct
From: Christian Marangi @ 2026-06-15 14:18 UTC (permalink / raw)
To: Maxime Chevallier
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, Jonathan Corbet, Shuah Khan, Lorenzo Bianconi,
Heiner Kallweit, Russell King, Saravana Kannan, Philipp Zabel,
Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
netdev, devicetree, linux-kernel, linux-doc, linux-arm-kernel,
linux-mediatek, llvm
In-Reply-To: <371a1df7-084c-4431-bd00-0045298e3212@bootlin.com>
On Mon, Jun 15, 2026 at 03:33:34PM +0200, Maxime Chevallier wrote:
> Hello Christian,
>
> On 6/15/26 14:29, Christian Marangi wrote:
> > Add in phylink struct a copy of supported_interfaces from phylink_config
> > and make use of that instead of relying on phylink_config value.
> >
> > This in preparation for support of PCS handling internally to phylink
> > where a PCS can be removed or added after the phylink is created and we
> > need both a reference of the supported_interfaces value from
> > phylink_config and an internal value that can be updated with the new
> > PCS info.
> >
> > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> > ---
> > drivers/net/phy/phylink.c | 22 +++++++++++++++-------
> > 1 file changed, 15 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
> > index 087ac63f9193..4d59c0dd78db 100644
> > --- a/drivers/net/phy/phylink.c
> > +++ b/drivers/net/phy/phylink.c
> > @@ -60,6 +60,11 @@ struct phylink {
> > /* The link configuration settings */
> > struct phylink_link_state link_config;
> >
> > + /* What interface are supported by the current link.
> > + * Can change on removal or addition of new PCS.
> > + */
> > + DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
>
> Can you clarify a bit what you mean here ? Is that the combination of the
> interfaces the MAC supports AND the currently in-use PCS ?
>
Combination of interface the MAC supports and the currently attached PCS
(not the current one in use)
The fact that it can change is due to the fact that PCS can be attached
later and supported_interfaces can be updated accordingly.
--
Ansuel
^ permalink raw reply
* Re: [PATCH v2 08/11] ASoC: imx-audio-rpmsg: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:17 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-9-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:21PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/imx-audio-rpmsg.c | 25 ++++++++++++-------------
> 1 file changed, 12 insertions(+), 13 deletions(-)
>
> diff --git a/sound/soc/fsl/imx-audio-rpmsg.c b/sound/soc/fsl/imx-audio-rpmsg.c
> index 38aafb8954c7..b55dfbdb4502 100644
> --- a/sound/soc/fsl/imx-audio-rpmsg.c
> +++ b/sound/soc/fsl/imx-audio-rpmsg.c
> @@ -22,7 +22,6 @@ static int imx_audio_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len,
> struct rpmsg_r_msg *r_msg = (struct rpmsg_r_msg *)data;
> struct rpmsg_info *info;
> struct rpmsg_msg *msg;
> - unsigned long flags;
>
> if (!rpmsg->rpmsg_pdev)
> return 0;
> @@ -37,21 +36,21 @@ static int imx_audio_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len,
> /* TYPE C is notification from M core */
> switch (r_msg->header.cmd) {
> case TX_PERIOD_DONE:
> - spin_lock_irqsave(&info->lock[TX], flags);
> - msg = &info->msg[TX_PERIOD_DONE + MSG_TYPE_A_NUM];
> - msg->r_msg.param.buffer_tail =
> - r_msg->param.buffer_tail;
> - msg->r_msg.param.buffer_tail %= info->num_period[TX];
> - spin_unlock_irqrestore(&info->lock[TX], flags);
> + scoped_guard(spinlock_irqsave, &info->lock[TX]) {
> + msg = &info->msg[TX_PERIOD_DONE + MSG_TYPE_A_NUM];
> + msg->r_msg.param.buffer_tail =
> + r_msg->param.buffer_tail;
> + msg->r_msg.param.buffer_tail %= info->num_period[TX];
> + }
> info->callback[TX](info->callback_param[TX]);
> break;
> case RX_PERIOD_DONE:
> - spin_lock_irqsave(&info->lock[RX], flags);
> - msg = &info->msg[RX_PERIOD_DONE + MSG_TYPE_A_NUM];
> - msg->r_msg.param.buffer_tail =
> - r_msg->param.buffer_tail;
> - msg->r_msg.param.buffer_tail %= info->num_period[1];
> - spin_unlock_irqrestore(&info->lock[RX], flags);
> + scoped_guard(spinlock_irqsave, &info->lock[RX]) {
> + msg = &info->msg[RX_PERIOD_DONE + MSG_TYPE_A_NUM];
> + msg->r_msg.param.buffer_tail =
> + r_msg->param.buffer_tail;
> + msg->r_msg.param.buffer_tail %= info->num_period[1];
> + }
> info->callback[RX](info->callback_param[RX]);
> break;
> default:
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH v2 05/11] ASoC: fsl_spdif: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:17 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-6-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:18PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/fsl_spdif.c | 8 ++------
> 1 file changed, 2 insertions(+), 6 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_spdif.c b/sound/soc/fsl/fsl_spdif.c
> index 1b9be85b34c2..ad1206ed9882 100644
> --- a/sound/soc/fsl/fsl_spdif.c
> +++ b/sound/soc/fsl/fsl_spdif.c
> @@ -853,17 +853,15 @@ static int fsl_spdif_subcode_get(struct snd_kcontrol *kcontrol,
> struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
> struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
> struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control;
> - unsigned long flags;
> int ret = -EAGAIN;
>
> - spin_lock_irqsave(&ctrl->ctl_lock, flags);
> + guard(spinlock_irqsave)(&ctrl->ctl_lock);
> if (ctrl->ready_buf) {
> int idx = (ctrl->ready_buf - 1) * SPDIF_UBITS_SIZE;
> memcpy(&ucontrol->value.iec958.subcode[0],
> &ctrl->subcode[idx], SPDIF_UBITS_SIZE);
> ret = 0;
> }
> - spin_unlock_irqrestore(&ctrl->ctl_lock, flags);
>
> return ret;
> }
> @@ -885,17 +883,15 @@ static int fsl_spdif_qget(struct snd_kcontrol *kcontrol,
> struct snd_soc_dai *cpu_dai = snd_kcontrol_chip(kcontrol);
> struct fsl_spdif_priv *spdif_priv = snd_soc_dai_get_drvdata(cpu_dai);
> struct spdif_mixer_control *ctrl = &spdif_priv->fsl_spdif_control;
> - unsigned long flags;
> int ret = -EAGAIN;
>
> - spin_lock_irqsave(&ctrl->ctl_lock, flags);
> + guard(spinlock_irqsave)(&ctrl->ctl_lock);
> if (ctrl->ready_buf) {
> int idx = (ctrl->ready_buf - 1) * SPDIF_QSUB_SIZE;
> memcpy(&ucontrol->value.bytes.data[0],
> &ctrl->qsub[idx], SPDIF_QSUB_SIZE);
> ret = 0;
> }
> - spin_unlock_irqrestore(&ctrl->ctl_lock, flags);
>
> return ret;
> }
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH net-next v7 02/12] net: phylink: introduce internal phylink PCS handling
From: Christian Marangi @ 2026-06-15 14:17 UTC (permalink / raw)
To: Maxime Chevallier
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, Jonathan Corbet, Shuah Khan, Lorenzo Bianconi,
Heiner Kallweit, Russell King, Saravana Kannan, Philipp Zabel,
Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
netdev, devicetree, linux-kernel, linux-doc, linux-arm-kernel,
linux-mediatek, llvm
In-Reply-To: <3bbacda3-4225-4536-a4b4-3aa31a47a3aa@bootlin.com>
On Mon, Jun 15, 2026 at 03:31:20PM +0200, Maxime Chevallier wrote:
> Hi Christian,
>
> On 6/15/26 14:29, Christian Marangi wrote:
> > Introduce internal handling of PCS for phylink. This is an alternative
> > way to .mac_select_pcs that moves the selection logic of the PCS entirely
> > to phylink with the usage of the supported_interface value in the PCS
> > struct.
> >
> > MAC should now provide a callback to fill the available PCS in
> > phylink_config in .fill_available_pcs and fill the .num_possible_pcs with
> > the number of elements in the array. MAC should also define a new bitmap,
> > pcs_interfaces, in phylink_config to define for what interface mode a
> > dedicated PCS is required.
> >
> > On phylink_create(), an array of PCS pointer is allocated of size
> > .num_possible_pcs from phylink_config and .fill_available_pcs from
> > phylink_config is called passing as args the just allocated array and
> > the number of possible element in it.
> >
> > MAC will fill this passed array with all the available PCS.
> >
> > This array is then parsed and a linked list of PCS is created based on
> > the allocated PCS array filled by MAC via .fill_available_pcs().
> >
> > Every PCS in phylink PCS list gets then linked to the phylink instance
> > by setting the phylink value in phylink_pcs struct to the phylink instance.
> > Also the supported_interface value in phylink struct is updated with
> > the new supported_interface from the provided PCS.
> >
> > On phylink_destroy(), every PCS in phylink PCS list is unlinked from the
> > phylink instance by setting the phylink value in phylink_pcs struct to NULL
> > and removed from the PCS list.
> >
> > phylink_validate_mac_and_pcs(), phylink_major_config() and
> > phylink_inband_caps() are updated to support this new implementation
> > with the PCS list stored in phylink.
> >
> > They will make use of phylink_validate_pcs_interface() that will loop
> > for every PCS in the phylink PCS available list and find one that supports
> > the passed interface.
> >
> > phylink_validate_pcs_interface() applies the same logic of .mac_select_pcs
> > where if a supported_interface value is not set for the PCS struct, then
> > it's assumed every interface is supported.
> >
> > A MAC is required to implement either a .mac_select_pcs or make use of
> > the PCS list implementation. Implementing both will result in a fail
> > on phylink_create().
> >
> > A MAC defining .num_possible_pcs in phylink_config MUST also define a
> > .fill_available_pcs or phylink_create() will fail with an negative error.
> >
> > phylink value in phylink_pcs struct with this implementation is used to
> > track from PCS side when it's attached to a phylink instance. PCS driver
> > will make use of this information to correctly detach from a phylink
> > instance if needed.
> >
> > phylink_pcs_change() is also changed to verify that the PCS that triggered
> > a link change is the one that is currently used by the phylink instance.
> >
> > The .mac_select_pcs implementation is not changed but it's expected that
> > every MAC driver migrates to the new implementation to later deprecate
> > and remove .mac_select_pcs.
> >
> > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> > ---
>
> [...]
>
> > @@ -1872,10 +1993,28 @@ struct phylink *phylink_create(struct phylink_config *config,
> > mutex_init(&pl->phydev_mutex);
> > mutex_init(&pl->state_mutex);
> > INIT_WORK(&pl->resolve, phylink_resolve);
> > + INIT_LIST_HEAD(&pl->pcs_list);
> > +
> > + /* Fill the PCS list with available PCS from phylink config */
> > + ret = phylink_fill_available_pcs(pl, config);
> > + if (ret < 0) {
> > + kfree(pl);
> > + return ERR_PTR(ret);
> > + }
> > +
> > + /* Link available PCS to phylink */
> > + list_for_each_entry(pcs, &pl->pcs_list, list)
> > + pcs->phylink = pl;
> >
> > phy_interface_copy(pl->supported_interfaces,
> > config->supported_interfaces);
> >
> > + /* Update supported interfaces */
> > + list_for_each_entry(pcs, &pl->pcs_list, list)
> > + phy_interface_or(pl->supported_interfaces,
> > + pl->supported_interfaces,
> > + pcs->supported_interfaces);
> > +
>
> I'm not entirely sure about that, we may need to restrict the supported_interfaces
> from the MAC.
>
> As an example, take mvpp2. We have 2 PCSs, one for BaseX/SGMII, one for BaseR. But
> if we don't have a comphy (generic PHY) device, then we can't use all the
> combination of modes our PCSs can provide :
>
> https://elixir.bootlin.com/linux/v7.1-rc7/source/drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c#L7074
>
> These aren't external PCS IPs, but from what I understand you'd like to
> handle these the same way as purely external PCSs, right ?
>
> I'd say the MAC driver utltimately has the knowledge of all possible interfaces.
>
> The way I see it, it's probably safer to let the MAC give a wide range of interfaces,
> and filter that down with what the PCSs can provide (i.e. turn that or into an and,
> while handling the case where the pcs supported interfaces is empty).
>
> What do you think ?
>
The idea is that supported_interface is a mask of every possible interface
from MAC and PCS. Then it's phylink_validate_mac_and_pcs that actually use
that mask and validates it on both MAC and PCS.
This is why the OR was used instead of AND. The idea is to have the PCS as
external standalone entry (even if they are internal to the MAC). So each
entry should have they own set of supported mask.
The previous patch and this try to address this problem where phylink is
actually clueless of what is actually supported exactly because it's has
been given MAC too much freedom of modelling limitation internally.
I feel limitation should be handled by their dedicated function with
.pcs_validate and .mac_get_caps.
Just my idea on this, if needed it's totally ok to simplify this and let
MAC entirely handle the mask. (but I feel the current idea of phylink code
was to have a generic mask in supported_interfaces and then verify MAC and
PCS in phylink_validate_mac_and_pcs())
But by thinking on it more, following your case of mvpp2, with this new
PCS:
- You need a PCS for the .get_state.
- And such PCS will have the supported interface set 1000baseX and
2500BaseX (as that is what is actually supported in HW)
Either some magic is done in .pcs_validate to deny changing the interface
that was initially configured or this gets limited at the
supported_interface configured by the MAC.
I need to check if this might be problematic for the other driver where
this is being used on OpenWrt but maybe changing the logic to an AND might
be sensible for these kind of case.
(for the other it shouldn't change anything)
--
Ansuel
^ permalink raw reply
* Re: [PATCH v2 04/11] ASoC: fsl_esai: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:15 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-5-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:17PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/fsl_esai.c | 16 +++++-----------
> 1 file changed, 5 insertions(+), 11 deletions(-)
>
> diff --git a/sound/soc/fsl/fsl_esai.c b/sound/soc/fsl/fsl_esai.c
> index cde0b0c6c1ef..4a530a6c33f0 100644
> --- a/sound/soc/fsl/fsl_esai.c
> +++ b/sound/soc/fsl/fsl_esai.c
> @@ -709,10 +709,9 @@ static void fsl_esai_hw_reset(struct work_struct *work)
> {
> struct fsl_esai *esai_priv = container_of(work, struct fsl_esai, work);
> bool tx = true, rx = false, enabled[2];
> - unsigned long lock_flags;
> u32 tfcr, rfcr;
>
> - spin_lock_irqsave(&esai_priv->lock, lock_flags);
> + guard(spinlock_irqsave)(&esai_priv->lock);
> /* Save the registers */
> regmap_read(esai_priv->regmap, REG_ESAI_TFCR, &tfcr);
> regmap_read(esai_priv->regmap, REG_ESAI_RFCR, &rfcr);
> @@ -750,8 +749,6 @@ static void fsl_esai_hw_reset(struct work_struct *work)
> fsl_esai_trigger_start(esai_priv, tx);
> if (enabled[rx])
> fsl_esai_trigger_start(esai_priv, rx);
> -
> - spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
> }
>
> static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
> @@ -759,7 +756,6 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
> {
> struct fsl_esai *esai_priv = snd_soc_dai_get_drvdata(dai);
> bool tx = substream->stream == SNDRV_PCM_STREAM_PLAYBACK;
> - unsigned long lock_flags;
>
> esai_priv->channels[tx] = substream->runtime->channels;
>
> @@ -767,16 +763,14 @@ static int fsl_esai_trigger(struct snd_pcm_substream *substream, int cmd,
> case SNDRV_PCM_TRIGGER_START:
> case SNDRV_PCM_TRIGGER_RESUME:
> case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
> - spin_lock_irqsave(&esai_priv->lock, lock_flags);
> - fsl_esai_trigger_start(esai_priv, tx);
> - spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
> + scoped_guard(spinlock_irqsave, &esai_priv->lock)
> + fsl_esai_trigger_start(esai_priv, tx);
> break;
> case SNDRV_PCM_TRIGGER_SUSPEND:
> case SNDRV_PCM_TRIGGER_STOP:
> case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
> - spin_lock_irqsave(&esai_priv->lock, lock_flags);
> - fsl_esai_trigger_stop(esai_priv, tx);
> - spin_unlock_irqrestore(&esai_priv->lock, lock_flags);
> + scoped_guard(spinlock_irqsave, &esai_priv->lock)
> + fsl_esai_trigger_stop(esai_priv, tx);
> break;
> default:
> return -EINVAL;
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH v2 10/11] ASoC: fsl: mpc5200_dma: Use guard() for spin locks
From: Frank Li @ 2026-06-15 14:14 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-11-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:23PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/mpc5200_dma.c | 56 ++++++++++++++++++-------------------
> 1 file changed, 28 insertions(+), 28 deletions(-)
>
> diff --git a/sound/soc/fsl/mpc5200_dma.c b/sound/soc/fsl/mpc5200_dma.c
> index 56e2cf2f727b..bfedb2dea0b3 100644
> --- a/sound/soc/fsl/mpc5200_dma.c
> +++ b/sound/soc/fsl/mpc5200_dma.c
> @@ -77,18 +77,20 @@ static irqreturn_t psc_dma_bcom_irq(int irq, void *_psc_dma_stream)
> {
> struct psc_dma_stream *s = _psc_dma_stream;
>
> - spin_lock(&s->psc_dma->lock);
> - /* For each finished period, dequeue the completed period buffer
> - * and enqueue a new one in it's place. */
> - while (bcom_buffer_done(s->bcom_task)) {
> - bcom_retrieve_buffer(s->bcom_task, NULL, NULL);
> + scoped_guard(spinlock, &s->psc_dma->lock) {
> + /*
> + * For each finished period, dequeue the completed period buffer
> + * and enqueue a new one in its place
> + */
> + while (bcom_buffer_done(s->bcom_task)) {
> + bcom_retrieve_buffer(s->bcom_task, NULL, NULL);
>
> - s->period_current = (s->period_current+1) % s->runtime->periods;
> - s->period_count++;
> + s->period_current = (s->period_current+1) % s->runtime->periods;
> + s->period_count++;
>
> - psc_dma_bcom_enqueue_next_buffer(s);
> + psc_dma_bcom_enqueue_next_buffer(s);
> + }
> }
> - spin_unlock(&s->psc_dma->lock);
>
> /* If the stream is active, then also inform the PCM middle layer
> * of the period finished event. */
> @@ -116,7 +118,6 @@ static int psc_dma_trigger(struct snd_soc_component *component,
> struct psc_dma_stream *s = to_psc_dma_stream(substream, psc_dma);
> struct mpc52xx_psc __iomem *regs = psc_dma->psc_regs;
> u16 imr;
> - unsigned long flags;
> int i;
>
> switch (cmd) {
> @@ -135,19 +136,18 @@ static int psc_dma_trigger(struct snd_soc_component *component,
> /* Fill up the bestcomm bd queue and enable DMA.
> * This will begin filling the PSC's fifo.
> */
> - spin_lock_irqsave(&psc_dma->lock, flags);
> -
> - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
> - bcom_gen_bd_rx_reset(s->bcom_task);
> - else
> - bcom_gen_bd_tx_reset(s->bcom_task);
> + scoped_guard(spinlock_irqsave, &psc_dma->lock) {
> + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
> + bcom_gen_bd_rx_reset(s->bcom_task);
> + else
> + bcom_gen_bd_tx_reset(s->bcom_task);
>
> - for (i = 0; i < runtime->periods; i++)
> - if (!bcom_queue_full(s->bcom_task))
> - psc_dma_bcom_enqueue_next_buffer(s);
> + for (i = 0; i < runtime->periods; i++)
> + if (!bcom_queue_full(s->bcom_task))
> + psc_dma_bcom_enqueue_next_buffer(s);
>
> - bcom_enable(s->bcom_task);
> - spin_unlock_irqrestore(&psc_dma->lock, flags);
> + bcom_enable(s->bcom_task);
> + }
>
> out_8(®s->command, MPC52xx_PSC_RST_ERR_STAT);
>
> @@ -158,13 +158,13 @@ static int psc_dma_trigger(struct snd_soc_component *component,
> substream->pstr->stream, s->period_count);
> s->active = 0;
>
> - spin_lock_irqsave(&psc_dma->lock, flags);
> - bcom_disable(s->bcom_task);
> - if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
> - bcom_gen_bd_rx_reset(s->bcom_task);
> - else
> - bcom_gen_bd_tx_reset(s->bcom_task);
> - spin_unlock_irqrestore(&psc_dma->lock, flags);
> + scoped_guard(spinlock_irqsave, &psc_dma->lock) {
> + bcom_disable(s->bcom_task);
> + if (substream->pstr->stream == SNDRV_PCM_STREAM_CAPTURE)
> + bcom_gen_bd_rx_reset(s->bcom_task);
> + else
> + bcom_gen_bd_tx_reset(s->bcom_task);
> + }
>
> break;
>
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH v2 09/11] ASoC: fsl_rpmsg: Use guard() for mutex & spin locks
From: Frank Li @ 2026-06-15 14:12 UTC (permalink / raw)
To: phucduc.bui
Cc: Mark Brown, Liam Girdwood, Jaroslav Kysela, Takashi Iwai,
Shengjiu Wang, Xiubo Li, Frank Li, Fabio Estevam, Nicolin Chen,
Sascha Hauer, Pengutronix Kernel Team, linux-sound, linux-kernel,
linux-arm-kernel, imx, linuxppc-dev
In-Reply-To: <20260615093824.115751-10-phucduc.bui@gmail.com>
On Mon, Jun 15, 2026 at 04:38:22PM +0700, phucduc.bui@gmail.com wrote:
> From: bui duc phuc <phucduc.bui@gmail.com>
>
> Clean up the code using guard() for mutex & spin locks.
> Merely code refactoring, and no behavior change.
>
> Signed-off-by: bui duc phuc <phucduc.bui@gmail.com>
> ---
Reviewed-by: Frank Li <Frank.Li@nxp.com>
> sound/soc/fsl/imx-pcm-rpmsg.c | 69 +++++++++++++++--------------------
> 1 file changed, 30 insertions(+), 39 deletions(-)
>
> diff --git a/sound/soc/fsl/imx-pcm-rpmsg.c b/sound/soc/fsl/imx-pcm-rpmsg.c
> index 031e5272215d..7210393dfa5d 100644
> --- a/sound/soc/fsl/imx-pcm-rpmsg.c
> +++ b/sound/soc/fsl/imx-pcm-rpmsg.c
> @@ -39,10 +39,9 @@ static int imx_rpmsg_pcm_send_message(struct rpmsg_msg *msg,
> struct rpmsg_device *rpdev = info->rpdev;
> int ret = 0;
>
> - mutex_lock(&info->msg_lock);
> + guard(mutex)(&info->msg_lock);
> if (!rpdev) {
> dev_err(info->dev, "rpmsg channel not ready\n");
> - mutex_unlock(&info->msg_lock);
> return -EINVAL;
> }
>
> @@ -55,15 +54,12 @@ static int imx_rpmsg_pcm_send_message(struct rpmsg_msg *msg,
> sizeof(struct rpmsg_s_msg));
> if (ret) {
> dev_err(&rpdev->dev, "rpmsg_send failed: %d\n", ret);
> - mutex_unlock(&info->msg_lock);
> return ret;
> }
>
> /* No receive msg for TYPE_C command */
> - if (msg->s_msg.header.type == MSG_TYPE_C) {
> - mutex_unlock(&info->msg_lock);
> + if (msg->s_msg.header.type == MSG_TYPE_C)
> return 0;
> - }
>
> /* wait response from rpmsg */
> ret = wait_for_completion_timeout(&info->cmd_complete,
> @@ -71,7 +67,6 @@ static int imx_rpmsg_pcm_send_message(struct rpmsg_msg *msg,
> if (!ret) {
> dev_err(&rpdev->dev, "rpmsg_send cmd %d timeout!\n",
> msg->s_msg.header.cmd);
> - mutex_unlock(&info->msg_lock);
> return -ETIMEDOUT;
> }
>
> @@ -100,8 +95,6 @@ static int imx_rpmsg_pcm_send_message(struct rpmsg_msg *msg,
> dev_dbg(&rpdev->dev, "cmd:%d, resp %d\n", msg->s_msg.header.cmd,
> info->r_msg.param.resp);
>
> - mutex_unlock(&info->msg_lock);
> -
> return 0;
> }
>
> @@ -109,14 +102,13 @@ static int imx_rpmsg_insert_workqueue(struct snd_pcm_substream *substream,
> struct rpmsg_msg *msg,
> struct rpmsg_info *info)
> {
> - unsigned long flags;
> int ret = 0;
>
> /*
> * Queue the work to workqueue.
> * If the queue is full, drop the message.
> */
> - spin_lock_irqsave(&info->wq_lock, flags);
> + guard(spinlock_irqsave)(&info->wq_lock);
> if (info->work_write_index != info->work_read_index) {
> int index = info->work_write_index;
>
> @@ -130,7 +122,6 @@ static int imx_rpmsg_insert_workqueue(struct snd_pcm_substream *substream,
> info->msg_drop_count[substream->stream]++;
> ret = -EPIPE;
> }
> - spin_unlock_irqrestore(&info->wq_lock, flags);
>
> return ret;
> }
> @@ -523,7 +514,6 @@ static int imx_rpmsg_pcm_ack(struct snd_soc_component *component,
> snd_pcm_sframes_t avail;
> struct timer_list *timer;
> struct rpmsg_msg *msg;
> - unsigned long flags;
> int buffer_tail = 0;
> int written_num;
>
> @@ -553,11 +543,11 @@ static int imx_rpmsg_pcm_ack(struct snd_soc_component *component,
> msg->s_msg.param.buffer_tail = buffer_tail;
>
> /* The notification message is updated to latest */
> - spin_lock_irqsave(&info->lock[substream->stream], flags);
> - memcpy(&info->notify[substream->stream], msg,
> - sizeof(struct rpmsg_s_msg));
> - info->notify_updated[substream->stream] = true;
> - spin_unlock_irqrestore(&info->lock[substream->stream], flags);
> + scoped_guard(spinlock_irqsave, &info->lock[substream->stream]) {
> + memcpy(&info->notify[substream->stream], msg,
> + sizeof(struct rpmsg_s_msg));
> + info->notify_updated[substream->stream] = true;
> + }
>
> if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
> avail = snd_pcm_playback_hw_avail(runtime);
> @@ -640,7 +630,7 @@ static void imx_rpmsg_pcm_work(struct work_struct *work)
> bool is_notification = false;
> struct rpmsg_info *info;
> struct rpmsg_msg msg;
> - unsigned long flags;
> + bool updated;
>
> work_of_rpmsg = container_of(work, struct work_of_rpmsg, work);
> info = work_of_rpmsg->info;
> @@ -651,25 +641,26 @@ static void imx_rpmsg_pcm_work(struct work_struct *work)
> * enough data in M core side, need to let M core know
> * data is updated immediately.
> */
> - spin_lock_irqsave(&info->lock[TX], flags);
> - if (info->notify_updated[TX]) {
> - memcpy(&msg, &info->notify[TX], sizeof(struct rpmsg_s_msg));
> - info->notify_updated[TX] = false;
> - spin_unlock_irqrestore(&info->lock[TX], flags);
> - info->send_message(&msg, info);
> - } else {
> - spin_unlock_irqrestore(&info->lock[TX], flags);
> + scoped_guard(spinlock_irqsave, &info->lock[TX]) {
> + updated = info->notify_updated[TX];
> + if (updated) {
> + memcpy(&msg, &info->notify[TX], sizeof(struct rpmsg_s_msg));
> + info->notify_updated[TX] = false;
> + }
> }
> -
> - spin_lock_irqsave(&info->lock[RX], flags);
> - if (info->notify_updated[RX]) {
> - memcpy(&msg, &info->notify[RX], sizeof(struct rpmsg_s_msg));
> - info->notify_updated[RX] = false;
> - spin_unlock_irqrestore(&info->lock[RX], flags);
> + if (updated)
> info->send_message(&msg, info);
> - } else {
> - spin_unlock_irqrestore(&info->lock[RX], flags);
> +
> + scoped_guard(spinlock_irqsave, &info->lock[RX]) {
> + updated = info->notify_updated[RX];
> + if (updated) {
> + memcpy(&msg, &info->notify[RX], sizeof(struct rpmsg_s_msg));
> + info->notify_updated[RX] = false;
> + }
> }
> + if (updated)
> + info->send_message(&msg, info);
> +
>
> /* Skip the notification message for it has been processed above */
> if (work_of_rpmsg->msg.s_msg.header.type == MSG_TYPE_C &&
> @@ -681,10 +672,10 @@ static void imx_rpmsg_pcm_work(struct work_struct *work)
> info->send_message(&work_of_rpmsg->msg, info);
>
> /* update read index */
> - spin_lock_irqsave(&info->wq_lock, flags);
> - info->work_read_index++;
> - info->work_read_index %= WORK_MAX_NUM;
> - spin_unlock_irqrestore(&info->wq_lock, flags);
> + scoped_guard(spinlock_irqsave, &info->wq_lock) {
> + info->work_read_index++;
> + info->work_read_index %= WORK_MAX_NUM;
> + }
> }
>
> static int imx_rpmsg_pcm_probe(struct platform_device *pdev)
> --
> 2.43.0
>
>
^ permalink raw reply
* Re: [PATCH 0/2] iio: adc: Initialize completions before requesting IRQs
From: Andy Shevchenko @ 2026-06-15 14:11 UTC (permalink / raw)
To: Maxwell Doose
Cc: Jonathan Cameron, David Lechner, Nuno Sá, Andy Shevchenko,
Vladimir Zapolskiy, Piotr Wojtaszczyk, Hartmut Knaack,
open list:IIO SUBSYSTEM AND DRIVERS,
moderated list:ARM/LPC32XX SOC SUPPORT, open list, Sangyun Kim,
Kyungwook Boo, Jaeyoung Chung
In-Reply-To: <20260613005812.160572-1-m32285159@gmail.com>
On Fri, Jun 12, 2026 at 07:58:09PM -0500, Maxwell Doose wrote:
> Hi all,
>
> This short patch series fixes the issues raised by Jaeyoung Chung,
> Sangyun Kim, and Kyungwook Boo regarding init_completion() and spurious
> IRQs. The report is linked below [1], but I will also put it here
> inline:
>
> "lpc32xx_adc_probe() in drivers/iio/adc/lpc32xx_adc.c and
> spear_adc_probe() in drivers/iio/adc/spear_adc.c register their
> interrupt handler with devm_request_irq() before they initialize
> st->completion with init_completion(). If an interrupt arrives after
> devm_request_irq() and before init_completion(), the handler calls
> complete() on an uninitialized completion, causing a kernel panic.
>
> The probe path, in lpc32xx_adc_probe():
>
> iodev = devm_iio_device_alloc(&pdev->dev, sizeof(*st)); /* st kzalloc-zeroed */
> ...
> retval = devm_request_irq(&pdev->dev, irq, lpc32xx_adc_isr, 0,
> LPC32XXAD_NAME, st); /* register handler */
> ...
> init_completion(&st->completion); /* initialize completion */
>
> spear_adc_probe() has the same ordering: devm_request_irq() for
> spear_adc_isr() before init_completion(&st->completion).
>
> Both interrupt handlers, lpc32xx_adc_isr() and spear_adc_isr(), call
> complete():
>
> complete(&st->completion);
>
> If the device raises an interrupt before init_completion() runs,
> complete() acquires the uninitialized wait.lock and walks the zeroed
> task_list in swake_up_locked(). The zeroed task_list makes list_empty()
> return false, so swake_up_locked() dereferences a NULL list entry,
> triggering a KASAN wild-memory-access.
>
> Suggested fix: move init_completion(&st->completion) above
> devm_request_irq(), so the completion is valid before the handler can run.
>
> Reported-by: Sangyun Kim <sangyun.kim@snu.ac.kr>
> Reported-by: Kyungwook Boo <bookyungwook@gmail.com>"
Reviewed-by: Andy Shevchenko <andriy.shevchenko@intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply
* Re: [PATCH net-next v7 05/12] net: phylink: support late PCS provider attach
From: Christian Marangi @ 2026-06-15 14:10 UTC (permalink / raw)
To: Maxime Chevallier
Cc: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, Jonathan Corbet, Shuah Khan, Lorenzo Bianconi,
Heiner Kallweit, Russell King, Saravana Kannan, Philipp Zabel,
Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
netdev, devicetree, linux-kernel, linux-doc, linux-arm-kernel,
linux-mediatek, llvm
In-Reply-To: <867a39de-ccc2-4dcf-be24-ab2542d20ab6@bootlin.com>
On Mon, Jun 15, 2026 at 04:07:03PM +0200, Maxime Chevallier wrote:
> Hi Christian,
>
> On 6/15/26 14:29, Christian Marangi wrote:
> > Add support for late PCS provider attachment to a phylink instance.
> > This works by creating a global notifier for the PCS provider and
> > making each phylink instance that makes use of fwnode subscribe to
> > this notifier.
> >
> > The PCS notifier will emit the event FWNODE_PCS_PROVIDER_ADD every time
> > a new PCS provider is added.
> >
> > phylink will then react to this event and will call the new function
> > fwnode_phylink_pcs_get_from_fwnode() that will check if the PCS fwnode
> > provided by the event is present in the pcs-handle property of the
> > phylink instance.
> >
> > If a related PCS is found, then such PCS is added to the phylink
> > instance PCS list.
> >
> > Then we link the PCS to the phylink instance and we refresh the supported
> > interfaces of the phylink instance.
> >
> > Finally we check if we are in a major_config_failed scenario and trigger
> > an interface reconfiguration in the next phylink resolve.
> >
> > In the example scenario where the link was previously torn down due to
> > removal of PCS, the link will be established again as the PCS came back
> > and is now available to phylink.
> >
> > Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> > ---
>
> [...]
>
> > @@ -2151,6 +2204,10 @@ void phylink_destroy(struct phylink *pl)
> > if (pl->link_gpio)
> > gpiod_put(pl->link_gpio);
> >
> > + /* Unregister notifier for late PCS attach */
> > + if (pl->fwnode_pcs_nb.notifier_call)
> > + unregister_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
>
> I wanted to try this out, but I get :
>
> drivers/net/phy/phylink.c:2218:17: error: implicit declaration of function ‘unregister_fwnode_pcs_notifier’; did you mean ‘register_fwnode_pcs_notifier’? [-Werror=implicit-function-declaration]
> 2218 | unregister_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
> | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> | register_fwnode_pcs_notifier
>
> I guess you either need to stub this, or there's a missing Kconfig
> dependency somewhere
>
Hi yes if you want toi test just enable CONFIG_FWNODE_PCS. I forgot to add
the static declaration for unregister_fwnode_pcs_notifier.
--
Ansuel
^ permalink raw reply
* [PATCH net-next v7 01/12] net: phylink: keep and use MAC supported_interfaces in phylink struct
From: Christian Marangi @ 2026-06-15 12:29 UTC (permalink / raw)
To: Andrew Lunn, David S. Miller, Eric Dumazet, Jakub Kicinski,
Paolo Abeni, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
Simon Horman, Jonathan Corbet, Shuah Khan, Christian Marangi,
Lorenzo Bianconi, Heiner Kallweit, Russell King, Saravana Kannan,
Philipp Zabel, Nathan Chancellor, Nick Desaulniers, Bill Wendling,
Justin Stitt, netdev, devicetree, linux-kernel, linux-doc,
linux-arm-kernel, linux-mediatek, llvm
In-Reply-To: <20260615122950.22281-1-ansuelsmth@gmail.com>
Add in phylink struct a copy of supported_interfaces from phylink_config
and make use of that instead of relying on phylink_config value.
This in preparation for support of PCS handling internally to phylink
where a PCS can be removed or added after the phylink is created and we
need both a reference of the supported_interfaces value from
phylink_config and an internal value that can be updated with the new
PCS info.
Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
---
drivers/net/phy/phylink.c | 22 +++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index 087ac63f9193..4d59c0dd78db 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -60,6 +60,11 @@ struct phylink {
/* The link configuration settings */
struct phylink_link_state link_config;
+ /* What interface are supported by the current link.
+ * Can change on removal or addition of new PCS.
+ */
+ DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
+
/* The current settings */
phy_interface_t cur_interface;
@@ -629,7 +634,7 @@ static int phylink_validate_mask(struct phylink *pl, struct phy_device *phy,
static int phylink_validate(struct phylink *pl, unsigned long *supported,
struct phylink_link_state *state)
{
- const unsigned long *interfaces = pl->config->supported_interfaces;
+ const unsigned long *interfaces = pl->supported_interfaces;
if (state->interface == PHY_INTERFACE_MODE_NA)
return phylink_validate_mask(pl, NULL, supported, state,
@@ -1868,6 +1873,9 @@ struct phylink *phylink_create(struct phylink_config *config,
mutex_init(&pl->state_mutex);
INIT_WORK(&pl->resolve, phylink_resolve);
+ phy_interface_copy(pl->supported_interfaces,
+ config->supported_interfaces);
+
pl->config = config;
if (config->type == PHYLINK_NETDEV) {
pl->netdev = to_net_dev(config->dev);
@@ -2026,7 +2034,7 @@ static int phylink_validate_phy(struct phylink *pl, struct phy_device *phy,
* those which the host supports.
*/
phy_interface_and(interfaces, phy->possible_interfaces,
- pl->config->supported_interfaces);
+ pl->supported_interfaces);
if (phy_interface_empty(interfaces)) {
phylink_err(pl, "PHY has no common interfaces\n");
@@ -2828,12 +2836,12 @@ static phy_interface_t phylink_sfp_select_interface(struct phylink *pl,
return interface;
}
- if (!test_bit(interface, pl->config->supported_interfaces)) {
+ if (!test_bit(interface, pl->supported_interfaces)) {
phylink_err(pl,
"selection of interface failed, SFP selected %s (%u) but MAC supports %*pbl\n",
phy_modes(interface), interface,
(int)PHY_INTERFACE_MODE_MAX,
- pl->config->supported_interfaces);
+ pl->supported_interfaces);
return PHY_INTERFACE_MODE_NA;
}
@@ -3761,14 +3769,14 @@ static int phylink_sfp_config_optical(struct phylink *pl)
phylink_dbg(pl, "optical SFP: interfaces=[mac=%*pbl, sfp=%*pbl]\n",
(int)PHY_INTERFACE_MODE_MAX,
- pl->config->supported_interfaces,
+ pl->supported_interfaces,
(int)PHY_INTERFACE_MODE_MAX,
pl->sfp_interfaces);
/* Find the union of the supported interfaces by the PCS/MAC and
* the SFP module.
*/
- phy_interface_and(pl->sfp_interfaces, pl->config->supported_interfaces,
+ phy_interface_and(pl->sfp_interfaces, pl->supported_interfaces,
pl->sfp_interfaces);
if (phy_interface_empty(pl->sfp_interfaces)) {
phylink_err(pl, "unsupported SFP module: no common interface modes\n");
@@ -3939,7 +3947,7 @@ static int phylink_sfp_connect_phy(void *upstream, struct phy_device *phy)
/* Set the PHY's host supported interfaces */
phy_interface_and(phy->host_interfaces, phylink_sfp_interfaces,
- pl->config->supported_interfaces);
+ pl->supported_interfaces);
/* Do the initial configuration */
return phylink_sfp_config_phy(pl, phy);
--
2.53.0
^ permalink raw reply related
* Re: [PATCH net-next v7 05/12] net: phylink: support late PCS provider attach
From: Maxime Chevallier @ 2026-06-15 14:07 UTC (permalink / raw)
To: Christian Marangi, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Simon Horman, Jonathan Corbet, Shuah Khan,
Lorenzo Bianconi, Heiner Kallweit, Russell King, Saravana Kannan,
Philipp Zabel, Nathan Chancellor, Nick Desaulniers, Bill Wendling,
Justin Stitt, netdev, devicetree, linux-kernel, linux-doc,
linux-arm-kernel, linux-mediatek, llvm
In-Reply-To: <20260615122950.22281-6-ansuelsmth@gmail.com>
Hi Christian,
On 6/15/26 14:29, Christian Marangi wrote:
> Add support for late PCS provider attachment to a phylink instance.
> This works by creating a global notifier for the PCS provider and
> making each phylink instance that makes use of fwnode subscribe to
> this notifier.
>
> The PCS notifier will emit the event FWNODE_PCS_PROVIDER_ADD every time
> a new PCS provider is added.
>
> phylink will then react to this event and will call the new function
> fwnode_phylink_pcs_get_from_fwnode() that will check if the PCS fwnode
> provided by the event is present in the pcs-handle property of the
> phylink instance.
>
> If a related PCS is found, then such PCS is added to the phylink
> instance PCS list.
>
> Then we link the PCS to the phylink instance and we refresh the supported
> interfaces of the phylink instance.
>
> Finally we check if we are in a major_config_failed scenario and trigger
> an interface reconfiguration in the next phylink resolve.
>
> In the example scenario where the link was previously torn down due to
> removal of PCS, the link will be established again as the PCS came back
> and is now available to phylink.
>
> Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> ---
[...]
> @@ -2151,6 +2204,10 @@ void phylink_destroy(struct phylink *pl)
> if (pl->link_gpio)
> gpiod_put(pl->link_gpio);
>
> + /* Unregister notifier for late PCS attach */
> + if (pl->fwnode_pcs_nb.notifier_call)
> + unregister_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
I wanted to try this out, but I get :
drivers/net/phy/phylink.c:2218:17: error: implicit declaration of function ‘unregister_fwnode_pcs_notifier’; did you mean ‘register_fwnode_pcs_notifier’? [-Werror=implicit-function-declaration]
2218 | unregister_fwnode_pcs_notifier(&pl->fwnode_pcs_nb);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| register_fwnode_pcs_notifier
I guess you either need to stub this, or there's a missing Kconfig
dependency somewhere
Maxime
^ permalink raw reply
* [PATCH] media: meson: vdec: fix use-after-free of decode work in stop/close path
From: Doruk Tan Ozturk @ 2026-06-15 14:05 UTC (permalink / raw)
To: neil.armstrong, mchehab, gregkh, khilman
Cc: jbrunet, martin.blumenstingl, mjourdan, hverkuil, linux-media,
linux-amlogic, linux-staging, linux-arm-kernel, linux-kernel,
Doruk Tan Ozturk, stable
vdec_close() calls v4l2_m2m_ctx_release() and then kfree(sess) without
ever cancelling sess->esparser_queue_work. The worker
esparser_queue_all_src() takes sess->lock and walks the source buffers
of sess->m2m_ctx, so if it is still pending or running when the session
is torn down it dereferences freed memory.
The work is (re-)armed from several places, including amvdec_buf_done(),
which runs from the decode-completion/IRQ path. That makes the obvious
fixes insufficient:
- v4l2_m2m_ctx_release() frees m2m_ctx (and runs stop_streaming via
vb2_queue_release()), but never cancels the work. Cancelling in
vdec_close() after v4l2_m2m_ctx_release() would wait on a worker that
may already be dereferencing the now-freed m2m_ctx.
- Cancelling in vdec_close() before v4l2_m2m_ctx_release() keeps
m2m_ctx valid, but the hardware is still live, so amvdec_buf_done()
can re-arm the work right after the cancel, reintroducing the UAF.
Cancel the work in vdec_stop_streaming() instead, right after
vdec_poweroff() has quiesced the hardware (so its IRQ can no longer
re-arm the work) and while sess->m2m_ctx is still valid. Because
v4l2_m2m_ctx_release() always tears the queues down through
vb2_queue_release() -> __vb2_queue_cancel() -> stop_streaming, this
single cancel covers both the STREAMOFF and the close paths.
This does not deadlock: the queue lock (sess->lock, shared by both vb2
queues) is taken by the worker, but neither the STREAMOFF path
(video_ioctl2 serialises on vdev->lock == core->lock, and
v4l2_m2m_streamoff() calls the lockless vb2_streamoff()) nor the close
path (vb2_queue_release()) holds sess->lock when stop_streaming runs, so
cancel_work_sync() can safely wait for the worker.
Fixes: 3e7f51bd9607 ("media: meson: add v4l2 m2m video decoder driver")
Cc: stable@vger.kernel.org
Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
---
drivers/staging/media/meson/vdec/vdec.c | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/drivers/staging/media/meson/vdec/vdec.c b/drivers/staging/media/meson/vdec/vdec.c
index 4b77ec1af5a7..42822064cf8d 100644
--- a/drivers/staging/media/meson/vdec/vdec.c
+++ b/drivers/staging/media/meson/vdec/vdec.c
@@ -419,6 +419,16 @@ static void vdec_stop_streaming(struct vb2_queue *q)
sess->status = STATUS_STOPPED;
}
+ /*
+ * The esparser_queue_work worker dereferences sess->m2m_ctx and
+ * sess->lock. The hardware (and its IRQ, which re-arms the work via
+ * amvdec_buf_done()) has been quiesced by vdec_poweroff() above, so
+ * no new work can be scheduled past this point. m2m_ctx is still
+ * valid here. Wait for any in-flight worker to finish before the
+ * buffers and (on the close path) m2m_ctx are torn down.
+ */
+ cancel_work_sync(&sess->esparser_queue_work);
+
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT_MPLANE) {
while ((buf = v4l2_m2m_src_buf_remove(sess->m2m_ctx)))
v4l2_m2m_buf_done(buf, VB2_BUF_STATE_ERROR);
--
2.43.0
^ permalink raw reply related
* [PATCH] media: mediatek: vcodec: fix use-after-free in decoder release path
From: Doruk Tan Ozturk @ 2026-06-15 14:05 UTC (permalink / raw)
To: tiffany.lin, andrew-ct.chen, yunfei.dong, mchehab, matthias.bgg,
angelogioacchino.delregno
Cc: hverkuil+cisco, linux-media, linux-mediatek, linux-arm-kernel,
linux-kernel, Doruk Tan Ozturk, stable
fops_vcodec_release() frees the decoder context with kfree(ctx) but
never cancels the per-context decode_work worker first. Although
v4l2_m2m_ctx_release() waits for any in-flight m2m job to finish, the
workqueue handler (mtk_vdec_worker) may still be running and accessing
the context after v4l2_m2m_job_finish() returns. Once kfree(ctx) runs,
that worker dereferences freed memory, resulting in a use-after-free.
Cancel the pending decode work with cancel_work_sync(&ctx->decode_work)
after the controls and m2m context are torn down and before kfree(ctx),
mirroring the fix already applied to the encoder release path in
commit 76e35091ffc7 ("media: mediatek: vcodec: fix use-after-free in encoder release path").
decode_work is always initialised before release can run:
fops_vcodec_open() calls mtk_vcodec_dec_set_default_params() (its only
caller) unconditionally after a successful v4l2_m2m_ctx_init(), and that
function runs INIT_WORK(&ctx->decode_work, ...). A context can only reach
fops_vcodec_release() via an open() that returned 0, i.e. one that passed
that INIT_WORK. cancel_work_sync() on a properly initialised work_struct
is therefore always safe, even if the work was never queued. This is
unlike the 2023 msg_queue->core_work regression, where the work item
could be uninitialised at cancel time.
Fixes: 590577a4e525 ("[media] vcodec: mediatek: Add Mediatek V4L2 Video Decoder Driver")
Cc: stable@vger.kernel.org
Signed-off-by: Doruk Tan Ozturk <doruk@0sec.ai>
---
.../mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c
index e936ed8dffbaf..30906b24c608a 100644
--- a/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c
+++ b/drivers/media/platform/mediatek/vcodec/decoder/mtk_vcodec_dec_drv.c
@@ -313,6 +313,15 @@ static int fops_vcodec_release(struct file *file)
v4l2_fh_exit(&ctx->fh);
v4l2_ctrl_handler_free(&ctx->ctrl_hdl);
+ /*
+ * Cancel any pending decode work before freeing the context.
+ * Although v4l2_m2m_ctx_release() waits for m2m job completion,
+ * the workqueue handler (mtk_vdec_worker) may still be accessing
+ * the context after v4l2_m2m_job_finish() returns. Without this,
+ * a use-after-free occurs when the worker accesses ctx after kfree.
+ */
+ cancel_work_sync(&ctx->decode_work);
+
mtk_vcodec_dbgfs_remove(dev, ctx->id);
spin_lock_irqsave(&dev->dev_ctx_lock, flags);
list_del_init(&ctx->list);
--
2.43.0
^ permalink raw reply related
* Re: [PATCH v1] MAINTAINERS: Add git tree for TI K3 ARCHITECTURE
From: Francesco Dolcini @ 2026-06-15 13:55 UTC (permalink / raw)
To: Nishanth Menon
Cc: Francesco Dolcini, Vignesh Raghavendra, Tero Kristo,
linux-arm-kernel, linux-kernel, Francesco Dolcini
In-Reply-To: <20260615134608.adr62go2doeggkaj@margin>
On Mon, Jun 15, 2026 at 08:46:08AM -0500, Nishanth Menon wrote:
> On 15:26-20260615, Francesco Dolcini wrote:
> > From: Francesco Dolcini <francesco.dolcini@toradex.com>
> >
> > Add git tree for TI K3 architecture.
> >
> > Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
>
> Thanks for adding this in..
> > ---
> > MAINTAINERS | 1 +
> > 1 file changed, 1 insertion(+)
> >
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index 8629ed2aa82f..cbc56dc242b9 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -3756,6 +3756,7 @@ M: Vignesh Raghavendra <vigneshr@ti.com>
> > M: Tero Kristo <kristo@kernel.org>
> > L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
> > S: Supported
> > +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git
>
> Is it better to use https?
> https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git ?
I followed what is used in 95% of the instances for git.kernel.org,
and we have git:// for the other 2 instances of the TI git tree.
If there is a value on using https:// it should be done on the whole file.
My preference would be to merge this as it is, if you disagree I can
send a v2.
Francesco
^ permalink raw reply
* [PATCH resend] drm: uapi: Add macro for chipset specific event ID region
From: Bence Csokas @ 2026-06-15 13:52 UTC (permalink / raw)
To: dri-devel, linux-kernel, linux-arm-kernel, linux-samsung-soc
Cc: Bence Csokas, Daniel Kiss, David Airlie, Simona Vetter,
Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, Inki Dae,
Seung-Woo Kim, Kyungmin Park, Krzysztof Kozlowski, Alim Akhtar,
Zack Rusin, Broadcom internal kernel review list
uapi/drm/drm.h states:
Event types 0 - 0x7fffffff are generic DRM events, 0x80000000 and
up are chipset specific.
However, this distinction was not put in the code. To elevate the contract
between the generic DRM framework and the driver from the comment to code,
put this in a macro for clarity and convenience.
Cc: Daniel Kiss <Daniel.Kiss@arm.com>
Signed-off-by: Bence Csokas <bence.csokas@arm.com>
---
include/uapi/drm/drm.h | 8 ++++++++
include/uapi/drm/exynos_drm.h | 4 ++--
include/uapi/drm/virtgpu_drm.h | 2 +-
include/uapi/drm/vmwgfx_drm.h | 2 +-
4 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h
index 27cc159c1d27..aa745e643ef4 100644
--- a/include/uapi/drm/drm.h
+++ b/include/uapi/drm/drm.h
@@ -1419,6 +1419,14 @@ struct drm_event {
* The event payload is a struct drm_event_crtc_sequence.
*/
#define DRM_EVENT_CRTC_SEQUENCE 0x03
+/**
+ * DRM_EVENT_VENDOR_SPECIFIC - vendor/chipset specific event
+ *
+ * These event IDs are reserved for chipset and driver specific events.
+ *
+ * Refer to the chipset driver's header for details and payload struct.
+ */
+#define DRM_EVENT_VENDOR_SPECIFIC(_v) ((_v) | 0x80000000)
struct drm_event_vblank {
struct drm_event base;
diff --git a/include/uapi/drm/exynos_drm.h b/include/uapi/drm/exynos_drm.h
index a51aa1c618c1..8d3156fb129c 100644
--- a/include/uapi/drm/exynos_drm.h
+++ b/include/uapi/drm/exynos_drm.h
@@ -395,8 +395,8 @@ struct drm_exynos_ioctl_ipp_commit {
DRM_EXYNOS_IPP_COMMIT, struct drm_exynos_ioctl_ipp_commit)
/* Exynos specific events */
-#define DRM_EXYNOS_G2D_EVENT 0x80000000
-#define DRM_EXYNOS_IPP_EVENT 0x80000002
+#define DRM_EXYNOS_G2D_EVENT DRM_EVENT_VENDOR_SPECIFIC(0x0)
+#define DRM_EXYNOS_IPP_EVENT DRM_EVENT_VENDOR_SPECIFIC(0x2)
struct drm_exynos_g2d_event {
struct drm_event base;
diff --git a/include/uapi/drm/virtgpu_drm.h b/include/uapi/drm/virtgpu_drm.h
index 9debb320c34b..03e8a0c7f778 100644
--- a/include/uapi/drm/virtgpu_drm.h
+++ b/include/uapi/drm/virtgpu_drm.h
@@ -224,7 +224,7 @@ struct drm_virtgpu_context_init {
* effect. The event size is sizeof(drm_event), since there is no additional
* payload.
*/
-#define VIRTGPU_EVENT_FENCE_SIGNALED 0x90000000
+#define VIRTGPU_EVENT_FENCE_SIGNALED DRM_EVENT_VENDOR_SPECIFIC(0x10000000)
#define DRM_IOCTL_VIRTGPU_MAP \
DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map)
diff --git a/include/uapi/drm/vmwgfx_drm.h b/include/uapi/drm/vmwgfx_drm.h
index 7d786a0cc835..5e5878384e60 100644
--- a/include/uapi/drm/vmwgfx_drm.h
+++ b/include/uapi/drm/vmwgfx_drm.h
@@ -715,7 +715,7 @@ struct drm_vmw_fence_arg {
/*
* The event type
*/
-#define DRM_VMW_EVENT_FENCE_SIGNALED 0x80000000
+#define DRM_VMW_EVENT_FENCE_SIGNALED DRM_EVENT_VENDOR_SPECIFIC(0x0)
struct drm_vmw_event_fence {
struct drm_event base;
base-commit: 0e0611827f3349d0a2ac121c023a6d3260dcecdb
--
2.54.0
^ permalink raw reply related
* Re: [PATCH v1] MAINTAINERS: Add git tree for TI K3 ARCHITECTURE
From: Nishanth Menon @ 2026-06-15 13:46 UTC (permalink / raw)
To: Francesco Dolcini
Cc: Vignesh Raghavendra, Tero Kristo, linux-arm-kernel, linux-kernel,
Francesco Dolcini
In-Reply-To: <20260615132640.161584-1-francesco@dolcini.it>
On 15:26-20260615, Francesco Dolcini wrote:
> From: Francesco Dolcini <francesco.dolcini@toradex.com>
>
> Add git tree for TI K3 architecture.
>
> Signed-off-by: Francesco Dolcini <francesco.dolcini@toradex.com>
Thanks for adding this in..
> ---
> MAINTAINERS | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 8629ed2aa82f..cbc56dc242b9 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -3756,6 +3756,7 @@ M: Vignesh Raghavendra <vigneshr@ti.com>
> M: Tero Kristo <kristo@kernel.org>
> L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
> S: Supported
> +T: git git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git
Is it better to use https?
https://git.kernel.org/pub/scm/linux/kernel/git/ti/linux.git ?
> F: Documentation/devicetree/bindings/arm/ti/k3.yaml
> F: Documentation/devicetree/bindings/hwinfo/ti,k3-socinfo.yaml
> F: arch/arm64/boot/dts/ti/Makefile
> --
> 2.47.3
>
--
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D) / Fingerprint: F8A2 8693 54EB 8232 17A3 1A34 DDB5 849D 1736 249D
https://ti.com/opensource
^ permalink raw reply
* Re: [PATCH v1 06/11] KVM: arm64: Factor out reusable vCPU reset helpers
From: Fuad Tabba @ 2026-06-15 13:45 UTC (permalink / raw)
To: Vincent Donnefort
Cc: Marc Zyngier, Oliver Upton, Will Deacon, Catalin Marinas,
Quentin Perret, Sebastian Ene, Per Larsen, Suzuki K Poulose,
Zenghui Yu, Joey Gouly, Steffen Eiden, Mark Rutland,
Jonathan Cameron, Hyunwoo Kim, linux-arm-kernel, kvmarm,
linux-kernel
In-Reply-To: <ai_7FupwNYrudRZZ@google.com>
On Mon, 15 Jun 2026 at 14:16, Vincent Donnefort <vdonnefort@google.com> wrote:
>
> On Fri, Jun 12, 2026 at 07:59:20AM +0100, tabba@google.com wrote:
> > Pull the reusable pieces out of kvm_reset_vcpu(): expose the reset
> > PSTATE values in kvm_arm.h, and split the core register reset and the
> > PSCI-driven reset into kvm_reset_vcpu_core() and kvm_reset_vcpu_psci().
> > A follow-up series reuses these to reset protected vCPUs at EL2.
> >
> > No functional change intended.
> >
> > Signed-off-by: Fuad Tabba <tabba@google.com>
> > ---
> > arch/arm64/include/asm/kvm_arm.h | 12 ++++++
> > arch/arm64/include/asm/kvm_emulate.h | 58 +++++++++++++++++++++++++++
> > arch/arm64/kvm/reset.c | 60 ++--------------------------
> > 3 files changed, 73 insertions(+), 57 deletions(-)
> >
> > diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
> > index 3f9233b5a130..aba4ec09acd2 100644
> > --- a/arch/arm64/include/asm/kvm_arm.h
> > +++ b/arch/arm64/include/asm/kvm_arm.h
> > @@ -348,4 +348,16 @@
> > { PSR_AA32_MODE_UND, "32-bit UND" }, \
> > { PSR_AA32_MODE_SYS, "32-bit SYS" }
> >
> > +/*
> > + * ARMv8 Reset Values
> > + */
> > +#define VCPU_RESET_PSTATE_EL1 (PSR_MODE_EL1h | PSR_A_BIT | PSR_I_BIT | \
> > + PSR_F_BIT | PSR_D_BIT)
> > +
> > +#define VCPU_RESET_PSTATE_EL2 (PSR_MODE_EL2h | PSR_A_BIT | PSR_I_BIT | \
> > + PSR_F_BIT | PSR_D_BIT)
> > +
> > +#define VCPU_RESET_PSTATE_SVC (PSR_AA32_MODE_SVC | PSR_AA32_A_BIT | \
> > + PSR_AA32_I_BIT | PSR_AA32_F_BIT)
> > +
> > #endif /* __ARM64_KVM_ARM_H__ */
> > diff --git a/arch/arm64/include/asm/kvm_emulate.h b/arch/arm64/include/asm/kvm_emulate.h
> > index aed9fc0b717b..8436e71c402d 100644
> > --- a/arch/arm64/include/asm/kvm_emulate.h
> > +++ b/arch/arm64/include/asm/kvm_emulate.h
> > @@ -704,4 +704,62 @@ static inline void vcpu_set_hcrx(struct kvm_vcpu *vcpu)
> > vcpu->arch.hcrx_el2 |= HCRX_EL2_EnASR;
> > }
> > }
> > +
> > +/* Reset a vcpu's core registers. */
> > +static inline void kvm_reset_vcpu_core(struct kvm_vcpu *vcpu)
> > +{
> > + u32 pstate;
> > +
> > + if (vcpu_el1_is_32bit(vcpu)) {
> > + pstate = VCPU_RESET_PSTATE_SVC;
> > + } else if (vcpu_has_nv(vcpu)) {
> > + pstate = VCPU_RESET_PSTATE_EL2;
> > + } else {
> > + pstate = VCPU_RESET_PSTATE_EL1;
> > + }
>
> nit: no brackes here, actually there were none before.
Ack.
/fuad
>
> > +
> > + /* Reset core registers */
> > + memset(vcpu_gp_regs(vcpu), 0, sizeof(*vcpu_gp_regs(vcpu)));
> > + memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs));
> > + vcpu->arch.ctxt.spsr_abt = 0;
> > + vcpu->arch.ctxt.spsr_und = 0;
> > + vcpu->arch.ctxt.spsr_irq = 0;
> > + vcpu->arch.ctxt.spsr_fiq = 0;
> > + vcpu_gp_regs(vcpu)->pstate = pstate;
> > +}
> > +
> > +/* PSCI reset handling for a vcpu. */
> > +static inline void kvm_reset_vcpu_psci(struct kvm_vcpu *vcpu,
> > + struct vcpu_reset_state *reset_state)
> > +{
> > + unsigned long target_pc = reset_state->pc;
> > +
> > + /* Gracefully handle Thumb2 entry point */
> > + if (vcpu_mode_is_32bit(vcpu) && (target_pc & 1)) {
> > + target_pc &= ~1UL;
> > + vcpu_set_thumb(vcpu);
> > + }
> > +
> > + /* Propagate caller endianness */
> > + if (reset_state->be)
> > + kvm_vcpu_set_be(vcpu);
> > +
> > + *vcpu_pc(vcpu) = target_pc;
> > +
> > + /*
> > + * We may come from a state where either a PC update was
> > + * pending (SMC call resulting in PC being increpented to
> > + * skip the SMC) or a pending exception. Make sure we get
> > + * rid of all that, as this cannot be valid out of reset.
> > + *
> > + * Note that clearing the exception mask also clears PC
> > + * updates, but that's an implementation detail, and we
> > + * really want to make it explicit.
> > + */
> > + vcpu_clear_flag(vcpu, PENDING_EXCEPTION);
> > + vcpu_clear_flag(vcpu, EXCEPT_MASK);
> > + vcpu_clear_flag(vcpu, INCREMENT_PC);
> > + vcpu_set_reg(vcpu, 0, reset_state->r0);
> > +}
> > +
> > #endif /* __ARM64_KVM_EMULATE_H__ */
> > diff --git a/arch/arm64/kvm/reset.c b/arch/arm64/kvm/reset.c
> > index 60969d90bdd3..e22d0be9e57c 100644
> > --- a/arch/arm64/kvm/reset.c
> > +++ b/arch/arm64/kvm/reset.c
> > @@ -34,18 +34,6 @@
> > static u32 __ro_after_init kvm_ipa_limit;
> > unsigned int __ro_after_init kvm_host_sve_max_vl;
> >
> > -/*
> > - * ARMv8 Reset Values
> > - */
> > -#define VCPU_RESET_PSTATE_EL1 (PSR_MODE_EL1h | PSR_A_BIT | PSR_I_BIT | \
> > - PSR_F_BIT | PSR_D_BIT)
> > -
> > -#define VCPU_RESET_PSTATE_EL2 (PSR_MODE_EL2h | PSR_A_BIT | PSR_I_BIT | \
> > - PSR_F_BIT | PSR_D_BIT)
> > -
> > -#define VCPU_RESET_PSTATE_SVC (PSR_AA32_MODE_SVC | PSR_AA32_A_BIT | \
> > - PSR_AA32_I_BIT | PSR_AA32_F_BIT)
> > -
> > unsigned int __ro_after_init kvm_sve_max_vl;
> >
> > int __init kvm_arm_init_sve(void)
> > @@ -191,7 +179,6 @@ void kvm_reset_vcpu(struct kvm_vcpu *vcpu)
> > {
> > struct vcpu_reset_state reset_state;
> > bool loaded;
> > - u32 pstate;
> >
> > scoped_guard(spinlock, &vcpu->arch.mp_state_lock) {
> > reset_state = vcpu->arch.reset_state;
> > @@ -210,21 +197,8 @@ void kvm_reset_vcpu(struct kvm_vcpu *vcpu)
> > kvm_vcpu_reset_sve(vcpu);
> > }
> >
> > - if (vcpu_el1_is_32bit(vcpu))
> > - pstate = VCPU_RESET_PSTATE_SVC;
> > - else if (vcpu_has_nv(vcpu))
> > - pstate = VCPU_RESET_PSTATE_EL2;
> > - else
> > - pstate = VCPU_RESET_PSTATE_EL1;
> > -
> > /* Reset core registers */
> > - memset(vcpu_gp_regs(vcpu), 0, sizeof(*vcpu_gp_regs(vcpu)));
> > - memset(&vcpu->arch.ctxt.fp_regs, 0, sizeof(vcpu->arch.ctxt.fp_regs));
> > - vcpu->arch.ctxt.spsr_abt = 0;
> > - vcpu->arch.ctxt.spsr_und = 0;
> > - vcpu->arch.ctxt.spsr_irq = 0;
> > - vcpu->arch.ctxt.spsr_fiq = 0;
> > - vcpu_gp_regs(vcpu)->pstate = pstate;
> > + kvm_reset_vcpu_core(vcpu);
> >
> > /* Reset system registers */
> > kvm_reset_sys_regs(vcpu);
> > @@ -233,36 +207,8 @@ void kvm_reset_vcpu(struct kvm_vcpu *vcpu)
> > * Additional reset state handling that PSCI may have imposed on us.
> > * Must be done after all the sys_reg reset.
> > */
> > - if (reset_state.reset) {
> > - unsigned long target_pc = reset_state.pc;
> > -
> > - /* Gracefully handle Thumb2 entry point */
> > - if (vcpu_mode_is_32bit(vcpu) && (target_pc & 1)) {
> > - target_pc &= ~1UL;
> > - vcpu_set_thumb(vcpu);
> > - }
> > -
> > - /* Propagate caller endianness */
> > - if (reset_state.be)
> > - kvm_vcpu_set_be(vcpu);
> > -
> > - *vcpu_pc(vcpu) = target_pc;
> > -
> > - /*
> > - * We may come from a state where either a PC update was
> > - * pending (SMC call resulting in PC being increpented to
> > - * skip the SMC) or a pending exception. Make sure we get
> > - * rid of all that, as this cannot be valid out of reset.
> > - *
> > - * Note that clearing the exception mask also clears PC
> > - * updates, but that's an implementation detail, and we
> > - * really want to make it explicit.
> > - */
> > - vcpu_clear_flag(vcpu, PENDING_EXCEPTION);
> > - vcpu_clear_flag(vcpu, EXCEPT_MASK);
> > - vcpu_clear_flag(vcpu, INCREMENT_PC);
> > - vcpu_set_reg(vcpu, 0, reset_state.r0);
> > - }
> > + if (reset_state.reset)
> > + kvm_reset_vcpu_psci(vcpu, &reset_state);
> >
> > /* Reset timer */
> > kvm_timer_vcpu_reset(vcpu);
> > --
> > 2.54.0.1136.gdb2ca164c4-goog
> >
^ permalink raw reply
* Re: [PATCH v1 4/4] iommu/arm-smmu-v3: Process vIOMMU invalidations in batches
From: Jason Gunthorpe @ 2026-06-15 13:43 UTC (permalink / raw)
To: Nicolin Chen
Cc: Will Deacon, Kevin Tian, Robin Murphy, Joerg Roedel, Shuah Khan,
Pranjal Shrivastava, Kees Cook, Yi Liu, Eric Auger,
linux-arm-kernel, iommu, linux-kernel, linux-kselftest
In-Reply-To: <aixZzvVWmAFEDQZI@nvidia.com>
On Fri, Jun 12, 2026 at 12:11:10PM -0700, Nicolin Chen wrote:
> VMM would have to know which command failed, to flag it in the CONS
> register, indicating: a) commands prior to the CONS are issued, and
> b) command pointed by the CONS is illegal.
It is a VMM bug to send a malformed command into the kernel in the
first place.
Jason
^ permalink raw reply
* Re: [PATCH v3 1/3] ufs: core: Add get_hba_nortt callback for vendor-specific RTT capability
From: Bart Van Assche @ 2026-06-15 13:41 UTC (permalink / raw)
To: ed.tsai, alim.akhtar, avri.altman, James.Bottomley,
martin.petersen, linux-scsi, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: linux-kernel, linux-arm-kernel, linux-mediatek, wsd_upstream,
peter.wang, alice.chao, naomi.chu, chun-hung.wu
In-Reply-To: <20260615055802.105479-2-ed.tsai@mediatek.com>
On 6/14/26 10:57 PM, ed.tsai@mediatek.com wrote:
> The number of outstanding RTTs read from host controller capability
> register is problematic on some platforms. Add a new vendor callback
> get_hba_nortt() to allow platform vendors to override the default RTT
> capability value with platform-specific handling.
>
> This patch keeps max_num_rtt field for bisectability and will be removed
> in a later patch once all platforms are migrated.
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply
* Re: [PATCH v3 3/3] ufs: core: Remove max_num_rtt field from ufs_hba_variant_ops
From: Bart Van Assche @ 2026-06-15 13:40 UTC (permalink / raw)
To: ed.tsai, alim.akhtar, avri.altman, James.Bottomley,
martin.petersen, linux-scsi, Matthias Brugger,
AngeloGioacchino Del Regno
Cc: linux-kernel, linux-arm-kernel, linux-mediatek, wsd_upstream,
peter.wang, alice.chao, naomi.chu, chun-hung.wu
In-Reply-To: <20260615055802.105479-4-ed.tsai@mediatek.com>
On 6/14/26 10:57 PM, ed.tsai@mediatek.com wrote:
> Remove the max_num_rtt field from ufs_hba_variant_ops as it has been
> replaced by the get_hba_nortt() callback which provides more flexible
> platform-specific RTT capability handling.
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply
* Re: [PATCH 1/3] dt-bindings: phy: nuvoton,ma35d1-usb2-phy: extend for dual-port OTG support
From: Rob Herring (Arm) @ 2026-06-15 13:40 UTC (permalink / raw)
To: Joey Lu
Cc: Hui-Ping Chen, Neil Armstrong, Conor Dooley, Vinod Koul,
devicetree, Catalin Marinas, linux-arm-kernel,
Krzysztof Kozlowski, linux-kernel, Joey Lu, Jacky Huang,
Arnd Bergmann, linux-phy, Shan-Chun Hung
In-Reply-To: <20260615054911.48821-2-a0987203069@gmail.com>
On Mon, 15 Jun 2026 13:49:09 +0800, Joey Lu wrote:
> The MA35D1 has two USB PHY ports managed by the same hardware block:
>
> - PHY0 (index 0): OTG port shared between the DWC2 gadget controller
> and EHCI0/OHCI0 host controllers. A hardware mux follows the USB
> ID pin automatically.
>
> - PHY1 (index 1): dedicated host-only port for EHCI1/OHCI1.
>
> Extend the existing binding to cover both ports:
>
> - The PHY node is now a child of the system-management syscon node
> with a reg property. The nuvoton,sys phandle and clocks
> properties are removed; the driver derives the regmap from its
> parent, and clock gating is owned by each individual USB controller.
>
> - #phy-cells changes from 0 to 1: the cell selects the PHY port.
>
> - Two optional board-tuning properties are added: nuvoton,rcalcode
> for per-port resistor trim and nuvoton,oc-active-high for
> over-current polarity.
>
> Signed-off-by: Joey Lu <a0987203069@gmail.com>
> ---
> .../bindings/phy/nuvoton,ma35d1-usb2-phy.yaml | 62 ++++++++++++++-----
> 1 file changed, 48 insertions(+), 14 deletions(-)
>
My bot found errors running 'make dt_binding_check' on your patch:
yamllint warnings/errors:
dtschema/dtc warnings/errors:
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/phy/nuvoton,ma35d1-usb2-phy.example.dtb: system-management@40460000 (nuvoton,ma35d1-reset): '#address-cells', '#size-cells', 'usb-phy@60' do not match any of the regexes: '^pinctrl-[0-9]+$'
from schema $id: http://devicetree.org/schemas/reset/nuvoton,ma35d1-reset.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/phy/nuvoton,ma35d1-usb2-phy.example.dtb: system-management@40460000 (nuvoton,ma35d1-reset): compatible: ['nuvoton,ma35d1-reset', 'syscon', 'simple-mfd'] is too long
from schema $id: http://devicetree.org/schemas/reset/nuvoton,ma35d1-reset.yaml
/builds/robherring/dt-review-ci/linux/Documentation/devicetree/bindings/phy/nuvoton,ma35d1-usb2-phy.example.dtb: system-management@40460000 (nuvoton,ma35d1-reset): reg: [[0, 1078329344], [0, 512]] is too long
from schema $id: http://devicetree.org/schemas/reset/nuvoton,ma35d1-reset.yaml
doc reference errors (make refcheckdocs):
See https://patchwork.kernel.org/project/devicetree/patch/20260615054911.48821-2-a0987203069@gmail.com
The base for the series is generally the latest rc1. A different dependency
should be noted in *this* patch.
If you already ran 'make dt_binding_check' and didn't see the above
error(s), then make sure 'yamllint' is installed and dt-schema is up to
date:
pip3 install dtschema --upgrade
Please check and re-submit after running the above command yourself. Note
that DT_SCHEMA_FILES can be set to your schema file to speed up checking
your schema. However, it must be unset to test all examples with your schema.
^ permalink raw reply
* Re: [PATCH net-next v7 01/12] net: phylink: keep and use MAC supported_interfaces in phylink struct
From: Maxime Chevallier @ 2026-06-15 13:33 UTC (permalink / raw)
To: Christian Marangi, Andrew Lunn, David S. Miller, Eric Dumazet,
Jakub Kicinski, Paolo Abeni, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Simon Horman, Jonathan Corbet, Shuah Khan,
Lorenzo Bianconi, Heiner Kallweit, Russell King, Saravana Kannan,
Philipp Zabel, Nathan Chancellor, Nick Desaulniers, Bill Wendling,
Justin Stitt, netdev, devicetree, linux-kernel, linux-doc,
linux-arm-kernel, linux-mediatek, llvm
In-Reply-To: <20260615122950.22281-2-ansuelsmth@gmail.com>
Hello Christian,
On 6/15/26 14:29, Christian Marangi wrote:
> Add in phylink struct a copy of supported_interfaces from phylink_config
> and make use of that instead of relying on phylink_config value.
>
> This in preparation for support of PCS handling internally to phylink
> where a PCS can be removed or added after the phylink is created and we
> need both a reference of the supported_interfaces value from
> phylink_config and an internal value that can be updated with the new
> PCS info.
>
> Signed-off-by: Christian Marangi <ansuelsmth@gmail.com>
> ---
> drivers/net/phy/phylink.c | 22 +++++++++++++++-------
> 1 file changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
> index 087ac63f9193..4d59c0dd78db 100644
> --- a/drivers/net/phy/phylink.c
> +++ b/drivers/net/phy/phylink.c
> @@ -60,6 +60,11 @@ struct phylink {
> /* The link configuration settings */
> struct phylink_link_state link_config;
>
> + /* What interface are supported by the current link.
> + * Can change on removal or addition of new PCS.
> + */
> + DECLARE_PHY_INTERFACE_MASK(supported_interfaces);
Can you clarify a bit what you mean here ? Is that the combination of the
interfaces the MAC supports AND the currently in-use PCS ?
Maxime
^ permalink raw reply
* Re: [PATCH v11 0/3] Add eDP support for RK3576
From: Damon Ding @ 2026-06-15 13:32 UTC (permalink / raw)
To: Heiko Stübner, robh, krzk+dt, conor+dt
Cc: sebastian.reichel, nicolas.frattaroli, alchark, detlev.casanova,
cristian.ciocaltea, michael.riesch, andy.yan, devicetree,
linux-arm-kernel, linux-rockchip, linux-kernel
In-Reply-To: <3213683.CbtlEUcBR6@diego>
On 6/15/2026 9:01 PM, Heiko Stübner wrote:
> Hi Damon,
>
> Am Montag, 15. Juni 2026, 14:33:03 Mitteleuropäische Sommerzeit schrieb Damon Ding:
>> Gentle ping on this patch series.
>
> Linux 7.1 was released yesterday, so we're in the merge-window now.
> (And the 5th of june was shortly before -rc7, so too late for 7.2)
>
> So I'll pick those up after the merge window end in 2 weeks.
>
>
Thanks for the heads-up. Got it. ;-)
Best regards,
Damon
>>
>> On 6/5/2026 10:23 AM, Damon Ding wrote:
>>> Picked from:
>>> https://lore.kernel.org/all/20260601065100.1103873-1-damon.ding@rock-chips.com/
>>>
>>> Patch 1-2 are to add missing clock "hclk" for RK3588 eDP nodes.
>>> Patch 3 is to add the RK3576 eDP node.
>>>
>>> Damon Ding (3):
>>> arm64: dts: rockchip: Add missing hclk for RK3588 eDP0
>>> arm64: dts: rockchip: Add missing hclk for RK3588 eDP1
>>> arm64: dts: rockchip: Add eDP node for RK3576
>>>
>>> arch/arm64/boot/dts/rockchip/rk3576.dtsi | 28 +++++++++++++++++++
>>> arch/arm64/boot/dts/rockchip/rk3588-base.dtsi | 4 +--
>>> .../arm64/boot/dts/rockchip/rk3588-extra.dtsi | 4 +--
>>> 3 files changed, 32 insertions(+), 4 deletions(-)
>>>
>>> ---
>>>
>>> Changes in v2:
>>> - Split out separate patches to add the "hclk" clock reference.
>>> - Split out separate patches to enable the "hclk" clock.
>>> - Add Reviewed-by tag.
>>>
>>> Changes in v3:
>>> - Add a patch to expand descriptions for clocks of the eDP node.
>>> - Add Reviewed-by tag.
>>>
>>> Changes in v4:
>>> - Modify commit msg.
>>>
>>> Changes in v5:
>>> - Enforce the correct third clock name on a per-compatible basis.
>>> - Modify the commit msg simultaneously.
>>> - Add Acked-by tag.
>>>
>>> Changes in v6:
>>> - Expand more detail commit msg about using hclk instead of grf clock.
>>>
>>> Changes in v7:
>>> - List all valid clock names at the top level, and constrain the clock
>>> count for each platform with minItems/maxItems in allOf.
>>>
>>> Changes in v8:
>>> - Fix indentation to 10 for enum in clock-names property.
>>>
>>> Changes in v9:
>>> - Restore the explicit clock-names for RK3399 and RK3588 eDP dt-bindings.
>>>
>>> Changes in v10:
>>> - Use automatic cleanup to fix OF node reference leak reported by
>>> Sashiko.
>>>
>>> Changes in v11:
>>> - Pick and rebase DT related patches.
>>>
>>
>>
>
>
>
>
>
>
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox