This adds timings for the RGB666 variant of the Innolux AT070TN90 panel, as found on the Ainol AW1 tablet.
The panel also supports RGB888 output. When RGB666 mode is used instead, the two extra lanes per component are grounded.
In the future, it might become necessary to introduce a dedicated device-tree property to specify the bus format and maybe specify it in the mode description instead of panel description so that the appropriate mode can be selected for each bus format.
Signed-off-by: Paul Kocialkowski contact@paulk.fr --- drivers/gpu/drm/panel/panel-simple.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index cbf1ab404ee7..351742df8ee1 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -1086,6 +1086,29 @@ static const struct panel_desc innolux_at070tn92 = { .bus_format = MEDIA_BUS_FMT_RGB888_1X24, };
+static const struct drm_display_mode innolux_at070tn90_mode = { + .clock = 40000, + .hdisplay = 800, + .hsync_start = 800 + 112, + .hsync_end = 800 + 112 + 1, + .htotal = 800 + 112 + 1 + 87, + .vdisplay = 480, + .vsync_start = 480 + 141, + .vsync_end = 480 + 141 + 1, + .vtotal = 480 + 141 + 1 + 38, + .vrefresh = 60, +}; + +static const struct panel_desc innolux_at070tn90 = { + .modes = &innolux_at070tn90_mode, + .num_modes = 1, + .size = { + .width = 154, + .height = 86, + }, + .bus_format = MEDIA_BUS_FMT_RGB666_1X18, +}; + static const struct display_timing innolux_g101ice_l01_timing = { .pixelclock = { 60400000, 71100000, 74700000 }, .hactive = { 1280, 1280, 1280 }, @@ -2154,6 +2177,9 @@ static const struct of_device_id platform_of_match[] = { }, { .compatible = "innolux,at070tn92", .data = &innolux_at070tn92, + }, { + .compatible = "innolux,at070tn90", + .data = &innolux_at070tn90, }, { .compatible ="innolux,g101ice-l01", .data = &innolux_g101ice_l01
This adds the pins definition for RGB666 LCD panels on the A20. It was inspired by the A33 definition, that concernes the same set of pins.
Signed-off-by: Paul Kocialkowski contact@paulk.fr --- arch/arm/boot/dts/sun7i-a20.dtsi | 8 ++++++++ 1 file changed, 8 insertions(+)
diff --git a/arch/arm/boot/dts/sun7i-a20.dtsi b/arch/arm/boot/dts/sun7i-a20.dtsi index e529e4ff2174..b3ee36cd7fa7 100644 --- a/arch/arm/boot/dts/sun7i-a20.dtsi +++ b/arch/arm/boot/dts/sun7i-a20.dtsi @@ -781,6 +781,14 @@ function = "ir1"; };
+ lcd0_rgb666_pins: lcd0-rgb666 { + pins = "PD2", "PD3", "PD4", "PD5", "PD6", "PD7", + "PD10", "PD11", "PD12", "PD13", "PD14", "PD15", + "PD18", "PD19", "PD20", "PD21", "PD22", "PD23", + "PD24", "PD25", "PD26", "PD27"; + function = "lcd0"; + }; + mmc0_pins_a: mmc0@0 { pins = "PF0", "PF1", "PF2", "PF3", "PF4", "PF5";
This adds support for the Ainol AW1, an A20-based 7" tablet from Ainol.
The following board-specific features are supported: * LCD panel * Backlight * USB OTG * Buttons * Touchscreen (doesn't work without non-free firmware) * Accelerometer * Battery
The following are untested: * Audio output * Audio speakers * USB via SPCI connector
The following are not supported: * Wi-Fi * Bluetooth * NAND * Audio via SPCI connector * Audio via Bluetooth I2S
Signed-off-by: Paul Kocialkowski contact@paulk.fr --- arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts | 275 ++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 7e2424957809..4a80971f2bc9 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -946,6 +946,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \ sun6i-a31s-sinovoip-bpi-m2.dtb \ sun6i-a31s-yones-toptech-bs1078-v2.dtb dtb-$(CONFIG_MACH_SUN7I) += \ + sun7i-a20-ainol-aw1.dtb \ sun7i-a20-bananapi.dtb \ sun7i-a20-bananapi-m1-plus.dtb \ sun7i-a20-bananapro.dtb \ diff --git a/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts new file mode 100644 index 000000000000..9a1d54a9f9a0 --- /dev/null +++ b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts @@ -0,0 +1,275 @@ +/* + * Copyright (C) 2018 Paul Kocialkowski contact@paulk.fr + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +/dts-v1/; +#include "sun7i-a20.dtsi" +#include "sunxi-common-regulators.dtsi" + +#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/pwm/pwm.h> + +/ { + model = "Ainol AW1"; + compatible = "ainol,ainol-aw1", "allwinner,sun7i-a20"; + + aliases { + serial0 = &uart0; + }; + + chosen { + stdout-path = "serial0:115200n8"; + }; + + backlight: backlight { + compatible = "pwm-backlight"; + pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>; + brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>; + default-brightness-level = <5>; + enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */ + }; + + panel: panel { + compatible = "innolux,at070tn90"; + #address-cells = <1>; + #size-cells = <0>; + power-supply = <&panel_power>; + backlight = <&backlight>; + + port@0 { + reg = <0>; + #address-cells = <1>; + #size-cells = <0>; + + panel_input: endpoint@0 { + reg = <0>; + remote-endpoint = <&tcon0_out_panel>; + }; + }; + }; + + panel_power: panel_power { + compatible = "regulator-fixed"; + pinctrl-names = "default"; + pinctrl-0 = <&panel_power_pin>; + regulator-name = "panel-power"; + regulator-min-microvolt = <10400000>; + regulator-max-microvolt = <10400000>; + gpio = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */ + enable-active-high; + regulator-boot-on; + }; +}; + +&codec { + allwinner,pa-gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */ + status = "okay"; +}; + +&cpu0 { + cpu-supply = <®_dcdc2>; +}; + +&de { + status = "okay"; +}; + +&ehci0 { + status = "okay"; +}; + +&ehci1 { + status = "okay"; +}; + +&i2c0 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c0_pins_a>; + status = "okay"; + + axp209: pmic@34 { + reg = <0x34>; + interrupt-parent = <&nmi_intc>; + interrupts = <0 IRQ_TYPE_LEVEL_LOW>; + }; +}; + +&i2c1 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c1_pins_a>; + status = "okay"; + + lis3dh: accelerometer@18 { + compatible = "st,lis3dh-accel"; + reg = <0x18>; + vdd-supply = <®_vcc3v3>; + vddio-supply = <®_vcc3v3>; + st,drdy-int-pin = <1>; + }; +}; + +&i2c2 { + pinctrl-names = "default"; + pinctrl-0 = <&i2c2_pins_a>; + status = "okay"; + clock-frequency = <400000>; + + gsl1680: touchscreen@40 { + compatible = "silead,gsl1680"; + reg = <0x40>; + interrupt-parent = <&pio>; + interrupts = <7 21 IRQ_TYPE_EDGE_FALLING>; /* EINT21 (PH21) */ + power-gpios = <&pio 7 20 GPIO_ACTIVE_HIGH>; /* PH20 */ + firmware-name = "gsl1680-ainol-aw1.fw"; + touchscreen-size-x = <480>; + touchscreen-size-y = <800>; + touchscreen-swapped-x-y; + touchscreen-inverted-y; + silead,max-fingers = <5>; + }; +}; + +&lradc { + vref-supply = <®_ldo2>; + status = "okay"; + + button@571 { + label = "Volume Up"; + linux,code = <KEY_VOLUMEUP>; + channel = <0>; + voltage = <571428>; + }; + + button@761 { + label = "Volume Down"; + linux,code = <KEY_VOLUMEDOWN>; + channel = <0>; + voltage = <761904>; + }; + + button@952 { + label = "Home"; + linux,code = <KEY_HOME>; + channel = <0>; + voltage = <952380>; + }; +}; + +&mmc0 { + pinctrl-names = "default"; + pinctrl-0 = <&mmc0_pins_a>; + vmmc-supply = <®_vcc3v3>; + bus-width = <4>; + cd-gpios = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */ + cd-inverted; + status = "okay"; +}; + +&ohci0 { + status = "okay"; +}; + +&ohci1 { + status = "okay"; +}; + +&otg_sram { + status = "okay"; +}; + +&pio { + panel_power_pin: panel_power_pin@0 { + pins = "PH8"; + function = "gpio_out"; + }; +}; + +&pwm { + pinctrl-names = "default"; + pinctrl-0 = <&pwm0_pins_a>; + status = "okay"; +}; + +&tcon0 { + pinctrl-names = "default"; + pinctrl-0 = <&lcd0_rgb666_pins>; + status = "okay"; +}; + +&tcon0_out { + tcon0_out_panel: endpoint@0 { + reg = <0>; + remote-endpoint = <&panel_input>; + }; +}; + +&uart0 { + pinctrl-names = "default"; + pinctrl-0 = <&uart0_pins_a>; + status = "okay"; +}; + +&usb_otg { + dr_mode = "otg"; + status = "okay"; +}; + +&usbphy { + usb0_id_det-gpio = <&pio 7 4 GPIO_ACTIVE_HIGH>; /* PH4 */ + usb0_vbus_power-supply = <&usb_power_supply>; + usb0_vbus-supply = <®_usb0_vbus>; + usb1_vbus-supply = <®_usb1_vbus>; + usb2_vbus-supply = <®_usb2_vbus>; + status = "okay"; +}; + +#include "axp209.dtsi" + +&battery_power_supply { + status = "okay"; +}; + +®_dcdc2 { + regulator-always-on; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1450000>; + regulator-name = "vdd-cpu"; +}; + +®_dcdc3 { + regulator-always-on; + regulator-min-microvolt = <1000000>; + regulator-max-microvolt = <1400000>; + regulator-name = "vdd-int-dll"; +}; + +®_ldo1 { + regulator-name = "vdd-rtc"; +}; + +®_ldo2 { + regulator-always-on; + regulator-min-microvolt = <3000000>; + regulator-max-microvolt = <3000000>; + regulator-name = "avcc"; +}; + +®_usb0_vbus { + status = "okay"; +}; + +®_usb1_vbus { + status = "okay"; +}; + +®_usb2_vbus { + status = "okay"; +}; + +&usb_power_supply { + status = "okay"; +};
Hi,
On Sun, May 06, 2018 at 11:49:01PM +0200, Paul Kocialkowski wrote:
This adds support for the Ainol AW1, an A20-based 7" tablet from Ainol.
The following board-specific features are supported:
- LCD panel
- Backlight
- USB OTG
- Buttons
- Touchscreen (doesn't work without non-free firmware)
- Accelerometer
- Battery
The following are untested:
- Audio output
- Audio speakers
- USB via SPCI connector
The following are not supported:
- Wi-Fi
- Bluetooth
- NAND
- Audio via SPCI connector
- Audio via Bluetooth I2S
Signed-off-by: Paul Kocialkowski contact@paulk.fr
arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts | 275 ++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 7e2424957809..4a80971f2bc9 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -946,6 +946,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \ sun6i-a31s-sinovoip-bpi-m2.dtb \ sun6i-a31s-yones-toptech-bs1078-v2.dtb dtb-$(CONFIG_MACH_SUN7I) += \
- sun7i-a20-ainol-aw1.dtb \ sun7i-a20-bananapi.dtb \ sun7i-a20-bananapi-m1-plus.dtb \ sun7i-a20-bananapro.dtb \
diff --git a/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts new file mode 100644 index 000000000000..9a1d54a9f9a0 --- /dev/null +++ b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts @@ -0,0 +1,275 @@ +/*
- Copyright (C) 2018 Paul Kocialkowski contact@paulk.fr
- SPDX-License-Identifier: GPL-2.0+
This should be your first line. Also, we usually license our DT under a dual license (GPL and MIT) so that other projects (like FreeBSD) can use them as well, instead of duplicating them. It would be great if you'd consider it.
- */
+/dts-v1/; +#include "sun7i-a20.dtsi" +#include "sunxi-common-regulators.dtsi"
+#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/pwm/pwm.h>
+/ {
- model = "Ainol AW1";
- compatible = "ainol,ainol-aw1", "allwinner,sun7i-a20";
- aliases {
serial0 = &uart0;
- };
- chosen {
stdout-path = "serial0:115200n8";
- };
- backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
The increase in perceived brightness should be linear. Usually, for PWMs backed backlight, an exponential list is a much better approximation.
default-brightness-level = <5>;
enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
- };
- panel: panel {
compatible = "innolux,at070tn90";
#address-cells = <1>;
#size-cells = <0>;
power-supply = <&panel_power>;
backlight = <&backlight>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
panel_input: endpoint@0 {
reg = <0>;
remote-endpoint = <&tcon0_out_panel>;
};
};
- };
- panel_power: panel_power {
compatible = "regulator-fixed";
pinctrl-names = "default";
pinctrl-0 = <&panel_power_pin>;
regulator-name = "panel-power";
regulator-min-microvolt = <10400000>;
regulator-max-microvolt = <10400000>;
gpio = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
enable-active-high;
regulator-boot-on;
- };
+};
+&codec {
- allwinner,pa-gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
- status = "okay";
+};
+&cpu0 {
- cpu-supply = <®_dcdc2>;
+};
+&de {
- status = "okay";
+};
+&ehci0 {
- status = "okay";
+};
+&ehci1 {
- status = "okay";
+};
+&i2c0 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c0_pins_a>;
- status = "okay";
- axp209: pmic@34 {
reg = <0x34>;
interrupt-parent = <&nmi_intc>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
- };
+};
+&i2c1 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c1_pins_a>;
- status = "okay";
- lis3dh: accelerometer@18 {
compatible = "st,lis3dh-accel";
reg = <0x18>;
vdd-supply = <®_vcc3v3>;
vddio-supply = <®_vcc3v3>;
st,drdy-int-pin = <1>;
- };
+};
+&i2c2 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c2_pins_a>;
- status = "okay";
- clock-frequency = <400000>;
- gsl1680: touchscreen@40 {
compatible = "silead,gsl1680";
reg = <0x40>;
interrupt-parent = <&pio>;
interrupts = <7 21 IRQ_TYPE_EDGE_FALLING>; /* EINT21 (PH21) */
power-gpios = <&pio 7 20 GPIO_ACTIVE_HIGH>; /* PH20 */
firmware-name = "gsl1680-ainol-aw1.fw";
touchscreen-size-x = <480>;
touchscreen-size-y = <800>;
touchscreen-swapped-x-y;
touchscreen-inverted-y;
silead,max-fingers = <5>;
- };
+};
+&lradc {
- vref-supply = <®_ldo2>;
- status = "okay";
- button@571 {
label = "Volume Up";
linux,code = <KEY_VOLUMEUP>;
channel = <0>;
voltage = <571428>;
- };
- button@761 {
label = "Volume Down";
linux,code = <KEY_VOLUMEDOWN>;
channel = <0>;
voltage = <761904>;
- };
- button@952 {
label = "Home";
linux,code = <KEY_HOME>;
channel = <0>;
voltage = <952380>;
- };
+};
+&mmc0 {
- pinctrl-names = "default";
- pinctrl-0 = <&mmc0_pins_a>;
- vmmc-supply = <®_vcc3v3>;
You have the regulators described in your DT, you'd better use them instead of the one coming from sunxi-common-regulators.dtsi.
- bus-width = <4>;
- cd-gpios = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */
- cd-inverted;
- status = "okay";
+};
+&ohci0 {
- status = "okay";
+};
+&ohci1 {
- status = "okay";
+};
+&otg_sram {
- status = "okay";
+};
+&pio {
- panel_power_pin: panel_power_pin@0 {
pins = "PH8";
function = "gpio_out";
- };
+};
You don't need that pinctrl node.
Maxime
Hi,
Le lundi 07 mai 2018 à 09:19 +0200, Maxime Ripard a écrit :
Hi,
On Sun, May 06, 2018 at 11:49:01PM +0200, Paul Kocialkowski wrote:
This adds support for the Ainol AW1, an A20-based 7" tablet from Ainol.
The following board-specific features are supported:
- LCD panel
- Backlight
- USB OTG
- Buttons
- Touchscreen (doesn't work without non-free firmware)
- Accelerometer
- Battery
The following are untested:
- Audio output
- Audio speakers
- USB via SPCI connector
The following are not supported:
- Wi-Fi
- Bluetooth
- NAND
- Audio via SPCI connector
- Audio via Bluetooth I2S
Signed-off-by: Paul Kocialkowski contact@paulk.fr
arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts | 275 ++++++++++++++++++++++ 2 files changed, 276 insertions(+) create mode 100644 arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts
diff --git a/arch/arm/boot/dts/Makefile b/arch/arm/boot/dts/Makefile index 7e2424957809..4a80971f2bc9 100644 --- a/arch/arm/boot/dts/Makefile +++ b/arch/arm/boot/dts/Makefile @@ -946,6 +946,7 @@ dtb-$(CONFIG_MACH_SUN6I) += \ sun6i-a31s-sinovoip-bpi-m2.dtb \ sun6i-a31s-yones-toptech-bs1078-v2.dtb dtb-$(CONFIG_MACH_SUN7I) += \
- sun7i-a20-ainol-aw1.dtb \ sun7i-a20-bananapi.dtb \ sun7i-a20-bananapi-m1-plus.dtb \ sun7i-a20-bananapro.dtb \
diff --git a/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts new file mode 100644 index 000000000000..9a1d54a9f9a0 --- /dev/null +++ b/arch/arm/boot/dts/sun7i-a20-ainol-aw1.dts @@ -0,0 +1,275 @@ +/*
- Copyright (C) 2018 Paul Kocialkowski contact@paulk.fr
- SPDX-License-Identifier: GPL-2.0+
This should be your first line.
Alright then. For reference, I based this off sun8i-h3-libretech-all-h3- cc.dts, that has the copyright first.
Also, we usually license our DT under a dual license (GPL and MIT) so that other projects (like FreeBSD) can use them as well, instead of duplicating them. It would be great if you'd consider it.
Ah, I didn't think of BSD-licensed systems like FreeBSD off-hand.
Since they are apparently working on ARM support, it's probably worth publishing this under a non-copyleft license.
- */
+/dts-v1/; +#include "sun7i-a20.dtsi" +#include "sunxi-common-regulators.dtsi"
+#include <dt-bindings/gpio/gpio.h> +#include <dt-bindings/input/input.h> +#include <dt-bindings/interrupt-controller/irq.h> +#include <dt-bindings/pwm/pwm.h>
+/ {
- model = "Ainol AW1";
- compatible = "ainol,ainol-aw1", "allwinner,sun7i-a20";
- aliases {
serial0 = &uart0;
- };
- chosen {
stdout-path = "serial0:115200n8";
- };
- backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
The increase in perceived brightness should be linear. Usually, for PWMs backed backlight, an exponential list is a much better approximation.
Thanks for the hint, it never occurred to me that pwm duty cycle was not linear with brightness, but that makes sense. I'll give that a try (on 255 values instead of 10 to keep some level of precision in low brightness). The way to go here is probably use a base-255 logarithm such as: duty cycle = range * log(i+1)/log(255) with i the linear brightness value (0 to 255) and range the amplitude of our values (that gets divided by the maximum brightness, so it's really up to hardware precision at this point). I'll go with a range of 255 as well.
default-brightness-level = <5>;
enable-gpios = <&pio 7 7 GPIO_ACTIVE_HIGH>; /* PH7 */
- };
- panel: panel {
compatible = "innolux,at070tn90";
#address-cells = <1>;
#size-cells = <0>;
power-supply = <&panel_power>;
backlight = <&backlight>;
port@0 {
reg = <0>;
#address-cells = <1>;
#size-cells = <0>;
panel_input: endpoint@0 {
reg = <0>;
remote-endpoint = <&tcon0_out_panel>;
};
};
- };
- panel_power: panel_power {
compatible = "regulator-fixed";
pinctrl-names = "default";
pinctrl-0 = <&panel_power_pin>;
regulator-name = "panel-power";
regulator-min-microvolt = <10400000>;
regulator-max-microvolt = <10400000>;
gpio = <&pio 7 8 GPIO_ACTIVE_HIGH>; /* PH8 */
enable-active-high;
regulator-boot-on;
- };
+};
+&codec {
- allwinner,pa-gpios = <&pio 7 15 GPIO_ACTIVE_HIGH>; /* PH15 */
- status = "okay";
+};
+&cpu0 {
- cpu-supply = <®_dcdc2>;
+};
+&de {
- status = "okay";
+};
+&ehci0 {
- status = "okay";
+};
+&ehci1 {
- status = "okay";
+};
+&i2c0 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c0_pins_a>;
- status = "okay";
- axp209: pmic@34 {
reg = <0x34>;
interrupt-parent = <&nmi_intc>;
interrupts = <0 IRQ_TYPE_LEVEL_LOW>;
- };
+};
+&i2c1 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c1_pins_a>;
- status = "okay";
- lis3dh: accelerometer@18 {
compatible = "st,lis3dh-accel";
reg = <0x18>;
vdd-supply = <®_vcc3v3>;
vddio-supply = <®_vcc3v3>;
st,drdy-int-pin = <1>;
- };
+};
+&i2c2 {
- pinctrl-names = "default";
- pinctrl-0 = <&i2c2_pins_a>;
- status = "okay";
- clock-frequency = <400000>;
- gsl1680: touchscreen@40 {
compatible = "silead,gsl1680";
reg = <0x40>;
interrupt-parent = <&pio>;
interrupts = <7 21 IRQ_TYPE_EDGE_FALLING>; /* EINT21 (PH21) */
power-gpios = <&pio 7 20 GPIO_ACTIVE_HIGH>; /* PH20 */
firmware-name = "gsl1680-ainol-aw1.fw";
touchscreen-size-x = <480>;
touchscreen-size-y = <800>;
touchscreen-swapped-x-y;
touchscreen-inverted-y;
silead,max-fingers = <5>;
- };
+};
+&lradc {
- vref-supply = <®_ldo2>;
- status = "okay";
- button@571 {
label = "Volume Up";
linux,code = <KEY_VOLUMEUP>;
channel = <0>;
voltage = <571428>;
- };
- button@761 {
label = "Volume Down";
linux,code = <KEY_VOLUMEDOWN>;
channel = <0>;
voltage = <761904>;
- };
- button@952 {
label = "Home";
linux,code = <KEY_HOME>;
channel = <0>;
voltage = <952380>;
- };
+};
+&mmc0 {
- pinctrl-names = "default";
- pinctrl-0 = <&mmc0_pins_a>;
- vmmc-supply = <®_vcc3v3>;
You have the regulators described in your DT, you'd better use them instead of the one coming from sunxi-common-regulators.dtsi.
Well, according to the reference A20 design, the mmc pins and the card are powered by the 3.3V power rail, that comes from a regular step-down regulator sourcing from IPSOUT, so I don't see what regulator I should better use. Do you have a suggestion?
- bus-width = <4>;
- cd-gpios = <&pio 7 1 GPIO_ACTIVE_HIGH>; /* PH1 */
- cd-inverted;
- status = "okay";
+};
+&ohci0 {
- status = "okay";
+};
+&ohci1 {
- status = "okay";
+};
+&otg_sram {
- status = "okay";
+};
+&pio {
- panel_power_pin: panel_power_pin@0 {
pins = "PH8";
function = "gpio_out";
- };
+};
You don't need that pinctrl node.
I'll get rid of it then. You mentioned that regulator-simple uses the old GPIO API, so I assumed it meant that a pinctrl node is still needed. For reference, it uses of_get_named_gpio (not the devm-managed fashion).
Cheers,
Paul
On Mon, May 07, 2018 at 10:15:46PM +0200, Paul Kocialkowski wrote:
- backlight: backlight {
compatible = "pwm-backlight";
pwms = <&pwm 0 50000 PWM_POLARITY_INVERTED>;
brightness-levels = <0 10 20 30 40 50 60 70 80 90 100>;
The increase in perceived brightness should be linear. Usually, for PWMs backed backlight, an exponential list is a much better approximation.
Thanks for the hint, it never occurred to me that pwm duty cycle was not linear with brightness, but that makes sense. I'll give that a try (on 255 values instead of 10 to keep some level of precision in low brightness). The way to go here is probably use a base-255 logarithm such as: duty cycle = range * log(i+1)/log(255) with i the linear brightness value (0 to 255) and range the amplitude of our values (that gets divided by the maximum brightness, so it's really up to hardware precision at this point). I'll go with a range of 255 as well.
Without going into something so complicated, usually a list with power of two ending at 255 is a good approximation :)
+&mmc0 {
- pinctrl-names = "default";
- pinctrl-0 = <&mmc0_pins_a>;
- vmmc-supply = <®_vcc3v3>;
You have the regulators described in your DT, you'd better use them instead of the one coming from sunxi-common-regulators.dtsi.
Well, according to the reference A20 design, the mmc pins and the card are powered by the 3.3V power rail, that comes from a regular step-down regulator sourcing from IPSOUT, so I don't see what regulator I should better use. Do you have a suggestion?
That works for me then.
+&pio {
- panel_power_pin: panel_power_pin@0 {
pins = "PH8";
function = "gpio_out";
- };
+};
You don't need that pinctrl node.
I'll get rid of it then. You mentioned that regulator-simple uses the old GPIO API, so I assumed it meant that a pinctrl node is still needed. For reference, it uses of_get_named_gpio (not the devm-managed fashion).
This is only relevant for the polarity of the pins, not the pinctrl part.
Maxime
Hi,
On Sun, May 06, 2018 at 11:48:59PM +0200, Paul Kocialkowski wrote:
This adds timings for the RGB666 variant of the Innolux AT070TN90 panel, as found on the Ainol AW1 tablet.
The panel also supports RGB888 output. When RGB666 mode is used instead, the two extra lanes per component are grounded.
In the future, it might become necessary to introduce a dedicated device-tree property to specify the bus format and maybe specify it in the mode description instead of panel description so that the appropriate mode can be selected for each bus format.
Signed-off-by: Paul Kocialkowski contact@paulk.fr
A change log would be nice. Also, you mentionned in your first version that the screen was an AT070TN92, and now you mention that it is an AT070TN90, which one is it?
Maxime
drivers/gpu/drm/panel/panel-simple.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index cbf1ab404ee7..351742df8ee1 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -1086,6 +1086,29 @@ static const struct panel_desc innolux_at070tn92 = { .bus_format = MEDIA_BUS_FMT_RGB888_1X24, };
+static const struct drm_display_mode innolux_at070tn90_mode = {
- .clock = 40000,
- .hdisplay = 800,
- .hsync_start = 800 + 112,
- .hsync_end = 800 + 112 + 1,
- .htotal = 800 + 112 + 1 + 87,
- .vdisplay = 480,
- .vsync_start = 480 + 141,
- .vsync_end = 480 + 141 + 1,
- .vtotal = 480 + 141 + 1 + 38,
- .vrefresh = 60,
+};
+static const struct panel_desc innolux_at070tn90 = {
- .modes = &innolux_at070tn90_mode,
- .num_modes = 1,
- .size = {
.width = 154,
.height = 86,
- },
- .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
+};
static const struct display_timing innolux_g101ice_l01_timing = { .pixelclock = { 60400000, 71100000, 74700000 }, .hactive = { 1280, 1280, 1280 }, @@ -2154,6 +2177,9 @@ static const struct of_device_id platform_of_match[] = { }, { .compatible = "innolux,at070tn92", .data = &innolux_at070tn92,
- }, {
.compatible = "innolux,at070tn90",
.data = &innolux_at070tn90,
This should be ordered alphabetically.
Maxime
Hi,
Le lundi 07 mai 2018 à 09:08 +0200, Maxime Ripard a écrit :
Hi,
On Sun, May 06, 2018 at 11:48:59PM +0200, Paul Kocialkowski wrote:
This adds timings for the RGB666 variant of the Innolux AT070TN90 panel, as found on the Ainol AW1 tablet.
The panel also supports RGB888 output. When RGB666 mode is used instead, the two extra lanes per component are grounded.
In the future, it might become necessary to introduce a dedicated device-tree property to specify the bus format and maybe specify it in the mode description instead of panel description so that the appropriate mode can be selected for each bus format.
Signed-off-by: Paul Kocialkowski contact@paulk.fr
A change log would be nice. Also, you mentionned in your first version that the screen was an AT070TN92, and now you mention that it is an AT070TN90, which one is it?
Yes, I should probably have explained why I changed the model here. I checked on the device yesterday and found that the ribbon cable indicates AT070TN90. I am not sure why I was initially assuming that the panel was an AT070TN92.
Maxime
drivers/gpu/drm/panel/panel-simple.c | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+)
diff --git a/drivers/gpu/drm/panel/panel-simple.c b/drivers/gpu/drm/panel/panel-simple.c index cbf1ab404ee7..351742df8ee1 100644 --- a/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c @@ -1086,6 +1086,29 @@ static const struct panel_desc innolux_at070tn92 = { .bus_format = MEDIA_BUS_FMT_RGB888_1X24, };
+static const struct drm_display_mode innolux_at070tn90_mode = {
- .clock = 40000,
- .hdisplay = 800,
- .hsync_start = 800 + 112,
- .hsync_end = 800 + 112 + 1,
- .htotal = 800 + 112 + 1 + 87,
- .vdisplay = 480,
- .vsync_start = 480 + 141,
- .vsync_end = 480 + 141 + 1,
- .vtotal = 480 + 141 + 1 + 38,
- .vrefresh = 60,
+};
+static const struct panel_desc innolux_at070tn90 = {
- .modes = &innolux_at070tn90_mode,
- .num_modes = 1,
- .size = {
.width = 154,
.height = 86,
- },
- .bus_format = MEDIA_BUS_FMT_RGB666_1X18,
+};
static const struct display_timing innolux_g101ice_l01_timing = { .pixelclock = { 60400000, 71100000, 74700000 }, .hactive = { 1280, 1280, 1280 }, @@ -2154,6 +2177,9 @@ static const struct of_device_id platform_of_match[] = { }, { .compatible = "innolux,at070tn92", .data = &innolux_at070tn92,
- }, {
.compatible = "innolux,at070tn90",
.data = &innolux_at070tn90,
This should be ordered alphabetically.
Thanks for the review!
Cheers,
Paul
dri-devel@lists.freedesktop.org