aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/media/video/gspca/sonixj.c265
1 files changed, 129 insertions, 136 deletions
diff --git a/drivers/media/video/gspca/sonixj.c b/drivers/media/video/gspca/sonixj.c
index 330dadc00106..5d5698959b10 100644
--- a/drivers/media/video/gspca/sonixj.c
+++ b/drivers/media/video/gspca/sonixj.c
@@ -1755,141 +1755,6 @@ static void po2030n_probe(struct gspca_dev *gspca_dev)
1755 } 1755 }
1756} 1756}
1757 1757
1758static void bridge_init(struct gspca_dev *gspca_dev,
1759 const u8 *sn9c1xx)
1760{
1761 struct sd *sd = (struct sd *) gspca_dev;
1762 u8 reg0102[2];
1763 const u8 *reg9a;
1764 static const u8 reg9a_def[] =
1765 {0x00, 0x40, 0x20, 0x00, 0x00, 0x00};
1766 static const u8 reg9a_spec[] =
1767 {0x00, 0x40, 0x38, 0x30, 0x00, 0x20};
1768 static const u8 regd4[] = {0x60, 0x00, 0x00};
1769
1770 /* sensor clock already enabled in sd_init */
1771 /* reg_w1(gspca_dev, 0xf1, 0x00); */
1772 reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
1773
1774 /* configure gpio */
1775 reg0102[0] = sn9c1xx[1];
1776 reg0102[1] = sn9c1xx[2];
1777 if (gspca_dev->audio)
1778 reg0102[1] |= 0x04; /* keep the audio connection */
1779 reg_w(gspca_dev, 0x01, reg0102, 2);
1780 reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
1781 reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5);
1782 switch (sd->sensor) {
1783 case SENSOR_GC0307:
1784 case SENSOR_OV7660:
1785 case SENSOR_PO1030:
1786 case SENSOR_PO2030N:
1787 case SENSOR_SOI768:
1788 case SENSOR_SP80708:
1789 reg9a = reg9a_spec;
1790 break;
1791 default:
1792 reg9a = reg9a_def;
1793 break;
1794 }
1795 reg_w(gspca_dev, 0x9a, reg9a, 6);
1796
1797 reg_w(gspca_dev, 0xd4, regd4, sizeof regd4);
1798
1799 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
1800
1801 switch (sd->sensor) {
1802 case SENSOR_ADCM1700:
1803 reg_w1(gspca_dev, 0x01, 0x43);
1804 reg_w1(gspca_dev, 0x17, 0x62);
1805 reg_w1(gspca_dev, 0x01, 0x42);
1806 reg_w1(gspca_dev, 0x01, 0x42);
1807 break;
1808 case SENSOR_GC0307:
1809 msleep(50);
1810 reg_w1(gspca_dev, 0x01, 0x61);
1811 reg_w1(gspca_dev, 0x17, 0x22);
1812 reg_w1(gspca_dev, 0x01, 0x60);
1813 reg_w1(gspca_dev, 0x01, 0x40);
1814 msleep(50);
1815 break;
1816 case SENSOR_MI0360B:
1817 reg_w1(gspca_dev, 0x01, 0x61);
1818 reg_w1(gspca_dev, 0x17, 0x60);
1819 reg_w1(gspca_dev, 0x01, 0x60);
1820 reg_w1(gspca_dev, 0x01, 0x40);
1821 break;
1822 case SENSOR_MT9V111:
1823 reg_w1(gspca_dev, 0x01, 0x61);
1824 reg_w1(gspca_dev, 0x17, 0x61);
1825 reg_w1(gspca_dev, 0x01, 0x60);
1826 reg_w1(gspca_dev, 0x01, 0x40);
1827 break;
1828 case SENSOR_OM6802:
1829 msleep(10);
1830 reg_w1(gspca_dev, 0x02, 0x73);
1831 reg_w1(gspca_dev, 0x17, 0x60);
1832 reg_w1(gspca_dev, 0x01, 0x22);
1833 msleep(100);
1834 reg_w1(gspca_dev, 0x01, 0x62);
1835 reg_w1(gspca_dev, 0x17, 0x64);
1836 reg_w1(gspca_dev, 0x17, 0x64);
1837 reg_w1(gspca_dev, 0x01, 0x42);
1838 msleep(10);
1839 reg_w1(gspca_dev, 0x01, 0x42);
1840 i2c_w8(gspca_dev, om6802_init0[0]);
1841 i2c_w8(gspca_dev, om6802_init0[1]);
1842 msleep(15);
1843 reg_w1(gspca_dev, 0x02, 0x71);
1844 msleep(150);
1845 break;
1846 case SENSOR_OV7630:
1847 reg_w1(gspca_dev, 0x01, 0x61);
1848 reg_w1(gspca_dev, 0x17, 0xe2);
1849 reg_w1(gspca_dev, 0x01, 0x60);
1850 reg_w1(gspca_dev, 0x01, 0x40);
1851 break;
1852 case SENSOR_OV7648:
1853 reg_w1(gspca_dev, 0x01, 0x63);
1854 reg_w1(gspca_dev, 0x17, 0x20);
1855 reg_w1(gspca_dev, 0x01, 0x62);
1856 reg_w1(gspca_dev, 0x01, 0x42);
1857 break;
1858 case SENSOR_PO1030:
1859 case SENSOR_SOI768:
1860 reg_w1(gspca_dev, 0x01, 0x61);
1861 reg_w1(gspca_dev, 0x17, 0x20);
1862 reg_w1(gspca_dev, 0x01, 0x60);
1863 reg_w1(gspca_dev, 0x01, 0x40);
1864 break;
1865 case SENSOR_PO2030N:
1866 case SENSOR_OV7660:
1867 reg_w1(gspca_dev, 0x01, 0x63);
1868 reg_w1(gspca_dev, 0x17, 0x20);
1869 reg_w1(gspca_dev, 0x01, 0x62);
1870 reg_w1(gspca_dev, 0x01, 0x42);
1871 break;
1872 case SENSOR_SP80708:
1873 reg_w1(gspca_dev, 0x01, 0x63);
1874 reg_w1(gspca_dev, 0x17, 0x20);
1875 reg_w1(gspca_dev, 0x01, 0x62);
1876 reg_w1(gspca_dev, 0x01, 0x42);
1877 msleep(100);
1878 reg_w1(gspca_dev, 0x02, 0x62);
1879 break;
1880 default:
1881/* case SENSOR_HV7131R: */
1882/* case SENSOR_MI0360: */
1883/* case SENSOR_MO4000: */
1884 reg_w1(gspca_dev, 0x01, 0x43);
1885 reg_w1(gspca_dev, 0x17, 0x61);
1886 reg_w1(gspca_dev, 0x01, 0x42);
1887 if (sd->sensor == SENSOR_HV7131R)
1888 hv7131r_probe(gspca_dev);
1889 break;
1890 }
1891}
1892
1893/* this function is called at probe time */ 1758/* this function is called at probe time */
1894static int sd_config(struct gspca_dev *gspca_dev, 1759static int sd_config(struct gspca_dev *gspca_dev,
1895 const struct usb_device_id *id) 1760 const struct usb_device_id *id)
@@ -2423,10 +2288,17 @@ static int sd_start(struct gspca_dev *gspca_dev)
2423{ 2288{
2424 struct sd *sd = (struct sd *) gspca_dev; 2289 struct sd *sd = (struct sd *) gspca_dev;
2425 int i; 2290 int i;
2291 u8 reg0102[2];
2292 const u8 *reg9a;
2426 u8 reg1, reg17; 2293 u8 reg1, reg17;
2427 const u8 *sn9c1xx; 2294 const u8 *sn9c1xx;
2428 const u8 (*init)[8]; 2295 const u8 (*init)[8];
2429 int mode; 2296 int mode;
2297 static const u8 reg9a_def[] =
2298 {0x00, 0x40, 0x20, 0x00, 0x00, 0x00};
2299 static const u8 reg9a_spec[] =
2300 {0x00, 0x40, 0x38, 0x30, 0x00, 0x20};
2301 static const u8 regd4[] = {0x60, 0x00, 0x00};
2430 static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f }; 2302 static const u8 C0[] = { 0x2d, 0x2d, 0x3a, 0x05, 0x04, 0x3f };
2431 static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec }; 2303 static const u8 CA[] = { 0x28, 0xd8, 0x14, 0xec };
2432 static const u8 CA_adcm1700[] = 2304 static const u8 CA_adcm1700[] =
@@ -2448,7 +2320,128 @@ static int sd_start(struct gspca_dev *gspca_dev)
2448 2320
2449 /* initialize the bridge */ 2321 /* initialize the bridge */
2450 sn9c1xx = sn_tb[sd->sensor]; 2322 sn9c1xx = sn_tb[sd->sensor];
2451 bridge_init(gspca_dev, sn9c1xx); 2323
2324 /* sensor clock already enabled in sd_init */
2325 /* reg_w1(gspca_dev, 0xf1, 0x00); */
2326 reg_w1(gspca_dev, 0x01, sn9c1xx[1]);
2327
2328 /* configure gpio */
2329 reg0102[0] = sn9c1xx[1];
2330 reg0102[1] = sn9c1xx[2];
2331 if (gspca_dev->audio)
2332 reg0102[1] |= 0x04; /* keep the audio connection */
2333 reg_w(gspca_dev, 0x01, reg0102, 2);
2334 reg_w(gspca_dev, 0x08, &sn9c1xx[8], 2);
2335 reg_w(gspca_dev, 0x17, &sn9c1xx[0x17], 5);
2336 switch (sd->sensor) {
2337 case SENSOR_GC0307:
2338 case SENSOR_OV7660:
2339 case SENSOR_PO1030:
2340 case SENSOR_PO2030N:
2341 case SENSOR_SOI768:
2342 case SENSOR_SP80708:
2343 reg9a = reg9a_spec;
2344 break;
2345 default:
2346 reg9a = reg9a_def;
2347 break;
2348 }
2349 reg_w(gspca_dev, 0x9a, reg9a, 6);
2350
2351 reg_w(gspca_dev, 0xd4, regd4, sizeof regd4);
2352
2353 reg_w(gspca_dev, 0x03, &sn9c1xx[3], 0x0f);
2354
2355 switch (sd->sensor) {
2356 case SENSOR_ADCM1700:
2357 reg_w1(gspca_dev, 0x01, 0x43);
2358 reg_w1(gspca_dev, 0x17, 0x62);
2359 reg_w1(gspca_dev, 0x01, 0x42);
2360 reg_w1(gspca_dev, 0x01, 0x42);
2361 break;
2362 case SENSOR_GC0307:
2363 msleep(50);
2364 reg_w1(gspca_dev, 0x01, 0x61);
2365 reg_w1(gspca_dev, 0x17, 0x22);
2366 reg_w1(gspca_dev, 0x01, 0x60);
2367 reg_w1(gspca_dev, 0x01, 0x40);
2368 msleep(50);
2369 break;
2370 case SENSOR_MI0360B:
2371 reg_w1(gspca_dev, 0x01, 0x61);
2372 reg_w1(gspca_dev, 0x17, 0x60);
2373 reg_w1(gspca_dev, 0x01, 0x60);
2374 reg_w1(gspca_dev, 0x01, 0x40);
2375 break;
2376 case SENSOR_MT9V111:
2377 reg_w1(gspca_dev, 0x01, 0x61);
2378 reg_w1(gspca_dev, 0x17, 0x61);
2379 reg_w1(gspca_dev, 0x01, 0x60);
2380 reg_w1(gspca_dev, 0x01, 0x40);
2381 break;
2382 case SENSOR_OM6802:
2383 msleep(10);
2384 reg_w1(gspca_dev, 0x02, 0x73);
2385 reg_w1(gspca_dev, 0x17, 0x60);
2386 reg_w1(gspca_dev, 0x01, 0x22);
2387 msleep(100);
2388 reg_w1(gspca_dev, 0x01, 0x62);
2389 reg_w1(gspca_dev, 0x17, 0x64);
2390 reg_w1(gspca_dev, 0x17, 0x64);
2391 reg_w1(gspca_dev, 0x01, 0x42);
2392 msleep(10);
2393 reg_w1(gspca_dev, 0x01, 0x42);
2394 i2c_w8(gspca_dev, om6802_init0[0]);
2395 i2c_w8(gspca_dev, om6802_init0[1]);
2396 msleep(15);
2397 reg_w1(gspca_dev, 0x02, 0x71);
2398 msleep(150);
2399 break;
2400 case SENSOR_OV7630:
2401 reg_w1(gspca_dev, 0x01, 0x61);
2402 reg_w1(gspca_dev, 0x17, 0xe2);
2403 reg_w1(gspca_dev, 0x01, 0x60);
2404 reg_w1(gspca_dev, 0x01, 0x40);
2405 break;
2406 case SENSOR_OV7648:
2407 reg_w1(gspca_dev, 0x01, 0x63);
2408 reg_w1(gspca_dev, 0x17, 0x20);
2409 reg_w1(gspca_dev, 0x01, 0x62);
2410 reg_w1(gspca_dev, 0x01, 0x42);
2411 break;
2412 case SENSOR_PO1030:
2413 case SENSOR_SOI768:
2414 reg_w1(gspca_dev, 0x01, 0x61);
2415 reg_w1(gspca_dev, 0x17, 0x20);
2416 reg_w1(gspca_dev, 0x01, 0x60);
2417 reg_w1(gspca_dev, 0x01, 0x40);
2418 break;
2419 case SENSOR_PO2030N:
2420 case SENSOR_OV7660:
2421 reg_w1(gspca_dev, 0x01, 0x63);
2422 reg_w1(gspca_dev, 0x17, 0x20);
2423 reg_w1(gspca_dev, 0x01, 0x62);
2424 reg_w1(gspca_dev, 0x01, 0x42);
2425 break;
2426 case SENSOR_SP80708:
2427 reg_w1(gspca_dev, 0x01, 0x63);
2428 reg_w1(gspca_dev, 0x17, 0x20);
2429 reg_w1(gspca_dev, 0x01, 0x62);
2430 reg_w1(gspca_dev, 0x01, 0x42);
2431 msleep(100);
2432 reg_w1(gspca_dev, 0x02, 0x62);
2433 break;
2434 default:
2435/* case SENSOR_HV7131R: */
2436/* case SENSOR_MI0360: */
2437/* case SENSOR_MO4000: */
2438 reg_w1(gspca_dev, 0x01, 0x43);
2439 reg_w1(gspca_dev, 0x17, 0x61);
2440 reg_w1(gspca_dev, 0x01, 0x42);
2441 if (sd->sensor == SENSOR_HV7131R)
2442 hv7131r_probe(gspca_dev);
2443 break;
2444 }
2452 2445
2453 /* initialize the sensor */ 2446 /* initialize the sensor */
2454 i2c_w_seq(gspca_dev, sensor_init[sd->sensor]); 2447 i2c_w_seq(gspca_dev, sensor_init[sd->sensor]);