hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
u-boot/drivers/video/drm/rockchip_panel.c
....@@ -12,6 +12,7 @@
1212 #include <malloc.h>
1313 #include <video.h>
1414 #include <backlight.h>
15
+#include <spi.h>
1516 #include <asm/gpio.h>
1617 #include <dm/device.h>
1718 #include <dm/read.h>
....@@ -65,10 +66,13 @@
6566 bool enabled;
6667 struct udevice *power_supply;
6768 struct udevice *backlight;
69
+ struct spi_slave *spi_slave;
6870 struct gpio_desc enable_gpio;
6971 struct gpio_desc reset_gpio;
7072 struct gpio_desc edp_bl_on;
7173 struct gpio_desc edp_bl_en;
74
+ struct gpio_desc vcc_5v;
75
+ struct gpio_desc vddio_mipi;
7276
7377 struct gpio_desc lvds_gpio0;
7478 struct gpio_desc lvds_gpio1;
....@@ -195,24 +199,48 @@
195199 {
196200 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev);
197201 int i;
202
+ int ret;
198203
199204 if (!cmds)
200205 return -EINVAL;
201206
207
+ if (priv->spi_slave) {
208
+ ret = spi_claim_bus(priv->spi_slave);
209
+ if (ret) {
210
+ printf("%s: Failed to claim spi bus: %d\n", __func__, ret);
211
+ return -EINVAL;
212
+ }
213
+ }
214
+
202215 for (i = 0; i < cmds->cmd_cnt; i++) {
203216 struct rockchip_cmd_desc *desc = &cmds->cmds[i];
204217 int value = 0;
218
+ u16 mask = 0;
219
+ u16 data = 0;
205220
206
- if (desc->header.payload_length == 2)
207
- value = (desc->payload[0] << 8) | desc->payload[1];
208
- else
209
- value = desc->payload[0];
210
- rockchip_panel_write_spi_cmds(priv,
211
- desc->header.data_type, value);
221
+ if (priv->spi_slave) {
222
+ mask = desc->header.data_type ? 0x100 : 0;
223
+ data = (mask | desc->payload[0]) << 7;;
224
+ data = ((data & 0xff) << 8) | (data >> 8);
225
+ value = mask | desc->payload[0];
226
+ ret = spi_xfer(priv->spi_slave, 9, &data, NULL, SPI_XFER_ONCE);
227
+ if (ret)
228
+ printf("%s: Failed to xfer spi cmd 0x%x: %d\n",
229
+ __func__, desc->payload[0], ret);
230
+ } else {
231
+ if (desc->header.payload_length == 2)
232
+ value = (desc->payload[0] << 8) | desc->payload[1];
233
+ else
234
+ value = desc->payload[0];
235
+ rockchip_panel_write_spi_cmds(priv, desc->header.data_type, value);
236
+ }
212237
213238 if (desc->header.delay_ms)
214239 mdelay(desc->header.delay_ms);
215240 }
241
+
242
+ if (priv->spi_slave)
243
+ spi_release_bus(priv->spi_slave);
216244
217245 return 0;
218246 }
....@@ -283,6 +311,19 @@
283311
284312 if (priv->prepared)
285313 return;
314
+ /*mipi */
315
+ if (dm_gpio_is_valid(&priv->vddio_mipi))
316
+ dm_gpio_set_value(&priv->vddio_mipi, 1);
317
+ mdelay(20);
318
+
319
+ if (dm_gpio_is_valid(&priv->vcc_5v))
320
+ dm_gpio_set_value(&priv->vcc_5v, 1);
321
+
322
+ ret = dm_gpio_get_value(&priv->vcc_5v);
323
+ printf("troy test get vcc_5v : %d \n",ret);
324
+ ret = dm_gpio_get_value(&priv->vddio_mipi);
325
+ printf("troy test get vddio-mipi : %d \n",ret);
326
+ /*mipi end*/
286327
287328 /*7511 LVDS IO Control start*/
288329 printk("nodka_lvds_index = %d\n",plat->lvds_index);
....@@ -321,21 +362,24 @@
321362
322363 if (dm_gpio_is_valid(&priv->edp_bl_en))
323364 dm_gpio_set_value(&priv->edp_bl_en, 1);
324
-
365
+
325366 if (dm_gpio_is_valid(&priv->enable_gpio))
326367 dm_gpio_set_value(&priv->enable_gpio, 1);
327
-
368
+
328369 if (plat->delay.prepare)
329370 mdelay(plat->delay.prepare);
330
-
371
+
331372 if (dm_gpio_is_valid(&priv->reset_gpio))
332373 dm_gpio_set_value(&priv->reset_gpio, 1);
374
+
375
+ if (plat->delay.reset)
376
+ mdelay(plat->delay.reset);
333377 mdelay(50);
334378 if (dm_gpio_is_valid(&priv->reset_gpio))
335379 dm_gpio_set_value(&priv->reset_gpio, 0);
336
-
337
- mdelay(200);
338380
381
+ mdelay(200);
382
+
339383 if (plat->delay.init)
340384 mdelay(plat->delay.init);
341385
....@@ -500,6 +544,20 @@
500544 int ret;
501545 const char *cmd_type;
502546
547
+ ret = gpio_request_by_name(dev, "vcc-5v-gpio", 0,
548
+ &priv->vcc_5v, GPIOD_IS_OUT);
549
+ if (ret && ret != -ENOENT) {
550
+ printf("%s: Cannot get vcc-5v-gpio: %d\n", __func__, ret);
551
+ return ret;
552
+ }
553
+
554
+ ret = gpio_request_by_name(dev, "vddio-mipi", 0,
555
+ &priv->vddio_mipi, GPIOD_IS_OUT);
556
+ if (ret && ret != -ENOENT) {
557
+ printf("%s: Cannot get vddio-mipi: %d\n", __func__, ret);
558
+ return ret;
559
+ }
560
+
503561 ret = gpio_request_by_name(dev, "edp-bl-gpios", 0,
504562 &priv->edp_bl_on, GPIOD_IS_OUT);
505563 if (ret && ret != -ENOENT) {
....@@ -527,7 +585,7 @@
527585 printf("%s: Cannot get reset GPIO: %d\n", __func__, ret);
528586 return ret;
529587 }
530
-
588
+
531589 ret = gpio_request_by_name(dev, "lvds-gpio0", 0,
532590 &priv->lvds_gpio0, GPIOD_IS_OUT);
533591 if (ret && ret != -ENOENT) {
....@@ -555,7 +613,7 @@
555613 printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret);
556614 return ret;
557615 }
558
-
616
+
559617 ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
560618 "backlight", &priv->backlight);
561619 if (ret && ret != -ENOENT) {
....@@ -577,31 +635,47 @@
577635 priv->cmd_type = get_panel_cmd_type(cmd_type);
578636
579637 if (priv->cmd_type == CMD_TYPE_SPI) {
580
- ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
581
- &priv->spi_sdi_gpio, GPIOD_IS_OUT);
582
- if (ret && ret != -ENOENT) {
583
- printf("%s: Cannot get spi sdi GPIO: %d\n",
584
- __func__, ret);
585
- return ret;
638
+ ofnode parent = ofnode_get_parent(dev->node);
639
+
640
+ if (ofnode_valid(parent)) {
641
+ struct dm_spi_slave_platdata *plat = dev_get_parent_platdata(dev);
642
+ struct udevice *spi = dev_get_parent(dev);
643
+
644
+ if (spi->seq < 0) {
645
+ printf("%s: Failed to get spi bus num\n", __func__);
646
+ return -EINVAL;
647
+ }
648
+
649
+ priv->spi_slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz,
650
+ plat->mode);
651
+ if (!priv->spi_slave) {
652
+ printf("%s: Failed to setup spi slave: %d\n", __func__, ret);
653
+ return -EINVAL;
654
+ }
655
+ } else {
656
+ ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
657
+ &priv->spi_sdi_gpio, GPIOD_IS_OUT);
658
+ if (ret && ret != -ENOENT) {
659
+ printf("%s: Cannot get spi sdi GPIO: %d\n", __func__, ret);
660
+ return ret;
661
+ }
662
+ ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
663
+ &priv->spi_scl_gpio, GPIOD_IS_OUT);
664
+ if (ret && ret != -ENOENT) {
665
+ printf("%s: Cannot get spi scl GPIO: %d\n", __func__, ret);
666
+ return ret;
667
+ }
668
+ ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
669
+ &priv->spi_cs_gpio, GPIOD_IS_OUT);
670
+ if (ret && ret != -ENOENT) {
671
+ printf("%s: Cannot get spi cs GPIO: %d\n", __func__, ret);
672
+ return ret;
673
+ }
674
+ dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
675
+ dm_gpio_set_value(&priv->spi_scl_gpio, 1);
676
+ dm_gpio_set_value(&priv->spi_cs_gpio, 1);
677
+ dm_gpio_set_value(&priv->reset_gpio, 0);
586678 }
587
- ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
588
- &priv->spi_scl_gpio, GPIOD_IS_OUT);
589
- if (ret && ret != -ENOENT) {
590
- printf("%s: Cannot get spi scl GPIO: %d\n",
591
- __func__, ret);
592
- return ret;
593
- }
594
- ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
595
- &priv->spi_cs_gpio, GPIOD_IS_OUT);
596
- if (ret && ret != -ENOENT) {
597
- printf("%s: Cannot get spi cs GPIO: %d\n",
598
- __func__, ret);
599
- return ret;
600
- }
601
- dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
602
- dm_gpio_set_value(&priv->spi_scl_gpio, 1);
603
- dm_gpio_set_value(&priv->spi_cs_gpio, 1);
604
- dm_gpio_set_value(&priv->reset_gpio, 0);
605679 }
606680
607681 panel = calloc(1, sizeof(*panel));
....@@ -620,6 +694,7 @@
620694 static const struct udevice_id rockchip_panel_ids[] = {
621695 { .compatible = "simple-panel", },
622696 { .compatible = "simple-panel-dsi", },
697
+ { .compatible = "simple-panel-spi", },
623698 {}
624699 };
625700