blob: a8043178f92660e9f1f306a6ae5acbe1ceaf53b4 [file] [log] [blame]
Ben Skeggs6ee73862009-12-11 19:24:15 +10001#ifndef __NOUVEAU_I2C_H__
2#define __NOUVEAU_I2C_H__
3
Ben Skeggs4196faa2012-07-10 14:36:38 +10004#include <core/subdev.h>
5#include <core/device.h>
6
7#include <subdev/bios.h>
8#include <subdev/bios/i2c.h>
Ben Skeggs6ee73862009-12-11 19:24:15 +10009
Ben Skeggs486a45c2011-11-11 10:22:19 +100010#define NV_I2C_PORT(n) (0x00 + (n))
Ben Skeggs486a45c2011-11-11 10:22:19 +100011#define NV_I2C_DEFAULT(n) (0x80 + (n))
Ben Skeggs6ee73862009-12-11 19:24:15 +100012
Ben Skeggs4196faa2012-07-10 14:36:38 +100013struct nouveau_i2c_port {
Ben Skeggs6ee73862009-12-11 19:24:15 +100014 struct i2c_adapter adapter;
Ben Skeggs4196faa2012-07-10 14:36:38 +100015 struct nouveau_i2c *i2c;
Ben Skeggsec9b3a92012-05-04 14:38:49 +100016 struct i2c_algo_bit_data bit;
Ben Skeggs486a45c2011-11-11 10:22:19 +100017 struct list_head head;
18 u8 index;
Ben Skeggs548ddb62013-02-16 13:19:18 +100019 u16 type;
Ben Skeggs486a45c2011-11-11 10:22:19 +100020 u32 dcb;
Ben Skeggs2bdb06e2011-11-17 13:56:14 +100021 u32 drive;
22 u32 sense;
23 u32 state;
Ben Skeggs31a34aa2013-02-14 20:59:41 -050024 void (*aux_mux)(struct nouveau_i2c_port *);
25 int (*aux)(struct nouveau_i2c_port *, u8, u32, u8 *, u8);
Ben Skeggs6ee73862009-12-11 19:24:15 +100026};
27
Ben Skeggs4196faa2012-07-10 14:36:38 +100028struct nouveau_i2c {
29 struct nouveau_subdev base;
Ben Skeggs6ee73862009-12-11 19:24:15 +100030
Ben Skeggs4196faa2012-07-10 14:36:38 +100031 struct nouveau_i2c_port *(*find)(struct nouveau_i2c *, u8 index);
Ben Skeggs548ddb62013-02-16 13:19:18 +100032 struct nouveau_i2c_port *(*find_type)(struct nouveau_i2c *, u16 type);
Ben Skeggs4196faa2012-07-10 14:36:38 +100033 int (*identify)(struct nouveau_i2c *, int index,
34 const char *what, struct i2c_board_info *,
35 bool (*match)(struct nouveau_i2c_port *,
36 struct i2c_board_info *));
37 struct list_head ports;
38};
Ben Skeggs6ee73862009-12-11 19:24:15 +100039
Ben Skeggs4196faa2012-07-10 14:36:38 +100040static inline struct nouveau_i2c *
41nouveau_i2c(void *obj)
42{
43 return (void *)nv_device(obj)->subdev[NVDEV_SUBDEV_I2C];
44}
45
46extern struct nouveau_oclass nouveau_i2c_oclass;
47
48void nouveau_i2c_drive_scl(void *, int);
49void nouveau_i2c_drive_sda(void *, int);
50int nouveau_i2c_sense_scl(void *);
51int nouveau_i2c_sense_sda(void *);
52
53int nv_rdi2cr(struct nouveau_i2c_port *, u8 addr, u8 reg);
54int nv_wri2cr(struct nouveau_i2c_port *, u8 addr, u8 reg, u8 val);
55bool nv_probe_i2c(struct nouveau_i2c_port *, u8 addr);
56
57int nv_rdaux(struct nouveau_i2c_port *, u32 addr, u8 *data, u8 size);
58int nv_wraux(struct nouveau_i2c_port *, u32 addr, u8 *data, u8 size);
59
60extern const struct i2c_algorithm nouveau_i2c_bit_algo;
61extern const struct i2c_algorithm nouveau_i2c_aux_algo;
62
Ben Skeggs31a34aa2013-02-14 20:59:41 -050063void nv94_aux_mux(struct nouveau_i2c_port *);
64int nv94_aux(struct nouveau_i2c_port *, u8, u32, u8 *, u8);
65
Ben Skeggs4196faa2012-07-10 14:36:38 +100066#endif