Hi Yinbo, thanks for your patch! On Fri, Oct 21, 2022 at 3:27 AM Yinbo Zhu <zhuyinbo@xxxxxxxxxxx> wrote: > The loongson2 SoC has a few pins that can be used as GPIOs or take > multiple other functions. Add a driver for the pinmuxing. > > There is currently no support for GPIO pin pull-up and pull-down. > > Signed-off-by: zhanghongchen <zhanghongchen@xxxxxxxxxxx> > Signed-off-by: Yinbo Zhu <zhuyinbo@xxxxxxxxxxx> (...) > +static int loongson2_pmx_set_mux(struct pinctrl_dev *pcdev, unsigned int func_num, > + unsigned int group_num) > +{ > + struct loongson2_pinctrl *pctrl = pinctrl_dev_get_drvdata(pcdev); > + unsigned long reg = (unsigned long)pctrl->reg_base + > + loongson2_pmx_groups[group_num].reg; > + unsigned int mux_bit = loongson2_pmx_groups[group_num].bit; > + unsigned int val; > + unsigned long flags; > + > + raw_spin_lock_irqsave(&pctrl->lock, flags); > + val = readl((void *)reg); > + if (func_num == 0) > + val &= ~(1<<mux_bit); > + else > + val |= (1<<mux_bit); > + writel(val, (void *)reg); > + raw_spin_unlock_irqrestore(&pctrl->lock, flags); Can you explain in the commit message or with a comment in the code why you have to use a raw spinlock for this? We usually only use raw spinlocks for things like low level interrupt handlers... My guess is that you can replace this with an ordinary spinlock. Yours, Linus Walleij