[3/3] ARM: dts: mxs: support i.MX28 Amarula rmm board

Message ID 20250521092826.1035448-4-dario.binacchi@amarulasolutions.com
State New
Headers show
Series
  • Support i.MX28 Amarula rmm board
Related show

Commit Message

Dario Binacchi May 21, 2025, 9:28 a.m. UTC
The board includes the following resources:
 - 256 Mbytes NAND Flash
 - 256 Mbytes SRAM
 - LCD-TFT controller
 - CAN
 - USB 2.0 high-speed/full-speed
 - Ethernet MAC

Signed-off-by: Dario Binacchi <dario.binacchi@amarulasolutions.com>

---

 arch/arm/boot/dts/nxp/mxs/Makefile            |   1 +
 .../boot/dts/nxp/mxs/imx28-amarula-rmm.dts    | 302 ++++++++++++++++++
 2 files changed, 303 insertions(+)
 create mode 100644 arch/arm/boot/dts/nxp/mxs/imx28-amarula-rmm.dts

Comments

Marc Kleine-Budde May 21, 2025, 9:35 a.m. UTC | #1
On 21.05.2025 11:28:22, Dario Binacchi wrote:
> The board includes the following resources:
>  - 256 Mbytes NAND Flash
>  - 256 Mbytes SRAM
>  - LCD-TFT controller
>  - CAN

[...]

> +&can0 {
> +	pinctrl-names = "default";
> +	pinctrl-0 = <&can0_pins_a>;
> +	xceiver-supply = <&reg_3v3>;

Since v6.15-rc1 (d80bfde3c57a ("can: flexcan: add transceiver
capabilities")), the flexcan driver supports CAN transceivers via the
phy framework, see drivers/phy/phy-can-transceiver.c. Can you make use
of it?

regards,
Marc
Dario Binacchi May 21, 2025, 10:32 a.m. UTC | #2
Hello Marc,

On Wed, May 21, 2025 at 11:35 AM Marc Kleine-Budde <mkl@pengutronix.de> wrote:
>
> On 21.05.2025 11:28:22, Dario Binacchi wrote:
> > The board includes the following resources:
> >  - 256 Mbytes NAND Flash
> >  - 256 Mbytes SRAM
> >  - LCD-TFT controller
> >  - CAN
>
> [...]
>
> > +&can0 {
> > +     pinctrl-names = "default";
> > +     pinctrl-0 = <&can0_pins_a>;
> > +     xceiver-supply = <&reg_3v3>;
>
> Since v6.15-rc1 (d80bfde3c57a ("can: flexcan: add transceiver
> capabilities")), the flexcan driver supports CAN transceivers via the
> phy framework, see drivers/phy/phy-can-transceiver.c. Can you make use
> of it?

The board uses the SN65HVD233 transceiver, which is not listed among those
supported by drivers/phy/phy-can-transceiver.c. So I can't use the PHY
framework.
Do you agree?
Or am I missing something?

Thanks and regards,
Dario

>
> regards,
> Marc
>
> --
> Pengutronix e.K.                 | Marc Kleine-Budde          |
> Embedded Linux                   | https://www.pengutronix.de |
> Vertretung Nürnberg              | Phone: +49-5121-206917-129 |
> Amtsgericht Hildesheim, HRA 2686 | Fax:   +49-5121-206917-9   |
Fabio Estevam May 21, 2025, 11:40 a.m. UTC | #3
Hi Dario,

On Wed, May 21, 2025 at 6:28 AM Dario Binacchi
<dario.binacchi@amarulasolutions.com> wrote:
>
> The board includes the following resources:
>  - 256 Mbytes NAND Flash
>  - 256 Mbytes SRAM

SRAM or DDR?

>  - LCD-TFT controller

The LCD support is not described in the dts.

> +/ {
> +       model = "Amarula i.MX28 rmm";
> +       compatible = "amarula,imx28-rmm", "fsl,imx28";
> +
> +       memory@40000000 {
> +               device_type = "memory";
> +               reg = <0x40000000 0x08000000>;

In the commit log, you say 256 MB, but here we have 128 MB.

> +&i2c0 {
> +       pinctrl-names = "default";
> +       pinctrl-0 = <&i2c0_pins_a>;
> +       status = "okay";
> +
> +       polytouch: edt-ft5x06@38 {

Node names should be generic: touchscreen@38

> +
> +&pinctrl {
> +       pinctrl-names = "default";
> +       pinctrl-0 = <&hog_pins_a>;
> +
> +       hog_pins_a: hog-0 {
> +               reg = <0>;
> +               fsl,pinmux-ids = <
> +                       MX28_PAD_LCD_RESET__GPIO_3_30 /* LCD reset */
> +                       MX28_PAD_SSP2_SS1__GPIO_2_20  /* External power */

Proper panel bindings should better describe these pins than hog pins.

Do you plan to add display support?

To unsubscribe from this group and stop receiving emails from it, send an email to linux-amarula+unsubscribe@amarulasolutions.com.
Marc Kleine-Budde May 21, 2025, 12:59 p.m. UTC | #4
On 21.05.2025 12:32:19, Dario Binacchi wrote:
> Hello Marc,
> 
> On Wed, May 21, 2025 at 11:35 AM Marc Kleine-Budde <mkl@pengutronix.de> wrote:
> >
> > On 21.05.2025 11:28:22, Dario Binacchi wrote:
> > > The board includes the following resources:
> > >  - 256 Mbytes NAND Flash
> > >  - 256 Mbytes SRAM
> > >  - LCD-TFT controller
> > >  - CAN
> >
> > [...]
> >
> > > +&can0 {
> > > +     pinctrl-names = "default";
> > > +     pinctrl-0 = <&can0_pins_a>;
> > > +     xceiver-supply = <&reg_3v3>;
> >
> > Since v6.15-rc1 (d80bfde3c57a ("can: flexcan: add transceiver
> > capabilities")), the flexcan driver supports CAN transceivers via the
> > phy framework, see drivers/phy/phy-can-transceiver.c. Can you make use
> > of it?
> 
> The board uses the SN65HVD233 transceiver, which is not listed among those
> supported by drivers/phy/phy-can-transceiver.c. So I can't use the PHY
> framework.

Hmmm, okay. Since the SN65HVD233 has features like loopback, we have to
think about it more than adding a new compatible to the existing driver.

> Do you agree?

Ok

> Or am I missing something?

regards,
Marc
Dario Binacchi May 21, 2025, 1:19 p.m. UTC | #5
Hi Fabio,

On Wed, May 21, 2025 at 1:40 PM Fabio Estevam <festevam@gmail.com> wrote:
>
> Hi Dario,
>
> On Wed, May 21, 2025 at 6:28 AM Dario Binacchi
> <dario.binacchi@amarulasolutions.com> wrote:
> >
> > The board includes the following resources:
> >  - 256 Mbytes NAND Flash
> >  - 256 Mbytes SRAM
>
> SRAM or DDR?

Sorry, DRAM DDR2

>
> >  - LCD-TFT controller
>
> The LCD support is not described in the dts.

Yes, you're right.
The board has been in use for a long time with a 4.19 kernel. We recently bumped
it to the LTS version 6.6.69. However, for now we've had to revert commit
f225f1393f034 ("video: fbdev: mxsfb: Remove driver") along with other
custom changes
to reproduce the correct display behavior in the field. That's why we
haven't described
the LCD panel yet.
We'd like to add it only after we get it working without needing to
apply non-mainline patches.

The same goes for the sound, which is neither mentioned in the commit
description nor in the DTS.

So if you're okay with it, I will remove all references to the LCD
display — both from the commit
message and from the DTS, such as the reset pin, for example.

>
> > +/ {
> > +       model = "Amarula i.MX28 rmm";
> > +       compatible = "amarula,imx28-rmm", "fsl,imx28";
> > +
> > +       memory@40000000 {
> > +               device_type = "memory";
> > +               reg = <0x40000000 0x08000000>;
>
> In the commit log, you say 256 MB, but here we have 128 MB.

We have two models, one with 128MB and one with 256MB of RAM.
What's the recommended way to handle both cases?
Should I define a new DTS file named imx28-amarula-rmm-256mb.dts
that includes imx28-amarula-rmm.dts and override the reg property of
the memory node?

>
> > +&i2c0 {
> > +       pinctrl-names = "default";
> > +       pinctrl-0 = <&i2c0_pins_a>;
> > +       status = "okay";
> > +
> > +       polytouch: edt-ft5x06@38 {
>
> Node names should be generic: touchscreen@38

Ok

>
> > +
> > +&pinctrl {
> > +       pinctrl-names = "default";
> > +       pinctrl-0 = <&hog_pins_a>;
> > +
> > +       hog_pins_a: hog-0 {
> > +               reg = <0>;
> > +               fsl,pinmux-ids = <
> > +                       MX28_PAD_LCD_RESET__GPIO_3_30 /* LCD reset */
> > +                       MX28_PAD_SSP2_SS1__GPIO_2_20  /* External power */
>
> Proper panel bindings should better describe these pins than hog pins.

I will drop the LCD reset pin.

Thanks and regards,
Dario

>
> Do you plan to add display support?
Fabio Estevam May 23, 2025, 1:05 p.m. UTC | #6
Hi Dario,

On Wed, May 21, 2025 at 10:20 AM Dario Binacchi
<dario.binacchi@amarulasolutions.com> wrote:

> So if you're okay with it, I will remove all references to the LCD
> display — both from the commit
> message and from the DTS, such as the reset pin, for example.

Yes, that's OK.

> We have two models, one with 128MB and one with 256MB of RAM.
> What's the recommended way to handle both cases?
> Should I define a new DTS file named imx28-amarula-rmm-256mb.dts
> that includes imx28-amarula-rmm.dts and override the reg property of
> the memory node?

Or maybe you can describe 128MB in the dts and let the bootloader run
a fixup on the memory size, adjusting it if needed?

To unsubscribe from this group and stop receiving emails from it, send an email to linux-amarula+unsubscribe@amarulasolutions.com.

Patch

diff --git a/arch/arm/boot/dts/nxp/mxs/Makefile b/arch/arm/boot/dts/nxp/mxs/Makefile
index 96dd31ea19ba..d72ba702b6fa 100644
--- a/arch/arm/boot/dts/nxp/mxs/Makefile
+++ b/arch/arm/boot/dts/nxp/mxs/Makefile
@@ -5,6 +5,7 @@  dtb-$(CONFIG_ARCH_MXS) += \
 	imx23-sansa.dtb \
 	imx23-stmp378x_devb.dtb \
 	imx23-xfi3.dtb \
+	imx28-amarula-rmm.dtb \
 	imx28-apf28.dtb \
 	imx28-apf28dev.dtb \
 	imx28-apx4devkit.dtb \
diff --git a/arch/arm/boot/dts/nxp/mxs/imx28-amarula-rmm.dts b/arch/arm/boot/dts/nxp/mxs/imx28-amarula-rmm.dts
new file mode 100644
index 000000000000..ce6b34e35e1c
--- /dev/null
+++ b/arch/arm/boot/dts/nxp/mxs/imx28-amarula-rmm.dts
@@ -0,0 +1,302 @@ 
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright (C) 2025 Amarula Solutions, Dario Binacchi <dario.binacchi@amarulasolutions.com>
+ */
+
+/dts-v1/;
+#include "imx28.dtsi"
+#include <dt-bindings/gpio/gpio.h>
+#include <dt-bindings/interrupt-controller/irq.h>
+
+/ {
+	model = "Amarula i.MX28 rmm";
+	compatible = "amarula,imx28-rmm", "fsl,imx28";
+
+	memory@40000000 {
+		device_type = "memory";
+		reg = <0x40000000 0x08000000>;
+	};
+
+	reg_5v: regulator-5v {
+		compatible = "regulator-fixed";
+		regulator-name = "5v";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		regulator-always-on;
+	};
+
+	reg_3v3: regulator-3v3 {
+		compatible = "regulator-fixed";
+		regulator-name = "3v3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		regulator-always-on;
+	};
+
+	reg_1v8: regulator-1v8 {
+		compatible = "regulator-fixed";
+		regulator-name = "1v8";
+		regulator-min-microvolt = <1800000>;
+		regulator-max-microvolt = <1800000>;
+	};
+
+	reg_fec_3v3: regulator-fec-3v3 {
+		compatible = "regulator-fixed";
+		pinctrl-names = "default";
+		pinctrl-0 = <&fec_3v3_enable_pin>;
+		regulator-name = "fec-3v3";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		gpios = <&gpio3 27 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		startup-delay-us = <300000>;
+		vin-supply = <&reg_5v>;
+	};
+
+	reg_usb0_vbus: regulator-usb0-vbus {
+		compatible = "regulator-fixed";
+		pinctrl-names = "default";
+		pinctrl-0 = <&usb0_vbus_enable_pin>;
+		regulator-name = "usb0_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio2 5 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		regulator-always-on;
+	};
+
+	reg_usb1_vbus: regulator-usb1-vbus {
+		compatible = "regulator-fixed";
+		pinctrl-names = "default";
+		pinctrl-0 = <&usb1_vbus_enable_pin>;
+		regulator-name = "usb1_vbus";
+		regulator-min-microvolt = <5000000>;
+		regulator-max-microvolt = <5000000>;
+		gpio = <&gpio2 6 GPIO_ACTIVE_HIGH>;
+		enable-active-high;
+		regulator-always-on;
+	};
+
+	backlight {
+		compatible = "pwm-backlight";
+		pwms = <&pwm 4 5000000 0>;
+		brightness-levels = <0 255>;
+		num-interpolated-steps = <255>;
+		default-brightness-level = <255>;
+		power-supply = <&reg_5v>;
+	};
+
+	beeper {
+		compatible = "pwm-beeper";
+		pwms = <&pwm 7 100000 0>;
+	};
+
+	leds {
+		compatible = "gpio-leds";
+		pinctrl-names = "default";
+		pinctrl-0 = <&leds_pins>;
+
+		led-0 {
+			label = "status";
+			gpios = <&gpio2 7 GPIO_ACTIVE_HIGH>;
+			default-state = "off";
+		};
+
+		led-1 {
+			label = "x22_5";
+			gpios = <&gpio3 16 GPIO_ACTIVE_HIGH>;
+			default-state = "off";
+		};
+
+		led-2 {
+			label = "x22_4";
+			gpios = <&gpio3 17 GPIO_ACTIVE_HIGH>;
+			default-state = "off";
+		};
+	};
+};
+
+&auart0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&auart0_2pins_a>;
+	status = "okay";
+};
+
+&auart1 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&auart1_pins_a>;
+	status = "okay";
+};
+
+&can0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&can0_pins_a>;
+	xceiver-supply = <&reg_3v3>;
+	status = "okay";
+};
+
+&duart {
+	pinctrl-names = "default";
+	pinctrl-0 = <&duart_pins_b>;
+	status = "okay";
+};
+
+&duart_pins_b {
+	fsl,voltage = <MXS_VOLTAGE_LOW>;
+};
+
+&gpmi {
+	pinctrl-names = "default";
+	pinctrl-0 = <&gpmi_pins_a &gpmi_status_cfg>;
+	status = "okay";
+};
+
+&i2c0 {
+	pinctrl-names = "default";
+	pinctrl-0 = <&i2c0_pins_a>;
+	status = "okay";
+
+	polytouch: edt-ft5x06@38 {
+		compatible = "edt,edt-ft5x06";
+		reg = <0x38>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&edt_ft5x06_pins &edt_ft5x06_wake_pin>;
+		interrupt-parent = <&gpio0>;
+		interrupts = <19 IRQ_TYPE_EDGE_RISING>;
+		reset-gpios = <&gpio0 21 GPIO_ACTIVE_LOW>;
+		wake-gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>;
+	};
+};
+
+&lradc {
+	status = "okay";
+};
+
+&mac0 {
+	phy-mode = "rmii";
+	pinctrl-names = "default";
+	pinctrl-0 = <&mac0_pins_a>;
+	phy-supply = <&reg_fec_3v3>;
+	phy-handle = <&ethphy>;
+	status = "okay";
+
+	mdio {
+		#address-cells = <1>;
+		#size-cells = <0>;
+
+		ethphy: ethernet-phy@0 {
+			compatible = "ethernet-phy-ieee802.3-c22";
+			reg = <0>;
+			max-speed = <100>;
+			reset-gpios = <&gpio3 28 GPIO_ACTIVE_LOW>;
+			reset-assert-us = <4000>;
+			reset-deassert-us = <4000>;
+		};
+	};
+};
+
+&pinctrl {
+	pinctrl-names = "default";
+	pinctrl-0 = <&hog_pins_a>;
+
+	hog_pins_a: hog-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <
+			MX28_PAD_LCD_RESET__GPIO_3_30 /* LCD reset */
+			MX28_PAD_SSP2_SS1__GPIO_2_20  /* External power */
+		>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+
+	edt_ft5x06_pins: edt-ft5x06-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <
+			MX28_PAD_GPMI_RDY1__GPIO_0_21 /* Reset */
+			MX28_PAD_GPMI_CE3N__GPIO_0_19 /* Interrupt */
+		>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_ENABLE>;
+	};
+
+	edt_ft5x06_wake_pin: edt-ft5x06-wake-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <MX28_PAD_GPMI_CE2N__GPIO_0_18>;
+		fsl,drive-strength = <MXS_DRIVE_16mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+
+	fec_3v3_enable_pin: fec-3v3-enable-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <MX28_PAD_SPDIF__GPIO_3_27>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+
+	leds_pins: leds-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <
+			MX28_PAD_SSP0_DATA7__GPIO_2_7
+			MX28_PAD_PWM0__GPIO_3_16
+			MX28_PAD_PWM1__GPIO_3_17
+		>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+
+	usb0_vbus_enable_pin: usb0-vbus-enable-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <MX28_PAD_SSP0_DATA5__GPIO_2_5>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+
+	usb1_vbus_enable_pin: usb1-vbus-enable-0 {
+		reg = <0>;
+		fsl,pinmux-ids = <MX28_PAD_SSP0_DATA6__GPIO_2_6>;
+		fsl,drive-strength = <MXS_DRIVE_4mA>;
+		fsl,voltage = <MXS_VOLTAGE_HIGH>;
+		fsl,pull-up = <MXS_PULL_DISABLE>;
+	};
+};
+
+&pwm {
+	pinctrl-names = "default";
+	pinctrl-0 = <&pwm4_pins_a &pwm7_pins_a>;
+	status = "okay";
+};
+
+&ssp0 {
+	compatible = "fsl,imx28-mmc";
+	pinctrl-names = "default";
+	pinctrl-0 = <&mmc0_4bit_pins_a &mmc0_sck_cfg>;
+	status = "okay";
+	bus-width = <4>;
+	broken-cd;
+};
+
+&usb0 {
+	status = "okay";
+	vbus-supply = <&reg_usb0_vbus>;
+	dr_mode = "host";
+};
+
+&usb1 {
+	status = "okay";
+	vbus-supply = <&reg_usb1_vbus>;
+	dr_mode = "host";
+};
+
+&usbphy0 {
+	status = "okay";
+};
+
+&usbphy1 {
+	status = "okay";
+};