Hi Linus, On 一, 5月 29, 2017 at 06:28:49下午 +0200, Linus Walleij wrote: > On Sat, May 27, 2017 at 7:56 AM, Baolin Wang <baolin.wang@xxxxxxxxxxxxxx> wrote: > > > This patch adds the pin control driver for Spreadtrum SC9860 platform. > > > > Signed-off-by: Baolin Wang <baolin.wang@xxxxxxxxxxxxxx> > > Overall I see that you want to store functions and groups in the device tree > using the current helpers from Tony. That is OK if you want to take that > approach, though I prefer the pins/groups/function encoding in plaintext. > > But when it comes to pin config: > > > +static int sprd_pinconf_get(struct pinctrl_dev *pctldev, unsigned int pin_id, > > + unsigned long *config) > > +{ > > + struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); > > + struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); > > + > > + if (!pin) > > + return -EINVAL; > > + > > + if (pin->type == GLOBAL_CTRL_PIN) { > > + *config = (readl((void __iomem *)pin->reg) >> > > + pin->bit_offset) & PINCTRL_BIT_MASK(pin->bit_width); > > + } else { > > + *config = readl((void __iomem *)pin->reg); > > + } > > + > > + return 0; > > +} > > + > > +static int sprd_pinconf_set(struct pinctrl_dev *pctldev, unsigned int pin_id, > > + unsigned long *configs, unsigned int num_configs) > > +{ > > + struct sprd_pinctrl *pctl = pinctrl_dev_get_drvdata(pctldev); > > + struct sprd_pin *pin = sprd_pinctrl_get_pin_by_id(pctl, pin_id); > > + unsigned long reg; > > + int i; > > + > > + if (!pin) > > + return -EINVAL; > > + > > + for (i = 0; i < num_configs; i++) { > > + if (pin->type == GLOBAL_CTRL_PIN) { > > + reg = readl((void __iomem *)pin->reg); > > + reg &= ~(PINCTRL_BIT_MASK(pin->bit_width) > > + << pin->bit_offset); > > + reg |= (configs[i] & PINCTRL_BIT_MASK(pin->bit_width)) > > + << pin->bit_offset; > > + writel(reg, (void __iomem *)pin->reg); > > + } else { > > + writel(configs[i], (void __iomem *)pin->reg); > > + } > > + pin->config = configs[i]; > > + } > > + > > + return 0; > > +} > > This is just hammering the register values, you have effectively defined your > register layout as your device tree ABI. > > Please don't do this, please use genric pin config and use the approach > other drivers take with explicit strings encoding the pin configuration. Make sense. I will try to use genric pin config instead of the magic number. Thanks for your comments. > > Even pinctrl-single that maintain quite a bit of muxing data in the device > tree still use the generic pin config API, see: > drivers/pinctrl/pinctrl-single.c > pcs_pinconf_get(), pcs_pinconf_set() > > Same for group config. > > Yours, > Linus Walleij -- To unsubscribe from this list: send the line "unsubscribe linux-gpio" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html