blob: 2ace349e22e28a32d0c41d220adedbbd18e2e52a [file] [log] [blame]
/*
* Copyright (c) 2012-2013, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _LINUX_MIPI_BIF_H
#define _LINUX_MIPI_BIF_H
#include <linux/types.h>
#include <linux/module.h>
#include <linux/mod_devicetable.h>
#include <linux/device.h> /* for struct device */
#include <linux/sched.h> /* for completion */
#include <linux/mutex.h>
/* Below represent 2 bit (9:8) prefixes for commands */
#define MIPI_BIF_WD (0x0<<8) /* Bits 7:0 are meant for data */
#define MIPI_BIF_ERA (0x1<<8) /* Bits 7:0 are meant for reg add (high) */
#define MIPI_BIF_WRA (0x2<<8) /* Bits 7:0 are meant for reg add (low) */
#define MIPI_BIF_RRA (0x3<<8) /* Bits 7:0 are meant for reg add (low) */
#define MIPI_BIF_BUS_COMMAND (0x4<<8) /* Bits 7:0 are meant to indicate the type of bus command */
#define MIPI_BIF_EDA (0x5<<8) /* Bits 7:0 are meant for device add (high) */
#define MIPI_BIF_SDA (0x6<<8) /* Bits 7:0 are meant for device add (low) */
/* Below are 10 bit (9:0) bus commands */
#define MIPI_BIF_BUS_COMMAND_RESET (0x0 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_PWDN (0x2 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_STBY (0x3 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_EINT (0x10 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_ISTS (0x11 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_RBL0 ((0x2 << 4) | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_RBE0 ((0x3 << 4) | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DASM (0x40 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_BRES (0x00 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DISS (0x80 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DILC (0x81 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DIE0 (0x84 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DIE1 (0x85 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DIP0 (0x86 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DIP1 (0x87 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_DRES (0xc0 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_TQ (0xc2 | MIPI_BIF_BUS_COMMAND)
#define MIPI_BIF_BUS_COMMAND_AIO (0xc4 | MIPI_BIF_BUS_COMMAND)
/* Below are command codes to be used from client side */
#define MIPI_BIF_WRITE 0x0001
#define MIPI_BIF_READDATA 0x0002
#define MIPI_BIF_INT_READ 0x0003
#define MIPI_BIF_STDBY 0x0004
#define MIPI_BIF_PWRDOWN 0x0005
#define MIPI_BIF_ACTIVATE 0x0006
#define MIPI_BIF_INT_EXIT 0x0007
#define MIPI_BIF_HARD_RESET 0x0008
/* Error codes for READ */
#define MIPI_BIF_RD_ACK_BIT (1<<9)
#define MIPI_BIF_RD_PARITY_ERR 0x11
#define MIPI_BIF_RD_INVERSION_ERR 0x12
#define MIPI_BIF_RD_INVALID_WORD_LEN_ERR 0x13
#define MIPI_BIF_RD_TIMING_ERR 0x14
#define MIPI_BIF_RD_UNKNOWN_CMD_ERR 0x15
#define MIPI_BIF_RD_WRONG_CMD_SEQ 0x16
#define MIPI_BIF_RD_BUS_COLLISION_ERR 0x1F
#define MIPI_BIF_RD_SLAVE_BUSY_ERR 0x20
extern struct bus_type mipi_bif_bus_type;
extern struct device_type mipi_bif_adapter_type;
struct mipi_bif_msg;
struct mipi_bif_algorithm;
struct mipi_bif_adapter;
struct mipi_bif_client;
struct mipi_bif_driver;
extern int mipi_bif_transfer(struct mipi_bif_adapter *adap, struct mipi_bif_msg *msg);
struct mipi_bif_driver {
unsigned int class;
int (*attach_adapter)(struct mipi_bif_adapter *) __deprecated;
int (*detach_adapter)(struct mipi_bif_adapter *) __deprecated;
int (*probe)(struct mipi_bif_client *, const struct mipi_bif_device_id *);
int (*remove)(struct mipi_bif_client *);
int (*shutdown)(struct mipi_bif_client *);
int (*suspend)(struct mipi_bif_client *, pm_message_t mesg);
int (*resume)(struct mipi_bif_client *);
struct device_driver driver;
const struct mipi_bif_device_id *id_table;
struct list_head clients;
};
#define to_mipi_bif_driver(d) container_of(d, struct mipi_bif_driver, driver)
extern int mipi_bif_register_driver(struct module *owner,
struct mipi_bif_driver *driver);
#define mipi_bif_add_driver(driver) \
mipi_bif_register_driver(THIS_MODULE, driver)
extern void mipi_bif_del_driver(struct mipi_bif_driver *driver);
struct mipi_bif_client {
unsigned short addr;
char name[MIPI_BIF_NAME_SIZE];
struct mipi_bif_adapter *adapter; /* the adapter we sit on */
struct mipi_bif_driver *driver; /* and our access routines */
struct device dev; /* the device structure */
};
#define to_mipi_bif_client(d) container_of(d, struct mipi_bif_client, dev)
struct mipi_bif_board_info {
char type[MIPI_BIF_NAME_SIZE];
void *platform_data;
struct dev_archdata *archdata;
unsigned short addr;
};
static inline void *mipi_bif_get_clientdata(const struct mipi_bif_client *dev)
{
return dev_get_drvdata(&dev->dev);
}
static inline void mipi_bif_set_clientdata(struct mipi_bif_client *dev, void *data)
{
dev_set_drvdata(&dev->dev, data);
}
struct mipi_bif_algorithm {
int (*master_xfer)(struct mipi_bif_adapter *adap, struct mipi_bif_msg *msg);
};
struct mipi_bif_adapter {
struct module *owner;
unsigned int class; /* classes to allow probing for */
const struct mipi_bif_algorithm *algo; /* the algorithm to access the bus */
void *algo_data;
struct rt_mutex bus_lock;
int timeout; /* in jiffies */
int retries;
struct device dev; /* the adapter device */
int nr;
char name[48];
struct completion dev_released;
};
#define to_mipi_bif_adapter(d) container_of(d, struct mipi_bif_adapter, dev)
extern struct mipi_bif_adapter *mipi_bif_get_adapter(int nr);
extern struct mipi_bif_client *
mipi_bif_new_device(struct mipi_bif_adapter *adap,
struct mipi_bif_board_info const *info);
extern void mipi_bif_unregister_device(struct mipi_bif_client *client);
static inline void *mipi_bif_get_adapdata(const struct mipi_bif_adapter *dev)
{
return dev_get_drvdata(&dev->dev);
}
static inline void mipi_bif_set_adapdata(struct mipi_bif_adapter *dev, void *data)
{
dev_set_drvdata(&dev->dev, data);
}
static inline int mipi_bif_adapter_id(struct mipi_bif_adapter *adap)
{
return adap->nr;
}
static inline struct mipi_bif_adapter *
mipi_bif_parent_is_mipi_bif_adapter(const struct mipi_bif_adapter *adapter)
{
struct device *parent = adapter->dev.parent;
if (parent != NULL && parent->type == &mipi_bif_adapter_type)
return to_mipi_bif_adapter(parent);
else
return NULL;
}
extern int mipi_bif_add_numbered_adapter(struct mipi_bif_adapter *adap);
struct mipi_bif_msg {
__u16 device_addr; /* slave device address */
__u16 reg_addr; /* register address */
__u16 commands;
__u16 len; /* msg length */
__u8 *buf; /* pointer to msg data */
};
#endif /* _LINUX_MIPI_BIF_H */