]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/staging/brcm80211/brcmfmac/bcmsdh_sdmmc.c
staging: brcm80211: move sdio related suspend/resume code to bus interface layer
[mv-sheeva.git] / drivers / staging / brcm80211 / brcmfmac / bcmsdh_sdmmc.c
index 59bdfeaf05aecc83aea88b00445596c26101b768..48527bb380e97344d02fdf41e551ac0c07debd29 100644 (file)
 extern int brcmf_sdio_function_init(void);
 extern void brcmf_sdio_function_cleanup(void);
 
-#if !defined(OOB_INTR_ONLY)
 static void brcmf_sdioh_irqhandler(struct sdio_func *func);
 static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func);
-#endif                         /* !defined(OOB_INTR_ONLY) */
-static int brcmf_sdioh_get_cisaddr(sdioh_info_t *sd, u32 regaddr);
+static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr);
 extern int brcmf_sdioh_reset_comm(struct mmc_card *card);
 
 extern PBCMSDH_SDMMC_INSTANCE gInstance;
@@ -54,17 +52,10 @@ DHD_PM_RESUME_WAIT_INIT(sdioh_request_buffer_wait);
 
 #define DMA_ALIGN_MASK 0x03
 
-int brcmf_sdioh_card_regread(sdioh_info_t *sd, int func, u32 regaddr,
+int brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr,
                             int regsize, u32 *data);
 
-void brcmf_sdioh_set_host_pm_flags(int flag)
-{
-       if (sdio_set_host_pm_flags(gInstance->func[1], flag))
-               printk(KERN_ERR "%s: Failed to set pm_flags 0x%08x\n",\
-                        __func__, (unsigned int)flag);
-}
-
-static int brcmf_sdioh_enablefuncs(sdioh_info_t *sd)
+static int brcmf_sdioh_enablefuncs(struct sdioh_info *sd)
 {
        int err_ret;
        u32 fbraddr;
@@ -106,9 +97,9 @@ static int brcmf_sdioh_enablefuncs(sdioh_info_t *sd)
 /*
  *     Public entry points & extern's
  */
-sdioh_info_t *brcmf_sdioh_attach(void *bar0, uint irq)
+struct sdioh_info *brcmf_sdioh_attach(void *bar0, uint irq)
 {
-       sdioh_info_t *sd;
+       struct sdioh_info *sd;
        int err_ret;
 
        sd_trace(("%s\n", __func__));
@@ -118,7 +109,7 @@ sdioh_info_t *brcmf_sdioh_attach(void *bar0, uint irq)
                return NULL;
        }
 
-       sd = kzalloc(sizeof(sdioh_info_t), GFP_ATOMIC);
+       sd = kzalloc(sizeof(struct sdioh_info), GFP_ATOMIC);
        if (sd == NULL) {
                sd_err(("sdioh_attach: out of memory\n"));
                return NULL;
@@ -167,7 +158,7 @@ sdioh_info_t *brcmf_sdioh_attach(void *bar0, uint irq)
        return sd;
 }
 
-extern SDIOH_API_RC brcmf_sdioh_detach(sdioh_info_t *sd)
+extern int brcmf_sdioh_detach(struct sdioh_info *sd)
 {
        sd_trace(("%s\n", __func__));
 
@@ -191,77 +182,10 @@ extern SDIOH_API_RC brcmf_sdioh_detach(sdioh_info_t *sd)
        return SDIOH_API_RC_SUCCESS;
 }
 
-#if defined(OOB_INTR_ONLY) && defined(HW_OOB)
-
-extern SDIOH_API_RC brcmf_sdioh_enable_func_intr(void)
-{
-       u8 reg;
-       int err;
-
-       if (gInstance->func[0]) {
-               sdio_claim_host(gInstance->func[0]);
-
-               reg = sdio_readb(gInstance->func[0], SDIOD_CCCR_INTEN, &err);
-               if (err) {
-                       sd_err(("%s: error for read SDIO_CCCR_IENx : 0x%x\n",
-                               __func__, err));
-                       sdio_release_host(gInstance->func[0]);
-                       return SDIOH_API_RC_FAIL;
-               }
-
-               /* Enable F1 and F2 interrupts, set master enable */
-               reg |=
-                   (INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN |
-                    INTR_CTL_MASTER_EN);
-
-               sdio_writeb(gInstance->func[0], reg, SDIOD_CCCR_INTEN, &err);
-               sdio_release_host(gInstance->func[0]);
-
-               if (err) {
-                       sd_err(("%s: error for write SDIO_CCCR_IENx : 0x%x\n",
-                               __func__, err));
-                       return SDIOH_API_RC_FAIL;
-               }
-       }
-
-       return SDIOH_API_RC_SUCCESS;
-}
-
-extern SDIOH_API_RC brcmf_sdioh_disable_func_intr(void)
-{
-       u8 reg;
-       int err;
-
-       if (gInstance->func[0]) {
-               sdio_claim_host(gInstance->func[0]);
-               reg = sdio_readb(gInstance->func[0], SDIOD_CCCR_INTEN, &err);
-               if (err) {
-                       sd_err(("%s: error for read SDIO_CCCR_IENx : 0x%x\n",
-                               __func__, err));
-                       sdio_release_host(gInstance->func[0]);
-                       return SDIOH_API_RC_FAIL;
-               }
-
-               reg &= ~(INTR_CTL_FUNC1_EN | INTR_CTL_FUNC2_EN);
-               /* Disable master interrupt with the last function interrupt */
-               if (!(reg & 0xFE))
-                       reg = 0;
-               sdio_writeb(gInstance->func[0], reg, SDIOD_CCCR_INTEN, &err);
-
-               sdio_release_host(gInstance->func[0]);
-               if (err) {
-                       sd_err(("%s: error for write SDIO_CCCR_IENx : 0x%x\n",
-                               __func__, err));
-                       return SDIOH_API_RC_FAIL;
-               }
-       }
-       return SDIOH_API_RC_SUCCESS;
-}
-#endif                         /* defined(OOB_INTR_ONLY) && defined(HW_OOB) */
-
 /* Configure callback to client when we receive client interrupt */
-extern SDIOH_API_RC
-brcmf_sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh)
+extern int
+brcmf_sdioh_interrupt_register(struct sdioh_info *sd, sdioh_cb_fn_t fn,
+                              void *argh)
 {
        sd_trace(("%s: Entering\n", __func__));
        if (fn == NULL) {
@@ -269,7 +193,7 @@ brcmf_sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh)
                        __func__));
                return SDIOH_API_RC_FAIL;
        }
-#if !defined(OOB_INTR_ONLY)
+
        sd->intr_handler = fn;
        sd->intr_handler_arg = argh;
        sd->intr_handler_valid = true;
@@ -286,17 +210,14 @@ brcmf_sdioh_interrupt_register(sdioh_info_t *sd, sdioh_cb_fn_t fn, void *argh)
                sdio_claim_irq(gInstance->func[1], brcmf_sdioh_irqhandler);
                sdio_release_host(gInstance->func[1]);
        }
-#elif defined(HW_OOB)
-       brcmf_sdioh_enable_func_intr();
-#endif                         /* defined(OOB_INTR_ONLY) */
+
        return SDIOH_API_RC_SUCCESS;
 }
 
-extern SDIOH_API_RC brcmf_sdioh_interrupt_deregister(sdioh_info_t *sd)
+extern int brcmf_sdioh_interrupt_deregister(struct sdioh_info *sd)
 {
        sd_trace(("%s: Entering\n", __func__));
 
-#if !defined(OOB_INTR_ONLY)
        if (gInstance->func[1]) {
                /* register and unmask irq */
                sdio_claim_host(gInstance->func[1]);
@@ -315,27 +236,26 @@ extern SDIOH_API_RC brcmf_sdioh_interrupt_deregister(sdioh_info_t *sd)
        sd->intr_handler_valid = false;
        sd->intr_handler = NULL;
        sd->intr_handler_arg = NULL;
-#elif defined(HW_OOB)
-       brcmf_sdioh_disable_func_intr();
-#endif                         /*  !defined(OOB_INTR_ONLY) */
+
        return SDIOH_API_RC_SUCCESS;
 }
 
-extern SDIOH_API_RC brcmf_sdioh_interrupt_query(sdioh_info_t *sd, bool *onoff)
+extern int
+brcmf_sdioh_interrupt_query(struct sdioh_info *sd, bool *onoff)
 {
        sd_trace(("%s: Entering\n", __func__));
        *onoff = sd->client_intr_enabled;
        return SDIOH_API_RC_SUCCESS;
 }
 
-#if defined(DHD_DEBUG)
-extern bool brcmf_sdioh_interrupt_pending(sdioh_info_t *sd)
+#if defined(BCMDBG)
+extern bool brcmf_sdioh_interrupt_pending(struct sdioh_info *sd)
 {
        return 0;
 }
 #endif
 
-uint brcmf_sdioh_query_iofnum(sdioh_info_t *sd)
+uint brcmf_sdioh_query_iofnum(struct sdioh_info *sd)
 {
        return sd->num_funcs;
 }
@@ -357,7 +277,7 @@ const struct brcmu_iovar sdioh_iovars[] = {
                                                                 size) */
        {"sd_ints", IOV_USEINTS, 0, IOVT_BOOL, 0},
        {"sd_numints", IOV_NUMINTS, 0, IOVT_UINT32, 0},
-       {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(sdreg_t)}
+       {"sd_devreg", IOV_DEVREG, 0, IOVT_BUFFER, sizeof(struct brcmf_sdreg)}
        ,
        {"sd_rxchain", IOV_RXCHAIN, 0, IOVT_BOOL, 0}
        ,
@@ -365,7 +285,7 @@ const struct brcmu_iovar sdioh_iovars[] = {
 };
 
 int
-brcmf_sdioh_iovar_op(sdioh_info_t *si, const char *name,
+brcmf_sdioh_iovar_op(struct sdioh_info *si, const char *name,
                     void *params, int plen, void *arg, int len, bool set)
 {
        const struct brcmu_iovar *vi = NULL;
@@ -496,7 +416,8 @@ brcmf_sdioh_iovar_op(sdioh_info_t *si, const char *name,
 
        case IOV_GVAL(IOV_DEVREG):
                {
-                       sdreg_t *sd_ptr = (sdreg_t *) params;
+                       struct brcmf_sdreg *sd_ptr =
+                                       (struct brcmf_sdreg *) params;
                        u8 data = 0;
 
                        if (brcmf_sdioh_cfg_read
@@ -512,7 +433,8 @@ brcmf_sdioh_iovar_op(sdioh_info_t *si, const char *name,
 
        case IOV_SVAL(IOV_DEVREG):
                {
-                       sdreg_t *sd_ptr = (sdreg_t *) params;
+                       struct brcmf_sdreg *sd_ptr =
+                                       (struct brcmf_sdreg *) params;
                        u8 data = (u8) sd_ptr->value;
 
                        if (brcmf_sdioh_cfg_write
@@ -532,43 +454,25 @@ exit:
        return bcmerror;
 }
 
-#if defined(OOB_INTR_ONLY) && defined(HW_OOB)
-
-SDIOH_API_RC brcmf_sdioh_enable_hw_oob_intr(sdioh_info_t *sd, bool enable)
+extern int
+brcmf_sdioh_cfg_read(struct sdioh_info *sd, uint fnc_num, u32 addr, u8 *data)
 {
-       SDIOH_API_RC status;
-       u8 data;
-
-       if (enable)
-               data = 3;       /* enable hw oob interrupt */
-       else
-               data = 4;       /* disable hw oob interrupt */
-       data |= 4;              /* Active HIGH */
-
-       status = brcmf_sdioh_request_byte(sd, SDIOH_WRITE, 0, 0xf2, &data);
-       return status;
-}
-#endif                         /* defined(OOB_INTR_ONLY) && defined(HW_OOB) */
-
-extern SDIOH_API_RC
-brcmf_sdioh_cfg_read(sdioh_info_t *sd, uint fnc_num, u32 addr, u8 *data)
-{
-       SDIOH_API_RC status;
+       int status;
        /* No lock needed since brcmf_sdioh_request_byte does locking */
        status = brcmf_sdioh_request_byte(sd, SDIOH_READ, fnc_num, addr, data);
        return status;
 }
 
-extern SDIOH_API_RC
-brcmf_sdioh_cfg_write(sdioh_info_t *sd, uint fnc_num, u32 addr, u8 *data)
+extern int
+brcmf_sdioh_cfg_write(struct sdioh_info *sd, uint fnc_num, u32 addr, u8 *data)
 {
        /* No lock needed since brcmf_sdioh_request_byte does locking */
-       SDIOH_API_RC status;
+       int status;
        status = brcmf_sdioh_request_byte(sd, SDIOH_WRITE, fnc_num, addr, data);
        return status;
 }
 
-static int brcmf_sdioh_get_cisaddr(sdioh_info_t *sd, u32 regaddr)
+static int brcmf_sdioh_get_cisaddr(struct sdioh_info *sd, u32 regaddr)
 {
        /* read 24 bits and return valid 17 bit addr */
        int i;
@@ -589,8 +493,8 @@ static int brcmf_sdioh_get_cisaddr(sdioh_info_t *sd, u32 regaddr)
        return scratch;
 }
 
-extern SDIOH_API_RC
-brcmf_sdioh_cis_read(sdioh_info_t *sd, uint func, u8 *cisd, u32 length)
+extern int
+brcmf_sdioh_cis_read(struct sdioh_info *sd, uint func, u8 *cisd, u32 length)
 {
        u32 count;
        int offset;
@@ -623,9 +527,9 @@ brcmf_sdioh_cis_read(sdioh_info_t *sd, uint func, u8 *cisd, u32 length)
        return SDIOH_API_RC_SUCCESS;
 }
 
-extern SDIOH_API_RC
-brcmf_sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr,
-                  u8 *byte)
+extern int
+brcmf_sdioh_request_byte(struct sdioh_info *sd, uint rw, uint func,
+                        uint regaddr, u8 *byte)
 {
        int err_ret;
 
@@ -663,7 +567,6 @@ brcmf_sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr,
                                        sdio_release_host(gInstance->func[2]);
                                }
                        }
-#if defined(MMC_SDIO_ABORT)
                        /* to allow abort command through F1 */
                        else if (regaddr == SDIO_CCCR_ABORT) {
                                sdio_claim_host(gInstance->func[func]);
@@ -677,7 +580,6 @@ brcmf_sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr,
                                            regaddr, &err_ret);
                                sdio_release_host(gInstance->func[func]);
                        }
-#endif                         /* MMC_SDIO_ABORT */
                        else if (regaddr < 0xF0) {
                                sd_err(("bcmsdh_sdmmc: F0 Wr:0x%02x: write "
                                        "disallowed\n", regaddr));
@@ -722,9 +624,9 @@ brcmf_sdioh_request_byte(sdioh_info_t *sd, uint rw, uint func, uint regaddr,
        return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL);
 }
 
-extern SDIOH_API_RC
-brcmf_sdioh_request_word(sdioh_info_t *sd, uint cmd_type, uint rw, uint func,
-                  uint addr, u32 *word, uint nbytes)
+extern int
+brcmf_sdioh_request_word(struct sdioh_info *sd, uint cmd_type, uint rw,
+                        uint func, uint addr, u32 *word, uint nbytes)
 {
        int err_ret = SDIOH_API_RC_FAIL;
 
@@ -775,8 +677,8 @@ brcmf_sdioh_request_word(sdioh_info_t *sd, uint cmd_type, uint rw, uint func,
        return ((err_ret == 0) ? SDIOH_API_RC_SUCCESS : SDIOH_API_RC_FAIL);
 }
 
-static SDIOH_API_RC
-brcmf_sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write,
+static int
+brcmf_sdioh_request_packet(struct sdioh_info *sd, uint fix_inc, uint write,
                           uint func, uint addr, struct sk_buff *pkt)
 {
        bool fifo = (fix_inc == SDIOH_DATA_FIX);
@@ -798,13 +700,6 @@ brcmf_sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write,
                pkt_len += 3;
                pkt_len &= 0xFFFFFFFC;
 
-#ifdef CONFIG_MMC_MSM7X00A
-               if ((pkt_len % 64) == 32) {
-                       sd_trace(("%s: Rounding up TX packet +=32\n",
-                                 __func__));
-                       pkt_len += 32;
-               }
-#endif                         /* CONFIG_MMC_MSM7X00A */
                /* Make sure the packet is aligned properly.
                 * If it isn't, then this
                 * is the fault of brcmf_sdioh_request_buffer() which
@@ -871,12 +766,12 @@ brcmf_sdioh_request_packet(sdioh_info_t *sd, uint fix_inc, uint write,
  * aligned packet.
  *
  */
-extern SDIOH_API_RC
-brcmf_sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc,
+extern int
+brcmf_sdioh_request_buffer(struct sdioh_info *sd, uint pio_dma, uint fix_inc,
                           uint write, uint func, uint addr, uint reg_width,
                           uint buflen_u, u8 *buffer, struct sk_buff *pkt)
 {
-       SDIOH_API_RC Status;
+       int Status;
        struct sk_buff *mypkt = NULL;
 
        sd_trace(("%s: Enter\n", __func__));
@@ -945,25 +840,21 @@ brcmf_sdioh_request_buffer(sdioh_info_t *sd, uint pio_dma, uint fix_inc,
 }
 
 /* this function performs "abort" for both of host & device */
-extern int brcmf_sdioh_abort(sdioh_info_t *sd, uint func)
+extern int brcmf_sdioh_abort(struct sdioh_info *sd, uint func)
 {
-#if defined(MMC_SDIO_ABORT)
        char t_func = (char)func;
-#endif                         /* defined(MMC_SDIO_ABORT) */
        sd_trace(("%s: Enter\n", __func__));
 
-#if defined(MMC_SDIO_ABORT)
        /* issue abort cmd52 command through F0 */
        brcmf_sdioh_request_byte(sd, SDIOH_WRITE, SDIO_FUNC_0, SDIO_CCCR_ABORT,
                           &t_func);
-#endif                         /* defined(MMC_SDIO_ABORT) */
 
        sd_trace(("%s: Exit\n", __func__));
        return SDIOH_API_RC_SUCCESS;
 }
 
 /* Reset and re-initialize the device */
-int brcmf_sdioh_reset(sdioh_info_t *si)
+int brcmf_sdioh_reset(struct sdioh_info *si)
 {
        sd_trace(("%s: Enter\n", __func__));
        sd_trace(("%s: Exit\n", __func__));
@@ -971,14 +862,14 @@ int brcmf_sdioh_reset(sdioh_info_t *si)
 }
 
 /* Disable device interrupt */
-void brcmf_sdioh_dev_intr_off(sdioh_info_t *sd)
+void brcmf_sdioh_dev_intr_off(struct sdioh_info *sd)
 {
        sd_trace(("%s: %d\n", __func__, sd->use_client_ints));
        sd->intmask &= ~CLIENT_INTR;
 }
 
 /* Enable device interrupt */
-void brcmf_sdioh_dev_intr_on(sdioh_info_t *sd)
+void brcmf_sdioh_dev_intr_on(struct sdioh_info *sd)
 {
        sd_trace(("%s: %d\n", __func__, sd->use_client_ints));
        sd->intmask |= CLIENT_INTR;
@@ -986,7 +877,7 @@ void brcmf_sdioh_dev_intr_on(sdioh_info_t *sd)
 
 /* Read client card reg */
 int
-brcmf_sdioh_card_regread(sdioh_info_t *sd, int func, u32 regaddr,
+brcmf_sdioh_card_regread(struct sdioh_info *sd, int func, u32 regaddr,
                         int regsize, u32 *data)
 {
 
@@ -1009,11 +900,10 @@ brcmf_sdioh_card_regread(sdioh_info_t *sd, int func, u32 regaddr,
        return SUCCESS;
 }
 
-#if !defined(OOB_INTR_ONLY)
 /* bcmsdh_sdmmc interrupt handler */
 static void brcmf_sdioh_irqhandler(struct sdio_func *func)
 {
-       sdioh_info_t *sd;
+       struct sdioh_info *sd;
 
        sd_trace(("bcmsdh_sdmmc: ***IRQHandler\n"));
        sd = gInstance->sd;
@@ -1039,7 +929,7 @@ static void brcmf_sdioh_irqhandler(struct sdio_func *func)
 /* bcmsdh_sdmmc interrupt handler for F2 (dummy handler) */
 static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func)
 {
-       sdioh_info_t *sd;
+       struct sdioh_info *sd;
 
        sd_trace(("bcmsdh_sdmmc: ***IRQHandlerF2\n"));
 
@@ -1047,41 +937,13 @@ static void brcmf_sdioh_irqhandler_f2(struct sdio_func *func)
 
        ASSERT(sd != NULL);
 }
-#endif                         /* !defined(OOB_INTR_ONLY) */
-
-#ifdef NOTUSED
-/* Write client card reg */
-static int
-brcmf_sdioh_card_regwrite(sdioh_info_t *sd, int func, u32 regaddr,
-                         int regsize, u32 data)
-{
-
-       if ((func == 0) || (regsize == 1)) {
-               u8 temp;
-
-               temp = data & 0xff;
-               brcmf_sdioh_request_byte(sd, SDIOH_READ, func, regaddr, &temp);
-               sd_data(("%s: byte write data=0x%02x\n", __func__, data));
-       } else {
-               if (regsize == 2)
-                       data &= 0xffff;
-
-               brcmf_sdioh_request_word(sd, 0, SDIOH_READ, func, regaddr,
-                                        &data, regsize);
-
-               sd_data(("%s: word write data=0x%08x\n", __func__, data));
-       }
-
-       return SUCCESS;
-}
-#endif                         /* NOTUSED */
 
-int brcmf_sdioh_start(sdioh_info_t *si, int stage)
+int brcmf_sdioh_start(struct sdioh_info *si, int stage)
 {
        return 0;
 }
 
-int brcmf_sdioh_stop(sdioh_info_t *si)
+int brcmf_sdioh_stop(struct sdioh_info *si)
 {
        return 0;
 }