Merge pull request #2913 from sydarn/rgb10max3-linux-patches
Update rk3566 linux patches, rgb10max3 and adc joystick invert
This commit is contained in:
commit
dd4033362c
11 changed files with 520 additions and 359 deletions
|
@ -1,71 +0,0 @@
|
||||||
From: Chris Morgan <macroalpha82@gmail.com>
|
|
||||||
To: linux-input@vger.kernel.org
|
|
||||||
Cc: dmitry.torokhov@gmail.com, hdegoede@redhat.com,
|
|
||||||
paul@crapouillou.net, peter.hutterer@who-t.net, svv@google.com,
|
|
||||||
biswarupp@google.com, contact@artur-rojek.eu,
|
|
||||||
Chris Morgan <macromorgan@hotmail.com>
|
|
||||||
Subject: [PATCH 1/2] Input: add input_invert_abs()
|
|
||||||
Date: Sun, 31 Dec 2023 14:56:42 -0600 [thread overview]
|
|
||||||
Message-ID: <20231231205643.129435-2-macroalpha82@gmail.com> (raw)
|
|
||||||
In-Reply-To: <20231231205643.129435-1-macroalpha82@gmail.com>
|
|
||||||
|
|
||||||
From: Chris Morgan <macromorgan@hotmail.com>
|
|
||||||
|
|
||||||
Add a helper function to make it easier for a driver to invert abs
|
|
||||||
values when needed. It is up to the driver itself to track axes that
|
|
||||||
need to be inverted and normalize the data before it is passed on.
|
|
||||||
|
|
||||||
This function assumes that drivers will set the min and max values
|
|
||||||
so that min < max and then will simply call this function each time
|
|
||||||
the values need to be inverted.
|
|
||||||
|
|
||||||
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
|
||||||
---
|
|
||||||
drivers/input/input.c | 19 +++++++++++++++++++
|
|
||||||
include/linux/input.h | 1 +
|
|
||||||
2 files changed, 20 insertions(+)
|
|
||||||
|
|
||||||
diff --git a/drivers/input/input.c b/drivers/input/input.c
|
|
||||||
index 8c5fdb0f858a..f135aed165a1 100644
|
|
||||||
--- a/drivers/input/input.c
|
|
||||||
+++ b/drivers/input/input.c
|
|
||||||
@@ -552,6 +552,25 @@ void input_copy_abs(struct input_dev *dst, unsigned int dst_axis,
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(input_copy_abs);
|
|
||||||
|
|
||||||
+/**
|
|
||||||
+ * input_invert_abs - Invert the abs value for an inverted axis.
|
|
||||||
+ * @dev: Input device with absolute events
|
|
||||||
+ * @axis: ABS_* value selecting the destination axis for the event to
|
|
||||||
+ * invert.
|
|
||||||
+ * @val: Value to be inverted based on min and max values of the axis.
|
|
||||||
+ *
|
|
||||||
+ * Return an inverted value for a given ABS axis based on its min and
|
|
||||||
+ * max values.
|
|
||||||
+ */
|
|
||||||
+int input_invert_abs(struct input_dev *dev, unsigned int axis, int val)
|
|
||||||
+{
|
|
||||||
+ int min = dev->absinfo[axis].minimum;
|
|
||||||
+ int max = dev->absinfo[axis].maximum;
|
|
||||||
+
|
|
||||||
+ return (max + min) - val;
|
|
||||||
+}
|
|
||||||
+EXPORT_SYMBOL(input_invert_abs);
|
|
||||||
+
|
|
||||||
/**
|
|
||||||
* input_grab_device - grabs device for exclusive use
|
|
||||||
* @handle: input handle that wants to own the device
|
|
||||||
diff --git a/include/linux/input.h b/include/linux/input.h
|
|
||||||
index de6503c0edb8..deb5f8bb0ec7 100644
|
|
||||||
--- a/include/linux/input.h
|
|
||||||
+++ b/include/linux/input.h
|
|
||||||
@@ -477,6 +477,7 @@ void input_set_abs_params(struct input_dev *dev, unsigned int axis,
|
|
||||||
int min, int max, int fuzz, int flat);
|
|
||||||
void input_copy_abs(struct input_dev *dst, unsigned int dst_axis,
|
|
||||||
const struct input_dev *src, unsigned int src_axis);
|
|
||||||
+int input_invert_abs(struct input_dev *dev, unsigned int axis, int val);
|
|
||||||
|
|
||||||
#define INPUT_GENERATE_ABS_ACCESSORS(_suffix, _item) \
|
|
||||||
static inline int input_abs_get_##_suffix(struct input_dev *dev, \
|
|
||||||
--
|
|
||||||
2.34.1
|
|
|
@ -1,19 +1,17 @@
|
||||||
From: Chris Morgan <macroalpha82@gmail.com>
|
iiFrom: Chris Morgan <macroalpha82@gmail.com>
|
||||||
To: linux-input@vger.kernel.org
|
To: linux-input@vger.kernel.org
|
||||||
Cc: dmitry.torokhov@gmail.com, hdegoede@redhat.com,
|
Cc: contact@artur-rojek.eu, hdegoede@redhat.com,
|
||||||
paul@crapouillou.net, peter.hutterer@who-t.net, svv@google.com,
|
paul@crapouillou.net, peter.hutterer@who-t.net, svv@google.com,
|
||||||
biswarupp@google.com, contact@artur-rojek.eu,
|
biswarupp@google.com, Chris Morgan <macromorgan@hotmail.com>
|
||||||
Chris Morgan <macromorgan@hotmail.com>
|
Subject: [PATCH V4] Input: adc-joystick: Handle inverted axes
|
||||||
Subject: [PATCH 2/2] Input: adc-joystick: Handle inverted axes
|
Date: Wed, 24 Jan 2024 14:47:54 -0600 [thread overview]
|
||||||
Date: Sun, 31 Dec 2023 14:56:43 -0600 [thread overview]
|
Message-ID: <20240124204754.43982-1-macroalpha82@gmail.com> (raw)
|
||||||
Message-ID: <20231231205643.129435-3-macroalpha82@gmail.com> (raw)
|
|
||||||
In-Reply-To: <20231231205643.129435-1-macroalpha82@gmail.com>
|
|
||||||
|
|
||||||
From: Chris Morgan <macromorgan@hotmail.com>
|
From: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
|
||||||
When one or more axes are inverted, (where min > max), normalize the
|
When one or more axes are inverted, (where min > max), normalize the
|
||||||
data so that min < max and call a helper function to invert the
|
data so that min < max and invert the values reported to the input
|
||||||
values reported to the input stack.
|
stack.
|
||||||
|
|
||||||
This ensures we can continue defining the device correctly in the
|
This ensures we can continue defining the device correctly in the
|
||||||
device tree while not breaking downstream assumptions that min is
|
device tree while not breaking downstream assumptions that min is
|
||||||
|
@ -21,14 +19,34 @@ always less than max.
|
||||||
|
|
||||||
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
---
|
---
|
||||||
drivers/input/joystick/adc-joystick.c | 13 ++++++++++++-
|
Changes since V3:
|
||||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
- Add include for minmax.h.
|
||||||
|
- Use swap() instead of min_array()/max_array().
|
||||||
|
- Dropped Ack due to change.
|
||||||
|
Changes since V2:
|
||||||
|
- Explicitly set bool value to "true" instead of "1".
|
||||||
|
- Split adc_joystick_invert() function definition to 2 lines.
|
||||||
|
- Corrected changes message location.
|
||||||
|
Changes since V1:
|
||||||
|
- Moved proposed helper for inversion from input stack to adc-joystick
|
||||||
|
driver.
|
||||||
|
|
||||||
|
drivers/input/joystick/adc-joystick.c | 21 +++++++++++++++++++++
|
||||||
|
1 file changed, 21 insertions(+)
|
||||||
|
|
||||||
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c
|
diff --git a/drivers/input/joystick/adc-joystick.c b/drivers/input/joystick/adc-joystick.c
|
||||||
index c0deff5d4282..4e8d446987b6 100644
|
index c0deff5d4282..3b05b2e413d0 100644
|
||||||
--- a/drivers/input/joystick/adc-joystick.c
|
--- a/drivers/input/joystick/adc-joystick.c
|
||||||
+++ b/drivers/input/joystick/adc-joystick.c
|
+++ b/drivers/input/joystick/adc-joystick.c
|
||||||
@@ -18,6 +18,7 @@ struct adc_joystick_axis {
|
@@ -7,6 +7,7 @@
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <linux/iio/iio.h>
|
||||||
|
#include <linux/iio/consumer.h>
|
||||||
|
+#include <linux/minmax.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/property.h>
|
||||||
|
@@ -18,6 +19,7 @@ struct adc_joystick_axis {
|
||||||
s32 range[2];
|
s32 range[2];
|
||||||
s32 fuzz;
|
s32 fuzz;
|
||||||
s32 flat;
|
s32 flat;
|
||||||
|
@ -36,42 +54,52 @@ index c0deff5d4282..4e8d446987b6 100644
|
||||||
};
|
};
|
||||||
|
|
||||||
struct adc_joystick {
|
struct adc_joystick {
|
||||||
@@ -38,6 +39,8 @@ static void adc_joystick_poll(struct input_dev *input)
|
@@ -29,6 +31,15 @@ struct adc_joystick {
|
||||||
|
bool polled;
|
||||||
|
};
|
||||||
|
|
||||||
|
+static int adc_joystick_invert(struct input_dev *dev,
|
||||||
|
+ unsigned int axis, int val)
|
||||||
|
+{
|
||||||
|
+ int min = dev->absinfo[axis].minimum;
|
||||||
|
+ int max = dev->absinfo[axis].maximum;
|
||||||
|
+
|
||||||
|
+ return (max + min) - val;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static void adc_joystick_poll(struct input_dev *input)
|
||||||
|
{
|
||||||
|
struct adc_joystick *joy = input_get_drvdata(input);
|
||||||
|
@@ -38,6 +49,8 @@ static void adc_joystick_poll(struct input_dev *input)
|
||||||
ret = iio_read_channel_raw(&joy->chans[i], &val);
|
ret = iio_read_channel_raw(&joy->chans[i], &val);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return;
|
return;
|
||||||
+ if (joy->axes[i].inverted)
|
+ if (joy->axes[i].inverted)
|
||||||
+ val = input_invert_abs(input, i, val);
|
+ val = adc_joystick_invert(input, i, val);
|
||||||
input_report_abs(input, joy->axes[i].code, val);
|
input_report_abs(input, joy->axes[i].code, val);
|
||||||
}
|
}
|
||||||
input_sync(input);
|
input_sync(input);
|
||||||
@@ -86,6 +89,8 @@ static int adc_joystick_handle(const void *data, void *private)
|
@@ -86,6 +99,8 @@ static int adc_joystick_handle(const void *data, void *private)
|
||||||
val = sign_extend32(val, msb);
|
val = sign_extend32(val, msb);
|
||||||
else
|
else
|
||||||
val &= GENMASK(msb, 0);
|
val &= GENMASK(msb, 0);
|
||||||
+ if (joy->axes[i].inverted)
|
+ if (joy->axes[i].inverted)
|
||||||
+ val = input_invert_abs(joy->input, i, val);
|
+ val = adc_joystick_invert(joy->input, i, val);
|
||||||
input_report_abs(joy->input, joy->axes[i].code, val);
|
input_report_abs(joy->input, joy->axes[i].code, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -168,11 +173,17 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
|
@@ -168,6 +183,12 @@ static int adc_joystick_set_axes(struct device *dev, struct adc_joystick *joy)
|
||||||
goto err_fwnode_put;
|
goto err_fwnode_put;
|
||||||
}
|
}
|
||||||
|
|
||||||
+ if (axes[i].range[0] > axes[i].range[1]) {
|
+ if (axes[i].range[0] > axes[i].range[1]) {
|
||||||
+ dev_dbg(dev, "abs-axis %d inverted\n", i);
|
+ dev_dbg(dev, "abs-axis %d inverted\n", i);
|
||||||
+ axes[i].inverted = 1;
|
+ axes[i].inverted = true;
|
||||||
|
+ swap(axes[i].range[0], axes[i].range[1]);
|
||||||
+ }
|
+ }
|
||||||
+
|
+
|
||||||
fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
|
fwnode_property_read_u32(child, "abs-fuzz", &axes[i].fuzz);
|
||||||
fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
|
fwnode_property_read_u32(child, "abs-flat", &axes[i].flat);
|
||||||
|
|
||||||
input_set_abs_params(joy->input, axes[i].code,
|
|
||||||
- axes[i].range[0], axes[i].range[1],
|
|
||||||
+ min_array(axes[i].range, 2),
|
|
||||||
+ max_array(axes[i].range, 2),
|
|
||||||
axes[i].fuzz, axes[i].flat);
|
|
||||||
input_set_capability(joy->input, EV_ABS, axes[i].code);
|
|
||||||
}
|
|
||||||
--
|
--
|
||||||
2.34.1
|
2.34.1
|
||||||
|
|
|
@ -1,261 +0,0 @@
|
||||||
diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
|
|
||||||
index b7371afb6227..2ee31fc6bd8e 100644
|
|
||||||
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
|
||||||
@@ -79,6 +79,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg503.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.1.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.2.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb30.dtb
|
|
||||||
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb10max3.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rk2023.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-quartz64-a.dtb
|
|
||||||
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-quartz64-b.dtb
|
|
||||||
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts
|
|
||||||
new file mode 100644
|
|
||||||
index 000000000000..26884dfda818
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts
|
|
||||||
@@ -0,0 +1,40 @@
|
|
||||||
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
|
||||||
+
|
|
||||||
+/dts-v1/;
|
|
||||||
+
|
|
||||||
+#include <dt-bindings/gpio/gpio.h>
|
|
||||||
+#include <dt-bindings/input/linux-event-codes.h>
|
|
||||||
+#include <dt-bindings/pinctrl/rockchip.h>
|
|
||||||
+#include "rk3566-powkiddy-rk2023.dtsi"
|
|
||||||
+
|
|
||||||
+/ {
|
|
||||||
+ model = "Powkiddy RGB10 Max 3";
|
|
||||||
+ compatible = "powkiddy,rgb10max3", "rockchip,rk3566";
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+&cru {
|
|
||||||
+ assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>,
|
|
||||||
+ <&pmucru PLL_PPLL>, <&cru PLL_VPLL>;
|
|
||||||
+ assigned-clock-rates = <32768>, <1200000000>,
|
|
||||||
+ <200000000>, <292500000>;
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
+&dsi0 {
|
|
||||||
+ panel: panel@0 {
|
|
||||||
+ compatible = "powkiddy,rgb10max3-panel";
|
|
||||||
+ reg = <0>;
|
|
||||||
+ backlight = <&backlight>;
|
|
||||||
+ pinctrl-names = "default";
|
|
||||||
+ pinctrl-0 = <&lcd_rst>;
|
|
||||||
+ reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;
|
|
||||||
+ vcc-supply = <&vcc3v3_lcd0_n>;
|
|
||||||
+ iovcc-supply = <&vcc3v3_lcd0_n>;
|
|
||||||
+ rotation = <270>;
|
|
||||||
+
|
|
||||||
+ port {
|
|
||||||
+ mipi_in_panel: endpoint {
|
|
||||||
+ remote-endpoint = <&mipi_out_panel>;
|
|
||||||
+ };
|
|
||||||
+ };
|
|
||||||
+ };
|
|
||||||
+};
|
|
||||||
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
|
||||||
index b55bafd1a8be..e8d1730241b4 100644
|
|
||||||
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
|
||||||
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
|
||||||
@@ -58,7 +58,7 @@ struct st7703 {
|
|
||||||
struct gpio_desc *reset_gpio;
|
|
||||||
struct regulator *vcc;
|
|
||||||
struct regulator *iovcc;
|
|
||||||
- bool prepared;
|
|
||||||
+ enum drm_panel_orientation orientation;
|
|
||||||
|
|
||||||
struct dentry *debugfs;
|
|
||||||
const struct st7703_panel_desc *desc;
|
|
||||||
@@ -493,6 +493,76 @@ static int rgb30panel_init_sequence(struct st7703 *ctx)
|
|
||||||
0x13, 0x15, 0x14, 0x15, 0x10, 0x17, 0x00, 0x0a,
|
|
||||||
0x0f, 0x29, 0x3b, 0x3f, 0x42, 0x39, 0x06, 0x0d,
|
|
||||||
0x10, 0x13, 0x15, 0x14, 0x15, 0x10, 0x17);
|
|
||||||
+ return 0;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
+static int rgb10max3_init_sequence(struct st7703 *ctx)
|
|
||||||
+{
|
|
||||||
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
|
||||||
+
|
|
||||||
+ /*
|
|
||||||
+ * Init sequence was supplied by the panel vendor.
|
|
||||||
+ */
|
|
||||||
+
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC, 0xf1, 0x12, 0x83);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETAPID, 0x00, 0x00, 0x00,
|
|
||||||
+ 0xda, 0x80);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP, 0xc8, 0x02, 0x30);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF, 0x10, 0x10, 0x28,
|
|
||||||
+ 0x28, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP, 0x04, 0x04);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM, 0x78, 0x78);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT, 0x25, 0x22, 0xf0,
|
|
||||||
+ 0x63);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI, 0x33, 0x81, 0x05, 0xf9,
|
|
||||||
+ 0x0e, 0x0e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x44, 0x25, 0x00, 0x90, 0x0a, 0x00,
|
|
||||||
+ 0x00, 0x01, 0x4f, 0x01, 0x00, 0x00, 0x37);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x47);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR, 0x73, 0x73, 0x50, 0x50,
|
|
||||||
+ 0x00, 0x00, 0x12, 0x70, 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER, 0x25, 0x00, 0x32,
|
|
||||||
+ 0x32, 0x77, 0xe1, 0xff, 0xff, 0xcc, 0xcc, 0x77,
|
|
||||||
+ 0x77);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETECO, 0x82, 0x00, 0xbf, 0xff,
|
|
||||||
+ 0x00, 0xff);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETIO, 0xb8, 0x00, 0x0a, 0x00,
|
|
||||||
+ 0x00, 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCABC, 0x10, 0x40, 0x1e,
|
|
||||||
+ 0x02);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0b);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA, 0x00, 0x04, 0x07,
|
|
||||||
+ 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b, 0x0e,
|
|
||||||
+ 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17, 0x00, 0x04,
|
|
||||||
+ 0x07, 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b,
|
|
||||||
+ 0x0e, 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ, 0x03, 0x03, 0x03, 0x03,
|
|
||||||
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80,
|
|
||||||
+ 0xc0, 0x10);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1, 0xc8, 0x10, 0x08, 0x00,
|
|
||||||
+ 0x00, 0x41, 0xf8, 0x12, 0x31, 0x23, 0x37, 0x86,
|
|
||||||
+ 0x11, 0xc8, 0x37, 0x2a, 0x00, 0x00, 0x0c, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x88, 0x20, 0x46, 0x02, 0x88, 0x88, 0x88, 0x88,
|
|
||||||
+ 0x88, 0x88, 0xff, 0x88, 0x31, 0x57, 0x13, 0x88,
|
|
||||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2, 0x00, 0x1a, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x8f, 0x13, 0x31, 0x75, 0x88, 0x88, 0x88, 0x88,
|
|
||||||
+ 0x88, 0x88, 0xf8, 0x8f, 0x02, 0x20, 0x64, 0x88,
|
|
||||||
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0xf8, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
||||||
+ 0x00);
|
|
||||||
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_EF, 0xff, 0xff, 0x01);
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -512,6 +582,21 @@ static const struct drm_display_mode rgb30panel_mode = {
|
|
||||||
.height_mm = 76,
|
|
||||||
};
|
|
||||||
|
|
||||||
+static const struct drm_display_mode rgb10max3panel_mode = {
|
|
||||||
+ .hdisplay = 720,
|
|
||||||
+ .hsync_start = 720 + 60,
|
|
||||||
+ .hsync_end = 720 + 60 + 10,
|
|
||||||
+ .htotal = 720 + 60 + 10 + 20,
|
|
||||||
+ .vdisplay = 1280,
|
|
||||||
+ .vsync_start = 1280 + 16,
|
|
||||||
+ .vsync_end = 1280 + 16 + 4,
|
|
||||||
+ .vtotal = 1280 + 16 + 4 + 14,
|
|
||||||
+ .clock = 60000,
|
|
||||||
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
|
||||||
+ .width_mm = 63,
|
|
||||||
+ .height_mm = 111,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
static const struct st7703_panel_desc rgb30panel_desc = {
|
|
||||||
.mode = &rgb30panel_mode,
|
|
||||||
.lanes = 4,
|
|
||||||
@@ -521,6 +606,15 @@ static const struct st7703_panel_desc rgb30panel_desc = {
|
|
||||||
.init_sequence = rgb30panel_init_sequence,
|
|
||||||
};
|
|
||||||
|
|
||||||
+static const struct st7703_panel_desc rgb10max3panel_desc = {
|
|
||||||
+ .mode = &rgb10max3panel_mode,
|
|
||||||
+ .lanes = 4,
|
|
||||||
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
|
|
||||||
+ MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_LPM,
|
|
||||||
+ .format = MIPI_DSI_FMT_RGB888,
|
|
||||||
+ .init_sequence = rgb10max3_init_sequence,
|
|
||||||
+};
|
|
||||||
+
|
|
||||||
static int st7703_enable(struct drm_panel *panel)
|
|
||||||
{
|
|
||||||
struct st7703 *ctx = panel_to_st7703(panel);
|
|
||||||
@@ -575,13 +669,9 @@ static int st7703_unprepare(struct drm_panel *panel)
|
|
||||||
{
|
|
||||||
struct st7703 *ctx = panel_to_st7703(panel);
|
|
||||||
|
|
||||||
- if (!ctx->prepared)
|
|
||||||
- return 0;
|
|
||||||
-
|
|
||||||
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
|
||||||
regulator_disable(ctx->iovcc);
|
|
||||||
regulator_disable(ctx->vcc);
|
|
||||||
- ctx->prepared = false;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
@@ -591,9 +681,6 @@ static int st7703_prepare(struct drm_panel *panel)
|
|
||||||
struct st7703 *ctx = panel_to_st7703(panel);
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
- if (ctx->prepared)
|
|
||||||
- return 0;
|
|
||||||
-
|
|
||||||
dev_dbg(ctx->dev, "Resetting the panel\n");
|
|
||||||
gpiod_set_value_cansleep(ctx->reset_gpio, 1);
|
|
||||||
|
|
||||||
@@ -616,8 +703,6 @@ static int st7703_prepare(struct drm_panel *panel)
|
|
||||||
gpiod_set_value_cansleep(ctx->reset_gpio, 0);
|
|
||||||
usleep_range(15000, 20000);
|
|
||||||
|
|
||||||
- ctx->prepared = true;
|
|
||||||
-
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -653,12 +738,20 @@ static int st7703_get_modes(struct drm_panel *panel,
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
+static enum drm_panel_orientation st7703_get_orientation(struct drm_panel *panel)
|
|
||||||
+{
|
|
||||||
+ struct st7703 *ctx = panel_to_st7703(panel);
|
|
||||||
+
|
|
||||||
+ return ctx->orientation;
|
|
||||||
+}
|
|
||||||
+
|
|
||||||
static const struct drm_panel_funcs st7703_drm_funcs = {
|
|
||||||
.disable = st7703_disable,
|
|
||||||
.unprepare = st7703_unprepare,
|
|
||||||
.prepare = st7703_prepare,
|
|
||||||
.enable = st7703_enable,
|
|
||||||
.get_modes = st7703_get_modes,
|
|
||||||
+ .get_orientation = st7703_get_orientation,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int allpixelson_set(void *data, u64 val)
|
|
||||||
@@ -709,6 +802,12 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
|
|
||||||
if (IS_ERR(ctx->reset_gpio))
|
|
||||||
return dev_err_probe(dev, PTR_ERR(ctx->reset_gpio), "Failed to get reset gpio\n");
|
|
||||||
|
|
||||||
+ ret = of_drm_get_panel_orientation(dev->of_node, &ctx->orientation);
|
|
||||||
+ if (ret < 0) {
|
|
||||||
+ dev_err(dev, "%pOF: failed to get orientation %d\n", dev->of_node, ret);
|
|
||||||
+ return ret;
|
|
||||||
+ }
|
|
||||||
+
|
|
||||||
mipi_dsi_set_drvdata(dsi, ctx);
|
|
||||||
|
|
||||||
ctx->dev = dev;
|
|
||||||
@@ -785,6 +884,7 @@ static void st7703_remove(struct mipi_dsi_device *dsi)
|
|
||||||
static const struct of_device_id st7703_of_match[] = {
|
|
||||||
{ .compatible = "anbernic,rg353v-panel-v2", .data = &rg353v2_desc },
|
|
||||||
{ .compatible = "powkiddy,rgb30-panel", .data = &rgb30panel_desc },
|
|
||||||
+ { .compatible = "powkiddy,rgb10max3-panel", .data = &rgb10max3panel_desc },
|
|
||||||
{ .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
|
|
||||||
{ .compatible = "xingbangda,xbd599", .data = &xbd599_desc },
|
|
||||||
{ /* sentinel */ }
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
commit 9913a60f318b6c88ea8385048952e3557464bb84
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:44 2024 -0600
|
||||||
|
|
||||||
|
dt-bindings: display: Add Powkiddy RGB10MAX3 panel
|
||||||
|
|
||||||
|
The RGB10MAX3 panel is a panel specific to the Powkiddy RGB10MAX3
|
||||||
|
handheld device that measures 5 inches diagonally with a resolution
|
||||||
|
of 720x1280.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Reviewed-by: Guido Günther <agx@sigxcpu.org>
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240212184950.52210-2-macroalpha82@gmail.com
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||||
|
index 97cccd8a8479..8dfe8951bf5b 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/display/panel/rocktech,jh057n00900.yaml
|
||||||
|
@@ -22,6 +22,8 @@ properties:
|
||||||
|
enum:
|
||||||
|
# Anberic RG353V-V2 5.0" 640x480 TFT LCD panel
|
||||||
|
- anbernic,rg353v-panel-v2
|
||||||
|
+ # Powkiddy RGB10MAX3 5.0" 720x1280 TFT LCD panel
|
||||||
|
+ - powkiddy,rgb10max3-panel
|
||||||
|
# Powkiddy RGB30 3.0" 720x720 TFT LCD panel
|
||||||
|
- powkiddy,rgb30-panel
|
||||||
|
# Rocktech JH057N00900 5.5" 720x1440 TFT LCD panel
|
|
@ -0,0 +1,125 @@
|
||||||
|
commit e0c732291250e205fb834881ad7ecf9ee3ffef45
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:45 2024 -0600
|
||||||
|
|
||||||
|
drm/panel: st7703: Add Powkiddy RGB10MAX3 Panel Support
|
||||||
|
|
||||||
|
The Powkiddy RGB10MAX3 is a handheld device with a 5 inch 720x1280
|
||||||
|
display panel with a Sitronix ST7703 display controller. The panel
|
||||||
|
is installed rotated 270 degrees.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Reviewed-by: Guido Günther <agx@sigxcpu.org>
|
||||||
|
Reviewed-by: Jessica Zhang <quic_jesszhan@quicinc.com>
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240212184950.52210-3-macroalpha82@gmail.com
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
index b55bafd1a8be..939ba05c9b58 100644
|
||||||
|
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
@@ -521,6 +521,96 @@ static const struct st7703_panel_desc rgb30panel_desc = {
|
||||||
|
.init_sequence = rgb30panel_init_sequence,
|
||||||
|
};
|
||||||
|
|
||||||
|
+static int rgb10max3_panel_init_sequence(struct st7703 *ctx)
|
||||||
|
+{
|
||||||
|
+ struct mipi_dsi_device *dsi = to_mipi_dsi_device(ctx->dev);
|
||||||
|
+
|
||||||
|
+ /* Init sequence extracted from Powkiddy RGB10MAX3 BSP kernel. */
|
||||||
|
+
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEXTC, 0xf1, 0x12, 0x83);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETAPID, 0x00, 0x00, 0x00, 0xda,
|
||||||
|
+ 0x80);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETDISP, 0xc8, 0x02, 0x30);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETRGBIF, 0x10, 0x10, 0x28,
|
||||||
|
+ 0x28, 0x03, 0xff, 0x00, 0x00, 0x00, 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCYC, 0x80);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETBGP, 0x04, 0x04);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVCOM, 0x78, 0x78);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER_EXT, 0x25, 0x22, 0xf0,
|
||||||
|
+ 0x63);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETMIPI, 0x33, 0x81, 0x05, 0xf9,
|
||||||
|
+ 0x0e, 0x0e, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x44, 0x25, 0x00, 0x90, 0x0a, 0x00,
|
||||||
|
+ 0x00, 0x01, 0x4f, 0x01, 0x00, 0x00, 0x37);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETVDC, 0x47);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_BF, 0x02, 0x11, 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETSCR, 0x73, 0x73, 0x50, 0x50,
|
||||||
|
+ 0x00, 0x00, 0x12, 0x70, 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPOWER, 0x25, 0x00, 0x32,
|
||||||
|
+ 0x32, 0x77, 0xe1, 0xff, 0xff, 0xcc, 0xcc, 0x77,
|
||||||
|
+ 0x77);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETECO, 0x82, 0x00, 0xbf, 0xff,
|
||||||
|
+ 0x00, 0xff);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETIO, 0xb8, 0x00, 0x0a, 0x00,
|
||||||
|
+ 0x00, 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETCABC, 0x10, 0x40, 0x1e,
|
||||||
|
+ 0x02);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETPANEL, 0x0b);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGAMMA, 0x00, 0x04, 0x07,
|
||||||
|
+ 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b, 0x0e,
|
||||||
|
+ 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17, 0x00, 0x04,
|
||||||
|
+ 0x07, 0x2a, 0x39, 0x3f, 0x36, 0x31, 0x06, 0x0b,
|
||||||
|
+ 0x0e, 0x12, 0x14, 0x12, 0x13, 0x0f, 0x17);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETEQ, 0x03, 0x03, 0x03, 0x03,
|
||||||
|
+ 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0xff, 0x80,
|
||||||
|
+ 0xc0, 0x10);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP1, 0xc8, 0x10, 0x08, 0x00,
|
||||||
|
+ 0x00, 0x41, 0xf8, 0x12, 0x31, 0x23, 0x37, 0x86,
|
||||||
|
+ 0x11, 0xc8, 0x37, 0x2a, 0x00, 0x00, 0x0c, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x88, 0x20, 0x46, 0x02, 0x88, 0x88, 0x88, 0x88,
|
||||||
|
+ 0x88, 0x88, 0xff, 0x88, 0x31, 0x57, 0x13, 0x88,
|
||||||
|
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0xff, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_SETGIP2, 0x00, 0x1a, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x8f, 0x13, 0x31, 0x75, 0x88, 0x88, 0x88, 0x88,
|
||||||
|
+ 0x88, 0x88, 0xf8, 0x8f, 0x02, 0x20, 0x64, 0x88,
|
||||||
|
+ 0x88, 0x88, 0x88, 0x88, 0x88, 0xf8, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||||
|
+ 0x00);
|
||||||
|
+ mipi_dsi_dcs_write_seq(dsi, ST7703_CMD_UNKNOWN_EF, 0xff, 0xff, 0x01);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct drm_display_mode rgb10max3_panel_mode = {
|
||||||
|
+ .hdisplay = 720,
|
||||||
|
+ .hsync_start = 720 + 40,
|
||||||
|
+ .hsync_end = 720 + 40 + 10,
|
||||||
|
+ .htotal = 720 + 40 + 10 + 40,
|
||||||
|
+ .vdisplay = 1280,
|
||||||
|
+ .vsync_start = 1280 + 16,
|
||||||
|
+ .vsync_end = 1280 + 16 + 4,
|
||||||
|
+ .vtotal = 1280 + 16 + 4 + 14,
|
||||||
|
+ .clock = 63800,
|
||||||
|
+ .flags = DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC,
|
||||||
|
+ .width_mm = 62,
|
||||||
|
+ .height_mm = 109,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static const struct st7703_panel_desc rgb10max3_panel_desc = {
|
||||||
|
+ .mode = &rgb10max3_panel_mode,
|
||||||
|
+ .lanes = 4,
|
||||||
|
+ .mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
|
||||||
|
+ MIPI_DSI_MODE_NO_EOT_PACKET | MIPI_DSI_MODE_LPM,
|
||||||
|
+ .format = MIPI_DSI_FMT_RGB888,
|
||||||
|
+ .init_sequence = rgb10max3_panel_init_sequence,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
static int st7703_enable(struct drm_panel *panel)
|
||||||
|
{
|
||||||
|
struct st7703 *ctx = panel_to_st7703(panel);
|
||||||
|
@@ -784,6 +874,7 @@ static void st7703_remove(struct mipi_dsi_device *dsi)
|
||||||
|
|
||||||
|
static const struct of_device_id st7703_of_match[] = {
|
||||||
|
{ .compatible = "anbernic,rg353v-panel-v2", .data = &rg353v2_desc },
|
||||||
|
+ { .compatible = "powkiddy,rgb10max3-panel", .data = &rgb10max3_panel_desc },
|
||||||
|
{ .compatible = "powkiddy,rgb30-panel", .data = &rgb30panel_desc },
|
||||||
|
{ .compatible = "rocktech,jh057n00900", .data = &jh057n00900_panel_desc },
|
||||||
|
{ .compatible = "xingbangda,xbd599", .data = &xbd599_desc },
|
|
@ -0,0 +1,57 @@
|
||||||
|
commit 762195e5c26936b891fb54ba0183aa3ef366b41e
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:47 2024 -0600
|
||||||
|
|
||||||
|
drm/panel: st7703: Add Panel Rotation Support
|
||||||
|
|
||||||
|
Add support for panel rotation to ST7703 based devices.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Reviewed-by: Guido Günther <agx@sigxcpu.org>
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
Link: https://patchwork.freedesktop.org/patch/msgid/20240212184950.52210-5-macroalpha82@gmail.com
|
||||||
|
|
||||||
|
diff --git a/drivers/gpu/drm/panel/panel-sitronix-st7703.c b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
index 939ba05c9b58..a3e142f156d5 100644
|
||||||
|
--- a/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
+++ b/drivers/gpu/drm/panel/panel-sitronix-st7703.c
|
||||||
|
@@ -62,6 +62,7 @@ struct st7703 {
|
||||||
|
|
||||||
|
struct dentry *debugfs;
|
||||||
|
const struct st7703_panel_desc *desc;
|
||||||
|
+ enum drm_panel_orientation orientation;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct st7703_panel_desc {
|
||||||
|
@@ -743,12 +744,20 @@ static int st7703_get_modes(struct drm_panel *panel,
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static enum drm_panel_orientation st7703_get_orientation(struct drm_panel *panel)
|
||||||
|
+{
|
||||||
|
+ struct st7703 *st7703 = panel_to_st7703(panel);
|
||||||
|
+
|
||||||
|
+ return st7703->orientation;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static const struct drm_panel_funcs st7703_drm_funcs = {
|
||||||
|
.disable = st7703_disable,
|
||||||
|
.unprepare = st7703_unprepare,
|
||||||
|
.prepare = st7703_prepare,
|
||||||
|
.enable = st7703_enable,
|
||||||
|
.get_modes = st7703_get_modes,
|
||||||
|
+ .get_orientation = st7703_get_orientation,
|
||||||
|
};
|
||||||
|
|
||||||
|
static int allpixelson_set(void *data, u64 val)
|
||||||
|
@@ -817,6 +826,10 @@ static int st7703_probe(struct mipi_dsi_device *dsi)
|
||||||
|
return dev_err_probe(dev, PTR_ERR(ctx->iovcc),
|
||||||
|
"Failed to request iovcc regulator\n");
|
||||||
|
|
||||||
|
+ ret = of_drm_get_panel_orientation(dsi->dev.of_node, &ctx->orientation);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return dev_err_probe(&dsi->dev, ret, "Failed to get orientation\n");
|
||||||
|
+
|
||||||
|
drm_panel_init(&ctx->panel, dev, &st7703_drm_funcs,
|
||||||
|
DRM_MODE_CONNECTOR_DSI);
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
commit 039a03c377d64ec832a8fb1b8f8b5badd404989f
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:48 2024 -0600
|
||||||
|
|
||||||
|
arm64: dts: rockchip: Update powkiddy rk2023 dtsi for RGB10MAX3
|
||||||
|
|
||||||
|
Move the vdd_cpu regulator to the device specific dts. This is in
|
||||||
|
preparation of adding the Powkiddy RGB10MAX3 device, which uses
|
||||||
|
a different vendor for the CPU regulator at a different i2c address.
|
||||||
|
|
||||||
|
Also add a phandle to the bluetooth device so that we can change the
|
||||||
|
compatible string for the RGB10MAX3. This device uses the same pinouts
|
||||||
|
but a different bluetooth device.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240212184950.52210-6-macroalpha82@gmail.com
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts
|
||||||
|
index 0ac64f043b80..1f567a14ac84 100644
|
||||||
|
--- a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb30.dts
|
||||||
|
@@ -37,3 +37,21 @@ mipi_in_panel: endpoint {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+&i2c0 {
|
||||||
|
+ vdd_cpu: regulator@1c {
|
||||||
|
+ compatible = "tcs,tcs4525";
|
||||||
|
+ reg = <0x1c>;
|
||||||
|
+ fcs,suspend-voltage-selector = <1>;
|
||||||
|
+ regulator-always-on;
|
||||||
|
+ regulator-boot-on;
|
||||||
|
+ regulator-min-microvolt = <712500>;
|
||||||
|
+ regulator-max-microvolt = <1390000>;
|
||||||
|
+ regulator-name = "vdd_cpu";
|
||||||
|
+ regulator-ramp-delay = <2300>;
|
||||||
|
+ vin-supply = <&vcc_sys>;
|
||||||
|
+ regulator-state-mem {
|
||||||
|
+ regulator-off-in-suspend;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts
|
||||||
|
index ba32d0793dca..bc9933d9e262 100644
|
||||||
|
--- a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dts
|
||||||
|
@@ -36,3 +36,21 @@ mipi_in_panel: endpoint {
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
+
|
||||||
|
+&i2c0 {
|
||||||
|
+ vdd_cpu: regulator@1c {
|
||||||
|
+ compatible = "tcs,tcs4525";
|
||||||
|
+ reg = <0x1c>;
|
||||||
|
+ fcs,suspend-voltage-selector = <1>;
|
||||||
|
+ regulator-always-on;
|
||||||
|
+ regulator-boot-on;
|
||||||
|
+ regulator-min-microvolt = <712500>;
|
||||||
|
+ regulator-max-microvolt = <1390000>;
|
||||||
|
+ regulator-name = "vdd_cpu";
|
||||||
|
+ regulator-ramp-delay = <2300>;
|
||||||
|
+ vin-supply = <&vcc_sys>;
|
||||||
|
+ regulator-state-mem {
|
||||||
|
+ regulator-off-in-suspend;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dtsi b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dtsi
|
||||||
|
index 0fa8f06f94cd..3ab751a01cb2 100644
|
||||||
|
--- a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dtsi
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rk2023.dtsi
|
||||||
|
@@ -614,22 +614,6 @@ rk817_charger: charger {
|
||||||
|
rockchip,sleep-filter-current-microamp = <100000>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
-
|
||||||
|
- vdd_cpu: regulator@1c {
|
||||||
|
- compatible = "tcs,tcs4525";
|
||||||
|
- reg = <0x1c>;
|
||||||
|
- fcs,suspend-voltage-selector = <1>;
|
||||||
|
- regulator-always-on;
|
||||||
|
- regulator-boot-on;
|
||||||
|
- regulator-min-microvolt = <712500>;
|
||||||
|
- regulator-max-microvolt = <1390000>;
|
||||||
|
- regulator-name = "vdd_cpu";
|
||||||
|
- regulator-ramp-delay = <2300>;
|
||||||
|
- vin-supply = <&vcc_sys>;
|
||||||
|
- regulator-state-mem {
|
||||||
|
- regulator-off-in-suspend;
|
||||||
|
- };
|
||||||
|
- };
|
||||||
|
};
|
||||||
|
|
||||||
|
&i2c5 {
|
||||||
|
@@ -805,7 +789,7 @@ &uart1 {
|
||||||
|
uart-has-rtscts;
|
||||||
|
status = "okay";
|
||||||
|
|
||||||
|
- bluetooth {
|
||||||
|
+ bluetooth: bluetooth {
|
||||||
|
compatible = "realtek,rtl8821cs-bt", "realtek,rtl8723bs-bt";
|
||||||
|
device-wake-gpios = <&gpio4 4 GPIO_ACTIVE_HIGH>;
|
||||||
|
enable-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>;
|
|
@ -0,0 +1,26 @@
|
||||||
|
commit fbe7823623a8c02759afdfb521709f4fa216849a
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:49 2024 -0600
|
||||||
|
|
||||||
|
dt-bindings: arm: rockchip: Add Powkiddy RGB10MAX3
|
||||||
|
|
||||||
|
The Powkiddy RGB10MAX3 is a handheld gaming device made by Powkiddy and
|
||||||
|
powered by the Rockchip RK3566 SoC.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Acked-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
|
||||||
|
Link: https://lore.kernel.org/r/20240212184950.52210-7-macroalpha82@gmail.com
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
diff --git a/Documentation/devicetree/bindings/arm/rockchip.yaml b/Documentation/devicetree/bindings/arm/rockchip.yaml
|
||||||
|
index 433a25f4e744..ca2432e803b3 100644
|
||||||
|
--- a/Documentation/devicetree/bindings/arm/rockchip.yaml
|
||||||
|
+++ b/Documentation/devicetree/bindings/arm/rockchip.yaml
|
||||||
|
@@ -694,6 +694,7 @@ properties:
|
||||||
|
- description: Powkiddy RK3566 Handheld Gaming Console
|
||||||
|
items:
|
||||||
|
- enum:
|
||||||
|
+ - powkiddy,rgb10max3
|
||||||
|
- powkiddy,rgb30
|
||||||
|
- powkiddy,rk2023
|
||||||
|
- powkiddy,x55
|
|
@ -0,0 +1,12 @@
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/Makefile b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
|
index a7b30e1..3c4f87e 100644
|
||||||
|
--- a/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/Makefile
|
||||||
|
@@ -78,6 +78,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg353vs.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-anbernic-rg503.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.1.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-pinenote-v1.2.dtb
|
||||||
|
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb10max3.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rgb30.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-rk2023.dtb
|
||||||
|
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3566-powkiddy-x55.dtb
|
|
@ -0,0 +1,110 @@
|
||||||
|
commit 4b325c0d4f539b553a4529f16476f08757779293
|
||||||
|
Author: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Date: Mon Feb 12 12:49:50 2024 -0600
|
||||||
|
|
||||||
|
arm64: dts: rockchip: Add Powkiddy RGB10MAX3
|
||||||
|
|
||||||
|
Add support for the Powkiddy RGB10MAX3. The Powkiddy RGB10MAX3 is a
|
||||||
|
handheld gaming device with a 720p 5.0 inch screen powered by the
|
||||||
|
Rockchip RK3566 SoC. It includes a Realtek 8723ds WiFi/BT module, 2 ADC
|
||||||
|
joysticks powered by a 4-way muxed ADC channel, and several GPIO
|
||||||
|
face buttons. There are 2 SDMMC slots (sdmmc1 and sdmmc3), 3 pwm
|
||||||
|
controlled LEDs, and the device includes 1GB of RAM.
|
||||||
|
|
||||||
|
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
|
||||||
|
Link: https://lore.kernel.org/r/20240212184950.52210-8-macroalpha82@gmail.com
|
||||||
|
Signed-off-by: Heiko Stuebner <heiko@sntech.de>
|
||||||
|
|
||||||
|
diff --git a/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..e5a474e681dd
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/arch/arm64/boot/dts/rockchip/rk3566-powkiddy-rgb10max3.dts
|
||||||
|
@@ -0,0 +1,87 @@
|
||||||
|
+// SPDX-License-Identifier: (GPL-2.0+ OR MIT)
|
||||||
|
+
|
||||||
|
+/dts-v1/;
|
||||||
|
+
|
||||||
|
+#include <dt-bindings/gpio/gpio.h>
|
||||||
|
+#include <dt-bindings/input/linux-event-codes.h>
|
||||||
|
+#include <dt-bindings/pinctrl/rockchip.h>
|
||||||
|
+#include "rk3566-powkiddy-rk2023.dtsi"
|
||||||
|
+
|
||||||
|
+/ {
|
||||||
|
+ model = "Powkiddy RGB10MAX3";
|
||||||
|
+ compatible = "powkiddy,rgb10max3", "rockchip,rk3566";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&bluetooth {
|
||||||
|
+ compatible = "realtek,rtl8723ds-bt";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&cru {
|
||||||
|
+ assigned-clocks = <&pmucru CLK_RTC_32K>, <&cru PLL_GPLL>,
|
||||||
|
+ <&pmucru PLL_PPLL>, <&cru PLL_VPLL>;
|
||||||
|
+ assigned-clock-rates = <32768>, <1200000000>,
|
||||||
|
+ <200000000>, <126400000>;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&dsi0 {
|
||||||
|
+ panel: panel@0 {
|
||||||
|
+ compatible = "powkiddy,rgb10max3-panel";
|
||||||
|
+ reg = <0>;
|
||||||
|
+ backlight = <&backlight>;
|
||||||
|
+ iovcc-supply = <&vcc3v3_lcd0_n>;
|
||||||
|
+ pinctrl-0 = <&lcd_rst>;
|
||||||
|
+ pinctrl-names = "default";
|
||||||
|
+ reset-gpios = <&gpio4 RK_PA0 GPIO_ACTIVE_LOW>;
|
||||||
|
+ rotation = <270>;
|
||||||
|
+ vcc-supply = <&vcc3v3_lcd0_n>;
|
||||||
|
+
|
||||||
|
+ port {
|
||||||
|
+ mipi_in_panel: endpoint {
|
||||||
|
+ remote-endpoint = <&mipi_out_panel>;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&green_led {
|
||||||
|
+ default-state = "on";
|
||||||
|
+ function = LED_FUNCTION_POWER;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&i2c0 {
|
||||||
|
+ vdd_cpu: regulator@40 {
|
||||||
|
+ compatible = "fcs,fan53555";
|
||||||
|
+ reg = <0x40>;
|
||||||
|
+ fcs,suspend-voltage-selector = <1>;
|
||||||
|
+ regulator-always-on;
|
||||||
|
+ regulator-boot-on;
|
||||||
|
+ regulator-min-microvolt = <712500>;
|
||||||
|
+ regulator-max-microvolt = <1390000>;
|
||||||
|
+ regulator-name = "vdd_cpu";
|
||||||
|
+ regulator-ramp-delay = <2300>;
|
||||||
|
+ vin-supply = <&vcc_sys>;
|
||||||
|
+ regulator-state-mem {
|
||||||
|
+ regulator-off-in-suspend;
|
||||||
|
+ };
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&leds {
|
||||||
|
+ amber_led: led-2 {
|
||||||
|
+ color = <LED_COLOR_ID_AMBER>;
|
||||||
|
+ function = LED_FUNCTION_CHARGING;
|
||||||
|
+ max-brightness = <255>;
|
||||||
|
+ pwms = <&pwm0 0 25000 0>;
|
||||||
|
+ };
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&pwm0 {
|
||||||
|
+ pinctrl-0 = <&pwm0m1_pins>;
|
||||||
|
+ pinctrl-names = "default";
|
||||||
|
+ status = "okay";
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+&red_led {
|
||||||
|
+ default-state = "off";
|
||||||
|
+ function = LED_FUNCTION_STATUS;
|
||||||
|
+};
|
Loading…
Reference in a new issue