drm/exynos/dsi: use core helper to create DSI packet
authorAndrzej Hajda <a.hajda@samsung.com>
Wed, 17 Feb 2016 13:33:08 +0000 (14:33 +0100)
committerSeung-Woo Kim <sw0312.kim@samsung.com>
Wed, 14 Dec 2016 04:53:45 +0000 (13:53 +0900)
Core provides generic helper to create DSI packet, use it instead of
custom code.

Change-Id: I365c64ba52b85ac1b39dbdab8bb2ccdf6620b279
Signed-off-by: Andrzej Hajda <a.hajda@samsung.com>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_dsi.c

index fd94db6..9f296ce 100644 (file)
@@ -10,6 +10,8 @@
  * published by the Free Software Foundation.
 */
 
+#include <asm/unaligned.h>
+
 #include <drm/drmP.h>
 #include <drm/drm_crtc_helper.h>
 #include <drm/drm_mipi_dsi.h>
@@ -222,12 +224,8 @@ struct exynos_dsi_transfer {
        struct list_head list;
        struct completion completed;
        int result;
-       u8 data_id;
-       u8 data[2];
+       struct mipi_dsi_packet packet;
        u16 flags;
-
-       const u8 *tx_payload;
-       u16 tx_len;
        u16 tx_done;
 
        u8 *rx_payload;
@@ -322,6 +320,7 @@ enum reg_idx {
 static inline void exynos_dsi_write(struct exynos_dsi *dsi, enum reg_idx idx,
                                    u32 val)
 {
+
        writel(val, dsi->reg_base + dsi->driver_data->reg_ofs[idx]);
 }
 
@@ -981,13 +980,14 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi,
                                        struct exynos_dsi_transfer *xfer)
 {
        struct device *dev = dsi->dev;
-       const u8 *payload = xfer->tx_payload + xfer->tx_done;
-       u16 length = xfer->tx_len - xfer->tx_done;
+       struct mipi_dsi_packet *pkt = &xfer->packet;
+       const u8 *payload = pkt->payload + xfer->tx_done;
+       u16 length = pkt->payload_length - xfer->tx_done;
        bool first = !xfer->tx_done;
        u32 reg;
 
        dev_dbg(dev, "< xfer %p: tx len %u, done %u, rx len %u, done %u\n",
-               xfer, xfer->tx_len, xfer->tx_done, xfer->rx_len, xfer->rx_done);
+               xfer, length, xfer->tx_done, xfer->rx_len, xfer->rx_done);
 
        if (length > DSI_TX_FIFO_SIZE)
                length = DSI_TX_FIFO_SIZE;
@@ -996,8 +996,7 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi,
 
        /* Send payload */
        while (length >= 4) {
-               reg = (payload[3] << 24) | (payload[2] << 16)
-                                       | (payload[1] << 8) | payload[0];
+               reg = get_unaligned_le32(payload);
                exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg);
                payload += 4;
                length -= 4;
@@ -1015,16 +1014,13 @@ static void exynos_dsi_send_to_fifo(struct exynos_dsi *dsi,
                reg |= payload[0];
                exynos_dsi_write(dsi, DSIM_PAYLOAD_REG, reg);
                break;
-       case 0:
-               /* Do nothing */
-               break;
        }
 
        /* Send packet header */
        if (!first)
                return;
 
-       reg = (xfer->data[1] << 16) | (xfer->data[0] << 8) | xfer->data_id;
+       reg = get_unaligned_le32(pkt->header);
        if (exynos_dsi_wait_for_hdr_fifo(dsi)) {
                dev_err(dev, "waiting for header FIFO timed out\n");
                return;
@@ -1145,13 +1141,14 @@ again:
 
        spin_unlock_irqrestore(&dsi->transfer_lock, flags);
 
-       if (xfer->tx_len && xfer->tx_done == xfer->tx_len)
+       if (xfer->packet.payload_length &&
+           xfer->tx_done == xfer->packet.payload_length)
                /* waiting for RX */
                return;
 
        exynos_dsi_send_to_fifo(dsi, xfer);
 
-       if (xfer->tx_len || xfer->rx_len)
+       if (xfer->packet.payload_length || xfer->rx_len)
                return;
 
        xfer->result = 0;
@@ -1187,10 +1184,11 @@ static bool exynos_dsi_transfer_finish(struct exynos_dsi *dsi)
        spin_unlock_irqrestore(&dsi->transfer_lock, flags);
 
        dev_dbg(dsi->dev,
-               "> xfer %p, tx_len %u, tx_done %u, rx_len %u, rx_done %u\n",
-               xfer, xfer->tx_len, xfer->tx_done, xfer->rx_len, xfer->rx_done);
+               "> xfer %p, tx_len %zu, tx_done %u, rx_len %u, rx_done %u\n",
+               xfer, xfer->packet.payload_length, xfer->tx_done, xfer->rx_len,
+               xfer->rx_done);
 
-       if (xfer->tx_done != xfer->tx_len)
+       if (xfer->tx_done != xfer->packet.payload_length)
                return true;
 
        if (xfer->rx_done != xfer->rx_len)
@@ -1261,9 +1259,10 @@ static int exynos_dsi_transfer(struct exynos_dsi *dsi,
        wait_for_completion_timeout(&xfer->completed,
                                    msecs_to_jiffies(DSI_XFER_TIMEOUT_MS));
        if (xfer->result == -ETIMEDOUT) {
+               struct mipi_dsi_packet *pkt = &xfer->packet;
                exynos_dsi_remove_transfer(dsi, xfer);
-               dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 2, xfer->data,
-                       xfer->tx_len, xfer->tx_payload);
+               dev_err(dsi->dev, "xfer timed out: %*ph %*ph\n", 4, pkt->header,
+                       (int)pkt->payload_length, pkt->payload);
                return -ETIMEDOUT;
        }
 
@@ -1435,12 +1434,6 @@ static int exynos_dsi_host_detach(struct mipi_dsi_host *host,
        return 0;
 }
 
-/* distinguish between short and long DSI packet types */
-static bool exynos_dsi_is_short_dsi_type(u8 type)
-{
-       return (type & 0x0f) <= 8;
-}
-
 static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host,
                                        const struct mipi_dsi_msg *msg)
 {
@@ -1458,25 +1451,9 @@ static ssize_t exynos_dsi_host_transfer(struct mipi_dsi_host *host,
                dsi->state |= DSIM_STATE_INITIALIZED;
        }
 
-       if (msg->tx_len == 0)
-               return -EINVAL;
-
-       xfer.data_id = msg->type | (msg->channel << 6);
-
-       if (exynos_dsi_is_short_dsi_type(msg->type)) {
-               const char *tx_buf = msg->tx_buf;
-
-               if (msg->tx_len > 2)
-                       return -EINVAL;
-               xfer.tx_len = 0;
-               xfer.data[0] = tx_buf[0];
-               xfer.data[1] = (msg->tx_len == 2) ? tx_buf[1] : 0;
-       } else {
-               xfer.tx_len = msg->tx_len;
-               xfer.data[0] = msg->tx_len & 0xff;
-               xfer.data[1] = msg->tx_len >> 8;
-               xfer.tx_payload = msg->tx_buf;
-       }
+       ret = mipi_dsi_create_packet(&xfer.packet, msg);
+       if (ret < 0)
+               return ret;
 
        xfer.rx_len = msg->rx_len;
        xfer.rx_payload = msg->rx_buf;