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