root/drivers/staging/rts5208/spi.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. spi_set_err_code
  2. spi_init
  3. spi_set_init_para
  4. sf_polling_status
  5. sf_enable_write
  6. sf_disable_write
  7. sf_program
  8. sf_erase
  9. spi_init_eeprom
  10. spi_eeprom_program_enable
  11. spi_erase_eeprom_chip
  12. spi_erase_eeprom_byte
  13. spi_read_eeprom
  14. spi_write_eeprom
  15. spi_get_status
  16. spi_set_parameter
  17. spi_read_flash_id
  18. spi_read_flash
  19. spi_write_flash
  20. spi_erase_flash
  21. spi_write_flash_status

   1 // SPDX-License-Identifier: GPL-2.0+
   2 /*
   3  * Driver for Realtek PCI-Express card reader
   4  *
   5  * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
   6  *
   7  * Author:
   8  *   Wei WANG (wei_wang@realsil.com.cn)
   9  *   Micky Ching (micky_ching@realsil.com.cn)
  10  */
  11 
  12 #include <linux/blkdev.h>
  13 #include <linux/kthread.h>
  14 #include <linux/sched.h>
  15 
  16 #include "rtsx.h"
  17 #include "spi.h"
  18 
  19 static inline void spi_set_err_code(struct rtsx_chip *chip, u8 err_code)
  20 {
  21         struct spi_info *spi = &chip->spi;
  22 
  23         spi->err_code = err_code;
  24 }
  25 
  26 static int spi_init(struct rtsx_chip *chip)
  27 {
  28         int retval;
  29 
  30         retval = rtsx_write_register(chip, SPI_CONTROL, 0xFF,
  31                                      CS_POLARITY_LOW | DTO_MSB_FIRST
  32                                      | SPI_MASTER | SPI_MODE0 | SPI_AUTO);
  33         if (retval)
  34                 return retval;
  35         retval = rtsx_write_register(chip, SPI_TCTL, EDO_TIMING_MASK,
  36                                      SAMPLE_DELAY_HALF);
  37         if (retval)
  38                 return retval;
  39 
  40         return STATUS_SUCCESS;
  41 }
  42 
  43 static int spi_set_init_para(struct rtsx_chip *chip)
  44 {
  45         struct spi_info *spi = &chip->spi;
  46         int retval;
  47 
  48         retval = rtsx_write_register(chip, SPI_CLK_DIVIDER1, 0xFF,
  49                                      (u8)(spi->clk_div >> 8));
  50         if (retval)
  51                 return retval;
  52         retval = rtsx_write_register(chip, SPI_CLK_DIVIDER0, 0xFF,
  53                                      (u8)(spi->clk_div));
  54         if (retval)
  55                 return retval;
  56 
  57         retval = switch_clock(chip, spi->spi_clock);
  58         if (retval != STATUS_SUCCESS)
  59                 return STATUS_FAIL;
  60 
  61         retval = select_card(chip, SPI_CARD);
  62         if (retval != STATUS_SUCCESS)
  63                 return STATUS_FAIL;
  64 
  65         retval = rtsx_write_register(chip, CARD_CLK_EN, SPI_CLK_EN,
  66                                      SPI_CLK_EN);
  67         if (retval)
  68                 return retval;
  69         retval = rtsx_write_register(chip, CARD_OE, SPI_OUTPUT_EN,
  70                                      SPI_OUTPUT_EN);
  71         if (retval)
  72                 return retval;
  73 
  74         wait_timeout(10);
  75 
  76         retval = spi_init(chip);
  77         if (retval != STATUS_SUCCESS)
  78                 return STATUS_FAIL;
  79 
  80         return STATUS_SUCCESS;
  81 }
  82 
  83 static int sf_polling_status(struct rtsx_chip *chip, int msec)
  84 {
  85         int retval;
  86 
  87         rtsx_init_cmd(chip);
  88 
  89         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, SPI_RDSR);
  90         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
  91                      SPI_TRANSFER0_START | SPI_POLLING_MODE0);
  92         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
  93                      SPI_TRANSFER0_END);
  94 
  95         retval = rtsx_send_cmd(chip, 0, msec);
  96         if (retval < 0) {
  97                 rtsx_clear_spi_error(chip);
  98                 spi_set_err_code(chip, SPI_BUSY_ERR);
  99                 return STATUS_FAIL;
 100         }
 101 
 102         return STATUS_SUCCESS;
 103 }
 104 
 105 static int sf_enable_write(struct rtsx_chip *chip, u8 ins)
 106 {
 107         struct spi_info *spi = &chip->spi;
 108         int retval;
 109 
 110         if (!spi->write_en)
 111                 return STATUS_SUCCESS;
 112 
 113         rtsx_init_cmd(chip);
 114 
 115         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 116         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 117                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 118         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 119                      SPI_TRANSFER0_START | SPI_C_MODE0);
 120         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 121                      SPI_TRANSFER0_END);
 122 
 123         retval = rtsx_send_cmd(chip, 0, 100);
 124         if (retval < 0) {
 125                 rtsx_clear_spi_error(chip);
 126                 spi_set_err_code(chip, SPI_HW_ERR);
 127                 return STATUS_FAIL;
 128         }
 129 
 130         return STATUS_SUCCESS;
 131 }
 132 
 133 static int sf_disable_write(struct rtsx_chip *chip, u8 ins)
 134 {
 135         struct spi_info *spi = &chip->spi;
 136         int retval;
 137 
 138         if (!spi->write_en)
 139                 return STATUS_SUCCESS;
 140 
 141         rtsx_init_cmd(chip);
 142 
 143         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 144         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 145                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 146         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 147                      SPI_TRANSFER0_START | SPI_C_MODE0);
 148         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 149                      SPI_TRANSFER0_END);
 150 
 151         retval = rtsx_send_cmd(chip, 0, 100);
 152         if (retval < 0) {
 153                 rtsx_clear_spi_error(chip);
 154                 spi_set_err_code(chip, SPI_HW_ERR);
 155                 return STATUS_FAIL;
 156         }
 157 
 158         return STATUS_SUCCESS;
 159 }
 160 
 161 static void sf_program(struct rtsx_chip *chip, u8 ins, u8 addr_mode, u32 addr,
 162                        u16 len)
 163 {
 164         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 165         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 166                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 167         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, (u8)len);
 168         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, (u8)(len >> 8));
 169         if (addr_mode) {
 170                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
 171                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
 172                              (u8)(addr >> 8));
 173                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
 174                              (u8)(addr >> 16));
 175                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 176                              SPI_TRANSFER0_START | SPI_CADO_MODE0);
 177         } else {
 178                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 179                              SPI_TRANSFER0_START | SPI_CDO_MODE0);
 180         }
 181         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 182                      SPI_TRANSFER0_END);
 183 }
 184 
 185 static int sf_erase(struct rtsx_chip *chip, u8 ins, u8 addr_mode, u32 addr)
 186 {
 187         int retval;
 188 
 189         rtsx_init_cmd(chip);
 190 
 191         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 192         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 193                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 194         if (addr_mode) {
 195                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
 196                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
 197                              (u8)(addr >> 8));
 198                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
 199                              (u8)(addr >> 16));
 200                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 201                              SPI_TRANSFER0_START | SPI_CA_MODE0);
 202         } else {
 203                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 204                              SPI_TRANSFER0_START | SPI_C_MODE0);
 205         }
 206         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 207                      SPI_TRANSFER0_END);
 208 
 209         retval = rtsx_send_cmd(chip, 0, 100);
 210         if (retval < 0) {
 211                 rtsx_clear_spi_error(chip);
 212                 spi_set_err_code(chip, SPI_HW_ERR);
 213                 return STATUS_FAIL;
 214         }
 215 
 216         return STATUS_SUCCESS;
 217 }
 218 
 219 static int spi_init_eeprom(struct rtsx_chip *chip)
 220 {
 221         int retval;
 222         int clk;
 223 
 224         if (chip->asic_code)
 225                 clk = 30;
 226         else
 227                 clk = CLK_30;
 228 
 229         retval = rtsx_write_register(chip, SPI_CLK_DIVIDER1, 0xFF, 0x00);
 230         if (retval)
 231                 return retval;
 232         retval = rtsx_write_register(chip, SPI_CLK_DIVIDER0, 0xFF, 0x27);
 233         if (retval)
 234                 return retval;
 235 
 236         retval = switch_clock(chip, clk);
 237         if (retval != STATUS_SUCCESS)
 238                 return STATUS_FAIL;
 239 
 240         retval = select_card(chip, SPI_CARD);
 241         if (retval != STATUS_SUCCESS)
 242                 return STATUS_FAIL;
 243 
 244         retval = rtsx_write_register(chip, CARD_CLK_EN, SPI_CLK_EN,
 245                                      SPI_CLK_EN);
 246         if (retval)
 247                 return retval;
 248         retval = rtsx_write_register(chip, CARD_OE, SPI_OUTPUT_EN,
 249                                      SPI_OUTPUT_EN);
 250         if (retval)
 251                 return retval;
 252 
 253         wait_timeout(10);
 254 
 255         retval = rtsx_write_register(chip, SPI_CONTROL, 0xFF,
 256                                      CS_POLARITY_HIGH | SPI_EEPROM_AUTO);
 257         if (retval)
 258                 return retval;
 259         retval = rtsx_write_register(chip, SPI_TCTL, EDO_TIMING_MASK,
 260                                      SAMPLE_DELAY_HALF);
 261         if (retval)
 262                 return retval;
 263 
 264         return STATUS_SUCCESS;
 265 }
 266 
 267 static int spi_eeprom_program_enable(struct rtsx_chip *chip)
 268 {
 269         int retval;
 270 
 271         rtsx_init_cmd(chip);
 272 
 273         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x86);
 274         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x13);
 275         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 276                      SPI_TRANSFER0_START | SPI_CA_MODE0);
 277         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 278                      SPI_TRANSFER0_END);
 279 
 280         retval = rtsx_send_cmd(chip, 0, 100);
 281         if (retval < 0)
 282                 return STATUS_FAIL;
 283 
 284         return STATUS_SUCCESS;
 285 }
 286 
 287 int spi_erase_eeprom_chip(struct rtsx_chip *chip)
 288 {
 289         int retval;
 290 
 291         retval = spi_init_eeprom(chip);
 292         if (retval != STATUS_SUCCESS)
 293                 return STATUS_FAIL;
 294 
 295         retval = spi_eeprom_program_enable(chip);
 296         if (retval != STATUS_SUCCESS)
 297                 return STATUS_FAIL;
 298 
 299         rtsx_init_cmd(chip);
 300 
 301         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
 302         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
 303         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x12);
 304         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x84);
 305         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 306                      SPI_TRANSFER0_START | SPI_CA_MODE0);
 307         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 308                      SPI_TRANSFER0_END);
 309 
 310         retval = rtsx_send_cmd(chip, 0, 100);
 311         if (retval < 0)
 312                 return STATUS_FAIL;
 313 
 314         retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
 315         if (retval)
 316                 return retval;
 317 
 318         return STATUS_SUCCESS;
 319 }
 320 
 321 int spi_erase_eeprom_byte(struct rtsx_chip *chip, u16 addr)
 322 {
 323         int retval;
 324 
 325         retval = spi_init_eeprom(chip);
 326         if (retval != STATUS_SUCCESS)
 327                 return STATUS_FAIL;
 328 
 329         retval = spi_eeprom_program_enable(chip);
 330         if (retval != STATUS_SUCCESS)
 331                 return STATUS_FAIL;
 332 
 333         rtsx_init_cmd(chip);
 334 
 335         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
 336         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
 337         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x07);
 338         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
 339         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)(addr >> 8));
 340         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x46);
 341         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 342                      SPI_TRANSFER0_START | SPI_CA_MODE0);
 343         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 344                      SPI_TRANSFER0_END);
 345 
 346         retval = rtsx_send_cmd(chip, 0, 100);
 347         if (retval < 0)
 348                 return STATUS_FAIL;
 349 
 350         retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
 351         if (retval)
 352                 return retval;
 353 
 354         return STATUS_SUCCESS;
 355 }
 356 
 357 int spi_read_eeprom(struct rtsx_chip *chip, u16 addr, u8 *val)
 358 {
 359         int retval;
 360         u8 data;
 361 
 362         retval = spi_init_eeprom(chip);
 363         if (retval != STATUS_SUCCESS)
 364                 return STATUS_FAIL;
 365 
 366         rtsx_init_cmd(chip);
 367 
 368         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
 369         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
 370         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x06);
 371         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, (u8)addr);
 372         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)(addr >> 8));
 373         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x46);
 374         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, 1);
 375         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 376                      SPI_TRANSFER0_START | SPI_CADI_MODE0);
 377         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 378                      SPI_TRANSFER0_END);
 379 
 380         retval = rtsx_send_cmd(chip, 0, 100);
 381         if (retval < 0)
 382                 return STATUS_FAIL;
 383 
 384         wait_timeout(5);
 385         retval = rtsx_read_register(chip, SPI_DATA, &data);
 386         if (retval)
 387                 return retval;
 388 
 389         if (val)
 390                 *val = data;
 391 
 392         retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
 393         if (retval)
 394                 return retval;
 395 
 396         return STATUS_SUCCESS;
 397 }
 398 
 399 int spi_write_eeprom(struct rtsx_chip *chip, u16 addr, u8 val)
 400 {
 401         int retval;
 402 
 403         retval = spi_init_eeprom(chip);
 404         if (retval != STATUS_SUCCESS)
 405                 return STATUS_FAIL;
 406 
 407         retval = spi_eeprom_program_enable(chip);
 408         if (retval != STATUS_SUCCESS)
 409                 return STATUS_FAIL;
 410 
 411         rtsx_init_cmd(chip);
 412 
 413         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_GPIO_DIR, 0x01, 0);
 414         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01, RING_BUFFER);
 415         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, 0x05);
 416         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, val);
 417         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, (u8)addr);
 418         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF, (u8)(addr >> 8));
 419         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF, 0x4E);
 420         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 421                      SPI_TRANSFER0_START | SPI_CA_MODE0);
 422         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 423                      SPI_TRANSFER0_END);
 424 
 425         retval = rtsx_send_cmd(chip, 0, 100);
 426         if (retval < 0)
 427                 return STATUS_FAIL;
 428 
 429         retval = rtsx_write_register(chip, CARD_GPIO_DIR, 0x01, 0x01);
 430         if (retval)
 431                 return retval;
 432 
 433         return STATUS_SUCCESS;
 434 }
 435 
 436 int spi_get_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 437 {
 438         struct spi_info *spi = &chip->spi;
 439 
 440         dev_dbg(rtsx_dev(chip), "%s: err_code = 0x%x\n", __func__,
 441                 spi->err_code);
 442         rtsx_stor_set_xfer_buf(&spi->err_code,
 443                                min_t(int, scsi_bufflen(srb), 1), srb);
 444         scsi_set_resid(srb, scsi_bufflen(srb) - 1);
 445 
 446         return STATUS_SUCCESS;
 447 }
 448 
 449 int spi_set_parameter(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 450 {
 451         struct spi_info *spi = &chip->spi;
 452 
 453         spi_set_err_code(chip, SPI_NO_ERR);
 454 
 455         if (chip->asic_code)
 456                 spi->spi_clock = ((u16)(srb->cmnd[8]) << 8) | srb->cmnd[9];
 457         else
 458                 spi->spi_clock = srb->cmnd[3];
 459 
 460         spi->clk_div = ((u16)(srb->cmnd[4]) << 8) | srb->cmnd[5];
 461         spi->write_en = srb->cmnd[6];
 462 
 463         dev_dbg(rtsx_dev(chip), "%s: ", __func__);
 464         dev_dbg(rtsx_dev(chip), "spi_clock = %d, ", spi->spi_clock);
 465         dev_dbg(rtsx_dev(chip), "clk_div = %d, ", spi->clk_div);
 466         dev_dbg(rtsx_dev(chip), "write_en = %d\n", spi->write_en);
 467 
 468         return STATUS_SUCCESS;
 469 }
 470 
 471 int spi_read_flash_id(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 472 {
 473         int retval;
 474         u16 len;
 475         u8 *buf;
 476 
 477         spi_set_err_code(chip, SPI_NO_ERR);
 478 
 479         len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
 480         if (len > 512) {
 481                 spi_set_err_code(chip, SPI_INVALID_COMMAND);
 482                 return STATUS_FAIL;
 483         }
 484 
 485         retval = spi_set_init_para(chip);
 486         if (retval != STATUS_SUCCESS) {
 487                 spi_set_err_code(chip, SPI_HW_ERR);
 488                 return STATUS_FAIL;
 489         }
 490 
 491         rtsx_init_cmd(chip);
 492 
 493         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
 494                      PINGPONG_BUFFER);
 495 
 496         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, srb->cmnd[3]);
 497         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF, srb->cmnd[4]);
 498         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF, srb->cmnd[5]);
 499         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF, srb->cmnd[6]);
 500         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 501                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 502         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, srb->cmnd[7]);
 503         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, srb->cmnd[8]);
 504 
 505         if (len == 0) {
 506                 if (srb->cmnd[9]) {
 507                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0,
 508                                      0xFF, SPI_TRANSFER0_START | SPI_CA_MODE0);
 509                 } else {
 510                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0,
 511                                      0xFF, SPI_TRANSFER0_START | SPI_C_MODE0);
 512                 }
 513         } else {
 514                 if (srb->cmnd[9]) {
 515                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 516                                      SPI_TRANSFER0_START | SPI_CADI_MODE0);
 517                 } else {
 518                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 519                                      SPI_TRANSFER0_START | SPI_CDI_MODE0);
 520                 }
 521         }
 522 
 523         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 524                      SPI_TRANSFER0_END);
 525 
 526         retval = rtsx_send_cmd(chip, 0, 100);
 527         if (retval < 0) {
 528                 rtsx_clear_spi_error(chip);
 529                 spi_set_err_code(chip, SPI_HW_ERR);
 530                 return STATUS_FAIL;
 531         }
 532 
 533         if (len) {
 534                 buf = kmalloc(len, GFP_KERNEL);
 535                 if (!buf)
 536                         return STATUS_ERROR;
 537 
 538                 retval = rtsx_read_ppbuf(chip, buf, len);
 539                 if (retval != STATUS_SUCCESS) {
 540                         spi_set_err_code(chip, SPI_READ_ERR);
 541                         kfree(buf);
 542                         return STATUS_FAIL;
 543                 }
 544 
 545                 rtsx_stor_set_xfer_buf(buf, scsi_bufflen(srb), srb);
 546                 scsi_set_resid(srb, 0);
 547 
 548                 kfree(buf);
 549         }
 550 
 551         return STATUS_SUCCESS;
 552 }
 553 
 554 int spi_read_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 555 {
 556         int retval;
 557         unsigned int index = 0, offset = 0;
 558         u8 ins, slow_read;
 559         u32 addr;
 560         u16 len;
 561         u8 *buf;
 562 
 563         spi_set_err_code(chip, SPI_NO_ERR);
 564 
 565         ins = srb->cmnd[3];
 566         addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
 567                                         << 8) | srb->cmnd[6];
 568         len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
 569         slow_read = srb->cmnd[9];
 570 
 571         retval = spi_set_init_para(chip);
 572         if (retval != STATUS_SUCCESS) {
 573                 spi_set_err_code(chip, SPI_HW_ERR);
 574                 return STATUS_FAIL;
 575         }
 576 
 577         buf = kmalloc(SF_PAGE_LEN, GFP_KERNEL);
 578         if (!buf)
 579                 return STATUS_ERROR;
 580 
 581         while (len) {
 582                 u16 pagelen = SF_PAGE_LEN - (u8)addr;
 583 
 584                 if (pagelen > len)
 585                         pagelen = len;
 586 
 587                 rtsx_init_cmd(chip);
 588 
 589                 trans_dma_enable(DMA_FROM_DEVICE, chip, 256, DMA_256);
 590 
 591                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 592 
 593                 if (slow_read) {
 594                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR0, 0xFF,
 595                                      (u8)addr);
 596                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
 597                                      (u8)(addr >> 8));
 598                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
 599                                      (u8)(addr >> 16));
 600                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 601                                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 602                 } else {
 603                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR1, 0xFF,
 604                                      (u8)addr);
 605                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR2, 0xFF,
 606                                      (u8)(addr >> 8));
 607                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_ADDR3, 0xFF,
 608                                      (u8)(addr >> 16));
 609                         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 610                                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_32);
 611                 }
 612 
 613                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF,
 614                              (u8)(pagelen >> 8));
 615                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF,
 616                              (u8)pagelen);
 617 
 618                 rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 619                              SPI_TRANSFER0_START | SPI_CADI_MODE0);
 620                 rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0,
 621                              SPI_TRANSFER0_END, SPI_TRANSFER0_END);
 622 
 623                 rtsx_send_cmd_no_wait(chip);
 624 
 625                 retval = rtsx_transfer_data(chip, 0, buf, pagelen, 0,
 626                                             DMA_FROM_DEVICE, 10000);
 627                 if (retval < 0) {
 628                         kfree(buf);
 629                         rtsx_clear_spi_error(chip);
 630                         spi_set_err_code(chip, SPI_HW_ERR);
 631                         return STATUS_FAIL;
 632                 }
 633 
 634                 rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index, &offset,
 635                                           TO_XFER_BUF);
 636 
 637                 addr += pagelen;
 638                 len -= pagelen;
 639         }
 640 
 641         scsi_set_resid(srb, 0);
 642         kfree(buf);
 643 
 644         return STATUS_SUCCESS;
 645 }
 646 
 647 int spi_write_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 648 {
 649         int retval;
 650         u8 ins, program_mode;
 651         u32 addr;
 652         u16 len;
 653         u8 *buf;
 654         unsigned int index = 0, offset = 0;
 655 
 656         spi_set_err_code(chip, SPI_NO_ERR);
 657 
 658         ins = srb->cmnd[3];
 659         addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
 660                                         << 8) | srb->cmnd[6];
 661         len = ((u16)(srb->cmnd[7]) << 8) | srb->cmnd[8];
 662         program_mode = srb->cmnd[9];
 663 
 664         retval = spi_set_init_para(chip);
 665         if (retval != STATUS_SUCCESS) {
 666                 spi_set_err_code(chip, SPI_HW_ERR);
 667                 return STATUS_FAIL;
 668         }
 669 
 670         if (program_mode == BYTE_PROGRAM) {
 671                 buf = kmalloc(4, GFP_KERNEL);
 672                 if (!buf)
 673                         return STATUS_ERROR;
 674 
 675                 while (len) {
 676                         retval = sf_enable_write(chip, SPI_WREN);
 677                         if (retval != STATUS_SUCCESS) {
 678                                 kfree(buf);
 679                                 return STATUS_FAIL;
 680                         }
 681 
 682                         rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
 683                                                   FROM_XFER_BUF);
 684 
 685                         rtsx_init_cmd(chip);
 686 
 687                         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
 688                                      0x01, PINGPONG_BUFFER);
 689                         rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF,
 690                                      buf[0]);
 691                         sf_program(chip, ins, 1, addr, 1);
 692 
 693                         retval = rtsx_send_cmd(chip, 0, 100);
 694                         if (retval < 0) {
 695                                 kfree(buf);
 696                                 rtsx_clear_spi_error(chip);
 697                                 spi_set_err_code(chip, SPI_HW_ERR);
 698                                 return STATUS_FAIL;
 699                         }
 700 
 701                         retval = sf_polling_status(chip, 100);
 702                         if (retval != STATUS_SUCCESS) {
 703                                 kfree(buf);
 704                                 return STATUS_FAIL;
 705                         }
 706 
 707                         addr++;
 708                         len--;
 709                 }
 710 
 711                 kfree(buf);
 712 
 713         } else if (program_mode == AAI_PROGRAM) {
 714                 int first_byte = 1;
 715 
 716                 retval = sf_enable_write(chip, SPI_WREN);
 717                 if (retval != STATUS_SUCCESS)
 718                         return STATUS_FAIL;
 719 
 720                 buf = kmalloc(4, GFP_KERNEL);
 721                 if (!buf)
 722                         return STATUS_ERROR;
 723 
 724                 while (len) {
 725                         rtsx_stor_access_xfer_buf(buf, 1, srb, &index, &offset,
 726                                                   FROM_XFER_BUF);
 727 
 728                         rtsx_init_cmd(chip);
 729 
 730                         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE,
 731                                      0x01, PINGPONG_BUFFER);
 732                         rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF,
 733                                      buf[0]);
 734                         if (first_byte) {
 735                                 sf_program(chip, ins, 1, addr, 1);
 736                                 first_byte = 0;
 737                         } else {
 738                                 sf_program(chip, ins, 0, 0, 1);
 739                         }
 740 
 741                         retval = rtsx_send_cmd(chip, 0, 100);
 742                         if (retval < 0) {
 743                                 kfree(buf);
 744                                 rtsx_clear_spi_error(chip);
 745                                 spi_set_err_code(chip, SPI_HW_ERR);
 746                                 return STATUS_FAIL;
 747                         }
 748 
 749                         retval = sf_polling_status(chip, 100);
 750                         if (retval != STATUS_SUCCESS) {
 751                                 kfree(buf);
 752                                 return STATUS_FAIL;
 753                         }
 754 
 755                         len--;
 756                 }
 757 
 758                 kfree(buf);
 759 
 760                 retval = sf_disable_write(chip, SPI_WRDI);
 761                 if (retval != STATUS_SUCCESS)
 762                         return STATUS_FAIL;
 763 
 764                 retval = sf_polling_status(chip, 100);
 765                 if (retval != STATUS_SUCCESS)
 766                         return STATUS_FAIL;
 767         } else if (program_mode == PAGE_PROGRAM) {
 768                 buf = kmalloc(SF_PAGE_LEN, GFP_KERNEL);
 769                 if (!buf)
 770                         return STATUS_NOMEM;
 771 
 772                 while (len) {
 773                         u16 pagelen = SF_PAGE_LEN - (u8)addr;
 774 
 775                         if (pagelen > len)
 776                                 pagelen = len;
 777 
 778                         retval = sf_enable_write(chip, SPI_WREN);
 779                         if (retval != STATUS_SUCCESS) {
 780                                 kfree(buf);
 781                                 return STATUS_FAIL;
 782                         }
 783 
 784                         rtsx_init_cmd(chip);
 785 
 786                         trans_dma_enable(DMA_TO_DEVICE, chip, 256, DMA_256);
 787                         sf_program(chip, ins, 1, addr, pagelen);
 788 
 789                         rtsx_send_cmd_no_wait(chip);
 790 
 791                         rtsx_stor_access_xfer_buf(buf, pagelen, srb, &index,
 792                                                   &offset, FROM_XFER_BUF);
 793 
 794                         retval = rtsx_transfer_data(chip, 0, buf, pagelen, 0,
 795                                                     DMA_TO_DEVICE, 100);
 796                         if (retval < 0) {
 797                                 kfree(buf);
 798                                 rtsx_clear_spi_error(chip);
 799                                 spi_set_err_code(chip, SPI_HW_ERR);
 800                                 return STATUS_FAIL;
 801                         }
 802 
 803                         retval = sf_polling_status(chip, 100);
 804                         if (retval != STATUS_SUCCESS) {
 805                                 kfree(buf);
 806                                 return STATUS_FAIL;
 807                         }
 808 
 809                         addr += pagelen;
 810                         len -= pagelen;
 811                 }
 812 
 813                 kfree(buf);
 814         } else {
 815                 spi_set_err_code(chip, SPI_INVALID_COMMAND);
 816                 return STATUS_FAIL;
 817         }
 818 
 819         return STATUS_SUCCESS;
 820 }
 821 
 822 int spi_erase_flash(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 823 {
 824         int retval;
 825         u8 ins, erase_mode;
 826         u32 addr;
 827 
 828         spi_set_err_code(chip, SPI_NO_ERR);
 829 
 830         ins = srb->cmnd[3];
 831         addr = ((u32)(srb->cmnd[4]) << 16) | ((u32)(srb->cmnd[5])
 832                                         << 8) | srb->cmnd[6];
 833         erase_mode = srb->cmnd[9];
 834 
 835         retval = spi_set_init_para(chip);
 836         if (retval != STATUS_SUCCESS) {
 837                 spi_set_err_code(chip, SPI_HW_ERR);
 838                 return STATUS_FAIL;
 839         }
 840 
 841         if (erase_mode == PAGE_ERASE) {
 842                 retval = sf_enable_write(chip, SPI_WREN);
 843                 if (retval != STATUS_SUCCESS)
 844                         return STATUS_FAIL;
 845 
 846                 retval = sf_erase(chip, ins, 1, addr);
 847                 if (retval != STATUS_SUCCESS)
 848                         return STATUS_FAIL;
 849         } else if (erase_mode == CHIP_ERASE) {
 850                 retval = sf_enable_write(chip, SPI_WREN);
 851                 if (retval != STATUS_SUCCESS)
 852                         return STATUS_FAIL;
 853 
 854                 retval = sf_erase(chip, ins, 0, 0);
 855                 if (retval != STATUS_SUCCESS)
 856                         return STATUS_FAIL;
 857         } else {
 858                 spi_set_err_code(chip, SPI_INVALID_COMMAND);
 859                 return STATUS_FAIL;
 860         }
 861 
 862         return STATUS_SUCCESS;
 863 }
 864 
 865 int spi_write_flash_status(struct scsi_cmnd *srb, struct rtsx_chip *chip)
 866 {
 867         int retval;
 868         u8 ins, status, ewsr;
 869 
 870         ins = srb->cmnd[3];
 871         status = srb->cmnd[4];
 872         ewsr = srb->cmnd[5];
 873 
 874         retval = spi_set_init_para(chip);
 875         if (retval != STATUS_SUCCESS) {
 876                 spi_set_err_code(chip, SPI_HW_ERR);
 877                 return STATUS_FAIL;
 878         }
 879 
 880         retval = sf_enable_write(chip, ewsr);
 881         if (retval != STATUS_SUCCESS)
 882                 return STATUS_FAIL;
 883 
 884         rtsx_init_cmd(chip);
 885 
 886         rtsx_add_cmd(chip, WRITE_REG_CMD, CARD_DATA_SOURCE, 0x01,
 887                      PINGPONG_BUFFER);
 888 
 889         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_COMMAND, 0xFF, ins);
 890         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_CA_NUMBER, 0xFF,
 891                      SPI_COMMAND_BIT_8 | SPI_ADDRESS_BIT_24);
 892         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH1, 0xFF, 0);
 893         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_LENGTH0, 0xFF, 1);
 894         rtsx_add_cmd(chip, WRITE_REG_CMD, PPBUF_BASE2, 0xFF, status);
 895         rtsx_add_cmd(chip, WRITE_REG_CMD, SPI_TRANSFER0, 0xFF,
 896                      SPI_TRANSFER0_START | SPI_CDO_MODE0);
 897         rtsx_add_cmd(chip, CHECK_REG_CMD, SPI_TRANSFER0, SPI_TRANSFER0_END,
 898                      SPI_TRANSFER0_END);
 899 
 900         retval = rtsx_send_cmd(chip, 0, 100);
 901         if (retval != STATUS_SUCCESS) {
 902                 rtsx_clear_spi_error(chip);
 903                 spi_set_err_code(chip, SPI_HW_ERR);
 904                 return STATUS_FAIL;
 905         }
 906 
 907         return STATUS_SUCCESS;
 908 }

/* [<][>][^][v][top][bottom][index][help] */