38
38
#define AMD_SPI_FIFO_SIZE 70
39
39
#define AMD_SPI_MEM_SIZE 200
40
40
#define AMD_SPI_MAX_DATA 64
41
+ #define AMD_SPI_HID2_DMA_SIZE 4096
41
42
42
43
#define AMD_SPI_ENA_REG 0x20
43
44
#define AMD_SPI_ALT_SPD_SHIFT 20
70
71
* enum amd_spi_versions - SPI controller versions
71
72
* @AMD_SPI_V1: AMDI0061 hardware version
72
73
* @AMD_SPI_V2: AMDI0062 hardware version
74
+ * @AMD_HID2_SPI: AMDI0063 hardware version
73
75
*/
74
76
enum amd_spi_versions {
75
77
AMD_SPI_V1 = 1 ,
76
78
AMD_SPI_V2 ,
79
+ AMD_HID2_SPI ,
77
80
};
78
81
79
82
enum amd_spi_speed {
@@ -182,6 +185,7 @@ static int amd_spi_set_opcode(struct amd_spi *amd_spi, u8 cmd_opcode)
182
185
AMD_SPI_OPCODE_MASK );
183
186
return 0 ;
184
187
case AMD_SPI_V2 :
188
+ case AMD_HID2_SPI :
185
189
amd_spi_writereg8 (amd_spi , AMD_SPI_OPCODE_REG , cmd_opcode );
186
190
return 0 ;
187
191
default :
@@ -209,6 +213,7 @@ static int amd_spi_busy_wait(struct amd_spi *amd_spi)
209
213
reg = AMD_SPI_CTRL0_REG ;
210
214
break ;
211
215
case AMD_SPI_V2 :
216
+ case AMD_HID2_SPI :
212
217
reg = AMD_SPI_STATUS_REG ;
213
218
break ;
214
219
default :
@@ -234,6 +239,7 @@ static int amd_spi_execute_opcode(struct amd_spi *amd_spi)
234
239
AMD_SPI_EXEC_CMD );
235
240
return 0 ;
236
241
case AMD_SPI_V2 :
242
+ case AMD_HID2_SPI :
237
243
/* Trigger the command execution */
238
244
amd_spi_setclear_reg8 (amd_spi , AMD_SPI_CMD_TRIGGER_REG ,
239
245
AMD_SPI_TRIGGER_CMD , AMD_SPI_TRIGGER_CMD );
@@ -375,6 +381,7 @@ static inline int amd_spi_fifo_xfer(struct amd_spi *amd_spi,
375
381
case AMD_SPI_V1 :
376
382
break ;
377
383
case AMD_SPI_V2 :
384
+ case AMD_HID2_SPI :
378
385
amd_spi_clear_chip (amd_spi , spi_get_chipselect (message -> spi , 0 ));
379
386
break ;
380
387
default :
@@ -418,15 +425,29 @@ static inline bool amd_is_spi_read_cmd(const u16 op)
418
425
static bool amd_spi_supports_op (struct spi_mem * mem ,
419
426
const struct spi_mem_op * op )
420
427
{
428
+ struct amd_spi * amd_spi = spi_controller_get_devdata (mem -> spi -> controller );
429
+
421
430
/* bus width is number of IO lines used to transmit */
422
- if (op -> cmd .buswidth > 1 || op -> addr .buswidth > 4 || op -> data . nbytes > AMD_SPI_MAX_DATA )
431
+ if (op -> cmd .buswidth > 1 || op -> addr .buswidth > 4 )
423
432
return false;
424
433
425
434
/* AMD SPI controllers support quad mode only for read operations */
426
435
if (amd_is_spi_read_cmd (op -> cmd .opcode )) {
427
436
if (op -> data .buswidth > 4 )
428
437
return false;
429
- } else if (op -> data .buswidth > 1 ) {
438
+
439
+ /*
440
+ * HID2 SPI controller supports DMA read up to 4K bytes and
441
+ * doesn't support 4-byte address commands.
442
+ */
443
+ if (amd_spi -> version == AMD_HID2_SPI ) {
444
+ if (amd_is_spi_read_cmd_4b (op -> cmd .opcode ) ||
445
+ op -> data .nbytes > AMD_SPI_HID2_DMA_SIZE )
446
+ return false;
447
+ } else if (op -> data .nbytes > AMD_SPI_MAX_DATA ) {
448
+ return false;
449
+ }
450
+ } else if (op -> data .buswidth > 1 || op -> data .nbytes > AMD_SPI_MAX_DATA ) {
430
451
return false;
431
452
}
432
453
@@ -435,7 +456,19 @@ static bool amd_spi_supports_op(struct spi_mem *mem,
435
456
436
457
static int amd_spi_adjust_op_size (struct spi_mem * mem , struct spi_mem_op * op )
437
458
{
438
- op -> data .nbytes = clamp_val (op -> data .nbytes , 0 , AMD_SPI_MAX_DATA );
459
+ struct amd_spi * amd_spi = spi_controller_get_devdata (mem -> spi -> controller );
460
+
461
+ /*
462
+ * HID2 SPI controller DMA read mode supports reading up to 4k
463
+ * bytes in single transaction, where as SPI0 and HID2 SPI
464
+ * controller index mode supports maximum of 64 bytes in a single
465
+ * transaction.
466
+ */
467
+ if (amd_spi -> version == AMD_HID2_SPI && amd_is_spi_read_cmd (op -> cmd .opcode ))
468
+ op -> data .nbytes = clamp_val (op -> data .nbytes , 0 , AMD_SPI_HID2_DMA_SIZE );
469
+ else
470
+ op -> data .nbytes = clamp_val (op -> data .nbytes , 0 , AMD_SPI_MAX_DATA );
471
+
439
472
return 0 ;
440
473
}
441
474
@@ -592,7 +625,7 @@ static int amd_spi_probe(struct platform_device *pdev)
592
625
amd_spi -> version = (uintptr_t ) device_get_match_data (dev );
593
626
594
627
/* Initialize the spi_controller fields */
595
- host -> bus_num = 0 ;
628
+ host -> bus_num = ( amd_spi -> version == AMD_HID2_SPI ) ? 2 : 0 ;
596
629
host -> num_chipselect = 4 ;
597
630
host -> mode_bits = SPI_TX_DUAL | SPI_TX_QUAD | SPI_RX_DUAL | SPI_RX_QUAD ;
598
631
host -> flags = SPI_CONTROLLER_HALF_DUPLEX ;
@@ -616,6 +649,7 @@ static int amd_spi_probe(struct platform_device *pdev)
616
649
static const struct acpi_device_id spi_acpi_match [] = {
617
650
{ "AMDI0061" , AMD_SPI_V1 },
618
651
{ "AMDI0062" , AMD_SPI_V2 },
652
+ { "AMDI0063" , AMD_HID2_SPI },
619
653
{},
620
654
};
621
655
MODULE_DEVICE_TABLE (acpi , spi_acpi_match );
0 commit comments