diff options
author | Ladislav Michl <ladis@linux-mips.org> | 2018-03-12 19:06:53 +0300 |
---|---|---|
committer | Ben Hutchings <ben@decadent.org.uk> | 2018-12-17 01:08:21 +0300 |
commit | 92d15f40cbb413e8e19ebc709ff3b6473d1de262 (patch) | |
tree | b8ced7c6fb31ede76c39172f140ae2fc6dceeb3a | |
parent | 82d975fad02822493d3aeae56e144d1d99c8f9ad (diff) | |
download | linux-92d15f40cbb413e8e19ebc709ff3b6473d1de262.tar.xz |
video: udlfb: Fix unaligned access
commit 115e77597efcc94cb1f6cbb7df5cf7ce8feb8632 upstream.
Driver generates lots of alignment trap exceptions on ARM.
Fix that by replacing typecasting of odd addresses with
byte shifting and remove uneccessary typecasting.
Signed-off-by: Ladislav Michl <ladis@linux-mips.org>
Cc: Bernie Thompson <bernie@plugable.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com>
[bwh: Backported to 3.16: adjust context]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
-rw-r--r-- | drivers/video/fbdev/udlfb.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/drivers/video/fbdev/udlfb.c b/drivers/video/fbdev/udlfb.c index 13871d5a5ca0..6a503ffc75cc 100644 --- a/drivers/video/fbdev/udlfb.c +++ b/drivers/video/fbdev/udlfb.c @@ -443,9 +443,9 @@ static void dlfb_compress_hline( *cmd++ = 0xAF; *cmd++ = 0x6B; - *cmd++ = (uint8_t) ((dev_addr >> 16) & 0xFF); - *cmd++ = (uint8_t) ((dev_addr >> 8) & 0xFF); - *cmd++ = (uint8_t) ((dev_addr) & 0xFF); + *cmd++ = dev_addr >> 16; + *cmd++ = dev_addr >> 8; + *cmd++ = dev_addr; cmd_pixels_count_byte = cmd++; /* we'll know this later */ cmd_pixel_start = pixel; @@ -462,8 +462,8 @@ static void dlfb_compress_hline( while (pixel < cmd_pixel_end) { const uint16_t * const repeating_pixel = pixel; - *(uint16_t *)cmd = cpu_to_be16p(pixel); - cmd += 2; + *cmd++ = *pixel >> 8; + *cmd++ = *pixel; pixel++; if (unlikely((pixel < cmd_pixel_end) && @@ -1532,15 +1532,16 @@ static int dlfb_parse_vendor_descriptor(struct dlfb_data *dev, u8 length; u16 key; - key = le16_to_cpu(*((u16 *) desc)); - desc += sizeof(u16); - length = *desc; - desc++; + key = *desc++; + key |= (u16)*desc++ << 8; + length = *desc++; switch (key) { case 0x0200: { /* max_area */ - u32 max_area; - max_area = le32_to_cpu(*((u32 *)desc)); + u32 max_area = *desc++; + max_area |= (u32)*desc++ << 8; + max_area |= (u32)*desc++ << 16; + max_area |= (u32)*desc++ << 24; pr_warn("DL chip limited to %d pixel modes\n", max_area); dev->sku_pixel_limit = max_area; |