hc
2023-11-06 9df731a176aab8e03b984b681b1bea01ccff6644
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,6 +66,7 @@
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;
....@@ -197,24 +199,48 @@
197199 {
198200 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev);
199201 int i;
202
+ int ret;
200203
201204 if (!cmds)
202205 return -EINVAL;
203206
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
+
204215 for (i = 0; i < cmds->cmd_cnt; i++) {
205216 struct rockchip_cmd_desc *desc = &cmds->cmds[i];
206217 int value = 0;
218
+ u16 mask = 0;
219
+ u16 data = 0;
207220
208
- if (desc->header.payload_length == 2)
209
- value = (desc->payload[0] << 8) | desc->payload[1];
210
- else
211
- value = desc->payload[0];
212
- rockchip_panel_write_spi_cmds(priv,
213
- 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
+ }
214237
215238 if (desc->header.delay_ms)
216239 mdelay(desc->header.delay_ms);
217240 }
241
+
242
+ if (priv->spi_slave)
243
+ spi_release_bus(priv->spi_slave);
218244
219245 return 0;
220246 }
....@@ -336,21 +362,24 @@
336362
337363 if (dm_gpio_is_valid(&priv->edp_bl_en))
338364 dm_gpio_set_value(&priv->edp_bl_en, 1);
339
-
365
+
340366 if (dm_gpio_is_valid(&priv->enable_gpio))
341367 dm_gpio_set_value(&priv->enable_gpio, 1);
342
-
368
+
343369 if (plat->delay.prepare)
344370 mdelay(plat->delay.prepare);
345
-
371
+
346372 if (dm_gpio_is_valid(&priv->reset_gpio))
347373 dm_gpio_set_value(&priv->reset_gpio, 1);
374
+
375
+ if (plat->delay.reset)
376
+ mdelay(plat->delay.reset);
348377 mdelay(50);
349378 if (dm_gpio_is_valid(&priv->reset_gpio))
350379 dm_gpio_set_value(&priv->reset_gpio, 0);
351
-
352
- mdelay(200);
353380
381
+ mdelay(200);
382
+
354383 if (plat->delay.init)
355384 mdelay(plat->delay.init);
356385
....@@ -556,7 +585,7 @@
556585 printf("%s: Cannot get reset GPIO: %d\n", __func__, ret);
557586 return ret;
558587 }
559
-
588
+
560589 ret = gpio_request_by_name(dev, "lvds-gpio0", 0,
561590 &priv->lvds_gpio0, GPIOD_IS_OUT);
562591 if (ret && ret != -ENOENT) {
....@@ -584,7 +613,7 @@
584613 printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret);
585614 return ret;
586615 }
587
-
616
+
588617 ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev,
589618 "backlight", &priv->backlight);
590619 if (ret && ret != -ENOENT) {
....@@ -606,31 +635,47 @@
606635 priv->cmd_type = get_panel_cmd_type(cmd_type);
607636
608637 if (priv->cmd_type == CMD_TYPE_SPI) {
609
- ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0,
610
- &priv->spi_sdi_gpio, GPIOD_IS_OUT);
611
- if (ret && ret != -ENOENT) {
612
- printf("%s: Cannot get spi sdi GPIO: %d\n",
613
- __func__, ret);
614
- 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);
615678 }
616
- ret = gpio_request_by_name(dev, "spi-scl-gpios", 0,
617
- &priv->spi_scl_gpio, GPIOD_IS_OUT);
618
- if (ret && ret != -ENOENT) {
619
- printf("%s: Cannot get spi scl GPIO: %d\n",
620
- __func__, ret);
621
- return ret;
622
- }
623
- ret = gpio_request_by_name(dev, "spi-cs-gpios", 0,
624
- &priv->spi_cs_gpio, GPIOD_IS_OUT);
625
- if (ret && ret != -ENOENT) {
626
- printf("%s: Cannot get spi cs GPIO: %d\n",
627
- __func__, ret);
628
- return ret;
629
- }
630
- dm_gpio_set_value(&priv->spi_sdi_gpio, 1);
631
- dm_gpio_set_value(&priv->spi_scl_gpio, 1);
632
- dm_gpio_set_value(&priv->spi_cs_gpio, 1);
633
- dm_gpio_set_value(&priv->reset_gpio, 0);
634679 }
635680
636681 panel = calloc(1, sizeof(*panel));
....@@ -649,6 +694,7 @@
649694 static const struct udevice_id rockchip_panel_ids[] = {
650695 { .compatible = "simple-panel", },
651696 { .compatible = "simple-panel-dsi", },
697
+ { .compatible = "simple-panel-spi", },
652698 {}
653699 };
654700