mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-19 09:04:57 +00:00
449fcf3ab0
Here is the "big" staging and IIO driver update for 4.15-rc1. Lots and lots of little changes, almost all minor code cleanups as the Outreachy application process happened during this development cycle. Also happened was a lot of IIO driver activity, and the typec USB code moving out of staging to drivers/usb (same commits are in the USB tree on a persistent branch to not cause merge issues.) Overall, it's a wash, I think we added a few hundred more lines than removed, but really only a few thousand were modified at all. All of these have been in linux-next for a while. There might be a merge issue with Al's vfs tree in the pi433 driver (take his changes, they are always better), and the media tree with some of the odd atomisp cleanups (take the media tree's version). Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> -----BEGIN PGP SIGNATURE----- iG0EABECAC0WIQT0tgzFv3jCIUoxPcsxR9QN2y37KQUCWgnFrg8cZ3JlZ0Brcm9h aC5jb20ACgkQMUfUDdst+ymxbwCgtNlBkqD2JJYpLRKvI/C4w1vzZsEAnA2THRkt g3ioPBqmqC/2DSbldr2o =/ebw -----END PGP SIGNATURE----- Merge tag 'staging-4.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging Pull staging and IIO updates from Greg KH: "Here is the "big" staging and IIO driver update for 4.15-rc1. Lots and lots of little changes, almost all minor code cleanups as the Outreachy application process happened during this development cycle. Also happened was a lot of IIO driver activity, and the typec USB code moving out of staging to drivers/usb (same commits are in the USB tree on a persistent branch to not cause merge issues.) Overall, it's a wash, I think we added a few hundred more lines than removed, but really only a few thousand were modified at all. All of these have been in linux-next for a while. There might be a merge issue with Al's vfs tree in the pi433 driver (take his changes, they are always better), and the media tree with some of the odd atomisp cleanups (take the media tree's version)" * tag 'staging-4.15-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging: (507 commits) staging: lustre: add SPDX identifiers to all lustre files staging: greybus: Remove redundant license text staging: greybus: add SPDX identifiers to all greybus driver files staging: ccree: simplify ioread/iowrite staging: ccree: simplify registers access staging: ccree: simplify error handling logic staging: ccree: remove dead code staging: ccree: handle limiting of DMA masks staging: ccree: copy IV to DMAable memory staging: fbtft: remove redundant initialization of buf staging: sm750fb: Fix parameter mistake in poke32 staging: wilc1000: Fix bssid buffer offset in Txq staging: fbtft: fb_ssd1331: fix mirrored display staging: android: Fix checkpatch.pl error staging: greybus: loopback: convert loopback to use generic async operations staging: greybus: operation: add private data with get/set accessors staging: greybus: loopback: Fix iteration count on async path staging: greybus: loopback: Hold per-connection mutex across operations staging: greybus/loopback: use ktime_get() for time intervals staging: fsl-dpaa2/eth: Extra headroom in RX buffers ...
176 lines
4 KiB
C
176 lines
4 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
#include <linux/module.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/errno.h>
|
|
#include <linux/string.h>
|
|
#include <linux/mm.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/delay.h>
|
|
#include <linux/fb.h>
|
|
#include <linux/ioport.h>
|
|
#include <linux/init.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/vmalloc.h>
|
|
#include <linux/pagemap.h>
|
|
#include <linux/console.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/screen_info.h>
|
|
|
|
#include "sm750.h"
|
|
#include "sm750_cursor.h"
|
|
|
|
#define poke32(addr, data) \
|
|
writel((data), cursor->mmio + (addr))
|
|
|
|
/* cursor control for voyager and 718/750*/
|
|
#define HWC_ADDRESS 0x0
|
|
#define HWC_ADDRESS_ENABLE BIT(31)
|
|
#define HWC_ADDRESS_EXT BIT(27)
|
|
#define HWC_ADDRESS_CS BIT(26)
|
|
#define HWC_ADDRESS_ADDRESS_MASK 0x3ffffff
|
|
|
|
#define HWC_LOCATION 0x4
|
|
#define HWC_LOCATION_TOP BIT(27)
|
|
#define HWC_LOCATION_Y_SHIFT 16
|
|
#define HWC_LOCATION_Y_MASK (0x7ff << 16)
|
|
#define HWC_LOCATION_LEFT BIT(11)
|
|
#define HWC_LOCATION_X_MASK 0x7ff
|
|
|
|
#define HWC_COLOR_12 0x8
|
|
#define HWC_COLOR_12_2_RGB565_SHIFT 16
|
|
#define HWC_COLOR_12_2_RGB565_MASK (0xffff << 16)
|
|
#define HWC_COLOR_12_1_RGB565_MASK 0xffff
|
|
|
|
#define HWC_COLOR_3 0xC
|
|
#define HWC_COLOR_3_RGB565_MASK 0xffff
|
|
|
|
/* hw_cursor_xxx works for voyager,718 and 750 */
|
|
void sm750_hw_cursor_enable(struct lynx_cursor *cursor)
|
|
{
|
|
u32 reg;
|
|
|
|
reg = (cursor->offset & HWC_ADDRESS_ADDRESS_MASK) | HWC_ADDRESS_ENABLE;
|
|
poke32(HWC_ADDRESS, reg);
|
|
}
|
|
|
|
void sm750_hw_cursor_disable(struct lynx_cursor *cursor)
|
|
{
|
|
poke32(HWC_ADDRESS, 0);
|
|
}
|
|
|
|
void sm750_hw_cursor_setSize(struct lynx_cursor *cursor, int w, int h)
|
|
{
|
|
cursor->w = w;
|
|
cursor->h = h;
|
|
}
|
|
|
|
void sm750_hw_cursor_setPos(struct lynx_cursor *cursor, int x, int y)
|
|
{
|
|
u32 reg;
|
|
|
|
reg = ((y << HWC_LOCATION_Y_SHIFT) & HWC_LOCATION_Y_MASK) |
|
|
(x & HWC_LOCATION_X_MASK);
|
|
poke32(HWC_LOCATION, reg);
|
|
}
|
|
|
|
void sm750_hw_cursor_setColor(struct lynx_cursor *cursor, u32 fg, u32 bg)
|
|
{
|
|
u32 reg = (fg << HWC_COLOR_12_2_RGB565_SHIFT) &
|
|
HWC_COLOR_12_2_RGB565_MASK;
|
|
|
|
poke32(HWC_COLOR_12, reg | (bg & HWC_COLOR_12_1_RGB565_MASK));
|
|
poke32(HWC_COLOR_3, 0xffe0);
|
|
}
|
|
|
|
void sm750_hw_cursor_setData(struct lynx_cursor *cursor, u16 rop,
|
|
const u8 *pcol, const u8 *pmsk)
|
|
{
|
|
int i, j, count, pitch, offset;
|
|
u8 color, mask, opr;
|
|
u16 data;
|
|
void __iomem *pbuffer, *pstart;
|
|
|
|
/* in byte*/
|
|
pitch = cursor->w >> 3;
|
|
|
|
/* in byte */
|
|
count = pitch * cursor->h;
|
|
|
|
/* in byte */
|
|
offset = cursor->maxW * 2 / 8;
|
|
|
|
data = 0;
|
|
pstart = cursor->vstart;
|
|
pbuffer = pstart;
|
|
|
|
for (i = 0; i < count; i++) {
|
|
color = *pcol++;
|
|
mask = *pmsk++;
|
|
data = 0;
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
if (mask & (0x80 >> j)) {
|
|
if (rop == ROP_XOR)
|
|
opr = mask ^ color;
|
|
else
|
|
opr = mask & color;
|
|
|
|
/* 2 stands for forecolor and 1 for backcolor */
|
|
data |= ((opr & (0x80 >> j)) ? 2 : 1) << (j * 2);
|
|
}
|
|
}
|
|
iowrite16(data, pbuffer);
|
|
|
|
/* assume pitch is 1,2,4,8,...*/
|
|
if ((i + 1) % pitch == 0) {
|
|
/* need a return */
|
|
pstart += offset;
|
|
pbuffer = pstart;
|
|
} else {
|
|
pbuffer += sizeof(u16);
|
|
}
|
|
}
|
|
}
|
|
|
|
void sm750_hw_cursor_setData2(struct lynx_cursor *cursor, u16 rop,
|
|
const u8 *pcol, const u8 *pmsk)
|
|
{
|
|
int i, j, count, pitch, offset;
|
|
u8 color, mask;
|
|
u16 data;
|
|
void __iomem *pbuffer, *pstart;
|
|
|
|
/* in byte*/
|
|
pitch = cursor->w >> 3;
|
|
|
|
/* in byte */
|
|
count = pitch * cursor->h;
|
|
|
|
/* in byte */
|
|
offset = cursor->maxW * 2 / 8;
|
|
|
|
data = 0;
|
|
pstart = cursor->vstart;
|
|
pbuffer = pstart;
|
|
|
|
for (i = 0; i < count; i++) {
|
|
color = *pcol++;
|
|
mask = *pmsk++;
|
|
data = 0;
|
|
|
|
for (j = 0; j < 8; j++) {
|
|
if (mask & (1 << j))
|
|
data |= ((color & (1 << j)) ? 1 : 2) << (j * 2);
|
|
}
|
|
iowrite16(data, pbuffer);
|
|
|
|
/* assume pitch is 1,2,4,8,...*/
|
|
if (!(i & (pitch - 1))) {
|
|
/* need a return */
|
|
pstart += offset;
|
|
pbuffer = pstart;
|
|
} else {
|
|
pbuffer += sizeof(u16);
|
|
}
|
|
}
|
|
}
|