From ee158f86d9cea5cd5d97f085c9b5ab23d3a69977 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Mon, 8 Aug 2016 10:50:28 +0800 Subject: [PATCH 01/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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/12] 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 a2fc5c4bd58451123ad0cc844de55f484be3e924 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Thu, 14 Dec 2023 20:13:46 +0800 Subject: [PATCH 09/12] drm/rockchip: vop: update vop afbc format define 1. update vop afbc format define according to vop2; 2. add afbc modifiers format support for px30 win1. Signed-off-by: Sandy Huang Change-Id: I54a878a01188466fa94b30468d163c6a31385809 --- drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 32 ++++++++++++--------- drivers/gpu/drm/rockchip/rockchip_vop_reg.c | 1 + 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c index cdefb4c1579e..f4fe35c11155 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c @@ -154,6 +154,7 @@ #define to_vop_win(x) container_of(x, struct vop_win, base) #define to_vop_plane_state(x) container_of(x, struct vop_plane_state, base) +#define AFBC_Y2R_COLOR_TRANSFORM (1 << 4) enum vop_pending { VOP_PENDING_FB_UNREF, @@ -2021,7 +2022,7 @@ static void vop_plane_setup_color_key(struct drm_plane *plane) } static void vop_plane_atomic_update(struct drm_plane *plane, - struct drm_atomic_state *state) + struct drm_atomic_state *state) { struct drm_plane_state *new_state = drm_atomic_get_new_plane_state(state, plane); @@ -2044,9 +2045,9 @@ static void vop_plane_atomic_update(struct drm_plane *plane, uint32_t val; bool rb_swap, global_alpha_en, uv_swap; int is_yuv = fb->format->is_yuv; + bool afbc_en = false; #if defined(CONFIG_ROCKCHIP_DRM_DEBUG) - bool AFBC_flag = false; struct vop_dump_list *planlist; unsigned long num_pages; struct page **pages; @@ -2061,10 +2062,6 @@ static void vop_plane_atomic_update(struct drm_plane *plane, num_pages = rk_obj->num_pages; pages = rk_obj->pages; } - if (fb->modifier == DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16)) - AFBC_flag = true; - else - AFBC_flag = false; #endif /* @@ -2215,11 +2212,14 @@ static void vop_plane_atomic_update(struct drm_plane *plane, VOP_WIN_SET(vop, win, gate, 1); spin_unlock(&vop->reg_lock); + if (rockchip_afbc(plane, fb->modifier)) + afbc_en = true; rockchip_drm_dbg(vop->dev, VOP_DEBUG_PLANE, "update win%d-area%d [%dx%d->%dx%d@(%d, %d)] zpos:%d fmt[%p4cc%s] addr[%pad] by %s\n", win->win_id, win->area_id, actual_w, actual_h, dsp_w, dsp_h, dsp_stx, dsp_sty, vop_plane_state->zpos, &fb->format->format, - fb->modifier ? "[AFBC]" : "", &vop_plane_state->yrgb_mst, current->comm); + afbc_en ? "[AFBC]" : "", + &vop_plane_state->yrgb_mst, current->comm); /* * spi interface(vop_plane_state->yrgb_kvaddr, fb->pixel_format, * actual_w, actual_h) @@ -2231,7 +2231,7 @@ static void vop_plane_atomic_update(struct drm_plane *plane, planlist = kmalloc(sizeof(*planlist), GFP_KERNEL); if (planlist) { - planlist->dump_info.AFBC_flag = AFBC_flag; + planlist->dump_info.AFBC_flag = afbc_en; planlist->dump_info.area_id = win->area_id; planlist->dump_info.win_id = win->win_id; planlist->dump_info.yuv_format = @@ -2727,8 +2727,6 @@ static int vop_plane_info_dump(struct seq_file *s, struct drm_plane *plane) struct drm_gem_object *obj; struct rockchip_gem_object *rk_obj; dma_addr_t fb_addr; - u64 afbdc_format = - DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16); DEBUG_PRINT(" win%d-%d: %s\n", win->win_id, win->area_id, state->crtc ? "ACTIVE" : "DISABLED"); @@ -2740,7 +2738,7 @@ static int vop_plane_info_dump(struct seq_file *s, struct drm_plane *plane) DEBUG_PRINT("\tformat: %p4cc%s%s[%d] color_space[%d]\n", &fb->format->format, - fb->modifier == afbdc_format ? "[AFBC]" : "", + rockchip_afbc(plane, state->fb->modifier) ? "[AFBC]" : "", pstate->eotf ? " HDR" : " SDR", pstate->eotf, pstate->color_space); DEBUG_PRINT("\tcsc: y2r[%d] r2r[%d] r2y[%d] csc mode[%d]\n", @@ -3670,8 +3668,8 @@ static int vop_afbdc_atomic_check(struct drm_crtc *crtc, if (pstate->crtc != crtc || !fb) continue; - if (fb->modifier != - DRM_FORMAT_MOD_ARM_AFBC(AFBC_FORMAT_MOD_BLOCK_SIZE_16x16)) + + if (!rockchip_afbc(plane, fb->modifier)) continue; if (!VOP_CTRL_SUPPORT(vop, afbdc_en)) { @@ -3724,6 +3722,9 @@ static int vop_afbdc_atomic_check(struct drm_crtc *crtc, fb_addr = rk_obj->dma_addr + fb->offsets[0]; s->afbdc_win_format = afbdc_format; + /* Enable color transform for YTR */ + if (fb->modifier & AFBC_FORMAT_MOD_YTR) + s->afbdc_win_format |= AFBC_Y2R_COLOR_TRANSFORM; s->afbdc_win_id = win->win_id; s->afbdc_win_ptr = fb_addr; s->afbdc_win_vir_width = fb->width; @@ -3760,6 +3761,9 @@ static int vop_afbdc_atomic_check(struct drm_crtc *crtc, return -EINVAL; } s->afbdc_win_format = afbdc_format; + /* Enable color transform for YTR */ + if (fb->modifier & AFBC_FORMAT_MOD_YTR) + s->afbdc_win_format |= AFBC_Y2R_COLOR_TRANSFORM; s->afbdc_win_width = fb->width - 1; s->afbdc_win_height = (drm_rect_height(src) >> 16) - 1; s->afbdc_win_id = win->win_id; @@ -4121,7 +4125,7 @@ static void vop_cfg_update(struct drm_crtc *crtc, if (s->afbdc_en) { u32 pic_size, pic_offset; - VOP_CTRL_SET(vop, afbdc_format, s->afbdc_win_format | 1 << 4); + VOP_CTRL_SET(vop, afbdc_format, s->afbdc_win_format); VOP_CTRL_SET(vop, afbdc_hreg_block_split, 0); VOP_CTRL_SET(vop, afbdc_sel, s->afbdc_win_id); VOP_CTRL_SET(vop, afbdc_hdr_ptr, s->afbdc_win_ptr); diff --git a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c index 66308eca7108..69377bb6f4e1 100644 --- a/drivers/gpu/drm/rockchip/rockchip_vop_reg.c +++ b/drivers/gpu/drm/rockchip/rockchip_vop_reg.c @@ -1648,6 +1648,7 @@ static const struct vop_win_data px30_vop_big_win_data[] = { .type = DRM_PLANE_TYPE_OVERLAY }, { .base = 0x00, .phy = &rk3366_lit_win1_data, .type = DRM_PLANE_TYPE_PRIMARY, + .format_modifiers = format_modifiers_afbc, .feature = WIN_FEATURE_AFBDC }, { .base = 0xe0, .phy = &px30_win23_data, .type = DRM_PLANE_TYPE_CURSOR, From 65981ce883f29373f532faebef533d9ec123f922 Mon Sep 17 00:00:00 2001 From: Elaine Zhang Date: Thu, 25 Jan 2024 09:51:09 +0800 Subject: [PATCH 10/12] arm64: dts: rockchip: px30: Change the init sequence of cru and pmucru When use GKI, if the driver is Buildin and there is a reference clock, the driver start to Probe after clk's ko load, but this clk will failed if the parent clock is gpll and gpll has not been initialized in Pmucru. GKI err log: dw-apb-uart ff158000.serial: error -EINVAL: clock rate not defined dw-apb-uart: probe of ff158000.serial failed with error -22 Signed-off-by: Elaine Zhang Change-Id: Ib587ac3594fef94133f12e3f39d42995131067f5 --- arch/arm64/boot/dts/rockchip/px30.dtsi | 30 ++++++++++++++------------ 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/arch/arm64/boot/dts/rockchip/px30.dtsi b/arch/arm64/boot/dts/rockchip/px30.dtsi index ac5652495006..28cccc18f133 100644 --- a/arch/arm64/boot/dts/rockchip/px30.dtsi +++ b/arch/arm64/boot/dts/rockchip/px30.dtsi @@ -1230,17 +1230,6 @@ }; }; - cru: clock-controller@ff2b0000 { - compatible = "rockchip,px30-cru"; - reg = <0x0 0xff2b0000 0x0 0x1000>; - rockchip,grf = <&grf>; - #clock-cells = <1>; - #reset-cells = <1>; - - assigned-clocks = <&cru PLL_NPLL>; - assigned-clock-rates = <1188000000>; - }; - pmucru: clock-controller@ff2bc000 { compatible = "rockchip,px30-pmucru"; reg = <0x0 0xff2bc000 0x0 0x1000>; @@ -1250,13 +1239,26 @@ assigned-clocks = <&pmucru PLL_GPLL>, <&pmucru PCLK_PMU_PRE>, - <&pmucru SCLK_WIFI_PMU>, <&cru ARMCLK>, + <&pmucru SCLK_WIFI_PMU>; + assigned-clock-rates = + <1200000000>, <100000000>, + <26000000>; + }; + + cru: clock-controller@ff2b0000 { + compatible = "rockchip,px30-cru"; + reg = <0x0 0xff2b0000 0x0 0x1000>; + rockchip,grf = <&grf>; + #clock-cells = <1>; + #reset-cells = <1>; + + assigned-clocks = + <&cru PLL_NPLL>, <&cru ARMCLK>, <&cru ACLK_BUS_PRE>, <&cru ACLK_PERI_PRE>, <&cru HCLK_BUS_PRE>, <&cru HCLK_PERI_PRE>, <&cru PCLK_BUS_PRE>, <&cru SCLK_GPU>; assigned-clock-rates = - <1200000000>, <100000000>, - <26000000>, <600000000>, + <1188000000>, <600000000>, <200000000>, <200000000>, <150000000>, <150000000>, <100000000>, <200000000>; From f2af5d4507422c052b44721d154921ed1f81795c Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Thu, 25 Jan 2024 10:13:17 +0800 Subject: [PATCH 11/12] 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 12/12] 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;