pmaports/device/testing/linux-samsung-kiran/0004-sprdfb-fix-mmap-address.patch

386 lines
15 KiB
Diff
Raw Normal View History

From 53f964b0dad5d9b8ede8cefce759d870068a48a6 Mon Sep 17 00:00:00 2001
From: Shinjo Park <peremen@gmail.com>
Date: Tue, 28 Jun 2022 23:47:09 +0200
Subject: [PATCH 4/4] samsung-kiran: Fix sprdfb to get a working screen
* Specify sprdfb memory address so mmap() won't fail
* Apply commit 6632662e89687748f20a023eb443c53d77fc270a from Tizen
(profile/mobile/platform/kernel/linux-3.10-sc7730) to fix broken
ioctl()
---
.../boot/dts/sprd-sc7727-tizen_kiran-r00.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r01.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r02.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r03.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r04.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r05.dtsi | 2 +
.../boot/dts/sprd-sc7727-tizen_kiran-r06.dtsi | 2 +
drivers/video/sprdfb/sprdfb.h | 20 ++++++---
drivers/video/sprdfb/sprdfb_dispc.c | 41 +++++++++++--------
drivers/video/sprdfb/sprdfb_main.c | 22 +++++-----
include/video/sprd_fb.h | 20 +++++++--
11 files changed, 82 insertions(+), 35 deletions(-)
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r00.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r00.dtsi
index 1e92c956..b97ce36d 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r00.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r00.dtsi
@@ -502,6 +502,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r01.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r01.dtsi
index 17bdf44d..90f77984 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r01.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r01.dtsi
@@ -506,6 +506,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r02.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r02.dtsi
index 0507838b..59750f75 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r02.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r02.dtsi
@@ -506,6 +506,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r03.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r03.dtsi
index 0507838b..59750f75 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r03.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r03.dtsi
@@ -506,6 +506,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r04.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r04.dtsi
index 01a6e42c..2b13cbe9 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r04.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r04.dtsi
@@ -506,6 +506,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r05.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r05.dtsi
index 4dd47d23..ab531512 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r05.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r05.dtsi
@@ -511,6 +511,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r06.dtsi b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r06.dtsi
index d8f2cbb7..b6b902e6 100644
--- a/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r06.dtsi
+++ b/arch/arm/boot/dts/sprd-sc7727-tizen_kiran-r06.dtsi
@@ -511,6 +511,8 @@
clocks = <&clk_256m>, <&clk_256m>, <&clk_384m>, <&clk_aon_apb>, <&clk_dispc0>, <&clk_dispc0_dbi>, <&clk_dispc0_dpi>, <&clk_disp_emc>, <&clk_spi2>, <&ext_26m>;
clock-src = <256000000 256000000 384000000>;
dpi_clk_div = <7>;
+ sprd,fb_mem = <0x9efffc00 0x177000>;
+ sprd,fb_display_size = <480 800>;
};
gsp:gsp@20a00000 {
compatible = "sprd,gsp";
diff --git a/drivers/video/sprdfb/sprdfb.h b/drivers/video/sprdfb/sprdfb.h
index 39048eb2..7888aed5 100755
--- a/drivers/video/sprdfb/sprdfb.h
+++ b/drivers/video/sprdfb/sprdfb.h
@@ -112,6 +112,11 @@ enum {
SPRD_DISPLAY_UPDATE_MAX
};
+typedef struct overlay_size {
+ uint16_t hsize;
+ uint16_t vsize;
+} overlay_size;
+
typedef struct overlay_rect {
uint16_t x;
uint16_t y;
@@ -119,13 +124,19 @@ typedef struct overlay_rect {
uint16_t h;
} overlay_rect;
+typedef struct overlay_endian {
+ uint16_t y;
+ uint16_t u;
+ uint16_t v;
+} overlay_endian;
+
typedef struct overlay_info {
int layer_index;
int data_type;
- int y_endian;
- int uv_endian;
- bool rb_switch;
+ overlay_size size;
overlay_rect rect;
+ overlay_endian endian;
+ bool rb_switch;
} overlay_info;
#if defined (CONFIG_DRM_SPRD) && defined (CONFIG_SPRDFB_USE_GEM_INDEX)
@@ -154,8 +165,7 @@ typedef struct overlay_display {
#ifdef SPRDFB_OVERLAY_DEBUG
struct ov_info {
- int y_endian;
- int uv_endian;
+ overlay_endian endian;
int layer_index;
unsigned char *osd_buffer;
unsigned char *img_buffer;
diff --git a/drivers/video/sprdfb/sprdfb_dispc.c b/drivers/video/sprdfb/sprdfb_dispc.c
index b3fbea20..6a071dc4 100644
--- a/drivers/video/sprdfb/sprdfb_dispc.c
+++ b/drivers/video/sprdfb/sprdfb_dispc.c
@@ -1838,9 +1838,11 @@ static int overlay_close(struct sprdfb_device *dev, uint32_t layer_index)
return 0;
}
-static int overlay_img_configure(struct sprdfb_device *dev, int type, overlay_rect *rect, int y_endian, int uv_endian, bool rb_switch)
+static int overlay_img_configure(struct sprdfb_device *dev, int type, overlay_size *size,
+ overlay_rect *rect, overlay_endian *endian, bool rb_switch)
{
uint32_t reg_value;
+ int y_endian = endian->y, u_endian = endian->u, v_endian = endian->v;
pr_debug("sprdfb: [%s] : %d, (%d, %d,%d,%d)\n", __FUNCTION__, type, rect->x, rect->y, rect->h, rect->w);
@@ -1849,15 +1851,16 @@ static int overlay_img_configure(struct sprdfb_device *dev, int type, overlay_re
return -1;
}
- if((y_endian >= SPRD_IMG_DATA_ENDIAN_LIMIT) || (uv_endian >= SPRD_IMG_DATA_ENDIAN_LIMIT)){
- printk(KERN_ERR "sprdfb: Overlay config fail (y, uv endian error)");
+ if((y_endian >= SPRD_IMG_DATA_ENDIAN_LIMIT) || (u_endian >= SPRD_IMG_DATA_ENDIAN_LIMIT) ||
+ (v_endian >= SPRD_IMG_DATA_ENDIAN_LIMIT)){
+ printk(KERN_ERR "sprdfb: Overlay config fail (endian error)");
return -1;
}
dispc_clear_bits(BIT(2), DISPC_OSD_CTRL);
reg_value = dispc_read(DISPC_IMG_CTRL);
- reg_value |= (y_endian << 8)|(uv_endian<< 10)|(type << 4);
+ reg_value |= (y_endian << 8)|(u_endian << 10)|(v_endian << 12)|(type << 4);
if(rb_switch)
reg_value |= (1 << 15);
@@ -1866,7 +1869,7 @@ static int overlay_img_configure(struct sprdfb_device *dev, int type, overlay_re
reg_value = (rect->h << 16) | (rect->w);
dispc_write(reg_value, DISPC_IMG_SIZE_XY);
- dispc_write(rect->w, DISPC_IMG_PITCH);
+ dispc_write(size->hsize, DISPC_IMG_PITCH);
reg_value = (rect->y << 16) | (rect->x);
dispc_write(reg_value, DISPC_IMG_DISP_XY);
@@ -1903,9 +1906,11 @@ static int overlay_img_configure(struct sprdfb_device *dev, int type, overlay_re
return 0;
}
-static int overlay_osd_configure(struct sprdfb_device *dev, int type, overlay_rect *rect, int y_endian, int uv_endian, bool rb_switch)
+static int overlay_osd_configure(struct sprdfb_device *dev, int type, overlay_size *size,
+ overlay_rect *rect, overlay_endian *endian, bool rb_switch)
{
uint32_t reg_value;
+ int y_endian = endian->y;
pr_debug("sprdfb: [%s] : %d, (%d, %d,%d,%d)\n", __FUNCTION__, type, rect->x, rect->y, rect->h, rect->w);
@@ -1931,7 +1936,7 @@ static int overlay_osd_configure(struct sprdfb_device *dev, int type, overlay_re
reg_value = (rect->h << 16) | (rect->w);
dispc_write(reg_value, DISPC_OSD_SIZE_XY);
- dispc_write(rect->w, DISPC_OSD_PITCH);
+ dispc_write(size->hsize, DISPC_OSD_PITCH);
reg_value = (rect->y << 16) | (rect->x);
dispc_write(reg_value, DISPC_OSD_DISP_XY);
@@ -1953,16 +1958,16 @@ static int32_t sprdfb_dispc_enable_overlay(struct sprdfb_device *dev, struct ove
bool is_refresh_lock_down=false;
bool is_clk_enable=false;
- pr_info("%s:layer[%d]type[%d]endian[%d %d]rect[%d %d %d %d]\n",
+ pr_info("%s:layer[%d]type[%d]sz[%d %d]r[%d %d %d %d]endian[%d %d %d]\n",
"set_ovl", info->layer_index, info->data_type,
- info->y_endian, info->uv_endian,
- info->rect.x, info->rect.y, info->rect.w, info->rect.h);
+ info->size.hsize, info->size.vsize,
+ info->rect.x, info->rect.y, info->rect.w, info->rect.h,
+ info->endian.y, info->endian.u, info->endian.v);
dev->dbg_cnt = 3;
#ifdef SPRDFB_OVERLAY_DEBUG
- dev->overlay_data.y_endian = info->y_endian;
- dev->overlay_data.uv_endian = info->uv_endian;
dev->overlay_data.rect = info->rect;
+ dev->overlay_data.endian = info->endian;
#endif
if (NULL == info || ((info->layer_index != SPRD_LAYER_IMG) &&
@@ -1994,12 +1999,16 @@ static int32_t sprdfb_dispc_enable_overlay(struct sprdfb_device *dev, struct ove
#endif
if(SPRD_LAYER_IMG == info->layer_index){
- result = overlay_img_configure(dev, info->data_type, &(info->rect), info->y_endian, info->uv_endian, info->rb_switch);
+ result = overlay_img_configure(dev, info->data_type, &info->size, &info->rect,
+ &info->endian, info->rb_switch);
}else if(SPRD_LAYER_OSD == info->layer_index){
- result = overlay_osd_configure(dev, info->data_type, &(info->rect), info->y_endian, info->uv_endian, info->rb_switch);
+ result = overlay_osd_configure(dev, info->data_type, &info->size, &info->rect,
+ &info->endian, info->rb_switch);
}else if (SPRD_LAYER_BOTH == info->layer_index) {
- result = overlay_osd_configure(dev, info->data_type, &(info->rect), info->y_endian, info->uv_endian, info->rb_switch);
- result = overlay_img_configure(dev, info->data_type, &(info->rect), info->y_endian, info->uv_endian, info->rb_switch);
+ result = overlay_osd_configure(dev, info->data_type, &info->size, &info->rect,
+ &info->endian, info->rb_switch);
+ result = overlay_img_configure(dev, info->data_type, &info->size, &info->rect,
+ &info->endian, info->rb_switch);
}else{
printk(KERN_ERR "sprdfb: sprdfb_dispc_enable_overlay fail. (invalid layer index)\n");
}
diff --git a/drivers/video/sprdfb/sprdfb_main.c b/drivers/video/sprdfb/sprdfb_main.c
index 841d7b9b..0a7eccc7 100755
--- a/drivers/video/sprdfb/sprdfb_main.c
+++ b/drivers/video/sprdfb/sprdfb_main.c
@@ -227,8 +227,8 @@ static int sprdfb_blank(int blank, struct fb_info *info)
static int setup_fb_mem(struct sprdfb_device *dev, struct platform_device *pdev)
{
-#ifdef CONFIG_PAN_DISPLAY
- uint32_t len, addr;
+ uint32_t len;
+ void *addr;
bool use_reserve_mem;
uint32_t reserve_mem[2];
int ret;
@@ -282,11 +282,6 @@ static int setup_fb_mem(struct sprdfb_device *dev, struct platform_device *pdev)
dev->fb->screen_base = (char*)addr;
}
return 0;
-#else
- dev->fb->fix.smem_start = 0;
- dev->fb->fix.smem_len = 0;
- dev->fb->screen_base = 0;
-#endif
}
static void setup_fb_info(struct sprdfb_device *dev)
@@ -449,6 +444,7 @@ static int sprdfb_ioctl(struct fb_info *info, unsigned int cmd,
overlay_display local_overlay_display;
int layer_index;
#endif
+ int power_mode;
void __user *argp = (void __user *)arg;
if(NULL == info){
@@ -530,6 +526,11 @@ static int sprdfb_ioctl(struct fb_info *info, unsigned int cmd,
}
break;
+ case SPRD_FB_SET_POWER_MODE:
+ result = copy_from_user(&power_mode, argp, sizeof(power_mode));
+ printk("sprdfb: [%s]: SPRD_FB_SET_POWER_MODE (%d)\n", __FUNCTION__, power_mode);
+ break;
+
default:
printk(KERN_INFO "sprdfb: [%s]: unknown cmd(%d)\n", __FUNCTION__, cmd);
break;
@@ -647,9 +648,10 @@ static ssize_t sprdfb_overlay_info_show(struct device *dev,
layer_type,
fb_dev->overlay_data.osd_buffer,
fb_dev->overlay_data.img_buffer);
- pos += sprintf(buf+pos, "y_endian[%d], uv_endian[%d], ",
- fb_dev->overlay_data.y_endian,
- fb_dev->overlay_data.uv_endian);
+ pos += sprintf(buf+pos, "y_endian[%d], u_endian[%d], v_endian[%d], ",
+ fb_dev->overlay_data.endian.y,
+ fb_dev->overlay_data.endian.u,
+ fb_dev->overlay_data.endian.v);
pos += sprintf(buf+pos, "dst: x[%d], y[%d], w[%d], h[%d]\n",
fb_dev->overlay_data.rect.x,
fb_dev->overlay_data.rect.y,
diff --git a/include/video/sprd_fb.h b/include/video/sprd_fb.h
index da4631f2..7171230b 100644
--- a/include/video/sprd_fb.h
+++ b/include/video/sprd_fb.h
@@ -41,6 +41,11 @@ enum{
SPRD_DISPLAY_OVERLAY_LIMIT
};
+typedef struct overlay_setting_size {
+ uint16_t hsize;
+ uint16_t vsize;
+} overlay_setting_size;
+
typedef struct overlay_setting_rect {
uint16_t x; //start point - x
uint16_t y; //start point - y
@@ -48,13 +53,19 @@ typedef struct overlay_setting_rect {
uint16_t h; //height
}overlay_setting_rect;
+typedef struct overlay_setting_endian {
+ uint16_t y;
+ uint16_t u;
+ uint16_t v;
+} overlay_setting_endian;
+
typedef struct overlay_setting {
int layer_index;
int data_type;
- int y_endian;
- int uv_endian;
- bool rb_switch;
+ overlay_setting_size size;
overlay_setting_rect rect;
+ overlay_setting_endian endian;
+ bool rb_switch;
} overlay_setting;
typedef struct overlay_display_setting {
@@ -75,5 +86,6 @@ int sprdfb_IOdeinit(void);
#define SPRD_FB_DISPLAY_OVERLAY _IOW(SPRD_FB_IOCTL_MAGIC, 2, unsigned int)
#define SPRD_FB_CHANGE_FPS _IOW(SPRD_FB_IOCTL_MAGIC, 3, unsigned int)
#define SPRD_FB_IS_REFRESH_DONE _IOW(SPRD_FB_IOCTL_MAGIC, 4, unsigned int)
-#define SPRD_FB_UNSET_OVERLAY _IOW(SPRD_FB_IOCTL_MAGIC, 5, unsigned int)
+#define SPRD_FB_SET_POWER_MODE _IOW(SPRD_FB_IOCTL_MAGIC, 5, unsigned int)
+#define SPRD_FB_UNSET_OVERLAY _IOW(SPRD_FB_IOCTL_MAGIC, 6, unsigned int)
#endif
--
2.34.1