Re: [PATCH] input/touchscreen: synaptics_tcm_oncell: add driver
From: Krzysztof Kozlowski
Date: Thu Mar 28 2024 - 04:34:20 EST
On 27/03/2024 22:39, Frieder Hannenheim wrote:
> This is a bit of a stripped down and partially reworked driver for the
> synaptics_tcm_oncell touchscreen. I based my work off the driver in the
> LineageOS kernel found at
> https://github.com/LineageOS/android_kernel_oneplus_sm8250 branch
> lineage-20. The code was originally written by OnePlus developers but
> I'm not sure how to credit them correctly.
>
> Currently the driver is in a pretty good shape, the only thing that is
> not working is setting a report config. To me it looks like some data is
> sent by the touchscreen firmware after setting the report config that is
> making the irq handler crash. Sadly I haven't been able to test out why.
> The driver works fine also with the default touch report config so maybe
> we can just use that and not set our own.
>
> Signed-off-by: Frieder Hannenheim <friederhannenheim@xxxxxxxxxx>
> ---
> .../input/touchscreen/syna,s3908.yaml | 63 +
Please run scripts/checkpatch.pl and fix reported warnings. Then please
run `scripts/checkpatch.pl --strict` and (probably) fix more warnings.
Some warnings can be ignored, especially from --strict run, but the code
here looks like it needs a fix. Feel free to get in touch if the warning
is not clear.
Please use scripts/get_maintainers.pl to get a list of necessary people
and lists to CC. It might happen, that command when run on an older
kernel, gives you outdated entries. Therefore please be sure you base
your patches on recent Linux kernel.
Tools like b4 or scripts/get_maintainer.pl provide you proper list of
people, so fix your workflow. Tools might also fail if you work on some
ancient tree (don't, instead use mainline), work on fork of kernel
(don't, instead use mainline) or you ignore some maintainers (really
don't). Just use b4 and everything should be fine, although remember
about `b4 prep --auto-to-cc` if you added new patches to the patchset.
You missed at least devicetree list (maybe more), so this won't be
tested by automated tooling. Performing review on untested code might be
a waste of time, thus I will skip this patch entirely till you follow
the process allowing the patch to be tested.
Please kindly resend and include all necessary To/Cc entries.
> drivers/input/touchscreen/Kconfig | 11 +
(skipping untested bindings)
..
> +
> +static int syna_tcm_probe(struct i2c_client *client)
> +{
> + struct syna_tcm_data *tcm_info;
> + int err;
> +
> + pr_info("starting probe for syna_tcm_oncell touchscreen");
No, drop. Drop such msgs everywhere if you have more than only here.
> +
> + if (!i2c_check_functionality(client->adapter,
> + I2C_FUNC_I2C | I2C_FUNC_SMBUS_BYTE_DATA |
> + I2C_FUNC_SMBUS_I2C_BLOCK))
> + return -ENODEV;
> +
> + tcm_info = devm_kzalloc(&client->dev, sizeof(*tcm_info), GFP_KERNEL);
> + if (!tcm_info)
> + return -ENOMEM;
> +
> + i2c_set_clientdata(client, tcm_info);
> + tcm_info->client = client;
> + tcm_info->response_buf = NULL;
> +
> + of_property_read_u32(client->dev.of_node, "max-objects",
> + &tcm_info->touchpanel_max_objects);
> +
> + tcm_info->reset_gpio =
> + gpiod_get_index(&client->dev, "reset", 0, GPIOD_OUT_HIGH);
Misaligned / wrongly wrapped. There is no wrapping of code after =.
> +
> + tcm_info->regulators[SYNA_TCM_ONCELL_REGULATOR_VDD].supply = "vdd";
> + tcm_info->regulators[SYNA_TCM_ONCELL_REGULATOR_VCC].supply = "vcc";
> + err = devm_regulator_bulk_get(&client->dev,
> + ARRAY_SIZE(tcm_info->regulators),
> + tcm_info->regulators);
> + if (err)
> + return err;
> +
> + // TODO: uncomment once syna_tcm_power_off is implemented
> + // err = devm_add_action_or_reset(&client->dev, syna_tcm_oncell_power_off, tcm_info);
> + // if (err)
> + // return err;
No dead code.
> +
> + err = syna_tcm_power_on(tcm_info);
> + if (err < 0)
> + return err;
> +
> + // This needs to happen before the first write to the device
> + err = devm_request_threaded_irq(&client->dev, client->irq, NULL,
> + syna_irq_handler,
> + IRQF_TRIGGER_LOW | IRQF_ONESHOT,
> + "syna_tcm_oncell_irq", tcm_info);
> + if (err)
> + return err;
> +
> + err = syna_tcm_run_application_firmware(tcm_info);
> + if (err < 0)
> + return err;
> +
> + // err = syna_tcm_set_normal_report_config(tcm_info);
> + // if (err < 0)
> + // pr_err("syna_tcm: failed to set normal touch report config")
No dead code in the driver.
> +
> + err = syna_tcm_get_report_config(tcm_info);
> + if (err < 0)
> + return err;
> +
> + tcm_info->input = devm_input_allocate_device(&client->dev);
> + if (!tcm_info->input)
> + return -ENOMEM;
> +
> + tcm_info->input->name = TOUCHPANEL_DEVICE;
> + tcm_info->input->id.bustype = BUS_I2C;
> +
> + input_set_abs_params(tcm_info->input, ABS_MT_POSITION_X, 0,
> + le2_to_uint(tcm_info->app_info.max_x), 0, 0);
> + input_set_abs_params(tcm_info->input, ABS_MT_POSITION_Y, 0,
> + le2_to_uint(tcm_info->app_info.max_y), 0, 0);
> + input_set_abs_params(tcm_info->input, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0);
> + input_set_abs_params(tcm_info->input, ABS_MT_TOUCH_MINOR, 0, 255, 0, 0);
> + input_set_abs_params(tcm_info->input, ABS_MT_PRESSURE, 0, 255, 0, 0);
> +
> + touchscreen_parse_properties(tcm_info->input, true, &tcm_info->prop);
> +
> + err = input_mt_init_slots(tcm_info->input,
> + tcm_info->touchpanel_max_objects,
> + INPUT_MT_DIRECT);
> + if (err)
> + return err;
> +
> + input_set_drvdata(tcm_info->input, tcm_info);
> +
> + err = input_register_device(tcm_info->input);
> + if (err)
> + return err;
> +
> + pr_info("syna_tcm: probe done");
No, no simple function success messages. There is already infrastructure
for this (tracing, sysfs).
> + tcm_info->initialize_done = true;
> +
> + return 0;
> +}
> +
> +static const struct of_device_id syna_driver_ids[] = {
> + {
> + .compatible = "syna,s3908",
> + },
> + {}
> +};
> +MODULE_DEVICE_TABLE(of, syna_driver_ids);
> +
> +static const struct i2c_device_id syna_i2c_ids[] = { { TOUCHPANEL_DEVICE, 0 },
That does not look like kernel coding style.
> + {} };
> +MODULE_DEVICE_TABLE(i2c, syna_i2c_ids);
> +
> +// static const struct dev_pm_ops syna_pm_ops = {
> +// .suspend = syna_i2c_suspend,
> +// .resume = syna_i2c_resume,
> +// };
Please do not submit dead code.
Best regards,
Krzysztof