aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/via-camera.c83
1 files changed, 37 insertions, 46 deletions
diff --git a/drivers/media/video/via-camera.c b/drivers/media/video/via-camera.c
index 3f0146fcf75..8c780c2d937 100644
--- a/drivers/media/video/via-camera.c
+++ b/drivers/media/video/via-camera.c
@@ -25,6 +25,7 @@
25#include <linux/via-core.h> 25#include <linux/via-core.h>
26#include <linux/via-gpio.h> 26#include <linux/via-gpio.h>
27#include <linux/via_i2c.h> 27#include <linux/via_i2c.h>
28#include <asm/olpc.h>
28 29
29#include "via-camera.h" 30#include "via-camera.h"
30 31
@@ -38,14 +39,12 @@ MODULE_PARM_DESC(flip_image,
38 "If set, the sensor will be instructed to flip the image " 39 "If set, the sensor will be instructed to flip the image "
39 "vertically."); 40 "vertically.");
40 41
41#ifdef CONFIG_OLPC_XO_1_5
42static int override_serial; 42static int override_serial;
43module_param(override_serial, bool, 0444); 43module_param(override_serial, bool, 0444);
44MODULE_PARM_DESC(override_serial, 44MODULE_PARM_DESC(override_serial,
45 "The camera driver will normally refuse to load if " 45 "The camera driver will normally refuse to load if "
46 "the XO 1.5 serial port is enabled. Set this option " 46 "the XO 1.5 serial port is enabled. Set this option "
47 "to force the issue."); 47 "to force-enable the camera.");
48#endif
49 48
50/* 49/*
51 * Basic window sizes. 50 * Basic window sizes.
@@ -1317,6 +1316,37 @@ static struct video_device viacam_v4l_template = {
1317 .release = video_device_release_empty, /* Check this */ 1316 .release = video_device_release_empty, /* Check this */
1318}; 1317};
1319 1318
1319/*
1320 * The OLPC folks put the serial port on the same pin as
1321 * the camera. They also get grumpy if we break the
1322 * serial port and keep them from using it. So we have
1323 * to check the serial enable bit and not step on it.
1324 */
1325#define VIACAM_SERIAL_DEVFN 0x88
1326#define VIACAM_SERIAL_CREG 0x46
1327#define VIACAM_SERIAL_BIT 0x40
1328
1329static __devinit bool viacam_serial_is_enabled(void)
1330{
1331 struct pci_bus *pbus = pci_find_bus(0, 0);
1332 u8 cbyte;
1333
1334 pci_bus_read_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1335 VIACAM_SERIAL_CREG, &cbyte);
1336 if ((cbyte & VIACAM_SERIAL_BIT) == 0)
1337 return false; /* Not enabled */
1338 if (override_serial == 0) {
1339 printk(KERN_NOTICE "Via camera: serial port is enabled, " \
1340 "refusing to load.\n");
1341 printk(KERN_NOTICE "Specify override_serial=1 to force " \
1342 "module loading.\n");
1343 return true;
1344 }
1345 printk(KERN_NOTICE "Via camera: overriding serial port\n");
1346 pci_bus_write_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1347 VIACAM_SERIAL_CREG, cbyte & ~VIACAM_SERIAL_BIT);
1348 return false;
1349}
1320 1350
1321static __devinit int viacam_probe(struct platform_device *pdev) 1351static __devinit int viacam_probe(struct platform_device *pdev)
1322{ 1352{
@@ -1348,6 +1378,10 @@ static __devinit int viacam_probe(struct platform_device *pdev)
1348 printk(KERN_ERR "viacam: No I/O memory, so no pictures\n"); 1378 printk(KERN_ERR "viacam: No I/O memory, so no pictures\n");
1349 return -ENOMEM; 1379 return -ENOMEM;
1350 } 1380 }
1381
1382 if (machine_is_olpc() && viacam_serial_is_enabled())
1383 return -EBUSY;
1384
1351 /* 1385 /*
1352 * Basic structure initialization. 1386 * Basic structure initialization.
1353 */ 1387 */
@@ -1459,7 +1493,6 @@ static __devexit int viacam_remove(struct platform_device *pdev)
1459 return 0; 1493 return 0;
1460} 1494}
1461 1495
1462
1463static struct platform_driver viacam_driver = { 1496static struct platform_driver viacam_driver = {
1464 .driver = { 1497 .driver = {
1465 .name = "viafb-camera", 1498 .name = "viafb-camera",
@@ -1468,50 +1501,8 @@ static struct platform_driver viacam_driver = {
1468 .remove = viacam_remove, 1501 .remove = viacam_remove,
1469}; 1502};
1470 1503
1471
1472#ifdef CONFIG_OLPC_XO_1_5
1473/*
1474 * The OLPC folks put the serial port on the same pin as
1475 * the camera. They also get grumpy if we break the
1476 * serial port and keep them from using it. So we have
1477 * to check the serial enable bit and not step on it.
1478 */
1479#define VIACAM_SERIAL_DEVFN 0x88
1480#define VIACAM_SERIAL_CREG 0x46
1481#define VIACAM_SERIAL_BIT 0x40
1482
1483static __devinit int viacam_check_serial_port(void)
1484{
1485 struct pci_bus *pbus = pci_find_bus(0, 0);
1486 u8 cbyte;
1487
1488 pci_bus_read_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1489 VIACAM_SERIAL_CREG, &cbyte);
1490 if ((cbyte & VIACAM_SERIAL_BIT) == 0)
1491 return 0; /* Not enabled */
1492 if (override_serial == 0) {
1493 printk(KERN_NOTICE "Via camera: serial port is enabled, " \
1494 "refusing to load.\n");
1495 printk(KERN_NOTICE "Specify override_serial=1 to force " \
1496 "module loading.\n");
1497 return -EBUSY;
1498 }
1499 printk(KERN_NOTICE "Via camera: overriding serial port\n");
1500 pci_bus_write_config_byte(pbus, VIACAM_SERIAL_DEVFN,
1501 VIACAM_SERIAL_CREG, cbyte & ~VIACAM_SERIAL_BIT);
1502 return 0;
1503}
1504#endif
1505
1506
1507
1508
1509static int viacam_init(void) 1504static int viacam_init(void)
1510{ 1505{
1511#ifdef CONFIG_OLPC_XO_1_5
1512 if (viacam_check_serial_port())
1513 return -EBUSY;
1514#endif
1515 return platform_driver_register(&viacam_driver); 1506 return platform_driver_register(&viacam_driver);
1516} 1507}
1517module_init(viacam_init); 1508module_init(viacam_init);