4 * Copyright (C) 2012-2013, Samsung Electronics, Co., Ltd.
5 * Andrzej Hajda <a.hajda@samsung.com>
7 * Permission is hereby granted, free of charge, to any person obtaining a
8 * copy of this software and associated documentation files (the
9 * "Software"), to deal in the Software without restriction, including
10 * without limitation the rights to use, copy, modify, merge, publish,
11 * distribute, sub license, and/or sell copies of the Software, and to
12 * permit persons to whom the Software is furnished to do so, subject to
13 * the following conditions:
15 * The above copyright notice and this permission notice (including the
16 * next paragraph) shall be included in all copies or substantial portions
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
22 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
23 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
25 * USE OR OTHER DEALINGS IN THE SOFTWARE.
28 #include <linux/device.h>
29 #include <linux/module.h>
31 #include <linux/of_device.h>
32 #include <linux/pm_runtime.h>
33 #include <linux/slab.h>
35 #include <drm/display/drm_dsc.h>
36 #include <drm/drm_mipi_dsi.h>
37 #include <drm/drm_print.h>
39 #include <video/mipi_display.h>
44 * These functions contain some common logic and helpers to deal with MIPI DSI
47 * Helpers are provided for a number of standard MIPI DSI command as well as a
48 * subset of the MIPI DCS command set.
51 static int mipi_dsi_device_match(struct device
*dev
, const struct device_driver
*drv
)
53 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
55 /* attempt OF style match */
56 if (of_driver_match_device(dev
, drv
))
59 /* compare DSI device and driver names */
60 if (!strcmp(dsi
->name
, drv
->name
))
66 static int mipi_dsi_uevent(const struct device
*dev
, struct kobj_uevent_env
*env
)
68 const struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
71 err
= of_device_uevent_modalias(dev
, env
);
75 add_uevent_var(env
, "MODALIAS=%s%s", MIPI_DSI_MODULE_PREFIX
,
81 static const struct dev_pm_ops mipi_dsi_device_pm_ops
= {
82 .runtime_suspend
= pm_generic_runtime_suspend
,
83 .runtime_resume
= pm_generic_runtime_resume
,
84 .suspend
= pm_generic_suspend
,
85 .resume
= pm_generic_resume
,
86 .freeze
= pm_generic_freeze
,
87 .thaw
= pm_generic_thaw
,
88 .poweroff
= pm_generic_poweroff
,
89 .restore
= pm_generic_restore
,
92 static const struct bus_type mipi_dsi_bus_type
= {
94 .match
= mipi_dsi_device_match
,
95 .uevent
= mipi_dsi_uevent
,
96 .pm
= &mipi_dsi_device_pm_ops
,
100 * of_find_mipi_dsi_device_by_node() - find the MIPI DSI device matching a
102 * @np: device tree node
104 * Return: A pointer to the MIPI DSI device corresponding to @np or NULL if no
105 * such device exists (or has not been registered yet).
107 struct mipi_dsi_device
*of_find_mipi_dsi_device_by_node(struct device_node
*np
)
111 dev
= bus_find_device_by_of_node(&mipi_dsi_bus_type
, np
);
113 return dev
? to_mipi_dsi_device(dev
) : NULL
;
115 EXPORT_SYMBOL(of_find_mipi_dsi_device_by_node
);
117 static void mipi_dsi_dev_release(struct device
*dev
)
119 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
121 of_node_put(dev
->of_node
);
125 static const struct device_type mipi_dsi_device_type
= {
126 .release
= mipi_dsi_dev_release
,
129 static struct mipi_dsi_device
*mipi_dsi_device_alloc(struct mipi_dsi_host
*host
)
131 struct mipi_dsi_device
*dsi
;
133 dsi
= kzalloc(sizeof(*dsi
), GFP_KERNEL
);
135 return ERR_PTR(-ENOMEM
);
138 dsi
->dev
.bus
= &mipi_dsi_bus_type
;
139 dsi
->dev
.parent
= host
->dev
;
140 dsi
->dev
.type
= &mipi_dsi_device_type
;
142 device_initialize(&dsi
->dev
);
147 static int mipi_dsi_device_add(struct mipi_dsi_device
*dsi
)
149 struct mipi_dsi_host
*host
= dsi
->host
;
151 dev_set_name(&dsi
->dev
, "%s.%d", dev_name(host
->dev
), dsi
->channel
);
153 return device_add(&dsi
->dev
);
156 #if IS_ENABLED(CONFIG_OF)
157 static struct mipi_dsi_device
*
158 of_mipi_dsi_device_add(struct mipi_dsi_host
*host
, struct device_node
*node
)
160 struct mipi_dsi_device_info info
= { };
164 if (of_alias_from_compatible(node
, info
.type
, sizeof(info
.type
)) < 0) {
165 drm_err(host
, "modalias failure on %pOF\n", node
);
166 return ERR_PTR(-EINVAL
);
169 ret
= of_property_read_u32(node
, "reg", ®
);
171 drm_err(host
, "device node %pOF has no valid reg property: %d\n",
173 return ERR_PTR(-EINVAL
);
177 info
.node
= of_node_get(node
);
179 return mipi_dsi_device_register_full(host
, &info
);
182 static struct mipi_dsi_device
*
183 of_mipi_dsi_device_add(struct mipi_dsi_host
*host
, struct device_node
*node
)
185 return ERR_PTR(-ENODEV
);
190 * mipi_dsi_device_register_full - create a MIPI DSI device
191 * @host: DSI host to which this device is connected
192 * @info: pointer to template containing DSI device information
194 * Create a MIPI DSI device by using the device information provided by
195 * mipi_dsi_device_info template
198 * A pointer to the newly created MIPI DSI device, or, a pointer encoded
201 struct mipi_dsi_device
*
202 mipi_dsi_device_register_full(struct mipi_dsi_host
*host
,
203 const struct mipi_dsi_device_info
*info
)
205 struct mipi_dsi_device
*dsi
;
209 drm_err(host
, "invalid mipi_dsi_device_info pointer\n");
210 return ERR_PTR(-EINVAL
);
213 if (info
->channel
> 3) {
214 drm_err(host
, "invalid virtual channel: %u\n", info
->channel
);
215 return ERR_PTR(-EINVAL
);
218 dsi
= mipi_dsi_device_alloc(host
);
220 drm_err(host
, "failed to allocate DSI device %ld\n",
225 device_set_node(&dsi
->dev
, of_fwnode_handle(info
->node
));
226 dsi
->channel
= info
->channel
;
227 strscpy(dsi
->name
, info
->type
, sizeof(dsi
->name
));
229 ret
= mipi_dsi_device_add(dsi
);
231 drm_err(host
, "failed to add DSI device %d\n", ret
);
238 EXPORT_SYMBOL(mipi_dsi_device_register_full
);
241 * mipi_dsi_device_unregister - unregister MIPI DSI device
242 * @dsi: DSI peripheral device
244 void mipi_dsi_device_unregister(struct mipi_dsi_device
*dsi
)
246 device_unregister(&dsi
->dev
);
248 EXPORT_SYMBOL(mipi_dsi_device_unregister
);
250 static void devm_mipi_dsi_device_unregister(void *arg
)
252 struct mipi_dsi_device
*dsi
= arg
;
254 mipi_dsi_device_unregister(dsi
);
258 * devm_mipi_dsi_device_register_full - create a managed MIPI DSI device
259 * @dev: device to tie the MIPI-DSI device lifetime to
260 * @host: DSI host to which this device is connected
261 * @info: pointer to template containing DSI device information
263 * Create a MIPI DSI device by using the device information provided by
264 * mipi_dsi_device_info template
266 * This is the managed version of mipi_dsi_device_register_full() which
267 * automatically calls mipi_dsi_device_unregister() when @dev is
271 * A pointer to the newly created MIPI DSI device, or, a pointer encoded
274 struct mipi_dsi_device
*
275 devm_mipi_dsi_device_register_full(struct device
*dev
,
276 struct mipi_dsi_host
*host
,
277 const struct mipi_dsi_device_info
*info
)
279 struct mipi_dsi_device
*dsi
;
282 dsi
= mipi_dsi_device_register_full(host
, info
);
286 ret
= devm_add_action_or_reset(dev
,
287 devm_mipi_dsi_device_unregister
,
294 EXPORT_SYMBOL_GPL(devm_mipi_dsi_device_register_full
);
296 static DEFINE_MUTEX(host_lock
);
297 static LIST_HEAD(host_list
);
300 * of_find_mipi_dsi_host_by_node() - find the MIPI DSI host matching a
302 * @node: device tree node
305 * A pointer to the MIPI DSI host corresponding to @node or NULL if no
306 * such device exists (or has not been registered yet).
308 struct mipi_dsi_host
*of_find_mipi_dsi_host_by_node(struct device_node
*node
)
310 struct mipi_dsi_host
*host
;
312 mutex_lock(&host_lock
);
314 list_for_each_entry(host
, &host_list
, list
) {
315 if (host
->dev
->of_node
== node
) {
316 mutex_unlock(&host_lock
);
321 mutex_unlock(&host_lock
);
325 EXPORT_SYMBOL(of_find_mipi_dsi_host_by_node
);
327 int mipi_dsi_host_register(struct mipi_dsi_host
*host
)
329 struct device_node
*node
;
331 for_each_available_child_of_node(host
->dev
->of_node
, node
) {
332 /* skip nodes without reg property */
333 if (!of_property_present(node
, "reg"))
335 of_mipi_dsi_device_add(host
, node
);
338 mutex_lock(&host_lock
);
339 list_add_tail(&host
->list
, &host_list
);
340 mutex_unlock(&host_lock
);
344 EXPORT_SYMBOL(mipi_dsi_host_register
);
346 static int mipi_dsi_remove_device_fn(struct device
*dev
, void *priv
)
348 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
351 mipi_dsi_detach(dsi
);
352 mipi_dsi_device_unregister(dsi
);
357 void mipi_dsi_host_unregister(struct mipi_dsi_host
*host
)
359 device_for_each_child(host
->dev
, NULL
, mipi_dsi_remove_device_fn
);
361 mutex_lock(&host_lock
);
362 list_del_init(&host
->list
);
363 mutex_unlock(&host_lock
);
365 EXPORT_SYMBOL(mipi_dsi_host_unregister
);
368 * mipi_dsi_attach - attach a DSI device to its DSI host
369 * @dsi: DSI peripheral
371 int mipi_dsi_attach(struct mipi_dsi_device
*dsi
)
373 const struct mipi_dsi_host_ops
*ops
= dsi
->host
->ops
;
376 if (!ops
|| !ops
->attach
)
379 ret
= ops
->attach(dsi
->host
, dsi
);
383 dsi
->attached
= true;
387 EXPORT_SYMBOL(mipi_dsi_attach
);
390 * mipi_dsi_detach - detach a DSI device from its DSI host
391 * @dsi: DSI peripheral
393 int mipi_dsi_detach(struct mipi_dsi_device
*dsi
)
395 const struct mipi_dsi_host_ops
*ops
= dsi
->host
->ops
;
397 if (WARN_ON(!dsi
->attached
))
400 if (!ops
|| !ops
->detach
)
403 dsi
->attached
= false;
405 return ops
->detach(dsi
->host
, dsi
);
407 EXPORT_SYMBOL(mipi_dsi_detach
);
409 static void devm_mipi_dsi_detach(void *arg
)
411 struct mipi_dsi_device
*dsi
= arg
;
413 mipi_dsi_detach(dsi
);
417 * devm_mipi_dsi_attach - Attach a MIPI-DSI device to its DSI Host
418 * @dev: device to tie the MIPI-DSI device attachment lifetime to
419 * @dsi: DSI peripheral
421 * This is the managed version of mipi_dsi_attach() which automatically
422 * calls mipi_dsi_detach() when @dev is unbound.
425 * 0 on success, a negative error code on failure.
427 int devm_mipi_dsi_attach(struct device
*dev
,
428 struct mipi_dsi_device
*dsi
)
432 ret
= mipi_dsi_attach(dsi
);
436 ret
= devm_add_action_or_reset(dev
, devm_mipi_dsi_detach
, dsi
);
442 EXPORT_SYMBOL_GPL(devm_mipi_dsi_attach
);
444 static ssize_t
mipi_dsi_device_transfer(struct mipi_dsi_device
*dsi
,
445 struct mipi_dsi_msg
*msg
)
447 const struct mipi_dsi_host_ops
*ops
= dsi
->host
->ops
;
449 if (!ops
|| !ops
->transfer
)
452 if (dsi
->mode_flags
& MIPI_DSI_MODE_LPM
)
453 msg
->flags
|= MIPI_DSI_MSG_USE_LPM
;
455 return ops
->transfer(dsi
->host
, msg
);
459 * mipi_dsi_packet_format_is_short - check if a packet is of the short format
460 * @type: MIPI DSI data type of the packet
462 * Return: true if the packet for the given data type is a short packet, false
465 bool mipi_dsi_packet_format_is_short(u8 type
)
468 case MIPI_DSI_V_SYNC_START
:
469 case MIPI_DSI_V_SYNC_END
:
470 case MIPI_DSI_H_SYNC_START
:
471 case MIPI_DSI_H_SYNC_END
:
472 case MIPI_DSI_COMPRESSION_MODE
:
473 case MIPI_DSI_END_OF_TRANSMISSION
:
474 case MIPI_DSI_COLOR_MODE_OFF
:
475 case MIPI_DSI_COLOR_MODE_ON
:
476 case MIPI_DSI_SHUTDOWN_PERIPHERAL
:
477 case MIPI_DSI_TURN_ON_PERIPHERAL
:
478 case MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM
:
479 case MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM
:
480 case MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM
:
481 case MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM
:
482 case MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM
:
483 case MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM
:
484 case MIPI_DSI_DCS_SHORT_WRITE
:
485 case MIPI_DSI_DCS_SHORT_WRITE_PARAM
:
486 case MIPI_DSI_DCS_READ
:
487 case MIPI_DSI_EXECUTE_QUEUE
:
488 case MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE
:
494 EXPORT_SYMBOL(mipi_dsi_packet_format_is_short
);
497 * mipi_dsi_packet_format_is_long - check if a packet is of the long format
498 * @type: MIPI DSI data type of the packet
500 * Return: true if the packet for the given data type is a long packet, false
503 bool mipi_dsi_packet_format_is_long(u8 type
)
506 case MIPI_DSI_NULL_PACKET
:
507 case MIPI_DSI_BLANKING_PACKET
:
508 case MIPI_DSI_GENERIC_LONG_WRITE
:
509 case MIPI_DSI_DCS_LONG_WRITE
:
510 case MIPI_DSI_PICTURE_PARAMETER_SET
:
511 case MIPI_DSI_COMPRESSED_PIXEL_STREAM
:
512 case MIPI_DSI_LOOSELY_PACKED_PIXEL_STREAM_YCBCR20
:
513 case MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR24
:
514 case MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR16
:
515 case MIPI_DSI_PACKED_PIXEL_STREAM_30
:
516 case MIPI_DSI_PACKED_PIXEL_STREAM_36
:
517 case MIPI_DSI_PACKED_PIXEL_STREAM_YCBCR12
:
518 case MIPI_DSI_PACKED_PIXEL_STREAM_16
:
519 case MIPI_DSI_PACKED_PIXEL_STREAM_18
:
520 case MIPI_DSI_PIXEL_STREAM_3BYTE_18
:
521 case MIPI_DSI_PACKED_PIXEL_STREAM_24
:
527 EXPORT_SYMBOL(mipi_dsi_packet_format_is_long
);
530 * mipi_dsi_create_packet - create a packet from a message according to the
532 * @packet: pointer to a DSI packet structure
533 * @msg: message to translate into a packet
535 * Return: 0 on success or a negative error code on failure.
537 int mipi_dsi_create_packet(struct mipi_dsi_packet
*packet
,
538 const struct mipi_dsi_msg
*msg
)
543 /* do some minimum sanity checking */
544 if (!mipi_dsi_packet_format_is_short(msg
->type
) &&
545 !mipi_dsi_packet_format_is_long(msg
->type
))
548 if (msg
->channel
> 3)
551 memset(packet
, 0, sizeof(*packet
));
552 packet
->header
[0] = ((msg
->channel
& 0x3) << 6) | (msg
->type
& 0x3f);
554 /* TODO: compute ECC if hardware support is not available */
557 * Long write packets contain the word count in header bytes 1 and 2.
558 * The payload follows the header and is word count bytes long.
560 * Short write packets encode up to two parameters in header bytes 1
563 if (mipi_dsi_packet_format_is_long(msg
->type
)) {
564 packet
->header
[1] = (msg
->tx_len
>> 0) & 0xff;
565 packet
->header
[2] = (msg
->tx_len
>> 8) & 0xff;
567 packet
->payload_length
= msg
->tx_len
;
568 packet
->payload
= msg
->tx_buf
;
570 const u8
*tx
= msg
->tx_buf
;
572 packet
->header
[1] = (msg
->tx_len
> 0) ? tx
[0] : 0;
573 packet
->header
[2] = (msg
->tx_len
> 1) ? tx
[1] : 0;
576 packet
->size
= sizeof(packet
->header
) + packet
->payload_length
;
580 EXPORT_SYMBOL(mipi_dsi_create_packet
);
583 * mipi_dsi_shutdown_peripheral() - sends a Shutdown Peripheral command
584 * @dsi: DSI peripheral device
586 * Return: 0 on success or a negative error code on failure.
588 int mipi_dsi_shutdown_peripheral(struct mipi_dsi_device
*dsi
)
590 struct mipi_dsi_msg msg
= {
591 .channel
= dsi
->channel
,
592 .type
= MIPI_DSI_SHUTDOWN_PERIPHERAL
,
593 .tx_buf
= (u8
[2]) { 0, 0 },
596 int ret
= mipi_dsi_device_transfer(dsi
, &msg
);
598 return (ret
< 0) ? ret
: 0;
600 EXPORT_SYMBOL(mipi_dsi_shutdown_peripheral
);
603 * mipi_dsi_turn_on_peripheral() - sends a Turn On Peripheral command
604 * @dsi: DSI peripheral device
606 * This function is deprecated. Use mipi_dsi_turn_on_peripheral_multi() instead.
608 * Return: 0 on success or a negative error code on failure.
610 int mipi_dsi_turn_on_peripheral(struct mipi_dsi_device
*dsi
)
612 struct mipi_dsi_msg msg
= {
613 .channel
= dsi
->channel
,
614 .type
= MIPI_DSI_TURN_ON_PERIPHERAL
,
615 .tx_buf
= (u8
[2]) { 0, 0 },
618 int ret
= mipi_dsi_device_transfer(dsi
, &msg
);
620 return (ret
< 0) ? ret
: 0;
622 EXPORT_SYMBOL(mipi_dsi_turn_on_peripheral
);
625 * mipi_dsi_set_maximum_return_packet_size() - specify the maximum size of
626 * the payload in a long packet transmitted from the peripheral back to the
628 * @dsi: DSI peripheral device
629 * @value: the maximum size of the payload
631 * Return: 0 on success or a negative error code on failure.
633 int mipi_dsi_set_maximum_return_packet_size(struct mipi_dsi_device
*dsi
,
636 u8 tx
[2] = { value
& 0xff, value
>> 8 };
637 struct mipi_dsi_msg msg
= {
638 .channel
= dsi
->channel
,
639 .type
= MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE
,
640 .tx_len
= sizeof(tx
),
643 int ret
= mipi_dsi_device_transfer(dsi
, &msg
);
645 return (ret
< 0) ? ret
: 0;
647 EXPORT_SYMBOL(mipi_dsi_set_maximum_return_packet_size
);
650 * mipi_dsi_compression_mode_ext() - enable/disable DSC on the peripheral
651 * @dsi: DSI peripheral device
652 * @enable: Whether to enable or disable the DSC
653 * @algo: Selected compression algorithm
654 * @pps_selector: Select PPS from the table of pre-stored or uploaded PPS entries
656 * Enable or disable Display Stream Compression on the peripheral.
657 * This function is deprecated. Use mipi_dsi_compression_mode_ext_multi() instead.
659 * Return: 0 on success or a negative error code on failure.
661 int mipi_dsi_compression_mode_ext(struct mipi_dsi_device
*dsi
, bool enable
,
662 enum mipi_dsi_compression_algo algo
,
663 unsigned int pps_selector
)
666 struct mipi_dsi_msg msg
= {
667 .channel
= dsi
->channel
,
668 .type
= MIPI_DSI_COMPRESSION_MODE
,
669 .tx_len
= sizeof(tx
),
674 if (algo
> 3 || pps_selector
> 3)
677 tx
[0] = (enable
<< 0) |
681 ret
= mipi_dsi_device_transfer(dsi
, &msg
);
683 return (ret
< 0) ? ret
: 0;
685 EXPORT_SYMBOL(mipi_dsi_compression_mode_ext
);
688 * mipi_dsi_compression_mode() - enable/disable DSC on the peripheral
689 * @dsi: DSI peripheral device
690 * @enable: Whether to enable or disable the DSC
692 * Enable or disable Display Stream Compression on the peripheral using the
693 * default Picture Parameter Set and VESA DSC 1.1 algorithm.
695 * Return: 0 on success or a negative error code on failure.
697 int mipi_dsi_compression_mode(struct mipi_dsi_device
*dsi
, bool enable
)
699 return mipi_dsi_compression_mode_ext(dsi
, enable
, MIPI_DSI_COMPRESSION_DSC
, 0);
701 EXPORT_SYMBOL(mipi_dsi_compression_mode
);
704 * mipi_dsi_picture_parameter_set() - transmit the DSC PPS to the peripheral
705 * @dsi: DSI peripheral device
706 * @pps: VESA DSC 1.1 Picture Parameter Set
708 * Transmit the VESA DSC 1.1 Picture Parameter Set to the peripheral.
709 * This function is deprecated. Use mipi_dsi_picture_parameter_set_multi() instead.
711 * Return: 0 on success or a negative error code on failure.
713 int mipi_dsi_picture_parameter_set(struct mipi_dsi_device
*dsi
,
714 const struct drm_dsc_picture_parameter_set
*pps
)
716 struct mipi_dsi_msg msg
= {
717 .channel
= dsi
->channel
,
718 .type
= MIPI_DSI_PICTURE_PARAMETER_SET
,
719 .tx_len
= sizeof(*pps
),
722 int ret
= mipi_dsi_device_transfer(dsi
, &msg
);
724 return (ret
< 0) ? ret
: 0;
726 EXPORT_SYMBOL(mipi_dsi_picture_parameter_set
);
729 * mipi_dsi_generic_write() - transmit data using a generic write packet
730 * @dsi: DSI peripheral device
731 * @payload: buffer containing the payload
732 * @size: size of payload buffer
734 * This function will automatically choose the right data type depending on
735 * the payload length.
737 * Return: The number of bytes transmitted on success or a negative error code
740 ssize_t
mipi_dsi_generic_write(struct mipi_dsi_device
*dsi
, const void *payload
,
743 struct mipi_dsi_msg msg
= {
744 .channel
= dsi
->channel
,
751 msg
.type
= MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM
;
755 msg
.type
= MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM
;
759 msg
.type
= MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM
;
763 msg
.type
= MIPI_DSI_GENERIC_LONG_WRITE
;
767 return mipi_dsi_device_transfer(dsi
, &msg
);
769 EXPORT_SYMBOL(mipi_dsi_generic_write
);
772 * mipi_dsi_generic_write_chatty() - mipi_dsi_generic_write() w/ an error log
773 * @dsi: DSI peripheral device
774 * @payload: buffer containing the payload
775 * @size: size of payload buffer
777 * Like mipi_dsi_generic_write() but includes a dev_err()
778 * call for you and returns 0 upon success, not the number of bytes sent.
780 * Return: 0 on success or a negative error code on failure.
782 int mipi_dsi_generic_write_chatty(struct mipi_dsi_device
*dsi
,
783 const void *payload
, size_t size
)
785 struct device
*dev
= &dsi
->dev
;
788 ret
= mipi_dsi_generic_write(dsi
, payload
, size
);
790 dev_err(dev
, "sending generic data %*ph failed: %zd\n",
791 (int)size
, payload
, ret
);
797 EXPORT_SYMBOL(mipi_dsi_generic_write_chatty
);
800 * mipi_dsi_generic_write_multi() - mipi_dsi_generic_write_chatty() w/ accum_err
801 * @ctx: Context for multiple DSI transactions
802 * @payload: buffer containing the payload
803 * @size: size of payload buffer
805 * Like mipi_dsi_generic_write_chatty() but deals with errors in a way that
806 * makes it convenient to make several calls in a row.
808 void mipi_dsi_generic_write_multi(struct mipi_dsi_multi_context
*ctx
,
809 const void *payload
, size_t size
)
811 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
812 struct device
*dev
= &dsi
->dev
;
818 ret
= mipi_dsi_generic_write(dsi
, payload
, size
);
820 ctx
->accum_err
= ret
;
821 dev_err(dev
, "sending generic data %*ph failed: %d\n",
822 (int)size
, payload
, ctx
->accum_err
);
825 EXPORT_SYMBOL(mipi_dsi_generic_write_multi
);
828 * mipi_dsi_generic_read() - receive data using a generic read packet
829 * @dsi: DSI peripheral device
830 * @params: buffer containing the request parameters
831 * @num_params: number of request parameters
832 * @data: buffer in which to return the received data
833 * @size: size of receive buffer
835 * This function will automatically choose the right data type depending on
836 * the number of parameters passed in.
838 * Return: The number of bytes successfully read or a negative error code on
841 ssize_t
mipi_dsi_generic_read(struct mipi_dsi_device
*dsi
, const void *params
,
842 size_t num_params
, void *data
, size_t size
)
844 struct mipi_dsi_msg msg
= {
845 .channel
= dsi
->channel
,
846 .tx_len
= num_params
,
852 switch (num_params
) {
854 msg
.type
= MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM
;
858 msg
.type
= MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM
;
862 msg
.type
= MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM
;
869 return mipi_dsi_device_transfer(dsi
, &msg
);
871 EXPORT_SYMBOL(mipi_dsi_generic_read
);
874 * mipi_dsi_dcs_write_buffer() - transmit a DCS command with payload
875 * @dsi: DSI peripheral device
876 * @data: buffer containing data to be transmitted
877 * @len: size of transmission buffer
879 * This function will automatically choose the right data type depending on
880 * the command payload length.
882 * Return: The number of bytes successfully transmitted or a negative error
885 ssize_t
mipi_dsi_dcs_write_buffer(struct mipi_dsi_device
*dsi
,
886 const void *data
, size_t len
)
888 struct mipi_dsi_msg msg
= {
889 .channel
= dsi
->channel
,
899 msg
.type
= MIPI_DSI_DCS_SHORT_WRITE
;
903 msg
.type
= MIPI_DSI_DCS_SHORT_WRITE_PARAM
;
907 msg
.type
= MIPI_DSI_DCS_LONG_WRITE
;
911 return mipi_dsi_device_transfer(dsi
, &msg
);
913 EXPORT_SYMBOL(mipi_dsi_dcs_write_buffer
);
916 * mipi_dsi_dcs_write_buffer_chatty - mipi_dsi_dcs_write_buffer() w/ an error log
917 * @dsi: DSI peripheral device
918 * @data: buffer containing data to be transmitted
919 * @len: size of transmission buffer
921 * Like mipi_dsi_dcs_write_buffer() but includes a dev_err()
922 * call for you and returns 0 upon success, not the number of bytes sent.
924 * Return: 0 on success or a negative error code on failure.
926 int mipi_dsi_dcs_write_buffer_chatty(struct mipi_dsi_device
*dsi
,
927 const void *data
, size_t len
)
929 struct device
*dev
= &dsi
->dev
;
932 ret
= mipi_dsi_dcs_write_buffer(dsi
, data
, len
);
934 dev_err(dev
, "sending dcs data %*ph failed: %zd\n",
935 (int)len
, data
, ret
);
941 EXPORT_SYMBOL(mipi_dsi_dcs_write_buffer_chatty
);
944 * mipi_dsi_dcs_write_buffer_multi - mipi_dsi_dcs_write_buffer_chatty() w/ accum_err
945 * @ctx: Context for multiple DSI transactions
946 * @data: buffer containing data to be transmitted
947 * @len: size of transmission buffer
949 * Like mipi_dsi_dcs_write_buffer_chatty() but deals with errors in a way that
950 * makes it convenient to make several calls in a row.
952 void mipi_dsi_dcs_write_buffer_multi(struct mipi_dsi_multi_context
*ctx
,
953 const void *data
, size_t len
)
955 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
956 struct device
*dev
= &dsi
->dev
;
962 ret
= mipi_dsi_dcs_write_buffer(dsi
, data
, len
);
964 ctx
->accum_err
= ret
;
965 dev_err(dev
, "sending dcs data %*ph failed: %d\n",
966 (int)len
, data
, ctx
->accum_err
);
969 EXPORT_SYMBOL(mipi_dsi_dcs_write_buffer_multi
);
972 * mipi_dsi_dcs_write() - send DCS write command
973 * @dsi: DSI peripheral device
975 * @data: buffer containing the command payload
976 * @len: command payload length
978 * This function will automatically choose the right data type depending on
979 * the command payload length.
981 * Return: The number of bytes successfully transmitted or a negative error
984 ssize_t
mipi_dsi_dcs_write(struct mipi_dsi_device
*dsi
, u8 cmd
,
985 const void *data
, size_t len
)
993 if (len
> ARRAY_SIZE(stack_tx
) - 1) {
994 tx
= kmalloc(size
, GFP_KERNEL
);
1001 /* concatenate the DCS command byte and the payload */
1004 memcpy(&tx
[1], data
, len
);
1006 err
= mipi_dsi_dcs_write_buffer(dsi
, tx
, size
);
1013 EXPORT_SYMBOL(mipi_dsi_dcs_write
);
1016 * mipi_dsi_dcs_read() - send DCS read request command
1017 * @dsi: DSI peripheral device
1019 * @data: buffer in which to receive data
1020 * @len: size of receive buffer
1022 * Return: The number of bytes read or a negative error code on failure.
1024 ssize_t
mipi_dsi_dcs_read(struct mipi_dsi_device
*dsi
, u8 cmd
, void *data
,
1027 struct mipi_dsi_msg msg
= {
1028 .channel
= dsi
->channel
,
1029 .type
= MIPI_DSI_DCS_READ
,
1036 return mipi_dsi_device_transfer(dsi
, &msg
);
1038 EXPORT_SYMBOL(mipi_dsi_dcs_read
);
1041 * mipi_dsi_dcs_nop() - send DCS nop packet
1042 * @dsi: DSI peripheral device
1044 * This function is deprecated. Use mipi_dsi_dcs_nop_multi() instead.
1046 * Return: 0 on success or a negative error code on failure.
1048 int mipi_dsi_dcs_nop(struct mipi_dsi_device
*dsi
)
1052 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_NOP
, NULL
, 0);
1058 EXPORT_SYMBOL(mipi_dsi_dcs_nop
);
1061 * mipi_dsi_dcs_soft_reset() - perform a software reset of the display module
1062 * @dsi: DSI peripheral device
1064 * This function is deprecated. Use mipi_dsi_dcs_soft_reset_multi() instead.
1066 * Return: 0 on success or a negative error code on failure.
1068 int mipi_dsi_dcs_soft_reset(struct mipi_dsi_device
*dsi
)
1072 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SOFT_RESET
, NULL
, 0);
1078 EXPORT_SYMBOL(mipi_dsi_dcs_soft_reset
);
1081 * mipi_dsi_dcs_get_power_mode() - query the display module's current power
1083 * @dsi: DSI peripheral device
1084 * @mode: return location for the current power mode
1086 * Return: 0 on success or a negative error code on failure.
1088 int mipi_dsi_dcs_get_power_mode(struct mipi_dsi_device
*dsi
, u8
*mode
)
1092 err
= mipi_dsi_dcs_read(dsi
, MIPI_DCS_GET_POWER_MODE
, mode
,
1103 EXPORT_SYMBOL(mipi_dsi_dcs_get_power_mode
);
1106 * mipi_dsi_dcs_get_pixel_format() - gets the pixel format for the RGB image
1107 * data used by the interface
1108 * @dsi: DSI peripheral device
1109 * @format: return location for the pixel format
1111 * Return: 0 on success or a negative error code on failure.
1113 int mipi_dsi_dcs_get_pixel_format(struct mipi_dsi_device
*dsi
, u8
*format
)
1117 err
= mipi_dsi_dcs_read(dsi
, MIPI_DCS_GET_PIXEL_FORMAT
, format
,
1128 EXPORT_SYMBOL(mipi_dsi_dcs_get_pixel_format
);
1131 * mipi_dsi_dcs_enter_sleep_mode() - disable all unnecessary blocks inside the
1132 * display module except interface communication
1133 * @dsi: DSI peripheral device
1135 * This function is deprecated. Use mipi_dsi_dcs_enter_sleep_mode_multi() instead.
1137 * Return: 0 on success or a negative error code on failure.
1139 int mipi_dsi_dcs_enter_sleep_mode(struct mipi_dsi_device
*dsi
)
1143 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_ENTER_SLEEP_MODE
, NULL
, 0);
1149 EXPORT_SYMBOL(mipi_dsi_dcs_enter_sleep_mode
);
1152 * mipi_dsi_dcs_exit_sleep_mode() - enable all blocks inside the display
1154 * @dsi: DSI peripheral device
1156 * This function is deprecated. Use mipi_dsi_dcs_exit_sleep_mode_multi() instead.
1158 * Return: 0 on success or a negative error code on failure.
1160 int mipi_dsi_dcs_exit_sleep_mode(struct mipi_dsi_device
*dsi
)
1164 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_EXIT_SLEEP_MODE
, NULL
, 0);
1170 EXPORT_SYMBOL(mipi_dsi_dcs_exit_sleep_mode
);
1173 * mipi_dsi_dcs_set_display_off() - stop displaying the image data on the
1175 * @dsi: DSI peripheral device
1177 * This function is deprecated. Use mipi_dsi_dcs_set_display_off_multi() instead.
1179 * Return: 0 on success or a negative error code on failure.
1181 int mipi_dsi_dcs_set_display_off(struct mipi_dsi_device
*dsi
)
1185 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_DISPLAY_OFF
, NULL
, 0);
1191 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_off
);
1194 * mipi_dsi_dcs_set_display_on() - start displaying the image data on the
1196 * @dsi: DSI peripheral device
1198 * This function is deprecated. Use mipi_dsi_dcs_set_display_on_multi() instead.
1200 * Return: 0 on success or a negative error code on failure
1202 int mipi_dsi_dcs_set_display_on(struct mipi_dsi_device
*dsi
)
1206 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_DISPLAY_ON
, NULL
, 0);
1212 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_on
);
1215 * mipi_dsi_dcs_set_column_address() - define the column extent of the frame
1216 * memory accessed by the host processor
1217 * @dsi: DSI peripheral device
1218 * @start: first column of frame memory
1219 * @end: last column of frame memory
1221 * This function is deprecated. Use mipi_dsi_dcs_set_column_address_multi()
1224 * Return: 0 on success or a negative error code on failure.
1226 int mipi_dsi_dcs_set_column_address(struct mipi_dsi_device
*dsi
, u16 start
,
1229 u8 payload
[4] = { start
>> 8, start
& 0xff, end
>> 8, end
& 0xff };
1232 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_COLUMN_ADDRESS
, payload
,
1239 EXPORT_SYMBOL(mipi_dsi_dcs_set_column_address
);
1242 * mipi_dsi_dcs_set_page_address() - define the page extent of the frame
1243 * memory accessed by the host processor
1244 * @dsi: DSI peripheral device
1245 * @start: first page of frame memory
1246 * @end: last page of frame memory
1248 * This function is deprecated. Use mipi_dsi_dcs_set_page_address_multi()
1251 * Return: 0 on success or a negative error code on failure.
1253 int mipi_dsi_dcs_set_page_address(struct mipi_dsi_device
*dsi
, u16 start
,
1256 u8 payload
[4] = { start
>> 8, start
& 0xff, end
>> 8, end
& 0xff };
1259 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_PAGE_ADDRESS
, payload
,
1266 EXPORT_SYMBOL(mipi_dsi_dcs_set_page_address
);
1269 * mipi_dsi_dcs_set_tear_off() - turn off the display module's Tearing Effect
1270 * output signal on the TE signal line
1271 * @dsi: DSI peripheral device
1273 * Return: 0 on success or a negative error code on failure
1275 int mipi_dsi_dcs_set_tear_off(struct mipi_dsi_device
*dsi
)
1279 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_TEAR_OFF
, NULL
, 0);
1285 EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_off
);
1288 * mipi_dsi_dcs_set_tear_on() - turn on the display module's Tearing Effect
1289 * output signal on the TE signal line.
1290 * @dsi: DSI peripheral device
1291 * @mode: the Tearing Effect Output Line mode
1293 * This function is deprecated. Use mipi_dsi_dcs_set_tear_on_multi() instead.
1295 * Return: 0 on success or a negative error code on failure
1297 int mipi_dsi_dcs_set_tear_on(struct mipi_dsi_device
*dsi
,
1298 enum mipi_dsi_dcs_tear_mode mode
)
1303 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_TEAR_ON
, &value
,
1310 EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_on
);
1313 * mipi_dsi_dcs_set_pixel_format() - sets the pixel format for the RGB image
1314 * data used by the interface
1315 * @dsi: DSI peripheral device
1316 * @format: pixel format
1318 * This function is deprecated. Use mipi_dsi_dcs_set_pixel_format_multi()
1321 * Return: 0 on success or a negative error code on failure.
1323 int mipi_dsi_dcs_set_pixel_format(struct mipi_dsi_device
*dsi
, u8 format
)
1327 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_PIXEL_FORMAT
, &format
,
1334 EXPORT_SYMBOL(mipi_dsi_dcs_set_pixel_format
);
1337 * mipi_dsi_dcs_set_tear_scanline() - set the scanline to use as trigger for
1338 * the Tearing Effect output signal of the display module
1339 * @dsi: DSI peripheral device
1340 * @scanline: scanline to use as trigger
1342 * This function is deprecated. Use mipi_dsi_dcs_set_tear_scanline_multi()
1345 * Return: 0 on success or a negative error code on failure
1347 int mipi_dsi_dcs_set_tear_scanline(struct mipi_dsi_device
*dsi
, u16 scanline
)
1349 u8 payload
[2] = { scanline
>> 8, scanline
& 0xff };
1352 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_TEAR_SCANLINE
, payload
,
1359 EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_scanline
);
1362 * mipi_dsi_dcs_set_display_brightness() - sets the brightness value of the
1364 * @dsi: DSI peripheral device
1365 * @brightness: brightness value
1367 * This function is deprecated. Use mipi_dsi_dcs_set_display_brightness_multi()
1370 * Return: 0 on success or a negative error code on failure.
1372 int mipi_dsi_dcs_set_display_brightness(struct mipi_dsi_device
*dsi
,
1375 u8 payload
[2] = { brightness
& 0xff, brightness
>> 8 };
1378 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_DISPLAY_BRIGHTNESS
,
1379 payload
, sizeof(payload
));
1385 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness
);
1388 * mipi_dsi_dcs_get_display_brightness() - gets the current brightness value
1390 * @dsi: DSI peripheral device
1391 * @brightness: brightness value
1393 * Return: 0 on success or a negative error code on failure.
1395 int mipi_dsi_dcs_get_display_brightness(struct mipi_dsi_device
*dsi
,
1400 err
= mipi_dsi_dcs_read(dsi
, MIPI_DCS_GET_DISPLAY_BRIGHTNESS
,
1401 brightness
, sizeof(*brightness
));
1411 EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness
);
1414 * mipi_dsi_dcs_set_display_brightness_large() - sets the 16-bit brightness value
1416 * @dsi: DSI peripheral device
1417 * @brightness: brightness value
1419 * Return: 0 on success or a negative error code on failure.
1421 int mipi_dsi_dcs_set_display_brightness_large(struct mipi_dsi_device
*dsi
,
1424 u8 payload
[2] = { brightness
>> 8, brightness
& 0xff };
1427 err
= mipi_dsi_dcs_write(dsi
, MIPI_DCS_SET_DISPLAY_BRIGHTNESS
,
1428 payload
, sizeof(payload
));
1434 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness_large
);
1437 * mipi_dsi_dcs_get_display_brightness_large() - gets the current 16-bit
1438 * brightness value of the display
1439 * @dsi: DSI peripheral device
1440 * @brightness: brightness value
1442 * Return: 0 on success or a negative error code on failure.
1444 int mipi_dsi_dcs_get_display_brightness_large(struct mipi_dsi_device
*dsi
,
1447 u8 brightness_be
[2];
1450 err
= mipi_dsi_dcs_read(dsi
, MIPI_DCS_GET_DISPLAY_BRIGHTNESS
,
1451 brightness_be
, sizeof(brightness_be
));
1459 *brightness
= (brightness_be
[0] << 8) | brightness_be
[1];
1463 EXPORT_SYMBOL(mipi_dsi_dcs_get_display_brightness_large
);
1466 * mipi_dsi_picture_parameter_set_multi() - transmit the DSC PPS to the peripheral
1467 * @ctx: Context for multiple DSI transactions
1468 * @pps: VESA DSC 1.1 Picture Parameter Set
1470 * Like mipi_dsi_picture_parameter_set() but deals with errors in a way that
1471 * makes it convenient to make several calls in a row.
1473 void mipi_dsi_picture_parameter_set_multi(struct mipi_dsi_multi_context
*ctx
,
1474 const struct drm_dsc_picture_parameter_set
*pps
)
1476 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1477 struct device
*dev
= &dsi
->dev
;
1483 ret
= mipi_dsi_picture_parameter_set(dsi
, pps
);
1485 ctx
->accum_err
= ret
;
1486 dev_err(dev
, "sending PPS failed: %d\n",
1490 EXPORT_SYMBOL(mipi_dsi_picture_parameter_set_multi
);
1493 * mipi_dsi_compression_mode_ext_multi() - enable/disable DSC on the peripheral
1494 * @ctx: Context for multiple DSI transactions
1495 * @enable: Whether to enable or disable the DSC
1496 * @algo: Selected compression algorithm
1497 * @pps_selector: Select PPS from the table of pre-stored or uploaded PPS entries
1499 * Like mipi_dsi_compression_mode_ext() but deals with errors in a way that
1500 * makes it convenient to make several calls in a row.
1502 void mipi_dsi_compression_mode_ext_multi(struct mipi_dsi_multi_context
*ctx
,
1504 enum mipi_dsi_compression_algo algo
,
1505 unsigned int pps_selector
)
1507 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1508 struct device
*dev
= &dsi
->dev
;
1514 ret
= mipi_dsi_compression_mode_ext(dsi
, enable
, algo
, pps_selector
);
1516 ctx
->accum_err
= ret
;
1517 dev_err(dev
, "sending COMPRESSION_MODE failed: %d\n",
1521 EXPORT_SYMBOL(mipi_dsi_compression_mode_ext_multi
);
1524 * mipi_dsi_compression_mode_multi() - enable/disable DSC on the peripheral
1525 * @ctx: Context for multiple DSI transactions
1526 * @enable: Whether to enable or disable the DSC
1528 * Enable or disable Display Stream Compression on the peripheral using the
1529 * default Picture Parameter Set and VESA DSC 1.1 algorithm.
1531 void mipi_dsi_compression_mode_multi(struct mipi_dsi_multi_context
*ctx
,
1534 return mipi_dsi_compression_mode_ext_multi(ctx
, enable
,
1535 MIPI_DSI_COMPRESSION_DSC
, 0);
1537 EXPORT_SYMBOL(mipi_dsi_compression_mode_multi
);
1540 * mipi_dsi_dcs_nop_multi() - send DCS NOP packet
1541 * @ctx: Context for multiple DSI transactions
1543 * Like mipi_dsi_dcs_nop() but deals with errors in a way that
1544 * makes it convenient to make several calls in a row.
1546 void mipi_dsi_dcs_nop_multi(struct mipi_dsi_multi_context
*ctx
)
1548 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1549 struct device
*dev
= &dsi
->dev
;
1555 ret
= mipi_dsi_dcs_nop(dsi
);
1557 ctx
->accum_err
= ret
;
1558 dev_err(dev
, "sending DCS NOP failed: %d\n",
1562 EXPORT_SYMBOL(mipi_dsi_dcs_nop_multi
);
1565 * mipi_dsi_dcs_enter_sleep_mode_multi() - send DCS ENTER_SLEEP_MODE packet
1566 * @ctx: Context for multiple DSI transactions
1568 * Like mipi_dsi_dcs_enter_sleep_mode() but deals with errors in a way that
1569 * makes it convenient to make several calls in a row.
1571 void mipi_dsi_dcs_enter_sleep_mode_multi(struct mipi_dsi_multi_context
*ctx
)
1573 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1574 struct device
*dev
= &dsi
->dev
;
1580 ret
= mipi_dsi_dcs_enter_sleep_mode(dsi
);
1582 ctx
->accum_err
= ret
;
1583 dev_err(dev
, "sending DCS ENTER_SLEEP_MODE failed: %d\n",
1587 EXPORT_SYMBOL(mipi_dsi_dcs_enter_sleep_mode_multi
);
1590 * mipi_dsi_dcs_exit_sleep_mode_multi() - send DCS EXIT_SLEEP_MODE packet
1591 * @ctx: Context for multiple DSI transactions
1593 * Like mipi_dsi_dcs_exit_sleep_mode() but deals with errors in a way that
1594 * makes it convenient to make several calls in a row.
1596 void mipi_dsi_dcs_exit_sleep_mode_multi(struct mipi_dsi_multi_context
*ctx
)
1598 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1599 struct device
*dev
= &dsi
->dev
;
1605 ret
= mipi_dsi_dcs_exit_sleep_mode(dsi
);
1607 ctx
->accum_err
= ret
;
1608 dev_err(dev
, "sending DCS EXIT_SLEEP_MODE failed: %d\n",
1612 EXPORT_SYMBOL(mipi_dsi_dcs_exit_sleep_mode_multi
);
1615 * mipi_dsi_dcs_set_display_off_multi() - send DCS SET_DISPLAY_OFF packet
1616 * @ctx: Context for multiple DSI transactions
1618 * Like mipi_dsi_dcs_set_display_off() but deals with errors in a way that
1619 * makes it convenient to make several calls in a row.
1621 void mipi_dsi_dcs_set_display_off_multi(struct mipi_dsi_multi_context
*ctx
)
1623 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1624 struct device
*dev
= &dsi
->dev
;
1630 ret
= mipi_dsi_dcs_set_display_off(dsi
);
1632 ctx
->accum_err
= ret
;
1633 dev_err(dev
, "sending DCS SET_DISPLAY_OFF failed: %d\n",
1637 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_off_multi
);
1640 * mipi_dsi_dcs_set_display_on_multi() - send DCS SET_DISPLAY_ON packet
1641 * @ctx: Context for multiple DSI transactions
1643 * Like mipi_dsi_dcs_set_display_on() but deals with errors in a way that
1644 * makes it convenient to make several calls in a row.
1646 void mipi_dsi_dcs_set_display_on_multi(struct mipi_dsi_multi_context
*ctx
)
1648 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1649 struct device
*dev
= &dsi
->dev
;
1655 ret
= mipi_dsi_dcs_set_display_on(dsi
);
1657 ctx
->accum_err
= ret
;
1658 dev_err(dev
, "sending DCS SET_DISPLAY_ON failed: %d\n",
1662 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_on_multi
);
1665 * mipi_dsi_dcs_set_tear_on_multi() - send DCS SET_TEAR_ON packet
1666 * @ctx: Context for multiple DSI transactions
1667 * @mode: the Tearing Effect Output Line mode
1669 * Like mipi_dsi_dcs_set_tear_on() but deals with errors in a way that
1670 * makes it convenient to make several calls in a row.
1672 void mipi_dsi_dcs_set_tear_on_multi(struct mipi_dsi_multi_context
*ctx
,
1673 enum mipi_dsi_dcs_tear_mode mode
)
1675 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1676 struct device
*dev
= &dsi
->dev
;
1682 ret
= mipi_dsi_dcs_set_tear_on(dsi
, mode
);
1684 ctx
->accum_err
= ret
;
1685 dev_err(dev
, "sending DCS SET_TEAR_ON failed: %d\n",
1689 EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_on_multi
);
1692 * mipi_dsi_turn_on_peripheral_multi() - sends a Turn On Peripheral command
1693 * @ctx: Context for multiple DSI transactions
1695 * Like mipi_dsi_turn_on_peripheral() but deals with errors in a way that
1696 * makes it convenient to make several calls in a row.
1698 void mipi_dsi_turn_on_peripheral_multi(struct mipi_dsi_multi_context
*ctx
)
1700 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1701 struct device
*dev
= &dsi
->dev
;
1707 ret
= mipi_dsi_turn_on_peripheral(dsi
);
1709 ctx
->accum_err
= ret
;
1710 dev_err(dev
, "Failed to turn on peripheral: %d\n",
1714 EXPORT_SYMBOL(mipi_dsi_turn_on_peripheral_multi
);
1717 * mipi_dsi_dcs_soft_reset_multi() - perform a software reset of the display module
1718 * @ctx: Context for multiple DSI transactions
1720 * Like mipi_dsi_dcs_soft_reset() but deals with errors in a way that
1721 * makes it convenient to make several calls in a row.
1723 void mipi_dsi_dcs_soft_reset_multi(struct mipi_dsi_multi_context
*ctx
)
1725 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1726 struct device
*dev
= &dsi
->dev
;
1732 ret
= mipi_dsi_dcs_soft_reset(dsi
);
1734 ctx
->accum_err
= ret
;
1735 dev_err(dev
, "Failed to mipi_dsi_dcs_soft_reset: %d\n",
1739 EXPORT_SYMBOL(mipi_dsi_dcs_soft_reset_multi
);
1742 * mipi_dsi_dcs_set_display_brightness_multi() - sets the brightness value of
1744 * @ctx: Context for multiple DSI transactions
1745 * @brightness: brightness value
1747 * Like mipi_dsi_dcs_set_display_brightness() but deals with errors in a way that
1748 * makes it convenient to make several calls in a row.
1750 void mipi_dsi_dcs_set_display_brightness_multi(struct mipi_dsi_multi_context
*ctx
,
1753 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1754 struct device
*dev
= &dsi
->dev
;
1760 ret
= mipi_dsi_dcs_set_display_brightness(dsi
, brightness
);
1762 ctx
->accum_err
= ret
;
1763 dev_err(dev
, "Failed to write display brightness: %d\n",
1767 EXPORT_SYMBOL(mipi_dsi_dcs_set_display_brightness_multi
);
1770 * mipi_dsi_dcs_set_pixel_format_multi() - sets the pixel format for the RGB image
1771 * data used by the interface
1772 * @ctx: Context for multiple DSI transactions
1773 * @format: pixel format
1775 * Like mipi_dsi_dcs_set_pixel_format() but deals with errors in a way that
1776 * makes it convenient to make several calls in a row.
1778 void mipi_dsi_dcs_set_pixel_format_multi(struct mipi_dsi_multi_context
*ctx
,
1781 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1782 struct device
*dev
= &dsi
->dev
;
1788 ret
= mipi_dsi_dcs_set_pixel_format(dsi
, format
);
1790 ctx
->accum_err
= ret
;
1791 dev_err(dev
, "Failed to set pixel format: %d\n",
1795 EXPORT_SYMBOL(mipi_dsi_dcs_set_pixel_format_multi
);
1798 * mipi_dsi_dcs_set_column_address_multi() - define the column extent of the
1799 * frame memory accessed by the host processor
1800 * @ctx: Context for multiple DSI transactions
1801 * @start: first column of frame memory
1802 * @end: last column of frame memory
1804 * Like mipi_dsi_dcs_set_column_address() but deals with errors in a way that
1805 * makes it convenient to make several calls in a row.
1807 void mipi_dsi_dcs_set_column_address_multi(struct mipi_dsi_multi_context
*ctx
,
1810 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1811 struct device
*dev
= &dsi
->dev
;
1817 ret
= mipi_dsi_dcs_set_column_address(dsi
, start
, end
);
1819 ctx
->accum_err
= ret
;
1820 dev_err(dev
, "Failed to set column address: %d\n",
1824 EXPORT_SYMBOL(mipi_dsi_dcs_set_column_address_multi
);
1827 * mipi_dsi_dcs_set_page_address_multi() - define the page extent of the
1828 * frame memory accessed by the host processor
1829 * @ctx: Context for multiple DSI transactions
1830 * @start: first page of frame memory
1831 * @end: last page of frame memory
1833 * Like mipi_dsi_dcs_set_page_address() but deals with errors in a way that
1834 * makes it convenient to make several calls in a row.
1836 void mipi_dsi_dcs_set_page_address_multi(struct mipi_dsi_multi_context
*ctx
,
1839 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1840 struct device
*dev
= &dsi
->dev
;
1846 ret
= mipi_dsi_dcs_set_page_address(dsi
, start
, end
);
1848 ctx
->accum_err
= ret
;
1849 dev_err(dev
, "Failed to set page address: %d\n",
1853 EXPORT_SYMBOL(mipi_dsi_dcs_set_page_address_multi
);
1856 * mipi_dsi_dcs_set_tear_scanline_multi() - set the scanline to use as trigger for
1857 * the Tearing Effect output signal of the display module
1858 * @ctx: Context for multiple DSI transactions
1859 * @scanline: scanline to use as trigger
1861 * Like mipi_dsi_dcs_set_tear_scanline() but deals with errors in a way that
1862 * makes it convenient to make several calls in a row.
1864 void mipi_dsi_dcs_set_tear_scanline_multi(struct mipi_dsi_multi_context
*ctx
,
1867 struct mipi_dsi_device
*dsi
= ctx
->dsi
;
1868 struct device
*dev
= &dsi
->dev
;
1874 ret
= mipi_dsi_dcs_set_tear_scanline(dsi
, scanline
);
1876 ctx
->accum_err
= ret
;
1877 dev_err(dev
, "Failed to set tear scanline: %d\n",
1881 EXPORT_SYMBOL(mipi_dsi_dcs_set_tear_scanline_multi
);
1883 static int mipi_dsi_drv_probe(struct device
*dev
)
1885 struct mipi_dsi_driver
*drv
= to_mipi_dsi_driver(dev
->driver
);
1886 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
1888 return drv
->probe(dsi
);
1891 static int mipi_dsi_drv_remove(struct device
*dev
)
1893 struct mipi_dsi_driver
*drv
= to_mipi_dsi_driver(dev
->driver
);
1894 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
1901 static void mipi_dsi_drv_shutdown(struct device
*dev
)
1903 struct mipi_dsi_driver
*drv
= to_mipi_dsi_driver(dev
->driver
);
1904 struct mipi_dsi_device
*dsi
= to_mipi_dsi_device(dev
);
1910 * mipi_dsi_driver_register_full() - register a driver for DSI devices
1911 * @drv: DSI driver structure
1912 * @owner: owner module
1914 * Return: 0 on success or a negative error code on failure.
1916 int mipi_dsi_driver_register_full(struct mipi_dsi_driver
*drv
,
1917 struct module
*owner
)
1919 drv
->driver
.bus
= &mipi_dsi_bus_type
;
1920 drv
->driver
.owner
= owner
;
1923 drv
->driver
.probe
= mipi_dsi_drv_probe
;
1925 drv
->driver
.remove
= mipi_dsi_drv_remove
;
1927 drv
->driver
.shutdown
= mipi_dsi_drv_shutdown
;
1929 return driver_register(&drv
->driver
);
1931 EXPORT_SYMBOL(mipi_dsi_driver_register_full
);
1934 * mipi_dsi_driver_unregister() - unregister a driver for DSI devices
1935 * @drv: DSI driver structure
1937 * Return: 0 on success or a negative error code on failure.
1939 void mipi_dsi_driver_unregister(struct mipi_dsi_driver
*drv
)
1941 driver_unregister(&drv
->driver
);
1943 EXPORT_SYMBOL(mipi_dsi_driver_unregister
);
1945 static int __init
mipi_dsi_bus_init(void)
1947 return bus_register(&mipi_dsi_bus_type
);
1949 postcore_initcall(mipi_dsi_bus_init
);
1951 MODULE_AUTHOR("Andrzej Hajda <a.hajda@samsung.com>");
1952 MODULE_DESCRIPTION("MIPI DSI Bus");
1953 MODULE_LICENSE("GPL and additional rights");