#ifndef __LINUX_MAPLE_H
#define __LINUX_MAPLE_H

#include <linux/device.h>

extern struct bus_type maple_bus_type;

/* Maple Bus command and response codes */
enum maple_code {
       MAPLE_RESPONSE_FILEERR = -5,
       MAPLE_RESPONSE_AGAIN = -4,      /* request should be retransmitted */
       MAPLE_RESPONSE_BADCMD = -3,
       MAPLE_RESPONSE_BADFUNC = -2,
       MAPLE_RESPONSE_NONE = -1,       /* unit didn't respond at all */
       MAPLE_COMMAND_DEVINFO = 1,
       MAPLE_COMMAND_ALLINFO = 2,
       MAPLE_COMMAND_RESET = 3,
       MAPLE_COMMAND_KILL = 4,
       MAPLE_RESPONSE_DEVINFO = 5,
       MAPLE_RESPONSE_ALLINFO = 6,
       MAPLE_RESPONSE_OK = 7,
       MAPLE_RESPONSE_DATATRF = 8,
       MAPLE_COMMAND_GETCOND = 9,
       MAPLE_COMMAND_GETMINFO = 10,
       MAPLE_COMMAND_BREAD = 11,
       MAPLE_COMMAND_BWRITE = 12,
       MAPLE_COMMAND_SETCOND = 14
};

struct mapleq {
       struct list_head list;
       struct maple_device *dev;
       void *sendbuf, *recvbuf, *recvbufdcsp;
       unsigned char length;
       enum maple_code command;
};

struct maple_devinfo {
       unsigned long function;
       unsigned long function_data[3];
       unsigned char area_code;
       unsigned char connector_directon;
       char product_name[31];
       char product_licence[61];
       unsigned short standby_power;
       unsigned short max_power;
};

struct maple_device {
       struct maple_driver *driver;
       struct mapleq *mq;
       void *private_data;
       void (*callback) (struct mapleq * mq);
       unsigned long when, interval, function;
       struct maple_devinfo devinfo;
       unsigned char port, unit;
       char product_name[32];
       char product_licence[64];
       int registered;
       struct device dev;
};

struct maple_driver {
       unsigned long function;
       int (*connect) (struct maple_device * dev);
       void (*disconnect) (struct maple_device * dev);
       struct device_driver drv;
};

void maple_getcond_callback(struct maple_device *dev,
                           void (*callback) (struct mapleq * mq),
                           unsigned long interval,
                           unsigned long function);
int maple_driver_register(struct device_driver *drv);
void maple_add_packet(struct mapleq *mq);

#define to_maple_dev(n) container_of(n, struct maple_device, dev)
#define to_maple_driver(n) container_of(n, struct maple_driver, drv)

#endif /* __LINUX_MAPLE_H */