* @input: input device that should be parsed
  * @multitouch: specifies whether parsed properties should be applied to
  *     single-touch or multi-touch axes
+ * @prop: pointer to a struct touchscreen_properties into which to store
+ *     axis swap and invert info for use with touchscreen_report_x_y();
+ *     or %NULL
  *
  * This function parses common DT properties for touchscreens and setups the
  * input device accordingly. The function keeps previously set up default
  * values if no value is specified via DT.
  */
-void touchscreen_parse_properties(struct input_dev *input, bool multitouch)
+void touchscreen_parse_properties(struct input_dev *input, bool multitouch,
+                                 struct touchscreen_properties *prop)
 {
        struct device *dev = input->dev.parent;
        unsigned int axis;
                                                &fuzz);
        if (data_present)
                touchscreen_set_params(input, axis, maximum, fuzz);
+
+       if (!prop)
+               return;
+
+       axis = multitouch ? ABS_MT_POSITION_X : ABS_X;
+
+       prop->max_x = input_abs_get_max(input, axis);
+       prop->max_y = input_abs_get_max(input, axis + 1);
+       prop->invert_x =
+               device_property_read_bool(dev, "touchscreen-inverted-x");
+       prop->invert_y =
+               device_property_read_bool(dev, "touchscreen-inverted-y");
+       prop->swap_x_y =
+               device_property_read_bool(dev, "touchscreen-swapped-x-y");
+
+       if (prop->swap_x_y)
+               swap(input->absinfo[axis], input->absinfo[axis + 1]);
 }
 EXPORT_SYMBOL(touchscreen_parse_properties);
+
+static void
+touchscreen_apply_prop_to_x_y(const struct touchscreen_properties *prop,
+                             unsigned int *x, unsigned int *y)
+{
+       if (prop->invert_x)
+               *x = prop->max_x - *x;
+
+       if (prop->invert_y)
+               *y = prop->max_y - *y;
+
+       if (prop->swap_x_y)
+               swap(*x, *y);
+}
+
+/**
+ * touchscreen_set_mt_pos - Set input_mt_pos coordinates
+ * @pos: input_mt_pos to set coordinates of
+ * @prop: pointer to a struct touchscreen_properties
+ * @x: X coordinate to store in pos
+ * @y: Y coordinate to store in pos
+ *
+ * Adjust the passed in x and y values applying any axis inversion and
+ * swapping requested in the passed in touchscreen_properties and store
+ * the result in a struct input_mt_pos.
+ */
+void touchscreen_set_mt_pos(struct input_mt_pos *pos,
+                           const struct touchscreen_properties *prop,
+                           unsigned int x, unsigned int y)
+{
+       touchscreen_apply_prop_to_x_y(prop, &x, &y);
+       pos->x = x;
+       pos->y = y;
+}
+EXPORT_SYMBOL(touchscreen_set_mt_pos);
+
+/**
+ * touchscreen_report_pos - Report touchscreen coordinates
+ * @input: input_device to report coordinates for
+ * @prop: pointer to a struct touchscreen_properties
+ * @x: X coordinate to report
+ * @y: Y coordinate to report
+ * @multitouch: Report coordinates on single-touch or multi-touch axes
+ *
+ * Adjust the passed in x and y values applying any axis inversion and
+ * swapping requested in the passed in touchscreen_properties and then
+ * report the resulting coordinates on the input_dev's x and y axis.
+ */
+void touchscreen_report_pos(struct input_dev *input,
+                           const struct touchscreen_properties *prop,
+                           unsigned int x, unsigned int y,
+                           bool multitouch)
+{
+       touchscreen_apply_prop_to_x_y(prop, &x, &y);
+       input_report_abs(input, multitouch ? ABS_MT_POSITION_X : ABS_X, x);
+       input_report_abs(input, multitouch ? ABS_MT_POSITION_Y : ABS_Y, y);
+}
+EXPORT_SYMBOL(touchscreen_report_pos);
 
 #define _TOUCHSCREEN_H
 
 struct input_dev;
+struct input_mt_pos;
 
-void touchscreen_parse_properties(struct input_dev *dev, bool multitouch);
+struct touchscreen_properties {
+       unsigned int max_x;
+       unsigned int max_y;
+       bool invert_x;
+       bool invert_y;
+       bool swap_x_y;
+};
+
+void touchscreen_parse_properties(struct input_dev *input, bool multitouch,
+                                 struct touchscreen_properties *prop);
+
+void touchscreen_set_mt_pos(struct input_mt_pos *pos,
+                           const struct touchscreen_properties *prop,
+                           unsigned int x, unsigned int y);
+
+void touchscreen_report_pos(struct input_dev *input,
+                           const struct touchscreen_properties *prop,
+                           unsigned int x, unsigned int y,
+                           bool multitouch);
 
 #endif