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 |
