| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-only |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * tifm_sd.c - TI FlashMedia driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2006 Alex Dubov <oakad@yahoo.com> |
|---|
| 5 | 6 | * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 8 | | - * published by the Free Software Foundation. |
|---|
| 9 | | - * |
|---|
| 10 | 7 | * Special thanks to Brad Campbell for extensive testing of this driver. |
|---|
| 11 | | - * |
|---|
| 12 | 8 | */ |
|---|
| 13 | 9 | |
|---|
| 14 | 10 | |
|---|
| .. | .. |
|---|
| 76 | 72 | #define TIFM_MMCSD_CMD_ADTC 0x3000 |
|---|
| 77 | 73 | |
|---|
| 78 | 74 | #define TIFM_MMCSD_MAX_BLOCK_SIZE 0x0800UL |
|---|
| 75 | + |
|---|
| 76 | +#define TIFM_MMCSD_REQ_TIMEOUT_MS 1000 |
|---|
| 79 | 77 | |
|---|
| 80 | 78 | enum { |
|---|
| 81 | 79 | CMD_READY = 0x0001, |
|---|
| .. | .. |
|---|
| 336 | 334 | rc |= TIFM_MMCSD_RSP_R0; |
|---|
| 337 | 335 | break; |
|---|
| 338 | 336 | case MMC_RSP_R1B: |
|---|
| 339 | | - rc |= TIFM_MMCSD_RSP_BUSY; // deliberate fall-through |
|---|
| 337 | + rc |= TIFM_MMCSD_RSP_BUSY; |
|---|
| 338 | + fallthrough; |
|---|
| 340 | 339 | case MMC_RSP_R1: |
|---|
| 341 | 340 | rc |= TIFM_MMCSD_RSP_R1; |
|---|
| 342 | 341 | break; |
|---|
| .. | .. |
|---|
| 888 | 887 | struct tifm_dev *sock = host->dev; |
|---|
| 889 | 888 | |
|---|
| 890 | 889 | writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE); |
|---|
| 891 | | - mmiowb(); |
|---|
| 892 | 890 | host->clk_div = 61; |
|---|
| 893 | 891 | host->clk_freq = 20000000; |
|---|
| 894 | 892 | writel(TIFM_MMCSD_RESET, sock->addr + SOCK_MMCSD_SYSTEM_CONTROL); |
|---|
| .. | .. |
|---|
| 939 | 937 | writel(TIFM_MMCSD_CERR | TIFM_MMCSD_BRS | TIFM_MMCSD_EOC |
|---|
| 940 | 938 | | TIFM_MMCSD_ERRMASK, |
|---|
| 941 | 939 | sock->addr + SOCK_MMCSD_INT_ENABLE); |
|---|
| 942 | | - mmiowb(); |
|---|
| 943 | 940 | |
|---|
| 944 | 941 | return 0; |
|---|
| 945 | 942 | } |
|---|
| .. | .. |
|---|
| 964 | 961 | host = mmc_priv(mmc); |
|---|
| 965 | 962 | tifm_set_drvdata(sock, mmc); |
|---|
| 966 | 963 | host->dev = sock; |
|---|
| 967 | | - host->timeout_jiffies = msecs_to_jiffies(1000); |
|---|
| 964 | + host->timeout_jiffies = msecs_to_jiffies(TIFM_MMCSD_REQ_TIMEOUT_MS); |
|---|
| 965 | + /* |
|---|
| 966 | + * We use a fixed request timeout of 1s, hence inform the core about it. |
|---|
| 967 | + * A future improvement should instead respect the cmd->busy_timeout. |
|---|
| 968 | + */ |
|---|
| 969 | + mmc->max_busy_timeout = TIFM_MMCSD_REQ_TIMEOUT_MS; |
|---|
| 968 | 970 | |
|---|
| 969 | 971 | tasklet_init(&host->finish_tasklet, tifm_sd_end_cmd, |
|---|
| 970 | 972 | (unsigned long)host); |
|---|
| .. | .. |
|---|
| 1004 | 1006 | spin_lock_irqsave(&sock->lock, flags); |
|---|
| 1005 | 1007 | host->eject = 1; |
|---|
| 1006 | 1008 | writel(0, sock->addr + SOCK_MMCSD_INT_ENABLE); |
|---|
| 1007 | | - mmiowb(); |
|---|
| 1008 | 1009 | spin_unlock_irqrestore(&sock->lock, flags); |
|---|
| 1009 | 1010 | |
|---|
| 1010 | 1011 | tasklet_kill(&host->finish_tasklet); |
|---|