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 emitts 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,
	},
};
