Driver for tilt-switches connected via GPIOs
============================================

Generic driver to read data from tilt switches connected via gpios.
Orientation can be provided by one or more than one tilt switches,
i.e. each tilt switch providing one axis, and the number of axes
is also not limited.


Data structures
---------------

The array of struct gpio in the gpios field is used to list the gpios
that represent the current tilt state.

The array of struct gpio_tilt_axis describes the axes that are reported
to the input system. The values set therein are used for the
input_set_abs_params calls needed to init the axes.

The array of struct gpio_tilt_state maps gpio states to the corresponding
values to report. The gpio state is represented as a bitfield where the
bit-index corresponds to the index of the gpio in the struct gpio array.
In the same manner the values stored in the axes array correspond to
the elements of the gpio_tilt_axis-array.


Example
-------

Example configuration for a single TS1003 tilt switch that rotates around
one axis in 4 steps and emits the current tilt via two GPIOs::

    static int sg060_tilt_enable(struct device *dev) {
	    /* code to enable the sensors */
    };

    static void sg060_tilt_disable(struct device *dev) {
	    /* code to disable the sensors */
    };

    static struct gpio sg060_tilt_gpios[] = {
	    { SG060_TILT_GPIO_SENSOR1, GPIOF_IN, "tilt_sensor1" },
	    { SG060_TILT_GPIO_SENSOR2, GPIOF_IN, "tilt_sensor2" },
    };

    static struct gpio_tilt_state sg060_tilt_states[] = {
	    {
		    .gpios = (0 << 1) | (0 << 0),
		    .axes = (int[]) {
			    0,
		    },
	    }, {
		    .gpios = (0 << 1) | (1 << 0),
		    .axes = (int[]) {
			    1, /* 90 degrees */
		    },
	    }, {
		    .gpios = (1 << 1) | (1 << 0),
		    .axes = (int[]) {
			    2, /* 180 degrees */
		    },
	    }, {
		    .gpios = (1 << 1) | (0 << 0),
		    .axes = (int[]) {
			    3, /* 270 degrees */
		    },
	    },
    };

    static struct gpio_tilt_axis sg060_tilt_axes[] = {
	    {
		    .axis = ABS_RY,
		    .min = 0,
		    .max = 3,
		    .fuzz = 0,
		    .flat = 0,
	    },
    };

    static struct gpio_tilt_platform_data sg060_tilt_pdata= {
	    .gpios = sg060_tilt_gpios,
	    .nr_gpios = ARRAY_SIZE(sg060_tilt_gpios),

	    .axes = sg060_tilt_axes,
	    .nr_axes = ARRAY_SIZE(sg060_tilt_axes),

	    .states = sg060_tilt_states,
	    .nr_states = ARRAY_SIZE(sg060_tilt_states),

	    .debounce_interval = 100,

	    .poll_interval = 1000,
	    .enable = sg060_tilt_enable,
	    .disable = sg060_tilt_disable,
    };

    static struct platform_device sg060_device_tilt = {
	    .name = "gpio-tilt-polled",
	    .id = -1,
	    .dev = {
		    .platform_data = &sg060_tilt_pdata,
	    },
    };
