aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/xtensa/Kconfig30
-rw-r--r--arch/xtensa/boot/dts/xtfpga.dtsi64
-rw-r--r--arch/xtensa/configs/audio_kc705_defconfig142
-rw-r--r--arch/xtensa/include/uapi/asm/unistd.h8
-rw-r--r--arch/xtensa/kernel/Makefile1
-rw-r--r--arch/xtensa/platforms/iss/network.c29
-rw-r--r--arch/xtensa/platforms/xtfpga/Makefile3
-rw-r--r--arch/xtensa/platforms/xtfpga/include/platform/hardware.h6
-rw-r--r--arch/xtensa/platforms/xtfpga/include/platform/lcd.h15
-rw-r--r--arch/xtensa/platforms/xtfpga/lcd.c55
-rw-r--r--arch/xtensa/platforms/xtfpga/setup.c34
11 files changed, 346 insertions, 41 deletions
diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index e31d4949124a..87be10e8b57a 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -428,6 +428,36 @@ config DEFAULT_MEM_SIZE
428 428
429 If unsure, leave the default value here. 429 If unsure, leave the default value here.
430 430
431config XTFPGA_LCD
432 bool "Enable XTFPGA LCD driver"
433 depends on XTENSA_PLATFORM_XTFPGA
434 default n
435 help
436 There's a 2x16 LCD on most of XTFPGA boards, kernel may output
437 progress messages there during bootup/shutdown. It may be useful
438 during board bringup.
439
440 If unsure, say N.
441
442config XTFPGA_LCD_BASE_ADDR
443 hex "XTFPGA LCD base address"
444 depends on XTFPGA_LCD
445 default "0x0d0c0000"
446 help
447 Base address of the LCD controller inside KIO region.
448 Different boards from XTFPGA family have LCD controller at different
449 addresses. Please consult prototyping user guide for your board for
450 the correct address. Wrong address here may lead to hardware lockup.
451
452config XTFPGA_LCD_8BIT_ACCESS
453 bool "Use 8-bit access to XTFPGA LCD"
454 depends on XTFPGA_LCD
455 default n
456 help
457 LCD may be connected with 4- or 8-bit interface, 8-bit access may
458 only be used with 8-bit interface. Please consult prototyping user
459 guide for your board for the correct interface width.
460
431endmenu 461endmenu
432 462
433menu "Executable file formats" 463menu "Executable file formats"
diff --git a/arch/xtensa/boot/dts/xtfpga.dtsi b/arch/xtensa/boot/dts/xtfpga.dtsi
index dec9178840f6..cd0b9e34adc8 100644
--- a/arch/xtensa/boot/dts/xtfpga.dtsi
+++ b/arch/xtensa/boot/dts/xtfpga.dtsi
@@ -40,6 +40,12 @@
40 #clock-cells = <0>; 40 #clock-cells = <0>;
41 compatible = "fixed-clock"; 41 compatible = "fixed-clock";
42 }; 42 };
43
44 clk54: clk54 {
45 #clock-cells = <0>;
46 compatible = "fixed-clock";
47 clock-frequency = <54000000>;
48 };
43 }; 49 };
44 50
45 soc { 51 soc {
@@ -65,5 +71,63 @@
65 local-mac-address = [00 50 c2 13 6f 00]; 71 local-mac-address = [00 50 c2 13 6f 00];
66 clocks = <&osc>; 72 clocks = <&osc>;
67 }; 73 };
74
75 i2s0: xtfpga-i2s@0d080000 {
76 #sound-dai-cells = <0>;
77 compatible = "cdns,xtfpga-i2s";
78 reg = <0x0d080000 0x40>;
79 interrupts = <2 1>; /* external irq 2 */
80 clocks = <&cdce706 4>;
81 };
82
83 i2c0: i2c-master@0d090000 {
84 compatible = "opencores,i2c-ocores";
85 #address-cells = <1>;
86 #size-cells = <0>;
87 reg = <0x0d090000 0x20>;
88 reg-shift = <2>;
89 reg-io-width = <1>;
90 interrupts = <4 1>;
91 clocks = <&osc>;
92
93 cdce706: clock-synth@69 {
94 compatible = "ti,cdce706";
95 #clock-cells = <1>;
96 reg = <0x69>;
97 clocks = <&clk54>;
98 clock-names = "clk_in0";
99 };
100 };
101
102 spi0: spi-master@0d0a0000 {
103 compatible = "cdns,xtfpga-spi";
104 #address-cells = <1>;
105 #size-cells = <0>;
106 reg = <0x0d0a0000 0xc>;
107
108 tlv320aic23: sound-codec@0 {
109 #sound-dai-cells = <0>;
110 compatible = "tlv320aic23";
111 reg = <0>;
112 spi-max-frequency = <12500000>;
113 };
114 };
115 };
116
117 sound {
118 compatible = "simple-audio-card";
119 simple-audio-card,format = "i2s";
120 simple-audio-card,mclk-fs = <256>;
121
122 simple-audio-card,cpu {
123 sound-dai = <&i2s0>;
124 };
125
126 simple-audio-card,codec {
127 sound-dai = <&tlv320aic23>;
128 simple-audio-card,bitclock-master = <0>;
129 simple-audio-card,frame-master = <0>;
130 clocks = <&cdce706 4>;
131 };
68 }; 132 };
69}; 133};
diff --git a/arch/xtensa/configs/audio_kc705_defconfig b/arch/xtensa/configs/audio_kc705_defconfig
new file mode 100644
index 000000000000..c4904db15582
--- /dev/null
+++ b/arch/xtensa/configs/audio_kc705_defconfig
@@ -0,0 +1,142 @@
1CONFIG_SYSVIPC=y
2CONFIG_POSIX_MQUEUE=y
3CONFIG_FHANDLE=y
4CONFIG_IRQ_DOMAIN_DEBUG=y
5CONFIG_NO_HZ_IDLE=y
6CONFIG_HIGH_RES_TIMERS=y
7CONFIG_IRQ_TIME_ACCOUNTING=y
8CONFIG_BSD_PROCESS_ACCT=y
9CONFIG_CGROUP_DEBUG=y
10CONFIG_CGROUP_FREEZER=y
11CONFIG_CGROUP_DEVICE=y
12CONFIG_CPUSETS=y
13CONFIG_CGROUP_CPUACCT=y
14CONFIG_MEMCG=y
15CONFIG_NAMESPACES=y
16CONFIG_SCHED_AUTOGROUP=y
17CONFIG_RELAY=y
18CONFIG_BLK_DEV_INITRD=y
19CONFIG_EXPERT=y
20CONFIG_SYSCTL_SYSCALL=y
21CONFIG_KALLSYMS_ALL=y
22CONFIG_PROFILING=y
23CONFIG_OPROFILE=y
24CONFIG_MODULES=y
25CONFIG_MODULE_UNLOAD=y
26# CONFIG_IOSCHED_DEADLINE is not set
27# CONFIG_IOSCHED_CFQ is not set
28CONFIG_XTENSA_VARIANT_CUSTOM=y
29CONFIG_XTENSA_VARIANT_CUSTOM_NAME="test_kc705_hifi"
30CONFIG_XTENSA_UNALIGNED_USER=y
31CONFIG_PREEMPT=y
32CONFIG_HIGHMEM=y
33# CONFIG_PCI is not set
34CONFIG_XTENSA_PLATFORM_XTFPGA=y
35CONFIG_CMDLINE_BOOL=y
36CONFIG_CMDLINE="earlycon=uart8250,mmio32,0xfd050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug"
37CONFIG_USE_OF=y
38CONFIG_BUILTIN_DTB="kc705"
39# CONFIG_COMPACTION is not set
40# CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS is not set
41CONFIG_PM=y
42CONFIG_NET=y
43CONFIG_PACKET=y
44CONFIG_UNIX=y
45CONFIG_INET=y
46CONFIG_IP_MULTICAST=y
47CONFIG_IP_PNP=y
48CONFIG_IP_PNP_DHCP=y
49CONFIG_IP_PNP_BOOTP=y
50CONFIG_IP_PNP_RARP=y
51# CONFIG_IPV6 is not set
52CONFIG_NETFILTER=y
53# CONFIG_WIRELESS is not set
54CONFIG_DEVTMPFS=y
55CONFIG_DEVTMPFS_MOUNT=y
56# CONFIG_STANDALONE is not set
57CONFIG_MTD=y
58CONFIG_MTD_CFI=y
59CONFIG_MTD_JEDECPROBE=y
60CONFIG_MTD_CFI_INTELEXT=y
61CONFIG_MTD_CFI_AMDSTD=y
62CONFIG_MTD_CFI_STAA=y
63CONFIG_MTD_PHYSMAP_OF=y
64CONFIG_MTD_UBI=y
65CONFIG_BLK_DEV_LOOP=y
66CONFIG_BLK_DEV_RAM=y
67CONFIG_SCSI=y
68CONFIG_BLK_DEV_SD=y
69CONFIG_NETDEVICES=y
70# CONFIG_NET_VENDOR_ARC is not set
71# CONFIG_NET_VENDOR_BROADCOM is not set
72# CONFIG_NET_VENDOR_INTEL is not set
73# CONFIG_NET_VENDOR_MARVELL is not set
74# CONFIG_NET_VENDOR_MICREL is not set
75# CONFIG_NET_VENDOR_NATSEMI is not set
76# CONFIG_NET_VENDOR_SAMSUNG is not set
77# CONFIG_NET_VENDOR_SEEQ is not set
78# CONFIG_NET_VENDOR_SMSC is not set
79# CONFIG_NET_VENDOR_STMICRO is not set
80# CONFIG_NET_VENDOR_VIA is not set
81# CONFIG_NET_VENDOR_WIZNET is not set
82CONFIG_MARVELL_PHY=y
83# CONFIG_WLAN is not set
84# CONFIG_INPUT_MOUSEDEV is not set
85# CONFIG_INPUT_KEYBOARD is not set
86# CONFIG_INPUT_MOUSE is not set
87# CONFIG_SERIO is not set
88CONFIG_SERIAL_8250=y
89# CONFIG_SERIAL_8250_DEPRECATED_OPTIONS is not set
90CONFIG_SERIAL_8250_CONSOLE=y
91CONFIG_SERIAL_OF_PLATFORM=y
92CONFIG_HW_RANDOM=y
93CONFIG_I2C=y
94CONFIG_I2C_OCORES=y
95CONFIG_SPI=y
96CONFIG_SPI_XTENSA_XTFPGA=y
97# CONFIG_HWMON is not set
98CONFIG_WATCHDOG=y
99CONFIG_WATCHDOG_NOWAYOUT=y
100CONFIG_SOFT_WATCHDOG=y
101# CONFIG_VGA_CONSOLE is not set
102CONFIG_SOUND=y
103CONFIG_SND=y
104CONFIG_SND_SOC=y
105CONFIG_SND_SOC_XTFPGA_I2S=y
106CONFIG_SND_SOC_TLV320AIC23_SPI=y
107CONFIG_SND_SIMPLE_CARD=y
108# CONFIG_USB_SUPPORT is not set
109CONFIG_COMMON_CLK_CDCE706=y
110# CONFIG_IOMMU_SUPPORT is not set
111CONFIG_EXT3_FS=y
112CONFIG_EXT4_FS=y
113CONFIG_FANOTIFY=y
114CONFIG_VFAT_FS=y
115CONFIG_PROC_KCORE=y
116CONFIG_TMPFS=y
117CONFIG_TMPFS_POSIX_ACL=y
118CONFIG_UBIFS_FS=y
119CONFIG_NFS_FS=y
120CONFIG_NFS_V4=y
121CONFIG_NFS_SWAP=y
122CONFIG_ROOT_NFS=y
123CONFIG_SUNRPC_DEBUG=y
124CONFIG_NLS_CODEPAGE_437=y
125CONFIG_NLS_ISO8859_1=y
126CONFIG_PRINTK_TIME=y
127CONFIG_DYNAMIC_DEBUG=y
128CONFIG_DEBUG_INFO=y
129CONFIG_MAGIC_SYSRQ=y
130CONFIG_LOCKUP_DETECTOR=y
131# CONFIG_SCHED_DEBUG is not set
132CONFIG_SCHEDSTATS=y
133CONFIG_TIMER_STATS=y
134CONFIG_DEBUG_RT_MUTEXES=y
135CONFIG_DEBUG_SPINLOCK=y
136CONFIG_DEBUG_MUTEXES=y
137CONFIG_DEBUG_ATOMIC_SLEEP=y
138CONFIG_STACKTRACE=y
139CONFIG_RCU_TRACE=y
140# CONFIG_FTRACE is not set
141# CONFIG_S32C1I_SELFTEST is not set
142CONFIG_CRYPTO_ANSI_CPRNG=y
diff --git a/arch/xtensa/include/uapi/asm/unistd.h b/arch/xtensa/include/uapi/asm/unistd.h
index db5bb72e2f4e..b95c30594355 100644
--- a/arch/xtensa/include/uapi/asm/unistd.h
+++ b/arch/xtensa/include/uapi/asm/unistd.h
@@ -715,7 +715,7 @@ __SYSCALL(323, sys_process_vm_writev, 6)
715__SYSCALL(324, sys_name_to_handle_at, 5) 715__SYSCALL(324, sys_name_to_handle_at, 5)
716#define __NR_open_by_handle_at 325 716#define __NR_open_by_handle_at 325
717__SYSCALL(325, sys_open_by_handle_at, 3) 717__SYSCALL(325, sys_open_by_handle_at, 3)
718#define __NR_sync_file_range 326 718#define __NR_sync_file_range2 326
719__SYSCALL(326, sys_sync_file_range2, 6) 719__SYSCALL(326, sys_sync_file_range2, 6)
720#define __NR_perf_event_open 327 720#define __NR_perf_event_open 327
721__SYSCALL(327, sys_perf_event_open, 5) 721__SYSCALL(327, sys_perf_event_open, 5)
@@ -749,8 +749,12 @@ __SYSCALL(337, sys_seccomp, 3)
749__SYSCALL(338, sys_getrandom, 3) 749__SYSCALL(338, sys_getrandom, 3)
750#define __NR_memfd_create 339 750#define __NR_memfd_create 339
751__SYSCALL(339, sys_memfd_create, 2) 751__SYSCALL(339, sys_memfd_create, 2)
752#define __NR_bpf 340
753__SYSCALL(340, sys_bpf, 3)
754#define __NR_execveat 341
755__SYSCALL(341, sys_execveat, 5)
752 756
753#define __NR_syscall_count 340 757#define __NR_syscall_count 342
754 758
755/* 759/*
756 * sysxtensa syscall handler 760 * sysxtensa syscall handler
diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
index 18d962a8c0c2..d3a0f0fd56dd 100644
--- a/arch/xtensa/kernel/Makefile
+++ b/arch/xtensa/kernel/Makefile
@@ -29,6 +29,7 @@ AFLAGS_head.o += -mtext-section-literals
29 29
30sed-y = -e 's/\*(\(\.[a-z]*it\|\.ref\|\)\.text)/*(\1.literal \1.text)/g' \ 30sed-y = -e 's/\*(\(\.[a-z]*it\|\.ref\|\)\.text)/*(\1.literal \1.text)/g' \
31 -e 's/\.text\.unlikely/.literal.unlikely .text.unlikely/g' \ 31 -e 's/\.text\.unlikely/.literal.unlikely .text.unlikely/g' \
32 -e 's/\*(\(\.text .*\))/*(.literal \1)/g' \
32 -e 's/\*(\(\.text\.[a-z]*\))/*(\1.literal \1)/g' 33 -e 's/\*(\(\.text\.[a-z]*\))/*(\1.literal \1)/g'
33 34
34quiet_cmd__cpp_lds_S = LDS $@ 35quiet_cmd__cpp_lds_S = LDS $@
diff --git a/arch/xtensa/platforms/iss/network.c b/arch/xtensa/platforms/iss/network.c
index d05f8feeb8d7..17b1ef3232e4 100644
--- a/arch/xtensa/platforms/iss/network.c
+++ b/arch/xtensa/platforms/iss/network.c
@@ -349,8 +349,8 @@ static void iss_net_timer(unsigned long priv)
349{ 349{
350 struct iss_net_private *lp = (struct iss_net_private *)priv; 350 struct iss_net_private *lp = (struct iss_net_private *)priv;
351 351
352 spin_lock(&lp->lock);
353 iss_net_poll(); 352 iss_net_poll();
353 spin_lock(&lp->lock);
354 mod_timer(&lp->timer, jiffies + lp->timer_val); 354 mod_timer(&lp->timer, jiffies + lp->timer_val);
355 spin_unlock(&lp->lock); 355 spin_unlock(&lp->lock);
356} 356}
@@ -361,7 +361,7 @@ static int iss_net_open(struct net_device *dev)
361 struct iss_net_private *lp = netdev_priv(dev); 361 struct iss_net_private *lp = netdev_priv(dev);
362 int err; 362 int err;
363 363
364 spin_lock(&lp->lock); 364 spin_lock_bh(&lp->lock);
365 365
366 err = lp->tp.open(lp); 366 err = lp->tp.open(lp);
367 if (err < 0) 367 if (err < 0)
@@ -376,9 +376,11 @@ static int iss_net_open(struct net_device *dev)
376 while ((err = iss_net_rx(dev)) > 0) 376 while ((err = iss_net_rx(dev)) > 0)
377 ; 377 ;
378 378
379 spin_lock(&opened_lock); 379 spin_unlock_bh(&lp->lock);
380 spin_lock_bh(&opened_lock);
380 list_add(&lp->opened_list, &opened); 381 list_add(&lp->opened_list, &opened);
381 spin_unlock(&opened_lock); 382 spin_unlock_bh(&opened_lock);
383 spin_lock_bh(&lp->lock);
382 384
383 init_timer(&lp->timer); 385 init_timer(&lp->timer);
384 lp->timer_val = ISS_NET_TIMER_VALUE; 386 lp->timer_val = ISS_NET_TIMER_VALUE;
@@ -387,7 +389,7 @@ static int iss_net_open(struct net_device *dev)
387 mod_timer(&lp->timer, jiffies + lp->timer_val); 389 mod_timer(&lp->timer, jiffies + lp->timer_val);
388 390
389out: 391out:
390 spin_unlock(&lp->lock); 392 spin_unlock_bh(&lp->lock);
391 return err; 393 return err;
392} 394}
393 395
@@ -395,7 +397,7 @@ static int iss_net_close(struct net_device *dev)
395{ 397{
396 struct iss_net_private *lp = netdev_priv(dev); 398 struct iss_net_private *lp = netdev_priv(dev);
397 netif_stop_queue(dev); 399 netif_stop_queue(dev);
398 spin_lock(&lp->lock); 400 spin_lock_bh(&lp->lock);
399 401
400 spin_lock(&opened_lock); 402 spin_lock(&opened_lock);
401 list_del(&opened); 403 list_del(&opened);
@@ -405,18 +407,17 @@ static int iss_net_close(struct net_device *dev)
405 407
406 lp->tp.close(lp); 408 lp->tp.close(lp);
407 409
408 spin_unlock(&lp->lock); 410 spin_unlock_bh(&lp->lock);
409 return 0; 411 return 0;
410} 412}
411 413
412static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev) 414static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
413{ 415{
414 struct iss_net_private *lp = netdev_priv(dev); 416 struct iss_net_private *lp = netdev_priv(dev);
415 unsigned long flags;
416 int len; 417 int len;
417 418
418 netif_stop_queue(dev); 419 netif_stop_queue(dev);
419 spin_lock_irqsave(&lp->lock, flags); 420 spin_lock_bh(&lp->lock);
420 421
421 len = lp->tp.write(lp, &skb); 422 len = lp->tp.write(lp, &skb);
422 423
@@ -438,7 +439,7 @@ static int iss_net_start_xmit(struct sk_buff *skb, struct net_device *dev)
438 pr_err("%s: %s failed(%d)\n", dev->name, __func__, len); 439 pr_err("%s: %s failed(%d)\n", dev->name, __func__, len);
439 } 440 }
440 441
441 spin_unlock_irqrestore(&lp->lock, flags); 442 spin_unlock_bh(&lp->lock);
442 443
443 dev_kfree_skb(skb); 444 dev_kfree_skb(skb);
444 return NETDEV_TX_OK; 445 return NETDEV_TX_OK;
@@ -466,9 +467,9 @@ static int iss_net_set_mac(struct net_device *dev, void *addr)
466 467
467 if (!is_valid_ether_addr(hwaddr->sa_data)) 468 if (!is_valid_ether_addr(hwaddr->sa_data))
468 return -EADDRNOTAVAIL; 469 return -EADDRNOTAVAIL;
469 spin_lock(&lp->lock); 470 spin_lock_bh(&lp->lock);
470 memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN); 471 memcpy(dev->dev_addr, hwaddr->sa_data, ETH_ALEN);
471 spin_unlock(&lp->lock); 472 spin_unlock_bh(&lp->lock);
472 return 0; 473 return 0;
473} 474}
474 475
@@ -520,11 +521,11 @@ static int iss_net_configure(int index, char *init)
520 *lp = (struct iss_net_private) { 521 *lp = (struct iss_net_private) {
521 .device_list = LIST_HEAD_INIT(lp->device_list), 522 .device_list = LIST_HEAD_INIT(lp->device_list),
522 .opened_list = LIST_HEAD_INIT(lp->opened_list), 523 .opened_list = LIST_HEAD_INIT(lp->opened_list),
523 .lock = __SPIN_LOCK_UNLOCKED(lp.lock),
524 .dev = dev, 524 .dev = dev,
525 .index = index, 525 .index = index,
526 }; 526 };
527 527
528 spin_lock_init(&lp->lock);
528 /* 529 /*
529 * If this name ends up conflicting with an existing registered 530 * If this name ends up conflicting with an existing registered
530 * netdevice, that is OK, register_netdev{,ice}() will notice this 531 * netdevice, that is OK, register_netdev{,ice}() will notice this
diff --git a/arch/xtensa/platforms/xtfpga/Makefile b/arch/xtensa/platforms/xtfpga/Makefile
index b9ae206340cd..7839d38b2337 100644
--- a/arch/xtensa/platforms/xtfpga/Makefile
+++ b/arch/xtensa/platforms/xtfpga/Makefile
@@ -6,4 +6,5 @@
6# 6#
7# Note 2! The CFLAGS definitions are in the main makefile... 7# Note 2! The CFLAGS definitions are in the main makefile...
8 8
9obj-y = setup.o lcd.o 9obj-y += setup.o
10obj-$(CONFIG_XTFPGA_LCD) += lcd.o
diff --git a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
index 6edd20bb4565..0a55bb9c5420 100644
--- a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
+++ b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
@@ -40,9 +40,6 @@
40 40
41/* UART */ 41/* UART */
42#define DUART16552_PADDR (XCHAL_KIO_PADDR + 0x0D050020) 42#define DUART16552_PADDR (XCHAL_KIO_PADDR + 0x0D050020)
43/* LCD instruction and data addresses. */
44#define LCD_INSTR_ADDR ((char *)IOADDR(0x0D040000))
45#define LCD_DATA_ADDR ((char *)IOADDR(0x0D040004))
46 43
47/* Misc. */ 44/* Misc. */
48#define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000) 45#define XTFPGA_FPGAREGS_VADDR IOADDR(0x0D020000)
@@ -62,4 +59,7 @@
62 /* 5*rx buffs + 5*tx buffs */ 59 /* 5*rx buffs + 5*tx buffs */
63#define OETH_SRAMBUFF_SIZE (5 * 0x600 + 5 * 0x600) 60#define OETH_SRAMBUFF_SIZE (5 * 0x600 + 5 * 0x600)
64 61
62#define C67X00_PADDR (XCHAL_KIO_PADDR + 0x0D0D0000)
63#define C67X00_SIZE 0x10
64#define C67X00_IRQ 5
65#endif /* __XTENSA_XTAVNET_HARDWARE_H */ 65#endif /* __XTENSA_XTAVNET_HARDWARE_H */
diff --git a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
index 0e435645af5a..4c8541ed1139 100644
--- a/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
+++ b/arch/xtensa/platforms/xtfpga/include/platform/lcd.h
@@ -11,10 +11,25 @@
11#ifndef __XTENSA_XTAVNET_LCD_H 11#ifndef __XTENSA_XTAVNET_LCD_H
12#define __XTENSA_XTAVNET_LCD_H 12#define __XTENSA_XTAVNET_LCD_H
13 13
14#ifdef CONFIG_XTFPGA_LCD
14/* Display string STR at position POS on the LCD. */ 15/* Display string STR at position POS on the LCD. */
15void lcd_disp_at_pos(char *str, unsigned char pos); 16void lcd_disp_at_pos(char *str, unsigned char pos);
16 17
17/* Shift the contents of the LCD display left or right. */ 18/* Shift the contents of the LCD display left or right. */
18void lcd_shiftleft(void); 19void lcd_shiftleft(void);
19void lcd_shiftright(void); 20void lcd_shiftright(void);
21#else
22static inline void lcd_disp_at_pos(char *str, unsigned char pos)
23{
24}
25
26static inline void lcd_shiftleft(void)
27{
28}
29
30static inline void lcd_shiftright(void)
31{
32}
33#endif
34
20#endif 35#endif
diff --git a/arch/xtensa/platforms/xtfpga/lcd.c b/arch/xtensa/platforms/xtfpga/lcd.c
index 2872301598df..4dc0c1b43f4b 100644
--- a/arch/xtensa/platforms/xtfpga/lcd.c
+++ b/arch/xtensa/platforms/xtfpga/lcd.c
@@ -1,50 +1,63 @@
1/* 1/*
2 * Driver for the LCD display on the Tensilica LX60 Board. 2 * Driver for the LCD display on the Tensilica XTFPGA board family.
3 * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf
3 * 4 *
4 * This file is subject to the terms and conditions of the GNU General Public 5 * This file is subject to the terms and conditions of the GNU General Public
5 * License. See the file "COPYING" in the main directory of this archive 6 * License. See the file "COPYING" in the main directory of this archive
6 * for more details. 7 * for more details.
7 * 8 *
8 * Copyright (C) 2001, 2006 Tensilica Inc. 9 * Copyright (C) 2001, 2006 Tensilica Inc.
10 * Copyright (C) 2015 Cadence Design Systems Inc.
9 */ 11 */
10 12
11/* 13#include <linux/delay.h>
12 *
13 * FIXME: this code is from the examples from the LX60 user guide.
14 *
15 * The lcd_pause function does busy waiting, which is probably not
16 * great. Maybe the code could be changed to use kernel timers, or
17 * change the hardware to not need to wait.
18 */
19
20#include <linux/init.h> 14#include <linux/init.h>
21#include <linux/io.h> 15#include <linux/io.h>
22 16
23#include <platform/hardware.h> 17#include <platform/hardware.h>
24#include <platform/lcd.h> 18#include <platform/lcd.h>
25#include <linux/delay.h>
26 19
27#define LCD_PAUSE_ITERATIONS 4000 20/* LCD instruction and data addresses. */
21#define LCD_INSTR_ADDR ((char *)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR))
22#define LCD_DATA_ADDR (LCD_INSTR_ADDR + 4)
23
28#define LCD_CLEAR 0x1 24#define LCD_CLEAR 0x1
29#define LCD_DISPLAY_ON 0xc 25#define LCD_DISPLAY_ON 0xc
30 26
31/* 8bit and 2 lines display */ 27/* 8bit and 2 lines display */
32#define LCD_DISPLAY_MODE8BIT 0x38 28#define LCD_DISPLAY_MODE8BIT 0x38
29#define LCD_DISPLAY_MODE4BIT 0x28
33#define LCD_DISPLAY_POS 0x80 30#define LCD_DISPLAY_POS 0x80
34#define LCD_SHIFT_LEFT 0x18 31#define LCD_SHIFT_LEFT 0x18
35#define LCD_SHIFT_RIGHT 0x1c 32#define LCD_SHIFT_RIGHT 0x1c
36 33
34static void lcd_put_byte(u8 *addr, u8 data)
35{
36#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS
37 ACCESS_ONCE(*addr) = data;
38#else
39 ACCESS_ONCE(*addr) = data & 0xf0;
40 ACCESS_ONCE(*addr) = (data << 4) & 0xf0;
41#endif
42}
43
37static int __init lcd_init(void) 44static int __init lcd_init(void)
38{ 45{
39 *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; 46 ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
40 mdelay(5); 47 mdelay(5);
41 *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; 48 ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
42 udelay(200); 49 udelay(200);
43 *LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT; 50 ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
51 udelay(50);
52#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS
53 ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT;
54 udelay(50);
55 lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT);
44 udelay(50); 56 udelay(50);
45 *LCD_INSTR_ADDR = LCD_DISPLAY_ON; 57#endif
58 lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON);
46 udelay(50); 59 udelay(50);
47 *LCD_INSTR_ADDR = LCD_CLEAR; 60 lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR);
48 mdelay(10); 61 mdelay(10);
49 lcd_disp_at_pos("XTENSA LINUX", 0); 62 lcd_disp_at_pos("XTENSA LINUX", 0);
50 return 0; 63 return 0;
@@ -52,10 +65,10 @@ static int __init lcd_init(void)
52 65
53void lcd_disp_at_pos(char *str, unsigned char pos) 66void lcd_disp_at_pos(char *str, unsigned char pos)
54{ 67{
55 *LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos; 68 lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos);
56 udelay(100); 69 udelay(100);
57 while (*str != 0) { 70 while (*str != 0) {
58 *LCD_DATA_ADDR = *str; 71 lcd_put_byte(LCD_DATA_ADDR, *str);
59 udelay(200); 72 udelay(200);
60 str++; 73 str++;
61 } 74 }
@@ -63,13 +76,13 @@ void lcd_disp_at_pos(char *str, unsigned char pos)
63 76
64void lcd_shiftleft(void) 77void lcd_shiftleft(void)
65{ 78{
66 *LCD_INSTR_ADDR = LCD_SHIFT_LEFT; 79 lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT);
67 udelay(50); 80 udelay(50);
68} 81}
69 82
70void lcd_shiftright(void) 83void lcd_shiftright(void)
71{ 84{
72 *LCD_INSTR_ADDR = LCD_SHIFT_RIGHT; 85 lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT);
73 udelay(50); 86 udelay(50);
74} 87}
75 88
diff --git a/arch/xtensa/platforms/xtfpga/setup.c b/arch/xtensa/platforms/xtfpga/setup.c
index 57fd08b36f51..b4cf70e535ab 100644
--- a/arch/xtensa/platforms/xtfpga/setup.c
+++ b/arch/xtensa/platforms/xtfpga/setup.c
@@ -189,6 +189,7 @@ void __init platform_calibrate_ccount(void)
189#include <linux/serial_8250.h> 189#include <linux/serial_8250.h>
190#include <linux/if.h> 190#include <linux/if.h>
191#include <net/ethoc.h> 191#include <net/ethoc.h>
192#include <linux/usb/c67x00.h>
192 193
193/*---------------------------------------------------------------------------- 194/*----------------------------------------------------------------------------
194 * Ethernet -- OpenCores Ethernet MAC (ethoc driver) 195 * Ethernet -- OpenCores Ethernet MAC (ethoc driver)
@@ -233,6 +234,38 @@ static struct platform_device ethoc_device = {
233}; 234};
234 235
235/*---------------------------------------------------------------------------- 236/*----------------------------------------------------------------------------
237 * USB Host/Device -- Cypress CY7C67300
238 */
239
240static struct resource c67x00_res[] = {
241 [0] = { /* register space */
242 .start = C67X00_PADDR,
243 .end = C67X00_PADDR + C67X00_SIZE - 1,
244 .flags = IORESOURCE_MEM,
245 },
246 [1] = { /* IRQ number */
247 .start = C67X00_IRQ,
248 .end = C67X00_IRQ,
249 .flags = IORESOURCE_IRQ,
250 },
251};
252
253static struct c67x00_platform_data c67x00_pdata = {
254 .sie_config = C67X00_SIE1_HOST | C67X00_SIE2_UNUSED,
255 .hpi_regstep = 4,
256};
257
258static struct platform_device c67x00_device = {
259 .name = "c67x00",
260 .id = -1,
261 .num_resources = ARRAY_SIZE(c67x00_res),
262 .resource = c67x00_res,
263 .dev = {
264 .platform_data = &c67x00_pdata,
265 },
266};
267
268/*----------------------------------------------------------------------------
236 * UART 269 * UART
237 */ 270 */
238 271
@@ -268,6 +301,7 @@ static struct platform_device xtavnet_uart = {
268/* platform devices */ 301/* platform devices */
269static struct platform_device *platform_devices[] __initdata = { 302static struct platform_device *platform_devices[] __initdata = {
270 &ethoc_device, 303 &ethoc_device,
304 &c67x00_device,
271 &xtavnet_uart, 305 &xtavnet_uart,
272}; 306};
273 307