On Fri, Apr 17, 2020 at 11:21 PM Artur Rojek <contact@xxxxxxxxxxxxxx> wrote:
The SADC component in JZ47xx SoCs provides support for touchscreen
operations (pen position and pen down pressure) in single-ended and
differential modes.
Of the known hardware to use this controller, GCW Zero and Anbernic RG-350
utilize the touchscreen mode by having their joystick(s) attached to the
X/Y positive/negative input pins.
GCW Zero comes with a single joystick and is sufficiently handled with the
currently implemented single-ended mode. Support for boards with two
joysticks, where one is hooked up to Xn/Yn and the other to Xp/Yp channels
will need to be provided in the future.
The touchscreen component of SADC takes a significant time to stabilize
after first receiving the clock and a delay of 50ms has been empirically
proven to be a safe value before data sampling can begin.
All the boards which probe this driver have the interrupt provided from
devicetree, with no need to handle a case where the irq was not provided.
Device Tree
IRQ
...
+ .scan_type = {
+ .sign = 'u',
+ .realbits = 12,
+ .storagebits = 16
It's slightly better to leave comma in such cases.
+ },
+ .scan_type = {
+ .sign = 'u',
+ .realbits = 12,
+ .storagebits = 16
Ditto.
+ },
...
.indexed = 1,
.channel = INGENIC_ADC_AUX,
+ .scan_index = -1
Ditto. You see above? Isn't it nice that you didn't touch that line?
So, perhaps next developer can leverage this subtle kind of things.
.indexed = 1,
.channel = INGENIC_ADC_BATTERY,
+ .scan_index = -1
Ditto.
.indexed = 1,
.channel = INGENIC_ADC_AUX2,
+ .scan_index = -1
Ditto.
...
+static int ingenic_adc_buffer_enable(struct iio_dev *iio_dev)
+{
+ struct ingenic_adc *adc = iio_priv(iio_dev);
+
+ clk_enable(adc->clk);
Error check?
+ /* It takes significant time for the touchscreen hw to stabilize. */
+ msleep(50);
+ ingenic_adc_set_config(adc, JZ_ADC_REG_CFG_TOUCH_OPS_MASK,
+ JZ_ADC_REG_CFG_SAMPLE_NUM(4) |
+ JZ_ADC_REG_CFG_PULL_UP(4));
+ writew(80, adc->base + JZ_ADC_REG_ADWAIT);
+ writew(2, adc->base + JZ_ADC_REG_ADSAME);
+ writeb((u8)~JZ_ADC_IRQ_TOUCH, adc->base + JZ_ADC_REG_CTRL);
Why casting?
+ writel(0, adc->base + JZ_ADC_REG_ADTCH);
+ ingenic_adc_enable(adc, 2, true);
+
+ return 0;
+}
+ irq = platform_get_irq(pdev, 0);
Before it worked w/o IRQ, here is a regression you introduced.
+ if (irq < 0) {
+ dev_err(dev, "Failed to get irq: %d\n", irq);
Redundant message.
+ return irq;
+ }
--
With Best Regards,
Andy Shevchenko