From a5969cabbb4660eab42b6ef0412cbbd1200cf14d Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Sat, 12 Oct 2024 07:10:09 +0000
Subject: [PATCH] 修改led为gpio
---
kernel/drivers/video/fbdev/sm712fb.c | 67 +++++++++++----------------------
1 files changed, 23 insertions(+), 44 deletions(-)
diff --git a/kernel/drivers/video/fbdev/sm712fb.c b/kernel/drivers/video/fbdev/sm712fb.c
index 1781ca6..092a1ca 100644
--- a/kernel/drivers/video/fbdev/sm712fb.c
+++ b/kernel/drivers/video/fbdev/sm712fb.c
@@ -1047,7 +1047,7 @@
if (count + p > total_size)
count = total_size - p;
- buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
+ buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
@@ -1059,24 +1059,13 @@
while (count) {
c = (count > PAGE_SIZE) ? PAGE_SIZE : count;
dst = buffer;
- for (i = c >> 2; i--;) {
- *dst = fb_readl(src++);
- *dst = big_swap(*dst);
- dst++;
- }
- if (c & 3) {
- u8 *dst8 = (u8 *)dst;
- u8 __iomem *src8 = (u8 __iomem *)src;
+ for (i = (c + 3) >> 2; i--;) {
+ u32 val;
- for (i = c & 3; i--;) {
- if (i & 1) {
- *dst8++ = fb_readb(++src8);
- } else {
- *dst8++ = fb_readb(--src8);
- src8 += 2;
- }
- }
- src = (u32 __iomem *)src8;
+ val = fb_readl(src);
+ *dst = big_swap(val);
+ src++;
+ dst++;
}
if (copy_to_user(buf, buffer, c)) {
@@ -1130,7 +1119,7 @@
count = total_size - p;
}
- buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, GFP_KERNEL);
+ buffer = kmalloc(PAGE_SIZE, GFP_KERNEL);
if (!buffer)
return -ENOMEM;
@@ -1148,23 +1137,10 @@
break;
}
- for (i = c >> 2; i--;) {
- fb_writel(big_swap(*src), dst++);
+ for (i = (c + 3) >> 2; i--;) {
+ fb_writel(big_swap(*src), dst);
+ dst++;
src++;
- }
- if (c & 3) {
- u8 *src8 = (u8 *)src;
- u8 __iomem *dst8 = (u8 __iomem *)dst;
-
- for (i = c & 3; i--;) {
- if (i & 1) {
- fb_writeb(*src8++, ++dst8);
- } else {
- fb_writeb(*src8++, --dst8);
- dst8 += 2;
- }
- }
- dst = (u32 __iomem *)dst8;
}
*ppos += c;
@@ -1369,7 +1345,7 @@
return 0;
}
-static struct fb_ops smtcfb_ops = {
+static const struct fb_ops smtcfb_ops = {
.owner = THIS_MODULE,
.fb_check_var = smtc_check_var,
.fb_set_par = smtc_set_par,
@@ -1540,7 +1516,6 @@
info = framebuffer_alloc(sizeof(*sfb), &pdev->dev);
if (!info) {
- dev_err(&pdev->dev, "framebuffer_alloc failed\n");
err = -ENOMEM;
goto failed_free;
}
@@ -1605,6 +1580,14 @@
sfb->fb->fix.mmio_start = mmio_base;
sfb->fb->fix.mmio_len = 0x00200000;
sfb->dp_regs = ioremap(mmio_base, 0x00200000 + smem_size);
+ if (!sfb->dp_regs) {
+ dev_err(&pdev->dev,
+ "%s: unable to map memory mapped IO!\n",
+ sfb->fb->fix.id);
+ err = -ENOMEM;
+ goto failed_fb;
+ }
+
sfb->lfb = sfb->dp_regs + 0x00200000;
sfb->mmio = (smtc_regbaseaddress =
sfb->dp_regs + 0x000c0000);
@@ -1617,7 +1600,7 @@
default:
dev_err(&pdev->dev,
"No valid Silicon Motion display chip was detected!\n");
-
+ err = -ENODEV;
goto failed_fb;
}
@@ -1697,10 +1680,8 @@
static int __maybe_unused smtcfb_pci_suspend(struct device *device)
{
- struct pci_dev *pdev = to_pci_dev(device);
- struct smtcfb_info *sfb;
+ struct smtcfb_info *sfb = dev_get_drvdata(device);
- sfb = pci_get_drvdata(pdev);
/* set the hw in sleep mode use external clock and self memory refresh
* so that we can turn off internal PLLs later on
@@ -1720,10 +1701,8 @@
static int __maybe_unused smtcfb_pci_resume(struct device *device)
{
- struct pci_dev *pdev = to_pci_dev(device);
- struct smtcfb_info *sfb;
+ struct smtcfb_info *sfb = dev_get_drvdata(device);
- sfb = pci_get_drvdata(pdev);
/* reinit hardware */
sm7xx_init_hw();
--
Gitblit v1.6.2