All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Slaby <jslaby@suse.cz>
To: stable@vger.kernel.org
Cc: Max Filippov <jcmvbkbc@gmail.com>, Jiri Slaby <jslaby@suse.cz>
Subject: [patch added to the 3.12 stable tree] xtensa: xtfpga: fix hardware lockup caused by LCD driver
Date: Mon,  4 May 2015 14:37:39 +0200	[thread overview]
Message-ID: <1430743082-6957-48-git-send-email-jslaby@suse.cz> (raw)
In-Reply-To: <1430743082-6957-1-git-send-email-jslaby@suse.cz>

From: Max Filippov <jcmvbkbc@gmail.com>

This patch has been added to the 3.12 stable tree. If you have any
objections, please let us know.

===============

commit 4949009eb8d40a441dcddcd96e101e77d31cf1b2 upstream.

LCD driver is always built for the XTFPGA platform, but its base address
is not configurable, and is wrong for ML605/KC705. Its initialization
locks up KC705 board hardware.

Make the whole driver optional, and its base address and bus width
configurable. Implement 4-bit bus access method.

Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
---
 arch/xtensa/Kconfig                                | 30 ++++++++++++
 arch/xtensa/platforms/xtfpga/Makefile              |  3 +-
 .../platforms/xtfpga/include/platform/hardware.h   |  3 --
 .../xtensa/platforms/xtfpga/include/platform/lcd.h | 15 ++++++
 arch/xtensa/platforms/xtfpga/lcd.c                 | 55 +++++++++++++---------
 5 files changed, 81 insertions(+), 25 deletions(-)

diff --git a/arch/xtensa/Kconfig b/arch/xtensa/Kconfig
index 8d24dcb7cdac..3b8060e4f1d7 100644
--- a/arch/xtensa/Kconfig
+++ b/arch/xtensa/Kconfig
@@ -289,6 +289,36 @@ menu "Executable file formats"
 
 source "fs/Kconfig.binfmt"
 
+config XTFPGA_LCD
+	bool "Enable XTFPGA LCD driver"
+	depends on XTENSA_PLATFORM_XTFPGA
+	default n
+	help
+	  There's a 2x16 LCD on most of XTFPGA boards, kernel may output
+	  progress messages there during bootup/shutdown. It may be useful
+	  during board bringup.
+
+	  If unsure, say N.
+
+config XTFPGA_LCD_BASE_ADDR
+	hex "XTFPGA LCD base address"
+	depends on XTFPGA_LCD
+	default "0x0d0c0000"
+	help
+	  Base address of the LCD controller inside KIO region.
+	  Different boards from XTFPGA family have LCD controller at different
+	  addresses. Please consult prototyping user guide for your board for
+	  the correct address. Wrong address here may lead to hardware lockup.
+
+config XTFPGA_LCD_8BIT_ACCESS
+	bool "Use 8-bit access to XTFPGA LCD"
+	depends on XTFPGA_LCD
+	default n
+	help
+	  LCD may be connected with 4- or 8-bit interface, 8-bit access may
+	  only be used with 8-bit interface. Please consult prototyping user
+	  guide for your board for the correct interface width.
+
 endmenu
 
 source "net/Kconfig"
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 @@
 #
 # Note 2! The CFLAGS definitions are in the main makefile...
 
-obj-y			= setup.o lcd.o
+obj-y			+= setup.o
+obj-$(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 4416773cbde5..b39fbcf5c611 100644
--- a/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
+++ b/arch/xtensa/platforms/xtfpga/include/platform/hardware.h
@@ -44,9 +44,6 @@
 
 /* UART */
 #define DUART16552_PADDR	(XCHAL_KIO_PADDR + 0x0D050020)
-/* LCD instruction and data addresses. */
-#define LCD_INSTR_ADDR		((char *)IOADDR(0x0D040000))
-#define LCD_DATA_ADDR		((char *)IOADDR(0x0D040004))
 
 /* Misc. */
 #define XTFPGA_FPGAREGS_VADDR	IOADDR(0x0D020000)
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 @@
 #ifndef __XTENSA_XTAVNET_LCD_H
 #define __XTENSA_XTAVNET_LCD_H
 
+#ifdef CONFIG_XTFPGA_LCD
 /* Display string STR at position POS on the LCD. */
 void lcd_disp_at_pos(char *str, unsigned char pos);
 
 /* Shift the contents of the LCD display left or right. */
 void lcd_shiftleft(void);
 void lcd_shiftright(void);
+#else
+static inline void lcd_disp_at_pos(char *str, unsigned char pos)
+{
+}
+
+static inline void lcd_shiftleft(void)
+{
+}
+
+static inline void lcd_shiftright(void)
+{
+}
+#endif
+
 #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 @@
 /*
- * Driver for the LCD display on the Tensilica LX60 Board.
+ * Driver for the LCD display on the Tensilica XTFPGA board family.
+ * http://www.mytechcorp.com/cfdata/productFile/File1/MOC-16216B-B-A0A04.pdf
  *
  * This file is subject to the terms and conditions of the GNU General Public
  * License.  See the file "COPYING" in the main directory of this archive
  * for more details.
  *
  * Copyright (C) 2001, 2006 Tensilica Inc.
+ * Copyright (C) 2015 Cadence Design Systems Inc.
  */
 
-/*
- *
- * FIXME: this code is from the examples from the LX60 user guide.
- *
- * The lcd_pause function does busy waiting, which is probably not
- * great. Maybe the code could be changed to use kernel timers, or
- * change the hardware to not need to wait.
- */
-
+#include <linux/delay.h>
 #include <linux/init.h>
 #include <linux/io.h>
 
 #include <platform/hardware.h>
 #include <platform/lcd.h>
-#include <linux/delay.h>
 
-#define LCD_PAUSE_ITERATIONS	4000
+/* LCD instruction and data addresses. */
+#define LCD_INSTR_ADDR		((char *)IOADDR(CONFIG_XTFPGA_LCD_BASE_ADDR))
+#define LCD_DATA_ADDR		(LCD_INSTR_ADDR + 4)
+
 #define LCD_CLEAR		0x1
 #define LCD_DISPLAY_ON		0xc
 
 /* 8bit and 2 lines display */
 #define LCD_DISPLAY_MODE8BIT	0x38
+#define LCD_DISPLAY_MODE4BIT	0x28
 #define LCD_DISPLAY_POS		0x80
 #define LCD_SHIFT_LEFT		0x18
 #define LCD_SHIFT_RIGHT		0x1c
 
+static void lcd_put_byte(u8 *addr, u8 data)
+{
+#ifdef CONFIG_XTFPGA_LCD_8BIT_ACCESS
+	ACCESS_ONCE(*addr) = data;
+#else
+	ACCESS_ONCE(*addr) = data & 0xf0;
+	ACCESS_ONCE(*addr) = (data << 4) & 0xf0;
+#endif
+}
+
 static int __init lcd_init(void)
 {
-	*LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+	ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
 	mdelay(5);
-	*LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+	ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
 	udelay(200);
-	*LCD_INSTR_ADDR = LCD_DISPLAY_MODE8BIT;
+	ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE8BIT;
+	udelay(50);
+#ifndef CONFIG_XTFPGA_LCD_8BIT_ACCESS
+	ACCESS_ONCE(*LCD_INSTR_ADDR) = LCD_DISPLAY_MODE4BIT;
+	udelay(50);
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_MODE4BIT);
 	udelay(50);
-	*LCD_INSTR_ADDR = LCD_DISPLAY_ON;
+#endif
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_ON);
 	udelay(50);
-	*LCD_INSTR_ADDR = LCD_CLEAR;
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_CLEAR);
 	mdelay(10);
 	lcd_disp_at_pos("XTENSA LINUX", 0);
 	return 0;
@@ -52,10 +65,10 @@ static int __init lcd_init(void)
 
 void lcd_disp_at_pos(char *str, unsigned char pos)
 {
-	*LCD_INSTR_ADDR = LCD_DISPLAY_POS | pos;
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_DISPLAY_POS | pos);
 	udelay(100);
 	while (*str != 0) {
-		*LCD_DATA_ADDR = *str;
+		lcd_put_byte(LCD_DATA_ADDR, *str);
 		udelay(200);
 		str++;
 	}
@@ -63,13 +76,13 @@ void lcd_disp_at_pos(char *str, unsigned char pos)
 
 void lcd_shiftleft(void)
 {
-	*LCD_INSTR_ADDR = LCD_SHIFT_LEFT;
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_LEFT);
 	udelay(50);
 }
 
 void lcd_shiftright(void)
 {
-	*LCD_INSTR_ADDR = LCD_SHIFT_RIGHT;
+	lcd_put_byte(LCD_INSTR_ADDR, LCD_SHIFT_RIGHT);
 	udelay(50);
 }
 
-- 
2.3.5


  parent reply	other threads:[~2015-05-04 12:38 UTC|newest]

Thread overview: 71+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-05-04 12:36 [patch added to the 3.12 stable tree] drivers: parport: Kconfig: exclude arm64 for PARPORT_PC Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] usb: gadget: composite: enable BESL support Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] nosave: consolidate __nosave_{begin,end} in <asm/sections.h> Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] KVM: s390: Zero out current VMDB of STSI before including level3 data Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] s390/hibernate: fix save and restore of kernel text section Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] KVM: use slowpath for cross page cached accesses Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] MIPS: Hibernate: flush TLB entries earlier Jiri Slaby
2015-05-04 12:36 ` [patch added to the 3.12 stable tree] cdc-wdm: fix endianness bug in debug statements Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] spi: spidev: fix possible arithmetic overflow for multi-transfer message Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] compal-laptop: Check return value of power_supply_register Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ring-buffer: Replace this_cpu_*() with __this_cpu_*() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] power_supply: twl4030_madc: Check return value of power_supply_register Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] power_supply: lp8788-charger: Fix leaked power supply on probe fail Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: 8320/1: fix integer overflow in ELF_ET_DYN_BASE Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: S3C64XX: Use fixed IRQ bases to avoid conflicts on Cragganmore Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ARM: dts: dove: Fix uart[23] reg property Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: phy: Find the right match in devm_usb_phy_match Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: define a generic USB_RESUME_TIMEOUT macro Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: fusbh200: use new USB_RESUME_TIMEOUT Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: uhci: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: fotg210: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: r8a66597: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: isp116x: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: xhci: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: host: sl811: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: dwc2: hcd: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] usb: core: hub: " Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ALSA: emu10k1: don't deadlock in proc-functions Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Input: elantech - fix absolute mode setting on some ASUS laptops Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] fs/binfmt_elf.c: fix bug in loading of PIE binaries Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ptrace: fix race between ptrace_resume() and wait_task_stopped() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] rtlwifi: rtl8192cu: Add new USB ID Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] rtlwifi: rtl8192cu: Add new device ID Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] arm64: vdso: fix build error when switching from LE to BE Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ext4: make fsync to sync parent dir in no-journal for real this time Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] powerpc/perf: Cap 64bit userspace backtraces to PERF_MAX_STACK_DEPTH Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] tools lib traceevent kbuffer: Remove extra update to data pointer in PADDING Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] tools/power turbostat: Use $(CURDIR) instead of $(PWD) and add support for O= option in Makefile Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: account for bitflips in both the VID header and data Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: fix out of bounds write Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: initialize LEB number variable Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] UBI: fix check for "too many bytes" Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] scsi: storvsc: Fix a bug in copy_from_bounce_buffer() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] target: Fix COMPARE_AND_WRITE with SG_TO_MEM_NOALLOC handling Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Bluetooth: ath3k: Add support Atheros AR5B195 combo Mini PCIe card Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] powerpc: Fix missing L2 cache size in /sys/devices/system/cpu Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ACPICA: Utilities: split IO address types from data type models Jiri Slaby
2015-05-04 12:37 ` Jiri Slaby [this message]
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] xtensa: provide __NR_sync_file_range2 instead of __NR_sync_file_range Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] xtensa: ISS: fix locking in TAP network adapter Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] gpio: mvebu: Fix mask/unmask managment per irq chip type Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] dm crypt: fix deadlock when async crypto algorithm returns -EBUSY Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] Drivers: hv: vmbus: Fix a bug in the error path in vmbus_open() Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] mvsas: fix panic on expander attached SATA devices Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] stk1160: Make sure current buffer is released Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/core: disallow registering 0-sized memory region Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/core: don't disallow registering region starting at 0x0 Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] IB/mlx4: Fix WQE LSO segment calculation Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] i2c: core: Export bus recovery functions Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] drm/radeon: fix doublescan modes (v2) Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] drm/i915: cope with large i2c transfers Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] RCU pathwalk breakage when running into a symlink overmounting something Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] ksoftirqd: Enable IRQs and call cond_resched() before poking RCU Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] e1000: add dummy allocator to fix race condition between mtu change and netpoll Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] lib: memzero_explicit: use barrier instead of OPTIMIZER_HIDE_VAR Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] wl18xx: show rx_frames_per_rates as an array as it really is Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] crypto: omap-aes - Fix support for unequal lengths Jiri Slaby
2015-05-04 12:37 ` [patch added to the 3.12 stable tree] C6x: time: Ensure consistency in __init Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] memstick: mspro_block: add missing curly braces Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] driver core: bus: Goto appropriate labels on failure in bus_add_device Jiri Slaby
2015-05-04 12:38 ` [patch added to the 3.12 stable tree] fs: take i_mutex during prepare_binprm for set[ug]id executables Jiri Slaby

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1430743082-6957-48-git-send-email-jslaby@suse.cz \
    --to=jslaby@suse.cz \
    --cc=jcmvbkbc@gmail.com \
    --cc=stable@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.