[patch 00/20] chardev: GPIO for SCx200 & PC8736x

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

 



GPIO SUPPORT FOR SCx200 & PC8736x

The patch-set reworks the 2.4 vintage scx200_gpio driver for modern
2.6, and refactors GPIO support to reuse it in a new driver for the
GPIO on PC-8736x chips.  Its handy for the Soekris.com net-4801, which
has both chips.

Device-file & Sysfs

Most recently, Ive bolted on a sysfs interface for both new drivers.
Because of the newness, Im numbering them past the 18-max, ie theyll
be 19/18, etc.  Maybe I should have waited on this ..

The driver preserves the existing device-file interface, including the
write/cmd set, but adds v,c to 'view' the pin-settings & configs by
inducing, via gpio_dump(), a dev_info() call.  Its a fairly crappy way
to get status, but it sticks to the syslog approach, conservatively.

Allowing users to voluntarily trigger logging is good, it gives them a
familiar way to confirm their app's control & use of the pins, and Ive
thus reduced the pin-mode-updates from dev_info to dev_dbg.

The driver-split

The Geode CPU and the PC-87366 Super-IO chip have GPIO units which
share a common pin-architecture (same pin features, with same bits
controlling), but with different addressing mechanics and port
organizations..

The vintage driver expresses the pin capabilities with pin-mode
commands [OoPpTt],etc that change the pin configurations, and since
the 2 chips share pin-arch, we can reuse the read(), write() commands,
once the implementation is suitably adjusted.

[ 1890.176223]  scx200_gpio.0: io00: 0x0044 TS OD PUE  EDGE LO DEBOUNCE
[ 1890.287223]  scx200_gpio.0: io01: 0x0003 OE PP PUD  EDGE LO


The patchset adds a vtable: struct nsc_gpio_ops, to abstract the
existing gpio operations, then adjusts fileops.write() code to invoke
operations via that vtable.  Driver specific open()s set private_data
to the vtable so its available for use by write().

The vtable gets the gpio_dump() too, since its user-friendly, and
(could be construed as) part of the current device-file interface.  To
support use of dev_dbg() in write() & _dump(), the vtable gets a dev
ptr too, set by both scx200 & pc8736x _gpio drivers.

nsc_gpio.c: new file is new home of several file-ops methods, which
are modified to get their vtable from filp->private_data, and use it
where needed.

scx200_gpio.c: keeps some of its existing gpio routines, but now wires
them up via the vtable (they're invoked by nsc_gpio.c:nsc_gpio_write()
thru this vtable).  A driver-spcific open() initializes
filp->private_data with the vtable.

Once the split is clean, and the scx200_gpio driver is working, we
copy and modify the function and variable names, and rework the
access-method bodies for the different addressing scheme.



Heres a working overview of the patchset:
[jimc@harpo gpio-stuff]$ more series
# series file for GPIO

# Spring Cleaning
gpio-scx/patch.preclean # scripts/Lindent fixes, editor-ctrl comments

# API Modernization

gpio-scx/patch.api26            # what I learned from LDD3
gpio-scx/patch.platform-dev-2   # get pdev, support for dev_dbg()
gpio-scx/patch.unsigned-minor   # fix to match std practice

# Debuggability

gpio-scx/patch.dump-diet        # shrink gpio_dump()
gpio-scx/patch.viewpins         # add new 'command' to call dump()

# random refactor
gpio-scx/patch.init-refactor    # pull shadow-register init to sub

# Access-Abstraction (add vtable)

gpio-scx/patch.access-vtable    # introduce nsg_gpio_ops vtable, w dump
gpio-scx/patch.vtable-calls     # add & use the vtable in scx200_gpio
gpio-scx/patch.nscgpio-shell    # add empty driver for common-fops

# move code under abstraction
gpio-scx/patch.migrate-fops     # move file-ops methods from scx200_gpio
gpio-scx/patch.common-dump # mv scx200.c:scx200_gpio_dump() to nsc_gpio.c
gpio-scx/patch.add-pc8736x-gpio # add new driver, like old, w chip adapt
# gpio-scx/patch.add-DEBUG      # enable all dev_dbg()s

# Cleanups

# finish printk -> dev_dbg() etc
gpio-scx/patch.pdev-pc8736x     # new drvr needs pdev too,
gpio-scx/patch.devdbg-nscgpio   # add device to 'vtable', use in dev_dbg()

gpio-scx/patch.pin-config-view # add another 'command' to 'c' the pin-config # gpio-scx/quiet-getset # take out excess dbg stuff (pretty quiet now)
gpio-scx/patch.shadow-current   # imitate scx200_gpio's shadow regs in pc87*

gpio-scx/patch.kconfig          # add stuff for kbuild


# TBC
# combine api26 with pdev, which is just one step.
# merge c&v commands to single do-all-fn
# delay viewpins, dump-diet should also un-ifdef it too.

# post KMentors-post patches ..

gpio-scx/patch.mutexes          # use mutexes for config-locks
gpio-scx/patch.viewpins-values  # extend dump to obsolete separate 'c' cmd
# gpio-scx/patch.add-DEBUG      # enable all dev_dbg()s


diff.sys-gpio-basic-ok-1
diff.sys-gpio-port0-bits-work
diff.sys-gpio-all32-work


--
Kernelnewbies: Help each other learn about the Linux kernel.
Archive:       http://mail.nl.linux.org/kernelnewbies/
FAQ:           http://kernelnewbies.org/faq/


[Index of Archives]     [Newbies FAQ]     [Linux Kernel Mentors]     [Linux Kernel Development]     [IETF Annouce]     [Git]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux SCSI]     [Linux ACPI]
  Powered by Linux