hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/gpu/drm/bridge/sil-sii8620.c
....@@ -1,17 +1,15 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * Silicon Image SiI8620 HDMI/MHL bridge driver
34 *
45 * Copyright (C) 2015, Samsung Electronics Co., Ltd.
56 * Andrzej Hajda <a.hajda@samsung.com>
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
107 */
118
129 #include <asm/unaligned.h>
1310
1411 #include <drm/bridge/mhl.h>
12
+#include <drm/drm_bridge.h>
1513 #include <drm/drm_crtc.h>
1614 #include <drm/drm_edid.h>
1715 #include <drm/drm_encoder.h>
....@@ -607,7 +605,7 @@
607605 u8 *buf = &ctx->burst.tx_buf[ctx->burst.tx_count];
608606 int size = len + 2;
609607
610
- if (ctx->burst.tx_count + size > ARRAY_SIZE(ctx->burst.tx_buf)) {
608
+ if (ctx->burst.tx_count + size >= ARRAY_SIZE(ctx->burst.tx_buf)) {
611609 dev_err(ctx->dev, "TX-BLK buffer exhausted\n");
612610 ctx->error = -EINVAL;
613611 return NULL;
....@@ -624,7 +622,7 @@
624622 u8 *buf = &ctx->burst.rx_buf[ctx->burst.rx_count];
625623 int size = len + 1;
626624
627
- if (ctx->burst.tx_count + size > ARRAY_SIZE(ctx->burst.tx_buf)) {
625
+ if (ctx->burst.rx_count + size >= ARRAY_SIZE(ctx->burst.rx_buf)) {
628626 dev_err(ctx->dev, "RX-BLK buffer exhausted\n");
629627 ctx->error = -EINVAL;
630628 return NULL;
....@@ -988,7 +986,7 @@
988986
989987 static void sii8620_stop_video(struct sii8620 *ctx)
990988 {
991
- u8 uninitialized_var(val);
989
+ u8 val;
992990
993991 sii8620_write_seq_static(ctx,
994992 REG_TPI_INTR_EN, 0,
....@@ -1104,8 +1102,7 @@
11041102 int ret;
11051103
11061104 ret = drm_hdmi_avi_infoframe_from_display_mode(&frm.avi,
1107
- mode,
1108
- true);
1105
+ NULL, mode);
11091106 if (ctx->use_packed_pixel)
11101107 frm.avi.colorspace = HDMI_COLORSPACE_YUV422;
11111108
....@@ -1763,10 +1760,8 @@
17631760
17641761 scancode &= MHL_RCP_KEY_ID_MASK;
17651762
1766
- if (!ctx->rc_dev) {
1767
- dev_dbg(ctx->dev, "RCP input device not initialized\n");
1763
+ if (!IS_ENABLED(CONFIG_RC_CORE) || !ctx->rc_dev)
17681764 return false;
1769
- }
17701765
17711766 if (pressed)
17721767 rc_keydown(ctx->rc_dev, RC_PROTO_CEC, scancode, 0);
....@@ -2103,6 +2098,9 @@
21032098 struct rc_dev *rc_dev;
21042099 int ret;
21052100
2101
+ if (!IS_ENABLED(CONFIG_RC_CORE))
2102
+ return;
2103
+
21062104 rc_dev = rc_allocate_device(RC_DRIVER_SCANCODE);
21072105 if (!rc_dev) {
21082106 dev_err(ctx->dev, "Failed to allocate RC device\n");
....@@ -2122,7 +2120,7 @@
21222120 if (ret) {
21232121 dev_err(ctx->dev, "Failed to register RC device\n");
21242122 ctx->error = ret;
2125
- rc_free_device(ctx->rc_dev);
2123
+ rc_free_device(rc_dev);
21262124 return;
21272125 }
21282126 ctx->rc_dev = rc_dev;
....@@ -2204,7 +2202,8 @@
22042202 return container_of(bridge, struct sii8620, bridge);
22052203 }
22062204
2207
-static int sii8620_attach(struct drm_bridge *bridge)
2205
+static int sii8620_attach(struct drm_bridge *bridge,
2206
+ enum drm_bridge_attach_flags flags)
22082207 {
22092208 struct sii8620 *ctx = bridge_to_sii8620(bridge);
22102209
....@@ -2216,6 +2215,9 @@
22162215 static void sii8620_detach(struct drm_bridge *bridge)
22172216 {
22182217 struct sii8620 *ctx = bridge_to_sii8620(bridge);
2218
+
2219
+ if (!IS_ENABLED(CONFIG_RC_CORE))
2220
+ return;
22192221
22202222 rc_unregister_device(ctx->rc_dev);
22212223 }
....@@ -2242,6 +2244,7 @@
22422244 }
22432245
22442246 static enum drm_mode_status sii8620_mode_valid(struct drm_bridge *bridge,
2247
+ const struct drm_display_info *info,
22452248 const struct drm_display_mode *mode)
22462249 {
22472250 struct sii8620 *ctx = bridge_to_sii8620(bridge);
....@@ -2297,10 +2300,9 @@
22972300 INIT_LIST_HEAD(&ctx->mt_queue);
22982301
22992302 ctx->clk_xtal = devm_clk_get(dev, "xtal");
2300
- if (IS_ERR(ctx->clk_xtal)) {
2301
- dev_err(dev, "failed to get xtal clock from DT\n");
2302
- return PTR_ERR(ctx->clk_xtal);
2303
- }
2303
+ if (IS_ERR(ctx->clk_xtal))
2304
+ return dev_err_probe(dev, PTR_ERR(ctx->clk_xtal),
2305
+ "failed to get xtal clock from DT\n");
23042306
23052307 if (!client->irq) {
23062308 dev_err(dev, "no irq provided\n");
....@@ -2311,16 +2313,14 @@
23112313 sii8620_irq_thread,
23122314 IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
23132315 "sii8620", ctx);
2314
- if (ret < 0) {
2315
- dev_err(dev, "failed to install IRQ handler\n");
2316
- return ret;
2317
- }
2316
+ if (ret < 0)
2317
+ return dev_err_probe(dev, ret,
2318
+ "failed to install IRQ handler\n");
23182319
23192320 ctx->gpio_reset = devm_gpiod_get(dev, "reset", GPIOD_OUT_HIGH);
2320
- if (IS_ERR(ctx->gpio_reset)) {
2321
- dev_err(dev, "failed to get reset gpio from DT\n");
2322
- return PTR_ERR(ctx->gpio_reset);
2323
- }
2321
+ if (IS_ERR(ctx->gpio_reset))
2322
+ return dev_err_probe(dev, PTR_ERR(ctx->gpio_reset),
2323
+ "failed to get reset gpio from DT\n");
23242324
23252325 ctx->supplies[0].supply = "cvcc10";
23262326 ctx->supplies[1].supply = "iovcc18";