diff options
Diffstat (limited to 'drivers/video/via')
-rw-r--r-- | drivers/video/via/Makefile | 5 | ||||
-rw-r--r-- | drivers/video/via/via_aux.c | 68 | ||||
-rw-r--r-- | drivers/video/via/via_aux.h | 87 | ||||
-rw-r--r-- | drivers/video/via/via_aux_ch7301.c | 50 | ||||
-rw-r--r-- | drivers/video/via/via_aux_edid.c | 40 | ||||
-rw-r--r-- | drivers/video/via/via_aux_sii164.c | 54 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1621.c | 44 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1622.c | 50 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1625.c | 50 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1631.c | 46 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1632.c | 54 | ||||
-rw-r--r-- | drivers/video/via/via_aux_vt1636.c | 46 | ||||
-rw-r--r-- | drivers/video/via/viafbdev.c | 27 | ||||
-rw-r--r-- | drivers/video/via/viafbdev.h | 6 |
14 files changed, 626 insertions, 1 deletions
diff --git a/drivers/video/via/Makefile b/drivers/video/via/Makefile index 5108136e8776..159f26e6adb5 100644 --- a/drivers/video/via/Makefile +++ b/drivers/video/via/Makefile | |||
@@ -6,4 +6,7 @@ obj-$(CONFIG_FB_VIA) += viafb.o | |||
6 | 6 | ||
7 | viafb-y :=viafbdev.o hw.o via_i2c.o dvi.o lcd.o ioctl.o accel.o \ | 7 | viafb-y :=viafbdev.o hw.o via_i2c.o dvi.o lcd.o ioctl.o accel.o \ |
8 | via_utility.o vt1636.o global.o tblDPASetting.o viamode.o \ | 8 | via_utility.o vt1636.o global.o tblDPASetting.o viamode.o \ |
9 | via-core.o via-gpio.o via_modesetting.o via_clock.o | 9 | via-core.o via-gpio.o via_modesetting.o via_clock.o \ |
10 | via_aux.o via_aux_edid.o via_aux_vt1636.o via_aux_vt1632.o \ | ||
11 | via_aux_vt1631.o via_aux_vt1625.o via_aux_vt1622.o via_aux_vt1621.o \ | ||
12 | via_aux_sii164.o via_aux_ch7301.o | ||
diff --git a/drivers/video/via/via_aux.c b/drivers/video/via/via_aux.c new file mode 100644 index 000000000000..e728b9bec235 --- /dev/null +++ b/drivers/video/via/via_aux.c | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * infrastructure for devices connected via I2C | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap) | ||
29 | { | ||
30 | struct via_aux_bus *bus; | ||
31 | |||
32 | if (!adap) | ||
33 | return NULL; | ||
34 | |||
35 | bus = kmalloc(sizeof(*bus), GFP_KERNEL); | ||
36 | if (!bus) | ||
37 | return NULL; | ||
38 | |||
39 | bus->adap = adap; | ||
40 | INIT_LIST_HEAD(&bus->drivers); | ||
41 | |||
42 | via_aux_edid_probe(bus); | ||
43 | via_aux_vt1636_probe(bus); | ||
44 | via_aux_vt1632_probe(bus); | ||
45 | via_aux_vt1631_probe(bus); | ||
46 | via_aux_vt1625_probe(bus); | ||
47 | via_aux_vt1622_probe(bus); | ||
48 | via_aux_vt1621_probe(bus); | ||
49 | via_aux_sii164_probe(bus); | ||
50 | via_aux_ch7301_probe(bus); | ||
51 | |||
52 | return bus; | ||
53 | } | ||
54 | |||
55 | void via_aux_free(struct via_aux_bus *bus) | ||
56 | { | ||
57 | struct via_aux_drv *pos, *n; | ||
58 | |||
59 | if (!bus) | ||
60 | return; | ||
61 | |||
62 | list_for_each_entry_safe(pos, n, &bus->drivers, chain) { | ||
63 | list_del(&pos->chain); | ||
64 | kfree(pos); | ||
65 | } | ||
66 | |||
67 | kfree(bus); | ||
68 | } | ||
diff --git a/drivers/video/via/via_aux.h b/drivers/video/via/via_aux.h new file mode 100644 index 000000000000..5a4867a2dcc3 --- /dev/null +++ b/drivers/video/via/via_aux.h | |||
@@ -0,0 +1,87 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * infrastructure for devices connected via I2C | ||
22 | */ | ||
23 | |||
24 | #ifndef __VIA_AUX_H__ | ||
25 | #define __VIA_AUX_H__ | ||
26 | |||
27 | |||
28 | #include <linux/list.h> | ||
29 | #include <linux/i2c.h> | ||
30 | |||
31 | |||
32 | struct via_aux_bus { | ||
33 | struct i2c_adapter *adap; /* the I2C device to access the bus */ | ||
34 | struct list_head drivers; /* drivers for devices on this bus */ | ||
35 | }; | ||
36 | |||
37 | struct via_aux_drv { | ||
38 | struct list_head chain; /* chain to support multiple drivers */ | ||
39 | |||
40 | struct via_aux_bus *bus; /* the I2C bus used */ | ||
41 | u8 addr; /* the I2C slave address */ | ||
42 | |||
43 | const char *name; /* human readable name of the driver */ | ||
44 | void *data; /* private data of this driver */ | ||
45 | }; | ||
46 | |||
47 | |||
48 | struct via_aux_bus *via_aux_probe(struct i2c_adapter *adap); | ||
49 | void via_aux_free(struct via_aux_bus *bus); | ||
50 | |||
51 | |||
52 | static inline bool via_aux_add(struct via_aux_drv *drv) | ||
53 | { | ||
54 | struct via_aux_drv *data = kmalloc(sizeof(*data), GFP_KERNEL); | ||
55 | |||
56 | if (!data) | ||
57 | return false; | ||
58 | |||
59 | *data = *drv; | ||
60 | list_add_tail(&data->chain, &data->bus->drivers); | ||
61 | return true; | ||
62 | } | ||
63 | |||
64 | static inline bool via_aux_read(struct via_aux_drv *drv, u8 start, u8 *buf, | ||
65 | u8 len) | ||
66 | { | ||
67 | struct i2c_msg msg[2] = { | ||
68 | {.addr = drv->addr, .flags = 0, .len = 1, .buf = &start}, | ||
69 | {.addr = drv->addr, .flags = I2C_M_RD, .len = len, .buf = buf} }; | ||
70 | |||
71 | return i2c_transfer(drv->bus->adap, msg, 2) == 2; | ||
72 | } | ||
73 | |||
74 | |||
75 | /* probe functions of existing drivers - should only be called in via_aux.c */ | ||
76 | void via_aux_ch7301_probe(struct via_aux_bus *bus); | ||
77 | void via_aux_edid_probe(struct via_aux_bus *bus); | ||
78 | void via_aux_sii164_probe(struct via_aux_bus *bus); | ||
79 | void via_aux_vt1636_probe(struct via_aux_bus *bus); | ||
80 | void via_aux_vt1632_probe(struct via_aux_bus *bus); | ||
81 | void via_aux_vt1631_probe(struct via_aux_bus *bus); | ||
82 | void via_aux_vt1625_probe(struct via_aux_bus *bus); | ||
83 | void via_aux_vt1622_probe(struct via_aux_bus *bus); | ||
84 | void via_aux_vt1621_probe(struct via_aux_bus *bus); | ||
85 | |||
86 | |||
87 | #endif /* __VIA_AUX_H__ */ | ||
diff --git a/drivers/video/via/via_aux_ch7301.c b/drivers/video/via/via_aux_ch7301.c new file mode 100644 index 000000000000..1cbe5037a6b0 --- /dev/null +++ b/drivers/video/via/via_aux_ch7301.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for Chrontel CH7301 DVI Transmitter | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "CH7301 DVI Transmitter"; | ||
29 | |||
30 | |||
31 | static void probe(struct via_aux_bus *bus, u8 addr) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = addr, | ||
36 | .name = name}; | ||
37 | u8 tmp; | ||
38 | |||
39 | if (!via_aux_read(&drv, 0x4B, &tmp, 1) || tmp != 0x17) | ||
40 | return; | ||
41 | |||
42 | printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr); | ||
43 | via_aux_add(&drv); | ||
44 | } | ||
45 | |||
46 | void via_aux_ch7301_probe(struct via_aux_bus *bus) | ||
47 | { | ||
48 | probe(bus, 0x75); | ||
49 | probe(bus, 0x76); | ||
50 | } | ||
diff --git a/drivers/video/via/via_aux_edid.c b/drivers/video/via/via_aux_edid.c new file mode 100644 index 000000000000..547bff53a448 --- /dev/null +++ b/drivers/video/via/via_aux_edid.c | |||
@@ -0,0 +1,40 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * generic EDID driver | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "EDID"; | ||
29 | |||
30 | |||
31 | void via_aux_edid_probe(struct via_aux_bus *bus) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = 0x50, | ||
36 | .name = name}; | ||
37 | |||
38 | /* as EDID devices can be connected/disconnected just add the driver */ | ||
39 | via_aux_add(&drv); | ||
40 | } | ||
diff --git a/drivers/video/via/via_aux_sii164.c b/drivers/video/via/via_aux_sii164.c new file mode 100644 index 000000000000..ca1b35f033b1 --- /dev/null +++ b/drivers/video/via/via_aux_sii164.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for Silicon Image SiI 164 PanelLink Transmitter | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "SiI 164 PanelLink Transmitter"; | ||
29 | |||
30 | |||
31 | static void probe(struct via_aux_bus *bus, u8 addr) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = addr, | ||
36 | .name = name}; | ||
37 | /* check vendor id and device id */ | ||
38 | const u8 id[] = {0x01, 0x00, 0x06, 0x00}, len = ARRAY_SIZE(id); | ||
39 | u8 tmp[len]; | ||
40 | |||
41 | if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len)) | ||
42 | return; | ||
43 | |||
44 | printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr); | ||
45 | via_aux_add(&drv); | ||
46 | } | ||
47 | |||
48 | void via_aux_sii164_probe(struct via_aux_bus *bus) | ||
49 | { | ||
50 | u8 i; | ||
51 | |||
52 | for (i = 0x38; i <= 0x3F; i++) | ||
53 | probe(bus, i); | ||
54 | } | ||
diff --git a/drivers/video/via/via_aux_vt1621.c b/drivers/video/via/via_aux_vt1621.c new file mode 100644 index 000000000000..38eca8479898 --- /dev/null +++ b/drivers/video/via/via_aux_vt1621.c | |||
@@ -0,0 +1,44 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1621(M) TV Encoder | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1621(M) TV Encoder"; | ||
29 | |||
30 | |||
31 | void via_aux_vt1621_probe(struct via_aux_bus *bus) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = 0x20, | ||
36 | .name = name}; | ||
37 | u8 tmp; | ||
38 | |||
39 | if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x02) | ||
40 | return; | ||
41 | |||
42 | printk(KERN_INFO "viafb: Found %s\n", name); | ||
43 | via_aux_add(&drv); | ||
44 | } | ||
diff --git a/drivers/video/via/via_aux_vt1622.c b/drivers/video/via/via_aux_vt1622.c new file mode 100644 index 000000000000..8c79c68ba683 --- /dev/null +++ b/drivers/video/via/via_aux_vt1622.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1622(M) Digital TV Encoder | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1622(M) Digital TV Encoder"; | ||
29 | |||
30 | |||
31 | static void probe(struct via_aux_bus *bus, u8 addr) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = addr, | ||
36 | .name = name}; | ||
37 | u8 tmp; | ||
38 | |||
39 | if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x03) | ||
40 | return; | ||
41 | |||
42 | printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr); | ||
43 | via_aux_add(&drv); | ||
44 | } | ||
45 | |||
46 | void via_aux_vt1622_probe(struct via_aux_bus *bus) | ||
47 | { | ||
48 | probe(bus, 0x20); | ||
49 | probe(bus, 0x21); | ||
50 | } | ||
diff --git a/drivers/video/via/via_aux_vt1625.c b/drivers/video/via/via_aux_vt1625.c new file mode 100644 index 000000000000..03eb30165d36 --- /dev/null +++ b/drivers/video/via/via_aux_vt1625.c | |||
@@ -0,0 +1,50 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1625(M) HDTV Encoder | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1625(M) HDTV Encoder"; | ||
29 | |||
30 | |||
31 | static void probe(struct via_aux_bus *bus, u8 addr) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = addr, | ||
36 | .name = name}; | ||
37 | u8 tmp; | ||
38 | |||
39 | if (!via_aux_read(&drv, 0x1B, &tmp, 1) || tmp != 0x50) | ||
40 | return; | ||
41 | |||
42 | printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr); | ||
43 | via_aux_add(&drv); | ||
44 | } | ||
45 | |||
46 | void via_aux_vt1625_probe(struct via_aux_bus *bus) | ||
47 | { | ||
48 | probe(bus, 0x20); | ||
49 | probe(bus, 0x21); | ||
50 | } | ||
diff --git a/drivers/video/via/via_aux_vt1631.c b/drivers/video/via/via_aux_vt1631.c new file mode 100644 index 000000000000..06e742f1f723 --- /dev/null +++ b/drivers/video/via/via_aux_vt1631.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1631 LVDS Transmitter | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1631 LVDS Transmitter"; | ||
29 | |||
30 | |||
31 | void via_aux_vt1631_probe(struct via_aux_bus *bus) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = 0x38, | ||
36 | .name = name}; | ||
37 | /* check vendor id and device id */ | ||
38 | const u8 id[] = {0x06, 0x11, 0x91, 0x31}, len = ARRAY_SIZE(id); | ||
39 | u8 tmp[len]; | ||
40 | |||
41 | if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len)) | ||
42 | return; | ||
43 | |||
44 | printk(KERN_INFO "viafb: Found %s\n", name); | ||
45 | via_aux_add(&drv); | ||
46 | } | ||
diff --git a/drivers/video/via/via_aux_vt1632.c b/drivers/video/via/via_aux_vt1632.c new file mode 100644 index 000000000000..d24f4cd97401 --- /dev/null +++ b/drivers/video/via/via_aux_vt1632.c | |||
@@ -0,0 +1,54 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1632 DVI Transmitter | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1632 DVI Transmitter"; | ||
29 | |||
30 | |||
31 | static void probe(struct via_aux_bus *bus, u8 addr) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = addr, | ||
36 | .name = name}; | ||
37 | /* check vendor id and device id */ | ||
38 | const u8 id[] = {0x06, 0x11, 0x92, 0x31}, len = ARRAY_SIZE(id); | ||
39 | u8 tmp[len]; | ||
40 | |||
41 | if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len)) | ||
42 | return; | ||
43 | |||
44 | printk(KERN_INFO "viafb: Found %s at address 0x%x\n", name, addr); | ||
45 | via_aux_add(&drv); | ||
46 | } | ||
47 | |||
48 | void via_aux_vt1632_probe(struct via_aux_bus *bus) | ||
49 | { | ||
50 | u8 i; | ||
51 | |||
52 | for (i = 0x08; i <= 0x0F; i++) | ||
53 | probe(bus, i); | ||
54 | } | ||
diff --git a/drivers/video/via/via_aux_vt1636.c b/drivers/video/via/via_aux_vt1636.c new file mode 100644 index 000000000000..9e015c101d4d --- /dev/null +++ b/drivers/video/via/via_aux_vt1636.c | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | ||
3 | * | ||
4 | * This program is free software; you can redistribute it and/or | ||
5 | * modify it under the terms of the GNU General Public | ||
6 | * License as published by the Free Software Foundation; | ||
7 | * either version 2, or (at your option) any later version. | ||
8 | * | ||
9 | * This program is distributed in the hope that it will be useful, | ||
10 | * but WITHOUT ANY WARRANTIES OR REPRESENTATIONS; without even | ||
11 | * the implied warranty of MERCHANTABILITY or FITNESS FOR | ||
12 | * A PARTICULAR PURPOSE.See the GNU General Public License | ||
13 | * for more details. | ||
14 | * | ||
15 | * You should have received a copy of the GNU General Public License | ||
16 | * along with this program; if not, write to the Free Software | ||
17 | * Foundation, Inc., | ||
18 | * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
19 | */ | ||
20 | /* | ||
21 | * driver for VIA VT1636 LVDS Transmitter | ||
22 | */ | ||
23 | |||
24 | #include <linux/slab.h> | ||
25 | #include "via_aux.h" | ||
26 | |||
27 | |||
28 | static const char *name = "VT1636 LVDS Transmitter"; | ||
29 | |||
30 | |||
31 | void via_aux_vt1636_probe(struct via_aux_bus *bus) | ||
32 | { | ||
33 | struct via_aux_drv drv = { | ||
34 | .bus = bus, | ||
35 | .addr = 0x40, | ||
36 | .name = name}; | ||
37 | /* check vendor id and device id */ | ||
38 | const u8 id[] = {0x06, 0x11, 0x45, 0x33}, len = ARRAY_SIZE(id); | ||
39 | u8 tmp[len]; | ||
40 | |||
41 | if (!via_aux_read(&drv, 0x00, tmp, len) || memcmp(id, tmp, len)) | ||
42 | return; | ||
43 | |||
44 | printk(KERN_INFO "viafb: Found %s\n", name); | ||
45 | via_aux_add(&drv); | ||
46 | } | ||
diff --git a/drivers/video/via/viafbdev.c b/drivers/video/via/viafbdev.c index a13c258bd32f..6d5b64923236 100644 --- a/drivers/video/via/viafbdev.c +++ b/drivers/video/via/viafbdev.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
25 | #include <linux/stat.h> | 25 | #include <linux/stat.h> |
26 | #include <linux/via-core.h> | 26 | #include <linux/via-core.h> |
27 | #include <linux/via_i2c.h> | ||
27 | #include <asm/olpc.h> | 28 | #include <asm/olpc.h> |
28 | 29 | ||
29 | #define _MASTER_FILE | 30 | #define _MASTER_FILE |
@@ -1729,6 +1730,29 @@ static struct viafb_pm_hooks viafb_fb_pm_hooks = { | |||
1729 | 1730 | ||
1730 | #endif | 1731 | #endif |
1731 | 1732 | ||
1733 | static void __devinit i2c_bus_probe(struct viafb_shared *shared) | ||
1734 | { | ||
1735 | /* should be always CRT */ | ||
1736 | printk(KERN_INFO "viafb: Probing I2C bus 0x26\n"); | ||
1737 | shared->i2c_26 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_26)); | ||
1738 | |||
1739 | /* seems to be usually DVP1 */ | ||
1740 | printk(KERN_INFO "viafb: Probing I2C bus 0x31\n"); | ||
1741 | shared->i2c_31 = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_31)); | ||
1742 | |||
1743 | /* FIXME: what is this? */ | ||
1744 | printk(KERN_INFO "viafb: Probing I2C bus 0x2C\n"); | ||
1745 | shared->i2c_2C = via_aux_probe(viafb_find_i2c_adapter(VIA_PORT_2C)); | ||
1746 | |||
1747 | printk(KERN_INFO "viafb: Finished I2C bus probing"); | ||
1748 | } | ||
1749 | |||
1750 | static void i2c_bus_free(struct viafb_shared *shared) | ||
1751 | { | ||
1752 | via_aux_free(shared->i2c_26); | ||
1753 | via_aux_free(shared->i2c_31); | ||
1754 | via_aux_free(shared->i2c_2C); | ||
1755 | } | ||
1732 | 1756 | ||
1733 | int __devinit via_fb_pci_probe(struct viafb_dev *vdev) | 1757 | int __devinit via_fb_pci_probe(struct viafb_dev *vdev) |
1734 | { | 1758 | { |
@@ -1762,6 +1786,7 @@ int __devinit via_fb_pci_probe(struct viafb_dev *vdev) | |||
1762 | &viaparinfo->shared->lvds_setting_info2; | 1786 | &viaparinfo->shared->lvds_setting_info2; |
1763 | viaparinfo->chip_info = &viaparinfo->shared->chip_info; | 1787 | viaparinfo->chip_info = &viaparinfo->shared->chip_info; |
1764 | 1788 | ||
1789 | i2c_bus_probe(viaparinfo->shared); | ||
1765 | if (viafb_dual_fb) | 1790 | if (viafb_dual_fb) |
1766 | viafb_SAMM_ON = 1; | 1791 | viafb_SAMM_ON = 1; |
1767 | parse_lcd_port(); | 1792 | parse_lcd_port(); |
@@ -1915,6 +1940,7 @@ out_fb1_release: | |||
1915 | if (viafbinfo1) | 1940 | if (viafbinfo1) |
1916 | framebuffer_release(viafbinfo1); | 1941 | framebuffer_release(viafbinfo1); |
1917 | out_fb_release: | 1942 | out_fb_release: |
1943 | i2c_bus_free(viaparinfo->shared); | ||
1918 | framebuffer_release(viafbinfo); | 1944 | framebuffer_release(viafbinfo); |
1919 | return rc; | 1945 | return rc; |
1920 | } | 1946 | } |
@@ -1927,6 +1953,7 @@ void __devexit via_fb_pci_remove(struct pci_dev *pdev) | |||
1927 | if (viafb_dual_fb) | 1953 | if (viafb_dual_fb) |
1928 | unregister_framebuffer(viafbinfo1); | 1954 | unregister_framebuffer(viafbinfo1); |
1929 | viafb_remove_proc(viaparinfo->shared); | 1955 | viafb_remove_proc(viaparinfo->shared); |
1956 | i2c_bus_free(viaparinfo->shared); | ||
1930 | framebuffer_release(viafbinfo); | 1957 | framebuffer_release(viafbinfo); |
1931 | if (viafb_dual_fb) | 1958 | if (viafb_dual_fb) |
1932 | framebuffer_release(viafbinfo1); | 1959 | framebuffer_release(viafbinfo1); |
diff --git a/drivers/video/via/viafbdev.h b/drivers/video/via/viafbdev.h index d9440635d1d4..f6b2ddf56e94 100644 --- a/drivers/video/via/viafbdev.h +++ b/drivers/video/via/viafbdev.h | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/fb.h> | 26 | #include <linux/fb.h> |
27 | #include <linux/spinlock.h> | 27 | #include <linux/spinlock.h> |
28 | 28 | ||
29 | #include "via_aux.h" | ||
29 | #include "ioctl.h" | 30 | #include "ioctl.h" |
30 | #include "share.h" | 31 | #include "share.h" |
31 | #include "chip.h" | 32 | #include "chip.h" |
@@ -48,6 +49,11 @@ struct viafb_shared { | |||
48 | struct proc_dir_entry *iga2_proc_entry; | 49 | struct proc_dir_entry *iga2_proc_entry; |
49 | struct viafb_dev *vdev; /* Global dev info */ | 50 | struct viafb_dev *vdev; /* Global dev info */ |
50 | 51 | ||
52 | /* I2C busses that may have auxiliary devices */ | ||
53 | struct via_aux_bus *i2c_26; | ||
54 | struct via_aux_bus *i2c_31; | ||
55 | struct via_aux_bus *i2c_2C; | ||
56 | |||
51 | /* All the information will be needed to set engine */ | 57 | /* All the information will be needed to set engine */ |
52 | struct tmds_setting_information tmds_setting_info; | 58 | struct tmds_setting_information tmds_setting_info; |
53 | struct lvds_setting_information lvds_setting_info; | 59 | struct lvds_setting_information lvds_setting_info; |