kernel:refresh patch (#11005)

* kernel: bump 5.15 to 5.15.102

* kernel:refresh patch
This commit is contained in:
骷髅头 2023-03-16 20:33:33 +08:00 committed by GitHub
parent 53134b2571
commit 138af4d3cf
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
96 changed files with 1950 additions and 1082 deletions

View File

@ -17,7 +17,7 @@ Link: https://patchwork.freedesktop.org/patch/msgid/20210819135931.895976-5-maxi
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1748,7 +1748,7 @@ static irqreturn_t vc4_cec_irq_handler(i @@ -1749,7 +1749,7 @@ static irqreturn_t vc4_cec_irq_handler(i
return ret; return ret;
} }
@ -26,7 +26,7 @@ Link: https://patchwork.freedesktop.org/patch/msgid/20210819135931.895976-5-maxi
{ {
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
/* clock period in microseconds */ /* clock period in microseconds */
@@ -1761,38 +1761,53 @@ static int vc4_hdmi_cec_adap_enable(stru @@ -1762,38 +1762,53 @@ static int vc4_hdmi_cec_adap_enable(stru
val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) | val |= ((4700 / usecs) << VC4_HDMI_CEC_CNT_TO_4700_US_SHIFT) |
((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT); ((4500 / usecs) << VC4_HDMI_CEC_CNT_TO_4500_US_SHIFT);

View File

@ -24,7 +24,7 @@ Link: https://patchwork.freedesktop.org/patch/msgid/20210819135931.895976-6-maxi
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1753,8 +1753,14 @@ static int vc4_hdmi_cec_enable(struct ce @@ -1754,8 +1754,14 @@ static int vc4_hdmi_cec_enable(struct ce
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
/* clock period in microseconds */ /* clock period in microseconds */
const u32 usecs = 1000000 / CEC_CLOCK_FREQ; const u32 usecs = 1000000 / CEC_CLOCK_FREQ;
@ -40,7 +40,7 @@ Link: https://patchwork.freedesktop.org/patch/msgid/20210819135931.895976-6-maxi
val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET |
VC4_HDMI_CEC_CNT_TO_4700_US_MASK | VC4_HDMI_CEC_CNT_TO_4700_US_MASK |
VC4_HDMI_CEC_CNT_TO_4500_US_MASK); VC4_HDMI_CEC_CNT_TO_4500_US_MASK);
@@ -1797,6 +1803,8 @@ static int vc4_hdmi_cec_disable(struct c @@ -1798,6 +1804,8 @@ static int vc4_hdmi_cec_disable(struct c
HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) | HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) |
VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET); VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);

View File

@ -20,7 +20,7 @@ Link: https://lore.kernel.org/r/20211025152903.1088803-9-maxime@cerno.tech
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -2386,7 +2386,7 @@ static const struct vc4_hdmi_variant bcm @@ -2387,7 +2387,7 @@ static const struct vc4_hdmi_variant bcm
.encoder_type = VC4_ENCODER_TYPE_HDMI0, .encoder_type = VC4_ENCODER_TYPE_HDMI0,
.debugfs_name = "hdmi0_regs", .debugfs_name = "hdmi0_regs",
.card_name = "vc4-hdmi-0", .card_name = "vc4-hdmi-0",

View File

@ -281,9 +281,9 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi, static void vc5_hdmi_set_timings(struct vc4_hdmi *vc4_hdmi,
@@ -789,10 +856,13 @@ static void vc5_hdmi_set_timings(struct @@ -790,10 +857,13 @@ static void vc5_hdmi_set_timings(struct
VC4_SET_FIELD(mode->crtc_vtotal - VC4_SET_FIELD(mode->crtc_vtotal -
mode->crtc_vsync_end - interlaced, mode->crtc_vsync_end,
VC4_HDMI_VERTB_VBP)); VC4_HDMI_VERTB_VBP));
+ unsigned long flags; + unsigned long flags;
unsigned char gcp; unsigned char gcp;
@ -295,7 +295,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021); HDMI_WRITE(HDMI_VEC_INTERFACE_XBAR, 0x354021);
HDMI_WRITE(HDMI_HORZA, HDMI_WRITE(HDMI_HORZA,
(vsync_pos ? VC5_HDMI_HORZA_VPOS : 0) | (vsync_pos ? VC5_HDMI_HORZA_VPOS : 0) |
@@ -856,13 +926,18 @@ static void vc5_hdmi_set_timings(struct @@ -857,13 +927,18 @@ static void vc5_hdmi_set_timings(struct
HDMI_WRITE(HDMI_MISC_CONTROL, reg); HDMI_WRITE(HDMI_MISC_CONTROL, reg);
HDMI_WRITE(HDMI_CLOCK_STOP, 0); HDMI_WRITE(HDMI_CLOCK_STOP, 0);
@ -314,7 +314,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
drift = HDMI_READ(HDMI_FIFO_CTL); drift = HDMI_READ(HDMI_FIFO_CTL);
drift &= VC4_HDMI_FIFO_VALID_WRITE_MASK; drift &= VC4_HDMI_FIFO_VALID_WRITE_MASK;
@@ -870,12 +945,20 @@ static void vc4_hdmi_recenter_fifo(struc @@ -871,12 +946,20 @@ static void vc4_hdmi_recenter_fifo(struc
drift & ~VC4_HDMI_FIFO_CTL_RECENTER); drift & ~VC4_HDMI_FIFO_CTL_RECENTER);
HDMI_WRITE(HDMI_FIFO_CTL, HDMI_WRITE(HDMI_FIFO_CTL,
drift | VC4_HDMI_FIFO_CTL_RECENTER); drift | VC4_HDMI_FIFO_CTL_RECENTER);
@ -335,7 +335,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
ret = wait_for(HDMI_READ(HDMI_FIFO_CTL) & ret = wait_for(HDMI_READ(HDMI_FIFO_CTL) &
VC4_HDMI_FIFO_CTL_RECENTER_DONE, 1); VC4_HDMI_FIFO_CTL_RECENTER_DONE, 1);
WARN_ONCE(ret, "Timeout waiting for " WARN_ONCE(ret, "Timeout waiting for "
@@ -909,6 +992,7 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -910,6 +993,7 @@ static void vc4_hdmi_encoder_pre_crtc_co
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
unsigned long pixel_rate = vc4_conn_state->pixel_rate; unsigned long pixel_rate = vc4_conn_state->pixel_rate;
unsigned long bvb_rate, hsm_rate; unsigned long bvb_rate, hsm_rate;
@ -343,7 +343,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
int ret; int ret;
/* /*
@@ -977,11 +1061,15 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -978,11 +1062,15 @@ static void vc4_hdmi_encoder_pre_crtc_co
if (vc4_hdmi->variant->phy_init) if (vc4_hdmi->variant->phy_init)
vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state); vc4_hdmi->variant->phy_init(vc4_hdmi, vc4_conn_state);
@ -359,7 +359,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_hdmi->variant->set_timings) if (vc4_hdmi->variant->set_timings)
vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode); vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode);
@@ -1001,6 +1089,7 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1002,6 +1090,7 @@ static void vc4_hdmi_encoder_pre_crtc_en
struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode; struct drm_display_mode *mode = &encoder->crtc->state->adjusted_mode;
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
@ -367,7 +367,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_encoder->hdmi_monitor && if (vc4_encoder->hdmi_monitor &&
drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED) { drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED) {
@@ -1015,7 +1104,9 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1016,7 +1105,9 @@ static void vc4_hdmi_encoder_pre_crtc_en
vc4_encoder->limited_rgb_range = false; vc4_encoder->limited_rgb_range = false;
} }
@ -377,7 +377,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder, static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
@@ -1026,8 +1117,11 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1027,8 +1118,11 @@ static void vc4_hdmi_encoder_post_crtc_e
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC; bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
@ -389,7 +389,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
HDMI_WRITE(HDMI_VID_CTL, HDMI_WRITE(HDMI_VID_CTL,
VC4_HD_VID_CTL_ENABLE | VC4_HD_VID_CTL_ENABLE |
VC4_HD_VID_CTL_CLRRGB | VC4_HD_VID_CTL_CLRRGB |
@@ -1044,6 +1138,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1045,6 +1139,8 @@ static void vc4_hdmi_encoder_post_crtc_e
HDMI_READ(HDMI_SCHEDULER_CONTROL) | HDMI_READ(HDMI_SCHEDULER_CONTROL) |
VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI); VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
@ -398,7 +398,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
ret = wait_for(HDMI_READ(HDMI_SCHEDULER_CONTROL) & ret = wait_for(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE, 1000); VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE, 1000);
WARN_ONCE(ret, "Timeout waiting for " WARN_ONCE(ret, "Timeout waiting for "
@@ -1056,6 +1152,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1057,6 +1153,8 @@ static void vc4_hdmi_encoder_post_crtc_e
HDMI_READ(HDMI_SCHEDULER_CONTROL) & HDMI_READ(HDMI_SCHEDULER_CONTROL) &
~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI); ~VC4_HDMI_SCHEDULER_CONTROL_MODE_HDMI);
@ -407,7 +407,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
ret = wait_for(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) & ret = wait_for(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE), 1000); VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE), 1000);
WARN_ONCE(ret, "Timeout waiting for " WARN_ONCE(ret, "Timeout waiting for "
@@ -1063,6 +1161,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1064,6 +1162,8 @@ static void vc4_hdmi_encoder_post_crtc_e
} }
if (vc4_encoder->hdmi_monitor) { if (vc4_encoder->hdmi_monitor) {
@ -416,7 +416,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) & WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE)); VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE));
HDMI_WRITE(HDMI_SCHEDULER_CONTROL, HDMI_WRITE(HDMI_SCHEDULER_CONTROL,
@@ -1072,6 +1172,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1073,6 +1173,8 @@ static void vc4_hdmi_encoder_post_crtc_e
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, HDMI_WRITE(HDMI_RAM_PACKET_CONFIG,
VC4_HDMI_RAM_PACKET_ENABLE); VC4_HDMI_RAM_PACKET_ENABLE);
@ -425,7 +425,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi_set_infoframes(encoder); vc4_hdmi_set_infoframes(encoder);
} }
@@ -1195,6 +1297,7 @@ static void vc4_hdmi_audio_set_mai_clock @@ -1196,6 +1298,7 @@ static void vc4_hdmi_audio_set_mai_clock
unsigned int samplerate) unsigned int samplerate)
{ {
u32 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock); u32 hsm_clock = clk_get_rate(vc4_hdmi->audio_clock);
@ -433,7 +433,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
unsigned long n, m; unsigned long n, m;
rational_best_approximation(hsm_clock, samplerate, rational_best_approximation(hsm_clock, samplerate,
@@ -1204,9 +1307,11 @@ static void vc4_hdmi_audio_set_mai_clock @@ -1205,9 +1308,11 @@ static void vc4_hdmi_audio_set_mai_clock
VC4_HD_MAI_SMP_M_SHIFT) + 1, VC4_HD_MAI_SMP_M_SHIFT) + 1,
&n, &m); &n, &m);
@ -445,7 +445,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate) static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate)
@@ -1217,6 +1322,8 @@ static void vc4_hdmi_set_n_cts(struct vc @@ -1218,6 +1323,8 @@ static void vc4_hdmi_set_n_cts(struct vc
u32 n, cts; u32 n, cts;
u64 tmp; u64 tmp;
@ -454,7 +454,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
n = 128 * samplerate / 1000; n = 128 * samplerate / 1000;
tmp = (u64)(mode->clock * 1000) * n; tmp = (u64)(mode->clock * 1000) * n;
do_div(tmp, 128 * samplerate); do_div(tmp, 128 * samplerate);
@@ -1246,6 +1353,7 @@ static int vc4_hdmi_audio_startup(struct @@ -1247,6 +1354,7 @@ static int vc4_hdmi_audio_startup(struct
{ {
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
@ -462,7 +462,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* /*
* If the HDMI encoder hasn't probed, or the encoder is * If the HDMI encoder hasn't probed, or the encoder is
@@ -1257,12 +1365,14 @@ static int vc4_hdmi_audio_startup(struct @@ -1258,12 +1366,14 @@ static int vc4_hdmi_audio_startup(struct
vc4_hdmi->audio.streaming = true; vc4_hdmi->audio.streaming = true;
@ -477,7 +477,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_hdmi->variant->phy_rng_enable) if (vc4_hdmi->variant->phy_rng_enable)
vc4_hdmi->variant->phy_rng_enable(vc4_hdmi); vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
@@ -1274,6 +1384,7 @@ static void vc4_hdmi_audio_reset(struct @@ -1275,6 +1385,7 @@ static void vc4_hdmi_audio_reset(struct
{ {
struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
struct device *dev = &vc4_hdmi->pdev->dev; struct device *dev = &vc4_hdmi->pdev->dev;
@ -485,7 +485,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
int ret; int ret;
vc4_hdmi->audio.streaming = false; vc4_hdmi->audio.streaming = false;
@@ -1281,20 +1392,29 @@ static void vc4_hdmi_audio_reset(struct @@ -1282,20 +1393,29 @@ static void vc4_hdmi_audio_reset(struct
if (ret) if (ret)
dev_err(dev, "Failed to stop audio infoframe: %d\n", ret); dev_err(dev, "Failed to stop audio infoframe: %d\n", ret);
@ -515,7 +515,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_hdmi->variant->phy_rng_disable) if (vc4_hdmi->variant->phy_rng_disable)
vc4_hdmi->variant->phy_rng_disable(vc4_hdmi); vc4_hdmi->variant->phy_rng_disable(vc4_hdmi);
@@ -1349,6 +1469,7 @@ static int vc4_hdmi_audio_prepare(struct @@ -1350,6 +1470,7 @@ static int vc4_hdmi_audio_prepare(struct
struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
unsigned int sample_rate = params->sample_rate; unsigned int sample_rate = params->sample_rate;
unsigned int channels = params->channels; unsigned int channels = params->channels;
@ -523,7 +523,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
u32 audio_packet_config, channel_mask; u32 audio_packet_config, channel_mask;
u32 channel_map; u32 channel_map;
u32 mai_audio_format; u32 mai_audio_format;
@@ -1357,14 +1478,15 @@ static int vc4_hdmi_audio_prepare(struct @@ -1358,14 +1479,15 @@ static int vc4_hdmi_audio_prepare(struct
dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__, dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
sample_rate, params->sample_width, channels); sample_rate, params->sample_width, channels);
@ -541,7 +541,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
mai_sample_rate = sample_rate_to_mai_fmt(sample_rate); mai_sample_rate = sample_rate_to_mai_fmt(sample_rate);
if (params->iec.status[0] & IEC958_AES0_NONAUDIO && if (params->iec.status[0] & IEC958_AES0_NONAUDIO &&
params->channels == 8) params->channels == 8)
@@ -1402,8 +1524,11 @@ static int vc4_hdmi_audio_prepare(struct @@ -1403,8 +1525,11 @@ static int vc4_hdmi_audio_prepare(struct
channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask); channel_map = vc4_hdmi->variant->channel_map(vc4_hdmi, channel_mask);
HDMI_WRITE(HDMI_MAI_CHANNEL_MAP, channel_map); HDMI_WRITE(HDMI_MAI_CHANNEL_MAP, channel_map);
HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config); HDMI_WRITE(HDMI_AUDIO_PACKET_CONFIG, audio_packet_config);
@ -553,7 +553,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea)); memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));
vc4_hdmi_set_audio_infoframe(encoder); vc4_hdmi_set_audio_infoframe(encoder);
@@ -1677,6 +1802,8 @@ static void vc4_cec_read_msg(struct vc4_ @@ -1678,6 +1803,8 @@ static void vc4_cec_read_msg(struct vc4_
struct cec_msg *msg = &vc4_hdmi->cec_rx_msg; struct cec_msg *msg = &vc4_hdmi->cec_rx_msg;
unsigned int i; unsigned int i;
@ -562,7 +562,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >> msg->len = 1 + ((cntrl1 & VC4_HDMI_CEC_REC_WRD_CNT_MASK) >>
VC4_HDMI_CEC_REC_WRD_CNT_SHIFT); VC4_HDMI_CEC_REC_WRD_CNT_SHIFT);
@@ -1695,11 +1822,12 @@ static void vc4_cec_read_msg(struct vc4_ @@ -1696,11 +1823,12 @@ static void vc4_cec_read_msg(struct vc4_
} }
} }
@ -577,7 +577,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1); cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD; vc4_hdmi->cec_tx_ok = cntrl1 & VC4_HDMI_CEC_TX_STATUS_GOOD;
cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN; cntrl1 &= ~VC4_HDMI_CEC_START_XMIT_BEGIN;
@@ -1708,11 +1836,24 @@ static irqreturn_t vc4_cec_irq_handler_t @@ -1709,11 +1837,24 @@ static irqreturn_t vc4_cec_irq_handler_t
return IRQ_WAKE_THREAD; return IRQ_WAKE_THREAD;
} }
@ -603,7 +603,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi->cec_rx_msg.len = 0; vc4_hdmi->cec_rx_msg.len = 0;
cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1); cntrl1 = HDMI_READ(HDMI_CEC_CNTRL_1);
vc4_cec_read_msg(vc4_hdmi, cntrl1); vc4_cec_read_msg(vc4_hdmi, cntrl1);
@@ -1725,6 +1866,18 @@ static irqreturn_t vc4_cec_irq_handler_r @@ -1726,6 +1867,18 @@ static irqreturn_t vc4_cec_irq_handler_r
return IRQ_WAKE_THREAD; return IRQ_WAKE_THREAD;
} }
@ -622,7 +622,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static irqreturn_t vc4_cec_irq_handler(int irq, void *priv) static irqreturn_t vc4_cec_irq_handler(int irq, void *priv)
{ {
struct vc4_hdmi *vc4_hdmi = priv; struct vc4_hdmi *vc4_hdmi = priv;
@@ -1735,14 +1888,17 @@ static irqreturn_t vc4_cec_irq_handler(i @@ -1736,14 +1889,17 @@ static irqreturn_t vc4_cec_irq_handler(i
if (!(stat & VC4_HDMI_CPU_CEC)) if (!(stat & VC4_HDMI_CPU_CEC))
return IRQ_NONE; return IRQ_NONE;
@ -642,7 +642,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return ret; return ret;
} }
@@ -1751,6 +1907,7 @@ static int vc4_hdmi_cec_enable(struct ce @@ -1752,6 +1908,7 @@ static int vc4_hdmi_cec_enable(struct ce
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
/* clock period in microseconds */ /* clock period in microseconds */
const u32 usecs = 1000000 / CEC_CLOCK_FREQ; const u32 usecs = 1000000 / CEC_CLOCK_FREQ;
@ -650,7 +650,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
u32 val; u32 val;
int ret; int ret;
@@ -1758,6 +1915,8 @@ static int vc4_hdmi_cec_enable(struct ce @@ -1759,6 +1916,8 @@ static int vc4_hdmi_cec_enable(struct ce
if (ret) if (ret)
return ret; return ret;
@ -659,7 +659,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
val = HDMI_READ(HDMI_CEC_CNTRL_5); val = HDMI_READ(HDMI_CEC_CNTRL_5);
val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET | val &= ~(VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET |
VC4_HDMI_CEC_CNT_TO_4700_US_MASK | VC4_HDMI_CEC_CNT_TO_4700_US_MASK |
@@ -1788,12 +1947,17 @@ static int vc4_hdmi_cec_enable(struct ce @@ -1789,12 +1948,17 @@ static int vc4_hdmi_cec_enable(struct ce
if (!vc4_hdmi->variant->external_irq_controller) if (!vc4_hdmi->variant->external_irq_controller)
HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC); HDMI_WRITE(HDMI_CEC_CPU_MASK_CLEAR, VC4_HDMI_CPU_CEC);
@ -677,7 +677,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (!vc4_hdmi->variant->external_irq_controller) if (!vc4_hdmi->variant->external_irq_controller)
HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC); HDMI_WRITE(HDMI_CEC_CPU_MASK_SET, VC4_HDMI_CPU_CEC);
@@ -1801,6 +1965,8 @@ static int vc4_hdmi_cec_disable(struct c @@ -1802,6 +1966,8 @@ static int vc4_hdmi_cec_disable(struct c
HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) | HDMI_WRITE(HDMI_CEC_CNTRL_5, HDMI_READ(HDMI_CEC_CNTRL_5) |
VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET); VC4_HDMI_CEC_TX_SW_RESET | VC4_HDMI_CEC_RX_SW_RESET);
@ -686,7 +686,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
pm_runtime_put(&vc4_hdmi->pdev->dev); pm_runtime_put(&vc4_hdmi->pdev->dev);
return 0; return 0;
@@ -1817,10 +1983,14 @@ static int vc4_hdmi_cec_adap_enable(stru @@ -1818,10 +1984,14 @@ static int vc4_hdmi_cec_adap_enable(stru
static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr) static int vc4_hdmi_cec_adap_log_addr(struct cec_adapter *adap, u8 log_addr)
{ {
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
@ -701,7 +701,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return 0; return 0;
} }
@@ -1829,6 +1999,7 @@ static int vc4_hdmi_cec_adap_transmit(st @@ -1830,6 +2000,7 @@ static int vc4_hdmi_cec_adap_transmit(st
{ {
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
struct drm_device *dev = vc4_hdmi->connector.dev; struct drm_device *dev = vc4_hdmi->connector.dev;
@ -709,7 +709,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
u32 val; u32 val;
unsigned int i; unsigned int i;
@@ -1837,6 +2008,8 @@ static int vc4_hdmi_cec_adap_transmit(st @@ -1838,6 +2009,8 @@ static int vc4_hdmi_cec_adap_transmit(st
return -ENOMEM; return -ENOMEM;
} }
@ -718,7 +718,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
for (i = 0; i < msg->len; i += 4) for (i = 0; i < msg->len; i += 4)
HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2), HDMI_WRITE(HDMI_CEC_TX_DATA_1 + (i >> 2),
(msg->msg[i]) | (msg->msg[i]) |
@@ -1852,6 +2025,9 @@ static int vc4_hdmi_cec_adap_transmit(st @@ -1853,6 +2026,9 @@ static int vc4_hdmi_cec_adap_transmit(st
val |= VC4_HDMI_CEC_START_XMIT_BEGIN; val |= VC4_HDMI_CEC_START_XMIT_BEGIN;
HDMI_WRITE(HDMI_CEC_CNTRL_1, val); HDMI_WRITE(HDMI_CEC_CNTRL_1, val);
@ -728,7 +728,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return 0; return 0;
} }
@@ -1866,6 +2042,7 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -1867,6 +2043,7 @@ static int vc4_hdmi_cec_init(struct vc4_
struct cec_connector_info conn_info; struct cec_connector_info conn_info;
struct platform_device *pdev = vc4_hdmi->pdev; struct platform_device *pdev = vc4_hdmi->pdev;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
@ -736,7 +736,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
u32 value; u32 value;
int ret; int ret;
@@ -1886,10 +2063,12 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -1887,10 +2064,12 @@ static int vc4_hdmi_cec_init(struct vc4_
cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
@ -749,7 +749,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi_cec_update_clk_div(vc4_hdmi); vc4_hdmi_cec_update_clk_div(vc4_hdmi);
@@ -1908,7 +2087,9 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -1909,7 +2088,9 @@ static int vc4_hdmi_cec_init(struct vc4_
if (ret) if (ret)
goto err_remove_cec_rx_handler; goto err_remove_cec_rx_handler;
} else { } else {
@ -759,7 +759,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
ret = request_threaded_irq(platform_get_irq(pdev, 0), ret = request_threaded_irq(platform_get_irq(pdev, 0),
vc4_cec_irq_handler, vc4_cec_irq_handler,
@@ -2178,6 +2359,7 @@ static int vc4_hdmi_bind(struct device * @@ -2179,6 +2360,7 @@ static int vc4_hdmi_bind(struct device *
vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL); vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL);
if (!vc4_hdmi) if (!vc4_hdmi)
return -ENOMEM; return -ENOMEM;

View File

@ -169,7 +169,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_disable(struct drm_encoder *encoder)
@@ -995,6 +1024,8 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -996,6 +1025,8 @@ static void vc4_hdmi_encoder_pre_crtc_co
unsigned long flags; unsigned long flags;
int ret; int ret;
@ -178,7 +178,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* /*
* As stated in RPi's vc4 firmware "HDMI state machine (HSM) clock must * As stated in RPi's vc4 firmware "HDMI state machine (HSM) clock must
* be faster than pixel clock, infinitesimally faster, tested in * be faster than pixel clock, infinitesimally faster, tested in
@@ -1015,13 +1046,13 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -1016,13 +1047,13 @@ static void vc4_hdmi_encoder_pre_crtc_co
ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate); ret = clk_set_min_rate(vc4_hdmi->hsm_clock, hsm_rate);
if (ret) { if (ret) {
DRM_ERROR("Failed to set HSM clock rate: %d\n", ret); DRM_ERROR("Failed to set HSM clock rate: %d\n", ret);
@ -194,7 +194,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
ret = clk_set_rate(vc4_hdmi->pixel_clock, pixel_rate); ret = clk_set_rate(vc4_hdmi->pixel_clock, pixel_rate);
@@ -1073,13 +1104,16 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -1074,13 +1105,16 @@ static void vc4_hdmi_encoder_pre_crtc_co
if (vc4_hdmi->variant->set_timings) if (vc4_hdmi->variant->set_timings)
vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode); vc4_hdmi->variant->set_timings(vc4_hdmi, conn_state, mode);
@ -212,7 +212,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return; return;
} }
@@ -1091,6 +1125,8 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1092,6 +1126,8 @@ static void vc4_hdmi_encoder_pre_crtc_en
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
unsigned long flags; unsigned long flags;
@ -221,7 +221,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_encoder->hdmi_monitor && if (vc4_encoder->hdmi_monitor &&
drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED) { drm_default_rgb_quant_range(mode) == HDMI_QUANTIZATION_RANGE_LIMITED) {
if (vc4_hdmi->variant->csc_setup) if (vc4_hdmi->variant->csc_setup)
@@ -1107,6 +1143,8 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1108,6 +1144,8 @@ static void vc4_hdmi_encoder_pre_crtc_en
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N); HDMI_WRITE(HDMI_FIFO_CTL, VC4_HDMI_FIFO_CTL_MASTER_SLAVE_N);
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
@ -230,7 +230,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder, static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
@@ -1120,6 +1158,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1121,6 +1159,8 @@ static void vc4_hdmi_encoder_post_crtc_e
unsigned long flags; unsigned long flags;
int ret; int ret;
@ -239,7 +239,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_VID_CTL, HDMI_WRITE(HDMI_VID_CTL,
@@ -1179,6 +1219,8 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1180,6 +1220,8 @@ static void vc4_hdmi_encoder_post_crtc_e
vc4_hdmi_recenter_fifo(vc4_hdmi); vc4_hdmi_recenter_fifo(vc4_hdmi);
vc4_hdmi_enable_scrambling(encoder); vc4_hdmi_enable_scrambling(encoder);
@ -248,7 +248,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
@@ -1322,6 +1364,7 @@ static void vc4_hdmi_set_n_cts(struct vc @@ -1323,6 +1365,7 @@ static void vc4_hdmi_set_n_cts(struct vc
u32 n, cts; u32 n, cts;
u64 tmp; u64 tmp;
@ -256,7 +256,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
lockdep_assert_held(&vc4_hdmi->hw_lock); lockdep_assert_held(&vc4_hdmi->hw_lock);
n = 128 * samplerate / 1000; n = 128 * samplerate / 1000;
@@ -1355,13 +1398,17 @@ static int vc4_hdmi_audio_startup(struct @@ -1356,13 +1399,17 @@ static int vc4_hdmi_audio_startup(struct
struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base; struct drm_encoder *encoder = &vc4_hdmi->encoder.base.base;
unsigned long flags; unsigned long flags;
@ -275,7 +275,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi->audio.streaming = true; vc4_hdmi->audio.streaming = true;
@@ -1377,6 +1424,8 @@ static int vc4_hdmi_audio_startup(struct @@ -1378,6 +1425,8 @@ static int vc4_hdmi_audio_startup(struct
if (vc4_hdmi->variant->phy_rng_enable) if (vc4_hdmi->variant->phy_rng_enable)
vc4_hdmi->variant->phy_rng_enable(vc4_hdmi); vc4_hdmi->variant->phy_rng_enable(vc4_hdmi);
@ -284,7 +284,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return 0; return 0;
} }
@@ -1387,6 +1436,8 @@ static void vc4_hdmi_audio_reset(struct @@ -1388,6 +1437,8 @@ static void vc4_hdmi_audio_reset(struct
unsigned long flags; unsigned long flags;
int ret; int ret;
@ -293,7 +293,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi->audio.streaming = false; vc4_hdmi->audio.streaming = false;
ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO, false); ret = vc4_hdmi_stop_packet(encoder, HDMI_INFOFRAME_TYPE_AUDIO, false);
if (ret) if (ret)
@@ -1406,6 +1457,8 @@ static void vc4_hdmi_audio_shutdown(stru @@ -1407,6 +1458,8 @@ static void vc4_hdmi_audio_shutdown(stru
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
unsigned long flags; unsigned long flags;
@ -302,7 +302,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_MAI_CTL, HDMI_WRITE(HDMI_MAI_CTL,
@@ -1420,6 +1473,8 @@ static void vc4_hdmi_audio_shutdown(stru @@ -1421,6 +1474,8 @@ static void vc4_hdmi_audio_shutdown(stru
vc4_hdmi->audio.streaming = false; vc4_hdmi->audio.streaming = false;
vc4_hdmi_audio_reset(vc4_hdmi); vc4_hdmi_audio_reset(vc4_hdmi);
@ -311,7 +311,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static int sample_rate_to_mai_fmt(int samplerate) static int sample_rate_to_mai_fmt(int samplerate)
@@ -1478,6 +1533,8 @@ static int vc4_hdmi_audio_prepare(struct @@ -1479,6 +1534,8 @@ static int vc4_hdmi_audio_prepare(struct
dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__, dev_dbg(dev, "%s: %u Hz, %d bit, %d channels\n", __func__,
sample_rate, params->sample_width, channels); sample_rate, params->sample_width, channels);
@ -320,7 +320,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate); vc4_hdmi_audio_set_mai_clock(vc4_hdmi, sample_rate);
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
@@ -1532,6 +1589,8 @@ static int vc4_hdmi_audio_prepare(struct @@ -1533,6 +1590,8 @@ static int vc4_hdmi_audio_prepare(struct
memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea)); memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));
vc4_hdmi_set_audio_infoframe(encoder); vc4_hdmi_set_audio_infoframe(encoder);
@ -329,7 +329,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return 0; return 0;
} }
@@ -1574,7 +1633,9 @@ static int vc4_hdmi_audio_get_eld(struct @@ -1575,7 +1634,9 @@ static int vc4_hdmi_audio_get_eld(struct
struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev); struct vc4_hdmi *vc4_hdmi = dev_get_drvdata(dev);
struct drm_connector *connector = &vc4_hdmi->connector; struct drm_connector *connector = &vc4_hdmi->connector;
@ -339,7 +339,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return 0; return 0;
} }
@@ -1911,6 +1972,17 @@ static int vc4_hdmi_cec_enable(struct ce @@ -1912,6 +1973,17 @@ static int vc4_hdmi_cec_enable(struct ce
u32 val; u32 val;
int ret; int ret;
@ -357,7 +357,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev); ret = pm_runtime_resume_and_get(&vc4_hdmi->pdev->dev);
if (ret) if (ret)
return ret; return ret;
@@ -1957,6 +2029,17 @@ static int vc4_hdmi_cec_disable(struct c @@ -1958,6 +2030,17 @@ static int vc4_hdmi_cec_disable(struct c
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
unsigned long flags; unsigned long flags;
@ -375,7 +375,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
if (!vc4_hdmi->variant->external_irq_controller) if (!vc4_hdmi->variant->external_irq_controller)
@@ -1985,6 +2068,17 @@ static int vc4_hdmi_cec_adap_log_addr(st @@ -1986,6 +2069,17 @@ static int vc4_hdmi_cec_adap_log_addr(st
struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap); struct vc4_hdmi *vc4_hdmi = cec_get_drvdata(adap);
unsigned long flags; unsigned long flags;
@ -393,7 +393,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_CEC_CNTRL_1, HDMI_WRITE(HDMI_CEC_CNTRL_1,
(HDMI_READ(HDMI_CEC_CNTRL_1) & ~VC4_HDMI_CEC_ADDR_MASK) | (HDMI_READ(HDMI_CEC_CNTRL_1) & ~VC4_HDMI_CEC_ADDR_MASK) |
@@ -2003,6 +2097,17 @@ static int vc4_hdmi_cec_adap_transmit(st @@ -2004,6 +2098,17 @@ static int vc4_hdmi_cec_adap_transmit(st
u32 val; u32 val;
unsigned int i; unsigned int i;
@ -411,7 +411,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (msg->len > 16) { if (msg->len > 16) {
drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len); drm_err(dev, "Attempting to transmit too much data (%d)\n", msg->len);
return -ENOMEM; return -ENOMEM;
@@ -2359,6 +2464,7 @@ static int vc4_hdmi_bind(struct device * @@ -2360,6 +2465,7 @@ static int vc4_hdmi_bind(struct device *
vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL); vc4_hdmi = devm_kzalloc(dev, sizeof(*vc4_hdmi), GFP_KERNEL);
if (!vc4_hdmi) if (!vc4_hdmi)
return -ENOMEM; return -ENOMEM;

View File

@ -73,7 +73,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return; return;
if (delayed_work_pending(&vc4_hdmi->scrambling_work)) if (delayed_work_pending(&vc4_hdmi->scrambling_work))
@@ -1017,8 +1019,8 @@ static void vc4_hdmi_encoder_pre_crtc_co @@ -1018,8 +1020,8 @@ static void vc4_hdmi_encoder_pre_crtc_co
vc4_hdmi_encoder_get_connector_state(encoder, state); vc4_hdmi_encoder_get_connector_state(encoder, state);
struct vc4_hdmi_connector_state *vc4_conn_state = struct vc4_hdmi_connector_state *vc4_conn_state =
conn_state_to_vc4_hdmi_conn_state(conn_state); conn_state_to_vc4_hdmi_conn_state(conn_state);
@ -83,7 +83,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
unsigned long pixel_rate = vc4_conn_state->pixel_rate; unsigned long pixel_rate = vc4_conn_state->pixel_rate;
unsigned long bvb_rate, hsm_rate; unsigned long bvb_rate, hsm_rate;
unsigned long flags; unsigned long flags;
@@ -1120,9 +1122,9 @@ out: @@ -1121,9 +1123,9 @@ out:
static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder, static void vc4_hdmi_encoder_pre_crtc_enable(struct drm_encoder *encoder,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
@ -95,7 +95,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
unsigned long flags; unsigned long flags;
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);
@@ -1150,8 +1152,8 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1151,8 +1153,8 @@ static void vc4_hdmi_encoder_pre_crtc_en
static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder, static void vc4_hdmi_encoder_post_crtc_enable(struct drm_encoder *encoder,
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
@ -105,7 +105,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder); struct vc4_hdmi_encoder *vc4_encoder = to_vc4_hdmi_encoder(encoder);
bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC; bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
@@ -1227,6 +1229,19 @@ static void vc4_hdmi_encoder_enable(stru @@ -1228,6 +1230,19 @@ static void vc4_hdmi_encoder_enable(stru
{ {
} }
@ -125,7 +125,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
#define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL #define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL
#define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL #define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL
@@ -1305,6 +1320,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_e @@ -1306,6 +1321,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_e
static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = { static const struct drm_encoder_helper_funcs vc4_hdmi_encoder_helper_funcs = {
.atomic_check = vc4_hdmi_encoder_atomic_check, .atomic_check = vc4_hdmi_encoder_atomic_check,
@ -133,7 +133,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
.mode_valid = vc4_hdmi_encoder_mode_valid, .mode_valid = vc4_hdmi_encoder_mode_valid,
.disable = vc4_hdmi_encoder_disable, .disable = vc4_hdmi_encoder_disable,
.enable = vc4_hdmi_encoder_enable, .enable = vc4_hdmi_encoder_enable,
@@ -1358,9 +1374,7 @@ static void vc4_hdmi_audio_set_mai_clock @@ -1359,9 +1375,7 @@ static void vc4_hdmi_audio_set_mai_clock
static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate) static void vc4_hdmi_set_n_cts(struct vc4_hdmi *vc4_hdmi, unsigned int samplerate)
{ {

View File

@ -19,7 +19,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1406,20 +1406,36 @@ static inline struct vc4_hdmi *dai_to_hd @@ -1407,20 +1407,36 @@ static inline struct vc4_hdmi *dai_to_hd
return snd_soc_card_get_drvdata(card); return snd_soc_card_get_drvdata(card);
} }
@ -63,7 +63,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
mutex_unlock(&vc4_hdmi->mutex); mutex_unlock(&vc4_hdmi->mutex);
return -ENODEV; return -ENODEV;
} }
@@ -1549,6 +1565,11 @@ static int vc4_hdmi_audio_prepare(struct @@ -1550,6 +1566,11 @@ static int vc4_hdmi_audio_prepare(struct
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);

View File

@ -32,7 +32,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
@@ -1227,6 +1232,11 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1228,6 +1233,11 @@ static void vc4_hdmi_encoder_post_crtc_e
static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder) static void vc4_hdmi_encoder_enable(struct drm_encoder *encoder)
{ {
@ -44,7 +44,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} }
static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder, static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
@@ -1408,14 +1418,12 @@ static inline struct vc4_hdmi *dai_to_hd @@ -1409,14 +1419,12 @@ static inline struct vc4_hdmi *dai_to_hd
static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi) static bool vc4_hdmi_audio_can_stream(struct vc4_hdmi *vc4_hdmi)
{ {

View File

@ -69,7 +69,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (delayed_work_pending(&vc4_hdmi->scrambling_work)) if (delayed_work_pending(&vc4_hdmi->scrambling_work))
cancel_delayed_work_sync(&vc4_hdmi->scrambling_work); cancel_delayed_work_sync(&vc4_hdmi->scrambling_work);
@@ -2522,6 +2516,14 @@ static int vc4_hdmi_bind(struct device * @@ -2523,6 +2517,14 @@ static int vc4_hdmi_bind(struct device *
vc4_hdmi->pdev = pdev; vc4_hdmi->pdev = pdev;
vc4_hdmi->variant = variant; vc4_hdmi->variant = variant;

View File

@ -109,7 +109,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
*/ */
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -525,11 +525,6 @@ static void vc4_plane_calc_load(struct d @@ -527,11 +527,6 @@ static void vc4_plane_calc_load(struct d
struct vc4_plane_state *vc4_state; struct vc4_plane_state *vc4_state;
struct drm_crtc_state *crtc_state; struct drm_crtc_state *crtc_state;
unsigned int vscale_factor; unsigned int vscale_factor;

View File

@ -44,7 +44,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1801,10 +1801,11 @@ static void vc4_hdmi_audio_exit(struct v @@ -1802,10 +1802,11 @@ static void vc4_hdmi_audio_exit(struct v
static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv) static irqreturn_t vc4_hdmi_hpd_irq_thread(int irq, void *priv)
{ {
struct vc4_hdmi *vc4_hdmi = priv; struct vc4_hdmi *vc4_hdmi = priv;

View File

@ -20,7 +20,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
@@ -378,7 +378,7 @@ static const struct gpio_chip bcm2835_gp @@ -376,7 +376,7 @@ static const struct gpio_chip bcm2835_gp
.get = bcm2835_gpio_get, .get = bcm2835_gpio_get,
.set = bcm2835_gpio_set, .set = bcm2835_gpio_set,
.set_config = gpiochip_generic_config, .set_config = gpiochip_generic_config,
@ -29,7 +29,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
.ngpio = BCM2835_NUM_GPIOS, .ngpio = BCM2835_NUM_GPIOS,
.can_sleep = false, .can_sleep = false,
.of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback, .of_gpio_ranges_fallback = bcm2835_of_gpio_ranges_fallback,
@@ -395,7 +395,7 @@ static const struct gpio_chip bcm2711_gp @@ -393,7 +393,7 @@ static const struct gpio_chip bcm2711_gp
.get = bcm2835_gpio_get, .get = bcm2835_gpio_get,
.set = bcm2835_gpio_set, .set = bcm2835_gpio_set,
.set_config = gpiochip_generic_config, .set_config = gpiochip_generic_config,

View File

@ -18,7 +18,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -2608,7 +2608,7 @@ static void bcmgenet_init_tx_ring(struct @@ -2616,7 +2616,7 @@ static void bcmgenet_init_tx_ring(struct
bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX); bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_PROD_INDEX);
bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_CONS_INDEX); bcmgenet_tdma_ring_writel(priv, index, 0, TDMA_CONS_INDEX);
@ -27,7 +27,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
/* Disable rate control for now */ /* Disable rate control for now */
bcmgenet_tdma_ring_writel(priv, index, flow_period_val, bcmgenet_tdma_ring_writel(priv, index, flow_period_val,
TDMA_FLOW_PERIOD); TDMA_FLOW_PERIOD);
@@ -4075,9 +4075,12 @@ static int bcmgenet_probe(struct platfor @@ -4083,9 +4083,12 @@ static int bcmgenet_probe(struct platfor
netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1); netif_set_real_num_rx_queues(priv->dev, priv->hw_params->rx_queues + 1);
/* Set default coalescing parameters */ /* Set default coalescing parameters */

View File

@ -20,7 +20,7 @@ Signed-off-by: Jonathan Bell <jonathan@raspberrypi.org>
--- a/drivers/net/ethernet/broadcom/genet/bcmmii.c --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
@@ -293,6 +293,8 @@ int bcmgenet_mii_probe(struct net_device @@ -286,6 +286,8 @@ int bcmgenet_mii_probe(struct net_device
/* Communicate the integrated PHY revision */ /* Communicate the integrated PHY revision */
if (priv->internal_phy) if (priv->internal_phy)
phy_flags = priv->gphy_rev; phy_flags = priv->gphy_rev;

View File

@ -37,7 +37,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
static inline void bcmgenet_writel(u32 value, void __iomem *offset) static inline void bcmgenet_writel(u32 value, void __iomem *offset)
{ {
@@ -2439,6 +2442,11 @@ static void reset_umac(struct bcmgenet_p @@ -2447,6 +2450,11 @@ static void reset_umac(struct bcmgenet_p
bcmgenet_rbuf_ctrl_set(priv, 0); bcmgenet_rbuf_ctrl_set(priv, 0);
udelay(10); udelay(10);

View File

@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.org>
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
@@ -1339,7 +1339,7 @@ static int bcm2835_pinctrl_probe(struct @@ -1337,7 +1337,7 @@ static int bcm2835_pinctrl_probe(struct
girq->default_type = IRQ_TYPE_NONE; girq->default_type = IRQ_TYPE_NONE;
girq->handler = handle_level_irq; girq->handler = handle_level_irq;

View File

@ -24,7 +24,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
--- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
+++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
@@ -3257,7 +3257,7 @@ static void bcmgenet_get_hw_addr(struct @@ -3265,7 +3265,7 @@ static void bcmgenet_get_hw_addr(struct
} }
/* Returns a reusable dma control register value */ /* Returns a reusable dma control register value */
@ -33,7 +33,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
{ {
unsigned int i; unsigned int i;
u32 reg; u32 reg;
@@ -3282,6 +3282,14 @@ static u32 bcmgenet_dma_disable(struct b @@ -3290,6 +3290,14 @@ static u32 bcmgenet_dma_disable(struct b
udelay(10); udelay(10);
bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH); bcmgenet_umac_writel(priv, 0, UMAC_TX_FLUSH);
@ -48,7 +48,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
return dma_ctrl; return dma_ctrl;
} }
@@ -3345,8 +3353,8 @@ static int bcmgenet_open(struct net_devi @@ -3353,8 +3361,8 @@ static int bcmgenet_open(struct net_devi
bcmgenet_set_hw_addr(priv, dev->dev_addr); bcmgenet_set_hw_addr(priv, dev->dev_addr);
@ -59,7 +59,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
/* Reinitialize TDMA and RDMA and SW housekeeping */ /* Reinitialize TDMA and RDMA and SW housekeeping */
ret = bcmgenet_init_dma(priv); ret = bcmgenet_init_dma(priv);
@@ -4204,7 +4212,7 @@ static int bcmgenet_resume(struct device @@ -4212,7 +4220,7 @@ static int bcmgenet_resume(struct device
bcmgenet_hfb_create_rxnfc_filter(priv, rule); bcmgenet_hfb_create_rxnfc_filter(priv, rule);
/* Disable RX/TX DMA and flush TX queues */ /* Disable RX/TX DMA and flush TX queues */

View File

@ -1,214 +0,0 @@
From a08e51a8b93f857cde93ddd7730c1cdedb6ccdd1 Mon Sep 17 00:00:00 2001
From: Joerg Quinten <aBUGSworstnightmare@gmail.com>
Date: Fri, 18 Jun 2021 13:02:29 +0200
Subject: [PATCH] Support RPi DPI interface in mode6 for 18-bit color
A matching media bus format was added and an overlay for using it,
both with FB and VC4 was added as well.
Signed-off-by: Joerg Quinten <aBUGSworstnightmare@gmail.com>
---
.../bindings/display/panel/panel-simple.yaml | 2 +
.../media/v4l/subdev-formats.rst | 74 +++++++++++++++++++
drivers/gpu/drm/panel/panel-simple.c | 35 +++++++++
drivers/gpu/drm/vc4/vc4_dpi.c | 10 +++
include/uapi/linux/media-bus-format.h | 4 +-
5 files changed, 124 insertions(+), 1 deletion(-)
--- a/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
+++ b/Documentation/devicetree/bindings/display/panel/panel-simple.yaml
@@ -162,6 +162,8 @@ properties:
- ivo,m133nwf4-r0
# Innolux AT043TN24 4.3" WQVGA TFT LCD panel
- innolux,at043tn24
+ # Innolux AT056tN53V1 5.6" VGA (640x480) TFT LCD panel
+ - innolux,at056tn53v1
# Innolux AT070TN92 7.0" WQVGA TFT LCD panel
- innolux,at070tn92
# Innolux G070Y2-L01 7" WVGA (800x480) TFT LCD panel
--- a/Documentation/userspace-api/media/v4l/subdev-formats.rst
+++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst
@@ -912,6 +912,43 @@ The following tables list existing packe
- g\ :sub:`5`
- g\ :sub:`4`
- g\ :sub:`3`
+ * .. _MEDIA-BUS-FMT-BGR666-1X18:
+
+ - MEDIA_BUS_FMT_RGB666_1X18
+ - 0x101f
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - b\ :sub:`5`
+ - b\ :sub:`4`
+ - b\ :sub:`3`
+ - b\ :sub:`2`
+ - b\ :sub:`1`
+ - b\ :sub:`0`
+ - g\ :sub:`5`
+ - g\ :sub:`4`
+ - g\ :sub:`3`
+ - g\ :sub:`2`
+ - g\ :sub:`1`
+ - g\ :sub:`0`
+ - r\ :sub:`5`
+ - r\ :sub:`4`
+ - r\ :sub:`3`
+ - r\ :sub:`2`
+ - r\ :sub:`1`
+ - r\ :sub:`0`
* .. _MEDIA-BUS-FMT-RGB666-1X18:
- MEDIA_BUS_FMT_RGB666_1X18
@@ -986,6 +1023,43 @@ The following tables list existing packe
- g\ :sub:`2`
- g\ :sub:`1`
- g\ :sub:`0`
+ * .. _MEDIA-BUS-FMT-BGR666-1X24_CPADHI:
+
+ - MEDIA_BUS_FMT_BGR666_1X24_CPADHI
+ - 0x101e
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ -
+ - 0
+ - 0
+ - b\ :sub:`5`
+ - b\ :sub:`4`
+ - b\ :sub:`3`
+ - b\ :sub:`2`
+ - b\ :sub:`1`
+ - b\ :sub:`0`
+ - 0
+ - 0
+ - g\ :sub:`5`
+ - g\ :sub:`4`
+ - g\ :sub:`3`
+ - g\ :sub:`2`
+ - g\ :sub:`1`
+ - g\ :sub:`0`
+ - 0
+ - 0
+ - r\ :sub:`5`
+ - r\ :sub:`4`
+ - r\ :sub:`3`
+ - r\ :sub:`2`
+ - r\ :sub:`1`
+ - r\ :sub:`0`
* .. _MEDIA-BUS-FMT-RGB666-1X24_CPADHI:
- MEDIA_BUS_FMT_RGB666_1X24_CPADHI
--- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -2472,6 +2472,38 @@ static const struct panel_desc innolux_a
.bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE,
};
+static const struct display_timing innolux_at056tn53v1_timing = {
+ .pixelclock = { 39700000, 39700000, 39700000},
+ .hactive = { 640, 640, 640 },
+ .hfront_porch = { 16, 16, 16 },
+ .hback_porch = { 134, 134, 134 },
+ .hsync_len = { 10, 10, 10},
+ .vactive = { 480, 480, 480 },
+ .vfront_porch = { 32, 32, 32},
+ .vback_porch = { 11, 11, 11 },
+ .vsync_len = { 2, 2, 2 },
+ .flags = DRM_MODE_FLAG_PVSYNC | DRM_MODE_FLAG_PHSYNC,
+};
+
+static const struct panel_desc innolux_at056tn53v1 = {
+ .timings = &innolux_at056tn53v1_timing,
+ .num_timings = 1,
+ .bpc = 6,
+ .size = {
+ .width = 112,
+ .height = 84,
+ },
+ .delay = {
+ .prepare = 50,
+ .enable = 200,
+ .disable = 110,
+ .unprepare = 200,
+ },
+ .bus_format = MEDIA_BUS_FMT_BGR666_1X24_CPADHI,
+ .bus_flags = DRM_BUS_FLAG_PIXDATA_SAMPLE_POSEDGE,
+ .connector_type = DRM_MODE_CONNECTOR_DPI,
+};
+
static const struct drm_display_mode innolux_at070tn92_mode = {
.clock = 33333,
.hdisplay = 800,
@@ -4662,6 +4694,9 @@ static const struct of_device_id platfor
.compatible = "innolux,at043tn24",
.data = &innolux_at043tn24,
}, {
+ .compatible = "innolux,at056tn53v1",
+ .data = &innolux_at056tn53v1,
+ }, {
.compatible = "innolux,at070tn92",
.data = &innolux_at070tn92,
}, {
--- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -165,10 +165,20 @@ static void vc4_dpi_encoder_enable(struc
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
DPI_FORMAT);
break;
+ case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+ DPI_FORMAT);
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
+ break;
case MEDIA_BUS_FMT_RGB666_1X18:
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
DPI_FORMAT);
break;
+ case MEDIA_BUS_FMT_BGR666_1X18:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+ DPI_FORMAT);
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
+ break;
case MEDIA_BUS_FMT_RGB565_1X16:
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
DPI_FORMAT);
--- a/include/uapi/linux/media-bus-format.h
+++ b/include/uapi/linux/media-bus-format.h
@@ -34,7 +34,7 @@
#define MEDIA_BUS_FMT_FIXED 0x0001
-/* RGB - next is 0x101e */
+/* RGB - next is 0x1020 */
#define MEDIA_BUS_FMT_RGB444_1X12 0x1016
#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE 0x1001
#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE 0x1002
@@ -45,8 +45,10 @@
#define MEDIA_BUS_FMT_BGR565_2X8_LE 0x1006
#define MEDIA_BUS_FMT_RGB565_2X8_BE 0x1007
#define MEDIA_BUS_FMT_RGB565_2X8_LE 0x1008
+#define MEDIA_BUS_FMT_BGR666_1X18 0x101f
#define MEDIA_BUS_FMT_RGB666_1X18 0x1009
#define MEDIA_BUS_FMT_RBG888_1X24 0x100e
+#define MEDIA_BUS_FMT_BGR666_1X24_CPADHI 0x101e
#define MEDIA_BUS_FMT_RGB666_1X24_CPADHI 0x1015
#define MEDIA_BUS_FMT_RGB666_1X7X3_SPWG 0x1010
#define MEDIA_BUS_FMT_BGR888_1X24 0x1013

View File

@ -26,7 +26,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
} hvs_formats[] = { } hvs_formats[] = {
{ {
.drm = DRM_FORMAT_XRGB8888, .drm = DRM_FORMAT_XRGB8888,
@@ -128,6 +129,12 @@ static const struct hvs_format { @@ -130,6 +131,12 @@ static const struct hvs_format {
.hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE, .hvs = HVS_PIXEL_FORMAT_YCBCR_YUV422_2PLANE,
.pixel_order = HVS_PIXEL_ORDER_XYCRCB, .pixel_order = HVS_PIXEL_ORDER_XYCRCB,
}, },
@ -39,7 +39,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
}; };
static const struct hvs_format *vc4_get_hvs_format(u32 drm_format) static const struct hvs_format *vc4_get_hvs_format(u32 drm_format)
@@ -758,47 +765,90 @@ static int vc4_plane_mode_set(struct drm @@ -760,47 +767,90 @@ static int vc4_plane_mode_set(struct drm
case DRM_FORMAT_MOD_BROADCOM_SAND128: case DRM_FORMAT_MOD_BROADCOM_SAND128:
case DRM_FORMAT_MOD_BROADCOM_SAND256: { case DRM_FORMAT_MOD_BROADCOM_SAND256: {
uint32_t param = fourcc_mod_broadcom_param(fb->modifier); uint32_t param = fourcc_mod_broadcom_param(fb->modifier);
@ -157,7 +157,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
} }
pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT); pitch0 = VC4_SET_FIELD(param, SCALER_TILE_HEIGHT);
@@ -951,7 +1001,8 @@ static int vc4_plane_mode_set(struct drm @@ -953,7 +1003,8 @@ static int vc4_plane_mode_set(struct drm
/* Pitch word 1/2 */ /* Pitch word 1/2 */
for (i = 1; i < num_planes; i++) { for (i = 1; i < num_planes; i++) {
@ -167,7 +167,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,
VC4_SET_FIELD(fb->pitches[i], VC4_SET_FIELD(fb->pitches[i],
SCALER_SRC_PITCH)); SCALER_SRC_PITCH));
@@ -1311,6 +1362,13 @@ static bool vc4_format_mod_supported(str @@ -1313,6 +1364,13 @@ static bool vc4_format_mod_supported(str
default: default:
return false; return false;
} }
@ -181,7 +181,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
case DRM_FORMAT_RGBX1010102: case DRM_FORMAT_RGBX1010102:
case DRM_FORMAT_BGRX1010102: case DRM_FORMAT_BGRX1010102:
case DRM_FORMAT_RGBA1010102: case DRM_FORMAT_RGBA1010102:
@@ -1343,8 +1401,11 @@ struct drm_plane *vc4_plane_init(struct @@ -1345,8 +1403,11 @@ struct drm_plane *vc4_plane_init(struct
struct drm_plane *plane = NULL; struct drm_plane *plane = NULL;
struct vc4_plane *vc4_plane; struct vc4_plane *vc4_plane;
u32 formats[ARRAY_SIZE(hvs_formats)]; u32 formats[ARRAY_SIZE(hvs_formats)];
@ -193,7 +193,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-3-maxime@cerno.tech
static const uint64_t modifiers[] = { static const uint64_t modifiers[] = {
DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED, DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
DRM_FORMAT_MOD_BROADCOM_SAND128, DRM_FORMAT_MOD_BROADCOM_SAND128,
@@ -1359,13 +1420,17 @@ struct drm_plane *vc4_plane_init(struct @@ -1361,13 +1422,17 @@ struct drm_plane *vc4_plane_init(struct
if (!vc4_plane) if (!vc4_plane)
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);

View File

@ -21,7 +21,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -619,6 +619,51 @@ static int vc4_plane_allocate_lbm(struct @@ -621,6 +621,51 @@ static int vc4_plane_allocate_lbm(struct
return 0; return 0;
} }
@ -73,7 +73,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
/* Writes out a full display list for an active plane to the plane's /* Writes out a full display list for an active plane to the plane's
* private dlist state. * private dlist state.
*/ */
@@ -1013,9 +1058,20 @@ static int vc4_plane_mode_set(struct drm @@ -1015,9 +1060,20 @@ static int vc4_plane_mode_set(struct drm
/* Colorspace conversion words */ /* Colorspace conversion words */
if (vc4_state->is_yuv) { if (vc4_state->is_yuv) {
@ -97,7 +97,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
} }
vc4_state->lbm_offset = 0; vc4_state->lbm_offset = 0;
@@ -1444,6 +1500,15 @@ struct drm_plane *vc4_plane_init(struct @@ -1446,6 +1502,15 @@ struct drm_plane *vc4_plane_init(struct
DRM_MODE_REFLECT_X | DRM_MODE_REFLECT_X |
DRM_MODE_REFLECT_Y); DRM_MODE_REFLECT_Y);
@ -115,7 +115,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -983,7 +983,10 @@ enum hvs_pixel_format { @@ -989,7 +989,10 @@ enum hvs_pixel_format {
#define SCALER_CSC0_COEF_CR_OFS_SHIFT 0 #define SCALER_CSC0_COEF_CR_OFS_SHIFT 0
#define SCALER_CSC0_ITR_R_601_5 0x00f00000 #define SCALER_CSC0_ITR_R_601_5 0x00f00000
#define SCALER_CSC0_ITR_R_709_3 0x00f00000 #define SCALER_CSC0_ITR_R_709_3 0x00f00000
@ -126,7 +126,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
/* S2.8 contribution of Cb to Green */ /* S2.8 contribution of Cb to Green */
#define SCALER_CSC1_COEF_CB_GRN_MASK VC4_MASK(31, 22) #define SCALER_CSC1_COEF_CB_GRN_MASK VC4_MASK(31, 22)
@@ -998,8 +1001,11 @@ enum hvs_pixel_format { @@ -1004,8 +1007,11 @@ enum hvs_pixel_format {
#define SCALER_CSC1_COEF_CR_BLU_MASK VC4_MASK(1, 0) #define SCALER_CSC1_COEF_CR_BLU_MASK VC4_MASK(1, 0)
#define SCALER_CSC1_COEF_CR_BLU_SHIFT 0 #define SCALER_CSC1_COEF_CR_BLU_SHIFT 0
#define SCALER_CSC1_ITR_R_601_5 0xe73304a8 #define SCALER_CSC1_ITR_R_601_5 0xe73304a8
@ -140,7 +140,7 @@ Link: https://lore.kernel.org/r/20211215091739.135042-4-maxime@cerno.tech
/* S2.8 contribution of Cb to Red */ /* S2.8 contribution of Cb to Red */
#define SCALER_CSC2_COEF_CB_RED_MASK VC4_MASK(29, 20) #define SCALER_CSC2_COEF_CB_RED_MASK VC4_MASK(29, 20)
@@ -1010,9 +1016,12 @@ enum hvs_pixel_format { @@ -1016,9 +1022,12 @@ enum hvs_pixel_format {
/* S2.8 contribution of Cb to Blue */ /* S2.8 contribution of Cb to Blue */
#define SCALER_CSC2_COEF_CB_BLU_MASK VC4_MASK(19, 10) #define SCALER_CSC2_COEF_CB_BLU_MASK VC4_MASK(19, 10)
#define SCALER_CSC2_COEF_CB_BLU_SHIFT 10 #define SCALER_CSC2_COEF_CB_BLU_SHIFT 10

View File

@ -59,7 +59,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
/* The filter kernel is composed of dwords each containing 3 9-bit /* The filter kernel is composed of dwords each containing 3 9-bit
* signed integers packed next to each other. * signed integers packed next to each other.
*/ */
@@ -728,6 +767,8 @@ static int vc4_hvs_bind(struct device *d @@ -739,6 +778,8 @@ static int vc4_hvs_bind(struct device *d
vc4_debugfs_add_regset32(drm, "hvs_regs", &hvs->regset); vc4_debugfs_add_regset32(drm, "hvs_regs", &hvs->regset);
vc4_debugfs_add_file(drm, "hvs_underrun", vc4_hvs_debugfs_underrun, vc4_debugfs_add_file(drm, "hvs_underrun", vc4_hvs_debugfs_underrun,
NULL); NULL);

View File

@ -29,7 +29,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
return 0; return 0;
} }
@@ -2369,6 +2375,7 @@ static int vc5_hdmi_init_resources(struc @@ -2370,6 +2376,7 @@ static int vc5_hdmi_init_resources(struc
struct platform_device *pdev = vc4_hdmi->pdev; struct platform_device *pdev = vc4_hdmi->pdev;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct resource *res; struct resource *res;
@ -37,7 +37,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi");
if (!res) if (!res)
@@ -2465,6 +2472,38 @@ static int vc5_hdmi_init_resources(struc @@ -2466,6 +2473,38 @@ static int vc5_hdmi_init_resources(struc
return PTR_ERR(vc4_hdmi->reset); return PTR_ERR(vc4_hdmi->reset);
} }

View File

@ -22,8 +22,8 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_dpi.c --- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -188,8 +188,8 @@ static void vc4_dpi_encoder_enable(struc @@ -188,8 +188,8 @@ static void vc4_dpi_encoder_enable(struc
break; if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
} dpi_c |= DPI_OUTPUT_ENABLE_INVERT;
} else { } else {
- /* Default to 24bit if no connector found. */ - /* Default to 24bit if no connector found. */
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB, DPI_FORMAT); - dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB, DPI_FORMAT);

View File

@ -15,7 +15,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1011,30 +1011,15 @@ static void vc4_hdmi_recenter_fifo(struc @@ -1012,30 +1012,15 @@ static void vc4_hdmi_recenter_fifo(struc
"VC4_HDMI_FIFO_CTL_RECENTER_DONE"); "VC4_HDMI_FIFO_CTL_RECENTER_DONE");
} }

View File

@ -15,7 +15,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/panel/panel-simple.c --- a/drivers/gpu/drm/panel/panel-simple.c
+++ b/drivers/gpu/drm/panel/panel-simple.c +++ b/drivers/gpu/drm/panel/panel-simple.c
@@ -3761,6 +3761,31 @@ static const struct panel_desc qishenglo @@ -3729,6 +3729,31 @@ static const struct panel_desc qishenglo
.connector_type = DRM_MODE_CONNECTOR_DPI, .connector_type = DRM_MODE_CONNECTOR_DPI,
}; };
@ -47,7 +47,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
static const struct display_timing rocktech_rk070er9427_timing = { static const struct display_timing rocktech_rk070er9427_timing = {
.pixelclock = { 26400000, 33300000, 46800000 }, .pixelclock = { 26400000, 33300000, 46800000 },
.hactive = { 800, 800, 800 }, .hactive = { 800, 800, 800 },
@@ -4841,6 +4866,9 @@ static const struct of_device_id platfor @@ -4806,6 +4831,9 @@ static const struct of_device_id platfor
.compatible = "qishenglong,gopher2b-lcd", .compatible = "qishenglong,gopher2b-lcd",
.data = &qishenglong_gopher2b_lcd, .data = &qishenglong_gopher2b_lcd,
}, { }, {

View File

@ -13,7 +13,7 @@ Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
--- a/drivers/media/i2c/imx219.c --- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c
@@ -674,7 +674,7 @@ static void imx219_set_default_format(st @@ -584,7 +584,7 @@ static void imx219_set_default_format(st
fmt = &imx219->fmt; fmt = &imx219->fmt;
fmt->code = MEDIA_BUS_FMT_SRGGB10_1X10; fmt->code = MEDIA_BUS_FMT_SRGGB10_1X10;
@ -22,7 +22,7 @@ Signed-off-by: David Plowman <david.plowman@raspberrypi.com>
fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace); fmt->ycbcr_enc = V4L2_MAP_YCBCR_ENC_DEFAULT(fmt->colorspace);
fmt->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true, fmt->quantization = V4L2_MAP_QUANTIZATION_DEFAULT(true,
fmt->colorspace, fmt->colorspace,
@@ -844,7 +844,7 @@ static int imx219_enum_frame_size(struct @@ -754,7 +754,7 @@ static int imx219_enum_frame_size(struct
static void imx219_reset_colorspace(struct v4l2_mbus_framefmt *fmt) static void imx219_reset_colorspace(struct v4l2_mbus_framefmt *fmt)
{ {

View File

@ -241,7 +241,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* Unsetting DISPBKGND_GAMMA skips the gamma lut step /* Unsetting DISPBKGND_GAMMA skips the gamma lut step
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -499,6 +499,28 @@ @@ -505,6 +505,28 @@
#define SCALER_DLIST_START 0x00002000 #define SCALER_DLIST_START 0x00002000
#define SCALER_DLIST_SIZE 0x00004000 #define SCALER_DLIST_SIZE 0x00004000

View File

@ -102,7 +102,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* The filter kernel is composed of dwords each containing 3 9-bit /* The filter kernel is composed of dwords each containing 3 9-bit
* signed integers packed next to each other. * signed integers packed next to each other.
*/ */
@@ -848,6 +926,9 @@ static int vc4_hvs_bind(struct device *d @@ -859,6 +937,9 @@ static int vc4_hvs_bind(struct device *d
NULL); NULL);
vc4_debugfs_add_file(drm, "hvs_dlists", vc4_hvs_debugfs_dlist, vc4_debugfs_add_file(drm, "hvs_dlists", vc4_hvs_debugfs_dlist,
NULL); NULL);

View File

@ -20,7 +20,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -2557,7 +2557,8 @@ static int vc4_hdmi_bind(struct device * @@ -2558,7 +2558,8 @@ static int vc4_hdmi_bind(struct device *
* vc4_hdmi_disable_scrambling() will thus run at boot, make * vc4_hdmi_disable_scrambling() will thus run at boot, make
* sure it's disabled, and avoid any inconsistency. * sure it's disabled, and avoid any inconsistency.
*/ */

View File

@ -36,7 +36,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
connected = true; connected = true;
} }
@@ -1355,6 +1349,18 @@ static u32 vc5_hdmi_channel_map(struct v @@ -1356,6 +1350,18 @@ static u32 vc5_hdmi_channel_map(struct v
return channel_map; return channel_map;
} }
@ -55,7 +55,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
/* HDMI audio codec callbacks */ /* HDMI audio codec callbacks */
static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi, static void vc4_hdmi_audio_set_mai_clock(struct vc4_hdmi *vc4_hdmi,
unsigned int samplerate) unsigned int samplerate)
@@ -2777,6 +2783,7 @@ static const struct vc4_hdmi_variant bcm @@ -2778,6 +2784,7 @@ static const struct vc4_hdmi_variant bcm
.phy_rng_disable = vc5_hdmi_phy_rng_disable, .phy_rng_disable = vc5_hdmi_phy_rng_disable,
.channel_map = vc5_hdmi_channel_map, .channel_map = vc5_hdmi_channel_map,
.supports_hdr = true, .supports_hdr = true,
@ -63,7 +63,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
}; };
static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = { static const struct vc4_hdmi_variant bcm2711_hdmi1_variant = {
@@ -2805,6 +2812,7 @@ static const struct vc4_hdmi_variant bcm @@ -2806,6 +2813,7 @@ static const struct vc4_hdmi_variant bcm
.phy_rng_disable = vc5_hdmi_phy_rng_disable, .phy_rng_disable = vc5_hdmi_phy_rng_disable,
.channel_map = vc5_hdmi_channel_map, .channel_map = vc5_hdmi_channel_map,
.supports_hdr = true, .supports_hdr = true,

View File

@ -22,7 +22,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -2193,7 +2193,6 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -2194,7 +2194,6 @@ static int vc4_hdmi_cec_init(struct vc4_
struct platform_device *pdev = vc4_hdmi->pdev; struct platform_device *pdev = vc4_hdmi->pdev;
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
unsigned long flags; unsigned long flags;
@ -30,7 +30,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
int ret; int ret;
if (!of_find_property(dev->of_node, "interrupts", NULL)) { if (!of_find_property(dev->of_node, "interrupts", NULL)) {
@@ -2213,15 +2212,6 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -2214,15 +2213,6 @@ static int vc4_hdmi_cec_init(struct vc4_
cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector); cec_fill_conn_info_from_drm(&conn_info, &vc4_hdmi->connector);
cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info); cec_s_conn_info(vc4_hdmi->cec_adap, &conn_info);
@ -46,7 +46,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
if (vc4_hdmi->variant->external_irq_controller) { if (vc4_hdmi->variant->external_irq_controller) {
ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-rx"), ret = request_threaded_irq(platform_get_irq_byname(pdev, "cec-rx"),
vc4_cec_irq_handler_rx_bare, vc4_cec_irq_handler_rx_bare,
@@ -2284,6 +2274,29 @@ static void vc4_hdmi_cec_exit(struct vc4 @@ -2285,6 +2275,29 @@ static void vc4_hdmi_cec_exit(struct vc4
cec_unregister_adapter(vc4_hdmi->cec_adap); cec_unregister_adapter(vc4_hdmi->cec_adap);
} }
@ -76,7 +76,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
#else #else
static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi) static int vc4_hdmi_cec_init(struct vc4_hdmi *vc4_hdmi)
{ {
@@ -2292,6 +2305,10 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -2293,6 +2306,10 @@ static int vc4_hdmi_cec_init(struct vc4_
static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {}; static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {};
@ -87,7 +87,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
#endif #endif
static int vc4_hdmi_build_regset(struct vc4_hdmi *vc4_hdmi, static int vc4_hdmi_build_regset(struct vc4_hdmi *vc4_hdmi,
@@ -2526,6 +2543,15 @@ static int vc4_hdmi_runtime_resume(struc @@ -2527,6 +2544,15 @@ static int vc4_hdmi_runtime_resume(struc
if (ret) if (ret)
return ret; return ret;

View File

@ -1,114 +0,0 @@
From e664a91ea54b3488d6c08dd82dac2af1239c3275 Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Thu, 2 Dec 2021 18:21:46 +0000
Subject: [PATCH] drm/vc4: dpi: Add option for inverting pixel clock
and output enable
DRM provides flags for inverting pixel clock and output enable
signals, but these were not mapped to the relevant registers.
Add those mappings.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
drivers/gpu/drm/vc4/vc4_dpi.c | 89 ++++++++++++++++++++---------------
1 file changed, 51 insertions(+), 38 deletions(-)
--- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -148,45 +148,58 @@ static void vc4_dpi_encoder_enable(struc
}
drm_connector_list_iter_end(&conn_iter);
- if (connector && connector->display_info.num_bus_formats) {
- u32 bus_format = connector->display_info.bus_formats[0];
+ if (connector) {
+ if (connector->display_info.num_bus_formats) {
+ u32 bus_format = connector->display_info.bus_formats[0];
- switch (bus_format) {
- case MEDIA_BUS_FMT_RGB888_1X24:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
- DPI_FORMAT);
- break;
- case MEDIA_BUS_FMT_BGR888_1X24:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
- DPI_FORMAT);
- dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
- break;
- case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
- DPI_FORMAT);
- break;
- case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
- DPI_FORMAT);
- dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
- break;
- case MEDIA_BUS_FMT_RGB666_1X18:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
- DPI_FORMAT);
- break;
- case MEDIA_BUS_FMT_BGR666_1X18:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
- DPI_FORMAT);
- dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, DPI_ORDER);
- break;
- case MEDIA_BUS_FMT_RGB565_1X16:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
- DPI_FORMAT);
- break;
- default:
- DRM_ERROR("Unknown media bus format %d\n", bus_format);
- break;
+ switch (bus_format) {
+ case MEDIA_BUS_FMT_RGB888_1X24:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+ DPI_FORMAT);
+ break;
+ case MEDIA_BUS_FMT_BGR888_1X24:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_24BIT_888_RGB,
+ DPI_FORMAT);
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
+ DPI_ORDER);
+ break;
+ case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+ DPI_FORMAT);
+ break;
+ case MEDIA_BUS_FMT_BGR666_1X24_CPADHI:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
+ DPI_FORMAT);
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
+ DPI_ORDER);
+ break;
+ case MEDIA_BUS_FMT_RGB666_1X18:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+ DPI_FORMAT);
+ break;
+ case MEDIA_BUS_FMT_BGR666_1X18:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
+ DPI_FORMAT);
+ dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR,
+ DPI_ORDER);
+ break;
+ case MEDIA_BUS_FMT_RGB565_1X16:
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
+ DPI_FORMAT);
+ break;
+ default:
+ DRM_ERROR("Unknown media bus format %d\n",
+ bus_format);
+ break;
+ }
}
+
+ if (connector->display_info.bus_flags &
+ DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)
+ dpi_c |= DPI_PIXEL_CLK_INVERT;
+
+ if (connector->display_info.bus_flags & DRM_BUS_FLAG_DE_LOW)
+ dpi_c |= DPI_OUTPUT_ENABLE_INVERT;
} else {
/* Default to 18bit if no connector found. */
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1, DPI_FORMAT);

View File

@ -15,9 +15,9 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_dpi.c --- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -173,6 +173,10 @@ static void vc4_dpi_encoder_enable(struc @@ -167,6 +167,10 @@ static void vc4_dpi_encoder_enable(struc
dpi_c |= VC4_SET_FIELD(DPI_ORDER_BGR, dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_2,
DPI_ORDER); DPI_FORMAT);
break; break;
+ default: + default:
+ DRM_ERROR("Unknown media bus format %d\n", + DRM_ERROR("Unknown media bus format %d\n",
@ -26,8 +26,8 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
case MEDIA_BUS_FMT_RGB666_1X18: case MEDIA_BUS_FMT_RGB666_1X18:
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1, dpi_c |= VC4_SET_FIELD(DPI_FORMAT_18BIT_666_RGB_1,
DPI_FORMAT); DPI_FORMAT);
@@ -187,11 +191,12 @@ static void vc4_dpi_encoder_enable(struc @@ -175,11 +179,12 @@ static void vc4_dpi_encoder_enable(struc
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3, dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_1,
DPI_FORMAT); DPI_FORMAT);
break; break;
- default: - default:
@ -42,4 +42,4 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
+ +
} }
if (connector->display_info.bus_flags & if (connector->display_info.bus_flags & DRM_BUS_FLAG_PIXDATA_DRIVE_NEGEDGE)

View File

@ -22,7 +22,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
--- a/drivers/media/i2c/imx219.c --- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c +++ b/drivers/media/i2c/imx219.c
@@ -118,6 +118,16 @@ @@ -124,6 +124,16 @@
#define IMX219_PIXEL_ARRAY_WIDTH 3280U #define IMX219_PIXEL_ARRAY_WIDTH 3280U
#define IMX219_PIXEL_ARRAY_HEIGHT 2464U #define IMX219_PIXEL_ARRAY_HEIGHT 2464U
@ -39,7 +39,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
struct imx219_reg { struct imx219_reg {
u16 address; u16 address;
u8 val; u8 val;
@@ -538,7 +548,7 @@ static const struct imx219_mode supporte @@ -448,7 +458,7 @@ static const struct imx219_mode supporte
struct imx219 { struct imx219 {
struct v4l2_subdev sd; struct v4l2_subdev sd;
@ -48,7 +48,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
struct v4l2_mbus_framefmt fmt; struct v4l2_mbus_framefmt fmt;
@@ -688,18 +698,26 @@ static void imx219_set_default_format(st @@ -598,18 +608,26 @@ static void imx219_set_default_format(st
static int imx219_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh) static int imx219_open(struct v4l2_subdev *sd, struct v4l2_subdev_fh *fh)
{ {
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
@ -83,7 +83,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
/* Initialize try_crop rectangle. */ /* Initialize try_crop rectangle. */
try_crop = v4l2_subdev_get_try_crop(sd, fh->state, 0); try_crop = v4l2_subdev_get_try_crop(sd, fh->state, 0);
@@ -808,12 +826,21 @@ static int imx219_enum_mbus_code(struct @@ -718,12 +736,21 @@ static int imx219_enum_mbus_code(struct
{ {
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
@ -109,7 +109,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
return 0; return 0;
} }
@@ -823,21 +850,30 @@ static int imx219_enum_frame_size(struct @@ -733,21 +760,30 @@ static int imx219_enum_frame_size(struct
struct v4l2_subdev_frame_size_enum *fse) struct v4l2_subdev_frame_size_enum *fse)
{ {
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
@ -151,7 +151,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
return 0; return 0;
} }
@@ -852,9 +888,9 @@ static void imx219_reset_colorspace(stru @@ -762,9 +798,9 @@ static void imx219_reset_colorspace(stru
fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace); fmt->xfer_func = V4L2_MAP_XFER_FUNC_DEFAULT(fmt->colorspace);
} }
@ -164,7 +164,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
{ {
fmt->format.width = mode->width; fmt->format.width = mode->width;
fmt->format.height = mode->height; fmt->format.height = mode->height;
@@ -862,21 +898,39 @@ static void imx219_update_pad_format(str @@ -772,21 +808,39 @@ static void imx219_update_pad_format(str
imx219_reset_colorspace(&fmt->format); imx219_reset_colorspace(&fmt->format);
} }
@ -208,7 +208,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
} }
return 0; return 0;
@@ -906,51 +960,74 @@ static int imx219_set_pad_format(struct @@ -816,51 +870,74 @@ static int imx219_set_pad_format(struct
int exposure_max, exposure_def, hblank; int exposure_max, exposure_def, hblank;
unsigned int i; unsigned int i;
@ -326,7 +326,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
} }
mutex_unlock(&imx219->mutex); mutex_unlock(&imx219->mutex);
@@ -1037,9 +1114,11 @@ static int imx219_start_streaming(struct @@ -976,9 +1053,11 @@ static int imx219_start_streaming(struct
const struct imx219_reg_list *reg_list; const struct imx219_reg_list *reg_list;
int ret; int ret;
@ -338,9 +338,9 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
return ret; return ret;
+ } + }
/* Apply default values of current mode */ /* Send all registers that are common to all modes */
reg_list = &imx219->mode->reg_list; ret = imx219_write_regs(imx219, imx219_common_regs, ARRAY_SIZE(imx219_common_regs));
@@ -1133,21 +1212,22 @@ err_unlock: @@ -1086,21 +1165,22 @@ err_unlock:
/* Power/clock management functions */ /* Power/clock management functions */
static int imx219_power_on(struct device *dev) static int imx219_power_on(struct device *dev)
{ {
@ -366,7 +366,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
__func__); __func__);
goto reg_off; goto reg_off;
} }
@@ -1166,7 +1246,8 @@ reg_off: @@ -1119,7 +1199,8 @@ reg_off:
static int imx219_power_off(struct device *dev) static int imx219_power_off(struct device *dev)
{ {
@ -376,7 +376,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
gpiod_set_value_cansleep(imx219->reset_gpio, 0); gpiod_set_value_cansleep(imx219->reset_gpio, 0);
@@ -1178,7 +1259,8 @@ static int imx219_power_off(struct devic @@ -1131,7 +1212,8 @@ static int imx219_power_off(struct devic
static int __maybe_unused imx219_suspend(struct device *dev) static int __maybe_unused imx219_suspend(struct device *dev)
{ {
@ -386,7 +386,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
if (imx219->streaming) if (imx219->streaming)
@@ -1189,7 +1271,8 @@ static int __maybe_unused imx219_suspend @@ -1142,7 +1224,8 @@ static int __maybe_unused imx219_suspend
static int __maybe_unused imx219_resume(struct device *dev) static int __maybe_unused imx219_resume(struct device *dev)
{ {
@ -396,7 +396,7 @@ Signed-off-by: Jean-Michel Hautbois <jeanmichel.hautbois@ideasonboard.com>
struct imx219 *imx219 = to_imx219(sd); struct imx219 *imx219 = to_imx219(sd);
int ret; int ret;
@@ -1525,13 +1608,14 @@ static int imx219_probe(struct i2c_clien @@ -1478,13 +1561,14 @@ static int imx219_probe(struct i2c_clien
V4L2_SUBDEV_FL_HAS_EVENTS; V4L2_SUBDEV_FL_HAS_EVENTS;
imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; imx219->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR;

View File

@ -38,7 +38,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable) static void vc4_hdmi_csc_setup(struct vc4_hdmi *vc4_hdmi, bool enable)
{ {
unsigned long flags; unsigned long flags;
@@ -1219,15 +1211,6 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1220,15 +1212,6 @@ static void vc4_hdmi_encoder_post_crtc_e
mutex_unlock(&vc4_hdmi->mutex); mutex_unlock(&vc4_hdmi->mutex);
} }
@ -54,7 +54,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder, static void vc4_hdmi_encoder_atomic_mode_set(struct drm_encoder *encoder,
struct drm_crtc_state *crtc_state, struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state) struct drm_connector_state *conn_state)
@@ -1321,8 +1304,6 @@ static const struct drm_encoder_helper_f @@ -1322,8 +1305,6 @@ static const struct drm_encoder_helper_f
.atomic_check = vc4_hdmi_encoder_atomic_check, .atomic_check = vc4_hdmi_encoder_atomic_check,
.atomic_mode_set = vc4_hdmi_encoder_atomic_mode_set, .atomic_mode_set = vc4_hdmi_encoder_atomic_mode_set,
.mode_valid = vc4_hdmi_encoder_mode_valid, .mode_valid = vc4_hdmi_encoder_mode_valid,
@ -63,7 +63,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
}; };
static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask) static u32 vc4_hdmi_channel_map(struct vc4_hdmi *vc4_hdmi, u32 channel_mask)
@@ -1422,16 +1403,10 @@ static bool vc4_hdmi_audio_can_stream(st @@ -1423,16 +1404,10 @@ static bool vc4_hdmi_audio_can_stream(st
lockdep_assert_held(&vc4_hdmi->mutex); lockdep_assert_held(&vc4_hdmi->mutex);
/* /*

View File

@ -14,7 +14,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -2280,7 +2280,7 @@ static int vc4_hdmi_cec_init(struct vc4_ @@ -2281,7 +2281,7 @@ static int vc4_hdmi_cec_init(struct vc4_
static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {}; static void vc4_hdmi_cec_exit(struct vc4_hdmi *vc4_hdmi) {};

View File

@ -23,7 +23,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);
HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0); HDMI_WRITE(HDMI_RAM_PACKET_CONFIG, 0);
@@ -1201,6 +1202,7 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1202,6 +1203,7 @@ static void vc4_hdmi_encoder_post_crtc_e
VC4_HDMI_RAM_PACKET_ENABLE); VC4_HDMI_RAM_PACKET_ENABLE);
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
@ -31,7 +31,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_hdmi_set_infoframes(encoder); vc4_hdmi_set_infoframes(encoder);
} }
@@ -1606,7 +1608,8 @@ static int vc4_hdmi_audio_prepare(struct @@ -1607,7 +1609,8 @@ static int vc4_hdmi_audio_prepare(struct
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea)); memcpy(&vc4_hdmi->audio.infoframe, &params->cea, sizeof(params->cea));

View File

@ -26,7 +26,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/drm_edid.c --- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c
@@ -5743,13 +5743,13 @@ static const u32 hdmi_colorimetry_val[] @@ -5746,13 +5746,13 @@ static const u32 hdmi_colorimetry_val[]
#undef ACE #undef ACE
/** /**
@ -43,7 +43,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
const struct drm_connector_state *conn_state) const struct drm_connector_state *conn_state)
{ {
u32 colorimetry_val; u32 colorimetry_val;
@@ -5768,7 +5768,7 @@ drm_hdmi_avi_infoframe_colorspace(struct @@ -5771,7 +5771,7 @@ drm_hdmi_avi_infoframe_colorspace(struct
frame->extended_colorimetry = (colorimetry_val >> 2) & frame->extended_colorimetry = (colorimetry_val >> 2) &
EXTENDED_COLORIMETRY_MASK; EXTENDED_COLORIMETRY_MASK;
} }

View File

@ -31,7 +31,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused) static int vc4_hdmi_debugfs_regs(struct seq_file *m, void *unused)
{ {
struct drm_info_node *node = (struct drm_info_node *)m->private; struct drm_info_node *node = (struct drm_info_node *)m->private;
@@ -1116,8 +1125,7 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1117,8 +1126,7 @@ static void vc4_hdmi_encoder_pre_crtc_en
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);

View File

@ -79,7 +79,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* CEA VICs other than #1 requre limited range RGB /* CEA VICs other than #1 requre limited range RGB
* output unless overridden by an AVI infoframe. * output unless overridden by an AVI infoframe.
* Apply a colorspace conversion to squash 0-255 down * Apply a colorspace conversion to squash 0-255 down
@@ -1120,22 +1121,12 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1121,22 +1122,12 @@ static void vc4_hdmi_encoder_pre_crtc_en
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode; struct drm_display_mode *mode = &vc4_hdmi->saved_adjusted_mode;

View File

@ -24,7 +24,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) { if (!vc4_hdmi_is_full_range_rgb(vc4_hdmi, mode)) {
/* CEA VICs other than #1 requre limited range RGB /* CEA VICs other than #1 requre limited range RGB
* output unless overridden by an AVI infoframe. * output unless overridden by an AVI infoframe.
@@ -906,7 +908,6 @@ static void vc5_hdmi_set_timings(struct @@ -907,7 +909,6 @@ static void vc5_hdmi_set_timings(struct
spin_lock_irqsave(&vc4_hdmi->hw_lock, flags); spin_lock_irqsave(&vc4_hdmi->hw_lock, flags);

View File

@ -30,7 +30,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -804,6 +804,9 @@ enum { @@ -810,6 +810,9 @@ enum {
# define VC4_HD_CSC_CTL_RGB2YCC BIT(1) # define VC4_HD_CSC_CTL_RGB2YCC BIT(1)
# define VC4_HD_CSC_CTL_ENABLE BIT(0) # define VC4_HD_CSC_CTL_ENABLE BIT(0)

View File

@ -33,7 +33,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
const struct drm_display_mode *mode) const struct drm_display_mode *mode)
{ {
unsigned long flags; unsigned long flags;
@@ -1141,13 +1143,16 @@ static void vc4_hdmi_encoder_pre_crtc_en @@ -1142,13 +1144,16 @@ static void vc4_hdmi_encoder_pre_crtc_en
struct drm_atomic_state *state) struct drm_atomic_state *state)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);

View File

@ -14,7 +14,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1251,6 +1251,19 @@ static void vc4_hdmi_encoder_atomic_mode @@ -1252,6 +1252,19 @@ static void vc4_hdmi_encoder_atomic_mode
mutex_unlock(&vc4_hdmi->mutex); mutex_unlock(&vc4_hdmi->mutex);
} }
@ -34,7 +34,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
#define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL #define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL
#define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL #define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL
@@ -1295,10 +1308,7 @@ static int vc4_hdmi_encoder_atomic_check @@ -1296,10 +1309,7 @@ static int vc4_hdmi_encoder_atomic_check
if (mode->flags & DRM_MODE_FLAG_DBLCLK) if (mode->flags & DRM_MODE_FLAG_DBLCLK)
pixel_rate = pixel_rate * 2; pixel_rate = pixel_rate * 2;
@ -46,7 +46,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return -EINVAL; return -EINVAL;
vc4_state->pixel_rate = pixel_rate; vc4_state->pixel_rate = pixel_rate;
@@ -1318,13 +1328,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_e @@ -1319,13 +1329,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_e
(mode->hsync_end % 2) || (mode->htotal % 2))) (mode->hsync_end % 2) || (mode->htotal % 2)))
return MODE_H_ILLEGAL; return MODE_H_ILLEGAL;

View File

@ -15,7 +15,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1264,6 +1264,35 @@ vc4_hdmi_encoder_clock_valid(const struc @@ -1265,6 +1265,35 @@ vc4_hdmi_encoder_clock_valid(const struc
return MODE_OK; return MODE_OK;
} }
@ -51,7 +51,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
#define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL #define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL
#define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL #define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL
@@ -1276,6 +1305,7 @@ static int vc4_hdmi_encoder_atomic_check @@ -1277,6 +1306,7 @@ static int vc4_hdmi_encoder_atomic_check
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
unsigned long long pixel_rate = mode->clock * 1000; unsigned long long pixel_rate = mode->clock * 1000;
unsigned long long tmds_rate; unsigned long long tmds_rate;
@ -59,7 +59,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_hdmi->variant->unsupported_odd_h_timings && if (vc4_hdmi->variant->unsupported_odd_h_timings &&
!(mode->flags & DRM_MODE_FLAG_DBLCLK) && !(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
@@ -1297,21 +1327,10 @@ static int vc4_hdmi_encoder_atomic_check @@ -1298,21 +1328,10 @@ static int vc4_hdmi_encoder_atomic_check
pixel_rate = mode->clock * 1000; pixel_rate = mode->clock * 1000;
} }

View File

@ -19,7 +19,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1255,12 +1255,18 @@ static enum drm_mode_status @@ -1256,12 +1256,18 @@ static enum drm_mode_status
vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
unsigned long long clock) unsigned long long clock)
{ {

View File

@ -57,7 +57,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return; return;
drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true); drm_scdc_set_high_tmds_clock_ratio(vc4_hdmi->ddc, true);
@@ -1245,6 +1253,7 @@ static void vc4_hdmi_encoder_atomic_mode @@ -1246,6 +1254,7 @@ static void vc4_hdmi_encoder_atomic_mode
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);

View File

@ -38,7 +38,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC; bool hsync_pos = mode->flags & DRM_MODE_FLAG_PHSYNC;
bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC; bool vsync_pos = mode->flags & DRM_MODE_FLAG_PVSYNC;
bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; bool interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE;
@@ -961,7 +964,7 @@ static void vc5_hdmi_set_timings(struct @@ -962,7 +965,7 @@ static void vc5_hdmi_set_timings(struct
HDMI_WRITE(HDMI_VERTB0, vertb_even); HDMI_WRITE(HDMI_VERTB0, vertb_even);
HDMI_WRITE(HDMI_VERTB1, vertb); HDMI_WRITE(HDMI_VERTB1, vertb);
@ -47,7 +47,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
case 12: case 12:
gcp = 6; gcp = 6;
gcp_en = true; gcp_en = true;
@@ -1251,9 +1254,11 @@ static void vc4_hdmi_encoder_atomic_mode @@ -1252,9 +1255,11 @@ static void vc4_hdmi_encoder_atomic_mode
struct drm_connector_state *conn_state) struct drm_connector_state *conn_state)
{ {
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
@ -60,7 +60,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
memcpy(&vc4_hdmi->saved_adjusted_mode, memcpy(&vc4_hdmi->saved_adjusted_mode,
&crtc_state->adjusted_mode, &crtc_state->adjusted_mode,
sizeof(vc4_hdmi->saved_adjusted_mode)); sizeof(vc4_hdmi->saved_adjusted_mode));
@@ -1308,6 +1313,38 @@ vc4_hdmi_encoder_compute_clock(const str @@ -1309,6 +1314,38 @@ vc4_hdmi_encoder_compute_clock(const str
return 0; return 0;
} }
@ -99,7 +99,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
#define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL #define WIFI_2_4GHz_CH1_MIN_FREQ 2400000000ULL
#define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL #define WIFI_2_4GHz_CH1_MAX_FREQ 2422000000ULL
@@ -1342,8 +1379,7 @@ static int vc4_hdmi_encoder_atomic_check @@ -1343,8 +1380,7 @@ static int vc4_hdmi_encoder_atomic_check
pixel_rate = mode->clock * 1000; pixel_rate = mode->clock * 1000;
} }

View File

@ -234,7 +234,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
HDMI_WRITE(HDMI_CSC_CTL, csc_ctl); HDMI_WRITE(HDMI_CSC_CTL, csc_ctl);
spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags); spin_unlock_irqrestore(&vc4_hdmi->hw_lock, flags);
@@ -980,6 +1093,15 @@ static void vc5_hdmi_set_timings(struct @@ -981,6 +1094,15 @@ static void vc5_hdmi_set_timings(struct
break; break;
} }
@ -250,7 +250,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
reg = HDMI_READ(HDMI_DEEP_COLOR_CONFIG_1); reg = HDMI_READ(HDMI_DEEP_COLOR_CONFIG_1);
reg &= ~(VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK | reg &= ~(VC5_HDMI_DEEP_COLOR_CONFIG_1_INIT_PACK_PHASE_MASK |
VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK); VC5_HDMI_DEEP_COLOR_CONFIG_1_COLOR_DEPTH_MASK);
@@ -1259,12 +1381,97 @@ static void vc4_hdmi_encoder_atomic_mode @@ -1260,12 +1382,97 @@ static void vc4_hdmi_encoder_atomic_mode
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);
vc4_hdmi->output_bpc = vc4_state->output_bpc; vc4_hdmi->output_bpc = vc4_state->output_bpc;
@ -348,7 +348,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static enum drm_mode_status static enum drm_mode_status
vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi, vc4_hdmi_encoder_clock_valid(const struct vc4_hdmi *vc4_hdmi,
unsigned long long clock) unsigned long long clock)
@@ -1286,13 +1493,17 @@ vc4_hdmi_encoder_clock_valid(const struc @@ -1287,13 +1494,17 @@ vc4_hdmi_encoder_clock_valid(const struc
static unsigned long long static unsigned long long
vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode, vc4_hdmi_encoder_compute_mode_clock(const struct drm_display_mode *mode,
@ -367,7 +367,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return clock * bpc / 8; return clock * bpc / 8;
} }
@@ -1300,11 +1511,11 @@ static int @@ -1301,11 +1512,11 @@ static int
vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi, vc4_hdmi_encoder_compute_clock(const struct vc4_hdmi *vc4_hdmi,
struct vc4_hdmi_connector_state *vc4_state, struct vc4_hdmi_connector_state *vc4_state,
const struct drm_display_mode *mode, const struct drm_display_mode *mode,
@ -381,7 +381,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK) if (vc4_hdmi_encoder_clock_valid(vc4_hdmi, clock) != MODE_OK)
return -EINVAL; return -EINVAL;
@@ -1314,10 +1525,55 @@ vc4_hdmi_encoder_compute_clock(const str @@ -1315,10 +1526,55 @@ vc4_hdmi_encoder_compute_clock(const str
} }
static int static int
@ -437,7 +437,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
struct drm_connector_state *conn_state = &vc4_state->base; struct drm_connector_state *conn_state = &vc4_state->base;
unsigned int max_bpc = clamp_t(unsigned int, conn_state->max_bpc, 8, 12); unsigned int max_bpc = clamp_t(unsigned int, conn_state->max_bpc, 8, 12);
unsigned int bpc; unsigned int bpc;
@@ -1326,17 +1582,18 @@ vc4_hdmi_encoder_compute_config(const st @@ -1327,17 +1583,18 @@ vc4_hdmi_encoder_compute_config(const st
for (bpc = max_bpc; bpc >= 8; bpc -= 2) { for (bpc = max_bpc; bpc >= 8; bpc -= 2) {
drm_dbg(dev, "Trying with a %d bpc output\n", bpc); drm_dbg(dev, "Trying with a %d bpc output\n", bpc);
@ -548,7 +548,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static inline static inline
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -804,11 +804,27 @@ enum { @@ -810,11 +810,27 @@ enum {
# define VC4_HD_CSC_CTL_RGB2YCC BIT(1) # define VC4_HD_CSC_CTL_RGB2YCC BIT(1)
# define VC4_HD_CSC_CTL_ENABLE BIT(0) # define VC4_HD_CSC_CTL_ENABLE BIT(0)

View File

@ -17,7 +17,7 @@ Signed-off-by: Matthias Reichl <hias@horus.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1415,9 +1415,6 @@ vc4_hdmi_sink_supports_format_bpc(const @@ -1416,9 +1416,6 @@ vc4_hdmi_sink_supports_format_bpc(const
case VC4_HDMI_OUTPUT_RGB: case VC4_HDMI_OUTPUT_RGB:
drm_dbg(dev, "RGB Format, checking the constraints.\n"); drm_dbg(dev, "RGB Format, checking the constraints.\n");

View File

@ -14,7 +14,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -664,6 +664,48 @@ static const u32 colorspace_coeffs[2][DR @@ -666,6 +666,48 @@ static const u32 colorspace_coeffs[2][DR
} }
}; };
@ -63,7 +63,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
/* Writes out a full display list for an active plane to the plane's /* Writes out a full display list for an active plane to the plane's
* private dlist state. * private dlist state.
*/ */
@@ -946,13 +988,8 @@ static int vc4_plane_mode_set(struct drm @@ -948,13 +990,8 @@ static int vc4_plane_mode_set(struct drm
/* Position Word 2: Source Image Size, Alpha */ /* Position Word 2: Source Image Size, Alpha */
vc4_state->pos2_offset = vc4_state->dlist_count; vc4_state->pos2_offset = vc4_state->dlist_count;
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,
@ -78,7 +78,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
VC4_SET_FIELD(vc4_state->src_w[0], VC4_SET_FIELD(vc4_state->src_w[0],
SCALER_POS2_WIDTH) | SCALER_POS2_WIDTH) |
VC4_SET_FIELD(vc4_state->src_h[0], VC4_SET_FIELD(vc4_state->src_h[0],
@@ -997,14 +1034,9 @@ static int vc4_plane_mode_set(struct drm @@ -999,14 +1036,9 @@ static int vc4_plane_mode_set(struct drm
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,
VC4_SET_FIELD(state->alpha >> 4, VC4_SET_FIELD(state->alpha >> 4,
SCALER5_CTL2_ALPHA) | SCALER5_CTL2_ALPHA) |
@ -95,7 +95,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
); );
/* Position Word 1: Scaled Image Dimensions. */ /* Position Word 1: Scaled Image Dimensions. */
@@ -1494,6 +1526,10 @@ struct drm_plane *vc4_plane_init(struct @@ -1496,6 +1528,10 @@ struct drm_plane *vc4_plane_init(struct
drm_plane_helper_add(plane, &vc4_plane_helper_funcs); drm_plane_helper_add(plane, &vc4_plane_helper_funcs);
drm_plane_create_alpha_property(plane); drm_plane_create_alpha_property(plane);

View File

@ -18,7 +18,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1496,7 +1496,7 @@ vc4_hdmi_encoder_compute_mode_clock(cons @@ -1497,7 +1497,7 @@ vc4_hdmi_encoder_compute_mode_clock(cons
unsigned int bpc, unsigned int bpc,
enum vc4_hdmi_output_format fmt) enum vc4_hdmi_output_format fmt)
{ {

View File

@ -18,7 +18,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/mfd/Kconfig --- a/drivers/mfd/Kconfig
+++ b/drivers/mfd/Kconfig +++ b/drivers/mfd/Kconfig
@@ -1093,6 +1093,16 @@ config MFD_SPMI_PMIC @@ -1094,6 +1094,16 @@ config MFD_SPMI_PMIC
Say M here if you want to include support for the SPMI PMIC Say M here if you want to include support for the SPMI PMIC
series as a module. The module will be called "qcom-spmi-pmic". series as a module. The module will be called "qcom-spmi-pmic".

View File

@ -167,7 +167,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
drm_connector_attach_encoder(connector, encoder); drm_connector_attach_encoder(connector, encoder);
return 0; return 0;
@@ -1385,6 +1487,7 @@ static void vc4_hdmi_encoder_atomic_mode @@ -1386,6 +1488,7 @@ static void vc4_hdmi_encoder_atomic_mode
mutex_lock(&vc4_hdmi->mutex); mutex_lock(&vc4_hdmi->mutex);
vc4_hdmi->output_bpc = vc4_state->output_bpc; vc4_hdmi->output_bpc = vc4_state->output_bpc;
vc4_hdmi->output_format = vc4_state->output_format; vc4_hdmi->output_format = vc4_state->output_format;

View File

@ -14,7 +14,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -135,6 +135,34 @@ static const struct hvs_format { @@ -137,6 +137,34 @@ static const struct hvs_format {
.pixel_order = HVS_PIXEL_ORDER_XYCBCR, .pixel_order = HVS_PIXEL_ORDER_XYCBCR,
.hvs5_only = true, .hvs5_only = true,
}, },

View File

@ -1,31 +0,0 @@
From b27bc74f47f9e3ef6fce066b3430a6cb59c10909 Mon Sep 17 00:00:00 2001
From: Chris Morgan <macromorgan@hotmail.com>
Date: Fri, 28 Jan 2022 17:38:40 -0600
Subject: [PATCH] media: uapi: add MEDIA_BUS_FMT_RGB565_1X24_CPADHI
Add the MEDIA_BUS_FMT_RGB565_1X24_CPADHI format used by the Geekworm
MZP280 panel for the Raspberry Pi.
Signed-off-by: Chris Morgan <macromorgan@hotmail.com>
---
include/uapi/linux/media-bus-format.h | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
--- a/include/uapi/linux/media-bus-format.h
+++ b/include/uapi/linux/media-bus-format.h
@@ -34,13 +34,14 @@
#define MEDIA_BUS_FMT_FIXED 0x0001
-/* RGB - next is 0x1020 */
+/* RGB - next is 0x1021 */
#define MEDIA_BUS_FMT_RGB444_1X12 0x1016
#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_BE 0x1001
#define MEDIA_BUS_FMT_RGB444_2X8_PADHI_LE 0x1002
#define MEDIA_BUS_FMT_RGB555_2X8_PADHI_BE 0x1003
#define MEDIA_BUS_FMT_RGB555_2X8_PADHI_LE 0x1004
#define MEDIA_BUS_FMT_RGB565_1X16 0x1017
+#define MEDIA_BUS_FMT_RGB565_1X24_CPADHI 0x1020
#define MEDIA_BUS_FMT_BGR565_2X8_BE 0x1005
#define MEDIA_BUS_FMT_BGR565_2X8_LE 0x1006
#define MEDIA_BUS_FMT_RGB565_2X8_BE 0x1007

View File

@ -18,8 +18,8 @@ Reviewed-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
--- a/drivers/gpu/drm/vc4/vc4_dpi.c --- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c +++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -191,6 +191,10 @@ static void vc4_dpi_encoder_enable(struc @@ -179,6 +179,10 @@ static void vc4_dpi_encoder_enable(struc
dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3, dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_1,
DPI_FORMAT); DPI_FORMAT);
break; break;
+ case MEDIA_BUS_FMT_RGB565_1X24_CPADHI: + case MEDIA_BUS_FMT_RGB565_1X24_CPADHI:

View File

@ -46,7 +46,7 @@ Acked-by: Maxime Ripard <maxime@cerno.tech>
static const struct drm_display_mode giantplus_gpg482739qs5_mode = { static const struct drm_display_mode giantplus_gpg482739qs5_mode = {
.clock = 9000, .clock = 9000,
.hdisplay = 480, .hdisplay = 480,
@@ -4704,6 +4730,9 @@ static const struct of_device_id platfor @@ -4672,6 +4698,9 @@ static const struct of_device_id platfor
.compatible = "friendlyarm,hd702e", .compatible = "friendlyarm,hd702e",
.data = &friendlyarm_hd702e, .data = &friendlyarm_hd702e,
}, { }, {

View File

@ -1,129 +0,0 @@
From 055e3d70b0227e26d58b2efc4561eb21a3fbf640 Mon Sep 17 00:00:00 2001
From: Naushir Patuck <naush@raspberrypi.com>
Date: Tue, 8 Feb 2022 13:49:11 +0000
Subject: [PATCH] media: i2c: imx219: Scale the pixel clock rate for
the 640x480 mode
The 640x480 mode uses a special binning mode for high framerate operation where
the pixel rate is effectively doubled. Account for this when setting up the
pixel clock rate, and applying the vblank and exposure controls.
Signed-off-by: Naushir Patuck <naush@raspberrypi.com>
---
drivers/media/i2c/imx219.c | 33 ++++++++++++++++++++++++++-------
1 file changed, 26 insertions(+), 7 deletions(-)
--- a/drivers/media/i2c/imx219.c
+++ b/drivers/media/i2c/imx219.c
@@ -153,6 +153,9 @@ struct imx219_mode {
/* Default register values */
struct imx219_reg_list reg_list;
+
+ /* Relative pixel clock rate factor for the mode. */
+ unsigned int rate_factor;
};
/*
@@ -495,6 +498,7 @@ static const struct imx219_mode supporte
.num_of_regs = ARRAY_SIZE(mode_3280x2464_regs),
.regs = mode_3280x2464_regs,
},
+ .rate_factor = 1,
},
{
/* 1080P 30fps cropped */
@@ -511,6 +515,7 @@ static const struct imx219_mode supporte
.num_of_regs = ARRAY_SIZE(mode_1920_1080_regs),
.regs = mode_1920_1080_regs,
},
+ .rate_factor = 1,
},
{
/* 2x2 binned 30fps mode */
@@ -527,6 +532,7 @@ static const struct imx219_mode supporte
.num_of_regs = ARRAY_SIZE(mode_1640_1232_regs),
.regs = mode_1640_1232_regs,
},
+ .rate_factor = 1,
},
{
/* 640x480 30fps mode */
@@ -543,6 +549,11 @@ static const struct imx219_mode supporte
.num_of_regs = ARRAY_SIZE(mode_640_480_regs),
.regs = mode_640_480_regs,
},
+ /*
+ * This mode uses a special 2x2 binning that doubles the
+ * the internal pixel clock rate.
+ */
+ .rate_factor = 2,
},
};
@@ -765,7 +776,8 @@ static int imx219_set_ctrl(struct v4l2_c
break;
case V4L2_CID_EXPOSURE:
ret = imx219_write_reg(imx219, IMX219_REG_EXPOSURE,
- IMX219_REG_VALUE_16BIT, ctrl->val);
+ IMX219_REG_VALUE_16BIT,
+ ctrl->val / imx219->mode->rate_factor);
break;
case V4L2_CID_DIGITAL_GAIN:
ret = imx219_write_reg(imx219, IMX219_REG_DIGITAL_GAIN,
@@ -785,7 +797,8 @@ static int imx219_set_ctrl(struct v4l2_c
case V4L2_CID_VBLANK:
ret = imx219_write_reg(imx219, IMX219_REG_VTS,
IMX219_REG_VALUE_16BIT,
- imx219->mode->height + ctrl->val);
+ (imx219->mode->height + ctrl->val) /
+ imx219->mode->rate_factor);
break;
case V4L2_CID_TEST_PATTERN_RED:
ret = imx219_write_reg(imx219, IMX219_REG_TESTP_RED,
@@ -957,7 +970,7 @@ static int imx219_set_pad_format(struct
struct imx219 *imx219 = to_imx219(sd);
const struct imx219_mode *mode;
struct v4l2_mbus_framefmt *framefmt;
- int exposure_max, exposure_def, hblank;
+ int exposure_max, exposure_def, hblank, pixel_rate;
unsigned int i;
if (fmt->pad >= NUM_PADS)
@@ -1018,6 +1031,12 @@ static int imx219_set_pad_format(struct
hblank = IMX219_PPL_DEFAULT - mode->width;
__v4l2_ctrl_modify_range(imx219->hblank, hblank, hblank,
1, hblank);
+
+ /* Scale the pixel rate based on the mode specific factor */
+ pixel_rate =
+ IMX219_PIXEL_RATE * imx219->mode->rate_factor;
+ __v4l2_ctrl_modify_range(imx219->pixel_rate, pixel_rate,
+ pixel_rate, 1, pixel_rate);
}
} else {
if (fmt->which == V4L2_SUBDEV_FORMAT_TRY) {
@@ -1362,7 +1381,7 @@ static int imx219_init_controls(struct i
struct v4l2_ctrl_handler *ctrl_hdlr;
unsigned int height = imx219->mode->height;
struct v4l2_fwnode_device_properties props;
- int exposure_max, exposure_def, hblank;
+ int exposure_max, exposure_def, hblank, pixel_rate;
int i, ret;
ctrl_hdlr = &imx219->ctrl_handler;
@@ -1374,11 +1393,11 @@ static int imx219_init_controls(struct i
ctrl_hdlr->lock = &imx219->mutex;
/* By default, PIXEL_RATE is read only */
+ pixel_rate = IMX219_PIXEL_RATE * imx219->mode->rate_factor;
imx219->pixel_rate = v4l2_ctrl_new_std(ctrl_hdlr, &imx219_ctrl_ops,
V4L2_CID_PIXEL_RATE,
- IMX219_PIXEL_RATE,
- IMX219_PIXEL_RATE, 1,
- IMX219_PIXEL_RATE);
+ pixel_rate, pixel_rate,
+ 1, pixel_rate);
imx219->link_freq =
v4l2_ctrl_new_int_menu(ctrl_hdlr, &imx219_ctrl_ops,

View File

@ -1,25 +0,0 @@
From 4626e370de018aed097d54247bae5a29391198ee Mon Sep 17 00:00:00 2001
From: Dave Stevenson <dave.stevenson@raspberrypi.com>
Date: Mon, 14 Feb 2022 15:34:51 +0000
Subject: [PATCH] drm/vc4: For DPI, MEDIA_BUS_FMT_RGB565_1X16 is mode
1, not 3.
The mapping is incorrect for RGB565_1X16 as it should be
DPI_FORMAT_18BIT_666_RGB_1 instead of DPI_FORMAT_18BIT_666_RGB_3.
Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
---
drivers/gpu/drm/vc4/vc4_dpi.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
--- a/drivers/gpu/drm/vc4/vc4_dpi.c
+++ b/drivers/gpu/drm/vc4/vc4_dpi.c
@@ -188,7 +188,7 @@ static void vc4_dpi_encoder_enable(struc
DPI_ORDER);
break;
case MEDIA_BUS_FMT_RGB565_1X16:
- dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_3,
+ dpi_c |= VC4_SET_FIELD(DPI_FORMAT_16BIT_565_RGB_1,
DPI_FORMAT);
break;
case MEDIA_BUS_FMT_RGB565_1X24_CPADHI:

View File

@ -399,7 +399,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
* overwrite the setup from the bootloader (just 128b out of * overwrite the setup from the bootloader (just 128b out of
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -234,6 +234,7 @@ @@ -240,6 +240,7 @@
# define SCALER_DISPCTRL_DSPEIEOLN(x) BIT(8 + ((x) * 2)) # define SCALER_DISPCTRL_DSPEIEOLN(x) BIT(8 + ((x) * 2))
/* Enables Display 0 EOF contribution to SCALER_DISPSTAT_IRQDISP0 */ /* Enables Display 0 EOF contribution to SCALER_DISPSTAT_IRQDISP0 */
# define SCALER_DISPCTRL_DSPEIEOF(x) BIT(7 + ((x) * 2)) # define SCALER_DISPCTRL_DSPEIEOF(x) BIT(7 + ((x) * 2))

View File

@ -88,7 +88,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
if (ret) if (ret)
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -1573,9 +1573,14 @@ struct drm_plane *vc4_plane_init(struct @@ -1575,9 +1575,14 @@ struct drm_plane *vc4_plane_init(struct
DRM_COLOR_YCBCR_BT709, DRM_COLOR_YCBCR_BT709,
DRM_COLOR_YCBCR_LIMITED_RANGE); DRM_COLOR_YCBCR_LIMITED_RANGE);
@ -103,7 +103,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
int vc4_plane_create_additional_planes(struct drm_device *drm) int vc4_plane_create_additional_planes(struct drm_device *drm)
{ {
struct drm_plane *cursor_plane; struct drm_plane *cursor_plane;
@@ -1591,7 +1596,7 @@ int vc4_plane_create_additional_planes(s @@ -1593,7 +1598,7 @@ int vc4_plane_create_additional_planes(s
* modest number of planes to expose, that should hopefully * modest number of planes to expose, that should hopefully
* still cover any sane usecase. * still cover any sane usecase.
*/ */
@ -112,7 +112,7 @@ Signed-off-by: Dave Stevenson <dave.stevenson@raspberrypi.com>
struct drm_plane *plane = struct drm_plane *plane =
vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY); vc4_plane_init(drm, DRM_PLANE_TYPE_OVERLAY);
@@ -1600,17 +1605,28 @@ int vc4_plane_create_additional_planes(s @@ -1602,17 +1607,28 @@ int vc4_plane_create_additional_planes(s
plane->possible_crtcs = plane->possible_crtcs =
GENMASK(drm->mode_config.num_crtc - 1, 0); GENMASK(drm->mode_config.num_crtc - 1, 0);

View File

@ -23,7 +23,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
u32 src_w[2], src_h[2]; u32 src_w[2], src_h[2];
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -179,9 +179,9 @@ static const struct hvs_format *vc4_get_ @@ -181,9 +181,9 @@ static const struct hvs_format *vc4_get_
static enum vc4_scaling_mode vc4_get_scaling_mode(u32 src, u32 dst) static enum vc4_scaling_mode vc4_get_scaling_mode(u32 src, u32 dst)
{ {
@ -35,7 +35,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
return VC4_SCALING_PPF; return VC4_SCALING_PPF;
else else
return VC4_SCALING_TPZ; return VC4_SCALING_TPZ;
@@ -388,15 +388,10 @@ static int vc4_plane_setup_clipping_and_ @@ -390,15 +390,10 @@ static int vc4_plane_setup_clipping_and_
for (i = 0; i < num_planes; i++) for (i = 0; i < num_planes; i++)
vc4_state->offsets[i] = bo->paddr + fb->offsets[i]; vc4_state->offsets[i] = bo->paddr + fb->offsets[i];
@ -55,7 +55,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_state->crtc_x = state->dst.x1; vc4_state->crtc_x = state->dst.x1;
vc4_state->crtc_y = state->dst.y1; vc4_state->crtc_y = state->dst.y1;
@@ -449,7 +444,7 @@ static void vc4_write_tpz(struct vc4_pla @@ -451,7 +446,7 @@ static void vc4_write_tpz(struct vc4_pla
{ {
u32 scale, recip; u32 scale, recip;
@ -64,7 +64,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
/* The specs note that while the reciprocal would be defined /* The specs note that while the reciprocal would be defined
* as (1<<32)/scale, ~0 is close enough. * as (1<<32)/scale, ~0 is close enough.
@@ -495,7 +490,7 @@ static u32 vc4_lbm_size(struct drm_plane @@ -497,7 +492,7 @@ static u32 vc4_lbm_size(struct drm_plane
if (vc4_state->x_scaling[0] == VC4_SCALING_TPZ) if (vc4_state->x_scaling[0] == VC4_SCALING_TPZ)
pix_per_line = vc4_state->crtc_w; pix_per_line = vc4_state->crtc_w;
else else
@ -73,7 +73,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
if (!vc4_state->is_yuv) { if (!vc4_state->is_yuv) {
if (vc4_state->y_scaling[0] == VC4_SCALING_TPZ) if (vc4_state->y_scaling[0] == VC4_SCALING_TPZ)
@@ -586,7 +581,8 @@ static void vc4_plane_calc_load(struct d @@ -588,7 +583,8 @@ static void vc4_plane_calc_load(struct d
for (i = 0; i < fb->format->num_planes; i++) { for (i = 0; i < fb->format->num_planes; i++) {
/* Even if the bandwidth/plane required for a single frame is /* Even if the bandwidth/plane required for a single frame is
* *
@ -83,7 +83,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
* *
* when downscaling, we have to read more pixels per line in * when downscaling, we have to read more pixels per line in
* the time frame reserved for a single line, so the bandwidth * the time frame reserved for a single line, so the bandwidth
@@ -595,11 +591,11 @@ static void vc4_plane_calc_load(struct d @@ -597,11 +593,11 @@ static void vc4_plane_calc_load(struct d
* load by this number. We're likely over-estimating the read * load by this number. We're likely over-estimating the read
* demand, but that's better than under-estimating it. * demand, but that's better than under-estimating it.
*/ */
@ -99,7 +99,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_state->hvs_load += vc4_state->crtc_h * vc4_state->crtc_w; vc4_state->hvs_load += vc4_state->crtc_h * vc4_state->crtc_w;
} }
@@ -752,7 +748,8 @@ static int vc4_plane_mode_set(struct drm @@ -754,7 +750,8 @@ static int vc4_plane_mode_set(struct drm
bool mix_plane_alpha; bool mix_plane_alpha;
bool covers_screen; bool covers_screen;
u32 scl0, scl1, pitch0; u32 scl0, scl1, pitch0;
@ -109,7 +109,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
u32 hvs_format = format->hvs; u32 hvs_format = format->hvs;
unsigned int rotation; unsigned int rotation;
int ret, i; int ret, i;
@@ -764,6 +761,9 @@ static int vc4_plane_mode_set(struct drm @@ -766,6 +763,9 @@ static int vc4_plane_mode_set(struct drm
if (ret) if (ret)
return ret; return ret;
@ -119,7 +119,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
/* SCL1 is used for Cb/Cr scaling of planar formats. For RGB /* SCL1 is used for Cb/Cr scaling of planar formats. For RGB
* and 4:4:4, scl1 should be set to scl0 so both channels of * and 4:4:4, scl1 should be set to scl0 so both channels of
* the scaler do the same thing. For YUV, the Y plane needs * the scaler do the same thing. For YUV, the Y plane needs
@@ -784,9 +784,11 @@ static int vc4_plane_mode_set(struct drm @@ -786,9 +786,11 @@ static int vc4_plane_mode_set(struct drm
DRM_MODE_REFLECT_Y); DRM_MODE_REFLECT_Y);
/* We must point to the last line when Y reflection is enabled. */ /* We must point to the last line when Y reflection is enabled. */
@ -133,7 +133,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
switch (base_format_mod) { switch (base_format_mod) {
case DRM_FORMAT_MOD_LINEAR: case DRM_FORMAT_MOD_LINEAR:
@@ -801,7 +803,7 @@ static int vc4_plane_mode_set(struct drm @@ -803,7 +805,7 @@ static int vc4_plane_mode_set(struct drm
(i ? v_subsample : 1) * (i ? v_subsample : 1) *
fb->pitches[i]; fb->pitches[i];
@ -142,7 +142,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
(i ? h_subsample : 1) * (i ? h_subsample : 1) *
fb->format->cpp[i]; fb->format->cpp[i];
} }
@@ -824,7 +826,7 @@ static int vc4_plane_mode_set(struct drm @@ -826,7 +828,7 @@ static int vc4_plane_mode_set(struct drm
* pitch * tile_h == tile_size * tiles_per_row * pitch * tile_h == tile_size * tiles_per_row
*/ */
u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift); u32 tiles_w = fb->pitches[0] >> (tile_size_shift - tile_h_shift);
@ -151,7 +151,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
u32 tiles_r = tiles_w - tiles_l; u32 tiles_r = tiles_w - tiles_l;
u32 tiles_t = src_y >> tile_h_shift; u32 tiles_t = src_y >> tile_h_shift;
/* Intra-tile offsets, which modify the base address (the /* Intra-tile offsets, which modify the base address (the
@@ -834,7 +836,7 @@ static int vc4_plane_mode_set(struct drm @@ -836,7 +838,7 @@ static int vc4_plane_mode_set(struct drm
u32 tile_y = (src_y >> 4) & 1; u32 tile_y = (src_y >> 4) & 1;
u32 subtile_y = (src_y >> 2) & 3; u32 subtile_y = (src_y >> 2) & 3;
u32 utile_y = src_y & 3; u32 utile_y = src_y & 3;
@ -160,7 +160,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
u32 y_off = src_y & tile_h_mask; u32 y_off = src_y & tile_h_mask;
/* When Y reflection is requested we must set the /* When Y reflection is requested we must set the
@@ -930,7 +932,7 @@ static int vc4_plane_mode_set(struct drm @@ -932,7 +934,7 @@ static int vc4_plane_mode_set(struct drm
* of the 12-pixels in that 128-bit word is the * of the 12-pixels in that 128-bit word is the
* first pixel to be used * first pixel to be used
*/ */
@ -169,7 +169,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
u32 aligned = remaining_pixels / 12; u32 aligned = remaining_pixels / 12;
u32 last_bits = remaining_pixels % 12; u32 last_bits = remaining_pixels % 12;
@@ -952,12 +954,12 @@ static int vc4_plane_mode_set(struct drm @@ -954,12 +956,12 @@ static int vc4_plane_mode_set(struct drm
return -EINVAL; return -EINVAL;
} }
pix_per_tile = tile_w / fb->format->cpp[0]; pix_per_tile = tile_w / fb->format->cpp[0];
@ -184,7 +184,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_state->offsets[i] += param * tile_w * tile; vc4_state->offsets[i] += param * tile_w * tile;
vc4_state->offsets[i] += src_y / vc4_state->offsets[i] += src_y /
@@ -1018,10 +1020,8 @@ static int vc4_plane_mode_set(struct drm @@ -1020,10 +1022,8 @@ static int vc4_plane_mode_set(struct drm
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,
(mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) | (mix_plane_alpha ? SCALER_POS2_ALPHA_MIX : 0) |
vc4_hvs4_get_alpha_blend_mode(state) | vc4_hvs4_get_alpha_blend_mode(state) |
@ -197,7 +197,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
/* Position Word 3: Context. Written by the HVS. */ /* Position Word 3: Context. Written by the HVS. */
vc4_dlist_write(vc4_state, 0xc0c0c0c0); vc4_dlist_write(vc4_state, 0xc0c0c0c0);
@@ -1079,10 +1079,8 @@ static int vc4_plane_mode_set(struct drm @@ -1081,10 +1081,8 @@ static int vc4_plane_mode_set(struct drm
/* Position Word 2: Source Image Size */ /* Position Word 2: Source Image Size */
vc4_state->pos2_offset = vc4_state->dlist_count; vc4_state->pos2_offset = vc4_state->dlist_count;
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,

View File

@ -11,7 +11,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -458,14 +458,47 @@ static void vc4_write_tpz(struct vc4_pla @@ -460,14 +460,47 @@ static void vc4_write_tpz(struct vc4_pla
VC4_SET_FIELD(recip, SCALER_TPZ1_RECIP)); VC4_SET_FIELD(recip, SCALER_TPZ1_RECIP));
} }
@ -62,7 +62,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
} }
static u32 vc4_lbm_size(struct drm_plane_state *state) static u32 vc4_lbm_size(struct drm_plane_state *state)
@@ -524,13 +557,13 @@ static void vc4_write_scaling_parameters @@ -526,13 +559,13 @@ static void vc4_write_scaling_parameters
/* Ch0 H-PPF Word 0: Scaling Parameters */ /* Ch0 H-PPF Word 0: Scaling Parameters */
if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) { if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) {
vc4_write_ppf(vc4_state, vc4_write_ppf(vc4_state,
@ -78,7 +78,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_dlist_write(vc4_state, 0xc0c0c0c0); vc4_dlist_write(vc4_state, 0xc0c0c0c0);
} }
@@ -978,6 +1011,24 @@ static int vc4_plane_mode_set(struct drm @@ -980,6 +1013,24 @@ static int vc4_plane_mode_set(struct drm
return -EINVAL; return -EINVAL;
} }

View File

@ -10,7 +10,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -461,17 +461,18 @@ static void vc4_write_tpz(struct vc4_pla @@ -463,17 +463,18 @@ static void vc4_write_tpz(struct vc4_pla
/* phase magnitude bits */ /* phase magnitude bits */
#define PHASE_BITS 6 #define PHASE_BITS 6
@ -31,7 +31,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
offset += -(1 << PHASE_BITS >> 2); offset += -(1 << PHASE_BITS >> 2);
} else { } else {
/* the phase is relative to scale_src->x, so shift it for display list's x value */ /* the phase is relative to scale_src->x, so shift it for display list's x value */
@@ -557,13 +558,15 @@ static void vc4_write_scaling_parameters @@ -559,13 +560,15 @@ static void vc4_write_scaling_parameters
/* Ch0 H-PPF Word 0: Scaling Parameters */ /* Ch0 H-PPF Word 0: Scaling Parameters */
if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) { if (vc4_state->x_scaling[channel] == VC4_SCALING_PPF) {
vc4_write_ppf(vc4_state, vc4_write_ppf(vc4_state,
@ -49,7 +49,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
vc4_dlist_write(vc4_state, 0xc0c0c0c0); vc4_dlist_write(vc4_state, 0xc0c0c0c0);
} }
@@ -1622,6 +1625,8 @@ struct drm_plane *vc4_plane_init(struct @@ -1624,6 +1627,8 @@ struct drm_plane *vc4_plane_init(struct
DRM_COLOR_YCBCR_BT709, DRM_COLOR_YCBCR_BT709,
DRM_COLOR_YCBCR_LIMITED_RANGE); DRM_COLOR_YCBCR_LIMITED_RANGE);

View File

@ -13,7 +13,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
--- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c --- a/drivers/pinctrl/bcm/pinctrl-bcm2835.c
+++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c +++ b/drivers/pinctrl/bcm/pinctrl-bcm2835.c
@@ -910,9 +910,12 @@ static int bcm2835_pmx_free(struct pinct @@ -908,9 +908,12 @@ static int bcm2835_pmx_free(struct pinct
unsigned offset) unsigned offset)
{ {
struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev); struct bcm2835_pinctrl *pc = pinctrl_dev_get_drvdata(pctldev);
@ -28,7 +28,7 @@ Signed-off-by: Phil Elwell <phil@raspberrypi.com>
return 0; return 0;
} }
@@ -954,10 +957,7 @@ static void bcm2835_pmx_gpio_disable_fre @@ -952,10 +955,7 @@ static void bcm2835_pmx_gpio_disable_fre
struct pinctrl_gpio_range *range, struct pinctrl_gpio_range *range,
unsigned offset) unsigned offset)
{ {

View File

@ -332,7 +332,7 @@ This reverts commit e99a1b69da07ee3b89a6b8005b854e6c04bfb450.
* overwrite the setup from the bootloader (just 128b out of * overwrite the setup from the bootloader (just 128b out of
--- a/drivers/gpu/drm/vc4/vc4_regs.h --- a/drivers/gpu/drm/vc4/vc4_regs.h
+++ b/drivers/gpu/drm/vc4/vc4_regs.h +++ b/drivers/gpu/drm/vc4/vc4_regs.h
@@ -234,7 +234,6 @@ @@ -240,7 +240,6 @@
# define SCALER_DISPCTRL_DSPEIEOLN(x) BIT(8 + ((x) * 2)) # define SCALER_DISPCTRL_DSPEIEOLN(x) BIT(8 + ((x) * 2))
/* Enables Display 0 EOF contribution to SCALER_DISPSTAT_IRQDISP0 */ /* Enables Display 0 EOF contribution to SCALER_DISPSTAT_IRQDISP0 */
# define SCALER_DISPCTRL_DSPEIEOF(x) BIT(7 + ((x) * 2)) # define SCALER_DISPCTRL_DSPEIEOF(x) BIT(7 + ((x) * 2))

View File

@ -25,7 +25,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1809,6 +1809,9 @@ static int vc4_hdmi_encoder_atomic_check @@ -1810,6 +1810,9 @@ static int vc4_hdmi_encoder_atomic_check
struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state); struct vc4_hdmi_connector_state *vc4_state = conn_state_to_vc4_hdmi_conn_state(conn_state);
struct drm_display_mode *mode = &crtc_state->adjusted_mode; struct drm_display_mode *mode = &crtc_state->adjusted_mode;
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder); struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
@ -35,7 +35,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
unsigned long long pixel_rate = mode->clock * 1000; unsigned long long pixel_rate = mode->clock * 1000;
unsigned long long tmds_rate; unsigned long long tmds_rate;
int ret; int ret;
@@ -1837,6 +1840,11 @@ static int vc4_hdmi_encoder_atomic_check @@ -1838,6 +1841,11 @@ static int vc4_hdmi_encoder_atomic_check
if (ret) if (ret)
return ret; return ret;

View File

@ -14,7 +14,7 @@ Signed-off-by: Dom Cobley <popcornmix@gmail.com>
--- a/drivers/gpu/drm/vc4/vc4_hdmi.c --- a/drivers/gpu/drm/vc4/vc4_hdmi.c
+++ b/drivers/gpu/drm/vc4/vc4_hdmi.c +++ b/drivers/gpu/drm/vc4/vc4_hdmi.c
@@ -1551,9 +1551,6 @@ static void vc4_hdmi_encoder_post_crtc_e @@ -1552,9 +1552,6 @@ static void vc4_hdmi_encoder_post_crtc_e
WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) & WARN_ON(!(HDMI_READ(HDMI_SCHEDULER_CONTROL) &
VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE)); VC4_HDMI_SCHEDULER_CONTROL_HDMI_ACTIVE));

View File

@ -65,7 +65,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
struct drm_device *drm = connector->dev; struct drm_device *drm = connector->dev;
struct drm_display_mode *mode; struct drm_display_mode *mode;
@@ -1672,11 +1673,12 @@ vc4_hdmi_encoder_clock_valid(const struc @@ -1673,11 +1674,12 @@ vc4_hdmi_encoder_clock_valid(const struc
{ {
const struct drm_connector *connector = &vc4_hdmi->connector; const struct drm_connector *connector = &vc4_hdmi->connector;
const struct drm_display_info *info = &connector->display_info; const struct drm_display_info *info = &connector->display_info;
@ -79,7 +79,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return MODE_CLOCK_HIGH; return MODE_CLOCK_HIGH;
if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000)) if (info->max_tmds_clock && clock > (info->max_tmds_clock * 1000))
@@ -3157,14 +3159,6 @@ static int vc4_hdmi_bind(struct device * @@ -3158,14 +3160,6 @@ static int vc4_hdmi_bind(struct device *
vc4_hdmi->disable_wifi_frequencies = vc4_hdmi->disable_wifi_frequencies =
of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence"); of_property_read_bool(dev->of_node, "wifi-2.4ghz-coexistence");

View File

@ -24,7 +24,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -1429,6 +1429,10 @@ static int vc4_plane_atomic_async_check( @@ -1431,6 +1431,10 @@ static int vc4_plane_atomic_async_check(
old_vc4_state = to_vc4_plane_state(plane->state); old_vc4_state = to_vc4_plane_state(plane->state);
new_vc4_state = to_vc4_plane_state(new_plane_state); new_vc4_state = to_vc4_plane_state(new_plane_state);

View File

@ -227,7 +227,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* 48k words of 2x12-bit pixels */ /* 48k words of 2x12-bit pixels */
drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024); drm_mm_init(&hvs->lbm_mm, 0, 48 * 1024);
else else
@@ -1008,7 +1008,7 @@ static int vc4_hvs_bind(struct device *d @@ -1019,7 +1019,7 @@ static int vc4_hvs_bind(struct device *d
NULL); NULL);
vc4_debugfs_add_file(drm, "hvs_dlists", vc4_hvs_debugfs_dlist, vc4_debugfs_add_file(drm, "hvs_dlists", vc4_hvs_debugfs_dlist,
NULL); NULL);
@ -294,7 +294,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
} else { } else {
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -542,10 +542,10 @@ static u32 vc4_lbm_size(struct drm_plane @@ -544,10 +544,10 @@ static u32 vc4_lbm_size(struct drm_plane
} }
/* Align it to 64 or 128 (hvs5) bytes */ /* Align it to 64 or 128 (hvs5) bytes */
@ -307,7 +307,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
return lbm; return lbm;
} }
@@ -664,7 +664,7 @@ static int vc4_plane_allocate_lbm(struct @@ -666,7 +666,7 @@ static int vc4_plane_allocate_lbm(struct
ret = drm_mm_insert_node_generic(&vc4->hvs->lbm_mm, ret = drm_mm_insert_node_generic(&vc4->hvs->lbm_mm,
&vc4_state->lbm, &vc4_state->lbm,
lbm_size, lbm_size,
@ -316,7 +316,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
0, 0); 0, 0);
spin_unlock_irqrestore(&vc4->hvs->mm_lock, irqflags); spin_unlock_irqrestore(&vc4->hvs->mm_lock, irqflags);
@@ -1039,7 +1039,7 @@ static int vc4_plane_mode_set(struct drm @@ -1041,7 +1041,7 @@ static int vc4_plane_mode_set(struct drm
mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE && mix_plane_alpha = state->alpha != DRM_BLEND_ALPHA_OPAQUE &&
fb->format->has_alpha; fb->format->has_alpha;
@ -325,7 +325,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
/* Control word */ /* Control word */
vc4_dlist_write(vc4_state, vc4_dlist_write(vc4_state,
SCALER_CTL0_VALID | SCALER_CTL0_VALID |
@@ -1570,14 +1570,13 @@ static const struct drm_plane_funcs vc4_ @@ -1572,14 +1572,13 @@ static const struct drm_plane_funcs vc4_
struct drm_plane *vc4_plane_init(struct drm_device *dev, struct drm_plane *vc4_plane_init(struct drm_device *dev,
enum drm_plane_type type) enum drm_plane_type type)
{ {
@ -341,7 +341,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static const uint64_t modifiers[] = { static const uint64_t modifiers[] = {
DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED, DRM_FORMAT_MOD_BROADCOM_VC4_T_TILED,
DRM_FORMAT_MOD_BROADCOM_SAND128, DRM_FORMAT_MOD_BROADCOM_SAND128,
@@ -1593,7 +1592,7 @@ struct drm_plane *vc4_plane_init(struct @@ -1595,7 +1594,7 @@ struct drm_plane *vc4_plane_init(struct
return ERR_PTR(-ENOMEM); return ERR_PTR(-ENOMEM);
for (i = 0; i < ARRAY_SIZE(hvs_formats); i++) { for (i = 0; i < ARRAY_SIZE(hvs_formats); i++) {

View File

@ -20,7 +20,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
--- a/drivers/gpu/drm/vc4/vc4_plane.c --- a/drivers/gpu/drm/vc4/vc4_plane.c
+++ b/drivers/gpu/drm/vc4/vc4_plane.c +++ b/drivers/gpu/drm/vc4/vc4_plane.c
@@ -1502,6 +1502,13 @@ static const struct drm_plane_helper_fun @@ -1504,6 +1504,13 @@ static const struct drm_plane_helper_fun
.atomic_async_update = vc4_plane_atomic_async_update, .atomic_async_update = vc4_plane_atomic_async_update,
}; };
@ -34,7 +34,7 @@ Signed-off-by: Maxime Ripard <maxime@cerno.tech>
static bool vc4_format_mod_supported(struct drm_plane *plane, static bool vc4_format_mod_supported(struct drm_plane *plane,
uint32_t format, uint32_t format,
uint64_t modifier) uint64_t modifier)
@@ -1606,7 +1613,10 @@ struct drm_plane *vc4_plane_init(struct @@ -1608,7 +1615,10 @@ struct drm_plane *vc4_plane_init(struct
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);

View File

@ -15,7 +15,7 @@ Link: https://lore.kernel.org/r/20210905165816.655275-1-robimarko@gmail.com
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -293,6 +293,25 @@ @@ -320,6 +320,25 @@
#reset-cells = <0x1>; #reset-cells = <0x1>;
}; };

View File

@ -16,7 +16,7 @@ Link: https://lore.kernel.org/r/20211001145421.18302-1-amadeus@jmu.edu.cn
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -430,6 +430,21 @@ @@ -457,6 +457,21 @@
status = "disabled"; status = "disabled";
}; };

View File

@ -37,7 +37,7 @@ Link: https://lore.kernel.org/r/20210929034253.24570-4-shawn.guo@linaro.org
+ #clock-cells = <1>; + #clock-cells = <1>;
clocks = <&gcc GCC_USB1_PIPE_CLK>; clocks = <&gcc GCC_USB1_PIPE_CLK>;
clock-names = "pipe0"; clock-names = "pipe0";
clock-output-names = "gcc_usb1_pipe_clk_src"; clock-output-names = "usb3phy_1_cc_pipe_clk";
@@ -134,7 +134,6 @@ @@ -134,7 +134,6 @@
ssphy_0: phy@78000 { ssphy_0: phy@78000 {
compatible = "qcom,ipq8074-qmp-usb3-phy"; compatible = "qcom,ipq8074-qmp-usb3-phy";
@ -53,7 +53,7 @@ Link: https://lore.kernel.org/r/20210929034253.24570-4-shawn.guo@linaro.org
+ #clock-cells = <1>; + #clock-cells = <1>;
clocks = <&gcc GCC_USB0_PIPE_CLK>; clocks = <&gcc GCC_USB0_PIPE_CLK>;
clock-names = "pipe0"; clock-names = "pipe0";
clock-output-names = "gcc_usb0_pipe_clk_src"; clock-output-names = "usb3phy_0_cc_pipe_clk";
--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi --- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
+++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi +++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
@@ -602,7 +602,6 @@ @@ -602,7 +602,6 @@

View File

@ -1,94 +0,0 @@
From 942bcd33ed455ad40b71a59901bd926bbf4a500e Mon Sep 17 00:00:00 2001
From: Shawn Guo <shawn.guo@linaro.org>
Date: Wed, 29 Sep 2021 11:42:51 +0800
Subject: [PATCH] arm64: dts: qcom: Fix IPQ8074 PCIe PHY nodes
IPQ8074 PCIe PHY nodes are broken in the many ways:
- '#address-cells', '#size-cells' and 'ranges' are missing.
- Child phy/lane node is missing, and the child properties like
'#phy-cells' and 'clocks' are mistakenly put into parent node.
- The clocks properties for parent node are missing.
Fix them to get the nodes comply with the bindings schema.
Signed-off-by: Shawn Guo <shawn.guo@linaro.org>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
Link: https://lore.kernel.org/r/20210929034253.24570-9-shawn.guo@linaro.org
---
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 46 +++++++++++++++++++++------
1 file changed, 36 insertions(+), 10 deletions(-)
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -174,34 +174,60 @@
status = "disabled";
};
- pcie_phy0: phy@86000 {
+ pcie_qmp0: phy@86000 {
compatible = "qcom,ipq8074-qmp-pcie-phy";
reg = <0x00086000 0x1000>;
- #phy-cells = <0>;
- clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
- clock-names = "pipe_clk";
- clock-output-names = "pcie20_phy0_pipe_clk";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ clocks = <&gcc GCC_PCIE0_AUX_CLK>,
+ <&gcc GCC_PCIE0_AHB_CLK>;
+ clock-names = "aux", "cfg_ahb";
resets = <&gcc GCC_PCIE0_PHY_BCR>,
<&gcc GCC_PCIE0PHY_PHY_BCR>;
reset-names = "phy",
"common";
status = "disabled";
+
+ pcie_phy0: phy@86200 {
+ reg = <0x86200 0x16c>,
+ <0x86400 0x200>,
+ <0x86800 0x4f4>;
+ #phy-cells = <0>;
+ #clock-cells = <0>;
+ clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
+ clock-names = "pipe0";
+ clock-output-names = "pcie_0_pipe_clk";
+ };
};
- pcie_phy1: phy@8e000 {
+ pcie_qmp1: phy@8e000 {
compatible = "qcom,ipq8074-qmp-pcie-phy";
reg = <0x0008e000 0x1000>;
- #phy-cells = <0>;
- clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
- clock-names = "pipe_clk";
- clock-output-names = "pcie20_phy1_pipe_clk";
+ #address-cells = <1>;
+ #size-cells = <1>;
+ ranges;
+ clocks = <&gcc GCC_PCIE1_AUX_CLK>,
+ <&gcc GCC_PCIE1_AHB_CLK>;
+ clock-names = "aux", "cfg_ahb";
resets = <&gcc GCC_PCIE1_PHY_BCR>,
<&gcc GCC_PCIE1PHY_PHY_BCR>;
reset-names = "phy",
"common";
status = "disabled";
+
+ pcie_phy1: phy@8e200 {
+ reg = <0x8e200 0x16c>,
+ <0x8e400 0x200>,
+ <0x8e800 0x4f4>;
+ #phy-cells = <0>;
+ #clock-cells = <0>;
+ clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
+ clock-names = "pipe0";
+ clock-output-names = "pcie_1_pipe_clk";
+ };
};
prng: rng@e3000 {

View File

@ -15,7 +15,7 @@ Link: https://lore.kernel.org/r/20211007115846.26255-1-robimarko@gmail.com
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -230,6 +230,18 @@ @@ -231,6 +231,18 @@
}; };
}; };

View File

@ -34,7 +34,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
firmware { firmware {
scm { scm {
compatible = "qcom,scm-ipq8074", "qcom,scm"; compatible = "qcom,scm-ipq8074", "qcom,scm";
@@ -331,6 +345,12 @@ @@ -332,6 +346,12 @@
#reset-cells = <0x1>; #reset-cells = <0x1>;
}; };

View File

@ -13,7 +13,7 @@ Signed-off-by: Kathiravan T <quic_kathirav@quicinc.com>
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -669,9 +669,18 @@ @@ -670,9 +670,18 @@
intc: interrupt-controller@b000000 { intc: interrupt-controller@b000000 {
compatible = "qcom,msm-qgic2"; compatible = "qcom,msm-qgic2";

View File

@ -1,193 +0,0 @@
From 9e280276de874970d03cdc124d8bfa7afbb6aef1 Mon Sep 17 00:00:00 2001
From: Robert Marko <robimarko@gmail.com>
Date: Mon, 20 Dec 2021 15:08:04 +0100
Subject: [PATCH] arm64: dts: ipq8074: fix PCI related DT nodes
Currently present PCI PHY and PCI controller nodes are not working
and are incorrect for the v2 of IPQ8074 which is the only version
supported upstream.
So, correct the PCI related nodes.
Signed-off-by: Robert Marko <robimarko@gmail.com>
---
arch/arm64/boot/dts/qcom/ipq8074.dtsi | 73 +++++++++++++++------------
1 file changed, 42 insertions(+), 31 deletions(-)
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -228,9 +228,9 @@
status = "disabled";
};
- pcie_qmp0: phy@86000 {
- compatible = "qcom,ipq8074-qmp-pcie-phy";
- reg = <0x00086000 0x1000>;
+ pcie_qmp0: phy@84000 {
+ compatible = "qcom,ipq8074-qmp-pcie-gen3-phy";
+ reg = <0x00084000 0x1bc>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
@@ -244,21 +244,22 @@
"common";
status = "disabled";
- pcie_phy0: phy@86200 {
- reg = <0x86200 0x16c>,
- <0x86400 0x200>,
- <0x86800 0x4f4>;
+ pcie_phy0: phy@84200 {
+ reg = <0x84200 0x16c>,
+ <0x84400 0x200>,
+ <0x84800 0x4f4>;
#phy-cells = <0>;
#clock-cells = <0>;
clocks = <&gcc GCC_PCIE0_PIPE_CLK>;
clock-names = "pipe0";
clock-output-names = "pcie_0_pipe_clk";
+ clock-output-rate = <250000000>;
};
};
pcie_qmp1: phy@8e000 {
compatible = "qcom,ipq8074-qmp-pcie-phy";
- reg = <0x0008e000 0x1000>;
+ reg = <0x0008e000 0x1c4>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
@@ -273,14 +274,15 @@
status = "disabled";
pcie_phy1: phy@8e200 {
- reg = <0x8e200 0x16c>,
+ reg = <0x8e200 0x130>,
<0x8e400 0x200>,
- <0x8e800 0x4f4>;
+ <0x8e800 0x1f8>;
#phy-cells = <0>;
#clock-cells = <0>;
clocks = <&gcc GCC_PCIE1_PIPE_CLK>;
clock-names = "pipe0";
clock-output-names = "pcie_1_pipe_clk";
+ clock-output-rate = <125000000>;
};
};
@@ -676,7 +678,7 @@
reg = <0x0b000000 0x1000>, <0x0b002000 0x1000>;
ranges = <0 0xb00a000 0xffd>;
- v2m@0 {
+ gic_v2m0: v2m@0 {
compatible = "arm,gic-v2m-frame";
msi-controller;
reg = <0x0 0xffd>;
@@ -769,6 +771,7 @@
linux,pci-domain = <1>;
bus-range = <0x00 0xff>;
num-lanes = <1>;
+ max-link-speed = <2>;
#address-cells = <3>;
#size-cells = <2>;
@@ -776,12 +779,12 @@
phy-names = "pciephy";
ranges = <0x81000000 0 0x10200000 0x10200000
- 0 0x100000 /* downstream I/O */
- 0x82000000 0 0x10300000 0x10300000
- 0 0xd00000>; /* non-prefetchable memory */
+ 0 0x10000>, /* downstream I/O */
+ <0x82000000 0 0x10220000 0x10220000
+ 0 0xfde0000>; /* non-prefetchable memory */
+
+ msi-parent = <&gic_v2m0>;
- interrupts = <GIC_SPI 85 IRQ_TYPE_LEVEL_HIGH>;
- interrupt-names = "msi";
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0x7>;
interrupt-map = <0 0 0 1 &intc 0 142
@@ -821,16 +824,18 @@
};
pcie0: pci@20000000 {
- compatible = "qcom,pcie-ipq8074";
- reg = <0x20000000 0xf1d>,
- <0x20000f20 0xa8>,
- <0x00080000 0x2000>,
- <0x20100000 0x1000>;
- reg-names = "dbi", "elbi", "parf", "config";
+ compatible = "qcom,pcie-ipq8074-gen3";
+ reg = <0x20000000 0xf1d>,
+ <0x20000f20 0xa8>,
+ <0x20001000 0x1000>,
+ <0x00080000 0x4000>,
+ <0x20100000 0x1000>;
+ reg-names = "dbi", "elbi", "atu", "parf", "config";
device_type = "pci";
linux,pci-domain = <0>;
bus-range = <0x00 0xff>;
num-lanes = <1>;
+ max-link-speed = <3>;
#address-cells = <3>;
#size-cells = <2>;
@@ -838,12 +843,12 @@
phy-names = "pciephy";
ranges = <0x81000000 0 0x20200000 0x20200000
- 0 0x100000 /* downstream I/O */
- 0x82000000 0 0x20300000 0x20300000
- 0 0xd00000>; /* non-prefetchable memory */
+ 0 0x10000>, /* downstream I/O */
+ <0x82000000 0 0x20220000 0x20220000
+ 0 0xfde0000>; /* non-prefetchable memory */
+
+ msi-parent = <&gic_v2m0>;
- interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
- interrupt-names = "msi";
#interrupt-cells = <1>;
interrupt-map-mask = <0 0 0 0x7>;
interrupt-map = <0 0 0 1 &intc 0 75
@@ -859,27 +864,33 @@
<&gcc GCC_PCIE0_AXI_M_CLK>,
<&gcc GCC_PCIE0_AXI_S_CLK>,
<&gcc GCC_PCIE0_AHB_CLK>,
- <&gcc GCC_PCIE0_AUX_CLK>;
+ <&gcc GCC_PCIE0_AUX_CLK>,
+ <&gcc GCC_PCIE0_AXI_S_BRIDGE_CLK>,
+ <&gcc GCC_PCIE0_RCHNG_CLK>;
clock-names = "iface",
"axi_m",
"axi_s",
"ahb",
- "aux";
+ "aux",
+ "axi_bridge",
+ "rchng";
resets = <&gcc GCC_PCIE0_PIPE_ARES>,
<&gcc GCC_PCIE0_SLEEP_ARES>,
<&gcc GCC_PCIE0_CORE_STICKY_ARES>,
<&gcc GCC_PCIE0_AXI_MASTER_ARES>,
<&gcc GCC_PCIE0_AXI_SLAVE_ARES>,
<&gcc GCC_PCIE0_AHB_ARES>,
- <&gcc GCC_PCIE0_AXI_MASTER_STICKY_ARES>;
+ <&gcc GCC_PCIE0_AXI_MASTER_STICKY_ARES>,
+ <&gcc GCC_PCIE0_AXI_SLAVE_STICKY_ARES>;
reset-names = "pipe",
"sleep",
"sticky",
"axi_m",
"axi_s",
"ahb",
- "axi_m_sticky";
+ "axi_m_sticky",
+ "axi_s_sticky";
status = "disabled";
};
};

View File

@ -49,7 +49,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
soc: soc { soc: soc {
#address-cells = <0x1>; #address-cells = <0x1>;
#size-cells = <0x1>; #size-cells = <0x1>;
@@ -393,6 +419,11 @@ @@ -392,6 +418,11 @@
#hwlock-cells = <1>; #hwlock-cells = <1>;
}; };
@ -61,7 +61,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
spmi_bus: spmi@200f000 { spmi_bus: spmi@200f000 {
compatible = "qcom,spmi-pmic-arb"; compatible = "qcom,spmi-pmic-arb";
reg = <0x0200f000 0x001000>, reg = <0x0200f000 0x001000>,
@@ -893,5 +924,62 @@ @@ -887,5 +918,62 @@
"axi_s_sticky"; "axi_s_sticky";
status = "disabled"; status = "disabled";
}; };

View File

@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -981,5 +981,116 @@ @@ -975,5 +975,116 @@
}; };
}; };
}; };

View File

@ -77,7 +77,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
} else { } else {
/* No mask register on older TSENS */ /* No mask register on older TSENS */
d->up_irq_mask = 0; d->up_irq_mask = 0;
@@ -993,6 +999,9 @@ static const struct of_device_id tsens_t @@ -999,6 +1005,9 @@ static const struct of_device_id tsens_t
}, { }, {
.compatible = "qcom,tsens-v2", .compatible = "qcom,tsens-v2",
.data = &data_tsens_v2, .data = &data_tsens_v2,
@ -90,7 +90,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/drivers/thermal/qcom/tsens.h --- a/drivers/thermal/qcom/tsens.h
+++ b/drivers/thermal/qcom/tsens.h +++ b/drivers/thermal/qcom/tsens.h
@@ -593,6 +593,6 @@ extern struct tsens_plat_data data_8916, @@ -593,6 +593,6 @@ extern struct tsens_plat_data data_8916,
extern struct tsens_plat_data data_tsens_v1, data_8976; extern struct tsens_plat_data data_tsens_v1, data_8976, data_8956;
/* TSENS v2 targets */ /* TSENS v2 targets */
-extern struct tsens_plat_data data_8996, data_tsens_v2; -extern struct tsens_plat_data data_8996, data_tsens_v2;

View File

@ -18,7 +18,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -332,6 +332,16 @@ @@ -331,6 +331,16 @@
status = "disabled"; status = "disabled";
}; };
@ -35,7 +35,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
cryptobam: dma@704000 { cryptobam: dma@704000 {
compatible = "qcom,bam-v1.7.0"; compatible = "qcom,bam-v1.7.0";
reg = <0x00704000 0x20000>; reg = <0x00704000 0x20000>;
@@ -1093,4 +1103,90 @@ @@ -1087,4 +1097,90 @@
status = "disabled"; status = "disabled";
}; };
}; };

View File

@ -23,7 +23,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
/ { / {
model = "Qualcomm Technologies, Inc. IPQ8074"; model = "Qualcomm Technologies, Inc. IPQ8074";
@@ -451,6 +452,39 @@ @@ -450,6 +451,39 @@
interrupt-controller; interrupt-controller;
#interrupt-cells = <4>; #interrupt-cells = <4>;
cell-index = <0>; cell-index = <0>;

View File

@ -15,7 +15,7 @@ Signed-off-by: Robert Marko <robimarko@gmail.com>
--- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi --- a/arch/arm64/boot/dts/qcom/ipq8074.dtsi
+++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi +++ b/arch/arm64/boot/dts/qcom/ipq8074.dtsi
@@ -971,8 +971,9 @@ @@ -965,8 +965,9 @@
apcs_glb: mailbox@b111000 { apcs_glb: mailbox@b111000 {
compatible = "qcom,ipq8074-apcs-apps-global"; compatible = "qcom,ipq8074-apcs-apps-global";

View File

@ -592,7 +592,7 @@
out: out:
fib6_info_release(rt); fib6_info_release(rt);
return err; return err;
@@ -6352,6 +6362,20 @@ static int ip6_route_dev_notify(struct n @@ -6353,6 +6363,20 @@ static int ip6_route_dev_notify(struct n
return NOTIFY_OK; return NOTIFY_OK;
} }

View File

@ -27,7 +27,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
/* YT8521/YT8531S Register Overview /* YT8521/YT8531S Register Overview
* UTP Register space | FIBER Register space * UTP Register space | FIBER Register space
@@ -1804,7 +1804,7 @@ static const struct mdio_device_id __maybe_unused motorcomm_tbl[] = { @@ -1804,7 +1804,7 @@ static const struct mdio_device_id __may
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8511) }, { PHY_ID_MATCH_EXACT(PHY_ID_YT8511) },
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8521) }, { PHY_ID_MATCH_EXACT(PHY_ID_YT8521) },
{ PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) }, { PHY_ID_MATCH_EXACT(PHY_ID_YT8531S) },

View File

@ -60,11 +60,10 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
struct yt8521_priv { struct yt8521_priv {
/* combo_advertising is used for case of YT8521 in combo mode, /* combo_advertising is used for case of YT8521 in combo mode,
* this means that yt8521 may work in utp or fiber mode which depends * this means that yt8521 may work in utp or fiber mode which depends
@@ -640,6 +633,142 @@ static int yt8521_write_page(struct phy_device *phydev, int page) @@ -641,6 +634,142 @@ static int yt8521_write_page(struct phy_
return ytphy_modify_ext(phydev, YT8521_REG_SPACE_SELECT_REG, mask, set);
}; };
+/** /**
+ * struct ytphy_cfg_reg_map - map a config value to a register value + * struct ytphy_cfg_reg_map - map a config value to a register value
+ * @cfg: value in device configuration + * @cfg: value in device configuration
+ * @reg: value in the register + * @reg: value in the register
@ -200,10 +199,11 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
+ return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val); + return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val);
+} +}
+ +
/** +/**
* yt8521_probe() - read chip config then set suitable polling_mode * yt8521_probe() - read chip config then set suitable polling_mode
* @phydev: a pointer to a &struct phy_device * @phydev: a pointer to a &struct phy_device
@@ -648,9 +777,12 @@ static int yt8521_write_page(struct phy_device *phydev, int page) *
@@ -648,9 +777,12 @@ static int yt8521_write_page(struct phy_
*/ */
static int yt8521_probe(struct phy_device *phydev) static int yt8521_probe(struct phy_device *phydev)
{ {
@ -216,7 +216,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
int ret; int ret;
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL); priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -695,7 +827,45 @@ static int yt8521_probe(struct phy_device *phydev) @@ -695,7 +827,45 @@ static int yt8521_probe(struct phy_devic
return ret; return ret;
} }
@ -263,7 +263,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} }
/** /**
@@ -1180,61 +1350,36 @@ static int yt8521_resume(struct phy_device *phydev) @@ -1180,61 +1350,36 @@ static int yt8521_resume(struct phy_devi
*/ */
static int yt8521_config_init(struct phy_device *phydev) static int yt8521_config_init(struct phy_device *phydev)
{ {

View File

@ -28,7 +28,7 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
/* Extended Register end */ /* Extended Register end */
@@ -858,7 +856,32 @@ static int yt8521_probe(struct phy_device *phydev) @@ -858,7 +856,32 @@ static int yt8521_probe(struct phy_devic
return -EINVAL; return -EINVAL;
} }
} else if (phydev->drv->phy_id == PHY_ID_YT8531S) { } else if (phydev->drv->phy_id == PHY_ID_YT8531S) {
@ -62,11 +62,10 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
} else { } else {
phydev_warn(phydev, "PHY id err\n"); phydev_warn(phydev, "PHY id err\n");
return -EINVAL; return -EINVAL;
@@ -868,26 +891,6 @@ static int yt8521_probe(struct phy_device *phydev) @@ -869,26 +892,6 @@ static int yt8521_probe(struct phy_devic
val);
} }
-/** /**
- * yt8531s_probe() - read chip config then set suitable polling_mode - * yt8531s_probe() - read chip config then set suitable polling_mode
- * @phydev: a pointer to a &struct phy_device - * @phydev: a pointer to a &struct phy_device
- * - *
@ -86,10 +85,11 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
- return yt8521_probe(phydev); - return yt8521_probe(phydev);
-} -}
- -
/** -/**
* ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
* @phydev: a pointer to a &struct phy_device * @phydev: a pointer to a &struct phy_device
@@ -1970,7 +1973,7 @@ static struct phy_driver motorcomm_phy_drvs[] = { *
@@ -1970,7 +1973,7 @@ static struct phy_driver motorcomm_phy_d
PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
.name = "YT8531S Gigabit Ethernet", .name = "YT8531S Gigabit Ethernet",
.get_features = yt8521_get_features, .get_features = yt8521_get_features,

View File

@ -28,8 +28,6 @@ Signed-off-by: David S. Miller <davem@davemloft.net>
config NATIONAL_PHY config NATIONAL_PHY
tristate "National Semiconductor PHYs" tristate "National Semiconductor PHYs"
diff --git a/drivers/net/phy/motorcomm.c b/drivers/net/phy/motorcomm.c
index bdc6a55d59f19..ee7c37dfdca01 100644
--- a/drivers/net/phy/motorcomm.c --- a/drivers/net/phy/motorcomm.c
+++ b/drivers/net/phy/motorcomm.c +++ b/drivers/net/phy/motorcomm.c
@@ -1,6 +1,6 @@ @@ -1,6 +1,6 @@
@ -48,7 +46,7 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
#define PHY_ID_YT8531S 0x4f51e91a #define PHY_ID_YT8531S 0x4f51e91a
/* YT8521/YT8531S Register Overview /* YT8521/YT8531S Register Overview
@@ -517,6 +518,61 @@ static int ytphy_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) @@ -517,6 +518,61 @@ err_restore_page:
return phy_restore_page(phydev, old_page, ret); return phy_restore_page(phydev, old_page, ret);
} }
@ -110,7 +108,7 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
static int yt8511_read_page(struct phy_device *phydev) static int yt8511_read_page(struct phy_device *phydev)
{ {
return __phy_read(phydev, YT8511_PAGE_SELECT); return __phy_read(phydev, YT8511_PAGE_SELECT);
@@ -767,6 +823,17 @@ static int ytphy_rgmii_clk_delay_config(struct phy_device *phydev) @@ -767,6 +823,17 @@ static int ytphy_rgmii_clk_delay_config(
return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val); return ytphy_modify_ext(phydev, YT8521_RGMII_CONFIG1_REG, mask, val);
} }
@ -128,7 +126,7 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
/** /**
* yt8521_probe() - read chip config then set suitable polling_mode * yt8521_probe() - read chip config then set suitable polling_mode
* @phydev: a pointer to a &struct phy_device * @phydev: a pointer to a &struct phy_device
@@ -891,6 +958,43 @@ static int yt8521_probe(struct phy_device *phydev) @@ -891,6 +958,43 @@ static int yt8521_probe(struct phy_devic
val); val);
} }
@ -172,7 +170,7 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
/** /**
* ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp * ytphy_utp_read_lpa() - read LPA then setup lp_advertising for utp
* @phydev: a pointer to a &struct phy_device * @phydev: a pointer to a &struct phy_device
@@ -1387,6 +1491,94 @@ static int yt8521_config_init(struct phy_device *phydev) @@ -1387,6 +1491,94 @@ err_restore_page:
return phy_restore_page(phydev, old_page, ret); return phy_restore_page(phydev, old_page, ret);
} }
@ -267,11 +265,10 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
/** /**
* yt8521_prepare_fiber_features() - A small helper function that setup * yt8521_prepare_fiber_features() - A small helper function that setup
* fiber's features. * fiber's features.
@@ -1969,6 +2161,17 @@ static struct phy_driver motorcomm_phy_drvs[] = { @@ -1970,6 +2162,17 @@ static struct phy_driver motorcomm_phy_d
.suspend = yt8521_suspend,
.resume = yt8521_resume, .resume = yt8521_resume,
}, },
+ { {
+ PHY_ID_MATCH_EXACT(PHY_ID_YT8531), + PHY_ID_MATCH_EXACT(PHY_ID_YT8531),
+ .name = "YT8531 Gigabit Ethernet", + .name = "YT8531 Gigabit Ethernet",
+ .probe = yt8531_probe, + .probe = yt8531_probe,
@ -282,10 +279,11 @@ index bdc6a55d59f19..ee7c37dfdca01 100644
+ .set_wol = yt8531_set_wol, + .set_wol = yt8531_set_wol,
+ .link_change_notify = yt8531_link_change_notify, + .link_change_notify = yt8531_link_change_notify,
+ }, + },
{ + {
PHY_ID_MATCH_EXACT(PHY_ID_YT8531S), PHY_ID_MATCH_EXACT(PHY_ID_YT8531S),
.name = "YT8531S Gigabit Ethernet", .name = "YT8531S Gigabit Ethernet",
@@ -1990,7 +2193,7 @@ static struct phy_driver motorcomm_phy_drvs[] = { .get_features = yt8521_get_features,
@@ -1990,7 +2193,7 @@ static struct phy_driver motorcomm_phy_d
module_phy_driver(motorcomm_phy_drvs); module_phy_driver(motorcomm_phy_drvs);

View File

@ -18,7 +18,7 @@ Signed-off-by: Jakub Kicinski <kuba@kernel.org>
--- a/drivers/net/phy/motorcomm.c --- a/drivers/net/phy/motorcomm.c
+++ b/drivers/net/phy/motorcomm.c +++ b/drivers/net/phy/motorcomm.c
@@ -1533,10 +1533,10 @@ static int yt8531_config_init(struct phy_device *phydev) @@ -1533,10 +1533,10 @@ static int yt8531_config_init(struct phy
static void yt8531_link_change_notify(struct phy_device *phydev) static void yt8531_link_change_notify(struct phy_device *phydev)
{ {
struct device_node *node = phydev->mdio.dev.of_node; struct device_node *node = phydev->mdio.dev.of_node;

View File

@ -17,7 +17,7 @@ Signed-off-by: Andrew Powers-Holmes <aholmes@omnom.net>
--- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi --- a/arch/arm64/boot/dts/rockchip/rk356x.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk356x.dtsi
@@ -707,7 +707,7 @@ @@ -708,7 +708,7 @@
compatible = "rockchip,rk3568-pcie"; compatible = "rockchip,rk3568-pcie";
reg = <0x3 0xc0000000 0x0 0x00400000>, reg = <0x3 0xc0000000 0x0 0x00400000>,
<0x0 0xfe260000 0x0 0x00010000>, <0x0 0xfe260000 0x0 0x00010000>,
@ -26,7 +26,7 @@ Signed-off-by: Andrew Powers-Holmes <aholmes@omnom.net>
reg-names = "dbi", "apb", "config"; reg-names = "dbi", "apb", "config";
interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>, interrupts = <GIC_SPI 75 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 74 IRQ_TYPE_LEVEL_HIGH>,
@@ -736,8 +736,9 @@ @@ -738,8 +738,9 @@
phys = <&combphy2 PHY_TYPE_PCIE>; phys = <&combphy2 PHY_TYPE_PCIE>;
phy-names = "pcie-phy"; phy-names = "pcie-phy";
power-domains = <&power RK3568_PD_PIPE>; power-domains = <&power RK3568_PD_PIPE>;

View File

@ -83,7 +83,7 @@
}; };
usb_host0_ehci: usb@fd800000 { usb_host0_ehci: usb@fd800000 {
@@ -731,7 +738,7 @@ @@ -733,7 +740,7 @@
num-ib-windows = <6>; num-ib-windows = <6>;
num-ob-windows = <2>; num-ob-windows = <2>;
max-link-speed = <2>; max-link-speed = <2>;