From ee158f86d9cea5cd5d97f085c9b5ab23d3a69977 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Mon, 8 Aug 2016 10:50:28 +0800 Subject: [PATCH 01/10] arm64: dts: rockchip: add pd_perihp support for rk3399 usb2 Change-Id: I3a46d7dfb2846b332c81a5879a12853ce7423180 Signed-off-by: Elaine Zhang --- arch/arm64/boot/dts/rockchip/rk3399.dtsi | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3399.dtsi b/arch/arm64/boot/dts/rockchip/rk3399.dtsi index c50bacc6a5e5..1cfd8d3e48de 100644 --- a/arch/arm64/boot/dts/rockchip/rk3399.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3399.dtsi @@ -387,6 +387,7 @@ <&u2phy0>; phys = <&u2phy0_host>; phy-names = "usb"; + power-domains = <&power RK3399_PD_PERIHP>; status = "disabled"; }; @@ -398,6 +399,7 @@ <&u2phy0>; phys = <&u2phy0_host>; phy-names = "usb"; + power-domains = <&power RK3399_PD_PERIHP>; status = "disabled"; }; @@ -409,6 +411,7 @@ <&u2phy1>; phys = <&u2phy1_host>; phy-names = "usb"; + power-domains = <&power RK3399_PD_PERIHP>; status = "disabled"; }; @@ -420,6 +423,7 @@ <&u2phy1>; phys = <&u2phy1_host>; phy-names = "usb"; + power-domains = <&power RK3399_PD_PERIHP>; status = "disabled"; }; From e111f41e81e5489e043e6e68c02ca3d594d7593e Mon Sep 17 00:00:00 2001 From: Zhibin Huang Date: Wed, 24 Jan 2024 09:05:01 +0000 Subject: [PATCH 02/10] misc: rk628: Fix the NULL in .suspend/.resume helper when working on hdmi tx mode. Unable to handle kernel NULL pointer dereference at virtual address 000000000000021c [ 36.755198][ T8] Call trace: [ 36.755491][ T8] regmap_write+0x14/0x78 [ 36.755892][ T8] rk628_suspend+0x64/0xc0 [ 36.756290][ T8] dpm_run_callback+0x4c/0x214 [ 36.756720][ T8] __device_suspend+0x338/0x528 [ 36.757158][ T8] async_suspend+0x28/0x14c [ 36.757562][ T8] async_run_entry_fn+0x2c/0xfc [ 36.757994][ T8] process_one_work+0x1a8/0x3b8 [ 36.758436][ T8] worker_thread+0x258/0x434 [ 36.758851][ T8] kthread+0xec/0x1b8 [ 36.759211][ T8] ret_from_fork+0x10/0x20 Signed-off-by: Zhibin Huang Change-Id: I062ecbf6c751a05b3820c3dc7644facffa68d38f --- drivers/misc/rk628/rk628_hdmitx.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/drivers/misc/rk628/rk628_hdmitx.c b/drivers/misc/rk628/rk628_hdmitx.c index 8a9a6cf1c139..abd86c8d936e 100644 --- a/drivers/misc/rk628/rk628_hdmitx.c +++ b/drivers/misc/rk628/rk628_hdmitx.c @@ -840,7 +840,8 @@ static int rk628_hdmi_audio_hw_params(struct device *dev, void *d, struct hdmi_codec_daifmt *daifmt, struct hdmi_codec_params *params) { - struct rk628_hdmi *hdmi = dev_get_drvdata(dev); + struct rk628 *rk628 = dev_get_drvdata(dev); + struct rk628_hdmi *hdmi = rk628->hdmitx; struct audio_info audio = { .sample_width = params->sample_width, .sample_rate = params->sample_rate, @@ -874,7 +875,8 @@ static void rk628_hdmi_audio_shutdown(struct device *dev, void *d) static int rk628_hdmi_audio_mute(struct device *dev, void *d, bool mute, int direction) { - struct rk628_hdmi *hdmi = dev_get_drvdata(dev); + struct rk628 *rk628 = dev_get_drvdata(dev); + struct rk628_hdmi *hdmi = rk628->hdmitx; if (!hdmi->hdmi_data.sink_has_audio) { dev_err(hdmi->dev, "Sink do not support audio!\n"); @@ -896,7 +898,8 @@ static int rk628_hdmi_audio_mute(struct device *dev, void *d, bool mute, static int rk628_hdmi_audio_get_eld(struct device *dev, void *d, u8 *buf, size_t len) { - struct rk628_hdmi *hdmi = dev_get_drvdata(dev); + struct rk628 *rk628 = dev_get_drvdata(dev); + struct rk628_hdmi *hdmi = rk628->hdmitx; struct drm_mode_config *config = &hdmi->bridge.dev->mode_config; struct drm_connector *connector; int ret = -ENODEV; @@ -1231,7 +1234,6 @@ int rk628_hdmitx_enable(struct rk628 *rk628) irq = rk628->client->irq; if (irq < 0) return irq; - dev_set_drvdata(dev, hdmi); rk628_hdmi_reset(hdmi); From f87e4c43fb838e626912a8690f838d421fd23c17 Mon Sep 17 00:00:00 2001 From: Algea Cao Date: Wed, 24 Jan 2024 11:21:02 +0800 Subject: [PATCH 03/10] misc: rk628: Fix `warning: `rk628_pin_iomux_groups` defined but not used` Signed-off-by: Algea Cao Change-Id: I737f9197de58097086df624d22e6db93d57202aa --- drivers/misc/rk628/rk628_gpio.h | 149 ----------------------------- drivers/misc/rk628/rk628_pinctrl.c | 145 ++++++++++++++++++++++++++++ 2 files changed, 145 insertions(+), 149 deletions(-) diff --git a/drivers/misc/rk628/rk628_gpio.h b/drivers/misc/rk628/rk628_gpio.h index 5a61adbd1396..71674952c000 100644 --- a/drivers/misc/rk628/rk628_gpio.h +++ b/drivers/misc/rk628/rk628_gpio.h @@ -144,153 +144,4 @@ enum { PIN_MUX, }; -struct rk628_pin_iomux_group { - unsigned int pins; - int bank; - int mux; - int iomux_base; - int gpio_base; - int pull_reg; -}; - - -#define PINCTRL_GROUP(a, b, c, d, e, f) \ - {.pins = a, .bank = b, .mux = c, .iomux_base = d, .gpio_base = e, .pull_reg = f} - - -static const struct rk628_pin_iomux_group rk628_pin_iomux_groups[] = { - PINCTRL_GROUP(GPIO0_A0, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A1, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A2, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), - PINCTRL_GROUP(GPIO0_A3, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A4, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A5, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A6, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_A7, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, - RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), - PINCTRL_GROUP(GPIO0_B0, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), - PINCTRL_GROUP(GPIO0_B1, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), - PINCTRL_GROUP(GPIO0_B2, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), - PINCTRL_GROUP(GPIO0_B3, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), - - PINCTRL_GROUP(GPIO1_A0, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A1, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A2, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A3, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A4, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A5, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A6, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_A7, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, - RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), - PINCTRL_GROUP(GPIO1_B0, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - PINCTRL_GROUP(GPIO1_B1, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - PINCTRL_GROUP(GPIO1_B2, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - PINCTRL_GROUP(GPIO1_B3, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - PINCTRL_GROUP(GPIO1_B4, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - PINCTRL_GROUP(GPIO1_B5, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), - - PINCTRL_GROUP(GPIO2_A0, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A1, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A2, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A3, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A4, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A5, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A6, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_A7, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), - PINCTRL_GROUP(GPIO2_B0, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B1, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B2, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B3, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B4, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B5, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B6, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_B7, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), - PINCTRL_GROUP(GPIO2_C0, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C1, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C2, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C3, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C4, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C5, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C6, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - PINCTRL_GROUP(GPIO2_C7, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, - RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), - - PINCTRL_GROUP(GPIO3_A0, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), - PINCTRL_GROUP(GPIO3_A1, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), - PINCTRL_GROUP(GPIO3_A2, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), - PINCTRL_GROUP(GPIO3_A3, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), - PINCTRL_GROUP(GPIO3_A4, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, 0), - PINCTRL_GROUP(GPIO3_A5, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, 0), - PINCTRL_GROUP(GPIO3_A6, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, 0), - PINCTRL_GROUP(GPIO3_A7, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, 0), - PINCTRL_GROUP(GPIO3_B0, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), - PINCTRL_GROUP(GPIO3_B1, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), - PINCTRL_GROUP(GPIO3_B2, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), - PINCTRL_GROUP(GPIO3_B3, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), - PINCTRL_GROUP(GPIO3_B4, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, - RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), - - PINCTRL_GROUP(PIN_I2SM_SCK, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_I2SM_D, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_I2SM_LR, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_RXDDC_SCL, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_RXDDC_SDA, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_HDMIRX_CE, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_JTAG_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_UART_SEL, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_UART_RTS_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - PINCTRL_GROUP(PIN_UART_CTS_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), - -}; - #endif // RK628_GPIO_H - - diff --git a/drivers/misc/rk628/rk628_pinctrl.c b/drivers/misc/rk628/rk628_pinctrl.c index 19e5316cfb4f..e8661a3bbf81 100644 --- a/drivers/misc/rk628/rk628_pinctrl.c +++ b/drivers/misc/rk628/rk628_pinctrl.c @@ -8,6 +8,151 @@ #include "rk628.h" #include "rk628_gpio.h" +struct rk628_pin_iomux_group { + unsigned int pins; + int bank; + int mux; + int iomux_base; + int gpio_base; + int pull_reg; +}; + +#define PINCTRL_GROUP(a, b, c, d, e, f) \ + {.pins = a, .bank = b, .mux = c, .iomux_base = d, .gpio_base = e, .pull_reg = f} + +static const struct rk628_pin_iomux_group rk628_pin_iomux_groups[] = { + PINCTRL_GROUP(GPIO0_A0, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A1, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A2, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), + PINCTRL_GROUP(GPIO0_A3, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A4, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A5, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A6, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_A7, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, + RK628_GPIO0_BASE, GRF_GPIO0A_P_CON), + PINCTRL_GROUP(GPIO0_B0, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), + PINCTRL_GROUP(GPIO0_B1, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), + PINCTRL_GROUP(GPIO0_B2, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), + PINCTRL_GROUP(GPIO0_B3, GPIO_BANK0, 1, GRF_GPIO0AB_SEL_CON, RK628_GPIO0_BASE, 0), + + PINCTRL_GROUP(GPIO1_A0, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A1, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A2, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A3, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A4, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A5, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A6, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_A7, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, + RK628_GPIO1_BASE, GRF_GPIO1A_P_CON), + PINCTRL_GROUP(GPIO1_B0, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + PINCTRL_GROUP(GPIO1_B1, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + PINCTRL_GROUP(GPIO1_B2, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + PINCTRL_GROUP(GPIO1_B3, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + PINCTRL_GROUP(GPIO1_B4, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + PINCTRL_GROUP(GPIO1_B5, GPIO_BANK1, 1, GRF_GPIO1AB_SEL_CON, RK628_GPIO1_BASE, 0), + + PINCTRL_GROUP(GPIO2_A0, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A1, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A2, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A3, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A4, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A5, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A6, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_A7, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2A_P_CON), + PINCTRL_GROUP(GPIO2_B0, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B1, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B2, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B3, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B4, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B5, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B6, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_B7, GPIO_BANK2, 1, GRF_GPIO2AB_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2B_P_CON), + PINCTRL_GROUP(GPIO2_C0, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C1, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C2, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C3, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C4, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C5, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C6, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + PINCTRL_GROUP(GPIO2_C7, GPIO_BANK2, 1, GRF_GPIO2C_SEL_CON, + RK628_GPIO2_BASE, GRF_GPIO2C_P_CON), + + PINCTRL_GROUP(GPIO3_A0, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), + PINCTRL_GROUP(GPIO3_A1, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), + PINCTRL_GROUP(GPIO3_A2, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), + PINCTRL_GROUP(GPIO3_A3, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3A_P_CON), + PINCTRL_GROUP(GPIO3_A4, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, 0), + PINCTRL_GROUP(GPIO3_A5, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, 0), + PINCTRL_GROUP(GPIO3_A6, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, 0), + PINCTRL_GROUP(GPIO3_A7, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, 0), + PINCTRL_GROUP(GPIO3_B0, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), + PINCTRL_GROUP(GPIO3_B1, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), + PINCTRL_GROUP(GPIO3_B2, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), + PINCTRL_GROUP(GPIO3_B3, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), + PINCTRL_GROUP(GPIO3_B4, GPIO_BANK3, 1, GRF_GPIO3AB_SEL_CON, + RK628_GPIO3_BASE, GRF_GPIO3B_P_CON), + + PINCTRL_GROUP(PIN_I2SM_SCK, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_I2SM_D, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_I2SM_LR, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_RXDDC_SCL, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_RXDDC_SDA, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_HDMIRX_CE, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_JTAG_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_UART_SEL, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_UART_RTS_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + PINCTRL_GROUP(PIN_UART_CTS_EN, GPIO_BANKX, 1, GRF_SYSTEM_CON3, 0, 0), + +}; + static int rk628_calc_mux_offset(struct rk628 *rk628, int mux, int reg, int offset) { int val = 0, orig; From 0f5b360afc8abbb5927b6a9562eef46f19f0305a Mon Sep 17 00:00:00 2001 From: Cai Wenzhong Date: Wed, 24 Jan 2024 09:41:02 +0800 Subject: [PATCH 04/10] media: i2c: maxim: remote: record the status of the serializer Signed-off-by: Cai Wenzhong Change-Id: Iee78aff7e99950313e5134bd9b0dd73422f0bec1 --- drivers/media/i2c/maxim/remote/max9295.c | 9 ++++++++- drivers/media/i2c/maxim/remote/max96715.c | 9 ++++++++- drivers/media/i2c/maxim/remote/max96717.c | 7 +++++++ drivers/media/i2c/maxim/remote/maxim_remote.h | 12 ++++++++++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/drivers/media/i2c/maxim/remote/max9295.c b/drivers/media/i2c/maxim/remote/max9295.c index 9501dfc88d5d..ea3d20bc47dc 100644 --- a/drivers/media/i2c/maxim/remote/max9295.c +++ b/drivers/media/i2c/maxim/remote/max9295.c @@ -18,7 +18,7 @@ #define DRIVER_VERSION KERNEL_VERSION(3, 0x01, 0x00) -#define MAX9295_NAME "max9295" +#define MAX9295_NAME "maxim-max9295" #define MAX9295_I2C_ADDR_DEF 0x40 @@ -456,6 +456,8 @@ static int max9295_module_init(maxim_remote_ser_t *max9295) return ret; } + max9295->ser_state = MAXIM_REMOTE_SER_INIT; + return 0; } @@ -468,6 +470,8 @@ static int max9295_module_deinit(maxim_remote_ser_t *max9295) #endif ret |= max9295_soft_power_down(max9295); + max9295->ser_state = MAXIM_REMOTE_SER_DEINIT; + return ret; } @@ -515,6 +519,7 @@ static int max9295_probe(struct i2c_client *client, max9295->client = client; max9295->ser_i2c_addr_map = client->addr; max9295->ser_ops = &max9295_ser_ops; + max9295->ser_state = MAXIM_REMOTE_SER_DEINIT; i2c_set_clientdata(client, max9295); @@ -537,6 +542,8 @@ static void max9295_remove(struct i2c_client *client) mutex_destroy(&max9295->mutex); + max9295->ser_state = MAXIM_REMOTE_SER_DEINIT; + #if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE return 0; #endif diff --git a/drivers/media/i2c/maxim/remote/max96715.c b/drivers/media/i2c/maxim/remote/max96715.c index fc6a6cf0ddbf..1d568468b9b5 100644 --- a/drivers/media/i2c/maxim/remote/max96715.c +++ b/drivers/media/i2c/maxim/remote/max96715.c @@ -18,7 +18,7 @@ #define DRIVER_VERSION KERNEL_VERSION(3, 0x01, 0x00) -#define MAX96715_NAME "max96715" +#define MAX96715_NAME "maxim-max96715" #define MAX96715_I2C_ADDR_DEF 0x40 @@ -457,6 +457,8 @@ static int max96715_module_init(maxim_remote_ser_t *max96715) return ret; #endif + max96715->ser_state = MAXIM_REMOTE_SER_INIT; + return 0; } @@ -469,6 +471,8 @@ static int max96715_module_deinit(maxim_remote_ser_t *max96715) #endif ret |= max96715_soft_power_down(max96715); + max96715->ser_state = MAXIM_REMOTE_SER_DEINIT; + return ret; } @@ -516,6 +520,7 @@ static int max96715_probe(struct i2c_client *client, max96715->client = client; max96715->ser_i2c_addr_map = client->addr; max96715->ser_ops = &max96715_ser_ops; + max96715->ser_state = MAXIM_REMOTE_SER_DEINIT; i2c_set_clientdata(client, max96715); @@ -538,6 +543,8 @@ static void max96715_remove(struct i2c_client *client) mutex_destroy(&max96715->mutex); + max96715->ser_state = MAXIM_REMOTE_SER_DEINIT; + #if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE return 0; #endif diff --git a/drivers/media/i2c/maxim/remote/max96717.c b/drivers/media/i2c/maxim/remote/max96717.c index c2a19887ea37..209f8b4c0d06 100644 --- a/drivers/media/i2c/maxim/remote/max96717.c +++ b/drivers/media/i2c/maxim/remote/max96717.c @@ -409,6 +409,8 @@ static int max96717_module_init(maxim_remote_ser_t *max96717) return ret; } + max96717->ser_state = MAXIM_REMOTE_SER_INIT; + return 0; } @@ -418,6 +420,8 @@ static int max96717_module_deinit(maxim_remote_ser_t *max96717) ret |= max96717_i2c_addr_def(max96717); + max96717->ser_state = MAXIM_REMOTE_SER_DEINIT; + return ret; } @@ -465,6 +469,7 @@ static int max96717_probe(struct i2c_client *client, max96717->client = client; max96717->ser_i2c_addr_map = client->addr; max96717->ser_ops = &max96717_ser_ops; + max96717->ser_state = MAXIM_REMOTE_SER_DEINIT; i2c_set_clientdata(client, max96717); @@ -487,6 +492,8 @@ static void max96717_remove(struct i2c_client *client) mutex_destroy(&max96717->mutex); + max96717->ser_state = MAXIM_REMOTE_SER_DEINIT; + #if KERNEL_VERSION(6, 1, 0) > LINUX_VERSION_CODE return 0; #endif diff --git a/drivers/media/i2c/maxim/remote/maxim_remote.h b/drivers/media/i2c/maxim/remote/maxim_remote.h index 8a79df354ed1..692871d81e0e 100644 --- a/drivers/media/i2c/maxim/remote/maxim_remote.h +++ b/drivers/media/i2c/maxim/remote/maxim_remote.h @@ -25,6 +25,10 @@ enum rkmodule_pad_type { #endif #endif /* LINUX_VERSION_CODE */ +/* Serializer State */ +#define MAXIM_REMOTE_SER_DEINIT 0 +#define MAXIM_REMOTE_SER_INIT 1 + /* I2C Device ID */ enum { MAXIM_REMOTE_I2C_SER_DEF, /* Serializer I2C address: Default */ @@ -76,6 +80,7 @@ typedef struct maxim_remote_ser { u8 cam_i2c_addr_def; u8 cam_i2c_addr_map; + u32 ser_state; struct maxim_remote_init_seq ser_init_seq; const struct maxim_remote_ser_ops *ser_ops; } maxim_remote_ser_t; @@ -325,4 +330,11 @@ static inline struct maxim_remote_ser *maxim_remote_cam_bind_ser(struct device * } } +static inline bool maxim_remote_ser_is_inited(maxim_remote_ser_t *remote_ser) +{ + if (remote_ser && (remote_ser->ser_state == MAXIM_REMOTE_SER_INIT)) + return true; + + return false; +} #endif /* __MAXIM_REMOTE_H__ */ From 5a729b7b60be7048b67c95d3ff44dacf4b616999 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Mon, 22 Jan 2024 20:58:01 +0800 Subject: [PATCH 05/10] media: rockchip: vicap increase wake up cnt for rv1126/rk3568 monitor mode Signed-off-by: Zefa Chen Change-Id: I8161e04d61215026591c47d67995f44c56ed54c5 --- drivers/media/platform/rockchip/cif/capture.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 209d4969d04d..0a37aad7fd57 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -11430,6 +11430,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev) wake_up(&stream->wq_stopped); continue; } + stream->buf_wake_up_cnt++; if (stream->state != RKCIF_STATE_STREAMING) continue; @@ -11574,6 +11575,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev) wake_up(&stream->wq_stopped); return; } + stream->buf_wake_up_cnt++; frmid = CIF_GET_FRAME_ID(cif_frmst); if ((cif_frmst == 0xfffd0002) || (cif_frmst == 0xfffe0002)) { @@ -11643,6 +11645,7 @@ void rkcif_irq_pingpong(struct rkcif_device *cif_dev) wake_up(&stream->wq_stopped); continue; } + stream->buf_wake_up_cnt++; if (stream->state != RKCIF_STATE_STREAMING) continue; @@ -11751,6 +11754,7 @@ void rkcif_irq_lite_lvds(struct rkcif_device *cif_dev) if (stream->state != RKCIF_STATE_STREAMING) continue; + stream->buf_wake_up_cnt++; switch (mipi_id) { case RKCIF_STREAM_MIPI_ID0: stream->frame_phase = SW_FRM_END_ID0(intstat); From e1831e066b5f3ab2b060843a86a1a7f099775865 Mon Sep 17 00:00:00 2001 From: Chen Shunqing Date: Mon, 22 Jan 2024 07:23:37 +0000 Subject: [PATCH 06/10] media: i2c: rk628: add hdmirxphy debugfs Type: Function Redmine ID: N/A Associated modifications: N/A Test: cat /d/rk628/x-0050/registers/hdmirxphy echo 0x2 0x1680 > /d/rk628/x-0050/registers/hdmirxphy Change-Id: Id395cb5c1c373be00ae4916d86f5f6b13c631c1f Signed-off-by: Chen Shunqing --- drivers/media/i2c/rk628/rk628.c | 1 + drivers/media/i2c/rk628/rk628_hdmirx.c | 68 ++++++++++++++++++++++++++ drivers/media/i2c/rk628/rk628_hdmirx.h | 1 + 3 files changed, 70 insertions(+) diff --git a/drivers/media/i2c/rk628/rk628.c b/drivers/media/i2c/rk628/rk628.c index b3aaa731faa5..f5f9cfbab9ec 100644 --- a/drivers/media/i2c/rk628/rk628.c +++ b/drivers/media/i2c/rk628/rk628.c @@ -426,6 +426,7 @@ static void rk628_debugfs_register_create(struct rk628 *rk628) continue; debugfs_create_file(reg->name, 0600, dir, rk628, &rk628_reg_fops); } + rk628_hdmirx_phy_debugfs_register_create(rk628, dir); } void rk628_debugfs_create(struct rk628 *rk628) diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.c b/drivers/media/i2c/rk628/rk628_hdmirx.c index e1533536a348..b9daaf5e7628 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.c +++ b/drivers/media/i2c/rk628/rk628_hdmirx.c @@ -1518,3 +1518,71 @@ bool rk628_hdmirx_is_signal_change_ists(struct rk628 *rk628) return false; } EXPORT_SYMBOL(rk628_hdmirx_is_signal_change_ists); + +static int rk628_hdmirx_phy_reg_show(struct seq_file *s, void *v) +{ + struct rk628 *rk628 = s->private; + unsigned int i; + + seq_printf(s, "rk628_%s:\n", file_dentry(s->file)->d_iname); + + for (i = 0; i <= 0xb7; i++) + seq_printf(s, "0x%02x: %08x\n", i, hdmirxphy_read(rk628, i)); + + return 0; +} + +static ssize_t rk628_hdmirx_phy_reg_write(struct file *file, const char __user *buf, + size_t count, loff_t *ppos) +{ + struct rk628 *rk628 = file->f_path.dentry->d_inode->i_private; + u32 addr; + u32 val; + char kbuf[25]; + int ret; + + if (count >= sizeof(kbuf)) + return -ENOSPC; + + if (copy_from_user(kbuf, buf, count)) + return -EFAULT; + + kbuf[count] = '\0'; + + ret = sscanf(kbuf, "%x%x", &addr, &val); + if (ret != 2) + return -EINVAL; + + if (addr > 0xb7) + return -EINVAL; + + hdmirxphy_write(rk628, addr, val); + + return count; +} + +static int rk628_hdmirx_phy_reg_open(struct inode *inode, struct file *file) +{ + struct rk628 *rk628 = inode->i_private; + + return single_open(file, rk628_hdmirx_phy_reg_show, rk628); +} + +static const struct file_operations rk628_hdmirx_phy_reg_fops = { + .owner = THIS_MODULE, + .open = rk628_hdmirx_phy_reg_open, + .read = seq_read, + .write = rk628_hdmirx_phy_reg_write, + .llseek = seq_lseek, + .release = single_release, +}; +void rk628_hdmirx_phy_debugfs_register_create(struct rk628 *rk628, struct dentry *dir) +{ + if (rk628->version < RK628F_VERSION) + return; + if (IS_ERR(dir)) + return; + + debugfs_create_file("hdmirxphy", 0600, dir, rk628, &rk628_hdmirx_phy_reg_fops); +} +EXPORT_SYMBOL(rk628_hdmirx_phy_debugfs_register_create); diff --git a/drivers/media/i2c/rk628/rk628_hdmirx.h b/drivers/media/i2c/rk628/rk628_hdmirx.h index 3aed4642da39..43b159e387e0 100644 --- a/drivers/media/i2c/rk628/rk628_hdmirx.h +++ b/drivers/media/i2c/rk628/rk628_hdmirx.h @@ -523,4 +523,5 @@ void rk628_hdmirx_cec_unregister(struct rk628_hdmirx_cec *cec); void rk628_hdmirx_cec_hpd(struct rk628_hdmirx_cec *cec, bool en); void rk628_hdmirx_cec_state_reconfiguration(struct rk628 *rk628, struct rk628_hdmirx_cec *cec); +void rk628_hdmirx_phy_debugfs_register_create(struct rk628 *rk628, struct dentry *dir); #endif From 313e8b05f95597dd7d00496bd0d4b3a181482396 Mon Sep 17 00:00:00 2001 From: Zefa Chen Date: Tue, 23 Jan 2024 10:35:53 +0800 Subject: [PATCH 07/10] media: rockchip: vicap get_channel_info add param of field to cover value from get_fmt Signed-off-by: Zefa Chen Change-Id: I552a42ccfa87e61a72b2ce9bd342e41d5e216a13 --- drivers/media/platform/rockchip/cif/capture.c | 4 ++++ include/uapi/linux/rk-camera-module.h | 1 + 2 files changed, 5 insertions(+) diff --git a/drivers/media/platform/rockchip/cif/capture.c b/drivers/media/platform/rockchip/cif/capture.c index 0a37aad7fd57..74b2e09cb35e 100644 --- a/drivers/media/platform/rockchip/cif/capture.c +++ b/drivers/media/platform/rockchip/cif/capture.c @@ -905,6 +905,10 @@ cif_input_fmt *rkcif_get_input_fmt(struct rkcif_device *dev, struct v4l2_rect *r if (ch_info.data_bit > 0) csi_info->data_bit = ch_info.data_bit; } + if (ch_info.field == 0) + fmt.format.field = V4L2_FIELD_NONE; + else + fmt.format.field = ch_info.field; } else { csi_info->vc = 0xff; } diff --git a/include/uapi/linux/rk-camera-module.h b/include/uapi/linux/rk-camera-module.h index d25977d3b878..334b6915a733 100644 --- a/include/uapi/linux/rk-camera-module.h +++ b/include/uapi/linux/rk-camera-module.h @@ -669,6 +669,7 @@ struct rkmodule_channel_info { __u32 bus_fmt; __u32 data_type; __u32 data_bit; + __u32 field; } __attribute__ ((packed)); /* From 90c661b591636834d7f023e27d4cdb0c1469cf9e Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Tue, 23 Jan 2024 19:57:48 +0800 Subject: [PATCH 08/10] drm/rockchip: vop2: hdisplay must roundup 2/4 when calc pre_scan_dly splice mode: hdisplay must roundup as 4 pixel, no splice mode: hdisplay must roundup as 2 pixel. otherwise will lead to POST_BUF_EMPTY and display black screen. Signed-off-by: Sandy Huang Change-Id: I0971a052751c411acef8ed2fcfd9f142caa37598 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 425338e041b0..81ae368f18c1 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -7743,7 +7743,8 @@ static void vop3_setup_pipe_dly(struct vop2_video_port *vp, const struct vop2_zp sdr_win_dly = 0; } - pre_scan_dly = bg_dly + (hdisplay >> 1) - 1; + /* hdisplay must roundup as 2 pixel */ + pre_scan_dly = bg_dly + (roundup(hdisplay, 2) >> 1) - 1; pre_scan_dly = (pre_scan_dly << 16) | hsync_len; VOP_MODULE_SET(vop2, vp, bg_dly, bg_dly); VOP_MODULE_SET(vop2, vp, pre_scan_htiming, pre_scan_dly); @@ -9309,10 +9310,14 @@ static void vop2_setup_dly_for_vp(struct vop2_video_port *vp) hdisplay = adjusted_mode->crtc_hdisplay; } + /* + * splice mode: hdisplay must roundup as 4 pixel, + * no splice mode: hdisplay must roundup as 2 pixel. + */ if (vcstate->splice_mode) - pre_scan_dly = bg_dly + (hdisplay >> 2) - 1; + pre_scan_dly = bg_dly + (roundup(hdisplay, 4) >> 2) - 1; else - pre_scan_dly = bg_dly + (hdisplay >> 1) - 1; + pre_scan_dly = bg_dly + (roundup(hdisplay, 2) >> 1) - 1; if (vop2->version == VOP_VERSION_RK3588 && hsync_len < 8) hsync_len = 8; From f2af5d4507422c052b44721d154921ed1f81795c Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Thu, 25 Jan 2024 10:13:17 +0800 Subject: [PATCH 09/10] drm/rockchip: vop2: remove ARGB2101010 support from VOP2 At RK3568 and RK3588 platform, cluster only can support AFBC XRGB2101010 and not support ARGB2101010. Signed-off-by: Sandy Huang Change-Id: If0695793ea102fdd10be2bcffd6bd428149da646 --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 9 +++++++++ drivers/gpu/drm/rockchip/rockchip_vop2_reg.c | 2 -- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index 81ae368f18c1..8947214a0e65 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -4885,6 +4885,15 @@ static int vop2_plane_atomic_check(struct drm_plane *plane, struct drm_plane_sta } } + if (vp->vop2->version == VOP_VERSION_RK3588) { + if (!vpstate->afbc_en && + (fb->format->format == DRM_FORMAT_XRGB2101010 || + fb->format->format == DRM_FORMAT_XBGR2101010)) { + DRM_ERROR("RK3588 unsupported linear XRGB2101010 at %s\n", win->name); + return -EINVAL; + } + } + if (vp->vop2->version > VOP_VERSION_RK3568) { if (vop2_cluster_window(win) && !vpstate->afbc_en && fb->format->is_yuv && !is_vop3(vop2)) { DRM_ERROR("Unsupported linear yuv format at %s\n", win->name); diff --git a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c index 9854a23f545b..e973036cc806 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop2_reg.c @@ -32,9 +32,7 @@ static const uint32_t formats_for_cluster[] = { DRM_FORMAT_XRGB2101010, - DRM_FORMAT_ARGB2101010, DRM_FORMAT_XBGR2101010, - DRM_FORMAT_ABGR2101010, DRM_FORMAT_XRGB8888, DRM_FORMAT_ARGB8888, DRM_FORMAT_XBGR8888, From ef84fb2dc967e18e44e13c42e2ea3e85d8d7f2a0 Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Wed, 6 Dec 2023 10:00:43 +0100 Subject: [PATCH 10/10] UPSTREAM: sched/fair: Use all little CPUs for CPU-bound workloads Running N CPU-bound tasks on an N CPUs platform: - with asymmetric CPU capacity - not being a DynamIq system (i.e. having a PKG level sched domain without the SD_SHARE_PKG_RESOURCES flag set) .. might result in a task placement where two tasks run on a big CPU and none on a little CPU. This placement could be more optimal by using all CPUs. Testing platform: Juno-r2: - 2 big CPUs (1-2), maximum capacity of 1024 - 4 little CPUs (0,3-5), maximum capacity of 383 Testing workload ([1]): Spawn 6 CPU-bound tasks. During the first 100ms (step 1), each tasks is affine to a CPU, except for: - one little CPU which is left idle. - one big CPU which has 2 tasks affine. After the 100ms (step 2), remove the cpumask affinity. Behavior before the patch: During step 2, the load balancer running from the idle CPU tags sched domains as: - little CPUs: 'group_has_spare'. Cf. group_has_capacity() and group_is_overloaded(), 3 CPU-bound tasks run on a 4 CPUs sched-domain, and the idle CPU provides enough spare capacity regarding the imbalance_pct - big CPUs: 'group_overloaded'. Indeed, 3 tasks run on a 2 CPUs sched-domain, so the following path is used: group_is_overloaded() \-if (sgs->sum_nr_running <= sgs->group_weight) return true; The following path which would change the migration type to 'migrate_task' is not taken: calculate_imbalance() \-if (env->idle != CPU_NOT_IDLE && env->imbalance == 0) as the local group has some spare capacity, so the imbalance is not 0. The migration type requested is 'migrate_util' and the busiest runqueue is the big CPU's runqueue having 2 tasks (each having a utilization of 512). The idle little CPU cannot pull one of these task as its capacity is too small for the task. The following path is used: detach_tasks() \-case migrate_util: \-if (util > env->imbalance) goto next; After the patch: As the number of failed balancing attempts grows (with 'nr_balance_failed'), progressively make it easier to migrate a big task to the idling little CPU. A similar mechanism is used for the 'migrate_load' migration type. Improvement: Running the testing workload [1] with the step 2 representing a ~10s load for a big CPU: Before patch: ~19.3s After patch: ~18s (-6.7%) Similar issue reported at: https://lore.kernel.org/lkml/20230716014125.139577-1-qyousef@layalina.io/ Suggested-by: Vincent Guittot Signed-off-by: Pierre Gondois Signed-off-by: Ingo Molnar Reviewed-by: Vincent Guittot Reviewed-by: Dietmar Eggemann Acked-by: Qais Yousef Link: https://lore.kernel.org/r/20231206090043.634697-1-pierre.gondois@arm.com (cherry picked from commit 3af7524b14198f5159a86692d57a9f28ec9375ce) Change-Id: Ibfd3ed5fc36ed067d1223603aac336dae11b4ce0 Signed-off-by: Liang Chen --- kernel/sched/fair.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index 8c74c2f60d4b..169b74276af6 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8174,7 +8174,7 @@ static int detach_tasks(struct lb_env *env) case migrate_util: util = task_util_est(p); - if (util > env->imbalance) + if (shr_bound(util, env->sd->nr_balance_failed) > env->imbalance) goto next; env->imbalance -= util;