18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (c) 2011-2016 Synaptics Incorporated 48c2ecf20Sopenharmony_ci * Copyright (c) 2011 Unixphere 58c2ecf20Sopenharmony_ci */ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/kernel.h> 88c2ecf20Sopenharmony_ci#include <linux/device.h> 98c2ecf20Sopenharmony_ci#include <linux/of.h> 108c2ecf20Sopenharmony_ci#include <linux/input.h> 118c2ecf20Sopenharmony_ci#include <linux/input/mt.h> 128c2ecf20Sopenharmony_ci#include <linux/rmi.h> 138c2ecf20Sopenharmony_ci#include "rmi_driver.h" 148c2ecf20Sopenharmony_ci#include "rmi_2d_sensor.h" 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define RMI_2D_REL_POS_MIN -128 178c2ecf20Sopenharmony_ci#define RMI_2D_REL_POS_MAX 127 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci/* maximum ABS_MT_POSITION displacement (in mm) */ 208c2ecf20Sopenharmony_ci#define DMAX 10 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_civoid rmi_2d_sensor_abs_process(struct rmi_2d_sensor *sensor, 238c2ecf20Sopenharmony_ci struct rmi_2d_sensor_abs_object *obj, 248c2ecf20Sopenharmony_ci int slot) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci struct rmi_2d_axis_alignment *axis_align = &sensor->axis_align; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci /* we keep the previous values if the finger is released */ 298c2ecf20Sopenharmony_ci if (obj->type == RMI_2D_OBJECT_NONE) 308c2ecf20Sopenharmony_ci return; 318c2ecf20Sopenharmony_ci 328c2ecf20Sopenharmony_ci if (axis_align->flip_x) 338c2ecf20Sopenharmony_ci obj->x = sensor->max_x - obj->x; 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci if (axis_align->flip_y) 368c2ecf20Sopenharmony_ci obj->y = sensor->max_y - obj->y; 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci if (axis_align->swap_axes) 398c2ecf20Sopenharmony_ci swap(obj->x, obj->y); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci /* 428c2ecf20Sopenharmony_ci * Here checking if X offset or y offset are specified is 438c2ecf20Sopenharmony_ci * redundant. We just add the offsets or clip the values. 448c2ecf20Sopenharmony_ci * 458c2ecf20Sopenharmony_ci * Note: offsets need to be applied before clipping occurs, 468c2ecf20Sopenharmony_ci * or we could get funny values that are outside of 478c2ecf20Sopenharmony_ci * clipping boundaries. 488c2ecf20Sopenharmony_ci */ 498c2ecf20Sopenharmony_ci obj->x += axis_align->offset_x; 508c2ecf20Sopenharmony_ci obj->y += axis_align->offset_y; 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci obj->x = max(axis_align->clip_x_low, obj->x); 538c2ecf20Sopenharmony_ci obj->y = max(axis_align->clip_y_low, obj->y); 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci if (axis_align->clip_x_high) 568c2ecf20Sopenharmony_ci obj->x = min(sensor->max_x, obj->x); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci if (axis_align->clip_y_high) 598c2ecf20Sopenharmony_ci obj->y = min(sensor->max_y, obj->y); 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci sensor->tracking_pos[slot].x = obj->x; 628c2ecf20Sopenharmony_ci sensor->tracking_pos[slot].y = obj->y; 638c2ecf20Sopenharmony_ci} 648c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rmi_2d_sensor_abs_process); 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_civoid rmi_2d_sensor_abs_report(struct rmi_2d_sensor *sensor, 678c2ecf20Sopenharmony_ci struct rmi_2d_sensor_abs_object *obj, 688c2ecf20Sopenharmony_ci int slot) 698c2ecf20Sopenharmony_ci{ 708c2ecf20Sopenharmony_ci struct rmi_2d_axis_alignment *axis_align = &sensor->axis_align; 718c2ecf20Sopenharmony_ci struct input_dev *input = sensor->input; 728c2ecf20Sopenharmony_ci int wide, major, minor; 738c2ecf20Sopenharmony_ci 748c2ecf20Sopenharmony_ci if (sensor->kernel_tracking) 758c2ecf20Sopenharmony_ci input_mt_slot(input, sensor->tracking_slots[slot]); 768c2ecf20Sopenharmony_ci else 778c2ecf20Sopenharmony_ci input_mt_slot(input, slot); 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci input_mt_report_slot_state(input, obj->mt_tool, 808c2ecf20Sopenharmony_ci obj->type != RMI_2D_OBJECT_NONE); 818c2ecf20Sopenharmony_ci 828c2ecf20Sopenharmony_ci if (obj->type != RMI_2D_OBJECT_NONE) { 838c2ecf20Sopenharmony_ci obj->x = sensor->tracking_pos[slot].x; 848c2ecf20Sopenharmony_ci obj->y = sensor->tracking_pos[slot].y; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci if (axis_align->swap_axes) 878c2ecf20Sopenharmony_ci swap(obj->wx, obj->wy); 888c2ecf20Sopenharmony_ci 898c2ecf20Sopenharmony_ci wide = (obj->wx > obj->wy); 908c2ecf20Sopenharmony_ci major = max(obj->wx, obj->wy); 918c2ecf20Sopenharmony_ci minor = min(obj->wx, obj->wy); 928c2ecf20Sopenharmony_ci 938c2ecf20Sopenharmony_ci if (obj->type == RMI_2D_OBJECT_STYLUS) { 948c2ecf20Sopenharmony_ci major = max(1, major); 958c2ecf20Sopenharmony_ci minor = max(1, minor); 968c2ecf20Sopenharmony_ci } 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_POSITION_X, obj->x); 998c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_POSITION_Y, obj->y); 1008c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_ORIENTATION, wide); 1018c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_PRESSURE, obj->z); 1028c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_TOUCH_MAJOR, major); 1038c2ecf20Sopenharmony_ci input_event(sensor->input, EV_ABS, ABS_MT_TOUCH_MINOR, minor); 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci rmi_dbg(RMI_DEBUG_2D_SENSOR, &sensor->input->dev, 1068c2ecf20Sopenharmony_ci "%s: obj[%d]: type: 0x%02x X: %d Y: %d Z: %d WX: %d WY: %d\n", 1078c2ecf20Sopenharmony_ci __func__, slot, obj->type, obj->x, obj->y, obj->z, 1088c2ecf20Sopenharmony_ci obj->wx, obj->wy); 1098c2ecf20Sopenharmony_ci } 1108c2ecf20Sopenharmony_ci} 1118c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rmi_2d_sensor_abs_report); 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_civoid rmi_2d_sensor_rel_report(struct rmi_2d_sensor *sensor, int x, int y) 1148c2ecf20Sopenharmony_ci{ 1158c2ecf20Sopenharmony_ci struct rmi_2d_axis_alignment *axis_align = &sensor->axis_align; 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci x = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)x)); 1188c2ecf20Sopenharmony_ci y = min(RMI_2D_REL_POS_MAX, max(RMI_2D_REL_POS_MIN, (int)y)); 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_ci if (axis_align->flip_x) 1218c2ecf20Sopenharmony_ci x = min(RMI_2D_REL_POS_MAX, -x); 1228c2ecf20Sopenharmony_ci 1238c2ecf20Sopenharmony_ci if (axis_align->flip_y) 1248c2ecf20Sopenharmony_ci y = min(RMI_2D_REL_POS_MAX, -y); 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci if (axis_align->swap_axes) 1278c2ecf20Sopenharmony_ci swap(x, y); 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci if (x || y) { 1308c2ecf20Sopenharmony_ci input_report_rel(sensor->input, REL_X, x); 1318c2ecf20Sopenharmony_ci input_report_rel(sensor->input, REL_Y, y); 1328c2ecf20Sopenharmony_ci } 1338c2ecf20Sopenharmony_ci} 1348c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rmi_2d_sensor_rel_report); 1358c2ecf20Sopenharmony_ci 1368c2ecf20Sopenharmony_cistatic void rmi_2d_sensor_set_input_params(struct rmi_2d_sensor *sensor) 1378c2ecf20Sopenharmony_ci{ 1388c2ecf20Sopenharmony_ci struct input_dev *input = sensor->input; 1398c2ecf20Sopenharmony_ci int res_x; 1408c2ecf20Sopenharmony_ci int res_y; 1418c2ecf20Sopenharmony_ci int max_x, max_y; 1428c2ecf20Sopenharmony_ci int input_flags = 0; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ci if (sensor->report_abs) { 1458c2ecf20Sopenharmony_ci sensor->min_x = sensor->axis_align.clip_x_low; 1468c2ecf20Sopenharmony_ci if (sensor->axis_align.clip_x_high) 1478c2ecf20Sopenharmony_ci sensor->max_x = min(sensor->max_x, 1488c2ecf20Sopenharmony_ci sensor->axis_align.clip_x_high); 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci sensor->min_y = sensor->axis_align.clip_y_low; 1518c2ecf20Sopenharmony_ci if (sensor->axis_align.clip_y_high) 1528c2ecf20Sopenharmony_ci sensor->max_y = min(sensor->max_y, 1538c2ecf20Sopenharmony_ci sensor->axis_align.clip_y_high); 1548c2ecf20Sopenharmony_ci 1558c2ecf20Sopenharmony_ci set_bit(EV_ABS, input->evbit); 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci max_x = sensor->max_x; 1588c2ecf20Sopenharmony_ci max_y = sensor->max_y; 1598c2ecf20Sopenharmony_ci if (sensor->axis_align.swap_axes) 1608c2ecf20Sopenharmony_ci swap(max_x, max_y); 1618c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_POSITION_X, 0, max_x, 0, 0); 1628c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_POSITION_Y, 0, max_y, 0, 0); 1638c2ecf20Sopenharmony_ci 1648c2ecf20Sopenharmony_ci if (sensor->x_mm && sensor->y_mm) { 1658c2ecf20Sopenharmony_ci res_x = (sensor->max_x - sensor->min_x) / sensor->x_mm; 1668c2ecf20Sopenharmony_ci res_y = (sensor->max_y - sensor->min_y) / sensor->y_mm; 1678c2ecf20Sopenharmony_ci if (sensor->axis_align.swap_axes) 1688c2ecf20Sopenharmony_ci swap(res_x, res_y); 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ci input_abs_set_res(input, ABS_X, res_x); 1718c2ecf20Sopenharmony_ci input_abs_set_res(input, ABS_Y, res_y); 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci input_abs_set_res(input, ABS_MT_POSITION_X, res_x); 1748c2ecf20Sopenharmony_ci input_abs_set_res(input, ABS_MT_POSITION_Y, res_y); 1758c2ecf20Sopenharmony_ci 1768c2ecf20Sopenharmony_ci if (!sensor->dmax) 1778c2ecf20Sopenharmony_ci sensor->dmax = DMAX * res_x; 1788c2ecf20Sopenharmony_ci } 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_PRESSURE, 0, 0xff, 0, 0); 1818c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_TOUCH_MAJOR, 0, 0x0f, 0, 0); 1828c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_TOUCH_MINOR, 0, 0x0f, 0, 0); 1838c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_ORIENTATION, 0, 1, 0, 0); 1848c2ecf20Sopenharmony_ci input_set_abs_params(input, ABS_MT_TOOL_TYPE, 1858c2ecf20Sopenharmony_ci 0, MT_TOOL_MAX, 0, 0); 1868c2ecf20Sopenharmony_ci 1878c2ecf20Sopenharmony_ci if (sensor->sensor_type == rmi_sensor_touchpad) 1888c2ecf20Sopenharmony_ci input_flags = INPUT_MT_POINTER; 1898c2ecf20Sopenharmony_ci else 1908c2ecf20Sopenharmony_ci input_flags = INPUT_MT_DIRECT; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci if (sensor->kernel_tracking) 1938c2ecf20Sopenharmony_ci input_flags |= INPUT_MT_TRACK; 1948c2ecf20Sopenharmony_ci 1958c2ecf20Sopenharmony_ci input_mt_init_slots(input, sensor->nbr_fingers, input_flags); 1968c2ecf20Sopenharmony_ci } 1978c2ecf20Sopenharmony_ci 1988c2ecf20Sopenharmony_ci if (sensor->report_rel) { 1998c2ecf20Sopenharmony_ci set_bit(EV_REL, input->evbit); 2008c2ecf20Sopenharmony_ci set_bit(REL_X, input->relbit); 2018c2ecf20Sopenharmony_ci set_bit(REL_Y, input->relbit); 2028c2ecf20Sopenharmony_ci } 2038c2ecf20Sopenharmony_ci 2048c2ecf20Sopenharmony_ci if (sensor->topbuttonpad) 2058c2ecf20Sopenharmony_ci set_bit(INPUT_PROP_TOPBUTTONPAD, input->propbit); 2068c2ecf20Sopenharmony_ci} 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ciint rmi_2d_sensor_configure_input(struct rmi_function *fn, 2098c2ecf20Sopenharmony_ci struct rmi_2d_sensor *sensor) 2108c2ecf20Sopenharmony_ci{ 2118c2ecf20Sopenharmony_ci struct rmi_device *rmi_dev = fn->rmi_dev; 2128c2ecf20Sopenharmony_ci struct rmi_driver_data *drv_data = dev_get_drvdata(&rmi_dev->dev); 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci if (!drv_data->input) 2158c2ecf20Sopenharmony_ci return -ENODEV; 2168c2ecf20Sopenharmony_ci 2178c2ecf20Sopenharmony_ci sensor->input = drv_data->input; 2188c2ecf20Sopenharmony_ci rmi_2d_sensor_set_input_params(sensor); 2198c2ecf20Sopenharmony_ci 2208c2ecf20Sopenharmony_ci return 0; 2218c2ecf20Sopenharmony_ci} 2228c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rmi_2d_sensor_configure_input); 2238c2ecf20Sopenharmony_ci 2248c2ecf20Sopenharmony_ci#ifdef CONFIG_OF 2258c2ecf20Sopenharmony_ciint rmi_2d_sensor_of_probe(struct device *dev, 2268c2ecf20Sopenharmony_ci struct rmi_2d_sensor_platform_data *pdata) 2278c2ecf20Sopenharmony_ci{ 2288c2ecf20Sopenharmony_ci int retval; 2298c2ecf20Sopenharmony_ci u32 val; 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci pdata->axis_align.swap_axes = of_property_read_bool(dev->of_node, 2328c2ecf20Sopenharmony_ci "touchscreen-swapped-x-y"); 2338c2ecf20Sopenharmony_ci 2348c2ecf20Sopenharmony_ci pdata->axis_align.flip_x = of_property_read_bool(dev->of_node, 2358c2ecf20Sopenharmony_ci "touchscreen-inverted-x"); 2368c2ecf20Sopenharmony_ci 2378c2ecf20Sopenharmony_ci pdata->axis_align.flip_y = of_property_read_bool(dev->of_node, 2388c2ecf20Sopenharmony_ci "touchscreen-inverted-y"); 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,clip-x-low", 1); 2418c2ecf20Sopenharmony_ci if (retval) 2428c2ecf20Sopenharmony_ci return retval; 2438c2ecf20Sopenharmony_ci 2448c2ecf20Sopenharmony_ci pdata->axis_align.clip_x_low = val; 2458c2ecf20Sopenharmony_ci 2468c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,clip-y-low", 1); 2478c2ecf20Sopenharmony_ci if (retval) 2488c2ecf20Sopenharmony_ci return retval; 2498c2ecf20Sopenharmony_ci 2508c2ecf20Sopenharmony_ci pdata->axis_align.clip_y_low = val; 2518c2ecf20Sopenharmony_ci 2528c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,clip-x-high", 1); 2538c2ecf20Sopenharmony_ci if (retval) 2548c2ecf20Sopenharmony_ci return retval; 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci pdata->axis_align.clip_x_high = val; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,clip-y-high", 1); 2598c2ecf20Sopenharmony_ci if (retval) 2608c2ecf20Sopenharmony_ci return retval; 2618c2ecf20Sopenharmony_ci 2628c2ecf20Sopenharmony_ci pdata->axis_align.clip_y_high = val; 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,offset-x", 1); 2658c2ecf20Sopenharmony_ci if (retval) 2668c2ecf20Sopenharmony_ci return retval; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_ci pdata->axis_align.offset_x = val; 2698c2ecf20Sopenharmony_ci 2708c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,offset-y", 1); 2718c2ecf20Sopenharmony_ci if (retval) 2728c2ecf20Sopenharmony_ci return retval; 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci pdata->axis_align.offset_y = val; 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,delta-x-threshold", 2778c2ecf20Sopenharmony_ci 1); 2788c2ecf20Sopenharmony_ci if (retval) 2798c2ecf20Sopenharmony_ci return retval; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_ci pdata->axis_align.delta_x_threshold = val; 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,delta-y-threshold", 2848c2ecf20Sopenharmony_ci 1); 2858c2ecf20Sopenharmony_ci if (retval) 2868c2ecf20Sopenharmony_ci return retval; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_ci pdata->axis_align.delta_y_threshold = val; 2898c2ecf20Sopenharmony_ci 2908c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, (u32 *)&pdata->sensor_type, 2918c2ecf20Sopenharmony_ci "syna,sensor-type", 1); 2928c2ecf20Sopenharmony_ci if (retval) 2938c2ecf20Sopenharmony_ci return retval; 2948c2ecf20Sopenharmony_ci 2958c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "touchscreen-x-mm", 1); 2968c2ecf20Sopenharmony_ci if (retval) 2978c2ecf20Sopenharmony_ci return retval; 2988c2ecf20Sopenharmony_ci 2998c2ecf20Sopenharmony_ci pdata->x_mm = val; 3008c2ecf20Sopenharmony_ci 3018c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "touchscreen-y-mm", 1); 3028c2ecf20Sopenharmony_ci if (retval) 3038c2ecf20Sopenharmony_ci return retval; 3048c2ecf20Sopenharmony_ci 3058c2ecf20Sopenharmony_ci pdata->y_mm = val; 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, 3088c2ecf20Sopenharmony_ci "syna,disable-report-mask", 1); 3098c2ecf20Sopenharmony_ci if (retval) 3108c2ecf20Sopenharmony_ci return retval; 3118c2ecf20Sopenharmony_ci 3128c2ecf20Sopenharmony_ci pdata->disable_report_mask = val; 3138c2ecf20Sopenharmony_ci 3148c2ecf20Sopenharmony_ci retval = rmi_of_property_read_u32(dev, &val, "syna,rezero-wait-ms", 3158c2ecf20Sopenharmony_ci 1); 3168c2ecf20Sopenharmony_ci if (retval) 3178c2ecf20Sopenharmony_ci return retval; 3188c2ecf20Sopenharmony_ci 3198c2ecf20Sopenharmony_ci pdata->rezero_wait = val; 3208c2ecf20Sopenharmony_ci 3218c2ecf20Sopenharmony_ci return 0; 3228c2ecf20Sopenharmony_ci} 3238c2ecf20Sopenharmony_ci#else 3248c2ecf20Sopenharmony_ciinline int rmi_2d_sensor_of_probe(struct device *dev, 3258c2ecf20Sopenharmony_ci struct rmi_2d_sensor_platform_data *pdata) 3268c2ecf20Sopenharmony_ci{ 3278c2ecf20Sopenharmony_ci return -ENODEV; 3288c2ecf20Sopenharmony_ci} 3298c2ecf20Sopenharmony_ci#endif 3308c2ecf20Sopenharmony_ciEXPORT_SYMBOL_GPL(rmi_2d_sensor_of_probe); 331