/* * 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 . */ #ifndef _LINUX_MIPI_BIF_H #define _LINUX_MIPI_BIF_H #include #include #include #include /* for struct device */ #include /* for completion */ #include /* 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 */