.. | .. |
---|
12 | 12 | #include <malloc.h> |
---|
13 | 13 | #include <video.h> |
---|
14 | 14 | #include <backlight.h> |
---|
| 15 | +#include <spi.h> |
---|
15 | 16 | #include <asm/gpio.h> |
---|
16 | 17 | #include <dm/device.h> |
---|
17 | 18 | #include <dm/read.h> |
---|
.. | .. |
---|
65 | 66 | bool enabled; |
---|
66 | 67 | struct udevice *power_supply; |
---|
67 | 68 | struct udevice *backlight; |
---|
| 69 | + struct spi_slave *spi_slave; |
---|
68 | 70 | struct gpio_desc enable_gpio; |
---|
69 | 71 | struct gpio_desc reset_gpio; |
---|
70 | 72 | struct gpio_desc edp_bl_on; |
---|
71 | 73 | struct gpio_desc edp_bl_en; |
---|
| 74 | + struct gpio_desc vcc_5v; |
---|
| 75 | + struct gpio_desc vddio_mipi; |
---|
72 | 76 | |
---|
73 | 77 | struct gpio_desc lvds_gpio0; |
---|
74 | 78 | struct gpio_desc lvds_gpio1; |
---|
.. | .. |
---|
195 | 199 | { |
---|
196 | 200 | struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); |
---|
197 | 201 | int i; |
---|
| 202 | + int ret; |
---|
198 | 203 | |
---|
199 | 204 | if (!cmds) |
---|
200 | 205 | return -EINVAL; |
---|
201 | 206 | |
---|
| 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 | + |
---|
202 | 215 | for (i = 0; i < cmds->cmd_cnt; i++) { |
---|
203 | 216 | struct rockchip_cmd_desc *desc = &cmds->cmds[i]; |
---|
204 | 217 | int value = 0; |
---|
| 218 | + u16 mask = 0; |
---|
| 219 | + u16 data = 0; |
---|
205 | 220 | |
---|
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 | + } |
---|
212 | 237 | |
---|
213 | 238 | if (desc->header.delay_ms) |
---|
214 | 239 | mdelay(desc->header.delay_ms); |
---|
215 | 240 | } |
---|
| 241 | + |
---|
| 242 | + if (priv->spi_slave) |
---|
| 243 | + spi_release_bus(priv->spi_slave); |
---|
216 | 244 | |
---|
217 | 245 | return 0; |
---|
218 | 246 | } |
---|
.. | .. |
---|
283 | 311 | |
---|
284 | 312 | if (priv->prepared) |
---|
285 | 313 | 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*/ |
---|
286 | 327 | |
---|
287 | 328 | /*7511 LVDS IO Control start*/ |
---|
288 | 329 | printk("nodka_lvds_index = %d\n",plat->lvds_index); |
---|
.. | .. |
---|
321 | 362 | |
---|
322 | 363 | if (dm_gpio_is_valid(&priv->edp_bl_en)) |
---|
323 | 364 | dm_gpio_set_value(&priv->edp_bl_en, 1); |
---|
324 | | - |
---|
| 365 | + |
---|
325 | 366 | if (dm_gpio_is_valid(&priv->enable_gpio)) |
---|
326 | 367 | dm_gpio_set_value(&priv->enable_gpio, 1); |
---|
327 | | - |
---|
| 368 | + |
---|
328 | 369 | if (plat->delay.prepare) |
---|
329 | 370 | mdelay(plat->delay.prepare); |
---|
330 | | - |
---|
| 371 | + |
---|
331 | 372 | if (dm_gpio_is_valid(&priv->reset_gpio)) |
---|
332 | 373 | dm_gpio_set_value(&priv->reset_gpio, 1); |
---|
| 374 | + |
---|
| 375 | + if (plat->delay.reset) |
---|
| 376 | + mdelay(plat->delay.reset); |
---|
333 | 377 | mdelay(50); |
---|
334 | 378 | if (dm_gpio_is_valid(&priv->reset_gpio)) |
---|
335 | 379 | dm_gpio_set_value(&priv->reset_gpio, 0); |
---|
336 | | - |
---|
337 | | - mdelay(200); |
---|
338 | 380 | |
---|
| 381 | + mdelay(200); |
---|
| 382 | + |
---|
339 | 383 | if (plat->delay.init) |
---|
340 | 384 | mdelay(plat->delay.init); |
---|
341 | 385 | |
---|
.. | .. |
---|
500 | 544 | int ret; |
---|
501 | 545 | const char *cmd_type; |
---|
502 | 546 | |
---|
| 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 | + |
---|
503 | 561 | ret = gpio_request_by_name(dev, "edp-bl-gpios", 0, |
---|
504 | 562 | &priv->edp_bl_on, GPIOD_IS_OUT); |
---|
505 | 563 | if (ret && ret != -ENOENT) { |
---|
.. | .. |
---|
527 | 585 | printf("%s: Cannot get reset GPIO: %d\n", __func__, ret); |
---|
528 | 586 | return ret; |
---|
529 | 587 | } |
---|
530 | | - |
---|
| 588 | + |
---|
531 | 589 | ret = gpio_request_by_name(dev, "lvds-gpio0", 0, |
---|
532 | 590 | &priv->lvds_gpio0, GPIOD_IS_OUT); |
---|
533 | 591 | if (ret && ret != -ENOENT) { |
---|
.. | .. |
---|
555 | 613 | printf("%s: Cannot get lvds-gpio3: %d\n", __func__, ret); |
---|
556 | 614 | return ret; |
---|
557 | 615 | } |
---|
558 | | - |
---|
| 616 | + |
---|
559 | 617 | ret = uclass_get_device_by_phandle(UCLASS_PANEL_BACKLIGHT, dev, |
---|
560 | 618 | "backlight", &priv->backlight); |
---|
561 | 619 | if (ret && ret != -ENOENT) { |
---|
.. | .. |
---|
577 | 635 | priv->cmd_type = get_panel_cmd_type(cmd_type); |
---|
578 | 636 | |
---|
579 | 637 | 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); |
---|
586 | 678 | } |
---|
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); |
---|
605 | 679 | } |
---|
606 | 680 | |
---|
607 | 681 | panel = calloc(1, sizeof(*panel)); |
---|
.. | .. |
---|
620 | 694 | static const struct udevice_id rockchip_panel_ids[] = { |
---|
621 | 695 | { .compatible = "simple-panel", }, |
---|
622 | 696 | { .compatible = "simple-panel-dsi", }, |
---|
| 697 | + { .compatible = "simple-panel-spi", }, |
---|
623 | 698 | {} |
---|
624 | 699 | }; |
---|
625 | 700 | |
---|