17
17
#include <linux/mutex.h>
18
18
#include <linux/of_platform.h>
19
19
20
- #include <asm/octeon/octeon.h>
21
-
22
20
/*
23
21
* USB Control Register
24
22
*/
196
194
static DEFINE_MUTEX (dwc3_octeon_clocks_mutex );
197
195
static uint8_t clk_div [OCTEON_H_CLKDIV_SEL ] = {1 , 2 , 4 , 6 , 8 , 16 , 24 , 32 };
198
196
197
+ #ifdef CONFIG_CAVIUM_OCTEON_SOC
198
+ #include <asm/octeon/octeon.h>
199
+ static inline uint64_t dwc3_octeon_readq (void __iomem * addr )
200
+ {
201
+ return cvmx_readq_csr (addr );
202
+ }
203
+
204
+ static inline void dwc3_octeon_writeq (void __iomem * base , uint64_t val )
205
+ {
206
+ cvmx_writeq_csr (base , val );
207
+ }
199
208
200
209
static void dwc3_octeon_config_gpio (int index , int gpio )
201
210
{
@@ -220,14 +229,24 @@ static void dwc3_octeon_config_gpio(int index, int gpio)
220
229
cvmx_write_csr (CVMX_GPIO_XBIT_CFGX (gpio ), gpio_bit .u64 );
221
230
}
222
231
}
232
+ #else
233
+ static inline uint64_t dwc3_octeon_readq (void __iomem * addr )
234
+ {
235
+ return 0 ;
236
+ }
237
+
238
+ static inline void dwc3_octeon_writeq (void __iomem * base , uint64_t val ) { }
239
+
240
+ static inline void dwc3_octeon_config_gpio (int index , int gpio ) { }
241
+ #endif
223
242
224
- static int dwc3_octeon_config_power (struct device * dev , u64 base )
243
+ static int dwc3_octeon_config_power (struct device * dev , void __iomem * base )
225
244
{
226
245
uint32_t gpio_pwr [3 ];
227
246
int gpio , len , power_active_low ;
228
247
struct device_node * node = dev -> of_node ;
229
248
u64 val ;
230
- u64 uctl_host_cfg_reg = base + USBDRD_UCTL_HOST_CFG ;
249
+ void __iomem * uctl_host_cfg_reg = base + USBDRD_UCTL_HOST_CFG ;
231
250
232
251
if (of_find_property (node , "power" , & len ) != NULL ) {
233
252
if (len == 12 ) {
@@ -242,33 +261,33 @@ static int dwc3_octeon_config_power(struct device *dev, u64 base)
242
261
dev_err (dev , "invalid power configuration\n" );
243
262
return - EINVAL ;
244
263
}
245
- dwc3_octeon_config_gpio ((base >> 24 ) & 1 , gpio );
264
+ dwc3_octeon_config_gpio ((( u64 ) base >> 24 ) & 1 , gpio );
246
265
247
266
/* Enable XHCI power control and set if active high or low. */
248
- val = cvmx_read_csr (uctl_host_cfg_reg );
267
+ val = dwc3_octeon_readq (uctl_host_cfg_reg );
249
268
val |= USBDRD_UCTL_HOST_PPC_EN ;
250
269
if (power_active_low )
251
270
val &= ~USBDRD_UCTL_HOST_PPC_ACTIVE_HIGH_EN ;
252
271
else
253
272
val |= USBDRD_UCTL_HOST_PPC_ACTIVE_HIGH_EN ;
254
- cvmx_write_csr (uctl_host_cfg_reg , val );
273
+ dwc3_octeon_writeq (uctl_host_cfg_reg , val );
255
274
} else {
256
275
/* Disable XHCI power control and set if active high. */
257
- val = cvmx_read_csr (uctl_host_cfg_reg );
276
+ val = dwc3_octeon_readq (uctl_host_cfg_reg );
258
277
val &= ~USBDRD_UCTL_HOST_PPC_EN ;
259
278
val &= ~USBDRD_UCTL_HOST_PPC_ACTIVE_HIGH_EN ;
260
- cvmx_write_csr (uctl_host_cfg_reg , val );
279
+ dwc3_octeon_writeq (uctl_host_cfg_reg , val );
261
280
dev_info (dev , "power control disabled\n" );
262
281
}
263
282
return 0 ;
264
283
}
265
284
266
- static int dwc3_octeon_clocks_start (struct device * dev , u64 base )
285
+ static int dwc3_octeon_clocks_start (struct device * dev , void __iomem * base )
267
286
{
268
287
int i , mpll_mul , ref_clk_fsel , ref_clk_sel = 2 ;
269
288
u32 clock_rate ;
270
289
u64 div , h_clk_rate , val ;
271
- u64 uctl_ctl_reg = base + USBDRD_UCTL_CTL ;
290
+ void __iomem * uctl_ctl_reg = base + USBDRD_UCTL_CTL ;
272
291
273
292
if (dev -> of_node ) {
274
293
const char * ss_clock_type ;
@@ -332,16 +351,16 @@ static int dwc3_octeon_clocks_start(struct device *dev, u64 base)
332
351
/* Step 2: Select GPIO for overcurrent indication, if desired. SKIP */
333
352
334
353
/* Step 3: Assert all resets. */
335
- val = cvmx_read_csr (uctl_ctl_reg );
354
+ val = dwc3_octeon_readq (uctl_ctl_reg );
336
355
val |= USBDRD_UCTL_CTL_UPHY_RST |
337
356
USBDRD_UCTL_CTL_UAHC_RST |
338
357
USBDRD_UCTL_CTL_UCTL_RST ;
339
- cvmx_write_csr (uctl_ctl_reg , val );
358
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
340
359
341
360
/* Step 4a: Reset the clock dividers. */
342
- val = cvmx_read_csr (uctl_ctl_reg );
361
+ val = dwc3_octeon_readq (uctl_ctl_reg );
343
362
val |= USBDRD_UCTL_CTL_H_CLKDIV_RST ;
344
- cvmx_write_csr (uctl_ctl_reg , val );
363
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
345
364
346
365
/* Step 4b: Select controller clock frequency. */
347
366
for (div = 0 ; div < OCTEON_H_CLKDIV_SEL ; div ++ ) {
@@ -350,12 +369,12 @@ static int dwc3_octeon_clocks_start(struct device *dev, u64 base)
350
369
h_clk_rate >= OCTEON_MIN_H_CLK_RATE )
351
370
break ;
352
371
}
353
- val = cvmx_read_csr (uctl_ctl_reg );
372
+ val = dwc3_octeon_readq (uctl_ctl_reg );
354
373
val &= ~USBDRD_UCTL_CTL_H_CLKDIV_SEL ;
355
374
val |= FIELD_PREP (USBDRD_UCTL_CTL_H_CLKDIV_SEL , div );
356
375
val |= USBDRD_UCTL_CTL_H_CLK_EN ;
357
- cvmx_write_csr (uctl_ctl_reg , val );
358
- val = cvmx_read_csr (uctl_ctl_reg );
376
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
377
+ val = dwc3_octeon_readq (uctl_ctl_reg );
359
378
if ((div != FIELD_GET (USBDRD_UCTL_CTL_H_CLKDIV_SEL , val )) ||
360
379
(!(FIELD_GET (USBDRD_UCTL_CTL_H_CLK_EN , val )))) {
361
380
dev_err (dev , "dwc3 controller clock init failure.\n" );
@@ -364,10 +383,10 @@ static int dwc3_octeon_clocks_start(struct device *dev, u64 base)
364
383
365
384
/* Step 4c: Deassert the controller clock divider reset. */
366
385
val &= ~USBDRD_UCTL_CTL_H_CLKDIV_RST ;
367
- cvmx_write_csr (uctl_ctl_reg , val );
386
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
368
387
369
388
/* Step 5a: Reference clock configuration. */
370
- val = cvmx_read_csr (uctl_ctl_reg );
389
+ val = dwc3_octeon_readq (uctl_ctl_reg );
371
390
val &= ~USBDRD_UCTL_CTL_REF_CLK_DIV2 ;
372
391
val &= ~USBDRD_UCTL_CTL_REF_CLK_SEL ;
373
392
val |= FIELD_PREP (USBDRD_UCTL_CTL_REF_CLK_SEL , ref_clk_sel );
@@ -407,15 +426,15 @@ static int dwc3_octeon_clocks_start(struct device *dev, u64 base)
407
426
/* Step 6a & 6b: Power up PHYs. */
408
427
val |= USBDRD_UCTL_CTL_HS_POWER_EN ;
409
428
val |= USBDRD_UCTL_CTL_SS_POWER_EN ;
410
- cvmx_write_csr (uctl_ctl_reg , val );
429
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
411
430
412
431
/* Step 7: Wait 10 controller-clock cycles to take effect. */
413
432
udelay (10 );
414
433
415
434
/* Step 8a: Deassert UCTL reset signal. */
416
- val = cvmx_read_csr (uctl_ctl_reg );
435
+ val = dwc3_octeon_readq (uctl_ctl_reg );
417
436
val &= ~USBDRD_UCTL_CTL_UCTL_RST ;
418
- cvmx_write_csr (uctl_ctl_reg , val );
437
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
419
438
420
439
/* Step 8b: Wait 10 controller-clock cycles. */
421
440
udelay (10 );
@@ -425,49 +444,49 @@ static int dwc3_octeon_clocks_start(struct device *dev, u64 base)
425
444
return - EINVAL ;
426
445
427
446
/* Step 8d: Deassert UAHC reset signal. */
428
- val = cvmx_read_csr (uctl_ctl_reg );
447
+ val = dwc3_octeon_readq (uctl_ctl_reg );
429
448
val &= ~USBDRD_UCTL_CTL_UAHC_RST ;
430
- cvmx_write_csr (uctl_ctl_reg , val );
449
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
431
450
432
451
/* Step 8e: Wait 10 controller-clock cycles. */
433
452
udelay (10 );
434
453
435
454
/* Step 9: Enable conditional coprocessor clock of UCTL. */
436
- val = cvmx_read_csr (uctl_ctl_reg );
455
+ val = dwc3_octeon_readq (uctl_ctl_reg );
437
456
val |= USBDRD_UCTL_CTL_CSCLK_EN ;
438
- cvmx_write_csr (uctl_ctl_reg , val );
457
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
439
458
440
459
/*Step 10: Set for host mode only. */
441
- val = cvmx_read_csr (uctl_ctl_reg );
460
+ val = dwc3_octeon_readq (uctl_ctl_reg );
442
461
val &= ~USBDRD_UCTL_CTL_DRD_MODE ;
443
- cvmx_write_csr (uctl_ctl_reg , val );
462
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
444
463
445
464
return 0 ;
446
465
}
447
466
448
- static void __init dwc3_octeon_set_endian_mode (u64 base )
467
+ static void __init dwc3_octeon_set_endian_mode (void __iomem * base )
449
468
{
450
469
u64 val ;
451
- u64 uctl_shim_cfg_reg = base + USBDRD_UCTL_SHIM_CFG ;
470
+ void __iomem * uctl_shim_cfg_reg = base + USBDRD_UCTL_SHIM_CFG ;
452
471
453
- val = cvmx_read_csr (uctl_shim_cfg_reg );
472
+ val = dwc3_octeon_readq (uctl_shim_cfg_reg );
454
473
val &= ~USBDRD_UCTL_SHIM_CFG_DMA_ENDIAN_MODE ;
455
474
val &= ~USBDRD_UCTL_SHIM_CFG_CSR_ENDIAN_MODE ;
456
475
#ifdef __BIG_ENDIAN
457
476
val |= FIELD_PREP (USBDRD_UCTL_SHIM_CFG_DMA_ENDIAN_MODE , 1 );
458
477
val |= FIELD_PREP (USBDRD_UCTL_SHIM_CFG_CSR_ENDIAN_MODE , 1 );
459
478
#endif
460
- cvmx_write_csr (uctl_shim_cfg_reg , val );
479
+ dwc3_octeon_writeq (uctl_shim_cfg_reg , val );
461
480
}
462
481
463
- static void __init dwc3_octeon_phy_reset (u64 base )
482
+ static void __init dwc3_octeon_phy_reset (void __iomem * base )
464
483
{
465
484
u64 val ;
466
- u64 uctl_ctl_reg = base + USBDRD_UCTL_CTL ;
485
+ void __iomem * uctl_ctl_reg = base + USBDRD_UCTL_CTL ;
467
486
468
- val = cvmx_read_csr (uctl_ctl_reg );
487
+ val = dwc3_octeon_readq (uctl_ctl_reg );
469
488
val &= ~USBDRD_UCTL_CTL_UPHY_RST ;
470
- cvmx_write_csr (uctl_ctl_reg , val );
489
+ dwc3_octeon_writeq (uctl_ctl_reg , val );
471
490
}
472
491
473
492
static int __init dwc3_octeon_device_init (void )
@@ -506,10 +525,10 @@ static int __init dwc3_octeon_device_init(void)
506
525
}
507
526
508
527
mutex_lock (& dwc3_octeon_clocks_mutex );
509
- if (dwc3_octeon_clocks_start (& pdev -> dev , ( u64 ) base ) == 0 )
528
+ if (dwc3_octeon_clocks_start (& pdev -> dev , base ) == 0 )
510
529
dev_info (& pdev -> dev , "clocks initialized.\n" );
511
- dwc3_octeon_set_endian_mode (( u64 ) base );
512
- dwc3_octeon_phy_reset (( u64 ) base );
530
+ dwc3_octeon_set_endian_mode (base );
531
+ dwc3_octeon_phy_reset (base );
513
532
mutex_unlock (& dwc3_octeon_clocks_mutex );
514
533
devm_iounmap (& pdev -> dev , base );
515
534
devm_release_mem_region (& pdev -> dev , res -> start ,
0 commit comments