162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright 2011 Florian Tobias Schandinat <FlorianSchandinat@gmx.de> 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * infrastructure for devices connected via I2C 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __VIA_AUX_H__ 1062306a36Sopenharmony_ci#define __VIA_AUX_H__ 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/list.h> 1462306a36Sopenharmony_ci#include <linux/i2c.h> 1562306a36Sopenharmony_ci#include <linux/fb.h> 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistruct via_aux_bus { 1962306a36Sopenharmony_ci struct i2c_adapter *adap; /* the I2C device to access the bus */ 2062306a36Sopenharmony_ci struct list_head drivers; /* drivers for devices on this bus */ 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct via_aux_drv { 2462306a36Sopenharmony_ci struct list_head chain; /* chain to support multiple drivers */ 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci struct via_aux_bus *bus; /* the I2C bus used */ 2762306a36Sopenharmony_ci u8 addr; /* the I2C slave address */ 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci const char *name; /* human readable name of the driver */ 3062306a36Sopenharmony_ci void *data; /* private data of this driver */ 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci void (*cleanup)(struct via_aux_drv *drv); 3362306a36Sopenharmony_ci const struct fb_videomode* (*get_preferred_mode) 3462306a36Sopenharmony_ci (struct via_aux_drv *drv); 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct via_aux_bus *via_aux_probe(struct i2c_adapter *adap); 3962306a36Sopenharmony_civoid via_aux_free(struct via_aux_bus *bus); 4062306a36Sopenharmony_ciconst struct fb_videomode *via_aux_get_preferred_mode(struct via_aux_bus *bus); 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_cistatic inline bool via_aux_add(struct via_aux_drv *drv) 4462306a36Sopenharmony_ci{ 4562306a36Sopenharmony_ci struct via_aux_drv *data = kmalloc(sizeof(*data), GFP_KERNEL); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci if (!data) 4862306a36Sopenharmony_ci return false; 4962306a36Sopenharmony_ci 5062306a36Sopenharmony_ci *data = *drv; 5162306a36Sopenharmony_ci list_add_tail(&data->chain, &data->bus->drivers); 5262306a36Sopenharmony_ci return true; 5362306a36Sopenharmony_ci} 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_cistatic inline bool via_aux_read(struct via_aux_drv *drv, u8 start, u8 *buf, 5662306a36Sopenharmony_ci u8 len) 5762306a36Sopenharmony_ci{ 5862306a36Sopenharmony_ci struct i2c_msg msg[2] = { 5962306a36Sopenharmony_ci {.addr = drv->addr, .flags = 0, .len = 1, .buf = &start}, 6062306a36Sopenharmony_ci {.addr = drv->addr, .flags = I2C_M_RD, .len = len, .buf = buf} }; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci return i2c_transfer(drv->bus->adap, msg, 2) == 2; 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci/* probe functions of existing drivers - should only be called in via_aux.c */ 6762306a36Sopenharmony_civoid via_aux_ch7301_probe(struct via_aux_bus *bus); 6862306a36Sopenharmony_civoid via_aux_edid_probe(struct via_aux_bus *bus); 6962306a36Sopenharmony_civoid via_aux_sii164_probe(struct via_aux_bus *bus); 7062306a36Sopenharmony_civoid via_aux_vt1636_probe(struct via_aux_bus *bus); 7162306a36Sopenharmony_civoid via_aux_vt1632_probe(struct via_aux_bus *bus); 7262306a36Sopenharmony_civoid via_aux_vt1631_probe(struct via_aux_bus *bus); 7362306a36Sopenharmony_civoid via_aux_vt1625_probe(struct via_aux_bus *bus); 7462306a36Sopenharmony_civoid via_aux_vt1622_probe(struct via_aux_bus *bus); 7562306a36Sopenharmony_civoid via_aux_vt1621_probe(struct via_aux_bus *bus); 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#endif /* __VIA_AUX_H__ */ 79