aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 15:05:15 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2012-12-12 15:05:15 -0500
commitd027db132b395dabfac208e52a7e510e441bb9d2 (patch)
tree24b055b2385f9848e77e646ce475991d8675c3c4 /drivers/video
parentd01e4afdbb65e030fd6f1f96c30a558e2eb0f279 (diff)
parent5faf7cbb848da827f6ea1458b5a1c26a44e7510a (diff)
Merge tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc
Pull ARM SoC updates from Olof Johansson: "This contains the bulk of new SoC development for this merge window. Two new platforms have been added, the sunxi platforms (Allwinner A1x SoCs) by Maxime Ripard, and a generic Broadcom platform for a new series of ARMv7 platforms from them, where the hope is that we can keep the platform code generic enough to have them all share one mach directory. The new Broadcom platform is contributed by Christian Daudt. Highbank has grown support for Calxeda's next generation of hardware, ECX-2000. clps711x has seen a lot of cleanup from Alexander Shiyan, and he's also taken on maintainership of the platform. Beyond this there has been a bunch of work from a number of people on converting more platforms to IRQ domains, pinctrl conversion, cleanup and general feature enablement across most of the active platforms." Fix up trivial conflicts as per Olof. * tag 'soc' of git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc: (174 commits) mfd: vexpress-sysreg: Remove LEDs code irqchip: irq-sunxi: Add terminating entry for sunxi_irq_dt_ids clocksource: sunxi_timer: Add terminating entry for sunxi_timer_dt_ids irq: versatile: delete dangling variable ARM: sunxi: add missing include for mdelay() ARM: EXYNOS: Avoid early use of of_machine_is_compatible() ARM: dts: add node for PL330 MDMA1 controller for exynos4 ARM: EXYNOS: Add support for secondary CPU bring-up on Exynos4412 ARM: EXYNOS: add UART3 to DEBUG_LL ports ARM: S3C24XX: Add clkdev entry for camif-upll clock ARM: SAMSUNG: Add s3c24xx/s3c64xx CAMIF GPIO setup helpers ARM: sunxi: Add missing sun4i.dtsi file pinctrl: samsung: Do not initialise statics to 0 ARM i.MX6: remove gate_mask from pllv3 ARM i.MX6: Fix ethernet PLL clocks ARM i.MX6: rename PLLs according to datasheet ARM i.MX6: Add pwm support ARM i.MX51: Add pwm support ARM i.MX53: Add pwm support ARM: mx5: Replace clk_register_clkdev with clock DT lookup ...
Diffstat (limited to 'drivers/video')
-rw-r--r--drivers/video/clps711xfb.c156
1 files changed, 19 insertions, 137 deletions
diff --git a/drivers/video/clps711xfb.c b/drivers/video/clps711xfb.c
index f994c8b8f10a..63ecdf8f7baf 100644
--- a/drivers/video/clps711xfb.c
+++ b/drivers/video/clps711xfb.c
@@ -22,19 +22,15 @@
22#include <linux/mm.h> 22#include <linux/mm.h>
23#include <linux/module.h> 23#include <linux/module.h>
24#include <linux/kernel.h> 24#include <linux/kernel.h>
25#include <linux/seq_file.h>
26#include <linux/slab.h> 25#include <linux/slab.h>
27#include <linux/fb.h> 26#include <linux/fb.h>
28#include <linux/init.h> 27#include <linux/init.h>
29#include <linux/proc_fs.h>
30#include <linux/delay.h> 28#include <linux/delay.h>
31 29
32#include <mach/hardware.h> 30#include <mach/hardware.h>
33#include <asm/mach-types.h> 31#include <asm/mach-types.h>
34#include <linux/uaccess.h> 32#include <linux/uaccess.h>
35 33
36#include <mach/syspld.h>
37
38struct fb_info *cfb; 34struct fb_info *cfb;
39 35
40#define CMAP_MAX_SIZE 16 36#define CMAP_MAX_SIZE 16
@@ -162,44 +158,12 @@ clps7111fb_set_par(struct fb_info *info)
162 158
163static int clps7111fb_blank(int blank, struct fb_info *info) 159static int clps7111fb_blank(int blank, struct fb_info *info)
164{ 160{
165 if (blank) { 161 /* Enable/Disable LCD controller. */
166 if (machine_is_edb7211()) { 162 if (blank)
167 /* Turn off the LCD backlight. */ 163 clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN, SYSCON1);
168 clps_writeb(clps_readb(PDDR) & ~EDB_PD3_LCDBL, PDDR); 164 else
169 165 clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN, SYSCON1);
170 /* Power off the LCD DC-DC converter. */
171 clps_writeb(clps_readb(PDDR) & ~EDB_PD1_LCD_DC_DC_EN, PDDR);
172
173 /* Delay for a little while (half a second). */
174 udelay(100);
175
176 /* Power off the LCD panel. */
177 clps_writeb(clps_readb(PDDR) & ~EDB_PD2_LCDEN, PDDR);
178
179 /* Power off the LCD controller. */
180 clps_writel(clps_readl(SYSCON1) & ~SYSCON1_LCDEN,
181 SYSCON1);
182 }
183 } else {
184 if (machine_is_edb7211()) {
185 /* Power up the LCD controller. */
186 clps_writel(clps_readl(SYSCON1) | SYSCON1_LCDEN,
187 SYSCON1);
188
189 /* Power up the LCD panel. */
190 clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
191
192 /* Delay for a little while. */
193 udelay(100);
194 166
195 /* Power up the LCD DC-DC converter. */
196 clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN,
197 PDDR);
198
199 /* Turn on the LCD backlight. */
200 clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
201 }
202 }
203 return 0; 167 return 0;
204} 168}
205 169
@@ -214,63 +178,7 @@ static struct fb_ops clps7111fb_ops = {
214 .fb_imageblit = cfb_imageblit, 178 .fb_imageblit = cfb_imageblit,
215}; 179};
216 180
217static int backlight_proc_show(struct seq_file *m, void *v) 181static void __devinit clps711x_guess_lcd_params(struct fb_info *info)
218{
219 if (machine_is_edb7211()) {
220 seq_printf(m, "%d\n",
221 (clps_readb(PDDR) & EDB_PD3_LCDBL) ? 1 : 0);
222 }
223
224 return 0;
225}
226
227static int backlight_proc_open(struct inode *inode, struct file *file)
228{
229 return single_open(file, backlight_proc_show, NULL);
230}
231
232static ssize_t backlight_proc_write(struct file *file, const char *buffer,
233 size_t count, loff_t *pos)
234{
235 unsigned char char_value;
236 int value;
237
238 if (count < 1) {
239 return -EINVAL;
240 }
241
242 if (copy_from_user(&char_value, buffer, 1))
243 return -EFAULT;
244
245 value = char_value - '0';
246
247 if (machine_is_edb7211()) {
248 unsigned char port_d;
249
250 port_d = clps_readb(PDDR);
251
252 if (value) {
253 port_d |= EDB_PD3_LCDBL;
254 } else {
255 port_d &= ~EDB_PD3_LCDBL;
256 }
257
258 clps_writeb(port_d, PDDR);
259 }
260
261 return count;
262}
263
264static const struct file_operations backlight_proc_fops = {
265 .owner = THIS_MODULE,
266 .open = backlight_proc_open,
267 .read = seq_read,
268 .llseek = seq_lseek,
269 .release = single_release,
270 .write = backlight_proc_write,
271};
272
273static void __init clps711x_guess_lcd_params(struct fb_info *info)
274{ 182{
275 unsigned int lcdcon, syscon, size; 183 unsigned int lcdcon, syscon, size;
276 unsigned long phys_base = PAGE_OFFSET; 184 unsigned long phys_base = PAGE_OFFSET;
@@ -358,7 +266,7 @@ static void __init clps711x_guess_lcd_params(struct fb_info *info)
358 info->fix.type = FB_TYPE_PACKED_PIXELS; 266 info->fix.type = FB_TYPE_PACKED_PIXELS;
359} 267}
360 268
361int __init clps711xfb_init(void) 269static int __devinit clps711x_fb_probe(struct platform_device *pdev)
362{ 270{
363 int err = -ENOMEM; 271 int err = -ENOMEM;
364 272
@@ -378,55 +286,29 @@ int __init clps711xfb_init(void)
378 286
379 fb_alloc_cmap(&cfb->cmap, CMAP_MAX_SIZE, 0); 287 fb_alloc_cmap(&cfb->cmap, CMAP_MAX_SIZE, 0);
380 288
381 if (!proc_create("backlight", 0444, NULL, &backlight_proc_fops)) {
382 printk("Couldn't create the /proc entry for the backlight.\n");
383 return -EINVAL;
384 }
385
386 /*
387 * Power up the LCD
388 */
389 if (machine_is_p720t()) {
390 PLD_LCDEN = PLD_LCDEN_EN;
391 PLD_PWR |= (PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON);
392 }
393
394 if (machine_is_edb7211()) {
395 /* Power up the LCD panel. */
396 clps_writeb(clps_readb(PDDR) | EDB_PD2_LCDEN, PDDR);
397
398 /* Delay for a little while. */
399 udelay(100);
400
401 /* Power up the LCD DC-DC converter. */
402 clps_writeb(clps_readb(PDDR) | EDB_PD1_LCD_DC_DC_EN, PDDR);
403
404 /* Turn on the LCD backlight. */
405 clps_writeb(clps_readb(PDDR) | EDB_PD3_LCDBL, PDDR);
406 }
407
408 err = register_framebuffer(cfb); 289 err = register_framebuffer(cfb);
409 290
410out: return err; 291out: return err;
411} 292}
412 293
413static void __exit clps711xfb_exit(void) 294static int __devexit clps711x_fb_remove(struct platform_device *pdev)
414{ 295{
415 unregister_framebuffer(cfb); 296 unregister_framebuffer(cfb);
416 kfree(cfb); 297 kfree(cfb);
417 298
418 /* 299 return 0;
419 * Power down the LCD
420 */
421 if (machine_is_p720t()) {
422 PLD_LCDEN = 0;
423 PLD_PWR &= ~(PLD_S4_ON|PLD_S3_ON|PLD_S2_ON|PLD_S1_ON);
424 }
425} 300}
426 301
427module_init(clps711xfb_init); 302static struct platform_driver clps711x_fb_driver = {
428module_exit(clps711xfb_exit); 303 .driver = {
304 .name = "video-clps711x",
305 .owner = THIS_MODULE,
306 },
307 .probe = clps711x_fb_probe,
308 .remove = __devexit_p(clps711x_fb_remove),
309};
310module_platform_driver(clps711x_fb_driver);
429 311
430MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>"); 312MODULE_AUTHOR("Russell King <rmk@arm.linux.org.uk>");
431MODULE_DESCRIPTION("CLPS711x framebuffer driver"); 313MODULE_DESCRIPTION("CLPS711X framebuffer driver");
432MODULE_LICENSE("GPL"); 314MODULE_LICENSE("GPL");