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