Lines Matching +full:init +full:- +full:delay
2 * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd
4 * SPDX-License-Identifier: GPL-2.0+
20 #include <dm/uclass-id.h>
21 #include <linux/media-bus-format.h>
56 unsigned int init; member
57 } delay; member
81 return -EINVAL; in get_panel_cmd_type()
105 buf += sizeof(*header) + header->payload_length; in rockchip_panel_parse_cmds()
106 len -= sizeof(*header) + header->payload_length; in rockchip_panel_parse_cmds()
110 pcmds->cmds = calloc(cnt, sizeof(struct rockchip_cmd_desc)); in rockchip_panel_parse_cmds()
111 if (!pcmds->cmds) in rockchip_panel_parse_cmds()
112 return -ENOMEM; in rockchip_panel_parse_cmds()
114 pcmds->cmd_cnt = cnt; in rockchip_panel_parse_cmds()
119 struct rockchip_cmd_desc *desc = &pcmds->cmds[i]; in rockchip_panel_parse_cmds()
122 length -= sizeof(*header); in rockchip_panel_parse_cmds()
124 desc->header.data_type = header->data_type; in rockchip_panel_parse_cmds()
125 desc->header.delay_ms = header->delay_ms; in rockchip_panel_parse_cmds()
126 desc->header.payload_length = header->payload_length; in rockchip_panel_parse_cmds()
127 desc->payload = buf; in rockchip_panel_parse_cmds()
128 buf += header->payload_length; in rockchip_panel_parse_cmds()
129 length -= header->payload_length; in rockchip_panel_parse_cmds()
140 dm_gpio_set_value(&priv->spi_cs_gpio, 0); in rockchip_panel_write_spi_cmds()
149 dm_gpio_set_value(&priv->spi_sdi_gpio, 1); in rockchip_panel_write_spi_cmds()
151 dm_gpio_set_value(&priv->spi_sdi_gpio, 0); in rockchip_panel_write_spi_cmds()
153 dm_gpio_set_value(&priv->spi_scl_gpio, 0); in rockchip_panel_write_spi_cmds()
155 dm_gpio_set_value(&priv->spi_scl_gpio, 1); in rockchip_panel_write_spi_cmds()
160 dm_gpio_set_value(&priv->spi_cs_gpio, 1); in rockchip_panel_write_spi_cmds()
169 return -EINVAL; in rockchip_panel_send_mcu_cmds()
172 for (i = 0; i < cmds->cmd_cnt; i++) { in rockchip_panel_send_mcu_cmds()
173 struct rockchip_cmd_desc *desc = &cmds->cmds[i]; in rockchip_panel_send_mcu_cmds()
176 value = desc->payload[0]; in rockchip_panel_send_mcu_cmds()
177 display_send_mcu_cmd(state, desc->header.data_type, value); in rockchip_panel_send_mcu_cmds()
179 if (desc->header.delay_ms) in rockchip_panel_send_mcu_cmds()
180 mdelay(desc->header.delay_ms); in rockchip_panel_send_mcu_cmds()
190 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); in rockchip_panel_send_spi_cmds()
195 return -EINVAL; in rockchip_panel_send_spi_cmds()
197 if (priv->spi_slave) { in rockchip_panel_send_spi_cmds()
198 ret = spi_claim_bus(priv->spi_slave); in rockchip_panel_send_spi_cmds()
201 return -EINVAL; in rockchip_panel_send_spi_cmds()
205 for (i = 0; i < cmds->cmd_cnt; i++) { in rockchip_panel_send_spi_cmds()
206 struct rockchip_cmd_desc *desc = &cmds->cmds[i]; in rockchip_panel_send_spi_cmds()
211 if (priv->spi_slave) { in rockchip_panel_send_spi_cmds()
212 mask = desc->header.data_type ? 0x100 : 0; in rockchip_panel_send_spi_cmds()
213 data = (mask | desc->payload[0]) << 7;; in rockchip_panel_send_spi_cmds()
215 value = mask | desc->payload[0]; in rockchip_panel_send_spi_cmds()
216 ret = spi_xfer(priv->spi_slave, 9, &data, NULL, SPI_XFER_ONCE); in rockchip_panel_send_spi_cmds()
219 __func__, desc->payload[0], ret); in rockchip_panel_send_spi_cmds()
221 if (desc->header.payload_length == 2) in rockchip_panel_send_spi_cmds()
222 value = (desc->payload[0] << 8) | desc->payload[1]; in rockchip_panel_send_spi_cmds()
224 value = desc->payload[0]; in rockchip_panel_send_spi_cmds()
225 rockchip_panel_write_spi_cmds(priv, desc->header.data_type, value); in rockchip_panel_send_spi_cmds()
228 if (desc->header.delay_ms) in rockchip_panel_send_spi_cmds()
229 mdelay(desc->header.delay_ms); in rockchip_panel_send_spi_cmds()
232 if (priv->spi_slave) in rockchip_panel_send_spi_cmds()
233 spi_release_bus(priv->spi_slave); in rockchip_panel_send_spi_cmds()
245 return -EINVAL; in rockchip_panel_send_dsi_cmds()
247 for (i = 0; i < cmds->cmd_cnt; i++) { in rockchip_panel_send_dsi_cmds()
248 struct rockchip_cmd_desc *desc = &cmds->cmds[i]; in rockchip_panel_send_dsi_cmds()
249 const struct rockchip_cmd_header *header = &desc->header; in rockchip_panel_send_dsi_cmds()
251 switch (header->data_type) { in rockchip_panel_send_dsi_cmds()
253 ret = mipi_dsi_compression_mode(dsi, desc->payload[0]); in rockchip_panel_send_dsi_cmds()
259 ret = mipi_dsi_generic_write(dsi, desc->payload, in rockchip_panel_send_dsi_cmds()
260 header->payload_length); in rockchip_panel_send_dsi_cmds()
265 ret = mipi_dsi_dcs_write_buffer(dsi, desc->payload, in rockchip_panel_send_dsi_cmds()
266 header->payload_length); in rockchip_panel_send_dsi_cmds()
271 return -ENOMEM; in rockchip_panel_send_dsi_cmds()
273 memcpy(pps, desc->payload, header->payload_length); in rockchip_panel_send_dsi_cmds()
279 header->data_type); in rockchip_panel_send_dsi_cmds()
280 return -EINVAL; in rockchip_panel_send_dsi_cmds()
288 if (header->delay_ms) in rockchip_panel_send_dsi_cmds()
289 mdelay(header->delay_ms); in rockchip_panel_send_dsi_cmds()
297 struct rockchip_panel_plat *plat = dev_get_platdata(panel->dev); in panel_simple_prepare()
298 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); in panel_simple_prepare()
299 struct mipi_dsi_device *dsi = dev_get_parent_platdata(panel->dev); in panel_simple_prepare()
302 if (priv->prepared) in panel_simple_prepare()
305 if (priv->power_supply) in panel_simple_prepare()
306 regulator_set_enable(priv->power_supply, !plat->power_invert); in panel_simple_prepare()
308 if (dm_gpio_is_valid(&priv->enable_gpio)) in panel_simple_prepare()
309 dm_gpio_set_value(&priv->enable_gpio, 1); in panel_simple_prepare()
311 if (plat->delay.prepare) in panel_simple_prepare()
312 mdelay(plat->delay.prepare); in panel_simple_prepare()
314 if (dm_gpio_is_valid(&priv->reset_gpio)) in panel_simple_prepare()
315 dm_gpio_set_value(&priv->reset_gpio, 1); in panel_simple_prepare()
317 if (plat->delay.reset) in panel_simple_prepare()
318 mdelay(plat->delay.reset); in panel_simple_prepare()
320 if (dm_gpio_is_valid(&priv->reset_gpio)) in panel_simple_prepare()
321 dm_gpio_set_value(&priv->reset_gpio, 0); in panel_simple_prepare()
323 if (plat->delay.init) in panel_simple_prepare()
324 mdelay(plat->delay.init); in panel_simple_prepare()
326 if (plat->on_cmds) { in panel_simple_prepare()
327 if (priv->cmd_type == CMD_TYPE_SPI) in panel_simple_prepare()
328 ret = rockchip_panel_send_spi_cmds(panel, panel->state, in panel_simple_prepare()
329 plat->on_cmds); in panel_simple_prepare()
330 else if (priv->cmd_type == CMD_TYPE_MCU) in panel_simple_prepare()
331 ret = rockchip_panel_send_mcu_cmds(panel, panel->state, in panel_simple_prepare()
332 plat->on_cmds); in panel_simple_prepare()
334 ret = rockchip_panel_send_dsi_cmds(dsi, plat->on_cmds); in panel_simple_prepare()
339 priv->prepared = true; in panel_simple_prepare()
344 struct rockchip_panel_plat *plat = dev_get_platdata(panel->dev); in panel_simple_unprepare()
345 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); in panel_simple_unprepare()
346 struct mipi_dsi_device *dsi = dev_get_parent_platdata(panel->dev); in panel_simple_unprepare()
349 if (!priv->prepared) in panel_simple_unprepare()
352 if (plat->off_cmds) { in panel_simple_unprepare()
353 if (priv->cmd_type == CMD_TYPE_SPI) in panel_simple_unprepare()
354 ret = rockchip_panel_send_spi_cmds(panel, panel->state, in panel_simple_unprepare()
355 plat->off_cmds); in panel_simple_unprepare()
356 else if (priv->cmd_type == CMD_TYPE_MCU) in panel_simple_unprepare()
357 ret = rockchip_panel_send_mcu_cmds(panel, panel->state, in panel_simple_unprepare()
358 plat->off_cmds); in panel_simple_unprepare()
360 ret = rockchip_panel_send_dsi_cmds(dsi, plat->off_cmds); in panel_simple_unprepare()
365 if (dm_gpio_is_valid(&priv->reset_gpio)) in panel_simple_unprepare()
366 dm_gpio_set_value(&priv->reset_gpio, 1); in panel_simple_unprepare()
368 if (dm_gpio_is_valid(&priv->enable_gpio)) in panel_simple_unprepare()
369 dm_gpio_set_value(&priv->enable_gpio, 0); in panel_simple_unprepare()
371 if (priv->power_supply) in panel_simple_unprepare()
372 regulator_set_enable(priv->power_supply, plat->power_invert); in panel_simple_unprepare()
374 if (plat->delay.unprepare) in panel_simple_unprepare()
375 mdelay(plat->delay.unprepare); in panel_simple_unprepare()
377 priv->prepared = false; in panel_simple_unprepare()
382 struct rockchip_panel_plat *plat = dev_get_platdata(panel->dev); in panel_simple_enable()
383 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); in panel_simple_enable()
385 if (priv->enabled) in panel_simple_enable()
388 if (plat->delay.enable) in panel_simple_enable()
389 mdelay(plat->delay.enable); in panel_simple_enable()
391 if (priv->backlight) in panel_simple_enable()
392 backlight_enable(priv->backlight); in panel_simple_enable()
394 priv->enabled = true; in panel_simple_enable()
399 struct rockchip_panel_plat *plat = dev_get_platdata(panel->dev); in panel_simple_disable()
400 struct rockchip_panel_priv *priv = dev_get_priv(panel->dev); in panel_simple_disable()
402 if (!priv->enabled) in panel_simple_disable()
405 if (priv->backlight) in panel_simple_disable()
406 backlight_disable(priv->backlight); in panel_simple_disable()
408 if (plat->delay.disable) in panel_simple_disable()
409 mdelay(plat->delay.disable); in panel_simple_disable()
411 priv->enabled = false; in panel_simple_disable()
428 plat->power_invert = dev_read_bool(dev, "power-invert"); in rockchip_panel_ofdata_to_platdata()
430 plat->delay.prepare = dev_read_u32_default(dev, "prepare-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
431 plat->delay.unprepare = dev_read_u32_default(dev, "unprepare-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
432 plat->delay.enable = dev_read_u32_default(dev, "enable-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
433 plat->delay.disable = dev_read_u32_default(dev, "disable-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
434 plat->delay.init = dev_read_u32_default(dev, "init-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
435 plat->delay.reset = dev_read_u32_default(dev, "reset-delay-ms", 0); in rockchip_panel_ofdata_to_platdata()
437 plat->bus_format = dev_read_u32_default(dev, "bus-format", in rockchip_panel_ofdata_to_platdata()
439 plat->bpc = dev_read_u32_default(dev, "bpc", 8); in rockchip_panel_ofdata_to_platdata()
441 data = dev_read_prop(dev, "panel-init-sequence", &len); in rockchip_panel_ofdata_to_platdata()
443 plat->on_cmds = calloc(1, sizeof(*plat->on_cmds)); in rockchip_panel_ofdata_to_platdata()
444 if (!plat->on_cmds) in rockchip_panel_ofdata_to_platdata()
445 return -ENOMEM; in rockchip_panel_ofdata_to_platdata()
447 ret = rockchip_panel_parse_cmds(data, len, plat->on_cmds); in rockchip_panel_ofdata_to_platdata()
449 printf("failed to parse panel init sequence\n"); in rockchip_panel_ofdata_to_platdata()
454 data = dev_read_prop(dev, "panel-exit-sequence", &len); in rockchip_panel_ofdata_to_platdata()
456 plat->off_cmds = calloc(1, sizeof(*plat->off_cmds)); in rockchip_panel_ofdata_to_platdata()
457 if (!plat->off_cmds) { in rockchip_panel_ofdata_to_platdata()
458 ret = -ENOMEM; in rockchip_panel_ofdata_to_platdata()
462 ret = rockchip_panel_parse_cmds(data, len, plat->off_cmds); in rockchip_panel_ofdata_to_platdata()
472 free(plat->off_cmds); in rockchip_panel_ofdata_to_platdata()
474 free(plat->on_cmds); in rockchip_panel_ofdata_to_platdata()
486 ret = gpio_request_by_name(dev, "enable-gpios", 0, in rockchip_panel_probe()
487 &priv->enable_gpio, GPIOD_IS_OUT); in rockchip_panel_probe()
488 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
493 ret = gpio_request_by_name(dev, "reset-gpios", 0, in rockchip_panel_probe()
494 &priv->reset_gpio, GPIOD_IS_OUT); in rockchip_panel_probe()
495 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
501 "backlight", &priv->backlight); in rockchip_panel_probe()
502 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
508 "power-supply", &priv->power_supply); in rockchip_panel_probe()
509 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
514 ret = dev_read_string_index(dev, "rockchip,cmd-type", 0, &cmd_type); in rockchip_panel_probe()
516 priv->cmd_type = CMD_TYPE_DEFAULT; in rockchip_panel_probe()
518 priv->cmd_type = get_panel_cmd_type(cmd_type); in rockchip_panel_probe()
520 if (priv->cmd_type == CMD_TYPE_SPI) { in rockchip_panel_probe()
521 ofnode parent = ofnode_get_parent(dev->node); in rockchip_panel_probe()
527 if (spi->seq < 0) { in rockchip_panel_probe()
529 return -EINVAL; in rockchip_panel_probe()
532 priv->spi_slave = spi_setup_slave(spi->seq, plat->cs, plat->max_hz, in rockchip_panel_probe()
533 plat->mode); in rockchip_panel_probe()
534 if (!priv->spi_slave) { in rockchip_panel_probe()
536 return -EINVAL; in rockchip_panel_probe()
539 ret = gpio_request_by_name(dev, "spi-sdi-gpios", 0, in rockchip_panel_probe()
540 &priv->spi_sdi_gpio, GPIOD_IS_OUT); in rockchip_panel_probe()
541 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
545 ret = gpio_request_by_name(dev, "spi-scl-gpios", 0, in rockchip_panel_probe()
546 &priv->spi_scl_gpio, GPIOD_IS_OUT); in rockchip_panel_probe()
547 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
551 ret = gpio_request_by_name(dev, "spi-cs-gpios", 0, in rockchip_panel_probe()
552 &priv->spi_cs_gpio, GPIOD_IS_OUT); in rockchip_panel_probe()
553 if (ret && ret != -ENOENT) { in rockchip_panel_probe()
557 dm_gpio_set_value(&priv->spi_sdi_gpio, 1); in rockchip_panel_probe()
558 dm_gpio_set_value(&priv->spi_scl_gpio, 1); in rockchip_panel_probe()
559 dm_gpio_set_value(&priv->spi_cs_gpio, 1); in rockchip_panel_probe()
560 dm_gpio_set_value(&priv->reset_gpio, 0); in rockchip_panel_probe()
566 return -ENOMEM; in rockchip_panel_probe()
568 dev->driver_data = (ulong)panel; in rockchip_panel_probe()
569 panel->dev = dev; in rockchip_panel_probe()
570 panel->bus_format = plat->bus_format; in rockchip_panel_probe()
571 panel->bpc = plat->bpc; in rockchip_panel_probe()
572 panel->funcs = &rockchip_panel_funcs; in rockchip_panel_probe()
578 { .compatible = "simple-panel", },
579 { .compatible = "simple-panel-dsi", },
580 { .compatible = "simple-panel-spi", },