input: touchscreen: goodix_berlin_driver: Support A/B panel detection

Change-Id: Ib0511e91a6896ec31b44c5f304f2c3e0421aa262
Signed-off-by: Jens Reidel <adrian@travitia.xyz>
This commit is contained in:
Jens Reidel 2024-09-02 18:05:35 +02:00
parent 608c10c3c0
commit 73c3523557
No known key found for this signature in database
GPG Key ID: 23C1E5F512C12303
2 changed files with 57 additions and 4 deletions

View File

@ -28,6 +28,12 @@
#include "goodix_ts_core.h"
#define GOODIX_DEFAULT_FW_PROPERTY "goodix,firmware-name"
#define GOODIX_DEFAULT_CFG_PROPERTY "goodix,config-name"
#define GOODIX_FW_PROPERTY_A "goodix,firmware-namea"
#define GOODIX_FW_PROPERTY_B "goodix,firmware-nameb"
#define GOODIX_CFG_PROPERTY_A "goodix,config-namea"
#define GOODIX_CFG_PROPERTY_B "goodix,config-nameb"
#define GOODIX_DEFAULT_CFG_NAME "goodix_cfg_group.cfg"
#define GOOIDX_INPUT_PHYS "goodix_ts/input0"
@ -1004,10 +1010,15 @@ static int goodix_parse_dt_resolution(struct device_node *node,
* return: 0 - no error, <0 error
*/
static int goodix_parse_dt(struct device_node *node,
struct device *dev,
struct goodix_ts_board_data *board_data)
{
const char *name_tmp;
const char *firmware_property = GOODIX_DEFAULT_FW_PROPERTY;
const char *config_property = GOODIX_DEFAULT_CFG_PROPERTY;
int r;
int gpio_a;
int gpio_b;
if (!board_data) {
ts_err("invalid board data");
@ -1081,8 +1092,45 @@ static int goodix_parse_dt(struct device_node *node,
sizeof(board_data->iovdd_name));
}
/* get panel ID GPIOs */
board_data->panel_id_gpio_a = of_get_named_gpio(node, "goodix,panel-id-gpio-a", 0);
if (board_data->panel_id_gpio_a < 0)
board_data->panel_id_gpio_a = 0;
board_data->panel_id_gpio_b = of_get_named_gpio(node, "goodix,panel-id-gpio-b", 0);
if (board_data->panel_id_gpio_b < 0)
board_data->panel_id_gpio_b = 0;
/* check panel ID GPIOs */
if (board_data->panel_id_gpio_a && board_data->panel_id_gpio_b) {
r = devm_gpio_request_one(dev, board_data->panel_id_gpio_a,
GPIOF_IN, "LCD_ID_DET1");
if (board_data->panel_id_gpio_a < 0)
return -EINVAL;
r = devm_gpio_request_one(dev, board_data->panel_id_gpio_b,
GPIOF_IN, "LCD_ID_DET2");
if (board_data->panel_id_gpio_b < 0)
return -EINVAL;
gpio_a = gpio_get_value(board_data->panel_id_gpio_a);
gpio_b = gpio_get_value(board_data->panel_id_gpio_b);
ts_info("gpio_a=%d, gpio_b=%d\n", gpio_a, gpio_b);
/* not at least one GPIO down? unsupported panel */
if (gpio_a && gpio_b)
return -ENOTSUPP;
else if (!gpio_a) {
firmware_property = GOODIX_FW_PROPERTY_A;
config_property = GOODIX_CFG_PROPERTY_A;
} else if (!gpio_b) {
firmware_property = GOODIX_FW_PROPERTY_B;
config_property = GOODIX_CFG_PROPERTY_B;
}
}
/* get firmware file name */
r = of_property_read_string(node, "goodix,firmware-name", &name_tmp);
r = of_property_read_string(node, firmware_property, &name_tmp);
if (!r) {
ts_info("firmware name from dt: %s", name_tmp);
strlcpy(board_data->fw_name,
@ -1096,7 +1144,7 @@ static int goodix_parse_dt(struct device_node *node,
}
/* get config file name */
r = of_property_read_string(node, "goodix,config-name", &name_tmp);
r = of_property_read_string(node, config_property, &name_tmp);
if (!r) {
ts_info("config name from dt: %s", name_tmp);
strlcpy(board_data->cfg_bin_name, name_tmp,
@ -2321,8 +2369,11 @@ static int goodix_ts_probe(struct platform_device *pdev)
if (IS_ENABLED(CONFIG_OF) && bus_interface->dev->of_node) {
/* parse devicetree property */
ret = goodix_parse_dt(node, &core_data->board_data);
if (ret) {
ret = goodix_parse_dt(node, &pdev->dev, &core_data->board_data);
if (ret == -ENOTSUPP) {
ts_info("unsupported touch panel\n");
return -ENOTSUPP;
} else if (ret) {
ts_err("failed parse device info form dts, %d", ret);
return -EINVAL;
}

View File

@ -296,6 +296,8 @@ struct goodix_ts_board_data {
int irq_gpio;
int avdd_gpio;
int iovdd_gpio;
int panel_id_gpio_a;
int panel_id_gpio_b;
unsigned int irq_flags;
unsigned int swap_axis;