devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Linus Walleij <linus.walleij@linaro.org>
To: "Heiko Stübner" <heiko@sntech.de>,
	"Stephen Warren" <swarren@wwwdotorg.org>,
	"Laurent Pinchart" <laurent.pinchart+renesas@ideasonboard.com>
Cc: "linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	John Stultz <john.stultz@linaro.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	Mike Turquette <mturquette@linaro.org>,
	Seungwon Jeon <tgih.jun@samsung.com>,
	Jaehoon Chung <jh80.chung@samsung.com>,
	Chris Ball <cjb@laptop.org>,
	"linux-mmc@vger.kernel.org" <linux-mmc@vger.kernel.org>,
	Grant Likely <grant.likely@linaro.org>,
	Rob Herring <rob.herring@calxeda.com>,
	"devicetree-discuss@lists.ozlabs.org"
	<devicetree-discuss@lists.ozlabs.org>,
	Russell King <linux@arm.linux.org.uk>,
	Arnd Bergmann <arnd@arndb.de>, Olof Johansson <olof@lixom.net>
Subject: Re: [PATCH 07/10] pinctrl: add pinctrl driver for Rockchip SoCs
Date: Tue, 4 Jun 2013 09:08:09 +0200	[thread overview]
Message-ID: <CACRpkdbBr7s1NoTQewVOotorHJHLL8Z6-_gAx5GC0x6uNUX0gw@mail.gmail.com> (raw)
In-Reply-To: <201306030059.47611.heiko@sntech.de>

On Mon, Jun 3, 2013 at 12:59 AM, Heiko Stübner <heiko@sntech.de> wrote:

> This driver adds support the Cortex-A9 based SoCs from Rockchip,
> so at least the RK2928, RK3066 (a and b) and RK3188.
> Earlier Rockchip SoCs seem to use similar mechanics for gpio
> handling so should be supportable with relative small changes.
> Pull handling on the rk3188 is currently a stub, due to it being
> a bit different to the earlier SoCs.
>
> Pinmuxing as well as gpio (and interrupt-) handling tested on
> a rk3066a based machine.
>
> Signed-off-by: Heiko Stuebner <heiko@sntech.de>

Overall this is looking very good, mainly minor comments.

> +++ b/Documentation/devicetree/bindings/pinctrl/rockchip-pinctrl.txt

Please name this beginning with the vendor and similar to
the compatible string: rockchip,pinctrl or something.
(Check the neighbors.)

(...)
> +Required properties for gpio sub nodes:
> +  - compatible: "rockchip,gpio-bank"
> +  - reg: register of the gpio bank (different than the iomux registerset)
> +  - interrupts: base interrupt of the gpio bank in the interrupt controller
> +  - clocks: clock that drives this bank
> +  - gpio-controller: identifies the node as a gpio controller and pin bank.
> +  - #gpio-cells: number of cells in GPIO specifier. Since the generic GPIO
> +    binding is used, the amount of cells must be specified as 2. See generic
> +    GPIO binding documentation for description of particular cells.
> +  - interrupt-controller: identifies the controller node as interrupt-parent.
> +  - #interrupt-cells: the value of this property should be 2.
> +     - First Cell: represents the external gpio interrupt number local to the
> +       external gpio interrupt space of the controller.
> +     - Second Cell: flags to identify the type of the interrupt
> +       - 1 = rising edge triggered
> +       - 2 = falling edge triggered
> +       - 3 = rising and falling edge triggered
> +       - 4 = high level triggered
> +       - 8 = low level triggered

Can't you just reference
Documentation/devicetree/bindings/interrupt-controller/interrupts.txt?

> +Required properties for pin configuration node:
> +  - rockchip,pins: 4 integers array, represents a group of pins mux and config
> +    setting. The format is rockchip,pins = <PIN_BANK PIN_BANK_NUM MUX CONFIG>.
> +    The MUX 0 means gpio and MUX 1 to 3 mean the specific device function
> +
> +Bits used for CONFIG:
> +PULL_AUTO      (1 << 0): indicate this pin needs a pull setting for SoCs
> +                         that determine the pull up or down themselfs

Hm, never saw that before...

(...)
> +       uart2 {
> +               uart2_xfer: uart2-xfer {
> +                       rockchip,pins = <RK_GPIO1 8 1 RK_PINCTRL_PULL_AUTO>,
> +                                       <RK_GPIO1 9 1 RK_PINCTRL_PULL_AUTO>;
> +               };

This looks like you're using #include to define these constants,
probably you should include that in the example or mention it?

> +uart2: serial@20064000 {
> +       compatible = "snps,dw-apb-uart";
> +       reg = <0x20064000 0x400>;
> +       interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;

Using #defines, nice!

(...)
+++ b/drivers/pinctrl/Kconfig
@@ -158,6 +158,12 @@ config PINCTRL_DB8540
        bool "DB8540 pin controller driver"
        depends on PINCTRL_NOMADIK && ARCH_U8500

+config PINCTRL_ROCKCHIP
+       bool
+       select PINMUX
+       select PINCONF
+       select GENERIC_IRQ_CHIP

Why is this super-simple pin config thing not using
GENERIC_PINCONF?

I *know* it is simpler to implement your own thing, but think of the
poor maintainers that have to wade through 50 identical implementations.
Do this, it pays off.

BTW: it leads to wanting to use generic pinconf DT bindings as experienced
by Laurent and others. We need to fix that too...

(...)
> +++ b/drivers/pinctrl/pinctrl-rockchip.c
> +static void rockchip_pin_dbg_show(struct pinctrl_dev *pctldev,
> +                                       struct seq_file *s, unsigned offset)
> +{
> +       seq_printf(s, "%s", dev_name(pctldev->dev));
> +}

Nothing else you want to say about the pins here?
(No big deal for sure, but....)

> +static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
> +{
> +       struct rockchip_pinctrl *info = bank->drvdata;
> +       void __iomem *reg;
> +       int bit;

Is that really an int? I'd guess more like u8...

> +       u32 data;
> +
> +       /* rk3066b does support any pulls */
> +       if (!info->ctrl->pull_offset)
> +               return 0;
> +
> +       reg = info->reg_base + info->ctrl->pull_offset;
> +
> +       if (info->ctrl->pull_auto) {
> +               reg += bank->bank_num * 8;

I'd define some constant like

#define RK_BANK_STRIDE 8
reg += bank->bank_num * RK_BANK_STRIDE;
(Since 8 bytes of stride is no natural law.)

And then use that here and elsewhere.

> +               reg += (pin_num / 16) * 4;
> +               bit = pin_num % 16;

This is clear however.

> +
> +               data = readl_relaxed(reg);
> +               data >>= bit;
> +               data &= 1;
> +
> +               return !data;


That's a bit hard to read, I'd just:

#include <linux/bitops.h>
return !(readl_relaxed(reg) & BIT(bit));

And skip the "data" variable. The ! operator will
clamp this to a bool (0/1).

But we all have our habits.

> +static int rockchip_set_pull(struct rockchip_pin_bank *bank,
> +                                       int pin_num, int pull)

Similar comments for this function.

> +static int rockchip_pmx_gpio_set_direction(struct pinctrl_dev *pctldev,
> +                                             struct pinctrl_gpio_range *range,
> +                                             unsigned offset, bool input)
(...)
> +       /* set bit to 1 for output, 0 for input */
> +       if (!input)
> +               data |= (1 << pin);
> +       else
> +               data &= ~(1 << pin);

Here again I would use <linux/bitops.h> and:

data |= BIT(pin);

etc, but it's a matter of taste so if you prefer this, do keep it.

(...)
> +static int rockchip_irq_set_type(struct irq_data *d, unsigned int type)
> +{
> +       struct irq_chip_generic *gc = irq_data_get_irq_chip_data(d);
> +       struct rockchip_pin_bank *bank = gc->private;
> +       u32 bit = (1 << d->hwirq);

Name that something like "mask" to match other naming in the
kernel. "bit" sort of implies a number between 0 and 31 and that
is not the case.

All I could think of right now...

Yours,
Linus Walleij

  reply	other threads:[~2013-06-04  7:08 UTC|newest]

Thread overview: 43+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-02 22:55 arm: add basic support for Rockchip Cortex-A9 SoCs Heiko Stübner
     [not found] ` <201306030055.15413.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-02 22:56   ` [PATCH 01/10] clocksource: dw_apb_timer_of: use the clocksource as sched clock if necessary Heiko Stübner
2013-06-04  6:34     ` Linus Walleij
2013-06-04  8:29       ` Heiko Stübner
2013-06-04  9:43         ` Linus Walleij
2013-06-02 22:56   ` [PATCH 02/10] clocksource: dw_apb_timer_of: add clock-handling Heiko Stübner
2013-06-03  3:22     ` Baruch Siach
2013-06-03  7:51       ` Heiko Stübner
2013-06-02 22:57   ` [PATCH 03/10] clk: flag to use upper half of the register as change indicator Heiko Stübner
2013-06-02 22:57   ` [PATCH 04/10] clk: divider: add flag to limit possible dividers to even numbers Heiko Stübner
2013-06-02 22:58   ` [PATCH 05/10] mmc: dw_mmc-pltfm: remove static from dw_mci_pltfm_remove Heiko Stübner
2013-06-04  3:59     ` Jaehoon Chung
     [not found]     ` <201306030058.27184.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-05 14:00       ` Seungwon Jeon
2013-06-02 22:59   ` [PATCH 06/10] mmc: dw_mmc-pltfm: add Rockchip variant Heiko Stübner
2013-06-04  4:06     ` Jaehoon Chung
2013-06-04  8:43       ` Heiko Stübner
     [not found]     ` <201306030059.03783.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-05 14:00       ` Seungwon Jeon
2013-06-05 14:11         ` Heiko Stübner
2013-06-06 20:01     ` Andy Shevchenko
2013-06-02 22:59   ` [PATCH 07/10] pinctrl: add pinctrl driver for Rockchip SoCs Heiko Stübner
2013-06-04  7:08     ` Linus Walleij [this message]
2013-06-04 12:05       ` Heiko Stübner
2013-06-05  7:01         ` Linus Walleij
2013-06-05 17:18           ` Stephen Warren
     [not found]             ` <51AF72F9.3060307-3lzwWm7+Weoh9ZMKESR00Q@public.gmane.org>
2013-06-05 18:50               ` Heiko Stübner
2013-06-02 23:00 ` [PATCH 08/10] clk: add basic Rockchip rk3066a clock support Heiko Stübner
2013-06-03  3:27   ` Olof Johansson
     [not found]     ` <20130603032711.GA3379-O5ziIzlqnXUVNXGz7ipsyg@public.gmane.org>
2013-06-03  7:52       ` Heiko Stübner
2013-06-02 23:01 ` [PATCH 09/10] arm: add debug uarts for rockchip rk29xx and rk3xxx series Heiko Stübner
2013-06-03  2:08   ` Arnd Bergmann
2013-06-03  7:54     ` Heiko Stübner
2013-06-02 23:02 ` [PATCH 10/10] arm: add basic support for Rockchip RK3066a boards Heiko Stübner
2013-06-03  2:15   ` Arnd Bergmann
2013-06-03  8:23     ` Heiko Stübner
     [not found]       ` <201306031023.49364.heiko-4mtYJXux2i+zQB+pC5nmwQ@public.gmane.org>
2013-06-03  9:22         ` Arnd Bergmann
2013-06-03  9:46           ` Heiko Stübner
2013-06-03 10:26             ` Arnd Bergmann
2013-06-03 12:15               ` [RFC] dw_apb_timer_of: use clocksource_of_init Heiko Stübner
2013-06-03 12:27                 ` Rob Herring
2013-06-03 13:20                 ` Arnd Bergmann
2013-06-05  7:11   ` [PATCH 10/10] arm: add basic support for Rockchip RK3066a boards Thomas Petazzoni
2013-06-05 21:45     ` Maxime Ripard
2013-06-03  2:07 ` arm: add basic support for Rockchip Cortex-A9 SoCs Arnd Bergmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=CACRpkdbBr7s1NoTQewVOotorHJHLL8Z6-_gAx5GC0x6uNUX0gw@mail.gmail.com \
    --to=linus.walleij@linaro.org \
    --cc=arnd@arndb.de \
    --cc=cjb@laptop.org \
    --cc=devicetree-discuss@lists.ozlabs.org \
    --cc=grant.likely@linaro.org \
    --cc=heiko@sntech.de \
    --cc=jh80.chung@samsung.com \
    --cc=john.stultz@linaro.org \
    --cc=laurent.pinchart+renesas@ideasonboard.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mmc@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=mturquette@linaro.org \
    --cc=olof@lixom.net \
    --cc=rob.herring@calxeda.com \
    --cc=swarren@wwwdotorg.org \
    --cc=tgih.jun@samsung.com \
    --cc=tglx@linutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).