ufs: Active Power Mode - configuring bActiveICCLevel
[pandora-kernel.git] / drivers / scsi / ufs / ufshcd.h
index acf318e..8365ad4 100644 (file)
@@ -52,6 +52,7 @@
 #include <linux/pm_runtime.h>
 #include <linux/clk.h>
 #include <linux/completion.h>
+#include <linux/regulator/consumer.h>
 
 #include <asm/irq.h>
 #include <asm/byteorder.h>
@@ -68,6 +69,8 @@
 #define UFSHCD "ufshcd"
 #define UFSHCD_DRIVER_VERSION "0.2"
 
+struct ufs_hba;
+
 enum dev_cmd_type {
        DEV_CMD_TYPE_NOP                = 0x0,
        DEV_CMD_TYPE_QUERY              = 0x1,
@@ -152,6 +155,55 @@ struct ufs_dev_cmd {
        struct ufs_query query;
 };
 
+/**
+ * struct ufs_clk_info - UFS clock related info
+ * @list: list headed by hba->clk_list_head
+ * @clk: clock node
+ * @name: clock name
+ * @max_freq: maximum frequency supported by the clock
+ * @enabled: variable to check against multiple enable/disable
+ */
+struct ufs_clk_info {
+       struct list_head list;
+       struct clk *clk;
+       const char *name;
+       u32 max_freq;
+       bool enabled;
+};
+
+#define PRE_CHANGE      0
+#define POST_CHANGE     1
+/**
+ * struct ufs_hba_variant_ops - variant specific callbacks
+ * @name: variant name
+ * @init: called when the driver is initialized
+ * @exit: called to cleanup everything done in init
+ * @setup_clocks: called before touching any of the controller registers
+ * @setup_regulators: called before accessing the host controller
+ * @hce_enable_notify: called before and after HCE enable bit is set to allow
+ *                     variant specific Uni-Pro initialization.
+ * @link_startup_notify: called before and after Link startup is carried out
+ *                       to allow variant specific Uni-Pro initialization.
+ */
+struct ufs_hba_variant_ops {
+       const char *name;
+       int     (*init)(struct ufs_hba *);
+       void    (*exit)(struct ufs_hba *);
+       int     (*setup_clocks)(struct ufs_hba *, bool);
+       int     (*setup_regulators)(struct ufs_hba *, bool);
+       int     (*hce_enable_notify)(struct ufs_hba *, bool);
+       int     (*link_startup_notify)(struct ufs_hba *, bool);
+};
+
+/**
+ * struct ufs_init_prefetch - contains data that is pre-fetched once during
+ * initialization
+ * @icc_level: icc level which was read during initialization
+ */
+struct ufs_init_prefetch {
+       u32 icc_level;
+};
+
 /**
  * struct ufs_hba - per adapter private structure
  * @mmio_base: UFSHCI base register address
@@ -171,6 +223,8 @@ struct ufs_dev_cmd {
  * @nutrs: Transfer Request Queue depth supported by controller
  * @nutmrs: Task Management Queue depth supported by controller
  * @ufs_version: UFS Version to which controller complies
+ * @vops: pointer to variant specific operations
+ * @priv: pointer to variant specific private data
  * @irq: Irq number of the controller
  * @active_uic_cmd: handle of active UIC command
  * @uic_cmd_mutex: mutex for uic command
@@ -183,6 +237,9 @@ struct ufs_dev_cmd {
  * @eh_flags: Error handling flags
  * @intr_mask: Interrupt Mask Bits
  * @ee_ctrl_mask: Exception event control mask
+ * @is_powered: flag to check if HBA is powered
+ * @is_init_prefetch: flag to check if data was pre-fetched in initialization
+ * @init_prefetch_data: data pre-fetched during initialization
  * @eh_work: Worker to handle UFS errors that require s/w attention
  * @eeh_work: Worker to handle exception events
  * @errors: HBA errors
@@ -191,6 +248,8 @@ struct ufs_dev_cmd {
  * @saved_uic_err: sticky UIC error mask
  * @dev_cmd: ufs device management command information
  * @auto_bkops_enabled: to track whether bkops is enabled in device
+ * @vreg_info: UFS device voltage regulator information
+ * @clk_list_head: UFS host controller clocks list node head
  */
 struct ufs_hba {
        void __iomem *mmio_base;
@@ -218,6 +277,8 @@ struct ufs_hba {
        int nutrs;
        int nutmrs;
        u32 ufs_version;
+       struct ufs_hba_variant_ops *vops;
+       void *priv;
        unsigned int irq;
 
        struct uic_command *active_uic_cmd;
@@ -234,6 +295,9 @@ struct ufs_hba {
        u32 eh_flags;
        u32 intr_mask;
        u16 ee_ctrl_mask;
+       bool is_powered;
+       bool is_init_prefetch;
+       struct ufs_init_prefetch init_prefetch_data;
 
        /* Work Queues */
        struct work_struct eh_work;
@@ -249,6 +313,8 @@ struct ufs_hba {
        struct ufs_dev_cmd dev_cmd;
 
        bool auto_bkops_enabled;
+       struct ufs_vreg_info vreg_info;
+       struct list_head clk_list_head;
 };
 
 #define ufshcd_writel(hba, val, reg)   \
@@ -256,8 +322,8 @@ struct ufs_hba {
 #define ufshcd_readl(hba, reg) \
        readl((hba)->mmio_base + (reg))
 
-int ufshcd_init(struct device *, struct ufs_hba ** , void __iomem * ,
-                       unsigned int);
+int ufshcd_alloc_host(struct device *, struct ufs_hba **);
+int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int);
 void ufshcd_remove(struct ufs_hba *);
 
 /**