blob: d622d65b6ceee2834b5070c1282952b3b7a81545 [file] [log] [blame]
Mike Rapoport67088d42015-09-22 12:01:16 +03001#include <linux/module.h>
2#include <linux/kernel.h>
3#include <linux/errno.h>
4#include <linux/string.h>
5#include <linux/mm.h>
6#include <linux/slab.h>
7#include <linux/delay.h>
8#include <linux/fb.h>
9#include <linux/ioport.h>
10#include <linux/init.h>
11#include <linux/pci.h>
12#include <linux/vmalloc.h>
13#include <linux/pagemap.h>
Sudip Mukherjee81dee672015-03-03 16:21:06 +053014#include <linux/console.h>
Mike Rapoport67088d42015-09-22 12:01:16 +030015#include <linux/platform_device.h>
16#include <linux/screen_info.h>
Sudip Mukherjee81dee672015-03-03 16:21:06 +053017
18#include "sm750.h"
Sudip Mukherjee81dee672015-03-03 16:21:06 +053019#include "sm750_cursor.h"
20
21
Sudip Mukherjee81dee672015-03-03 16:21:06 +053022
Isaac Assegaic97b2c12015-06-02 03:14:26 -070023#define POKE32(addr, data) \
24writel((data), cursor->mmio + (addr))
Sudip Mukherjee81dee672015-03-03 16:21:06 +053025
26/* cursor control for voyager and 718/750*/
27#define HWC_ADDRESS 0x0
Mike Rapoport672f75b2016-02-15 19:53:54 +020028#define HWC_ADDRESS_ENABLE BIT(31)
29#define HWC_ADDRESS_EXT BIT(27)
30#define HWC_ADDRESS_CS BIT(26)
31#define HWC_ADDRESS_ADDRESS_MASK 0x3ffffff
Sudip Mukherjee81dee672015-03-03 16:21:06 +053032
33#define HWC_LOCATION 0x4
Mike Rapoportfe3bd262016-02-15 19:53:55 +020034#define HWC_LOCATION_TOP BIT(27)
35#define HWC_LOCATION_Y_SHIFT 16
36#define HWC_LOCATION_Y_MASK (0x7ff << 16)
37#define HWC_LOCATION_LEFT BIT(11)
38#define HWC_LOCATION_X_MASK 0x7ff
Sudip Mukherjee81dee672015-03-03 16:21:06 +053039
40#define HWC_COLOR_12 0x8
Mike Rapoport6aa178e2016-02-15 19:53:56 +020041#define HWC_COLOR_12_2_RGB565_SHIFT 16
42#define HWC_COLOR_12_2_RGB565_MASK (0xffff << 16)
43#define HWC_COLOR_12_1_RGB565_MASK 0xffff
Sudip Mukherjee81dee672015-03-03 16:21:06 +053044
45#define HWC_COLOR_3 0xC
Mike Rapoport6aa178e2016-02-15 19:53:56 +020046#define HWC_COLOR_3_RGB565_MASK 0xffff
Sudip Mukherjee81dee672015-03-03 16:21:06 +053047
48
49/* hw_cursor_xxx works for voyager,718 and 750 */
Greg Donaldeb0f4272015-06-18 15:06:56 -050050void hw_cursor_enable(struct lynx_cursor *cursor)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053051{
52 u32 reg;
Juston Li40403c12015-07-14 21:14:48 -070053
Mike Rapoport672f75b2016-02-15 19:53:54 +020054 reg = (cursor->offset & HWC_ADDRESS_ADDRESS_MASK) | HWC_ADDRESS_ENABLE;
Isaac Assegaic97b2c12015-06-02 03:14:26 -070055 POKE32(HWC_ADDRESS, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053056}
Greg Donaldeb0f4272015-06-18 15:06:56 -050057void hw_cursor_disable(struct lynx_cursor *cursor)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053058{
Isaac Assegaic97b2c12015-06-02 03:14:26 -070059 POKE32(HWC_ADDRESS, 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053060}
61
Greg Donaldeb0f4272015-06-18 15:06:56 -050062void hw_cursor_setSize(struct lynx_cursor *cursor,
Isaac Assegaic97b2c12015-06-02 03:14:26 -070063 int w, int h)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053064{
65 cursor->w = w;
66 cursor->h = h;
67}
Greg Donaldeb0f4272015-06-18 15:06:56 -050068void hw_cursor_setPos(struct lynx_cursor *cursor,
Isaac Assegaic97b2c12015-06-02 03:14:26 -070069 int x, int y)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053070{
71 u32 reg;
Juston Li40403c12015-07-14 21:14:48 -070072
Mike Rapoportfe3bd262016-02-15 19:53:55 +020073 reg = (((y << HWC_LOCATION_Y_SHIFT) & HWC_LOCATION_Y_MASK) |
74 (x & HWC_LOCATION_X_MASK));
Isaac Assegaic97b2c12015-06-02 03:14:26 -070075 POKE32(HWC_LOCATION, reg);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053076}
Greg Donaldeb0f4272015-06-18 15:06:56 -050077void hw_cursor_setColor(struct lynx_cursor *cursor,
Isaac Assegaic97b2c12015-06-02 03:14:26 -070078 u32 fg, u32 bg)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053079{
Mike Rapoport6aa178e2016-02-15 19:53:56 +020080 u32 reg = (fg << HWC_COLOR_12_2_RGB565_SHIFT) &
81 HWC_COLOR_12_2_RGB565_MASK;
82
83 POKE32(HWC_COLOR_12, reg | (bg & HWC_COLOR_12_1_RGB565_MASK));
Isaac Assegaic97b2c12015-06-02 03:14:26 -070084 POKE32(HWC_COLOR_3, 0xffe0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053085}
86
Greg Donaldeb0f4272015-06-18 15:06:56 -050087void hw_cursor_setData(struct lynx_cursor *cursor,
Yash Shahcc6c16d2015-08-14 06:06:13 +000088 u16 rop, const u8 *pcol, const u8 *pmsk)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053089{
Isaac Assegaic97b2c12015-06-02 03:14:26 -070090 int i, j, count, pitch, offset;
91 u8 color, mask, opr;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053092 u16 data;
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +000093 void __iomem *pbuffer, *pstart;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053094
95 /* in byte*/
96 pitch = cursor->w >> 3;
97
98 /* in byte */
99 count = pitch * cursor->h;
100
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000101 /* in byte */
102 offset = cursor->maxW * 2 / 8;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530103
104 data = 0;
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000105 pstart = cursor->vstart;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530106 pbuffer = pstart;
107
Juston Li259fef32015-07-14 21:14:45 -0700108 for (i = 0; i < count; i++) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530109 color = *pcol++;
110 mask = *pmsk++;
111 data = 0;
112
Juston Liadbb90e2015-07-14 21:14:42 -0700113 for (j = 0; j < 8; j++) {
Juston Li8c11f5a2015-07-14 21:14:35 -0700114 if (mask & (0x80>>j)) {
Juston Li9ccc5f42015-07-14 21:14:33 -0700115 if (rop == ROP_XOR)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530116 opr = mask ^ color;
117 else
118 opr = mask & color;
119
120 /* 2 stands for forecolor and 1 for backcolor */
121 data |= ((opr & (0x80>>j))?2:1)<<(j*2);
122 }
123 }
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000124 iowrite16(data, pbuffer);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530125
126 /* assume pitch is 1,2,4,8,...*/
Othmar Pasteka04c73f22015-11-08 11:58:51 +0100127 if ((i + 1) % pitch == 0) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530128 /* need a return */
129 pstart += offset;
130 pbuffer = pstart;
Juston Li6338a7812015-07-14 21:14:36 -0700131 } else {
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000132 pbuffer += sizeof(u16);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530133 }
134
135 }
136
137
138}
139
140
Greg Donaldeb0f4272015-06-18 15:06:56 -0500141void hw_cursor_setData2(struct lynx_cursor *cursor,
Yash Shahcc6c16d2015-08-14 06:06:13 +0000142 u16 rop, const u8 *pcol, const u8 *pmsk)
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530143{
Isaac Assegaic97b2c12015-06-02 03:14:26 -0700144 int i, j, count, pitch, offset;
Sudip Mukherjee041d3a42015-03-10 22:46:53 +0530145 u8 color, mask;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530146 u16 data;
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000147 void __iomem *pbuffer, *pstart;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530148
149 /* in byte*/
150 pitch = cursor->w >> 3;
151
152 /* in byte */
153 count = pitch * cursor->h;
154
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000155 /* in byte */
156 offset = cursor->maxW * 2 / 8;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530157
158 data = 0;
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000159 pstart = cursor->vstart;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530160 pbuffer = pstart;
161
Juston Li259fef32015-07-14 21:14:45 -0700162 for (i = 0; i < count; i++) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530163 color = *pcol++;
164 mask = *pmsk++;
165 data = 0;
166
Juston Liadbb90e2015-07-14 21:14:42 -0700167 for (j = 0; j < 8; j++) {
Juston Li9ccc5f42015-07-14 21:14:33 -0700168 if (mask & (1<<j))
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530169 data |= ((color & (1<<j))?1:2)<<(j*2);
170 }
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000171 iowrite16(data, pbuffer);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530172
173 /* assume pitch is 1,2,4,8,...*/
Juston Li259fef32015-07-14 21:14:45 -0700174 if (!(i&(pitch-1))) {
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530175 /* need a return */
176 pstart += offset;
177 pbuffer = pstart;
Juston Li6338a7812015-07-14 21:14:36 -0700178 } else {
Lorenzo Stoakes35fb80b2015-03-20 15:22:14 +0000179 pbuffer += sizeof(u16);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530180 }
181
182 }
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530183}