diff options
-rw-r--r-- | drivers/video/s1d13xxxfb.c | 48 | ||||
-rw-r--r-- | include/video/s1d13xxxfb.h | 16 |
2 files changed, 46 insertions, 18 deletions
diff --git a/drivers/video/s1d13xxxfb.c b/drivers/video/s1d13xxxfb.c index a7b01d2724b5..0726aecf3b7e 100644 --- a/drivers/video/s1d13xxxfb.c +++ b/drivers/video/s1d13xxxfb.c | |||
@@ -50,9 +50,22 @@ | |||
50 | #define dbg(fmt, args...) do { } while (0) | 50 | #define dbg(fmt, args...) do { } while (0) |
51 | #endif | 51 | #endif |
52 | 52 | ||
53 | static const int __devinitconst s1d13xxxfb_revisions[] = { | 53 | /* |
54 | S1D13506_CHIP_REV, /* Rev.4 on HP Jornada 7xx S1D13506 */ | 54 | * List of card production ids |
55 | S1D13806_CHIP_REV, /* Rev.7 on .. */ | 55 | */ |
56 | static const int s1d13xxxfb_prod_ids[] = { | ||
57 | S1D13505_PROD_ID, | ||
58 | S1D13506_PROD_ID, | ||
59 | S1D13806_PROD_ID, | ||
60 | }; | ||
61 | |||
62 | /* | ||
63 | * List of card strings | ||
64 | */ | ||
65 | static const char *s1d13xxxfb_prod_names[] = { | ||
66 | "S1D13505", | ||
67 | "S1D13506", | ||
68 | "S1D13806", | ||
56 | }; | 69 | }; |
57 | 70 | ||
58 | /* | 71 | /* |
@@ -377,7 +390,6 @@ s1d13xxxfb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info) | |||
377 | return 0; | 390 | return 0; |
378 | } | 391 | } |
379 | 392 | ||
380 | |||
381 | /* framebuffer information structures */ | 393 | /* framebuffer information structures */ |
382 | 394 | ||
383 | static struct fb_ops s1d13xxxfb_fbops = { | 395 | static struct fb_ops s1d13xxxfb_fbops = { |
@@ -544,7 +556,7 @@ s1d13xxxfb_probe(struct platform_device *pdev) | |||
544 | struct s1d13xxxfb_pdata *pdata = NULL; | 556 | struct s1d13xxxfb_pdata *pdata = NULL; |
545 | int ret = 0; | 557 | int ret = 0; |
546 | int i; | 558 | int i; |
547 | u8 revision; | 559 | u8 revision, prod_id; |
548 | 560 | ||
549 | dbg("probe called: device is %p\n", pdev); | 561 | dbg("probe called: device is %p\n", pdev); |
550 | 562 | ||
@@ -613,19 +625,31 @@ s1d13xxxfb_probe(struct platform_device *pdev) | |||
613 | goto bail; | 625 | goto bail; |
614 | } | 626 | } |
615 | 627 | ||
616 | revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2; | 628 | /* production id is top 6 bits */ |
617 | 629 | prod_id = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) >> 2; | |
630 | /* revision id is lower 2 bits */ | ||
631 | revision = s1d13xxxfb_readreg(default_par, S1DREG_REV_CODE) & 0x3; | ||
618 | ret = -ENODEV; | 632 | ret = -ENODEV; |
619 | 633 | ||
620 | for (i = 0; i < ARRAY_SIZE(s1d13xxxfb_revisions); i++) { | 634 | for (i = 0; i < ARRAY_SIZE(s1d13xxxfb_prod_ids); i++) { |
621 | if (revision == s1d13xxxfb_revisions[i]) | 635 | if (prod_id == s1d13xxxfb_prod_ids[i]) { |
636 | /* looks like we got it in our list */ | ||
637 | default_par->prod_id = prod_id; | ||
638 | default_par->revision = revision; | ||
622 | ret = 0; | 639 | ret = 0; |
640 | break; | ||
641 | } | ||
623 | } | 642 | } |
624 | 643 | ||
625 | if (!ret) | 644 | if (!ret) { |
645 | printk(KERN_INFO PFX "chip production id %i = %s\n", | ||
646 | prod_id, s1d13xxxfb_prod_names[i]); | ||
626 | printk(KERN_INFO PFX "chip revision %i\n", revision); | 647 | printk(KERN_INFO PFX "chip revision %i\n", revision); |
627 | else { | 648 | } else { |
628 | printk(KERN_INFO PFX "unknown chip revision %i\n", revision); | 649 | printk(KERN_INFO PFX |
650 | "unknown chip production id %i, revision %i\n", | ||
651 | prod_id, revision); | ||
652 | printk(KERN_INFO PFX "please contant maintainer\n"); | ||
629 | goto bail; | 653 | goto bail; |
630 | } | 654 | } |
631 | 655 | ||
diff --git a/include/video/s1d13xxxfb.h b/include/video/s1d13xxxfb.h index fe41b8407946..c3b2a2aa7140 100644 --- a/include/video/s1d13xxxfb.h +++ b/include/video/s1d13xxxfb.h | |||
@@ -14,13 +14,16 @@ | |||
14 | #define S1D13XXXFB_H | 14 | #define S1D13XXXFB_H |
15 | 15 | ||
16 | #define S1D_PALETTE_SIZE 256 | 16 | #define S1D_PALETTE_SIZE 256 |
17 | #define S1D13506_CHIP_REV 4 /* expected chip revision number for s1d13506 */ | 17 | #define S1D_FBID "S1D13xxx" |
18 | #define S1D13806_CHIP_REV 7 /* expected chip revision number for s1d13806 */ | 18 | #define S1D_DEVICENAME "s1d13xxxfb" |
19 | #define S1D_FBID "S1D13806" | 19 | |
20 | #define S1D_DEVICENAME "s1d13806fb" | 20 | /* S1DREG_REV_CODE register = prod_id (6 bits) + revision (2 bits) */ |
21 | #define S1D13505_PROD_ID 0x3 /* 000011 */ | ||
22 | #define S1D13506_PROD_ID 0x4 /* 000100 */ | ||
23 | #define S1D13806_PROD_ID 0x7 /* 000111 */ | ||
21 | 24 | ||
22 | /* register definitions (tested on s1d13896) */ | 25 | /* register definitions (tested on s1d13896) */ |
23 | #define S1DREG_REV_CODE 0x0000 /* Revision Code Register */ | 26 | #define S1DREG_REV_CODE 0x0000 /* Prod + Rev Code Register */ |
24 | #define S1DREG_MISC 0x0001 /* Miscellaneous Register */ | 27 | #define S1DREG_MISC 0x0001 /* Miscellaneous Register */ |
25 | #define S1DREG_GPIO_CNF0 0x0004 /* General IO Pins Configuration Register 0 */ | 28 | #define S1DREG_GPIO_CNF0 0x0004 /* General IO Pins Configuration Register 0 */ |
26 | #define S1DREG_GPIO_CNF1 0x0005 /* General IO Pins Configuration Register 1 */ | 29 | #define S1DREG_GPIO_CNF1 0x0005 /* General IO Pins Configuration Register 1 */ |
@@ -141,10 +144,11 @@ struct s1d13xxxfb_regval { | |||
141 | u8 value; | 144 | u8 value; |
142 | }; | 145 | }; |
143 | 146 | ||
144 | |||
145 | struct s1d13xxxfb_par { | 147 | struct s1d13xxxfb_par { |
146 | void __iomem *regs; | 148 | void __iomem *regs; |
147 | unsigned char display; | 149 | unsigned char display; |
150 | unsigned char prod_id; | ||
151 | unsigned char revision; | ||
148 | 152 | ||
149 | unsigned int pseudo_palette[16]; | 153 | unsigned int pseudo_palette[16]; |
150 | #ifdef CONFIG_PM | 154 | #ifdef CONFIG_PM |