diff options
| author | Koen Kooi <koen@dominion.thruhere.net> | 2012-05-16 15:27:00 +0200 |
|---|---|---|
| committer | Denys Dmytriyenko <denys@ti.com> | 2012-05-17 14:28:18 -0400 |
| commit | 0fbf85083fe97d75f81eaa3218856133feb104f8 (patch) | |
| tree | 7ce705825b6bd97040a6a915efe22b8414a1e1f2 | |
| parent | a334f160ea27ed8f671b14c9cf9c7620af8d9297 (diff) | |
| download | meta-ti-0fbf85083fe97d75f81eaa3218856133feb104f8.tar.gz | |
linux-ti33x-psp 3.2: make st7735fb DMA safe
Signed-off-by: Koen Kooi <koen@dominion.thruhere.net>
Signed-off-by: Denys Dmytriyenko <denys@ti.com>
| -rw-r--r-- | recipes-kernel/linux/linux-ti33x-psp-3.2/beaglebone/0043-st7735fb-Working-WIP-changes-to-make-DMA-safe-and-ad.patch | 143 | ||||
| -rw-r--r-- | recipes-kernel/linux/linux-ti33x-psp_3.2.bb | 3 |
2 files changed, 145 insertions, 1 deletions
diff --git a/recipes-kernel/linux/linux-ti33x-psp-3.2/beaglebone/0043-st7735fb-Working-WIP-changes-to-make-DMA-safe-and-ad.patch b/recipes-kernel/linux/linux-ti33x-psp-3.2/beaglebone/0043-st7735fb-Working-WIP-changes-to-make-DMA-safe-and-ad.patch new file mode 100644 index 00000000..5e4b6b35 --- /dev/null +++ b/recipes-kernel/linux/linux-ti33x-psp-3.2/beaglebone/0043-st7735fb-Working-WIP-changes-to-make-DMA-safe-and-ad.patch | |||
| @@ -0,0 +1,143 @@ | |||
| 1 | From 783a66842e956b2eb9d7dc379848fbf79a370bc8 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Matt Porter <mporter@ti.com> | ||
| 3 | Date: Wed, 28 Mar 2012 23:35:44 -0400 | ||
| 4 | Subject: [PATCH] st7735fb: Working WIP changes to make DMA safe and add | ||
| 5 | endian fix | ||
| 6 | |||
| 7 | This removes the "from the stack" allocation of 1 byte buffers | ||
| 8 | that was a temporary thing and isn't dma safe. Now vmallocs the | ||
| 9 | user buffer to be deferred I/O safe and kmallocs a swapped | ||
| 10 | shadow buffer to support the byte swabbing hack to fix userspace | ||
| 11 | limitations. | ||
| 12 | |||
| 13 | The buffer allocation and endian hack code needs some serious | ||
| 14 | cleanup as on big endian systems if would fail miserably atm. | ||
| 15 | However, the LE path works for the moment so people can do something | ||
| 16 | with the driver. | ||
| 17 | |||
| 18 | Signed-off-by: Matt Porter <mporter@ti.com> | ||
| 19 | --- | ||
| 20 | drivers/video/st7735fb.c | 49 ++++++++++++++++++++++++++++++---------------- | ||
| 21 | include/video/st7735fb.h | 2 + | ||
| 22 | 2 files changed, 34 insertions(+), 17 deletions(-) | ||
| 23 | |||
| 24 | diff --git a/drivers/video/st7735fb.c b/drivers/video/st7735fb.c | ||
| 25 | index 500cc88..0931ca2 100644 | ||
| 26 | --- a/drivers/video/st7735fb.c | ||
| 27 | +++ b/drivers/video/st7735fb.c | ||
| 28 | @@ -145,11 +145,9 @@ static struct fb_var_screeninfo st7735fb_var __devinitdata = { | ||
| 29 | |||
| 30 | static int st7735_write(struct st7735fb_par *par, u8 data) | ||
| 31 | { | ||
| 32 | - u8 txbuf[2]; /* allocation from stack must go */ | ||
| 33 | + par->buf[0] = data; | ||
| 34 | |||
| 35 | - txbuf[0] = data; | ||
| 36 | - | ||
| 37 | - return spi_write(par->spi, &txbuf[0], 1); | ||
| 38 | + return spi_write(par->spi, par->buf, 1); | ||
| 39 | } | ||
| 40 | |||
| 41 | static void st7735_write_data(struct st7735fb_par *par, u8 data) | ||
| 42 | @@ -243,16 +241,17 @@ static void st7735_reset(struct st7735fb_par *par) | ||
| 43 | static void st7735fb_update_display(struct st7735fb_par *par) | ||
| 44 | { | ||
| 45 | int ret = 0; | ||
| 46 | - u8 *vmem = par->info->screen_base; | ||
| 47 | - | ||
| 48 | - /* | ||
| 49 | - TODO: | ||
| 50 | - Allow a subset of pages to be passed in | ||
| 51 | - (for deferred I/O). Check pages against | ||
| 52 | - pan display settings to see if they | ||
| 53 | - should be updated. | ||
| 54 | - */ | ||
| 55 | - /* For now, just write the full 40KiB on each update */ | ||
| 56 | + u16 *vmem; | ||
| 57 | +#ifdef __LITTLE_ENDIAN | ||
| 58 | + int i; | ||
| 59 | + u16 *vmem16 = (u16 *)par->info->screen_base; | ||
| 60 | + vmem = par->ssbuf; | ||
| 61 | + | ||
| 62 | + for (i=0; i<WIDTH*HEIGHT*BPP/8/2; i++) | ||
| 63 | + vmem[i] = swab16(vmem16[i]); | ||
| 64 | +#else | ||
| 65 | + vmem = (u16 *)par->info->screen_base; | ||
| 66 | +#endif | ||
| 67 | |||
| 68 | /* Set row/column data window */ | ||
| 69 | st7735_set_addr_win(par, 0, 0, WIDTH-1, HEIGHT-1); | ||
| 70 | @@ -261,7 +260,7 @@ static void st7735fb_update_display(struct st7735fb_par *par) | ||
| 71 | st7735_write_cmd(par, ST7735_RAMWR); | ||
| 72 | |||
| 73 | /* Blast framebuffer to ST7735 internal display RAM */ | ||
| 74 | - ret = st7735_write_data_buf(par, vmem, WIDTH*HEIGHT*BPP/8); | ||
| 75 | + ret = st7735_write_data_buf(par, (u8 *)vmem, WIDTH*HEIGHT*BPP/8); | ||
| 76 | if (ret < 0) | ||
| 77 | pr_err("%s: spi_write failed to update display buffer\n", | ||
| 78 | par->info->fix.id); | ||
| 79 | @@ -369,7 +368,7 @@ static struct fb_ops st7735fb_ops = { | ||
| 80 | }; | ||
| 81 | |||
| 82 | static struct fb_deferred_io st7735fb_defio = { | ||
| 83 | - .delay = HZ, | ||
| 84 | + .delay = HZ/20, | ||
| 85 | .deferred_io = st7735fb_deferred_io, | ||
| 86 | }; | ||
| 87 | |||
| 88 | @@ -395,7 +394,11 @@ static int __devinit st7735fb_probe (struct spi_device *spi) | ||
| 89 | return -EINVAL; | ||
| 90 | } | ||
| 91 | |||
| 92 | - vmem = vzalloc(vmem_size); | ||
| 93 | +#ifdef __LITTLE_ENDIAN | ||
| 94 | + vmem = (u8 *)vmalloc(vmem_size); | ||
| 95 | +#else | ||
| 96 | + vmem = (u8 *)kmalloc(vmem_size, GFP_KERNEL); | ||
| 97 | +#endif | ||
| 98 | if (!vmem) | ||
| 99 | return retval; | ||
| 100 | |||
| 101 | @@ -431,6 +434,14 @@ static int __devinit st7735fb_probe (struct spi_device *spi) | ||
| 102 | par->spi = spi; | ||
| 103 | par->rst = pdata->rst_gpio; | ||
| 104 | par->dc = pdata->dc_gpio; | ||
| 105 | + par->buf = kmalloc(1, GFP_KERNEL); | ||
| 106 | + | ||
| 107 | +#ifdef __LITTLE_ENDIAN | ||
| 108 | + /* Allocated swapped shadow buffer */ | ||
| 109 | + par->ssbuf = kmalloc(vmem_size, GFP_KERNEL); | ||
| 110 | + if (!par->ssbuf) | ||
| 111 | + return retval; | ||
| 112 | +#endif | ||
| 113 | |||
| 114 | retval = register_framebuffer(info); | ||
| 115 | if (retval < 0) | ||
| 116 | @@ -457,7 +468,11 @@ fbreg_fail: | ||
| 117 | framebuffer_release(info); | ||
| 118 | |||
| 119 | fballoc_fail: | ||
| 120 | +#ifdef __LITTLE_ENDIAN | ||
| 121 | vfree(vmem); | ||
| 122 | +#else | ||
| 123 | + kfree(vmem); | ||
| 124 | +#endif | ||
| 125 | |||
| 126 | return retval; | ||
| 127 | } | ||
| 128 | diff --git a/include/video/st7735fb.h b/include/video/st7735fb.h | ||
| 129 | index 250f036..e99cd05 100644 | ||
| 130 | --- a/include/video/st7735fb.h | ||
| 131 | +++ b/include/video/st7735fb.h | ||
| 132 | @@ -36,6 +36,8 @@ struct st7735fb_par { | ||
| 133 | struct fb_info *info; | ||
| 134 | int rst; | ||
| 135 | int dc; | ||
| 136 | + u16 *ssbuf; | ||
| 137 | + u8 *buf; | ||
| 138 | }; | ||
| 139 | |||
| 140 | struct st7735fb_platform_data { | ||
| 141 | -- | ||
| 142 | 1.7.7.6 | ||
| 143 | |||
diff --git a/recipes-kernel/linux/linux-ti33x-psp_3.2.bb b/recipes-kernel/linux/linux-ti33x-psp_3.2.bb index 05772b4a..bb26c70f 100644 --- a/recipes-kernel/linux/linux-ti33x-psp_3.2.bb +++ b/recipes-kernel/linux/linux-ti33x-psp_3.2.bb | |||
| @@ -12,7 +12,7 @@ MULTI_CONFIG_BASE_SUFFIX = "" | |||
| 12 | 12 | ||
| 13 | BRANCH = "v3.2-staging" | 13 | BRANCH = "v3.2-staging" |
| 14 | SRCREV = "720e07b4c1f687b61b147b31c698cb6816d72f01" | 14 | SRCREV = "720e07b4c1f687b61b147b31c698cb6816d72f01" |
| 15 | MACHINE_KERNEL_PR_append = "i+gitr${SRCREV}" | 15 | MACHINE_KERNEL_PR_append = "j+gitr${SRCREV}" |
| 16 | 16 | ||
| 17 | COMPATIBLE_MACHINE = "(ti33x)" | 17 | COMPATIBLE_MACHINE = "(ti33x)" |
| 18 | 18 | ||
| @@ -967,5 +967,6 @@ PATCHES_OVER_PSP = " \ | |||
| 967 | file://beaglebone/0038-board-am335xevm.c-Beaglebone-expose-all-pwms-through.patch \ | 967 | file://beaglebone/0038-board-am335xevm.c-Beaglebone-expose-all-pwms-through.patch \ |
| 968 | file://beaglebone/0039-ARM-OMAP-Mux-Fixed-debugfs-mux-output-always-reporti.patch \ | 968 | file://beaglebone/0039-ARM-OMAP-Mux-Fixed-debugfs-mux-output-always-reporti.patch \ |
| 969 | file://beaglebone/0040-beaglebone-export-SPI2-as-spidev-when-no-capes-are-u.patch \ | 969 | file://beaglebone/0040-beaglebone-export-SPI2-as-spidev-when-no-capes-are-u.patch \ |
| 970 | file://beaglebone/0043-st7735fb-Working-WIP-changes-to-make-DMA-safe-and-ad.patch \ | ||
| 970 | file://beaglebone/0001-arm-boot-compressed-default-asm-arch-to-armv7-a.patch \ | 971 | file://beaglebone/0001-arm-boot-compressed-default-asm-arch-to-armv7-a.patch \ |
| 971 | " | 972 | " |
