Merge commit 'f8a6ea73884dd5aadd827127b35ab56015e1e704'

* commit 'f8a6ea73884dd5aadd827127b35ab56015e1e704':
  ASoC: rockchip: sai: Fix register access in probe
  arm64: dts: rockchip: rk3308: update property logo,kernel
  pwm: rockchip: add a little delay to make sure conlock works
  drm/bridge: synopsys: dw-hdmi-qp: filter hdmi 2.1 resolution when enable-gpio is not configured
  drm/bridge/synopsys: dw-hdmi-qp: fix color error in DVI mode
  ARM: dts: rockchip: support dual sc301iot for rv1106-evb-dual-cam.dtsi
  arm64: dts: rockchip: rk3588-vehicle-adsp-audio-s66: correct i2s3 iomux
  arm64/configs: add rk3308bs_mipi_display.config for support mipi display
  arm64: dts: rockchip: rk3399-evb: use multicodecs instead simple card
  media: rockchip: vicap: fixes create dummuy buffer fail with size 0
  drm/bridge/synopsys: dw-hdmi-qp: Add support for external bridge
  video: rockchip: vehicle: remove vehicle dev when exit

Change-Id: I8094e3496eb3c966e53f0db1f1cdb8d13f95f73b
This commit is contained in:
Tao Huang
2023-08-25 19:32:41 +08:00
14 changed files with 359 additions and 65 deletions

View File

@@ -7,6 +7,8 @@
* sc4336 0x30 lane2~3(dphy2)
* v1.1.0 gc2053 0x37 lane0~1(dphy1)
* gc2053 0x3f lane2~3(dphy2)
* v1.2.0 sc301iot 0x30 lane0~1(dphy1)
* sc301iot 0x32 lane2~3(dphy2)
*/
&csi2_dphy_hw {
@@ -36,6 +38,12 @@
remote-endpoint = <&gc2053_out>;
data-lanes = <1 2>;
};
csi_dphy_input4: endpoint@3 {
reg = <3>;
remote-endpoint = <&sc301iot_out>;
data-lanes = <1 2>;
};
};
port@1 {
@@ -74,6 +82,12 @@
remote-endpoint = <&gc2053_1_out>;
data-lanes = <1 2>;
};
csi_dphy_input5: endpoint@3 {
reg = <3>;
remote-endpoint = <&sc301iot_1_out>;
data-lanes = <1 2>;
};
};
port@1 {
@@ -139,6 +153,28 @@
};
};
sc301iot: sc301iot@30 {
compatible = "smartsens,sc301iot";
status = "okay";
reg = <0x30>;
clocks = <&cru MCLK_REF_MIPI0>;
clock-names = "xvclk";
reset-gpios = <&gpio3 RK_PC5 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&gpio3 RK_PD2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&mipi_refclk_out0>;
rockchip,camera-module-index = <0>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "CMK-OT2349-PC1";
rockchip,camera-module-lens-name = "65IRC-F20";
port {
sc301iot_out: endpoint {
remote-endpoint = <&csi_dphy_input4>;
data-lanes = <1 2>;
};
};
};
sc4336: sc4336@30 {
compatible = "smartsens,sc4336";
status = "okay";
@@ -182,6 +218,28 @@
};
};
};
sc301iot_1: sc301iot_1@32 {
compatible = "smartsens,sc301iot";
status = "okay";
reg = <0x32>;
clocks = <&cru MCLK_REF_MIPI1>;
clock-names = "xvclk";
reset-gpios = <&gpio3 RK_PD1 GPIO_ACTIVE_HIGH>;
pwdn-gpios = <&gpio3 RK_PA4 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default";
pinctrl-0 = <&mipi_refclk_out1>;
rockchip,camera-module-index = <1>;
rockchip,camera-module-facing = "back";
rockchip,camera-module-name = "CMK-OT2349-PC1";
rockchip,camera-module-lens-name = "65IRC-F20";
port {
sc301iot_1_out: endpoint {
remote-endpoint = <&csi_dphy_input5>;
data-lanes = <1 2>;
};
};
};
};
&mipi0_csi2 {

View File

@@ -281,7 +281,7 @@
route_rgb: route-rgb {
status = "disabled";
logo,uboot = "logo.bmp";
/* logo,kernel = "logo_kernel.bmp"; */
logo,kernel = "logo_kernel.bmp";
logo,mode = "center";
charge_logo,mode = "center";
connect = <&vop_out_rgb>;

View File

@@ -10,23 +10,34 @@
compatible = "rockchip,rk3399-sapphire-excavator", "rockchip,rk3399";
rt5651_sound: rt5651-sound {
compatible = "simple-audio-card";
simple-audio-card,format = "i2s";
simple-audio-card,name = "realtek,rt5651-codec";
simple-audio-card,mclk-fs = <256>;
simple-audio-card,widgets =
"Microphone", "Mic Jack",
"Headphone", "Headphone Jack";
simple-audio-card,routing =
"Mic Jack", "MICBIAS1",
"IN1P", "Mic Jack",
"Headphone Jack", "HPOL",
"Headphone Jack", "HPOR";
simple-audio-card,cpu {
sound-dai = <&i2s0>;
};
simple-audio-card,codec {
sound-dai = <&rt5651>;
status = "okay";
compatible = "rockchip,multicodecs-card";
rockchip,card-name = "realtek,rt5651-codec";
keyup-threshold-microvolt = <1800000>;
poll-interval = <100>;
spk-con-gpio = <&gpio0 11 GPIO_ACTIVE_HIGH>;
hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_HIGH>;
rockchip,format = "i2s";
rockchip,mclk-fs = <256>;
rockchip,cpu = <&i2s0>;
rockchip,codec = <&rt5651>;
rockchip,audio-routing =
"Headphone", "HPOL",
"Headphone", "HPOR",
"Speaker", "HPOL",
"Speaker", "HPOR",
"Headphone", "Headphone Power",
"Headphone", "Headphone Power",
"Speaker", "Speaker Power",
"Speaker", "Speaker Power",
"IN1P", "Main Mic",
"IN2P", "Headset Mic",
"IN2N", "Headset Mic";
"Headset Mic", "micbias1";
play-pause-key {
label = "playpause";
linux,code = <KEY_PLAYPAUSE>;
press-threshold-microvolt = <2000>;
};
};
@@ -152,8 +163,6 @@
clock-names = "mclk";
pinctrl-names = "default";
pinctrl-0 = <&i2s_8ch_mclk>;
spk-con-gpio = <&gpio0 11 GPIO_ACTIVE_HIGH>;
hp-det-gpio = <&gpio4 28 GPIO_ACTIVE_LOW>;
};
};

View File

@@ -71,6 +71,8 @@
assigned-clock-parents = <&mclkin_i2s3>;
pinctrl-0 = <&i2s3_sdi
&i2s3_sdo
&i2s3_lrck
&i2s3_sclk
&i2s3_mclk>;
status = "okay";
};

View File

@@ -0,0 +1,128 @@
CONFIG_CMA=y
CONFIG_INPUT_TOUCHSCREEN=y
CONFIG_MFD_RK618=y
CONFIG_CLK_RK618=y
CONFIG_CMA_ALIGNMENT=8
CONFIG_CMA_AREAS=7
# CONFIG_CMA_DEBUG is not set
# CONFIG_CMA_DEBUGFS is not set
# CONFIG_CMA_INACTIVE is not set
CONFIG_CMA_SIZE_MBYTES=16
# CONFIG_CMA_SIZE_SEL_MAX is not set
CONFIG_CMA_SIZE_SEL_MBYTES=y
# CONFIG_CMA_SIZE_SEL_MIN is not set
# CONFIG_CMA_SIZE_SEL_PERCENTAGE is not set
# CONFIG_CMA_SYSFS is not set
CONFIG_COMMON_CLK_ROCKCHIP_REGMAP=y
CONFIG_CONTIG_ALLOC=y
CONFIG_DMA_CMA=y
# CONFIG_DMA_PERNUMA_CMA is not set
CONFIG_DRM_MIPI_DSI=y
# CONFIG_DRM_PANEL_ASUS_Z00T_TM5P5_NT35596 is not set
# CONFIG_DRM_PANEL_BOE_HIMAX8279D is not set
# CONFIG_DRM_PANEL_BOE_TV101WUM_NL6 is not set
# CONFIG_DRM_PANEL_ELIDA_KD35T133 is not set
# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set
# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set
# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set
# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
# CONFIG_DRM_PANEL_KINGDISPLAY_KD097D04 is not set
# CONFIG_DRM_PANEL_LEADTEK_LTK050H3146W is not set
# CONFIG_DRM_PANEL_LEADTEK_LTK500HD1829 is not set
# CONFIG_DRM_PANEL_MANTIX_MLAF057WE51 is not set
# CONFIG_DRM_PANEL_NOVATEK_NT35510 is not set
# CONFIG_DRM_PANEL_ORISETECH_OTM8009A is not set
# CONFIG_DRM_PANEL_OSD_OSD101T2587_53TS is not set
# CONFIG_DRM_PANEL_PANASONIC_VVX10F034N00 is not set
# CONFIG_DRM_PANEL_RASPBERRYPI_TOUCHSCREEN is not set
# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set
# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set
# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6D16D0 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set
# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set
# CONFIG_DRM_PANEL_SHARP_LQ101R1SX01 is not set
# CONFIG_DRM_PANEL_SHARP_LS043T1LE01 is not set
# CONFIG_DRM_PANEL_SITRONIX_ST7701 is not set
# CONFIG_DRM_PANEL_SITRONIX_ST7703 is not set
# CONFIG_DRM_PANEL_SONY_ACX424AKP is not set
# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set
# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set
# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set
CONFIG_DRM_ROCKCHIP_RK618=y
CONFIG_MEMORY_ISOLATION=y
# CONFIG_RK628_MISC is not set
# CONFIG_RK_CMA_PROCFS is not set
# CONFIG_SND_SOC_ROCKCHIP_I2S_TDM_MULTI_LANES is not set
# CONFIG_TOUCHSCREEN_AD7877 is not set
# CONFIG_TOUCHSCREEN_AD7879 is not set
# CONFIG_TOUCHSCREEN_ADC is not set
# CONFIG_TOUCHSCREEN_ADS7846 is not set
# CONFIG_TOUCHSCREEN_AR1021_I2C is not set
# CONFIG_TOUCHSCREEN_ATMEL_MXT is not set
# CONFIG_TOUCHSCREEN_AUO_PIXCIR is not set
# CONFIG_TOUCHSCREEN_BU21013 is not set
# CONFIG_TOUCHSCREEN_BU21029 is not set
# CONFIG_TOUCHSCREEN_CHIPONE_ICN8318 is not set
# CONFIG_TOUCHSCREEN_CY8CTMA140 is not set
# CONFIG_TOUCHSCREEN_CY8CTMG110 is not set
# CONFIG_TOUCHSCREEN_CYTTSP4_CORE is not set
# CONFIG_TOUCHSCREEN_CYTTSP_CORE is not set
# CONFIG_TOUCHSCREEN_DYNAPRO is not set
# CONFIG_TOUCHSCREEN_EDT_FT5X06 is not set
# CONFIG_TOUCHSCREEN_EETI is not set
# CONFIG_TOUCHSCREEN_EGALAX is not set
# CONFIG_TOUCHSCREEN_EGALAX_SERIAL is not set
# CONFIG_TOUCHSCREEN_EKTF2127 is not set
# CONFIG_TOUCHSCREEN_ELAN is not set
# CONFIG_TOUCHSCREEN_ELAN5515 is not set
# CONFIG_TOUCHSCREEN_ELO is not set
# CONFIG_TOUCHSCREEN_EXC3000 is not set
# CONFIG_TOUCHSCREEN_FTS is not set
# CONFIG_TOUCHSCREEN_FUJITSU is not set
# CONFIG_TOUCHSCREEN_GOODIX is not set
# CONFIG_TOUCHSCREEN_GSL3673 is not set
# CONFIG_TOUCHSCREEN_GSL3673_800X1280 is not set
# CONFIG_TOUCHSCREEN_GSLX680_PAD is not set
CONFIG_TOUCHSCREEN_GT1X=y
# CONFIG_TOUCHSCREEN_GUNZE is not set
# CONFIG_TOUCHSCREEN_HAMPSHIRE is not set
# CONFIG_TOUCHSCREEN_HIDEEP is not set
# CONFIG_TOUCHSCREEN_ILI210X is not set
# CONFIG_TOUCHSCREEN_IMX6UL_TSC is not set
# CONFIG_TOUCHSCREEN_INEXIO is not set
# CONFIG_TOUCHSCREEN_IQS5XX is not set
# CONFIG_TOUCHSCREEN_MAX11801 is not set
# CONFIG_TOUCHSCREEN_MCS5000 is not set
# CONFIG_TOUCHSCREEN_MELFAS_MIP4 is not set
# CONFIG_TOUCHSCREEN_MK712 is not set
# CONFIG_TOUCHSCREEN_MMS114 is not set
# CONFIG_TOUCHSCREEN_MTOUCH is not set
# CONFIG_TOUCHSCREEN_PENMOUNT is not set
# CONFIG_TOUCHSCREEN_PIXCIR is not set
CONFIG_TOUCHSCREEN_PROPERTIES=y
# CONFIG_TOUCHSCREEN_RM_TS is not set
# CONFIG_TOUCHSCREEN_ROHM_BU21023 is not set
# CONFIG_TOUCHSCREEN_S6SY761 is not set
# CONFIG_TOUCHSCREEN_SILEAD is not set
# CONFIG_TOUCHSCREEN_SIS_I2C is not set
# CONFIG_TOUCHSCREEN_ST1232 is not set
# CONFIG_TOUCHSCREEN_STMFTS is not set
# CONFIG_TOUCHSCREEN_SURFACE3_SPI is not set
# CONFIG_TOUCHSCREEN_SX8654 is not set
# CONFIG_TOUCHSCREEN_TOUCHIT213 is not set
# CONFIG_TOUCHSCREEN_TOUCHRIGHT is not set
# CONFIG_TOUCHSCREEN_TOUCHWIN is not set
# CONFIG_TOUCHSCREEN_TPS6507X is not set
# CONFIG_TOUCHSCREEN_TSC2004 is not set
# CONFIG_TOUCHSCREEN_TSC2005 is not set
# CONFIG_TOUCHSCREEN_TSC2007 is not set
# CONFIG_TOUCHSCREEN_TSC_SERIO is not set
# CONFIG_TOUCHSCREEN_USB_COMPOSITE is not set
# CONFIG_TOUCHSCREEN_WACOM_I2C is not set
# CONFIG_TOUCHSCREEN_WACOM_W8001 is not set
# CONFIG_TOUCHSCREEN_WDT87XX_I2C is not set
# CONFIG_TOUCHSCREEN_ZET6223 is not set
# CONFIG_TOUCHSCREEN_ZFORCE is not set
# CONFIG_TOUCHSCREEN_ZINITIX is not set

View File

@@ -222,6 +222,7 @@ struct dw_hdmi_phy_data {
struct dw_hdmi_qp {
struct drm_connector connector;
struct drm_bridge bridge;
struct drm_bridge *next_bridge;
struct drm_panel *panel;
struct platform_device *hdcp_dev;
struct platform_device *audio;
@@ -257,6 +258,7 @@ struct dw_hdmi_qp {
bool cec_enable;
bool allm_enable;
bool support_hdmi;
bool skip_connector;
int force_output;
int vp_id;
int old_vp_id;
@@ -2058,6 +2060,9 @@ dw_hdmi_connector_detect(struct drm_connector *connector, bool force)
if (hdmi->panel)
return connector_status_connected;
if (hdmi->next_bridge && hdmi->next_bridge->ops & DRM_BRIDGE_OP_DETECT)
return drm_bridge_detect(hdmi->next_bridge);
if (hdmi->plat_data->left)
secondary = hdmi->plat_data->left;
else if (hdmi->plat_data->right)
@@ -2137,9 +2142,21 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
void *data = hdmi->plat_data->phy_data;
int i, ret = 0;
if (hdmi->plat_data->right && hdmi->plat_data->right->next_bridge) {
struct drm_bridge *bridge = hdmi->plat_data->right->next_bridge;
if (bridge->ops & DRM_BRIDGE_OP_MODES) {
if (!drm_bridge_get_modes(bridge, connector))
return 0;
}
}
if (hdmi->panel)
return drm_panel_get_modes(hdmi->panel, connector);
if (hdmi->next_bridge && hdmi->next_bridge->ops & DRM_BRIDGE_OP_MODES)
return drm_bridge_get_modes(hdmi->next_bridge, connector);
if (!hdmi->ddc)
return 0;
@@ -2226,7 +2243,6 @@ static int dw_hdmi_connector_get_modes(struct drm_connector *connector)
dev_info(hdmi->dev, "failed to get edid\n");
}
dw_hdmi_qp_check_output_type_changed(hdmi);
return ret;
}
@@ -2548,7 +2564,8 @@ static int dw_hdmi_connector_atomic_check(struct drm_connector *connector,
}
if (check_hdr_color_change(old_state, new_state, hdmi) || hdmi->logo_plug_out ||
dw_hdmi_color_changed(connector, state)) {
dw_hdmi_color_changed(connector, state) ||
dw_hdmi_qp_check_output_type_changed(hdmi)) {
u32 mtmdsclk;
crtc_state = drm_atomic_get_crtc_state(state, crtc);
@@ -2610,17 +2627,6 @@ static void dw_hdmi_connector_atomic_commit(struct drm_connector *connector,
void dw_hdmi_qp_set_output_type(struct dw_hdmi_qp *hdmi, u64 val)
{
hdmi->force_output = val;
if (!dw_hdmi_qp_check_output_type_changed(hdmi))
return;
if (hdmi->disabled)
return;
if (!hdmi->sink_is_hdmi)
hdmi_modb(hdmi, OPMODE_DVI, OPMODE_DVI, LINK_CONFIG0);
else
hdmi_modb(hdmi, 0, OPMODE_DVI, LINK_CONFIG0);
}
EXPORT_SYMBOL_GPL(dw_hdmi_qp_set_output_type);
@@ -2684,13 +2690,31 @@ static int dw_hdmi_qp_bridge_attach(struct drm_bridge *bridge,
struct drm_connector *connector = &hdmi->connector;
struct cec_connector_info conn_info;
struct cec_notifier *notifier;
bool skip_connector = false;
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)
if (hdmi->next_bridge) {
struct drm_bridge *next_bridge = hdmi->next_bridge;
int ret;
ret = drm_bridge_attach(bridge->encoder, next_bridge, bridge,
next_bridge->ops & DRM_BRIDGE_OP_MODES ?
DRM_BRIDGE_ATTACH_NO_CONNECTOR : 0);
if (ret) {
DRM_ERROR("failed to attach next bridge: %d\n", ret);
return ret;
}
skip_connector = !(next_bridge->ops & DRM_BRIDGE_OP_MODES);
}
hdmi->skip_connector = skip_connector;
if (flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR || skip_connector)
return 0;
connector->interlace_allowed = 1;
connector->polled = DRM_CONNECTOR_POLL_HPD;
if (hdmi->next_bridge && hdmi->next_bridge->ops & DRM_BRIDGE_OP_DETECT)
connector->polled = DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
drm_connector_helper_add(connector, &dw_hdmi_connector_helper_funcs);
drm_connector_init(bridge->dev, connector, &dw_hdmi_connector_funcs,
@@ -2730,9 +2754,19 @@ dw_hdmi_qp_bridge_mode_valid(struct drm_bridge *bridge,
const struct drm_display_info *info,
const struct drm_display_mode *mode)
{
struct dw_hdmi_qp *hdmi = bridge->driver_private;
const struct dw_hdmi_plat_data *pdata = hdmi->plat_data;
if (mode->clock <= 25000)
return MODE_CLOCK_RANGE;
if (!hdmi->sink_is_hdmi && mode->clock > 340000)
return MODE_BAD;
if (pdata->mode_valid)
return pdata->mode_valid(NULL, pdata->priv_data, info,
mode);
return MODE_OK;
}
@@ -3354,10 +3388,11 @@ __dw_hdmi_probe(struct platform_device *pdev,
struct dw_hdmi_qp_cec_data cec;
struct resource *iores = NULL;
struct drm_panel *panel = NULL;
struct drm_bridge *bridge = NULL;
int irq;
int ret;
ret = drm_of_find_panel_or_bridge(np, 1, -1, &panel, NULL);
ret = drm_of_find_panel_or_bridge(np, 1, -1, &panel, &bridge);
if (ret < 0 && ret != -ENODEV)
return ERR_PTR(ret);
@@ -3366,6 +3401,7 @@ __dw_hdmi_probe(struct platform_device *pdev,
return ERR_PTR(-ENOMEM);
hdmi->panel = panel;
hdmi->next_bridge = bridge;
hdmi->connector.stereo_allowed = 1;
hdmi->plat_data = plat_data;
hdmi->dev = dev;
@@ -3648,6 +3684,10 @@ struct dw_hdmi_qp *dw_hdmi_qp_bind(struct platform_device *pdev,
}
plat_data->connector = &hdmi->connector;
if (hdmi->skip_connector && hdmi->next_bridge)
plat_data->bridge = hdmi->next_bridge;
else
plat_data->bridge = NULL;
}
if (plat_data->split_mode && !hdmi->plat_data->first_screen) {

View File

@@ -1610,14 +1610,6 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
struct drm_crtc *crtc;
struct rockchip_hdmi *hdmi;
/*
* Pixel clocks we support are always < 2GHz and so fit in an
* int. We should make sure source rate does too so we don't get
* overflow when we multiply by 1000.
*/
if (mode->clock > INT_MAX / 1000)
return MODE_BAD;
if (!encoder) {
const struct drm_connector_helper_funcs *funcs;
@@ -1634,6 +1626,21 @@ dw_hdmi_rockchip_mode_valid(struct dw_hdmi *dw_hdmi, void *data,
hdmi = to_rockchip_hdmi(encoder);
if (hdmi->is_hdmi_qp) {
if (!hdmi->enable_gpio && mode->clock > 600000)
return MODE_BAD;
return MODE_OK;
}
/*
* Pixel clocks we support are always < 2GHz and so fit in an
* int. We should make sure source rate does too so we don't get
* overflow when we multiply by 1000.
*/
if (mode->clock > INT_MAX / 1000)
return MODE_BAD;
/*
* If sink max TMDS clock < 340MHz, we should check the mode pixel
* clock > 340MHz is YCbCr420 or not and whether the platform supports
@@ -2050,11 +2057,6 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
else
color_depth = 8;
if (!sink_is_hdmi) {
*color_format = RK_IF_FORMAT_RGB;
color_depth = 8;
}
*eotf = HDMI_EOTF_TRADITIONAL_GAMMA_SDR;
if (conn_state->hdr_output_metadata) {
hdr_metadata = (struct hdr_output_metadata *)
@@ -2104,6 +2106,11 @@ dw_hdmi_rockchip_select_output(struct drm_connector_state *conn_state,
if (hdmi->is_hdmi_qp && mode.clock >= 600000)
*color_format = RK_IF_FORMAT_YCBCR420;
if (!sink_is_hdmi) {
*color_format = RK_IF_FORMAT_RGB;
color_depth = 8;
}
if (*color_format == RK_IF_FORMAT_YCBCR422 || color_depth == 8)
tmdsclock = pixclock;
else
@@ -3382,6 +3389,7 @@ struct rockchip_hdmi_chip_data rk3588_hdmi_chip_data = {
};
static const struct dw_hdmi_plat_data rk3588_hdmi_drv_data = {
.mode_valid = dw_hdmi_rockchip_mode_valid,
.phy_data = &rk3588_hdmi_chip_data,
.qp_phy_ops = &rk3588_hdmi_phy_ops,
.phy_name = "samsung_hdptx_phy",
@@ -3700,7 +3708,20 @@ static int dw_hdmi_rockchip_bind(struct device *dev, struct device *master,
drm_encoder_cleanup(&hdmi->encoder);
}
if (plat_data->connector) {
if (plat_data->bridge) {
struct drm_connector *connector = NULL;
struct list_head *connector_list =
&plat_data->bridge->dev->mode_config.connector_list;
list_for_each_entry(connector, connector_list, head)
if (drm_connector_has_possible_encoder(connector,
&hdmi->encoder))
break;
hdmi->sub_dev.connector = connector;
hdmi->sub_dev.of_node = dev->of_node;
rockchip_drm_register_sub_dev(&hdmi->sub_dev);
} else if (plat_data->connector) {
hdmi->sub_dev.connector = plat_data->connector;
hdmi->sub_dev.loader_protect = dw_hdmi_rockchip_encoder_loader_protect;
if (secondary && device_property_read_bool(secondary->dev, "split-mode"))

View File

@@ -4655,6 +4655,7 @@ static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
struct rkcif_dummy_buffer *dummy_buf = &hw->dummy_buf;
struct rkcif_device *tmp_dev = NULL;
struct v4l2_subdev_frame_interval_enum fie;
struct v4l2_subdev_format fmt;
u32 max_size = 0;
u32 size = 0;
int ret = 0;
@@ -4689,6 +4690,21 @@ static int rkcif_create_dummy_buf(struct rkcif_stream *stream)
continue;
}
}
if (max_size == 0 && dev->terminal_sensor.sd) {
fmt.which = V4L2_SUBDEV_FORMAT_ACTIVE;
ret = v4l2_subdev_call(dev->terminal_sensor.sd,
pad, get_fmt, NULL, &fmt);
if (!ret) {
if (fmt.format.code == MEDIA_BUS_FMT_RGB888_1X24)
size = fmt.format.width * fmt.format.height * 3;
else
size = fmt.format.width * fmt.format.height * 2;
if (size > max_size)
max_size = size;
}
}
dummy_buf->size = max_size;
dummy_buf->is_need_vaddr = true;

View File

@@ -171,7 +171,7 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
const struct pwm_state *state)
{
struct rockchip_pwm_chip *pc = to_rockchip_pwm_chip(chip);
unsigned long period, duty;
unsigned long period, duty, delay_ns;
unsigned long flags;
u64 div;
u32 ctrl;
@@ -193,11 +193,13 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
div = (u64)pc->clk_rate * state->duty_cycle;
duty = DIV_ROUND_CLOSEST_ULL(div, dclk_div * pc->data->prescaler * NSEC_PER_SEC);
if (pc->data->supports_lock) {
div = (u64)10 * NSEC_PER_SEC * dclk_div * pc->data->prescaler;
delay_ns = DIV_ROUND_UP_ULL(div, pc->clk_rate);
}
local_irq_save(flags);
/*
* Lock the period and duty of previous configuration, then
* change the duty and period, that would not be effective.
*/
ctrl = readl_relaxed(pc->base + pc->data->regs.ctrl);
if (pc->data->vop_pwm) {
if (pc->vop_pwm_en)
@@ -255,6 +257,10 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
}
#endif
/*
* Lock the period and duty of previous configuration, then
* change the duty and period, that would not be effective.
*/
if (pc->data->supports_lock) {
ctrl |= PWM_LOCK_EN;
writel_relaxed(ctrl, pc->base + pc->data->regs.ctrl);
@@ -272,12 +278,14 @@ static void rockchip_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
}
/*
* Unlock and set polarity at the same time,
* the configuration of duty, period and polarity
* would be effective together at next period.
* Unlock and set polarity at the same time, the configuration of duty,
* period and polarity would be effective together at next period. It
* takes 10 dclk cycles to make sure lock works before unlocking.
*/
if (pc->data->supports_lock)
if (pc->data->supports_lock) {
ctrl &= ~PWM_LOCK_EN;
ndelay(delay_ns);
}
writel(ctrl, pc->base + pc->data->regs.ctrl);
local_irq_restore(flags);

View File

@@ -106,12 +106,11 @@ static int __init vechile_module_init(void)
return 0;
}
static void __exit vechile_module_exit(void)
void vechile_module_exit(void)
{
misc_deregister(&vechile_dev);
}
module_init(vechile_module_init);
module_exit(vechile_module_exit);
MODULE_LICENSE("GPL");

View File

@@ -487,6 +487,7 @@ VEHICLE_EXIT:
#endif
// msleep(1000);
vehicle_exit_complete_notify(v);
vechile_module_exit();
return 0;
}

View File

@@ -14,5 +14,6 @@ void vehicle_gpio_stat_change_notify(void);
void vehicle_cif_error_notify(int last_line);
void vehicle_android_is_ready_notify(void);
void vehicle_apk_state_change(char crtc[22]);
void vechile_module_exit(void);
#endif

View File

@@ -268,6 +268,7 @@ struct dw_hdmi_plat_data {
/* Vendor Property support */
const struct dw_hdmi_property_ops *property_ops;
struct drm_connector *connector;
struct drm_bridge *bridge;
};
struct dw_hdmi_cec_wake_ops {

View File

@@ -1398,6 +1398,20 @@ static int rockchip_sai_probe(struct platform_device *pdev)
if (ret)
return ret;
ret = rockchip_sai_init_dai(sai, res, &dai);
if (ret)
return ret;
/*
* MUST: after pm_runtime_enable step, any register R/W
* should be wrapped with pm_runtime_get_sync/put.
*
* Another approach is to enable the regcache true to
* avoid access HW registers.
*
* Alternatively, performing the registers R/W before
* pm_runtime_enable is also a good option.
*/
pm_runtime_enable(&pdev->dev);
if (!pm_runtime_enabled(&pdev->dev)) {
ret = rockchip_sai_runtime_resume(&pdev->dev);
@@ -1405,10 +1419,6 @@ static int rockchip_sai_probe(struct platform_device *pdev)
goto err_runtime_disable;
}
ret = rockchip_sai_init_dai(sai, res, &dai);
if (ret)
goto err_runtime_suspend;
ret = devm_snd_soc_register_component(&pdev->dev,
&rockchip_sai_component,
dai, 1);