提交 afbb9d8d 编写于 作者: K Kristoffer Ericson 提交者: Linus Torvalds

fbdev: update s1d13xxxfb to differ between revisions and production ids

The s1d13xxx chip provides two values of identification value: the
Production id (e.g 13506/13505/13806..) and a revision number 0,1,2,3).
Together these can help us to differentiate between similiar setups.

This patch adds the proper way of grabbing both those values and save them
for future reference (in order to decide what functions a card supports,
e.g acceleration).

We also move away from the concept of all s1d13xxx = s1d13806 when we
really support alot more.

[akpm@linux-foundation.org: coding-style fixes]
[akpm@linux-foundation.org: simplify s1d13xxxfb_probe()]
Signed-off-by: Kristoffer Ericson <kristoffer.ericson@gmail.com
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
上级 91ad1203
...@@ -50,9 +50,22 @@ ...@@ -50,9 +50,22 @@
#define dbg(fmt, args...) do { } while (0) #define dbg(fmt, args...) do { } while (0)
#endif #endif
static const int __devinitconst s1d13xxxfb_revisions[] = { /*
S1D13506_CHIP_REV, /* Rev.4 on HP Jornada 7xx S1D13506 */ * List of card production ids
S1D13806_CHIP_REV, /* Rev.7 on .. */ */
static const int s1d13xxxfb_prod_ids[] = {
S1D13505_PROD_ID,
S1D13506_PROD_ID,
S1D13806_PROD_ID,
};
/*
* List of card strings
*/
static const char *s1d13xxxfb_prod_names[] = {
"S1D13505",
"S1D13506",
"S1D13806",
}; };
/* /*
...@@ -377,7 +390,6 @@ s1d13xxxfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) ...@@ -377,7 +390,6 @@ s1d13xxxfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
return 0; return 0;
} }
/* framebuffer information structures */ /* framebuffer information structures */
static struct fb_ops s1d13xxxfb_fbops = { static struct fb_ops s1d13xxxfb_fbops = {
...@@ -544,7 +556,7 @@ s1d13xxxfb_probe(struct platform_device *pdev) ...@@ -544,7 +556,7 @@ s1d13xxxfb_probe(struct platform_device *pdev)
struct s1d13xxxfb_pdata *pdata = NULL; struct s1d13xxxfb_pdata *pdata = NULL;
int ret = 0; int ret = 0;
int i; int i;
u8 revision; u8 revision, prod_id;
dbg("probe called: device is %p\n", pdev); dbg("probe called: device is %p\n", pdev);
...@@ -613,19 +625,31 @@ s1d13xxxfb_probe(struct platform_device *pdev) ...@@ -613,19 +625,31 @@ s1d13xxxfb_probe(struct platform_device *pdev)
goto bail; goto bail;
} }
revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2; /* production id is top 6 bits */
prod_id = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2;
/* revision id is lower 2 bits */
revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) & 0x3;
ret = -ENODEV; ret = -ENODEV;
for (i = 0; i < ARRAY_SIZE(s1d13xxxfb_revisions); i++) { for (i = 0; i < ARRAY_SIZE(s1d13xxxfb_prod_ids); i++) {
if (revision == s1d13xxxfb_revisions[i]) if (prod_id == s1d13xxxfb_prod_ids[i]) {
/* looks like we got it in our list */
default_par->prod_id = prod_id;
default_par->revision = revision;
ret = 0; ret = 0;
break;
}
} }
if (!ret) if (!ret) {
printk(KERN_INFO PFX "chip production id %i = %s\n",
prod_id, s1d13xxxfb_prod_names[i]);
printk(KERN_INFO PFX "chip revision %i\n", revision); printk(KERN_INFO PFX "chip revision %i\n", revision);
else { } else {
printk(KERN_INFO PFX "unknown chip revision %i\n", revision); printk(KERN_INFO PFX
"unknown chip production id %i, revision %i\n",
prod_id, revision);
printk(KERN_INFO PFX "please contant maintainer\n");
goto bail; goto bail;
} }
......
...@@ -14,13 +14,16 @@ ...@@ -14,13 +14,16 @@
#define S1D13XXXFB_H #define S1D13XXXFB_H
#define S1D_PALETTE_SIZE 256 #define S1D_PALETTE_SIZE 256
#define S1D13506_CHIP_REV 4 /* expected chip revision number for s1d13506 */ #define S1D_FBID "S1D13xxx"
#define S1D13806_CHIP_REV 7 /* expected chip revision number for s1d13806 */ #define S1D_DEVICENAME "s1d13xxxfb"
#define S1D_FBID "S1D13806"
#define S1D_DEVICENAME "s1d13806fb" /* S1DREG_REV_CODE register = prod_id (6 bits) + revision (2 bits) */
#define S1D13505_PROD_ID 0x3 /* 000011 */
#define S1D13506_PROD_ID 0x4 /* 000100 */
#define S1D13806_PROD_ID 0x7 /* 000111 */
/* register definitions (tested on s1d13896) */ /* register definitions (tested on s1d13896) */
#define S1DREG_REV_CODE 0x0000 /* Revision Code Register */ #define S1DREG_REV_CODE 0x0000 /* Prod + Rev Code Register */
#define S1DREG_MISC 0x0001 /* Miscellaneous Register */ #define S1DREG_MISC 0x0001 /* Miscellaneous Register */
#define S1DREG_GPIO_CNF0 0x0004 /* General IO Pins Configuration Register 0 */ #define S1DREG_GPIO_CNF0 0x0004 /* General IO Pins Configuration Register 0 */
#define S1DREG_GPIO_CNF1 0x0005 /* General IO Pins Configuration Register 1 */ #define S1DREG_GPIO_CNF1 0x0005 /* General IO Pins Configuration Register 1 */
...@@ -141,10 +144,11 @@ struct s1d13xxxfb_regval { ...@@ -141,10 +144,11 @@ struct s1d13xxxfb_regval {
u8 value; u8 value;
}; };
struct s1d13xxxfb_par { struct s1d13xxxfb_par {
void __iomem *regs; void __iomem *regs;
unsigned char display; unsigned char display;
unsigned char prod_id;
unsigned char revision;
unsigned int pseudo_palette[16]; unsigned int pseudo_palette[16];
#ifdef CONFIG_PM #ifdef CONFIG_PM
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册