mbox series

[RFC,00/10] Netronix embedded controller driver for Kobo and Tolino ebook readers

Message ID 20200620223915.1311485-1-j.neuschaefer@gmx.net
Headers show
Series Netronix embedded controller driver for Kobo and Tolino ebook readers | expand

Message

J. Neuschäfer June 20, 2020, 10:39 p.m. UTC
Hi,

This patchset adds basic support for the embedded controller found on
older ebook reader boards designed by/with the ODM Netronix Inc.[1] and
sold by Kobo or Tolino, for example the Kobo Aura and the Tolino Shine.
These drivers are based on the vendor kernel sources, but in order to
all information in a single place, I documented the register interface
of the EC on GitHub[4].

A few things still needs to be ironed out, hence the RFC tag:
 - The reboot/reset handler in patch 3/10 calls into I2C code, which may
   sleep, but reboot handlers are apparently not allowed to sleep.
 - I'm not sure I got the YAML DT bindings right. I have also included
   the plain text DT bindings for reference.


Jonathan

[1]: http://www.netronixinc.com/products.aspx?ID=1
[2]: https://github.com/neuschaefer/linux/wiki/Netronix-MSP430-embedded-controller

Jonathan Neuschäfer (10):
  DT bindings in plain text format
  dt-bindings: Add vendor prefix for Netronix, Inc.
  dt-bindings: mfd: Add binding for Netronix's embedded controller
  mfd: Add base driver for Netronix embedded controller
  dt-bindings: pwm: Add bindings for PWM function in Netronix EC
  pwm: ntxec: Add driver for PWM function in Netronix EC
  dt-bindings: rtc: Add bindings for Netronix embedded controller RTC
  rtc: New driver for RTC in Netronix embedded controller
  MAINTAINERS: Add entry for Netronix embedded controller
  ARM: dts: imx50-kobo-aura: Add Netronix embedded controller

 .../bindings/mfd/netronix,ntxec.txt           |  58 ++++++
 .../bindings/mfd/netronix,ntxec.yaml          |  77 +++++++
 .../bindings/pwm/netronix,ntxec-pwm.txt       |  27 +++
 .../bindings/pwm/netronix,ntxec-pwm.yaml      |  33 +++
 .../bindings/rtc/netronix,ntxec-rtc.txt       |  17 ++
 .../bindings/rtc/netronix,ntxec-rtc.yaml      |  27 +++
 .../devicetree/bindings/vendor-prefixes.yaml  |   2 +
 MAINTAINERS                                   |  11 +
 arch/arm/boot/dts/imx50-kobo-aura.dts         |  27 ++-
 drivers/mfd/Kconfig                           |   7 +
 drivers/mfd/Makefile                          |   1 +
 drivers/mfd/ntxec.c                           | 188 ++++++++++++++++++
 drivers/pwm/Kconfig                           |   4 +
 drivers/pwm/Makefile                          |   1 +
 drivers/pwm/pwm-ntxec.c                       | 148 ++++++++++++++
 drivers/rtc/Kconfig                           |   4 +
 drivers/rtc/Makefile                          |   1 +
 drivers/rtc/rtc-ntxec.c                       | 115 +++++++++++
 include/linux/mfd/ntxec.h                     |  30 +++
 19 files changed, 777 insertions(+), 1 deletion(-)
 create mode 100644 Documentation/devicetree/bindings/mfd/netronix,ntxec.txt
 create mode 100644 Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml
 create mode 100644 Documentation/devicetree/bindings/pwm/netronix,ntxec-pwm.txt
 create mode 100644 Documentation/devicetree/bindings/pwm/netronix,ntxec-pwm.yaml
 create mode 100644 Documentation/devicetree/bindings/rtc/netronix,ntxec-rtc.txt
 create mode 100644 Documentation/devicetree/bindings/rtc/netronix,ntxec-rtc.yaml
 create mode 100644 drivers/mfd/ntxec.c
 create mode 100644 drivers/pwm/pwm-ntxec.c
 create mode 100644 drivers/rtc/rtc-ntxec.c
 create mode 100644 include/linux/mfd/ntxec.h

--
2.27.0

Comments

Andreas Kemnade June 30, 2020, 6:40 a.m. UTC | #1
Hi,

On Sun, 21 Jun 2020 00:39:04 +0200
Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:

> Hi,
> 
> This patchset adds basic support for the embedded controller found on
> older ebook reader boards designed by/with the ODM Netronix Inc.[1] and
> sold by Kobo or Tolino, for example the Kobo Aura and the Tolino Shine.
> These drivers are based on the vendor kernel sources, but in order to
> all information in a single place, I documented the register interface
> of the EC on GitHub[4].
> 
> A few things still needs to be ironed out, hence the RFC tag:
>  - The reboot/reset handler in patch 3/10 calls into I2C code, which may
>    sleep, but reboot handlers are apparently not allowed to sleep.
>  - I'm not sure I got the YAML DT bindings right. I have also included
>    the plain text DT bindings for reference.
> 
> 
got a chance to test it on a Tolino Shine 2 HD.
It uses the RTC from the RC5T619 but backlight seems to go via MSP430
EC.

I got this.

[    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
[   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
[   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5
[   10.850597] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: hctosys: unable to read the hardware clock

version number matchess with what the vendor kernel reports. Maybe we
should document which version is running on which devices?

&i2c1 {
        pinctrl-names = "default","sleep";
        pinctrl-0 = <&pinctrl_i2c1>;
        pinctrl-1 = <&pinctrl_i2c1_sleep>;
        status = "okay";

        embedded-controller@43 {
//              pinctrl-names = "default";
//              pinctrl-0 = <&pinctrl_ec>;
                compatible = "netronix,ntxec";
                reg = <0x43>;
                interrupts-extended = <&gpio5 11 IRQ_TYPE_EDGE_FALLING>;
                interrupt-controller;
                #interrupt-cells = <1>;

                ec_pwm: pwm {
                        compatible = "netronix,ntxec-pwm";
                        #pwm-cells = <2>;
                };

                rtc {
                        compatible = "netronix,ntxec-rtc";
                };
        };
};

Regards,
Andreas
J. Neuschäfer June 30, 2020, 7:15 a.m. UTC | #2
On Tue, Jun 30, 2020 at 08:40:51AM +0200, Andreas Kemnade wrote:
[...]
> got a chance to test it on a Tolino Shine 2 HD.
> It uses the RTC from the RC5T619 but backlight seems to go via MSP430
> EC.
> 
> I got this.
> 
> [    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
> [   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
> [   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5

Hmm, -EIO from the PWM driver.

> [   10.850597] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: hctosys: unable to read the hardware clock
> 
> version number matchess with what the vendor kernel reports. Maybe we
> should document which version is running on which devices?

Good idea, I've added a table to the wiki page:

  https://github.com/neuschaefer/linux/wiki/Netronix-MSP430-embedded-controller



Jonathan
Andreas Kemnade June 30, 2020, 7:22 p.m. UTC | #3
On Tue, 30 Jun 2020 09:15:23 +0200
Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:

> On Tue, Jun 30, 2020 at 08:40:51AM +0200, Andreas Kemnade wrote:
> [...]
> > got a chance to test it on a Tolino Shine 2 HD.
> > It uses the RTC from the RC5T619 but backlight seems to go via MSP430
> > EC.
> > 
> > I got this.
> > 
> > [    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
> > [   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
> > [   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5  
> 
> Hmm, -EIO from the PWM driver.
>
Weird...
IOMUXC_SW_PAD_CTL_PAD_I2C1_SDA/SCL is identical between
vendor kernel (heavily patched 3.0.35) and patched mainline.
                        
MX6SL_PAD_I2C1_SCL__I2C1_SCL     0x4001f8b1
MX6SL_PAD_I2C1_SDA__I2C1_SDA     0x4001f8b1

root@tolino2:~# i2cset -f 0 0x43 0xa3 0x0001 w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will write to device file /dev/i2c-0, chip address 0x43, data address
0xa3, data 0x01, mode word.
Continue? [Y/n] 
Error: Write failed
root@tolino2:~# i2cset -f 0 0x43 0xa3 0x0000 w
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will write to device file /dev/i2c-0, chip address 0x43, data address
0xa3, data 0x00, mode word.
Continue? [Y/n] 
Error: Write failed

but backlight gets toggled. Same behavior on vendor kernel and
in vendor uboot.
That smells.

Regards,
Andreas
Andreas Kemnade June 30, 2020, 8:14 p.m. UTC | #4
On Tue, 30 Jun 2020 09:15:23 +0200
Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:

> On Tue, Jun 30, 2020 at 08:40:51AM +0200, Andreas Kemnade wrote:
> [...]
> > got a chance to test it on a Tolino Shine 2 HD.
> > It uses the RTC from the RC5T619 but backlight seems to go via MSP430
> > EC.
> > 
> > I got this.
> > 
> > [    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
> > [   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
> > [   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5  
> 
> Hmm, -EIO from the PWM driver.
> 
turing debugging on:

[  330.330599] i2c i2c-0: <i2c_imx_xfer_common>
[  330.330621] i2c i2c-0: <i2c_imx_start>
[  330.332927] i2c i2c-0: <i2c_imx_bus_busy>
[  330.332953] i2c i2c-0: <i2c_imx_xfer_common> transfer message: 0
[  330.332971] i2c i2c-0: <i2c_imx_write> write slave address: addr=0x86
[  330.334365] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.334386] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.334402] i2c i2c-0: <i2c_imx_write> write data
[  330.334420] i2c i2c-0: <i2c_imx_write> write byte: B0=0xA3
[  330.334756] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.334774] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.334790] i2c i2c-0: <i2c_imx_write> write byte: B1=0x0
[  330.351573] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.351598] i2c i2c-0: <i2c_imx_acked> No ACK
[  330.351613] i2c i2c-0: <i2c_imx_stop>
[  330.351629] i2c i2c-0: <i2c_imx_bus_busy>
[  330.351648] i2c i2c-0: <i2c_imx_xfer_common> exit with: error: -6
[  330.351690] i2c i2c-0: <i2c_imx_xfer_common>
[  330.351704] i2c i2c-0: <i2c_imx_start>
[  330.352297] i2c i2c-0: <i2c_imx_bus_busy>
[  330.352321] i2c i2c-0: <i2c_imx_xfer_common> transfer message: 0
[  330.352339] i2c i2c-0: <i2c_imx_write> write slave address: addr=0x86
[  330.362152] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.362176] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.362191] i2c i2c-0: <i2c_imx_write> write data
[  330.362208] i2c i2c-0: <i2c_imx_write> write byte: B0=0xA1
[  330.362442] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.362461] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.362479] i2c i2c-0: <i2c_imx_write> write byte: B1=0xFF
[  330.362686] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.362705] i2c i2c-0: <i2c_imx_acked> No ACK
[  330.362720] i2c i2c-0: <i2c_imx_stop>
[  330.362735] i2c i2c-0: <i2c_imx_bus_busy>
[  330.362753] i2c i2c-0: <i2c_imx_xfer_common> exit with: error: -6
[  330.362794] i2c i2c-0: <i2c_imx_xfer_common>
[  330.362808] i2c i2c-0: <i2c_imx_start>
[  330.363071] i2c i2c-0: <i2c_imx_bus_busy>
[  330.363094] i2c i2c-0: <i2c_imx_xfer_common> transfer message: 0
[  330.363112] i2c i2c-0: <i2c_imx_write> write slave address: addr=0x86
[  330.363313] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.363331] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.363346] i2c i2c-0: <i2c_imx_write> write data
[  330.363362] i2c i2c-0: <i2c_imx_write> write byte: B0=0xA2
[  330.363572] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.363591] i2c i2c-0: <i2c_imx_acked> ACK received
[  330.363608] i2c i2c-0: <i2c_imx_write> write byte: B1=0xFF
[  330.363822] i2c i2c-0: <i2c_imx_trx_complete> TRX complete
[  330.363841] i2c i2c-0: <i2c_imx_acked> No ACK
[  330.363854] i2c i2c-0: <i2c_imx_stop>
[  330.363869] i2c i2c-0: <i2c_imx_bus_busy>
[  330.363886] i2c i2c-0: <i2c_imx_xfer_common> exit with: error: -6

Regards,
Andreas
J. Neuschäfer July 4, 2020, 8:58 p.m. UTC | #5
On Tue, Jun 30, 2020 at 10:14:47PM +0200, Andreas Kemnade wrote:
> On Tue, 30 Jun 2020 09:15:23 +0200
> Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:
> 
> > On Tue, Jun 30, 2020 at 08:40:51AM +0200, Andreas Kemnade wrote:
> > [...]
> > > got a chance to test it on a Tolino Shine 2 HD.
> > > It uses the RTC from the RC5T619 but backlight seems to go via MSP430
> > > EC.
> > > 
> > > I got this.
> > > 
> > > [    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
> > > [   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
> > > [   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5  
> > 
> > Hmm, -EIO from the PWM driver.
> > 
> turing debugging on:

(edited for compactness:)
> [  330.332971] i2c i2c-0: write slave address: addr=0x86   ACK received
> [  330.334420] i2c i2c-0: write byte: B0=0xA3              ACK received
> [  330.334790] i2c i2c-0: write byte: B1=0x0               No ACK

> [  330.352339] i2c i2c-0: write slave address: addr=0x86   ACK received
> [  330.362208] i2c i2c-0: write byte: B0=0xA1              ACK received
> [  330.362479] i2c i2c-0: write byte: B1=0xFF              No ACK

> [  330.363112] i2c i2c-0: write slave address: addr=0x86   ACK received
> [  330.363362] i2c i2c-0: write byte: B0=0xA2              ACK received
> [  330.363608] i2c i2c-0: write byte: B1=0xFF              No ACK

Hmm, it doesn't ack the writes to 0xA3, 0xA1 and 0xA2, which should
disable the PWM output and then disable the auto-off timer (according to
the vendor kernel).

And you said in your other mail that you can actually toggle the light
with writes to 0xA3, so I suspect a bug in the EC firmware here (which
may have gone unnoticed because the vendor kernel doesn't check if the
i2c transfers succeed). :/

IMHO we should get this driver merged first, and perhaps add a quirk to
deal with the missing ACKs later (unless a better solution is found).


Jonathan
Andreas Kemnade July 6, 2020, 7:28 p.m. UTC | #6
On Sat, 4 Jul 2020 22:58:08 +0200
Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:

> On Tue, Jun 30, 2020 at 10:14:47PM +0200, Andreas Kemnade wrote:
> > On Tue, 30 Jun 2020 09:15:23 +0200
> > Jonathan Neuschäfer <j.neuschaefer@gmx.net> wrote:
> >   
> > > On Tue, Jun 30, 2020 at 08:40:51AM +0200, Andreas Kemnade wrote:
> > > [...]  
> > > > got a chance to test it on a Tolino Shine 2 HD.
> > > > It uses the RTC from the RC5T619 but backlight seems to go via MSP430
> > > > EC.
> > > > 
> > > > I got this.
> > > > 
> > > > [    1.453603] ntxec 0-0043: Netronix embedded controller version f110 detected.
> > > > [   10.723638] ntxec-rtc 21a0000.i2c:embedded-controller@43:rtc: registered as rtc0
> > > > [   10.775276] ntxec-pwm: probe of 21a0000.i2c:embedded-controller@43:pwm failed with error -5    
> > > 
> > > Hmm, -EIO from the PWM driver.
> > >   
> > turing debugging on:  
> 
> (edited for compactness:)
> > [  330.332971] i2c i2c-0: write slave address: addr=0x86   ACK received
> > [  330.334420] i2c i2c-0: write byte: B0=0xA3              ACK received
> > [  330.334790] i2c i2c-0: write byte: B1=0x0               No ACK  
> 
> > [  330.352339] i2c i2c-0: write slave address: addr=0x86   ACK received
> > [  330.362208] i2c i2c-0: write byte: B0=0xA1              ACK received
> > [  330.362479] i2c i2c-0: write byte: B1=0xFF              No ACK  
> 
> > [  330.363112] i2c i2c-0: write slave address: addr=0x86   ACK received
> > [  330.363362] i2c i2c-0: write byte: B0=0xA2              ACK received
> > [  330.363608] i2c i2c-0: write byte: B1=0xFF              No ACK  
> 
> Hmm, it doesn't ack the writes to 0xA3, 0xA1 and 0xA2, which should
> disable the PWM output and then disable the auto-off timer (according to
> the vendor kernel).
> 
> And you said in your other mail that you can actually toggle the light
> with writes to 0xA3, so I suspect a bug in the EC firmware here (which
> may have gone unnoticed because the vendor kernel doesn't check if the
> i2c transfers succeed). :/
> 
That is a also my theory.

> IMHO we should get this driver merged first, and perhaps add a quirk to
> deal with the missing ACKs later (unless a better solution is found).
> 
Yes, that can be done separately (after the Tolino Shine 2 HD dtb is
in, I am polishing it right now).

Regards,
Andreas