mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Andrew Morton <akpm@osdl.org>
To: Jim Cromie <jim.cromie@gmail.com>
Cc: linux-kernel@vger.kernel.org
Subject: Re: [patch -mm 20/20 RFC] chardev: GPIO for SCx200 & PC-8736x: add sysfs-GPIO interface
Date: Mon, 19 Jun 2006 22:22:23 -0700	[thread overview]
Message-ID: <20060619222223.8f5133a9.akpm@osdl.org> (raw)
In-Reply-To: <44944D14.2000308@gmail.com>

On Sat, 17 Jun 2006 12:42:28 -0600
Jim Cromie <jim.cromie@gmail.com> wrote:

> Ok, 
> 
> heres the brand-spanking-new proto-sysfs-gpio interface,
> preceded by some pseudo/proto-Documentation.
> 

Well I stuck it in -mm anyway.  Let's see what happens.

We don't have a Signed-off-by: for this patch.

Fixup patches agains next -mm would be suitable.  Please keep them
super-short: basically one-patch-per-review-comment.  That way I can easily
instertion-sort the patches into place and we retain a nice patch series.

> Ive

Apostrophe aversion?

>  
> +/* the pin-mode-change 'commands' of the legacy device-file-interface,
> +   now refactored for reuse in a sysfs-interface.  Includes some
> +   updates which arent exposed via sysfs attributes.
> +*/
> +static int common_write(struct nsc_gpio_ops *amp, char c, unsigned m)
> +{
> +       struct device *dev = amp->dev;
> +       int err = 0;
> +       switch (c) {
> +       case '0':
> +               amp->gpio_set(m, 0);
> +               break;
> +       case '1':
> +               amp->gpio_set(m, 1);
> +               break;
> +       case 'O':
> +               dev_dbg(dev, "GPIO%d output enabled\n", m);
> +               amp->gpio_config(m, ~1, 1);
> +               break;
> +       case 'o':
> +               dev_dbg(dev, "GPIO%d output disabled\n", m);
> +               amp->gpio_config(m, ~1, 0);
> +               break;
> +       case 'T':
> +               dev_dbg(dev, "GPIO%d output is push pull\n", m);
> +               amp->gpio_config(m, ~2, 2);
> +               break;
> +       case 't':
> +               dev_dbg(dev, "GPIO%d output is open drain\n", m);
> +               amp->gpio_config(m, ~2, 0);
> +               break;
> +       case 'P':
> +               dev_dbg(dev, "GPIO%d pull up enabled\n", m);
> +               amp->gpio_config(m, ~4, 4);
> +               break;
> +       case 'p':
> +               dev_dbg(dev, "GPIO%d pull up disabled\n", m);
> +               amp->gpio_config(m, ~4, 0);
> +               break;
> +       case 'L':
> +               dev_dbg(dev, "GPIO%d lock pin\n", m);
> +               amp->gpio_config(m, ~8, 8);
> +               break;
> +       case 'l':
> +               dev_warn(dev, "GPIO%d cant unlock locked? pin\n", m);
> +               amp->gpio_config(m, ~8, 0);
> +               break;
> +
> +       case 'D':
> +               dev_dbg(dev, "GPIO%d turn on debounce\n", m);
> +               amp->gpio_config(m, ~PF_DEBOUNCE, PF_DEBOUNCE);
> +               break;
> +       case 'd':
> +               dev_warn(dev, "GPIO%d cant unlock locked? pin\n", m);
> +               amp->gpio_config(m, ~PF_DEBOUNCE, 0);
> +               break;
> +
> +       case 'v':
> +               /* View Current pin settings */
> +               amp->gpio_dump(amp, m);
> +               break;
> +       case 'c':
> +               /* view pin's current values: driven and read */
> +               dev_info(dev, "io%02d: driven %d, input %d\n",
> +                        m, amp->gpio_current(m), amp->gpio_get(m));
> +               break;
> +       case '\n':
> +               /* end of settings string, do nothing */
> +               break;
> +       default:
> +               dev_err(dev, "GPIO-%2d bad setting: chr<0x%2x>\n", m,
> +                       (int)c);
> +               err++;
> +       }
> +       return err;
> +}
> +
>  ssize_t nsc_gpio_write(struct file *file, const char __user *data,
>  		       size_t len, loff_t *ppos)
>  {
> +	int i, err = 0;
>  	unsigned m = iminor(file->f_dentry->d_inode);
>  	struct nsc_gpio_ops *amp = file->private_data;
> -	struct device *dev = amp->dev;
> -	size_t i;
> -	int err = 0;
>  
>  	for (i = 0; i < len; ++i) {
>  		char c;
>  		if (get_user(c, data + i))
>  			return -EFAULT;
> -		switch (c) {
> -		case '0':
> -			amp->gpio_set(m, 0);
> -			break;
> -		case '1':
> -			amp->gpio_set(m, 1);
> -			break;
> -		case 'O':
> -			dev_dbg(dev, "GPIO%d output enabled\n", m);
> -			amp->gpio_config(m, ~1, 1);
> -			break;
> -		case 'o':
> -			dev_dbg(dev, "GPIO%d output disabled\n", m);
> -			amp->gpio_config(m, ~1, 0);
> -			break;
> -		case 'T':
> -			dev_dbg(dev, "GPIO%d output is push pull\n", m);
> -			amp->gpio_config(m, ~2, 2);
> -			break;
> -		case 't':
> -			dev_dbg(dev, "GPIO%d output is open drain\n", m);
> -			amp->gpio_config(m, ~2, 0);
> -			break;
> -		case 'P':
> -			dev_dbg(dev, "GPIO%d pull up enabled\n", m);
> -			amp->gpio_config(m, ~4, 4);
> -			break;
> -		case 'p':
> -			dev_dbg(dev, "GPIO%d pull up disabled\n", m);
> -			amp->gpio_config(m, ~4, 0);
> -			break;
> -
> -		case 'v':
> -			/* View Current pin settings */
> -			amp->gpio_dump(amp, m);
> -			break;
> -		case '\n':
> -			/* end of settings string, do nothing */
> -			break;
> -		default:
> -			dev_err(dev, "GPIO-%2d bad setting: chr<0x%2x>\n", m,
> -			       (int)c);
> -			err++;
> -		}
> +
> +		err += common_write(amp, c, m);
>  	}
>  	if (err)
>  		return -EINVAL;	/* full string handled, report error */

This all spat a whopping great reject for reasons unknown, which I fixed by
hand.  Please check that it all still works.


> +ssize_t nsc_gpio_sysfs_set(struct device *dev,
> +			   struct device_attribute *devattr, const char *buf,
> +			   size_t count)
> +{
> +        struct sensor_device_attribute_2 *attr = to_sensor_dev_attr_2(devattr);
> +        int idx = attr->index;
> +        int func = attr->nr;
> +	struct nsc_gpio_ops *amp = dev->driver_data;
> +	int err, xor;
> +
> +	/* invert cmd if setting low */
> +	xor = simple_strtol(buf, NULL, 10) ? 0 : 'T'^'t';

whoa.  How does this work?

> +	dev_info(dev, "set func:%d  Func:%d, flp%d\n", func, func^xor, xor);
> +
> +	err = common_write(amp, func^xor, idx);

The tricksies in here aren't very understandable.  Can it be simplified?

> +	if (err)
> +		return -EINVAL;	// full string handled, report error
> +	
> +	return strlen(buf);
> +}
>
> ...
>
>  static void __init pc8736x_init_shadow(void)
>  {
>  	int port;
> @@ -320,6 +368,12 @@ static int __init pc8736x_gpio_init(void
>  		dev_dbg(&pdev->dev, ": got dynamic major %d\n", major);
>  	}
>  
> +	pc8736x_sysfs_init(&pdev->dev);
> +
> +	/* provide info wheresysfs callbacks can get them */
> +	pc8736x_access.dev->driver_data = &pc8736x_access;
> +
> +;
>  	return 0;
>  }

stray semicolon.

> +/* GPIO pins have 5 attributes we care about: group them */
> +struct gpio_pin_attributes {
> +	struct sensor_device_attribute_2
> +		output_enabled,
> +		totem_pole,
> +		pullup_enabled,
> +		debounced,
> +		locked;
> +};

A bit hard to read.  Normally we'd do

struct gpio_pin_attributes {
	struct sensor_device_attribute_2 output_enabled;
	struct sensor_device_attribute_2 totem_pole;
	struct sensor_device_attribute_2 pullup_enabled;
	struct sensor_device_attribute_2 debounced;
	struct sensor_device_attribute_2 locked;
};

because kernel-style is super-simple-style.



  reply	other threads:[~2006-06-20  5:22 UTC|newest]

Thread overview: 38+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <448DB57F.2050006@gmail.com>
     [not found] ` <cfe85dfa0606121150y369f6beeqc643a1fe5c7ce69b@mail.gmail.com>
2006-06-17 18:23   ` [patch -mm 01/20] chardev: GPIO for SCx200 & PC-8736x: whitespace pre-clean Jim Cromie
2006-06-17 18:24   ` [patch -mm 02/20] chardev: GPIO for SCx200 & PC-8736x: modernize driver init to 2.6 api Jim Cromie
2006-06-20  5:21     ` Andrew Morton
2006-06-17 18:25   ` [patch -mm 03/20] chardev: GPIO for SCx200 & PC-8736x: add platforn_device for use w dev_dbg Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:26   ` [patch -mm 04/20] chardev: GPIO for SCx200 & PC-8736x: device minor numbers are unsigned ints Jim Cromie
2006-06-17 18:27   ` [patch -mm 05/20] chardev: GPIO for SCx200 & PC-8736x: put gpio_dump on a diet Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:28   ` [patch -mm 06/20] chardev: GPIO for SCx200 & PC-8736x: add 'v' command to device-file Jim Cromie
2006-06-17 18:29   ` [patch -mm 07/20] chardev: GPIO for SCx200 & PC-8736x: refactor scx200_probe to better segregate _gpio initialization Jim Cromie
2006-06-17 18:30   ` [patch -mm 09/20] chardev: GPIO for SCx200 & PC-8736x: dispatch via vtable Jim Cromie
2006-06-17 18:31   ` [patch -mm 10/20] chardev: GPIO for SCx200 & PC-8736x: add empty common-module Jim Cromie
2006-06-17 18:32   ` [patch -mm 11/20] chardev: GPIO for SCx200 & PC-8736x: migrate file-ops to common module Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:33   ` [patch -mm 12/20] chardev: GPIO for SCx200 & PC-8736x: migrate gpio_dump " Jim Cromie
2006-06-17 18:33   ` [patch -mm 08/20] chardev: GPIO for SCx200 & PC-8736x: add gpio-ops vtable Jim Cromie
2006-06-17 18:34   ` [patch -mm 13/20] chardev: GPIO for SCx200 & PC-8736x: add new pc8736x_gpio module Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:35   ` [patch -mm 14/20] chardev: GPIO for SCx200 & PC-8736x: add platform_device for use w dev_dbg Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:36   ` [patch -mm 15/20] chardev: GPIO for SCx200 & PC-8736x: use dev_dbg in common module Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:37   ` [patch -mm 16/20] chardev: GPIO for SCx200 & PC-8736x: fix gpio_current, use shadow regs Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:38   ` [patch -mm 17/20] chardev: GPIO for SCx200 & PC-8736x: replace spinlocks w mutexes Jim Cromie
2006-06-20  5:22     ` Andrew Morton
2006-06-17 18:39   ` [patch -mm 18/20] chardev: GPIO for SCx200 & PC-8736x: display pin values in/out in gpio_dump Jim Cromie
2006-06-17 18:40   ` [patch -mm 19/20] chardev: GPIO for SCx200 & PC-8736x: add proper Kconfig, Makefile entries Jim Cromie
2006-06-17 18:42   ` [patch -mm 20/20 RFC] chardev: GPIO for SCx200 & PC-8736x: add sysfs-GPIO interface Jim Cromie
2006-06-20  5:22     ` Andrew Morton [this message]
2006-06-20 19:57       ` Jim Cromie
2006-06-20 20:14         ` Randy.Dunlap
2006-06-20 20:40           ` Jim Cromie
2006-06-20 20:52             ` Randy.Dunlap
2006-06-20 21:50               ` Jim Cromie
2006-06-20 22:52                 ` Randy.Dunlap
2006-06-21  0:12         ` Andrew Morton
2006-06-21  3:49     ` Randy.Dunlap

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=20060619222223.8f5133a9.akpm@osdl.org \
    --to=akpm@osdl.org \
    --cc=jim.cromie@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    /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

all inboxes | Powered by JetHome®