aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-powerpc/pmac_low_i2c.h
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2006-01-06 19:30:44 -0500
committerPaul Mackerras <paulus@samba.org>2006-01-08 23:47:16 -0500
commit730745a5c45093982112ddc94cee6a9973455641 (patch)
tree1c36bd96c28d08e2b5d839ba3f4e37588aad2328 /include/asm-powerpc/pmac_low_i2c.h
parent002ec58eb57bac2380f0ed5a4e88121b4bdb32ec (diff)
[PATCH] 1/5 powerpc: Rework PowerMac i2c part 1
This is the first part of a rework of the PowerMac i2c code. It completely reworks the "low_i2c" layer. It is now more flexible, supports KeyWest, SMU and PMU i2c busses, and provides functions to match device nodes to i2c busses and adapters. This patch also extends & fix some bugs in the SMU driver related to i2c support and removes the clock spreading hacks from the pmac feature code rather than adapting them to the new API since they'll be replaced by the platform function code completely in patch 3/5 Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Paul Mackerras <paulus@samba.org>
Diffstat (limited to 'include/asm-powerpc/pmac_low_i2c.h')
-rw-r--r--include/asm-powerpc/pmac_low_i2c.h85
1 files changed, 71 insertions, 14 deletions
diff --git a/include/asm-powerpc/pmac_low_i2c.h b/include/asm-powerpc/pmac_low_i2c.h
index 3fb8d51540dd..adf4fa956572 100644
--- a/include/asm-powerpc/pmac_low_i2c.h
+++ b/include/asm-powerpc/pmac_low_i2c.h
@@ -15,30 +15,87 @@
15 15
16/* i2c mode (based on the platform functions format) */ 16/* i2c mode (based on the platform functions format) */
17enum { 17enum {
18 pmac_low_i2c_mode_dumb = 1, 18 pmac_i2c_mode_dumb = 1,
19 pmac_low_i2c_mode_std = 2, 19 pmac_i2c_mode_std = 2,
20 pmac_low_i2c_mode_stdsub = 3, 20 pmac_i2c_mode_stdsub = 3,
21 pmac_low_i2c_mode_combined = 4, 21 pmac_i2c_mode_combined = 4,
22}; 22};
23 23
24/* RW bit in address */ 24/* RW bit in address */
25enum { 25enum {
26 pmac_low_i2c_read = 0x01, 26 pmac_i2c_read = 0x01,
27 pmac_low_i2c_write = 0x00 27 pmac_i2c_write = 0x00
28}; 28};
29 29
30/* i2c bus type */
31enum {
32 pmac_i2c_bus_keywest = 0,
33 pmac_i2c_bus_pmu = 1,
34 pmac_i2c_bus_smu = 2,
35};
36
37/* i2c bus features */
38enum {
39 /* can_largesub : supports >1 byte subaddresses (SMU only) */
40 pmac_i2c_can_largesub = 0x00000001u,
41
42 /* multibus : device node holds multiple busses, bus number is
43 * encoded in bits 0xff00 of "reg" of a given device
44 */
45 pmac_i2c_multibus = 0x00000002u,
46};
47
48/* i2c busses in the system */
49struct pmac_i2c_bus;
50struct i2c_adapter;
51
30/* Init, called early during boot */ 52/* Init, called early during boot */
31extern void pmac_init_low_i2c(void); 53extern int pmac_i2c_init(void);
54
55/* Lookup an i2c bus for a device-node. The node can be either the bus
56 * node itself or a device below it. In the case of a multibus, the bus
57 * node itself is the controller node, else, it's a child of the controller
58 * node
59 */
60extern struct pmac_i2c_bus *pmac_i2c_find_bus(struct device_node *node);
61
62/* Get the address for an i2c device. This strips the bus number if
63 * necessary. The 7 bits address is returned 1 bit right shifted so that the
64 * direction can be directly ored in
65 */
66extern u8 pmac_i2c_get_dev_addr(struct device_node *device);
67
68/* Get infos about a bus */
69extern struct device_node *pmac_i2c_get_controller(struct pmac_i2c_bus *bus);
70extern struct device_node *pmac_i2c_get_bus_node(struct pmac_i2c_bus *bus);
71extern int pmac_i2c_get_type(struct pmac_i2c_bus *bus);
72extern int pmac_i2c_get_flags(struct pmac_i2c_bus *bus);
73
74/* i2c layer adapter attach/detach */
75extern void pmac_i2c_attach_adapter(struct pmac_i2c_bus *bus,
76 struct i2c_adapter *adapter);
77extern void pmac_i2c_detach_adapter(struct pmac_i2c_bus *bus,
78 struct i2c_adapter *adapter);
79extern struct i2c_adapter *pmac_i2c_get_adapter(struct pmac_i2c_bus *bus);
80
81/* March a device or bus with an i2c adapter structure, to be used by drivers
82 * to match device-tree nodes with i2c adapters during adapter discovery
83 * callbacks
84 */
85extern int pmac_i2c_match_adapter(struct device_node *dev,
86 struct i2c_adapter *adapter);
87
32 88
33/* Locking functions exposed to i2c-keywest */ 89/* (legacy) Locking functions exposed to i2c-keywest */
34int pmac_low_i2c_lock(struct device_node *np); 90extern int pmac_low_i2c_lock(struct device_node *np);
35int pmac_low_i2c_unlock(struct device_node *np); 91extern int pmac_low_i2c_unlock(struct device_node *np);
36 92
37/* Access functions for platform code */ 93/* Access functions for platform code */
38int pmac_low_i2c_open(struct device_node *np, int channel); 94extern int pmac_i2c_open(struct pmac_i2c_bus *bus, int polled);
39int pmac_low_i2c_close(struct device_node *np); 95extern void pmac_i2c_close(struct pmac_i2c_bus *bus);
40int pmac_low_i2c_setmode(struct device_node *np, int mode); 96extern int pmac_i2c_setmode(struct pmac_i2c_bus *bus, int mode);
41int pmac_low_i2c_xfer(struct device_node *np, u8 addrdir, u8 subaddr, u8 *data, int len); 97extern int pmac_i2c_xfer(struct pmac_i2c_bus *bus, u8 addrdir, int subsize,
98 u32 subaddr, u8 *data, int len);
42 99
43 100
44#endif /* __KERNEL__ */ 101#endif /* __KERNEL__ */