Date: | 2012-03-06 14:15:05 (11 years 6 months ago) |
---|---|
Author: | Paul Cercueil |
Commit: | ae56dee43db20497a8cb74a9df70046557705f6e |
Message: | MIPS: JZ4740: add the 'panel' attribute to /sys The panel can now be changed at runtime. |
Files: |
drivers/video/jz4740_slcd.h (1 diff) drivers/video/jz4740_slcd_fb.c (3 diffs) drivers/video/jz4740_slcd_panels.c (1 diff) |
Change Details
drivers/video/jz4740_slcd.h | ||
---|---|---|
114 | 114 | const char *name; |
115 | 115 | }; |
116 | 116 | |
117 | const struct jz_slcd_panel *jz_slcd_panel_from_name(const char *name); | |
117 | 118 | const struct jz_slcd_panel *jz_slcd_panels_probe(struct jzfb *jzfb); |
118 | 119 | |
119 | 120 | #endif /*__JZ4740_SLCD_H__*/ |
drivers/video/jz4740_slcd_fb.c | ||
---|---|---|
679 | 679 | return 0; |
680 | 680 | } |
681 | 681 | |
682 | static ssize_t jzfb_panel_show(struct device *dev, struct device_attribute *attr, | |
683 | char *buf) | |
684 | { | |
685 | struct jzfb *jzfb = dev_get_drvdata(dev); | |
686 | return sprintf(buf, "%s\n", jzfb->panel->name); | |
687 | } | |
688 | ||
689 | static ssize_t jzfb_panel_store(struct device *dev, struct device_attribute *attr, | |
690 | const char *buf, size_t n) | |
691 | { | |
692 | struct jzfb *jzfb = dev_get_drvdata(dev); | |
693 | const struct jz_slcd_panel *panel = jz_slcd_panel_from_name(buf); | |
694 | ||
695 | if (!panel) { | |
696 | dev_err(dev, "Unknown SLCD panel: %s\n", buf); | |
697 | return -EINVAL; | |
698 | } | |
699 | ||
700 | if (panel != jzfb->panel) { | |
701 | jzfb->panel->disable(jzfb); | |
702 | jzfb->panel->exit(jzfb); | |
703 | jzfb->panel = panel; | |
704 | panel->init(jzfb); | |
705 | panel->enable(jzfb); | |
706 | } | |
707 | return n; | |
708 | } | |
709 | ||
710 | static DEVICE_ATTR(panel, 0644, jzfb_panel_show, jzfb_panel_store); | |
711 | ||
682 | 712 | static struct fb_ops jzfb_ops = { |
683 | 713 | .owner = THIS_MODULE, |
684 | 714 | .fb_check_var = jzfb_check_var, |
... | ... | |
837 | 867 | INIT_DELAYED_WORK(&jzfb->refresh_work, jzfb_refresh_work); |
838 | 868 | schedule_delayed_work(&jzfb->refresh_work, 0); |
839 | 869 | |
840 | return 0; | |
870 | ret = device_create_file(&pdev->dev, &dev_attr_panel); | |
871 | if (!ret) | |
872 | return 0; | |
841 | 873 | |
874 | cancel_delayed_work_sync(&jzfb->refresh_work); | |
842 | 875 | err_free_panel: |
843 | 876 | jzfb->panel->exit(jzfb); |
844 | 877 | err_free_devmem: |
... | ... | |
865 | 898 | { |
866 | 899 | struct jzfb *jzfb = platform_get_drvdata(pdev); |
867 | 900 | |
901 | device_remove_file(&pdev->dev, &dev_attr_panel); | |
868 | 902 | jzfb_blank(FB_BLANK_POWERDOWN, jzfb->fb); |
869 | 903 | |
870 | 904 | /* Blanking will prevent future refreshes from behind scheduled. |
drivers/video/jz4740_slcd_panels.c | ||
---|---|---|
511 | 511 | module_param_named(panel, default_slcd_panel, charp, 0); |
512 | 512 | MODULE_PARM_DESC(panel, "SLCD panel used on the device"); |
513 | 513 | |
514 | static const struct jz_slcd_panel *jz_slcd_panel_from_name(const char *name) | |
514 | const struct jz_slcd_panel *jz_slcd_panel_from_name(const char *name) | |
515 | 515 | { |
516 | 516 | unsigned int i; |
517 | 517 | for (i = 0; i < ARRAY_SIZE(jz_slcd_panels); i++) { |
Branches:
ben-wpan
ben-wpan-stefan
5396a9238205f20f811ea57898980d3ca82df0b6
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9