Linux Input/HID development
 help / color / mirror / Atom feed
* Re: [PATCH 0/1] Input: Add TouchNetix aXiom touchscreen driver
From: Marco Felsch @ 2026-01-22 21:41 UTC (permalink / raw)
  To: AThomas63
  Cc: dmitry.torokhov, linux-input, linux-kernel, mark.satterthwaite,
	kamel.bouhara, kernel
In-Reply-To: <20260122124819.273188-1-andrew.thomas@touchnetix.com>

Hi Andrew,

thanks for your patch.

A few words prior doing a very rough review. I don't like the idea of
posting two complete different patchsets, furthermore if you could have
added the missing SPI support on-top of my patchset very easily since I
used the regmap-API.

Most of my patches already got the r-b tags and I received a very good
review from Dmitry recently which I currently integrating to send a new
version.

On 26-01-22, AThomas63 wrote:
> A Summary of the added features:
>  - Add input driver support for TouchNetix aXiom touchscreen controller 
> using either I2C or SPI.
>  - Support ABS_MT touch reports in axiom_process_u41_report().
>  - Support both polling and interrupt mode (trigger low).
>  - Add basic documentation and provide example device tree bindings.
>  - Provide the basic structure to add firmware and config download in
> the future via both I2C and SPI.
> 
> I understand the process is already under way to add a driver to support 
> aXiom by Marco at Pengutronix.
> I think it would be most useful for us to attempt to combine this patch
> in order to support both his changes for config/firmware download and 
> the patch here for SPI support along with I2C. I would be happy to help 
> with this process.
> This would allow TouchNetix to support a broader range of users of the
> aXiom device family.
> 
> I also have a device tree binding however I have not added it sincec
> from my understanding this should go in a different patch:
> Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml
>  
> My apologies if there are any obvious mistakes in this patch, this is the
> first patch that I have submitted.

That's not a problem at least not for me, but there are contriubtion
guidelines which you could have read first.

Also I'm a bit surprised that you have sent a driver for the same device
family which is less capable than mine. Your driver is missing the
complete fw-update mechanism and therefore needs still your downstream
python tooling. The fw-update logic is a huge part, since this was hard
to get it right.

There are a few other parts, you're doing wrong (please see the patch
review).

Regards,
  Marco


> 
> Many thanks for your time,
> Andrew Thomas
> 
> AThomas63 (1):
>   Adding support for aXiom touchscreen controller
> 
>  drivers/input/touchscreen/Kconfig      |  30 ++
>  drivers/input/touchscreen/Makefile     |   3 +
>  drivers/input/touchscreen/axiom_core.c | 482 +++++++++++++++++++++++++
>  drivers/input/touchscreen/axiom_core.h | 128 +++++++
>  drivers/input/touchscreen/axiom_i2c.c  | 152 ++++++++
>  drivers/input/touchscreen/axiom_spi.c  | 159 ++++++++
>  6 files changed, 954 insertions(+)
>  create mode 100644 drivers/input/touchscreen/axiom_core.c
>  create mode 100644 drivers/input/touchscreen/axiom_core.h
>  create mode 100644 drivers/input/touchscreen/axiom_i2c.c
>  create mode 100644 drivers/input/touchscreen/axiom_spi.c
> 
> -- 
> 2.43.0
> 
> 

-- 
#gernperDu 
#CallMeByMyFirstName

Pengutronix e.K.                           |                             |
Steuerwalder Str. 21                       | https://www.pengutronix.de/ |
31137 Hildesheim, Germany                  | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-9    |

^ permalink raw reply

* [dtor-input:next] BUILD SUCCESS 8a8e63fedbe433b888143fcb7ff55b7a87fa3163
From: kernel test robot @ 2026-01-22 21:10 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: linux-input

tree/branch: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
branch HEAD: 8a8e63fedbe433b888143fcb7ff55b7a87fa3163  Input: appletouch - fix potential race between resume and open

elapsed time: 1319m

configs tested: 289
configs skipped: 6

The following configs have been built successfully.
More configs may be tested in the coming days.

tested configs:
alpha                             allnoconfig    gcc-15.2.0
alpha                            allyesconfig    gcc-15.2.0
alpha                               defconfig    gcc-15.2.0
arc                              allmodconfig    clang-16
arc                               allnoconfig    gcc-15.2.0
arc                              allyesconfig    clang-22
arc                              allyesconfig    gcc-15.2.0
arc                                 defconfig    gcc-15.2.0
arc                     nsimosci_hs_defconfig    gcc-15.2.0
arc                   randconfig-001-20260122    gcc-15.2.0
arc                   randconfig-001-20260123    gcc-10.5.0
arc                   randconfig-002-20260122    gcc-15.2.0
arc                   randconfig-002-20260123    gcc-10.5.0
arc                           tb10x_defconfig    gcc-15.2.0
arc                    vdk_hs38_smp_defconfig    gcc-15.2.0
arm                               allnoconfig    clang-22
arm                               allnoconfig    gcc-15.2.0
arm                              allyesconfig    clang-16
arm                                 defconfig    gcc-15.2.0
arm                          gemini_defconfig    clang-22
arm                            mmp2_defconfig    clang-22
arm                         mv78xx0_defconfig    gcc-15.2.0
arm                         nhk8815_defconfig    clang-22
arm                           omap1_defconfig    clang-22
arm                          pxa910_defconfig    gcc-15.2.0
arm                   randconfig-001-20260122    gcc-15.2.0
arm                   randconfig-001-20260123    gcc-10.5.0
arm                   randconfig-002-20260122    gcc-15.2.0
arm                   randconfig-002-20260123    gcc-10.5.0
arm                   randconfig-003-20260122    gcc-15.2.0
arm                   randconfig-003-20260123    gcc-10.5.0
arm                   randconfig-004-20260122    gcc-15.2.0
arm                   randconfig-004-20260123    gcc-10.5.0
arm                           sama7_defconfig    clang-22
arm                       versatile_defconfig    clang-22
arm64                            allmodconfig    clang-19
arm64                            allmodconfig    clang-22
arm64                             allnoconfig    gcc-15.2.0
arm64                               defconfig    gcc-15.2.0
arm64                 randconfig-001-20260122    gcc-15.2.0
arm64                 randconfig-001-20260123    gcc-15.2.0
arm64                 randconfig-002-20260122    gcc-15.2.0
arm64                 randconfig-002-20260123    gcc-15.2.0
arm64                 randconfig-003-20260122    gcc-15.2.0
arm64                 randconfig-003-20260123    gcc-15.2.0
arm64                 randconfig-004-20260122    gcc-15.2.0
arm64                 randconfig-004-20260123    gcc-15.2.0
csky                             allmodconfig    gcc-15.2.0
csky                              allnoconfig    gcc-15.2.0
csky                                defconfig    gcc-15.2.0
csky                  randconfig-001-20260122    gcc-15.2.0
csky                  randconfig-001-20260123    gcc-15.2.0
csky                  randconfig-002-20260122    gcc-15.2.0
csky                  randconfig-002-20260123    gcc-15.2.0
hexagon                          allmodconfig    clang-17
hexagon                          allmodconfig    gcc-15.2.0
hexagon                           allnoconfig    clang-22
hexagon                           allnoconfig    gcc-15.2.0
hexagon                             defconfig    gcc-15.2.0
hexagon               randconfig-001-20260122    gcc-15.2.0
hexagon               randconfig-001-20260123    gcc-12.5.0
hexagon               randconfig-002-20260122    gcc-15.2.0
hexagon               randconfig-002-20260123    gcc-12.5.0
i386                             allmodconfig    clang-20
i386                             allmodconfig    gcc-14
i386                              allnoconfig    gcc-14
i386                              allnoconfig    gcc-15.2.0
i386                             allyesconfig    clang-20
i386                             allyesconfig    gcc-14
i386        buildonly-randconfig-001-20260122    clang-20
i386        buildonly-randconfig-001-20260123    clang-20
i386        buildonly-randconfig-002-20260122    clang-20
i386        buildonly-randconfig-002-20260123    clang-20
i386        buildonly-randconfig-003-20260122    clang-20
i386        buildonly-randconfig-003-20260123    clang-20
i386        buildonly-randconfig-004-20260122    clang-20
i386        buildonly-randconfig-004-20260123    clang-20
i386        buildonly-randconfig-005-20260122    clang-20
i386        buildonly-randconfig-005-20260123    clang-20
i386        buildonly-randconfig-006-20260122    clang-20
i386        buildonly-randconfig-006-20260123    clang-20
i386                                defconfig    gcc-15.2.0
i386                  randconfig-001-20260122    gcc-14
i386                  randconfig-002-20260122    gcc-14
i386                  randconfig-003-20260122    gcc-14
i386                  randconfig-004-20260122    gcc-14
i386                  randconfig-005-20260122    gcc-14
i386                  randconfig-006-20260122    gcc-14
i386                  randconfig-007-20260122    gcc-14
i386                  randconfig-011-20260122    clang-20
i386                  randconfig-011-20260123    clang-20
i386                  randconfig-012-20260122    clang-20
i386                  randconfig-012-20260123    clang-20
i386                  randconfig-013-20260122    clang-20
i386                  randconfig-013-20260123    clang-20
i386                  randconfig-014-20260122    clang-20
i386                  randconfig-014-20260123    clang-20
i386                  randconfig-015-20260122    clang-20
i386                  randconfig-015-20260123    clang-20
i386                  randconfig-016-20260122    clang-20
i386                  randconfig-016-20260123    clang-20
i386                  randconfig-017-20260122    clang-20
i386                  randconfig-017-20260123    clang-20
loongarch                        allmodconfig    clang-19
loongarch                        allmodconfig    clang-22
loongarch                         allnoconfig    clang-22
loongarch                         allnoconfig    gcc-15.2.0
loongarch                           defconfig    clang-19
loongarch             randconfig-001-20260122    gcc-15.2.0
loongarch             randconfig-001-20260123    gcc-12.5.0
loongarch             randconfig-002-20260122    gcc-15.2.0
loongarch             randconfig-002-20260123    gcc-12.5.0
m68k                             allmodconfig    gcc-15.2.0
m68k                              allnoconfig    gcc-15.2.0
m68k                             allyesconfig    clang-16
m68k                          amiga_defconfig    gcc-15.2.0
m68k                                defconfig    clang-19
m68k                       m5275evb_defconfig    clang-22
m68k                        mvme147_defconfig    gcc-15.2.0
microblaze                        allnoconfig    gcc-15.2.0
microblaze                       allyesconfig    gcc-15.2.0
microblaze                          defconfig    clang-19
mips                             allmodconfig    gcc-15.2.0
mips                              allnoconfig    gcc-15.2.0
mips                             allyesconfig    gcc-15.2.0
mips                          ath25_defconfig    clang-22
mips                     cu1000-neo_defconfig    gcc-15.2.0
mips                     cu1830-neo_defconfig    gcc-15.2.0
mips                     decstation_defconfig    gcc-15.2.0
mips                          eyeq5_defconfig    clang-22
nios2                            allmodconfig    clang-22
nios2                            allmodconfig    gcc-11.5.0
nios2                             allnoconfig    clang-22
nios2                             allnoconfig    gcc-11.5.0
nios2                               defconfig    clang-19
nios2                 randconfig-001-20260122    gcc-15.2.0
nios2                 randconfig-001-20260123    gcc-12.5.0
nios2                 randconfig-002-20260122    gcc-15.2.0
nios2                 randconfig-002-20260123    gcc-12.5.0
openrisc                         allmodconfig    clang-22
openrisc                         allmodconfig    gcc-15.2.0
openrisc                          allnoconfig    clang-22
openrisc                          allnoconfig    gcc-15.2.0
openrisc                            defconfig    gcc-15.2.0
parisc                           alldefconfig    gcc-15.2.0
parisc                           allmodconfig    gcc-15.2.0
parisc                            allnoconfig    clang-22
parisc                            allnoconfig    gcc-15.2.0
parisc                           allyesconfig    clang-19
parisc                              defconfig    gcc-15.2.0
parisc                randconfig-001-20260122    gcc-10.5.0
parisc                randconfig-001-20260123    gcc-12.5.0
parisc                randconfig-002-20260122    gcc-10.5.0
parisc                randconfig-002-20260123    gcc-12.5.0
parisc64                            defconfig    clang-19
powerpc                          allmodconfig    gcc-15.2.0
powerpc                           allnoconfig    clang-22
powerpc                           allnoconfig    gcc-15.2.0
powerpc                       eiger_defconfig    gcc-15.2.0
powerpc                        fsp2_defconfig    gcc-15.2.0
powerpc                   lite5200b_defconfig    gcc-15.2.0
powerpc                     mpc5200_defconfig    clang-22
powerpc                 mpc834x_itx_defconfig    gcc-15.2.0
powerpc                     powernv_defconfig    clang-22
powerpc                         ps3_defconfig    gcc-15.2.0
powerpc               randconfig-001-20260122    gcc-10.5.0
powerpc               randconfig-001-20260123    gcc-12.5.0
powerpc               randconfig-002-20260122    gcc-10.5.0
powerpc               randconfig-002-20260123    gcc-12.5.0
powerpc                     tqm8541_defconfig    gcc-15.2.0
powerpc64             randconfig-001-20260122    gcc-10.5.0
powerpc64             randconfig-001-20260123    gcc-12.5.0
powerpc64             randconfig-002-20260122    gcc-10.5.0
powerpc64             randconfig-002-20260123    gcc-12.5.0
riscv                            alldefconfig    gcc-15.2.0
riscv                            allmodconfig    clang-22
riscv                             allnoconfig    clang-22
riscv                             allnoconfig    gcc-15.2.0
riscv                            allyesconfig    clang-16
riscv                               defconfig    gcc-15.2.0
riscv                 randconfig-001-20260122    clang-18
riscv                 randconfig-001-20260123    clang-22
riscv                 randconfig-002-20260122    clang-18
riscv                 randconfig-002-20260123    clang-22
s390                             allmodconfig    clang-19
s390                              allnoconfig    clang-22
s390                             allyesconfig    gcc-15.2.0
s390                                defconfig    gcc-15.2.0
s390                  randconfig-001-20260122    clang-18
s390                  randconfig-001-20260123    clang-22
s390                  randconfig-002-20260122    clang-18
s390                  randconfig-002-20260123    clang-22
sh                               allmodconfig    gcc-15.2.0
sh                                allnoconfig    clang-22
sh                                allnoconfig    gcc-15.2.0
sh                               allyesconfig    clang-19
sh                                  defconfig    gcc-14
sh                        dreamcast_defconfig    gcc-15.2.0
sh                          r7780mp_defconfig    clang-22
sh                    randconfig-001-20260122    clang-18
sh                    randconfig-001-20260123    clang-22
sh                    randconfig-002-20260122    clang-18
sh                    randconfig-002-20260123    clang-22
sh                          sdk7786_defconfig    clang-22
sh                           se7206_defconfig    clang-22
sh                           se7343_defconfig    gcc-15.2.0
sh                           se7721_defconfig    gcc-15.2.0
sh                             sh03_defconfig    clang-22
sh                   sh7724_generic_defconfig    gcc-15.2.0
sparc                            alldefconfig    clang-22
sparc                             allnoconfig    clang-22
sparc                             allnoconfig    gcc-15.2.0
sparc                               defconfig    gcc-15.2.0
sparc                 randconfig-001-20260122    gcc-8.5.0
sparc                 randconfig-001-20260123    gcc-13.4.0
sparc                 randconfig-002-20260122    gcc-8.5.0
sparc                 randconfig-002-20260123    gcc-13.4.0
sparc64                          alldefconfig    gcc-15.2.0
sparc64                          allmodconfig    clang-22
sparc64                             defconfig    gcc-14
sparc64               randconfig-001-20260122    gcc-8.5.0
sparc64               randconfig-001-20260123    gcc-13.4.0
sparc64               randconfig-002-20260122    gcc-8.5.0
sparc64               randconfig-002-20260123    gcc-13.4.0
um                               allmodconfig    clang-19
um                                allnoconfig    clang-22
um                               allyesconfig    gcc-14
um                               allyesconfig    gcc-15.2.0
um                                  defconfig    gcc-14
um                             i386_defconfig    gcc-14
um                    randconfig-001-20260122    gcc-8.5.0
um                    randconfig-001-20260123    gcc-13.4.0
um                    randconfig-002-20260122    gcc-8.5.0
um                    randconfig-002-20260123    gcc-13.4.0
um                           x86_64_defconfig    gcc-14
x86_64                           alldefconfig    gcc-15.2.0
x86_64                           allmodconfig    clang-20
x86_64                            allnoconfig    clang-20
x86_64                            allnoconfig    clang-22
x86_64                           allyesconfig    clang-20
x86_64      buildonly-randconfig-001-20260122    clang-20
x86_64      buildonly-randconfig-002-20260122    clang-20
x86_64      buildonly-randconfig-003-20260122    clang-20
x86_64      buildonly-randconfig-004-20260122    clang-20
x86_64      buildonly-randconfig-005-20260122    clang-20
x86_64      buildonly-randconfig-006-20260122    clang-20
x86_64                              defconfig    gcc-14
x86_64                                  kexec    clang-20
x86_64                randconfig-001-20260122    clang-20
x86_64                randconfig-002-20260122    clang-20
x86_64                randconfig-003-20260122    clang-20
x86_64                randconfig-004-20260122    clang-20
x86_64                randconfig-005-20260122    clang-20
x86_64                randconfig-006-20260122    clang-20
x86_64                randconfig-011-20260122    clang-20
x86_64                randconfig-011-20260123    gcc-14
x86_64                randconfig-012-20260122    clang-20
x86_64                randconfig-012-20260123    gcc-14
x86_64                randconfig-013-20260122    clang-20
x86_64                randconfig-013-20260123    gcc-14
x86_64                randconfig-014-20260122    clang-20
x86_64                randconfig-014-20260123    gcc-14
x86_64                randconfig-015-20260122    clang-20
x86_64                randconfig-015-20260123    gcc-14
x86_64                randconfig-016-20260122    clang-20
x86_64                randconfig-016-20260123    gcc-14
x86_64                randconfig-071-20260122    clang-20
x86_64                randconfig-072-20260122    clang-20
x86_64                randconfig-073-20260122    clang-20
x86_64                randconfig-074-20260122    clang-20
x86_64                randconfig-075-20260122    clang-20
x86_64                randconfig-076-20260122    clang-20
x86_64                               rhel-9.4    clang-20
x86_64                           rhel-9.4-bpf    gcc-14
x86_64                          rhel-9.4-func    clang-20
x86_64                    rhel-9.4-kselftests    clang-20
x86_64                         rhel-9.4-kunit    gcc-14
x86_64                           rhel-9.4-ltp    gcc-14
x86_64                          rhel-9.4-rust    clang-20
xtensa                            allnoconfig    clang-22
xtensa                            allnoconfig    gcc-15.2.0
xtensa                           allyesconfig    clang-22
xtensa                  cadence_csp_defconfig    gcc-15.2.0
xtensa                          iss_defconfig    gcc-15.2.0
xtensa                  nommu_kc705_defconfig    gcc-15.2.0
xtensa                randconfig-001-20260122    gcc-8.5.0
xtensa                randconfig-001-20260123    gcc-13.4.0
xtensa                randconfig-002-20260122    gcc-8.5.0
xtensa                randconfig-002-20260123    gcc-13.4.0

--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Dmitry Torokhov @ 2026-01-22 18:38 UTC (permalink / raw)
  To: Geert Uytterhoeven
  Cc: Sebastian Andrzej Siewior, Marek Vasut, linux-input,
	Peter Zijlstra (Intel), Cheng-Yang Chou, Frank Li,
	Geert Uytterhoeven, Jinjie Ruan, Krzysztof Kozlowski,
	Marc Zyngier, Thomas Gleixner, linux-kernel, linux-renesas-soc
In-Reply-To: <CAMuHMdVs_ODx3eByHkU03vopUuLuY7=uRnfTKuai65jNr+xMhA@mail.gmail.com>

On Thu, Jan 22, 2026 at 05:31:42PM +0100, Geert Uytterhoeven wrote:
> Hi Sebastian,
> 
> On Thu, 22 Jan 2026 at 17:22, Sebastian Andrzej Siewior
> <bigeasy@linutronix.de> wrote:
> > On 2026-01-22 00:23:47 [+0100], Marek Vasut wrote:
> > > @@ -242,6 +242,21 @@ extern void irq_wake_thread(unsigned int irq, void *dev_id);
> > >  DEFINE_LOCK_GUARD_1(disable_irq, int,
> > >                   disable_irq(*_T->lock), enable_irq(*_T->lock))
> > >
> > > +static inline void disable_valid_irq(unsigned int irq)
> > > +{
> > > +     if (irq > 0)
> > > +             disable_irq(irq);
> > > +}
> >
> > | $ grep " 0:" /proc/interrupts
> > |    0:         43          0          IO-APIC  2-edge      timer
> >
> > in other words, interrupt 0 is valid.
> 
> AFAIK, the x86 legacy timer interrupt is the sole remaining valid user
> of interrupt number zero.
> Nowadays lots of code assumes valid interrupt numbers are non-zero
> positive numbers.

Quoting an oldie but goodie:

"This has come up before. For example: for an IRQ, 0 means "does not
exist", it does _not_ mean "physical irq 0", and we test for whether a
device has a valid irq by doing "if (dev->irq)" rather than having some
insane architecture-specific "IRQ_NONE". And if you validly really have an
irq at the hardware level that is zero, then that just means that the irq
numbers you should tell the kernel should be translated some way.

(On a PC, hardware irq 0 is a real irq too, but it's a _special_ irq, and
it is set up by architecture-specific code. So as far as the generic
kernel and all devices are concerned, "!dev->irq" means that the irq
doesn't exist or hasn't been mapped for that device yet)."

https://lore.kernel.org/all/Pine.LNX.4.64.0701250940220.25027@woody.linux-foundation.org/

Thanks.

-- 
Dmitry

^ permalink raw reply

* [PATCH v1 1/1] dt-bindings: input: touchscreen: tsc2007: document '#io-channel-cells'
From: Svyatoslav Ryhel @ 2026-01-22 19:35 UTC (permalink / raw)
  To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Svyatoslav Ryhel, Frank Li, Fabio Estevam, Andreas Kemnade
  Cc: linux-input, devicetree, linux-kernel
In-Reply-To: <20260122193549.29858-1-clamor95@gmail.com>

The tsc2007 can be used not only as resistive touchscreen controller but
also as a ADC IIO sensor. The second use case requires '#io-channel-cells'
property, hence add it.

Signed-off-by: Svyatoslav Ryhel <clamor95@gmail.com>
---
 .../devicetree/bindings/input/touchscreen/ti,tsc2007.yaml      | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/Documentation/devicetree/bindings/input/touchscreen/ti,tsc2007.yaml b/Documentation/devicetree/bindings/input/touchscreen/ti,tsc2007.yaml
index a595df3ea802..d9cb53e86512 100644
--- a/Documentation/devicetree/bindings/input/touchscreen/ti,tsc2007.yaml
+++ b/Documentation/devicetree/bindings/input/touchscreen/ti,tsc2007.yaml
@@ -53,6 +53,9 @@ properties:
       how much time to wait (in milliseconds) before reading again the
       values from the tsc2007.
 
+  "#io-channel-cells":
+    const: 1
+
 required:
   - compatible
   - reg
-- 
2.51.0


^ permalink raw reply related

* [PATCH v1 0/1] dt-bindings: input: touchscreen: tsc2007: document '#io-channel-cells'
From: Svyatoslav Ryhel @ 2026-01-22 19:35 UTC (permalink / raw)
  To: Dmitry Torokhov, Rob Herring, Krzysztof Kozlowski, Conor Dooley,
	Svyatoslav Ryhel, Frank Li, Fabio Estevam, Andreas Kemnade
  Cc: linux-input, devicetree, linux-kernel

The tsc2007 can be used not only as resistive touchscreen controller but
also as a ADC IIO sensor. The second use case requires '#io-channel-cells'
property, hence add it.

Svyatoslav Ryhel (1):
  dt-bindings: input: touchscreen: tsc2007: document '#io-channel-cells'

 .../devicetree/bindings/input/touchscreen/ti,tsc2007.yaml      | 3 +++
 1 file changed, 3 insertions(+)

-- 
2.51.0


^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Marek Vasut @ 2026-01-22 19:11 UTC (permalink / raw)
  To: Frank Li, Marek Vasut
  Cc: linux-input, Peter Zijlstra (Intel), Cheng-Yang Chou,
	Dmitry Torokhov, Geert Uytterhoeven, Jinjie Ruan,
	Krzysztof Kozlowski, Marc Zyngier, Sebastian Andrzej Siewior,
	Thomas Gleixner, linux-kernel, linux-renesas-soc
In-Reply-To: <aXJEaTPIhDGFb11C@lizhi-Precision-Tower-5810>

On 1/22/26 4:38 PM, Frank Li wrote:
> On Thu, Jan 22, 2026 at 12:23:47AM +0100, Marek Vasut wrote:
>> Introduce disable_valid_irq scoped guard. This is an extension
>> of disable_irq scoped guard, which disables and enables IRQs
>> around a scope. The disable_valid_irq scoped guard does almost
>> the same, except it handles the case where IRQ is not valid,
>> in which case it does not do anything. This is meant to be used
>> by for example touch controller drivers, which can do both IRQ
>> driven and polling mode of operation, and this makes their code
>> slighly simpler.
> 
> I think it'd better to give simple example here.
Patch 2/2 is that example , but I can also include it in the commit 
message if this 1/2 is even acceptable.

^ permalink raw reply

* Re: [PATCH 1/1] Adding support for aXiom touchscreen controller
From: kernel test robot @ 2026-01-22 19:03 UTC (permalink / raw)
  To: AThomas63, dmitry.torokhov
  Cc: oe-kbuild-all, linux-input, linux-kernel, mark.satterthwaite,
	andrew.thomas, m.felsch, kamel.bouhara
In-Reply-To: <20260122124819.273188-2-andrew.thomas@touchnetix.com>

Hi AThomas63,

kernel test robot noticed the following build errors:

[auto build test ERROR on dtor-input/next]
[also build test ERROR on dtor-input/for-linus hid/for-next linus/master v6.19-rc6 next-20260122]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/AThomas63/Adding-support-for-aXiom-touchscreen-controller/20260122-212452
base:   https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
patch link:    https://lore.kernel.org/r/20260122124819.273188-2-andrew.thomas%40touchnetix.com
patch subject: [PATCH 1/1] Adding support for aXiom touchscreen controller
config: sh-randconfig-r072-20260123 (https://download.01.org/0day-ci/archive/20260123/202601230252.ZlyhNYe2-lkp@intel.com/config)
compiler: sh4-linux-gcc (GCC) 14.3.0
smatch version: v0.5.0-8994-gd50c5a4c
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20260123/202601230252.ZlyhNYe2-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202601230252.ZlyhNYe2-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/input/touchscreen/axiom_core.c: In function 'axiom_unpack_device_info':
>> drivers/input/touchscreen/axiom_core.c:110:27: error: implicit declaration of function 'FIELD_GET' [-Wimplicit-function-declaration]
     110 |         info->device_id = FIELD_GET(AX_DEV_ID_MASK, w);
         |                           ^~~~~~~~~


vim +/FIELD_GET +110 drivers/input/touchscreen/axiom_core.c

   103	
   104	static void axiom_unpack_device_info(const u8 *buf,
   105					     struct axiom_device_info *info)
   106	{
   107		u16 w;
   108	
   109		w = get_unaligned_le16(buf);
 > 110		info->device_id = FIELD_GET(AX_DEV_ID_MASK, w);
   111		info->mode = !!(w & AX_MODE);
   112	
   113		w = get_unaligned_le16(buf + 2);
   114		info->runtime_fw_rev_minor = FIELD_GET(AX_FW_REV_MINOR_MASK, w);
   115		info->runtime_fw_rev_major = FIELD_GET(AX_FW_REV_MAJOR_MASK, w);
   116	
   117		w = get_unaligned_le16(buf + 4);
   118		info->device_build_variant = FIELD_GET(AX_VARIANT_MASK, w);
   119		info->runtime_fw_status = !!(w & AX_FW_STATUS);
   120		info->tcp_revision = FIELD_GET(AX_TCP_REV_MASK, w);
   121	
   122		w = get_unaligned_le16(buf + 6);
   123		info->bootloader_fw_rev_minor = FIELD_GET(AX_BOOT_REV_MINOR_MASK, w);
   124		info->bootloader_fw_rev_major = FIELD_GET(AX_BOOT_REV_MAJOR_MASK, w);
   125	
   126		info->jedec_id = get_unaligned_le16(buf + 8);
   127	
   128		w = get_unaligned_le16(buf + 10);
   129		info->num_usages = FIELD_GET(AX_NUM_USAGES_MASK, w);
   130		info->silicon_revision = FIELD_GET(AX_SILICON_REV_MASK, w);
   131		info->runtime_fw_rev_patch = FIELD_GET(AX_RUNTIME_FW_PATCH_MASK, w);
   132	}
   133	

-- 
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki

^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Sergey Shtylyov @ 2026-01-22 18:57 UTC (permalink / raw)
  To: Geert Uytterhoeven, Sebastian Andrzej Siewior
  Cc: Marek Vasut, linux-input, Peter Zijlstra (Intel), Cheng-Yang Chou,
	Dmitry Torokhov, Frank Li, Geert Uytterhoeven, Jinjie Ruan,
	Krzysztof Kozlowski, Marc Zyngier, Thomas Gleixner, linux-kernel,
	linux-renesas-soc
In-Reply-To: <CAMuHMdVs_ODx3eByHkU03vopUuLuY7=uRnfTKuai65jNr+xMhA@mail.gmail.com>

On 1/22/26 7:31 PM, Geert Uytterhoeven wrote:
[...]

>>> @@ -242,6 +242,21 @@ extern void irq_wake_thread(unsigned int irq, void *dev_id);
>>>  DEFINE_LOCK_GUARD_1(disable_irq, int,
>>>                   disable_irq(*_T->lock), enable_irq(*_T->lock))
>>>
>>> +static inline void disable_valid_irq(unsigned int irq)
>>> +{
>>> +     if (irq > 0)
>>> +             disable_irq(irq);
>>> +}
>>
>> | $ grep " 0:" /proc/interrupts
>> |    0:         43          0          IO-APIC  2-edge      timer
>>
>> in other words, interrupt 0 is valid.
> 
> AFAIK, the x86 legacy timer interrupt is the sole remaining valid user
> of interrupt number zero.
> Nowadays lots of code assumes valid interrupt numbers are non-zero
> positive numbers.

   Makes me remember this commit:

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ce753ad1549cbe9ccaea4c06a1f5fa47432c8289

> Gr{oetje,eeting}s,
> 
>                         Geert
MBR, Sergey


^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Geert Uytterhoeven @ 2026-01-22 16:31 UTC (permalink / raw)
  To: Sebastian Andrzej Siewior
  Cc: Marek Vasut, linux-input, Peter Zijlstra (Intel), Cheng-Yang Chou,
	Dmitry Torokhov, Frank Li, Geert Uytterhoeven, Jinjie Ruan,
	Krzysztof Kozlowski, Marc Zyngier, Thomas Gleixner, linux-kernel,
	linux-renesas-soc
In-Reply-To: <20260122162206.9wrHkrTZ@linutronix.de>

Hi Sebastian,

On Thu, 22 Jan 2026 at 17:22, Sebastian Andrzej Siewior
<bigeasy@linutronix.de> wrote:
> On 2026-01-22 00:23:47 [+0100], Marek Vasut wrote:
> > @@ -242,6 +242,21 @@ extern void irq_wake_thread(unsigned int irq, void *dev_id);
> >  DEFINE_LOCK_GUARD_1(disable_irq, int,
> >                   disable_irq(*_T->lock), enable_irq(*_T->lock))
> >
> > +static inline void disable_valid_irq(unsigned int irq)
> > +{
> > +     if (irq > 0)
> > +             disable_irq(irq);
> > +}
>
> | $ grep " 0:" /proc/interrupts
> |    0:         43          0          IO-APIC  2-edge      timer
>
> in other words, interrupt 0 is valid.

AFAIK, the x86 legacy timer interrupt is the sole remaining valid user
of interrupt number zero.
Nowadays lots of code assumes valid interrupt numbers are non-zero
positive numbers.

Gr{oetje,eeting}s,

                        Geert

-- 
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
                                -- Linus Torvalds

^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Sebastian Andrzej Siewior @ 2026-01-22 16:22 UTC (permalink / raw)
  To: Marek Vasut
  Cc: linux-input, Peter Zijlstra (Intel), Cheng-Yang Chou,
	Dmitry Torokhov, Frank Li, Geert Uytterhoeven, Jinjie Ruan,
	Krzysztof Kozlowski, Marc Zyngier, Thomas Gleixner, linux-kernel,
	linux-renesas-soc
In-Reply-To: <20260121232522.154771-1-marek.vasut+renesas@mailbox.org>

On 2026-01-22 00:23:47 [+0100], Marek Vasut wrote:
> @@ -242,6 +242,21 @@ extern void irq_wake_thread(unsigned int irq, void *dev_id);
>  DEFINE_LOCK_GUARD_1(disable_irq, int,
>  		    disable_irq(*_T->lock), enable_irq(*_T->lock))
>  
> +static inline void disable_valid_irq(unsigned int irq)
> +{
> +	if (irq > 0)
> +		disable_irq(irq);
> +}

| $ grep " 0:" /proc/interrupts
|    0:         43          0          IO-APIC  2-edge      timer

in other words, interrupt 0 is valid.

Sebastian

^ permalink raw reply

* [PATCH v2 4/4] ALSA: hda/conexant: Add headset mic fix for MECHREVO Wujie 15X Pro
From: gongqi @ 2026-01-22 15:55 UTC (permalink / raw)
  To: rafael, dmitry.torokhov, Shyam-sundar.S-k, hansg, ilpo.jarvinen,
	perex, tiwai
  Cc: linux-acpi, linux-input, platform-driver-x86, linux-sound,
	linux-kernel, 550230171hxy
In-Reply-To: <20260122155501.376199-1-550230171hxy@gmail.com>

The headset microphone on the MECHREVO Wujie 15X Pro requires the
CXT_FIXUP_HEADSET_MIC quirk to function properly. Add the PCI SSID
(0x1d05:0x3012) to the quirk table.

Signed-off-by: gongqi <550230171hxy@gmail.com>
---
 sound/hda/codecs/conexant.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/sound/hda/codecs/conexant.c b/sound/hda/codecs/conexant.c
index 5fcbc1312c697..2384e64eada36 100644
--- a/sound/hda/codecs/conexant.c
+++ b/sound/hda/codecs/conexant.c
@@ -1123,6 +1123,7 @@ static const struct hda_quirk cxt5066_fixups[] = {
 	SND_PCI_QUIRK_VENDOR(0x17aa, "Thinkpad/Ideapad", CXT_FIXUP_LENOVO_XPAD_ACPI),
 	SND_PCI_QUIRK(0x1c06, 0x2011, "Lemote A1004", CXT_PINCFG_LEMOTE_A1004),
 	SND_PCI_QUIRK(0x1c06, 0x2012, "Lemote A1205", CXT_PINCFG_LEMOTE_A1205),
+	SND_PCI_QUIRK(0x1d05, 0x3012, "MECHREVO Wujie 15X Pro", CXT_FIXUP_HEADSET_MIC),
 	HDA_CODEC_QUIRK(0x2782, 0x12c3, "Sirius Gen1", CXT_PINCFG_TOP_SPEAKER),
 	HDA_CODEC_QUIRK(0x2782, 0x12c5, "Sirius Gen2", CXT_PINCFG_TOP_SPEAKER),
 	{}
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 3/4] platform/x86/amd/pmc: Add quirk for MECHREVO Wujie 15X Pro
From: gongqi @ 2026-01-22 15:55 UTC (permalink / raw)
  To: rafael, dmitry.torokhov, Shyam-sundar.S-k, hansg, ilpo.jarvinen,
	perex, tiwai
  Cc: linux-acpi, linux-input, platform-driver-x86, linux-sound,
	linux-kernel, 550230171hxy
In-Reply-To: <20260122155501.376199-1-550230171hxy@gmail.com>

The MECHREVO Wujie 15X Pro suffers from spurious IRQ issues related to
the AMD PMC. Add it to the quirk list to use the spurious_8042 fix.

Signed-off-by: gongqi <550230171hxy@gmail.com>
---
 drivers/platform/x86/amd/pmc/pmc-quirks.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/platform/x86/amd/pmc/pmc-quirks.c b/drivers/platform/x86/amd/pmc/pmc-quirks.c
index 404e62ad293a9..ed285afaf9b0d 100644
--- a/drivers/platform/x86/amd/pmc/pmc-quirks.c
+++ b/drivers/platform/x86/amd/pmc/pmc-quirks.c
@@ -302,6 +302,13 @@ static const struct dmi_system_id fwbug_list[] = {
 			DMI_MATCH(DMI_BOARD_NAME, "XxKK4NAx_XxSP4NAx"),
 		}
 	},
+	{
+		.ident = "MECHREVO Wujie 15X Pro",
+		.driver_data = &quirk_spurious_8042,
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "WUJIE Series-X5SP4NAG"),
+		}
+	},
 	{}
 };
 
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 2/4] Input: i8042: Add quirks for MECHREVO Wujie 15X Pro
From: gongqi @ 2026-01-22 15:54 UTC (permalink / raw)
  To: rafael, dmitry.torokhov, Shyam-sundar.S-k, hansg, ilpo.jarvinen,
	perex, tiwai
  Cc: linux-acpi, linux-input, platform-driver-x86, linux-sound,
	linux-kernel, 550230171hxy
In-Reply-To: <20260122155501.376199-1-550230171hxy@gmail.com>

The MECHREVO Wujie 15X Pro requires several i8042 quirks to function
correctly. Specifically, NOMUX, RESET_ALWAYS, NOLOOP, and NOPNP are
needed to ensure the keyboard and touchpad work reliably.

Signed-off-by: gongqi <550230171hxy@gmail.com>
---
 drivers/input/serio/i8042-acpipnpio.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/input/serio/i8042-acpipnpio.h b/drivers/input/serio/i8042-acpipnpio.h
index 654771275ce87..4cd09560c5bfb 100644
--- a/drivers/input/serio/i8042-acpipnpio.h
+++ b/drivers/input/serio/i8042-acpipnpio.h
@@ -1176,6 +1176,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
 	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "WUJIE Series-X5SP4NAG"),
+		},
+		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
+					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
+	},
 	/*
 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
 	 * after suspend fixable with the forcenorestore quirk.
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 1/4] ACPI: resource: Add IRQ override quirk for MECHREVO Wujie 15X Pro
From: gongqi @ 2026-01-22 15:54 UTC (permalink / raw)
  To: rafael, dmitry.torokhov, Shyam-sundar.S-k, hansg, ilpo.jarvinen,
	perex, tiwai
  Cc: linux-acpi, linux-input, platform-driver-x86, linux-sound,
	linux-kernel, 550230171hxy
In-Reply-To: <20260122155501.376199-1-550230171hxy@gmail.com>

On the MECHREVO Wujie 15X Pro (Board Name: WUJIE Series-X5SP4NAG), the
keyboard does not function properly without an IRQ override. Add a DMI
entry to force IRQ1 to edge_low.

Signed-off-by: gongqi <550230171hxy@gmail.com>
---
 drivers/acpi/resource.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/acpi/resource.c b/drivers/acpi/resource.c
index d16906f46484d..2ec5472aa0763 100644
--- a/drivers/acpi/resource.c
+++ b/drivers/acpi/resource.c
@@ -674,6 +674,12 @@ static const struct dmi_system_id irq1_edge_low_force_override[] = {
 			DMI_MATCH(DMI_BOARD_NAME, "GMxHGxx"),
 		},
 	},
+	{
+		/* MECHREVO Wujie 15X Pro */
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "WUJIE Series-X5SP4NAG"),
+		},
+	},
 	{
 		/* MACHENIKE L16P/L16P */
 		.matches = {
-- 
2.43.0


^ permalink raw reply related

* [PATCH v2 0/4] Add quirks for MECHREVO Wujie 15X Pro laptop
From: gongqi @ 2026-01-22 15:54 UTC (permalink / raw)
  To: rafael, dmitry.torokhov, Shyam-sundar.S-k, hansg, ilpo.jarvinen,
	perex, tiwai
  Cc: linux-acpi, linux-input, platform-driver-x86, linux-sound,
	linux-kernel, 550230171hxy

This series adds several quirks for the MECHREVO Wujie 15X Pro
(AMD Ryzen AI 9 H 365) laptop to fix issues with the keyboard,
touchpad, power management, and headset microphone.

The laptop requires:
- ACPI IRQ override for the keyboard.
- i8042 quirks for keyboard/touchpad stability.
- AMD PMC quirk to fix spurious IRQs during suspend.
- Conexant codec quirk for the headset microphone.

Changes in v2:
- Added Missing Signed-off-by to all patches.
- Wrapped commit messages at 72 columns.
- Unified author and committer email to 550230171hxy@gmail.com.
- Properly formatted cover letter to improve threading.

gongqi (4):
  ACPI: resource: Add IRQ override quirk for MECHREVO Wujie 15X Pro
  Input: i8042: Add quirks for MECHREVO Wujie 15X Pro
  platform/x86/amd/pmc: Add quirk for MECHREVO Wujie 15X Pro
  ALSA: hda/conexant: Add headset mic fix for MECHREVO Wujie 15X Pro

 drivers/acpi/resource.c                   | 6 ++++++
 drivers/input/serio/i8042-acpipnpio.h     | 7 +++++++
 drivers/platform/x86/amd/pmc/pmc-quirks.c | 7 +++++++
 sound/pci/hda/patch_conexant.c            | 1 +
 4 files changed, 21 insertions(+)

-- 
2.43.0

^ permalink raw reply

* Re: [PATCH 1/2] linux/interrupt.h: allow "guard" notation to disable and reenable IRQ with valid IRQ check
From: Frank Li @ 2026-01-22 15:38 UTC (permalink / raw)
  To: Marek Vasut
  Cc: linux-input, Peter Zijlstra (Intel), Cheng-Yang Chou,
	Dmitry Torokhov, Geert Uytterhoeven, Jinjie Ruan,
	Krzysztof Kozlowski, Marc Zyngier, Sebastian Andrzej Siewior,
	Thomas Gleixner, linux-kernel, linux-renesas-soc
In-Reply-To: <20260121232522.154771-1-marek.vasut+renesas@mailbox.org>

On Thu, Jan 22, 2026 at 12:23:47AM +0100, Marek Vasut wrote:
> Introduce disable_valid_irq scoped guard. This is an extension
> of disable_irq scoped guard, which disables and enables IRQs
> around a scope. The disable_valid_irq scoped guard does almost
> the same, except it handles the case where IRQ is not valid,
> in which case it does not do anything. This is meant to be used
> by for example touch controller drivers, which can do both IRQ
> driven and polling mode of operation, and this makes their code
> slighly simpler.

I think it'd better to give simple example here.

Frank
>
> Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
> ---
> Cc: "Peter Zijlstra (Intel)" <peterz@infradead.org>
> Cc: Cheng-Yang Chou <yphbchou0911@gmail.com>
> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
> Cc: Frank Li <Frank.Li@nxp.com>
> Cc: Geert Uytterhoeven <geert+renesas@glider.be>
> Cc: Jinjie Ruan <ruanjinjie@huawei.com>
> Cc: Krzysztof Kozlowski <krzysztof.kozlowski@oss.qualcomm.com>
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
> Cc: Thomas Gleixner <tglx@kernel.org>
> Cc: linux-input@vger.kernel.org
> Cc: linux-kernel@vger.kernel.org
> Cc: linux-renesas-soc@vger.kernel.org
> ---
>  include/linux/interrupt.h | 15 +++++++++++++++
>  1 file changed, 15 insertions(+)
>
> diff --git a/include/linux/interrupt.h b/include/linux/interrupt.h
> index 00c01b0a43be1..becbeab4a7473 100644
> --- a/include/linux/interrupt.h
> +++ b/include/linux/interrupt.h
> @@ -242,6 +242,21 @@ extern void irq_wake_thread(unsigned int irq, void *dev_id);
>  DEFINE_LOCK_GUARD_1(disable_irq, int,
>  		    disable_irq(*_T->lock), enable_irq(*_T->lock))
>
> +static inline void disable_valid_irq(unsigned int irq)
> +{
> +	if (irq > 0)
> +		disable_irq(irq);
> +}
> +
> +static inline void enable_valid_irq(unsigned int irq)
> +{
> +	if (irq > 0)
> +		enable_irq(irq);
> +}
> +
> +DEFINE_LOCK_GUARD_1(disable_valid_irq, int,
> +		    disable_valid_irq(*_T->lock), enable_valid_irq(*_T->lock))
> +
>  extern void disable_nmi_nosync(unsigned int irq);
>  extern void disable_percpu_nmi(unsigned int irq);
>  extern void enable_nmi(unsigned int irq);
> --
> 2.51.0
>

^ permalink raw reply

* Re: [PATCH 2/4] Input: i8042: Add quirks for MECHREVO Wujie 15X Pro
From: Dmitry Torokhov @ 2026-01-22 15:33 UTC (permalink / raw)
  To: gongqi; +Cc: linux-input, linux-kernel, gongqi
In-Reply-To: <20260122120640.3471876-1-550230171hxy@gmail.com>

Hi,

On Thu, Jan 22, 2026 at 08:06:40PM +0800, gongqi wrote:
> From: gongqi <550230171@qq.com>
> 
> The MECHREVO Wujie 15X Pro requires several i8042 quirks to function correctly. Specifically, NOMUX, RESET_ALWAYS, NOLOOP, and NOPNP are needed to ensure the keyboard and touchpad work reliably.

Please wrap commit messages at ~70-75 column. I will also need your
"Signed-off-by: " to be able to apply the patch.

By the way, where are the patches 1, 3, and 4?

> ---
>  drivers/input/serio/i8042-acpipnpio.h | 7 +++++++
>  1 file changed, 7 insertions(+)
> 
> diff --git a/drivers/input/serio/i8042-acpipnpio.h b/drivers/input/serio/i8042-acpipnpio.h
> index 654771275ce87..4cd09560c5bfb 100644
> --- a/drivers/input/serio/i8042-acpipnpio.h
> +++ b/drivers/input/serio/i8042-acpipnpio.h
> @@ -1176,6 +1176,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
>  		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
>  					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
>  	},
> +	{
> +		.matches = {
> +			DMI_MATCH(DMI_BOARD_NAME, "WUJIE Series-X5SP4NAG"),
> +		},
> +		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
> +					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
> +	},
>  	/*
>  	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
>  	 * after suspend fixable with the forcenorestore quirk.

Thanks.

-- 
Dmitry

^ permalink raw reply

* Re: [PATCH v1] Input: pf1550 - Remove "defined but unused" warning
From: Dmitry Torokhov @ 2026-01-22 15:25 UTC (permalink / raw)
  To: Samuel Kayode; +Cc: Vaibhav Gupta, imx, linux-input, linux-kernel
In-Reply-To: <aXIhp_c0zjS9dfWQ@sam-fedora>

On Thu, Jan 22, 2026 at 08:09:59AM -0500, Samuel Kayode wrote:
> On Sat, Dec 13, 2025 at 01:38:57AM -0800, Dmitry Torokhov wrote:
> > On Wed, Dec 10, 2025 at 09:11:41PM +0000, Vaibhav Gupta wrote:
> > > If 'CONFIG_PM_SLEEP' is not set, compiler throws warning for *suspend() and
> > > *resume() function for this driver. Using new 'DEFINE_SIMPLE_DEV_PM_OPS'
> > > fixes it.
> > > 
> > > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> > 
> > Applied, thank you.
> > 
> I think this patch was dropped.

I see it in my 'next' branch so it should be in linux-next.

Thanks.

-- 
Dmitry

^ permalink raw reply

* [PATCH v1] dt-bindings: input: Add TouchNetix aXiom touchscreen driver
From: AThomas63 @ 2026-01-22 14:40 UTC (permalink / raw)
  To: dmitry.torokhov
  Cc: linux-input, linux-kernel, mark.satterthwaite, andrew.thomas,
	m.felsch, kamel.bouhara
In-Reply-To: <20260122124819.273188-1-andrew.thomas@touchnetix.com>

Add extra changes referenced in the previous patch:
 - Add device tree documentation for axiom giving examples for SPI and I2C.
 - Add tnx vendor prefix.

---
 .../bindings/input/touchscreen/tnx,axiom.yaml | 90 +++++++++++++++++++
 .../devicetree/bindings/vendor-prefixes.yaml  |  2 +
 2 files changed, 92 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml

diff --git a/Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml b/Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml
new file mode 100644
index 000000000000..dc2ea62999b8
--- /dev/null
+++ b/Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml
@@ -0,0 +1,90 @@
+# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
+%YAML 1.2
+---
+$id: http://devicetree.org/schemas/input/touchscreen/tnx,axiom.yaml#
+$schema: http://devicetree.org/meta-schemas/core.yaml#
+
+title: TouchNetix aXiom Touchscreen Controller
+
+maintainers:
+  - Andrew Thomas <andrew.thomas@touchnetix.com>
+
+description: |
+  The TouchNetix aXiom series are high-performance touchscreen controllers
+  supporting various interface methods including I2C and SPI.
+
+properties:
+  compatible:
+    enum:
+      - tnx,axiom-i2c
+      - tnx,axiom-spi
+
+  reg:
+    maxItems: 1
+
+  interrupts:
+    maxItems: 1
+
+  axiom,poll-enable:
+    type: boolean
+    description: Enable aXiom polling mode instead of interrupt-driven 
+      reporting.
+
+  axiom,poll-period:
+    $ref: /schemas/types.yaml#/definitions/uint32
+    default: 10
+    description: Set the polling period in milliseconds.
+
+  # Required for SPI
+  spi-max-frequency: true
+
+  # Common touchscreen properties
+  touchscreen-size-x: true
+  touchscreen-size-y: true
+  touchscreen-inverted-x: true
+  touchscreen-inverted-y: true
+  touchscreen-swapped-x-y: true
+
+required:
+  - compatible
+  - reg
+  - interrupts
+
+allOf:
+  - $ref: touchscreen.yaml#
+
+unevaluatedProperties: false
+
+examples:
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+
+    i2c {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        touchscreen@66 {
+            compatible = "touchnetix,axiom-i2c";
+            reg = <0x66>;
+            interrupt-parent = <&gpio>;
+            interrupts = <24 IRQ_TYPE_LEVEL_LOW>;
+            axiom,poll-enable;
+            axiom,poll-period = <15>;
+        };
+    };
+
+  - |
+    #include <dt-bindings/interrupt-controller/irq.h>
+
+    spi {
+        #address-cells = <1>;
+        #size-cells = <0>;
+
+        touchscreen@0 {
+            compatible = "touchnetix,axiom-spi";
+            reg = <0>;
+            spi-max-frequency = <4000000>;
+            interrupt-parent = <&gpio>;
+            interrupts = <24 IRQ_TYPE_LEVEL_LOW>;
+        };
+    };
diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml
index f1d1882009ba..dadfc7036ed7 100644
--- a/Documentation/devicetree/bindings/vendor-prefixes.yaml
+++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml
@@ -1636,6 +1636,8 @@ patternProperties:
     description: Trusted Logic Mobility
   "^tmt,.*":
     description: Tecon Microprocessor Technologies, LLC.
+  "^tnx,.*":
+    description: TouchNetix
   "^topeet,.*":
     description: Topeet
   "^topic,.*":
-- 
2.43.0


^ permalink raw reply related

* Re: [PATCH v4 3/3] arm64: dts: qcom: sm6125-xiaomi-laurel-sprout: Add Focaltech FT3518 touchscreen
From: Konrad Dybcio @ 2026-01-22 13:52 UTC (permalink / raw)
  To: yedaya.ka, Kamil Gołda, Rob Herring, Krzysztof Kozlowski,
	Conor Dooley, Bjorn Andersson, Konrad Dybcio
  Cc: linux-input, devicetree, linux-kernel, linux-arm-msm
In-Reply-To: <20260120-touchscreen-patches-v4-3-30145da9d6d3@gmail.com>

On 1/20/26 10:40 PM, Yedaya Katsman via B4 Relay wrote:
> From: Yedaya Katsman <yedaya.ka@gmail.com>
> 
> Add device tree node for the Focaltech FT3518 touchscreen on
> Xiaomi Mi A3 (laurel-sprout).
> 
> Note that gpio pin 83 for the regulator isn't documented downstream
> except in the touchscreen node so it's not defined in the tlmm.
> 
> Enable qupv3_id_0 and i2c2 bus that the touchscreen is on.
> 
> Downstream references:
> Link: https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/laurel-r-oss/arch/arm64/boot/dts/qcom/trinket-pinctrl.dtsi
> Link: https://github.com/MiCode/Xiaomi_Kernel_OpenSource/blob/laurel-r-oss/arch/arm64/boot/dts/qcom/laurel_sprout-qrd.dtsi
> 
> Co-developed-by: Kamil Gołda <kamil.golda@protonmail.com>
> Signed-off-by: Kamil Gołda <kamil.golda@protonmail.com>
> Signed-off-by: Yedaya Katsman <yedaya.ka@gmail.com>
> ---
>  .../boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts  | 65 ++++++++++++++++++++++
>  1 file changed, 65 insertions(+)
> 
> diff --git a/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts b/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts
> index 994fb0412fcbdf5466f87a325c48b697a37b514b..ea9dbc6927a14ca66da818b81aeb0c95ec3c2e7a 100644
> --- a/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts
> +++ b/arch/arm64/boot/dts/qcom/sm6125-xiaomi-laurel-sprout.dts
> @@ -82,6 +82,18 @@ key-volume-up {
>  		};
>  	};
>  
> +	ts_vdd_supply: regulator-ts-vdd {
> +		compatible = "regulator-fixed";
> +		regulator-name = "ts_vdd_supply";
> +		regulator-min-microvolt = <3300000>;
> +		regulator-max-microvolt = <3300000>;
> +
> +		gpio = <&tlmm 83 GPIO_ACTIVE_HIGH>;
> +		enable-active-high;

Ideally you'd add a pin config for gpio83 too

[...]

> +	touchscreen@38 {
> +		compatible = "focaltech,ft3518";
> +		reg = <0x38>;
> +		interrupts-extended = <&tlmm 88 IRQ_TYPE_EDGE_FALLING>;
> +
> +		vcc-supply = <&ts_vdd_supply>;
> +
> +		pinctrl-names = "default","sleep";
> +		pinctrl-0 = <&ts_int_active &ts_reset_active>;
> +		pinctrl-1 = <&ts_int_suspend &ts_reset_suspend>;

property-n
property-names

in this order specifically, please

lgtm otherwise

Konrad

^ permalink raw reply

* Re: [PATCH v1] Input: pf1550 - Remove "defined but unused" warning
From: Samuel Kayode @ 2026-01-22 13:09 UTC (permalink / raw)
  To: Dmitry Torokhov; +Cc: Vaibhav Gupta, imx, linux-input, linux-kernel
In-Reply-To: <wfdhjzhkggp26mwqgvxuanuzjq6v2g4pmc44jz6kx4xwkewwhr@movikefnuvcz>

On Sat, Dec 13, 2025 at 01:38:57AM -0800, Dmitry Torokhov wrote:
> On Wed, Dec 10, 2025 at 09:11:41PM +0000, Vaibhav Gupta wrote:
> > If 'CONFIG_PM_SLEEP' is not set, compiler throws warning for *suspend() and
> > *resume() function for this driver. Using new 'DEFINE_SIMPLE_DEV_PM_OPS'
> > fixes it.
> > 
> > Signed-off-by: Vaibhav Gupta <vaibhavgupta40@gmail.com>
> 
> Applied, thank you.
> 
I think this patch was dropped.

Thanks,
Sam

^ permalink raw reply

* [PATCH 0/1] Input: Add TouchNetix aXiom touchscreen driver
From: AThomas63 @ 2026-01-22 12:48 UTC (permalink / raw)
  To: dmitry.torokhov
  Cc: linux-input, linux-kernel, mark.satterthwaite, andrew.thomas,
	m.felsch, kamel.bouhara

A Summary of the added features:
 - Add input driver support for TouchNetix aXiom touchscreen controller 
using either I2C or SPI.
 - Support ABS_MT touch reports in axiom_process_u41_report().
 - Support both polling and interrupt mode (trigger low).
 - Add basic documentation and provide example device tree bindings.
 - Provide the basic structure to add firmware and config download in
the future via both I2C and SPI.

I understand the process is already under way to add a driver to support 
aXiom by Marco at Pengutronix.
I think it would be most useful for us to attempt to combine this patch
in order to support both his changes for config/firmware download and 
the patch here for SPI support along with I2C. I would be happy to help 
with this process.
This would allow TouchNetix to support a broader range of users of the
aXiom device family.

I also have a device tree binding however I have not added it sincec
from my understanding this should go in a different patch:
Documentation/devicetree/bindings/input/touchscreen/tnx,axiom.yaml
 
My apologies if there are any obvious mistakes in this patch, this is the
first patch that I have submitted.

Many thanks for your time,
Andrew Thomas

AThomas63 (1):
  Adding support for aXiom touchscreen controller

 drivers/input/touchscreen/Kconfig      |  30 ++
 drivers/input/touchscreen/Makefile     |   3 +
 drivers/input/touchscreen/axiom_core.c | 482 +++++++++++++++++++++++++
 drivers/input/touchscreen/axiom_core.h | 128 +++++++
 drivers/input/touchscreen/axiom_i2c.c  | 152 ++++++++
 drivers/input/touchscreen/axiom_spi.c  | 159 ++++++++
 6 files changed, 954 insertions(+)
 create mode 100644 drivers/input/touchscreen/axiom_core.c
 create mode 100644 drivers/input/touchscreen/axiom_core.h
 create mode 100644 drivers/input/touchscreen/axiom_i2c.c
 create mode 100644 drivers/input/touchscreen/axiom_spi.c

-- 
2.43.0


^ permalink raw reply

* [PATCH 1/1] Adding support for aXiom touchscreen controller
From: AThomas63 @ 2026-01-22 12:48 UTC (permalink / raw)
  To: dmitry.torokhov
  Cc: linux-input, linux-kernel, mark.satterthwaite, andrew.thomas,
	m.felsch, kamel.bouhara
In-Reply-To: <20260122124819.273188-1-andrew.thomas@touchnetix.com>

Signed-off-by: AThomas63 <andrew.thomas@touchnetix.com>
---
 drivers/input/touchscreen/Kconfig      |  30 ++
 drivers/input/touchscreen/Makefile     |   3 +
 drivers/input/touchscreen/axiom_core.c | 482 +++++++++++++++++++++++++
 drivers/input/touchscreen/axiom_core.h | 128 +++++++
 drivers/input/touchscreen/axiom_i2c.c  | 152 ++++++++
 drivers/input/touchscreen/axiom_spi.c  | 159 ++++++++
 6 files changed, 954 insertions(+)
 create mode 100644 drivers/input/touchscreen/axiom_core.c
 create mode 100644 drivers/input/touchscreen/axiom_core.h
 create mode 100644 drivers/input/touchscreen/axiom_i2c.c
 create mode 100644 drivers/input/touchscreen/axiom_spi.c

diff --git a/drivers/input/touchscreen/Kconfig b/drivers/input/touchscreen/Kconfig
index 7d5b72ee07fa..f2b4fb317bdd 100644
--- a/drivers/input/touchscreen/Kconfig
+++ b/drivers/input/touchscreen/Kconfig
@@ -162,6 +162,36 @@ config TOUCHSCREEN_AUO_PIXCIR
 	  To compile this driver as a module, choose M here: the
 	  module will be called auo-pixcir-ts.
 
+config TOUCHSCREEN_AXIOM_CORE
+	tristate "TouchNetix Axiom touchscreen"
+	help
+	  Say Y here if you have an Axiom touchscreen connected
+	  to your system. You will also need to select appropriate
+	  bus connection below.
+
+	  If unsure, say N.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called axiom_core.
+
+config TOUCHSCREEN_AXIOM_I2C
+	tristate "support I2C bus connection"
+	depends on TOUCHSCREEN_AXIOM_CORE && I2C
+	help
+	  Say Y here if the touchscreen is connected via I2C bus.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called axiom_spi.
+
+config TOUCHSCREEN_AXIOM_SPI
+	tristate "support SPI bus connection"
+	depends on TOUCHSCREEN_AXIOM_CORE && SPI
+	help
+	  Say Y here if the touchscreen is connected via SPI bus.
+
+	  To compile this driver as a module, choose M here: the
+	  module will be called axiom_spi.
+
 config TOUCHSCREEN_BU21013
 	tristate "BU21013 based touch panel controllers"
 	depends on I2C
diff --git a/drivers/input/touchscreen/Makefile b/drivers/input/touchscreen/Makefile
index ab9abd151078..9b7d572c4589 100644
--- a/drivers/input/touchscreen/Makefile
+++ b/drivers/input/touchscreen/Makefile
@@ -19,6 +19,9 @@ obj-$(CONFIG_TOUCHSCREEN_APPLE_Z2)	+= apple_z2.o
 obj-$(CONFIG_TOUCHSCREEN_AR1021_I2C)	+= ar1021_i2c.o
 obj-$(CONFIG_TOUCHSCREEN_ATMEL_MXT)	+= atmel_mxt_ts.o
 obj-$(CONFIG_TOUCHSCREEN_AUO_PIXCIR)	+= auo-pixcir-ts.o
+obj-$(CONFIG_TOUCHSCREEN_AXIOM_CORE)	+= axiom_core.o
+obj-$(CONFIG_TOUCHSCREEN_AXIOM_I2C)	+= axiom_i2c.o
+obj-$(CONFIG_TOUCHSCREEN_AXIOM_SPI)	+= axiom_spi.o
 obj-$(CONFIG_TOUCHSCREEN_BU21013)	+= bu21013_ts.o
 obj-$(CONFIG_TOUCHSCREEN_BU21029)	+= bu21029_ts.o
 obj-$(CONFIG_TOUCHSCREEN_CHIPONE_ICN8318)	+= chipone_icn8318.o
diff --git a/drivers/input/touchscreen/axiom_core.c b/drivers/input/touchscreen/axiom_core.c
new file mode 100644
index 000000000000..7983effe40f7
--- /dev/null
+++ b/drivers/input/touchscreen/axiom_core.c
@@ -0,0 +1,482 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * TouchNetix aXiom Touchscreen Driver
+ *
+ * Copyright (C) 2020-2026 TouchNetix Ltd.
+ *
+ * Author(s): Mark Satterthwaite <mark.satterthwaite@touchnetix.com>
+ *            Pedro Torruella <pedro.torruella@touchnetix.com>
+ *            Bart Prescott <bartp@baasheep.co.uk>
+ *            Hannah Rossiter <hannah.rossiter@touchnetix.com>
+ *            Andrew Thomas <andrew.thomas@touchnetix.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+// #define DEBUG // Enable debug messages
+
+#include <linux/device.h>
+#include <linux/input/mt.h>
+#include <linux/crc16.h>
+#include <linux/property.h>
+#include <linux/interrupt.h>
+#include <linux/unaligned.h>
+#include "axiom_core.h"
+
+/* u31 device info masks */
+#define AX_DEV_ID_MASK GENMASK(14, 0)
+#define AX_MODE BIT(15)
+#define AX_FW_REV_MINOR_MASK GENMASK(7, 0)
+#define AX_FW_REV_MAJOR_MASK GENMASK(15, 8)
+#define AX_VARIANT_MASK GENMASK(5, 0)
+#define AX_FW_STATUS BIT(7)
+#define AX_TCP_REV_MASK GENMASK(15, 8)
+#define AX_BOOT_REV_MINOR_MASK GENMASK(7, 0)
+#define AX_BOOT_REV_MAJOR_MASK GENMASK(15, 8)
+#define AX_NUM_USAGES_MASK GENMASK(7, 0)
+#define AX_SILICON_REV_MASK GENMASK(11, 8)
+#define AX_RUNTIME_FW_PATCH_MASK GENMASK(15, 12)
+
+/* u31 usage table entry masks */
+#define AX_U31_USAGE_NUM_MASK GENMASK(7, 0)
+#define AX_U31_START_PAGE_MASK GENMASK(15, 8)
+#define AX_U31_NUM_PAGES_MASK GENMASK(7, 0)
+#define AX_U31_MAX_OFFSET_MASK GENMASK(14, 8)
+#define AX_U31_OFFSET_TYPE_BIT BIT(15)
+#define AX_U31_UIF_REV_MASK GENMASK(7, 0)
+#define AX_U31_USAGE_TYPE_MASK GENMASK(15, 8)
+
+/* u34 report masks */
+#define AX_U34_LEN_MASK GENMASK(6, 0)
+#define AX_U34_OVERFLOW BIT(7)
+#define AX_U34_USAGE_MASK GENMASK(15, 8)
+#define AX_U34_PAYLOAD_BUFFER 2
+
+/* u41 report masks */
+#define AX_U41_PRESENT_MASK GENMASK(9, 0)
+#define U41_X_Y_OFFSET (2)
+#define U41_COORD_SIZE (4)
+#define U41_Z_OFFSET (42)
+
+static const char *const fw_variants[] = { "3D", "2D", "FORCE",
+					   "0D", "XL", "TOUCHPAD" };
+
+static int axiom_set_capabilities(struct input_dev *input_dev)
+{
+	input_dev->name = "TouchNetix aXiom Touchscreen";
+	input_dev->phys = "input/axiom_ts";
+
+	// Single Touch
+	input_set_abs_params(input_dev, ABS_X, 0, 65535, 0, 0);
+	input_set_abs_params(input_dev, ABS_Y, 0, 65535, 0, 0);
+
+	// Multi Touch
+	// Min, Max, Fuzz (expected noise in px, try 4?) and Flat
+	input_set_abs_params(input_dev, ABS_MT_POSITION_X, 0, 65535, 0, 0);
+	// Min, Max, Fuzz (expected noise in px, try 4?) and Flat
+	input_set_abs_params(input_dev, ABS_MT_POSITION_Y, 0, 65535, 0, 0);
+	input_set_abs_params(input_dev, ABS_MT_TOOL_TYPE, 0, MT_TOOL_MAX, 0, 0);
+	input_set_abs_params(input_dev, ABS_MT_DISTANCE, 0, 127, 0, 0);
+	input_set_abs_params(input_dev, ABS_MT_PRESSURE, 0, 127, 0, 0);
+
+	input_mt_init_slots(input_dev, U41_MAX_TARGETS, INPUT_MT_DIRECT);
+
+	return 0;
+}
+
+static struct u31_usage_entry *usage_find_entry(struct axiom *ax, u16 usage)
+{
+	u16 i;
+
+	for (i = 0; i < ax->dev_info.num_usages; i++) {
+		if (ax->usage_table[i].usage_num == usage)
+			return &ax->usage_table[i];
+	}
+
+	pr_err("aXiom-core: Usage u%02x not found in usage table\n", usage);
+	return ERR_PTR(-EINVAL);
+}
+
+static void axiom_unpack_device_info(const u8 *buf,
+				     struct axiom_device_info *info)
+{
+	u16 w;
+
+	w = get_unaligned_le16(buf);
+	info->device_id = FIELD_GET(AX_DEV_ID_MASK, w);
+	info->mode = !!(w & AX_MODE);
+
+	w = get_unaligned_le16(buf + 2);
+	info->runtime_fw_rev_minor = FIELD_GET(AX_FW_REV_MINOR_MASK, w);
+	info->runtime_fw_rev_major = FIELD_GET(AX_FW_REV_MAJOR_MASK, w);
+
+	w = get_unaligned_le16(buf + 4);
+	info->device_build_variant = FIELD_GET(AX_VARIANT_MASK, w);
+	info->runtime_fw_status = !!(w & AX_FW_STATUS);
+	info->tcp_revision = FIELD_GET(AX_TCP_REV_MASK, w);
+
+	w = get_unaligned_le16(buf + 6);
+	info->bootloader_fw_rev_minor = FIELD_GET(AX_BOOT_REV_MINOR_MASK, w);
+	info->bootloader_fw_rev_major = FIELD_GET(AX_BOOT_REV_MAJOR_MASK, w);
+
+	info->jedec_id = get_unaligned_le16(buf + 8);
+
+	w = get_unaligned_le16(buf + 10);
+	info->num_usages = FIELD_GET(AX_NUM_USAGES_MASK, w);
+	info->silicon_revision = FIELD_GET(AX_SILICON_REV_MASK, w);
+	info->runtime_fw_rev_patch = FIELD_GET(AX_RUNTIME_FW_PATCH_MASK, w);
+}
+
+static void axiom_unpack_usage_table(u8 *buf, struct axiom *ax)
+{
+	u8 *ptr;
+	struct u31_usage_entry *entry;
+	int i;
+	u16 w;
+	u16 report_len;
+
+	for (i = 0; i < ax->dev_info.num_usages && i < U31_MAX_USAGES; i++) {
+		entry = &ax->usage_table[i];
+		/* Calculate offset for this specific entry */
+		ptr = buf + (i * SIZE_U31_USAGE_ENTRY);
+
+		w = get_unaligned_le16(ptr);
+		entry->usage_num = FIELD_GET(AX_U31_USAGE_NUM_MASK, w);
+		entry->start_page = FIELD_GET(AX_U31_START_PAGE_MASK, w);
+
+		w = get_unaligned_le16(ptr + 2);
+		entry->num_pages = FIELD_GET(AX_U31_NUM_PAGES_MASK, w);
+		entry->max_offset = FIELD_GET(AX_U31_MAX_OFFSET_MASK, w);
+		entry->offset_type = !!(w & AX_U31_OFFSET_TYPE_BIT);
+
+		w = get_unaligned_le16(ptr + 4);
+		entry->uifrevision = FIELD_GET(AX_U31_UIF_REV_MASK, w);
+		entry->usage_type = FIELD_GET(AX_U31_USAGE_TYPE_MASK, w);
+
+		// Convert words to bytes
+		report_len = (entry->max_offset + 1) * 2;
+		if ((entry->usage_type == REPORT) &&
+		    (report_len > ax->max_report_len)) {
+			ax->max_report_len = report_len;
+		}
+	}
+}
+
+static int axiom_init_dev_info(struct axiom *ax)
+{
+	int i;
+	struct u31_usage_entry *u;
+	int err;
+	const char *variant_str;
+
+	/* Read page 0 of u31 */
+	err = ax->bus_ops->read(ax->dev, 0x0, SIZE_U31_DEVICE_INFO,
+				ax->read_buf);
+	if (err)
+		return -EIO;
+
+	axiom_unpack_device_info(ax->read_buf, &ax->dev_info);
+
+	if (ax->dev_info.device_build_variant < ARRAY_SIZE(fw_variants)) {
+		variant_str = fw_variants[ax->dev_info.device_build_variant];
+	} else {
+		variant_str = "UNKNOWN";
+	}
+	char silicon_rev = (char)(0x41 + ax->dev_info.silicon_revision);
+
+	dev_info(ax->dev, "Firmware Info:\n");
+	dev_info(ax->dev, "  BL Mode     : %u\n", ax->dev_info.mode);
+	dev_info(ax->dev, "  Device ID   : %04x\n", ax->dev_info.device_id);
+	dev_info(ax->dev, "  FW Revision : %u.%u.%u-%s %s\n",
+		 ax->dev_info.runtime_fw_rev_major,
+		 ax->dev_info.runtime_fw_rev_minor,
+		 ax->dev_info.runtime_fw_rev_patch,
+		 (ax->dev_info.runtime_fw_status == 0) ? "eng" : "prod",
+		 variant_str);
+	dev_info(ax->dev, "  BL Revision : %02x.%02x\n",
+		 ax->dev_info.bootloader_fw_rev_major,
+		 ax->dev_info.bootloader_fw_rev_minor);
+	dev_info(ax->dev, "  Silicon     : 0x%04X (Rev %c)\n",
+		 ax->dev_info.jedec_id, silicon_rev);
+	dev_info(ax->dev, "  Num Usages  : %u\n", ax->dev_info.num_usages);
+
+	if (ax->dev_info.num_usages > U31_MAX_USAGES) {
+		dev_err(ax->dev,
+			"Num usages (%u) exceeds maximum supported (%u)\n",
+			ax->dev_info.num_usages, U31_MAX_USAGES);
+		return -EINVAL;
+	}
+
+	/* Read the second page of u31 to get the usage table */
+	err = ax->bus_ops->read(ax->dev, 0x100,
+				sizeof(ax->usage_table[0]) *
+					ax->dev_info.num_usages,
+				ax->read_buf);
+	if (err)
+		return -EIO;
+
+	axiom_unpack_usage_table(ax->read_buf, ax);
+
+	dev_info(ax->dev, "Usage Table:\n");
+	for (i = 0; i < ax->dev_info.num_usages; i++) {
+		u = &ax->usage_table[i];
+
+		dev_info(
+			ax->dev,
+			"  Usage: u%02x  Rev: %3u  Page: 0x%02x00  Num Pages: %3u\n",
+			u->usage_num, u->uifrevision, u->start_page,
+			u->num_pages);
+	}
+	dev_info(ax->dev, "Max Report Length: %u\n", ax->max_report_len);
+
+	if (ax->max_report_len > AXIOM_MAX_READ_SIZE) {
+		dev_err(ax->dev,
+			"aXiom maximum report length (%u) greater than allocated buffer size (%u).",
+			ax->max_report_len, AXIOM_MAX_READ_SIZE);
+		return -EINVAL;
+	}
+
+	/* Set u34 address to allow direct access to report reading address */
+	u = usage_find_entry(ax, 0x34);
+	if (IS_ERR(u))
+		return PTR_ERR(u);
+	ax->u34_address = u->start_page << 8;
+
+	return 0;
+}
+
+static int axiom_process_u41_report(struct axiom *ax, u8 *report)
+{
+	int i;
+	u16 target_present;
+	bool active;
+	u8 offset;
+	enum u41_target_state_e state;
+	u16 x;
+	u16 y;
+	s8 z;
+
+	target_present =
+		FIELD_GET(AX_U41_PRESENT_MASK, get_unaligned_le16(&report[0]));
+
+	for (i = 0; i < U41_MAX_TARGETS; i++) {
+		active = !!((target_present >> i) & 1);
+
+		offset = U41_X_Y_OFFSET + (i * U41_COORD_SIZE);
+		x = get_unaligned_le16(&report[offset]);
+		y = get_unaligned_le16(&report[offset + 2]);
+		z = report[U41_Z_OFFSET + i];
+
+		if (!active)
+			state = Target_State_Not_Present;
+		else if (z >= 0)
+			state = Target_State_Touching;
+		else if ((z > U41_PROX_LEVEL) && (z < 0))
+			state = Target_State_Hover;
+		else if (z == U41_PROX_LEVEL)
+			state = Target_State_Prox;
+		else
+			state = Target_State_Not_Present;
+
+		dev_dbg(ax->dev, "Target %d: x=%u y=%u z=%d present=%d\n", i, x,
+			y, z, active);
+
+		switch (state) {
+		case Target_State_Not_Present:
+		case Target_State_Prox:
+
+			input_mt_slot(ax->input, i);
+			input_mt_report_slot_inactive(ax->input);
+			break;
+
+		case Target_State_Hover:
+		case Target_State_Touching:
+
+			input_mt_slot(ax->input, i);
+			input_report_abs(ax->input, ABS_MT_TRACKING_ID, i);
+			input_report_abs(ax->input, ABS_MT_POSITION_X, x);
+			input_report_abs(ax->input, ABS_MT_POSITION_Y, y);
+
+			if (state == Target_State_Touching) {
+				input_report_abs(ax->input, ABS_MT_DISTANCE, 0);
+				input_report_abs(ax->input, ABS_MT_PRESSURE, z);
+			} else { /* Hover */
+				input_report_abs(ax->input, ABS_MT_DISTANCE, -z);
+				input_report_abs(ax->input, ABS_MT_PRESSURE, 0);
+			}
+			break;
+
+		default:
+			break;
+		}
+	}
+
+	input_mt_sync_frame(ax->input);
+	input_sync(ax->input);
+
+	return 0;
+}
+
+static int axiom_process_report(struct axiom *ax, u8 *report)
+{
+	int err;
+	struct u34_report_header hdr;
+	u16 crc_calc;
+	u16 crc_report;
+	u8 len;
+	u16 hdr_buf = get_unaligned_le16(&report[0]);
+
+	dev_dbg(ax->dev, "Payload Data %*ph\n", ax->max_report_len, report);
+
+	hdr.report_length = FIELD_GET(AX_U34_LEN_MASK, hdr_buf);
+	hdr.overflow = !!(hdr_buf & AX_U34_OVERFLOW);
+	hdr.report_usage = FIELD_GET(AX_U34_USAGE_MASK, hdr_buf);
+
+	len = hdr.report_length << 1;
+	if (hdr.report_length == 0) {
+		dev_err(ax->dev, "Zero length report discarded.\n");
+		return -EIO;
+	}
+
+	// Length is 16 bit words and remove the size of the CRC16 itself
+	crc_report = (report[len - 1] << 8) | (report[len - 2]);
+	crc_calc = crc16(0, report, (len - 2));
+
+	if (crc_calc != crc_report) {
+		dev_err(ax->dev,
+			"CRC mismatch! Expected: %04X, Calculated CRC: %04X. Report discarded.\n",
+			crc_report, crc_calc);
+		return -EIO;
+	}
+
+	switch (hdr.report_usage) {
+	case AX_2DCTS_REPORT_ID:
+		err = axiom_process_u41_report(ax,
+					       &report[AX_U34_PAYLOAD_BUFFER]);
+		break;
+
+	default:
+		break;
+	}
+
+	return err;
+}
+
+static void axiom_poll(struct input_dev *input_dev)
+{
+	struct axiom *ax = input_get_drvdata(input_dev);
+	int err;
+
+	/* Read touch reports from u34 */
+	err = ax->bus_ops->read(ax->dev, ax->u34_address, ax->max_report_len,
+				ax->read_buf);
+	if (err)
+		return;
+
+	err = axiom_process_report(ax, ax->read_buf);
+	if (err)
+		dev_err(ax->dev, "Failed to process report: %d\n", err);
+}
+
+static irqreturn_t axiom_irq(int irq, void *handle)
+{
+	struct axiom *ax = handle;
+	int err;
+
+	/* Read touch reports from u34 */
+	err = ax->bus_ops->read(ax->dev, ax->u34_address, ax->max_report_len,
+				ax->read_buf);
+	if (err)
+		goto out;
+
+	err = axiom_process_report(ax, ax->read_buf);
+	if (err)
+		dev_err(ax->dev, "Failed to process report: %d\n", err);
+
+out:
+	return IRQ_HANDLED;
+}
+
+struct axiom *axiom_probe(const struct axiom_bus_ops *bus_ops,
+			  struct device *dev, int irq)
+{
+	struct axiom *ax;
+	struct input_dev *input_dev;
+	int err;
+	bool poll_enable = false;
+	u8 poll_period = 0;
+
+	ax = devm_kzalloc(dev, sizeof(*ax), GFP_KERNEL);
+	if (!ax)
+		return ERR_PTR(-ENOMEM);
+
+	input_dev = devm_input_allocate_device(dev);
+	if (!input_dev) {
+		pr_err("ERROR: aXiom-core: Failed to allocate memory for input device!\n");
+		return ERR_PTR(-ENOMEM);
+	}
+
+	poll_enable = device_property_read_bool(dev, "axiom,poll-enable");
+
+	device_property_read_u8(dev, "axiom,poll-period", &poll_period);
+	if (!poll_period)
+		poll_period = AX_POLLING_PERIOD_MS;
+
+	ax->dev = dev;
+	ax->input = input_dev;
+	ax->bus_ops = bus_ops;
+	ax->irq = irq;
+
+	dev_info(dev, "aXiom Probe\n");
+	if (poll_enable)
+		dev_info(dev, "Polling Period : %u\n", poll_period);
+	else
+		dev_info(dev, "Device IRQ : %u\n", ax->irq);
+
+	axiom_set_capabilities(input_dev);
+
+	err = axiom_init_dev_info(ax);
+	if (err) {
+		dev_err(ax->dev, "Failed to read device info, err: %d\n", err);
+		return ERR_PTR(err);
+	}
+
+	if (poll_enable) {
+		err = input_setup_polling(input_dev, axiom_poll);
+		if (err) {
+			dev_err(ax->dev, "could not set up polling mode, %d\n",
+				err);
+			return ERR_PTR(err);
+		}
+
+		input_set_poll_interval(input_dev, poll_period);
+	} else {
+		err = devm_request_threaded_irq(ax->dev, ax->irq, NULL,
+						axiom_irq,
+						IRQF_TRIGGER_LOW | IRQF_ONESHOT,
+						"axiom_irq", ax);
+		if (err)
+			return ERR_PTR(err);
+	}
+
+	err = input_register_device(input_dev);
+	if (err) {
+		dev_err(ax->dev, "Failed to register input device: %d\n", err);
+		return ERR_PTR(err);
+	}
+
+	input_set_drvdata(input_dev, ax);
+
+	return ax;
+}
+EXPORT_SYMBOL_GPL(axiom_probe);
+
+MODULE_AUTHOR("TouchNetix <support@touchnetix.com>");
+MODULE_DESCRIPTION("aXiom touchscreen core logic");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("axiom");
+MODULE_VERSION("1.0.0");
diff --git a/drivers/input/touchscreen/axiom_core.h b/drivers/input/touchscreen/axiom_core.h
new file mode 100644
index 000000000000..ca77f9038cb1
--- /dev/null
+++ b/drivers/input/touchscreen/axiom_core.h
@@ -0,0 +1,128 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * TouchNetix aXiom Touchscreen Driver
+ *
+ * Copyright (C) 2020-2026 TouchNetix Ltd.
+ *
+ * Author(s): Mark Satterthwaite <mark.satterthwaite@touchnetix.com>
+ *            Pedro Torruella <pedro.torruella@touchnetix.com>
+ *            Bart Prescott <bartp@baasheep.co.uk>
+ *            Hannah Rossiter <hannah.rossiter@touchnetix.com>
+ *            Andrew Thomas <andrew.thomas@touchnetix.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+#ifndef __AXIOM_CORE_H
+#define __AXIOM_CORE_H
+
+#include <linux/input.h>
+
+#define AX_POLLING_PERIOD_MS (10)
+
+#define AXIOM_USE_TOUCHSCREEN_INTERFACE // registers the axiom device as a touch screen instead of as a mouse pointer
+#define U46_ENABLE_RAW_FORCE_DATA // enables the raw data for up to 4 force channels to be sent to the input subsystem
+
+#define AXIOM_PAGE_SIZE (256)
+// u31 has 2 pages for usage table entries. (2 * PAGE_SIZE) / U31_BYTES_PER_USAGE = 85
+#define AXIOM_MAX_READ_SIZE (2 * AXIOM_PAGE_SIZE)
+#define SIZE_U31_DEVICE_INFO (12)
+#define SIZE_U31_USAGE_ENTRY (6)
+#define U31_MAX_USAGES (85U)
+#define U41_MAX_TARGETS (10U)
+#define U41_PROX_LEVEL (-128)
+#define AXIOM_HOLDOFF_DELAY_US (40)
+
+enum ax_comms_op_e { AX_WR_OP = 0, AX_RD_OP = 1 };
+
+enum report_ids_e {
+	AX_2DCTS_REPORT_ID = 0x41,
+};
+
+enum axiom_mode_e {
+	AX_RUNTIME_STATE = 0,
+	AX_BOOTLOADER_STATE = 1,
+};
+
+enum usage_type_e {
+	UNKNOWN = 0,
+	OTHER = 1,
+	REPORT = 2,
+	REGISTER = 3,
+	REGISTER_READ_ONLY_ = 4,
+	CDU = 5,
+	CDU_READ_ONLY_ = 6,
+};
+
+struct axiom_device_info {
+	u16 device_id;
+	u8 mode;
+	u8 runtime_fw_rev_minor;
+	u8 runtime_fw_rev_major;
+	u8 device_build_variant;
+	u8 runtime_fw_status;
+	u8 tcp_revision;
+	u8 bootloader_fw_rev_minor;
+	u8 bootloader_fw_rev_major;
+	u8 jedec_id;
+	u8 num_usages;
+	u8 silicon_revision;
+	u8 runtime_fw_rev_patch;
+};
+
+struct u31_usage_entry {
+	u8 usage_num;
+	u8 start_page;
+	u8 num_pages;
+	u8 max_offset;
+	u8 offset_type;
+	u8 uifrevision;
+	u8 usage_type;
+};
+
+struct axiom_cmd_header {
+	u16 target_address;
+	u16 length : 15;
+	u16 rd_wr : 1;
+};
+
+struct axiom_bus_ops {
+	u16 bustype;
+	int (*write)(struct device *dev, u16 addr, u16 length, void *values);
+	int (*read)(struct device *dev, u16 addr, u16 length, void *values);
+};
+
+enum u41_target_state_e {
+	Target_State_Not_Present = 0,
+	Target_State_Prox = 1,
+	Target_State_Hover = 2,
+	Target_State_Touching = 3,
+};
+
+struct axiom {
+	struct device *dev;
+	int irq;
+	struct input_dev *input;
+	const struct axiom_bus_ops *bus_ops;
+	struct axiom_device_info dev_info;
+	struct u31_usage_entry usage_table[U31_MAX_USAGES];
+	u16 max_report_len;
+	u16 u34_address;
+
+	u8 read_buf[AXIOM_MAX_READ_SIZE];
+};
+
+struct u34_report_header {
+	u8 report_length;
+	u8 overflow;
+	u8 report_usage;
+};
+
+struct axiom *axiom_probe(const struct axiom_bus_ops *bus_ops,
+			  struct device *dev, int irq);
+
+#endif /* __AXIOM_CORE_H */
diff --git a/drivers/input/touchscreen/axiom_i2c.c b/drivers/input/touchscreen/axiom_i2c.c
new file mode 100644
index 000000000000..66071cc0f7b3
--- /dev/null
+++ b/drivers/input/touchscreen/axiom_i2c.c
@@ -0,0 +1,152 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * TouchNetix aXiom Touchscreen Driver
+ *
+ * Copyright (C) 2020-2026 TouchNetix Ltd.
+ *
+ * Author(s): Bart Prescott <bartp@baasheep.co.uk>
+ *            Pedro Torruella <pedro.torruella@touchnetix.com>
+ *            Mark Satterthwaite <mark.satterthwaite@touchnetix.com>
+ *            Hannah Rossiter <hannah.rossiter@touchnetix.com>
+ *            Andrew Thomas <andrew.thomas@touchnetix.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+// #define DEBUG // Enable debug messages
+
+#include <linux/i2c.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/input.h>
+#include "axiom_core.h"
+
+static int axiom_i2c_read_block_data(struct device *dev, u16 addr, u16 length,
+				     void *values)
+{
+	int error;
+	struct i2c_client *client = to_i2c_client(dev);
+	struct axiom_cmd_header cmd_header = { .target_address = addr,
+					       .length = length,
+					       .rd_wr = AX_RD_OP };
+
+	struct i2c_msg msgs[] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = sizeof(cmd_header),
+			.buf = (u8 *)&cmd_header,
+		},
+		{
+			.addr = client->addr,
+			.flags = I2C_M_RD,
+			.len = length,
+			.buf = values,
+		},
+	};
+
+	error = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+	if (error < 0) {
+		dev_err(dev, "I2C transfer error: %d\n", error);
+		return error;
+	}
+
+	udelay(AXIOM_HOLDOFF_DELAY_US);
+
+	return error != ARRAY_SIZE(msgs) ? -EIO : 0;
+}
+
+static int axiom_i2c_write_block_data(struct device *dev, u16 addr, u16 length,
+				      void *values)
+{
+	int error;
+	struct i2c_client *client = to_i2c_client(dev);
+	struct axiom_cmd_header cmd_header = { .target_address = addr,
+					       .length = length,
+					       .rd_wr = AX_WR_OP };
+
+	struct i2c_msg msgs[] = {
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = sizeof(cmd_header),
+			.buf = (u8 *)&cmd_header,
+		},
+		{
+			.addr = client->addr,
+			.flags = 0,
+			.len = length,
+			.buf = values,
+		},
+	};
+
+	error = i2c_transfer(client->adapter, msgs, ARRAY_SIZE(msgs));
+	if (error < 0) {
+		dev_err(dev, "I2C transfer error: %d\n", error);
+		return error;
+	}
+
+	udelay(AXIOM_HOLDOFF_DELAY_US);
+
+	return error != ARRAY_SIZE(msgs) ? -EIO : 0;
+}
+
+static const struct axiom_bus_ops axiom_i2c_bus_ops = {
+	.bustype = BUS_I2C,
+	.write = axiom_i2c_write_block_data,
+	.read = axiom_i2c_read_block_data,
+};
+
+static int axiom_i2c_probe(struct i2c_client *client)
+{
+	struct axiom *axiom;
+
+	if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) {
+		dev_err(&client->dev, "I2C functionality not Supported\n");
+		return -EIO;
+	}
+
+	axiom = axiom_probe(&axiom_i2c_bus_ops, &client->dev, client->irq);
+	if (IS_ERR(axiom))
+		return dev_err_probe(&client->dev, PTR_ERR(axiom),
+				     "failed to register input device\n");
+
+	return 0;
+}
+
+static const struct i2c_device_id axiom_i2c_id_table[] = {
+	{ "axiom-i2c" },
+	{},
+};
+MODULE_DEVICE_TABLE(i2c, axiom_i2c_id_table);
+
+static const struct of_device_id axiom_i2c_dt_ids[] = {
+	{
+		.compatible = "tnx,axiom-i2c",
+		.data = "axiom",
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, axiom_i2c_dt_ids);
+
+static struct i2c_driver axiom_i2c_driver = {
+	.driver = {
+		.name = "axiom_i2c",
+		.of_match_table = of_match_ptr(axiom_i2c_dt_ids),
+	},
+	.id_table = axiom_i2c_id_table,
+	.probe = axiom_i2c_probe,
+};
+
+module_i2c_driver(axiom_i2c_driver);
+
+MODULE_AUTHOR("TouchNetix <support@touchnetix.com>");
+MODULE_DESCRIPTION("aXiom touchscreen I2C bus driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("axiom");
+MODULE_VERSION("1.0.0");
diff --git a/drivers/input/touchscreen/axiom_spi.c b/drivers/input/touchscreen/axiom_spi.c
new file mode 100644
index 000000000000..a67ad3645689
--- /dev/null
+++ b/drivers/input/touchscreen/axiom_spi.c
@@ -0,0 +1,159 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * TouchNetix aXiom Touchscreen Driver
+ *
+ * Copyright (C) 2018-2023 TouchNetix Ltd.
+ *
+ * Author(s): Mark Satterthwaite <mark.satterthwaite@touchnetix.com>
+ *            Bart Prescott <bartp@baasheep.co.uk>
+ *            Hannah Rossiter <hannah.rossiter@touchnetix.com>
+ *            Andrew Thomas <andrew.thomas@touchnetix.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ *
+ */
+
+// #define DEBUG // Enable debug messages
+
+#include <linux/of.h>
+#include <linux/kernel.h>
+#include <linux/delay.h>
+#include <linux/module.h>
+#include <linux/spi/spi.h>
+#include <linux/input.h>
+#include "axiom_core.h"
+
+#define SPI_PADDING_LEN 32
+
+static int axiom_spi_transfer(struct device *dev, enum ax_comms_op_e op,
+			      u16 addr, u16 length, void *values)
+{
+	int ret;
+	struct spi_device *spi = to_spi_device(dev);
+	struct spi_transfer xfr_header;
+	struct spi_transfer xfr_padding;
+	struct spi_transfer xfr_payload;
+	struct spi_message msg;
+	struct axiom_cmd_header cmd_header = { .target_address = addr,
+					       .length = length,
+					       .rd_wr = op };
+	u8 pad_buf[SPI_PADDING_LEN] = { 0 };
+
+	memset(&xfr_header, 0, sizeof(xfr_header));
+	memset(&xfr_padding, 0, sizeof(xfr_padding));
+	memset(&xfr_payload, 0, sizeof(xfr_payload));
+
+	/* Setup the SPI transfer operations */
+	xfr_header.tx_buf = &cmd_header;
+	xfr_header.len = sizeof(cmd_header);
+
+	xfr_padding.tx_buf = pad_buf;
+	xfr_padding.len = sizeof(pad_buf);
+
+	switch (op) {
+	case AX_WR_OP:
+		xfr_payload.tx_buf = values;
+		break;
+	case AX_RD_OP:
+		xfr_payload.rx_buf = values;
+		break;
+	default:
+		dev_err(dev, "%s: invalid operation: %d\n", __func__, op);
+		return -EINVAL;
+	}
+	xfr_payload.len = length;
+
+	spi_message_init(&msg);
+	spi_message_add_tail(&xfr_header, &msg);
+	spi_message_add_tail(&xfr_padding, &msg);
+	spi_message_add_tail(&xfr_payload, &msg);
+
+	ret = spi_sync(spi, &msg);
+	if (ret < 0) {
+		dev_err(&spi->dev, "Failed to SPI transfer, error: %d\n", ret);
+		return ret;
+	}
+
+	udelay(AXIOM_HOLDOFF_DELAY_US);
+
+	return 0;
+}
+
+static int axiom_spi_read_block_data(struct device *dev, u16 addr, u16 length,
+				     void *values)
+{
+	return axiom_spi_transfer(dev, AX_RD_OP, addr, length, values);
+}
+
+static int axiom_spi_write_block_data(struct device *dev, u16 addr, u16 length,
+				      void *values)
+{
+	return axiom_spi_transfer(dev, AX_WR_OP, addr, length, values);
+}
+
+static const struct axiom_bus_ops axiom_spi_bus_ops = {
+	.bustype = BUS_SPI,
+	.write = axiom_spi_write_block_data,
+	.read = axiom_spi_read_block_data,
+};
+
+static int axiom_spi_probe(struct spi_device *spi)
+{
+	struct axiom *axiom;
+	int error;
+
+	/* Set up SPI */
+	spi->bits_per_word = 8;
+	spi->mode = SPI_MODE_0;
+	spi->max_speed_hz = 4000000;
+
+	if (spi->irq == 0)
+		dev_err(&spi->dev, "No IRQ specified!\n");
+
+	error = spi_setup(spi);
+	if (error < 0) {
+		dev_err(&spi->dev, "%s: SPI setup error %d\n", __func__, error);
+		return error;
+	}
+	axiom = axiom_probe(&axiom_spi_bus_ops, &spi->dev, spi->irq);
+	if (IS_ERR(axiom))
+		return dev_err_probe(&spi->dev, PTR_ERR(axiom),
+				     "failed to register input device\n");
+
+	return 0;
+}
+
+static const struct spi_device_id axiom_spi_id_table[] = {
+	{ "axiom-spi" },
+	{},
+};
+MODULE_DEVICE_TABLE(spi, axiom_spi_id_table);
+
+static const struct of_device_id axiom_spi_dt_ids[] = {
+	{
+		.compatible = "tnx,axiom-spi",
+		.data = "axiom",
+	},
+	{}
+};
+MODULE_DEVICE_TABLE(of, axiom_spi_dt_ids);
+
+static struct spi_driver axiom_spi_driver = {
+	.id_table = axiom_spi_id_table,
+	.driver = {
+		.name = "axiom_spi",
+		.of_match_table = of_match_ptr(axiom_spi_dt_ids),
+	},
+	.probe = axiom_spi_probe,
+};
+
+module_spi_driver(axiom_spi_driver);
+
+MODULE_AUTHOR("TouchNetix <support@touchnetix.com>");
+MODULE_DESCRIPTION("aXiom touchscreen SPI bus driver");
+MODULE_LICENSE("GPL");
+MODULE_ALIAS("axiom");
+MODULE_VERSION("1.0.0");
-- 
2.43.0


^ permalink raw reply related

* [PATCH 2/4] Input: i8042: Add quirks for MECHREVO Wujie 15X Pro
From: gongqi @ 2026-01-22 12:06 UTC (permalink / raw)
  To: dmitry.torokhov; +Cc: linux-input, linux-kernel, gongqi

From: gongqi <550230171@qq.com>

The MECHREVO Wujie 15X Pro requires several i8042 quirks to function correctly. Specifically, NOMUX, RESET_ALWAYS, NOLOOP, and NOPNP are needed to ensure the keyboard and touchpad work reliably.
---
 drivers/input/serio/i8042-acpipnpio.h | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/input/serio/i8042-acpipnpio.h b/drivers/input/serio/i8042-acpipnpio.h
index 654771275ce87..4cd09560c5bfb 100644
--- a/drivers/input/serio/i8042-acpipnpio.h
+++ b/drivers/input/serio/i8042-acpipnpio.h
@@ -1176,6 +1176,13 @@ static const struct dmi_system_id i8042_dmi_quirk_table[] __initconst = {
 		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
 					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
 	},
+	{
+		.matches = {
+			DMI_MATCH(DMI_BOARD_NAME, "WUJIE Series-X5SP4NAG"),
+		},
+		.driver_data = (void *)(SERIO_QUIRK_NOMUX | SERIO_QUIRK_RESET_ALWAYS |
+					SERIO_QUIRK_NOLOOP | SERIO_QUIRK_NOPNP)
+	},
 	/*
 	 * A lot of modern Clevo barebones have touchpad and/or keyboard issues
 	 * after suspend fixable with the forcenorestore quirk.
-- 
2.43.0


^ permalink raw reply related

* Re: [PATCH] arm64: dts: qcom: milos-fairphone-fp6: Add Hall Effect sensor
From: Konrad Dybcio @ 2026-01-22  8:32 UTC (permalink / raw)
  To: Dmitry Torokhov, Luca Weiss
  Cc: Dmitry Baryshkov, Bjorn Andersson, Konrad Dybcio, Rob Herring,
	Krzysztof Kozlowski, Conor Dooley, ~postmarketos/upstreaming,
	phone-devel, linux-arm-msm, devicetree, linux-kernel, linux-input
In-Reply-To: <t4yjnuty7tmvs4vqzm4vdid7oowicy7hcnmqmu6nqtit3yru55@zpo6kprnarth>

On 1/21/26 9:06 PM, Dmitry Torokhov wrote:
> On Wed, Jan 21, 2026 at 09:07:44AM +0100, Luca Weiss wrote:
>> On Wed Jan 21, 2026 at 12:05 AM CET, Dmitry Baryshkov wrote:
>>> On Mon, Jan 19, 2026 at 04:52:23PM +0100, Luca Weiss wrote:
>>>> On Mon Jan 19, 2026 at 3:41 PM CET, Konrad Dybcio wrote:
>>>>> On 1/16/26 3:22 PM, Luca Weiss wrote:
>>>>>> Add a node for the Hall Effect sensor, used to detect whether the Flip
>>>>>> Cover is closed or not.
>>>>>>
>>>>>> The sensor is powered through vreg_l10b, so let's put a
>>>>>> regulator-always-on on that to make sure the sensor gets power.
>>>>>
>>>>> Is there anything else on L10B? Can we turn it off if the hall sensor
>>>>> is e.g. user-disabled?
>>>>
>>>> It's the voltage source for pull-up of sensor I2C bus (so
>>>> ADSP-managed?), DVDD for amplifiers and VDD for a most sensors like
>>>> the gyro.
>>>>
>>>> So realistically, it'll probably be (nearly) always on anyways. And I
>>>> don't want to shave another yak by adding vdd support to gpio-keys...
>>>
>>> Why? If it is exactly what happens on the board: the device producing
>>> GPIO events _is_ powered via a vdd. Added Input maintainer / list to cc.
>>
>> Yes, the hall sensor which is connected to the GPIO on the SoC, has an
>> extra VDD input which needs to be on in order for the Hall-effect sensor
>> to be on.
>>
>> See page 133 "HALL" in the center of the page
>> https://www.fairphone.com/wp-content/uploads/2025/08/Fairphone-Gen.-6_-Information-on-how-to-repair-dispose-of-and-recycle-EN-NL-FR-DE.pdf
>>
>> The IC is OCH166AEV4AD where VDD is (as expected) "Power Supply Input":
>> https://www.orient-chip.com/Public/Uploads/uploadfile/files/20231014/1OCH166Adatasheet202203221.pdf
> 
> If we add regulator support to gpio-keys do we expect it to be
> per-gpio/per-key? Or we'd recommend splitting into several instances of
> gpio-keys so that there is on set of supplies per gpio-keys device?

gpio-keys {} is very broad and generic, I would imagine it would only
make sense to keep it per-entry, like Luca suggested

Konrad

^ permalink raw reply


This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox