xhci-pci-renesas.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Copyright (C) 2019-2020 Linaro Limited */
  3. #include <linux/acpi.h>
  4. #include <linux/firmware.h>
  5. #include <linux/module.h>
  6. #include <linux/pci.h>
  7. #include <linux/slab.h>
  8. #include <linux/unaligned.h>
  9. #include "xhci.h"
  10. #include "xhci-trace.h"
  11. #include "xhci-pci.h"
  12. #define RENESAS_FW_VERSION 0x6C
  13. #define RENESAS_ROM_CONFIG 0xF0
  14. #define RENESAS_FW_STATUS 0xF4
  15. #define RENESAS_FW_STATUS_MSB 0xF5
  16. #define RENESAS_ROM_STATUS 0xF6
  17. #define RENESAS_ROM_STATUS_MSB 0xF7
  18. #define RENESAS_DATA0 0xF8
  19. #define RENESAS_DATA1 0xFC
  20. #define RENESAS_FW_VERSION_FIELD GENMASK(23, 7)
  21. #define RENESAS_FW_VERSION_OFFSET 8
  22. #define RENESAS_FW_STATUS_DOWNLOAD_ENABLE BIT(0)
  23. #define RENESAS_FW_STATUS_LOCK BIT(1)
  24. #define RENESAS_FW_STATUS_RESULT GENMASK(6, 4)
  25. #define RENESAS_FW_STATUS_INVALID 0
  26. #define RENESAS_FW_STATUS_SUCCESS BIT(4)
  27. #define RENESAS_FW_STATUS_ERROR BIT(5)
  28. #define RENESAS_FW_STATUS_SET_DATA0 BIT(8)
  29. #define RENESAS_FW_STATUS_SET_DATA1 BIT(9)
  30. #define RENESAS_ROM_STATUS_ACCESS BIT(0)
  31. #define RENESAS_ROM_STATUS_ERASE BIT(1)
  32. #define RENESAS_ROM_STATUS_RELOAD BIT(2)
  33. #define RENESAS_ROM_STATUS_RESULT GENMASK(6, 4)
  34. #define RENESAS_ROM_STATUS_NO_RESULT 0
  35. #define RENESAS_ROM_STATUS_SUCCESS BIT(4)
  36. #define RENESAS_ROM_STATUS_ERROR BIT(5)
  37. #define RENESAS_ROM_STATUS_SET_DATA0 BIT(8)
  38. #define RENESAS_ROM_STATUS_SET_DATA1 BIT(9)
  39. #define RENESAS_ROM_STATUS_ROM_EXISTS BIT(15)
  40. #define RENESAS_ROM_ERASE_MAGIC 0x5A65726F
  41. #define RENESAS_ROM_WRITE_MAGIC 0x53524F4D
  42. #define RENESAS_RETRY 10000
  43. #define RENESAS_DELAY 10
  44. #define RENESAS_FW_NAME "renesas_usb_fw.mem"
  45. static int renesas_fw_download_image(struct pci_dev *dev,
  46. const u32 *fw, size_t step, bool rom)
  47. {
  48. size_t i;
  49. int err;
  50. u8 fw_status;
  51. bool data0_or_data1;
  52. u32 status_reg;
  53. if (rom)
  54. status_reg = RENESAS_ROM_STATUS_MSB;
  55. else
  56. status_reg = RENESAS_FW_STATUS_MSB;
  57. /*
  58. * The hardware does alternate between two 32-bit pages.
  59. * (This is because each row of the firmware is 8 bytes).
  60. *
  61. * for even steps we use DATA0, for odd steps DATA1.
  62. */
  63. data0_or_data1 = (step & 1) == 1;
  64. /* step+1. Read "Set DATAX" and confirm it is cleared. */
  65. for (i = 0; i < RENESAS_RETRY; i++) {
  66. err = pci_read_config_byte(dev, status_reg, &fw_status);
  67. if (err) {
  68. dev_err(&dev->dev, "Read Status failed: %d\n",
  69. pcibios_err_to_errno(err));
  70. return pcibios_err_to_errno(err);
  71. }
  72. if (!(fw_status & BIT(data0_or_data1)))
  73. break;
  74. udelay(RENESAS_DELAY);
  75. }
  76. if (i == RENESAS_RETRY) {
  77. dev_err(&dev->dev, "Timeout for Set DATAX step: %zd\n", step);
  78. return -ETIMEDOUT;
  79. }
  80. /*
  81. * step+2. Write FW data to "DATAX".
  82. * "LSB is left" => force little endian
  83. */
  84. err = pci_write_config_dword(dev, data0_or_data1 ?
  85. RENESAS_DATA1 : RENESAS_DATA0,
  86. (__force u32)cpu_to_le32(fw[step]));
  87. if (err) {
  88. dev_err(&dev->dev, "Write to DATAX failed: %d\n",
  89. pcibios_err_to_errno(err));
  90. return pcibios_err_to_errno(err);
  91. }
  92. udelay(100);
  93. /* step+3. Set "Set DATAX". */
  94. err = pci_write_config_byte(dev, status_reg, BIT(data0_or_data1));
  95. if (err) {
  96. dev_err(&dev->dev, "Write config for DATAX failed: %d\n",
  97. pcibios_err_to_errno(err));
  98. return pcibios_err_to_errno(err);
  99. }
  100. return 0;
  101. }
  102. static int renesas_fw_verify(const void *fw_data,
  103. size_t length)
  104. {
  105. u16 fw_version_pointer;
  106. /*
  107. * The Firmware's Data Format is describe in
  108. * "6.3 Data Format" R19UH0078EJ0500 Rev.5.00 page 124
  109. */
  110. /*
  111. * The bootrom chips of the big brother have sizes up to 64k, let's
  112. * assume that's the biggest the firmware can get.
  113. */
  114. if (length < 0x1000 || length >= 0x10000) {
  115. pr_err("firmware is size %zd is not (4k - 64k).",
  116. length);
  117. return -EINVAL;
  118. }
  119. /* The First 2 bytes are fixed value (55aa). "LSB on Left" */
  120. if (get_unaligned_le16(fw_data) != 0x55aa) {
  121. pr_err("no valid firmware header found.");
  122. return -EINVAL;
  123. }
  124. /* verify the firmware version position and print it. */
  125. fw_version_pointer = get_unaligned_le16(fw_data + 4);
  126. if (fw_version_pointer + 2 >= length) {
  127. pr_err("fw ver pointer is outside of the firmware image");
  128. return -EINVAL;
  129. }
  130. return 0;
  131. }
  132. static bool renesas_check_rom(struct pci_dev *pdev)
  133. {
  134. u16 rom_status;
  135. int retval;
  136. /* Check if external ROM exists */
  137. retval = pci_read_config_word(pdev, RENESAS_ROM_STATUS, &rom_status);
  138. if (retval)
  139. return false;
  140. rom_status &= RENESAS_ROM_STATUS_ROM_EXISTS;
  141. if (rom_status) {
  142. dev_dbg(&pdev->dev, "External ROM exists\n");
  143. return true; /* External ROM exists */
  144. }
  145. return false;
  146. }
  147. static int renesas_check_rom_state(struct pci_dev *pdev)
  148. {
  149. u16 rom_state;
  150. u32 version;
  151. int err;
  152. /* check FW version */
  153. err = pci_read_config_dword(pdev, RENESAS_FW_VERSION, &version);
  154. if (err)
  155. return pcibios_err_to_errno(err);
  156. version &= RENESAS_FW_VERSION_FIELD;
  157. version = version >> RENESAS_FW_VERSION_OFFSET;
  158. dev_dbg(&pdev->dev, "Found ROM version: %x\n", version);
  159. /*
  160. * Test if ROM is present and loaded, if so we can skip everything
  161. */
  162. err = pci_read_config_word(pdev, RENESAS_ROM_STATUS, &rom_state);
  163. if (err)
  164. return pcibios_err_to_errno(err);
  165. if (rom_state & RENESAS_ROM_STATUS_ROM_EXISTS) {
  166. /* ROM exists */
  167. dev_dbg(&pdev->dev, "ROM exists\n");
  168. /* Check the "Result Code" Bits (6:4) and act accordingly */
  169. switch (rom_state & RENESAS_ROM_STATUS_RESULT) {
  170. case RENESAS_ROM_STATUS_SUCCESS:
  171. return 0;
  172. case RENESAS_ROM_STATUS_NO_RESULT: /* No result yet */
  173. dev_dbg(&pdev->dev, "Unknown ROM status ...\n");
  174. return -ENOENT;
  175. case RENESAS_ROM_STATUS_ERROR: /* Error State */
  176. default: /* All other states are marked as "Reserved states" */
  177. dev_err(&pdev->dev, "Invalid ROM..");
  178. break;
  179. }
  180. }
  181. return -EIO;
  182. }
  183. static int renesas_fw_check_running(struct pci_dev *pdev)
  184. {
  185. u8 fw_state;
  186. int err;
  187. /*
  188. * Test if the device is actually needing the firmware. As most
  189. * BIOSes will initialize the device for us. If the device is
  190. * initialized.
  191. */
  192. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS, &fw_state);
  193. if (err)
  194. return pcibios_err_to_errno(err);
  195. /*
  196. * Check if "FW Download Lock" is locked. If it is and the FW is
  197. * ready we can simply continue. If the FW is not ready, we have
  198. * to give up.
  199. */
  200. if (fw_state & RENESAS_FW_STATUS_LOCK) {
  201. dev_dbg(&pdev->dev, "FW Download Lock is engaged.");
  202. if (fw_state & RENESAS_FW_STATUS_SUCCESS)
  203. return 0;
  204. dev_err(&pdev->dev,
  205. "FW Download Lock is set and FW is not ready. Giving Up.");
  206. return -EIO;
  207. }
  208. /*
  209. * Check if "FW Download Enable" is set. If someone (us?) tampered
  210. * with it and it can't be reset, we have to give up too... and
  211. * ask for a forgiveness and a reboot.
  212. */
  213. if (fw_state & RENESAS_FW_STATUS_DOWNLOAD_ENABLE) {
  214. dev_err(&pdev->dev,
  215. "FW Download Enable is stale. Giving Up (poweroff/reboot needed).");
  216. return -EIO;
  217. }
  218. /* Otherwise, Check the "Result Code" Bits (6:4) and act accordingly */
  219. switch (fw_state & RENESAS_FW_STATUS_RESULT) {
  220. case 0: /* No result yet */
  221. dev_dbg(&pdev->dev, "FW is not ready/loaded yet.");
  222. /* tell the caller, that this device needs the firmware. */
  223. return 1;
  224. case RENESAS_FW_STATUS_SUCCESS: /* Success, device should be working. */
  225. dev_dbg(&pdev->dev, "FW is ready.");
  226. return 0;
  227. case RENESAS_FW_STATUS_ERROR: /* Error State */
  228. dev_err(&pdev->dev,
  229. "hardware is in an error state. Giving up (poweroff/reboot needed).");
  230. return -ENODEV;
  231. default: /* All other states are marked as "Reserved states" */
  232. dev_err(&pdev->dev,
  233. "hardware is in an invalid state %lx. Giving up (poweroff/reboot needed).",
  234. (fw_state & RENESAS_FW_STATUS_RESULT) >> 4);
  235. return -EINVAL;
  236. }
  237. }
  238. static int renesas_fw_download(struct pci_dev *pdev,
  239. const struct firmware *fw)
  240. {
  241. const u32 *fw_data = (const u32 *)fw->data;
  242. size_t i;
  243. int err;
  244. u8 fw_status;
  245. /*
  246. * For more information and the big picture: please look at the
  247. * "Firmware Download Sequence" in "7.1 FW Download Interface"
  248. * of R19UH0078EJ0500 Rev.5.00 page 131
  249. */
  250. /*
  251. * 0. Set "FW Download Enable" bit in the
  252. * "FW Download Control & Status Register" at 0xF4
  253. */
  254. err = pci_write_config_byte(pdev, RENESAS_FW_STATUS,
  255. RENESAS_FW_STATUS_DOWNLOAD_ENABLE);
  256. if (err)
  257. return pcibios_err_to_errno(err);
  258. /* 1 - 10 follow one step after the other. */
  259. for (i = 0; i < fw->size / 4; i++) {
  260. err = renesas_fw_download_image(pdev, fw_data, i, false);
  261. if (err) {
  262. dev_err(&pdev->dev,
  263. "Firmware Download Step %zd failed at position %zd bytes with (%d).",
  264. i, i * 4, err);
  265. return err;
  266. }
  267. }
  268. /*
  269. * This sequence continues until the last data is written to
  270. * "DATA0" or "DATA1". Naturally, we wait until "SET DATA0/1"
  271. * is cleared by the hardware beforehand.
  272. */
  273. for (i = 0; i < RENESAS_RETRY; i++) {
  274. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS_MSB,
  275. &fw_status);
  276. if (err)
  277. return pcibios_err_to_errno(err);
  278. if (!(fw_status & (BIT(0) | BIT(1))))
  279. break;
  280. udelay(RENESAS_DELAY);
  281. }
  282. if (i == RENESAS_RETRY)
  283. dev_warn(&pdev->dev, "Final Firmware Download step timed out.");
  284. /*
  285. * 11. After finishing writing the last data of FW, the
  286. * System Software must clear "FW Download Enable"
  287. */
  288. err = pci_write_config_byte(pdev, RENESAS_FW_STATUS, 0);
  289. if (err)
  290. return pcibios_err_to_errno(err);
  291. /* 12. Read "Result Code" and confirm it is good. */
  292. for (i = 0; i < RENESAS_RETRY; i++) {
  293. err = pci_read_config_byte(pdev, RENESAS_FW_STATUS, &fw_status);
  294. if (err)
  295. return pcibios_err_to_errno(err);
  296. if (fw_status & RENESAS_FW_STATUS_SUCCESS)
  297. break;
  298. udelay(RENESAS_DELAY);
  299. }
  300. if (i == RENESAS_RETRY) {
  301. /* Timed out / Error - let's see if we can fix this */
  302. err = renesas_fw_check_running(pdev);
  303. switch (err) {
  304. case 0: /*
  305. * we shouldn't end up here.
  306. * maybe it took a little bit longer.
  307. * But all should be well?
  308. */
  309. break;
  310. case 1: /* (No result yet! */
  311. dev_err(&pdev->dev, "FW Load timedout");
  312. return -ETIMEDOUT;
  313. default:
  314. return err;
  315. }
  316. }
  317. return 0;
  318. }
  319. static void renesas_rom_erase(struct pci_dev *pdev)
  320. {
  321. int retval, i;
  322. u8 status;
  323. dev_dbg(&pdev->dev, "Performing ROM Erase...\n");
  324. retval = pci_write_config_dword(pdev, RENESAS_DATA0,
  325. RENESAS_ROM_ERASE_MAGIC);
  326. if (retval) {
  327. dev_err(&pdev->dev, "ROM erase, magic word write failed: %d\n",
  328. pcibios_err_to_errno(retval));
  329. return;
  330. }
  331. retval = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  332. if (retval) {
  333. dev_err(&pdev->dev, "ROM status read failed: %d\n",
  334. pcibios_err_to_errno(retval));
  335. return;
  336. }
  337. status |= RENESAS_ROM_STATUS_ERASE;
  338. retval = pci_write_config_byte(pdev, RENESAS_ROM_STATUS, status);
  339. if (retval) {
  340. dev_err(&pdev->dev, "ROM erase set word write failed\n");
  341. return;
  342. }
  343. /* sleep a bit while ROM is erased */
  344. msleep(20);
  345. for (i = 0; i < RENESAS_RETRY; i++) {
  346. retval = pci_read_config_byte(pdev, RENESAS_ROM_STATUS,
  347. &status);
  348. status &= RENESAS_ROM_STATUS_ERASE;
  349. if (!status)
  350. break;
  351. mdelay(RENESAS_DELAY);
  352. }
  353. if (i == RENESAS_RETRY)
  354. dev_dbg(&pdev->dev, "Chip erase timedout: %x\n", status);
  355. dev_dbg(&pdev->dev, "ROM Erase... Done success\n");
  356. }
  357. static bool renesas_setup_rom(struct pci_dev *pdev, const struct firmware *fw)
  358. {
  359. const u32 *fw_data = (const u32 *)fw->data;
  360. int err, i;
  361. u8 status;
  362. /* 2. Write magic word to Data0 */
  363. err = pci_write_config_dword(pdev, RENESAS_DATA0,
  364. RENESAS_ROM_WRITE_MAGIC);
  365. if (err)
  366. return false;
  367. /* 3. Set External ROM access */
  368. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS,
  369. RENESAS_ROM_STATUS_ACCESS);
  370. if (err)
  371. goto remove_bypass;
  372. /* 4. Check the result */
  373. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  374. if (err)
  375. goto remove_bypass;
  376. status &= GENMASK(6, 4);
  377. if (status) {
  378. dev_err(&pdev->dev,
  379. "setting external rom failed: %x\n", status);
  380. goto remove_bypass;
  381. }
  382. /* 5 to 16 Write FW to DATA0/1 while checking SetData0/1 */
  383. for (i = 0; i < fw->size / 4; i++) {
  384. err = renesas_fw_download_image(pdev, fw_data, i, true);
  385. if (err) {
  386. dev_err(&pdev->dev,
  387. "ROM Download Step %d failed at position %d bytes with (%d)\n",
  388. i, i * 4, err);
  389. goto remove_bypass;
  390. }
  391. }
  392. /*
  393. * wait till DATA0/1 is cleared
  394. */
  395. for (i = 0; i < RENESAS_RETRY; i++) {
  396. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS_MSB,
  397. &status);
  398. if (err)
  399. goto remove_bypass;
  400. if (!(status & (BIT(0) | BIT(1))))
  401. break;
  402. udelay(RENESAS_DELAY);
  403. }
  404. if (i == RENESAS_RETRY) {
  405. dev_err(&pdev->dev, "Final Firmware ROM Download step timed out\n");
  406. goto remove_bypass;
  407. }
  408. /* 17. Remove bypass */
  409. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS, 0);
  410. if (err)
  411. return false;
  412. udelay(10);
  413. /* 18. check result */
  414. for (i = 0; i < RENESAS_RETRY; i++) {
  415. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  416. if (err) {
  417. dev_err(&pdev->dev, "Read ROM status failed:%d\n",
  418. pcibios_err_to_errno(err));
  419. return false;
  420. }
  421. status &= RENESAS_ROM_STATUS_RESULT;
  422. if (status == RENESAS_ROM_STATUS_SUCCESS) {
  423. dev_dbg(&pdev->dev, "Download ROM success\n");
  424. break;
  425. }
  426. udelay(RENESAS_DELAY);
  427. }
  428. if (i == RENESAS_RETRY) { /* Timed out */
  429. dev_err(&pdev->dev,
  430. "Download to external ROM TO: %x\n", status);
  431. return false;
  432. }
  433. dev_dbg(&pdev->dev, "Download to external ROM succeeded\n");
  434. /* Last step set Reload */
  435. err = pci_write_config_byte(pdev, RENESAS_ROM_STATUS,
  436. RENESAS_ROM_STATUS_RELOAD);
  437. if (err) {
  438. dev_err(&pdev->dev, "Set ROM execute failed: %d\n",
  439. pcibios_err_to_errno(err));
  440. return false;
  441. }
  442. /*
  443. * wait till Reload is cleared
  444. */
  445. for (i = 0; i < RENESAS_RETRY; i++) {
  446. err = pci_read_config_byte(pdev, RENESAS_ROM_STATUS, &status);
  447. if (err)
  448. return false;
  449. if (!(status & RENESAS_ROM_STATUS_RELOAD))
  450. break;
  451. udelay(RENESAS_DELAY);
  452. }
  453. if (i == RENESAS_RETRY) {
  454. dev_err(&pdev->dev, "ROM Exec timed out: %x\n", status);
  455. return false;
  456. }
  457. return true;
  458. remove_bypass:
  459. pci_write_config_byte(pdev, RENESAS_ROM_STATUS, 0);
  460. return false;
  461. }
  462. static int renesas_load_fw(struct pci_dev *pdev, const struct firmware *fw)
  463. {
  464. int err = 0;
  465. bool rom;
  466. /* Check if the device has external ROM */
  467. rom = renesas_check_rom(pdev);
  468. if (rom) {
  469. /* perform chip erase first */
  470. renesas_rom_erase(pdev);
  471. /* lets try loading fw on ROM first */
  472. rom = renesas_setup_rom(pdev, fw);
  473. if (!rom) {
  474. dev_dbg(&pdev->dev,
  475. "ROM load failed, falling back on FW load\n");
  476. } else {
  477. dev_dbg(&pdev->dev,
  478. "ROM load success\n");
  479. goto exit;
  480. }
  481. }
  482. err = renesas_fw_download(pdev, fw);
  483. exit:
  484. if (err)
  485. dev_err(&pdev->dev, "firmware failed to download (%d).", err);
  486. return err;
  487. }
  488. static int renesas_xhci_check_request_fw(struct pci_dev *pdev,
  489. const struct pci_device_id *id)
  490. {
  491. const char fw_name[] = RENESAS_FW_NAME;
  492. const struct firmware *fw;
  493. bool has_rom;
  494. int err;
  495. /* Check if device has ROM and loaded, if so skip everything */
  496. has_rom = renesas_check_rom(pdev);
  497. if (has_rom) {
  498. err = renesas_check_rom_state(pdev);
  499. if (!err)
  500. return 0;
  501. else if (err != -ENOENT)
  502. has_rom = false;
  503. }
  504. err = renesas_fw_check_running(pdev);
  505. /* Continue ahead, if the firmware is already running. */
  506. if (!err)
  507. return 0;
  508. /* no firmware interface available */
  509. if (err != 1)
  510. return has_rom ? 0 : err;
  511. pci_dev_get(pdev);
  512. err = firmware_request_nowarn(&fw, fw_name, &pdev->dev);
  513. pci_dev_put(pdev);
  514. if (err) {
  515. if (has_rom) {
  516. dev_info(&pdev->dev, "failed to load firmware %s, fallback to ROM\n",
  517. fw_name);
  518. return 0;
  519. }
  520. dev_err(&pdev->dev, "failed to load firmware %s: %d\n",
  521. fw_name, err);
  522. return err;
  523. }
  524. err = renesas_fw_verify(fw->data, fw->size);
  525. if (err)
  526. goto exit;
  527. err = renesas_load_fw(pdev, fw);
  528. exit:
  529. release_firmware(fw);
  530. return err;
  531. }
  532. static int
  533. xhci_pci_renesas_probe(struct pci_dev *dev, const struct pci_device_id *id)
  534. {
  535. int retval;
  536. retval = renesas_xhci_check_request_fw(dev, id);
  537. if (retval)
  538. return retval;
  539. return xhci_pci_common_probe(dev, id);
  540. }
  541. static const struct pci_device_id pci_ids[] = {
  542. { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, 0x0014) },
  543. { PCI_DEVICE(PCI_VENDOR_ID_RENESAS, 0x0015) },
  544. { /* end: all zeroes */ }
  545. };
  546. MODULE_DEVICE_TABLE(pci, pci_ids);
  547. static struct pci_driver xhci_renesas_pci_driver = {
  548. .name = "xhci-pci-renesas",
  549. .id_table = pci_ids,
  550. .probe = xhci_pci_renesas_probe,
  551. .remove = xhci_pci_remove,
  552. .shutdown = usb_hcd_pci_shutdown,
  553. .driver = {
  554. .pm = pm_ptr(&usb_hcd_pci_pm_ops),
  555. },
  556. };
  557. module_pci_driver(xhci_renesas_pci_driver);
  558. MODULE_DESCRIPTION("Renesas xHCI PCI Host Controller Driver");
  559. MODULE_FIRMWARE(RENESAS_FW_NAME);
  560. MODULE_IMPORT_NS(xhci);
  561. MODULE_LICENSE("GPL v2");