tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: GPIO revisited



Marc Balmer <marc%msys.ch@localhost> wrote:
> The diff itself can be found online at
> http://www.netbsd.org/~mbalmer/diffs/gpio_13.diff .  I have left older
> versions of the diff there as well for your amusement.  Apply it against
> NetBSD -current.

Few minor comments from very quick glance.

+               if (req->gp_name[0] != '\0') {
+                       pin = gpio_pinbyname(sc, req->gp_name);
+                       if (pin == -1)
+                               return EINVAL;
+               } else
+                       pin = req->gp_pin;
+               if (pin < 0 || pin >= sc->sc_npins)
+                       return EINVAL;

How about moving these checks into gpio_pinbyname() and just passing req?
Of course, in such case it would become gpio_pinbyreq() or something. It
might also be better to just return struct gpio_name or NULL, instead of
pin number (see further).

+               /* rename pin or new pin? */
+               if (set->gp_name2[0] != '\0') {
+                       found = 0;
+                       LIST_FOREACH(nm, &sc->sc_names, gp_next)
+                               if (nm->gp_pin == pin) {
+                                       strlcpy(nm->gp_name, set->gp_name2,
+                                           sizeof(nm->gp_name));
+                                       found = 1;
+                                       break;
+                               }
+                       if (!found) {
+                               nm = malloc(sizeof(struct gpio_name),
+                                   M_DEVBUF, M_WAITOK);
+                               strlcpy(nm->gp_name, set->gp_name2,
+                                   sizeof(nm->gp_name));
+                               nm->gp_pin = set->gp_pin;
+                               LIST_INSERT_HEAD(&sc->sc_names, nm, gp_next);
+                       }
+               }

- What prevents from creation of duplicates?
- It re-scans sc_names, while pointer to struct gpio_name could be re-used.
- Any reason why this (and one other use) is not using kmem(9)?

+#define        GPIOSIM_NPINS   32
+
+struct gpiosim_softc {
+       struct device           sc_dev;
+       u_int32_t               sc_state;
+       struct gpio_chipset_tag sc_gpio_gc;
+       gpio_pin_t              sc_gpio_pins[GPIOSIM_NPINS];
+};

+void
+gpiosim_pin_write(void *arg, int pin, int value)
+{
+       struct gpiosim_softc *sc = (struct gpiosim_softc *)arg;
+
+       if (value == 0)
+               sc->sc_state &= ~(1 << pin);
+       else
+               sc->sc_state |= (1 << pin);
+}

Perhaps add comment and KASSERT(pin < GPIOSIM_NPINS) here or somewhere else,
since this bitmask assumes not more than 32 pins.

+int    gpio_pinbyname(struct gpio_softc *, char *gp_name);
+
+/* Old API version */
+int    gpio_ioctl_oapi(struct gpio_softc *, u_long cmd, void *data, int flag,
+    int pinset);

KNF: no variables names in the declaration.
Also, any reason why these are not static?

+struct gpiosim_op {
+       void *cookie;
+       u_int32_t mask;
+       u_int32_t state;
+};

We use standard C99 types: uint32_t, etc.

+               bzero(&ga, sizeof(ga));
+               ga.ga_gpio = sc;

bzero/bcopy/etc are no longer used, please use memset. Same in userland.


P.S. Please create diffs with -p option. Thanks.

-- 
Mindaugas


Home | Main Index | Thread Index | Old Index