diff options
author | Petr Štetiar <ynezz@true.cz> | 2010-03-03 09:43:15 +0000 |
---|---|---|
committer | Marcin Juszkiewicz <marcin@juszkiewicz.com.pl> | 2010-03-04 15:11:11 +0100 |
commit | b5263c641ea29e0d3064318bf8a95ceef010d4fd (patch) | |
tree | 7e1b08eae343f21dc664817b3f183ec10691cecf /recipes/linux/linux-2.6.24/ts72xx | |
parent | df46e35a681e820119d222da40f41e173853cf16 (diff) |
linux 2.6.24: update ts72xx patchset and stop using it as default kernel
Signed-off-by: Petr Štetiar <ynezz@true.cz>
Acked-by: Marcin Juszkiewicz <marcin@juszkiewicz.com.pl>
Diffstat (limited to 'recipes/linux/linux-2.6.24/ts72xx')
4 files changed, 63 insertions, 257 deletions
diff --git a/recipes/linux/linux-2.6.24/ts72xx/ep93xx-i2c-bus.diff b/recipes/linux/linux-2.6.24/ts72xx/ep93xx-i2c-bus.diff index d3c66940de..c68647ff37 100644 --- a/recipes/linux/linux-2.6.24/ts72xx/ep93xx-i2c-bus.diff +++ b/recipes/linux/linux-2.6.24/ts72xx/ep93xx-i2c-bus.diff @@ -3,13 +3,13 @@ I2C bus driver using ep93xx GPIOs. Signed-off-by: Lennert Buytenhek <buytenh@wantstofly.org> -Index: linux-2.6.22/drivers/i2c/busses/Kconfig +Index: linux-2.6.24/drivers/i2c/busses/Kconfig =================================================================== ---- linux-2.6.22.orig/drivers/i2c/busses/Kconfig 2007-08-30 00:42:45.000000000 +0200 -+++ linux-2.6.22/drivers/i2c/busses/Kconfig 2007-08-30 00:42:52.000000000 +0200 -@@ -635,4 +635,16 @@ - This driver can also be built as a module. If so, the module - will be called i2c-pnx. +--- linux-2.6.24.orig/drivers/i2c/busses/Kconfig 2010-02-07 14:53:59.000000000 +0100 ++++ linux-2.6.24/drivers/i2c/busses/Kconfig 2010-02-07 14:54:23.000000000 +0100 +@@ -675,4 +675,16 @@ + This driver can also be built as module. If so, the module + will be called i2c-pmcmsp. +config I2C_EP93XX + tristate "Cirrus Logic EP93XX GPIO-based I2C interface" @@ -24,11 +24,11 @@ Index: linux-2.6.22/drivers/i2c/busses/Kconfig + + endmenu -Index: linux-2.6.22/drivers/i2c/busses/Makefile +Index: linux-2.6.24/drivers/i2c/busses/Makefile =================================================================== ---- linux-2.6.22.orig/drivers/i2c/busses/Makefile 2007-08-30 00:42:45.000000000 +0200 -+++ linux-2.6.22/drivers/i2c/busses/Makefile 2007-08-30 00:42:52.000000000 +0200 -@@ -52,6 +52,7 @@ +--- linux-2.6.24.orig/drivers/i2c/busses/Makefile 2010-02-07 14:53:59.000000000 +0100 ++++ linux-2.6.24/drivers/i2c/busses/Makefile 2010-02-07 14:54:23.000000000 +0100 +@@ -53,6 +53,7 @@ obj-$(CONFIG_I2C_VOODOO3) += i2c-voodoo3.o obj-$(CONFIG_SCx200_ACB) += scx200_acb.o obj-$(CONFIG_SCx200_I2C) += scx200_i2c.o @@ -36,10 +36,10 @@ Index: linux-2.6.22/drivers/i2c/busses/Makefile ifeq ($(CONFIG_I2C_DEBUG_BUS),y) EXTRA_CFLAGS += -DDEBUG -Index: linux-2.6.22/drivers/i2c/busses/i2c-ep93xx.c +Index: linux-2.6.24/drivers/i2c/busses/i2c-ep93xx.c =================================================================== --- /dev/null 1970-01-01 00:00:00.000000000 +0000 -+++ linux-2.6.22/drivers/i2c/busses/i2c-ep93xx.c 2007-08-30 00:42:52.000000000 +0200 ++++ linux-2.6.24/drivers/i2c/busses/i2c-ep93xx.c 2010-02-07 14:54:23.000000000 +0100 @@ -0,0 +1,159 @@ +/* + * EP93XX I2C bus driver. @@ -200,10 +200,10 @@ Index: linux-2.6.22/drivers/i2c/busses/i2c-ep93xx.c +MODULE_AUTHOR("Lennert Buytenhek <buytenh@wantstofly.org>"); +MODULE_DESCRIPTION("GPIO-based I2C adapter for EP93XX systems"); +MODULE_LICENSE("GPL"); -Index: linux-2.6.22/include/asm-arm/arch-ep93xx/platform.h +Index: linux-2.6.24/include/asm-arm/arch-ep93xx/platform.h =================================================================== ---- linux-2.6.22.orig/include/asm-arm/arch-ep93xx/platform.h 2007-08-30 00:42:45.000000000 +0200 -+++ linux-2.6.22/include/asm-arm/arch-ep93xx/platform.h 2007-08-30 00:42:52.000000000 +0200 +--- linux-2.6.24.orig/include/asm-arm/arch-ep93xx/platform.h 2010-02-07 14:53:59.000000000 +0100 ++++ linux-2.6.24/include/asm-arm/arch-ep93xx/platform.h 2010-02-07 14:54:23.000000000 +0100 @@ -16,5 +16,13 @@ unsigned char phy_id; }; diff --git a/recipes/linux/linux-2.6.24/ts72xx/ep93xx-maverick-uniqid.patch b/recipes/linux/linux-2.6.24/ts72xx/ep93xx-maverick-uniqid.patch index fb6c8cfe18..857a0194cf 100644 --- a/recipes/linux/linux-2.6.24/ts72xx/ep93xx-maverick-uniqid.patch +++ b/recipes/linux/linux-2.6.24/ts72xx/ep93xx-maverick-uniqid.patch @@ -3,11 +3,11 @@ Adds support for SoC's unique ID (Maverick Key) in /proc/cpuinfo Signed-off-by: Petr Stetiar <ynezz@true.cz> -Index: linux-2.6.22/arch/arm/kernel/setup.c +Index: linux-2.6.24/arch/arm/kernel/setup.c =================================================================== ---- linux-2.6.22.orig/arch/arm/kernel/setup.c 2007-09-02 23:08:51.000000000 +0200 -+++ linux-2.6.22/arch/arm/kernel/setup.c 2007-09-02 23:10:24.000000000 +0200 -@@ -959,8 +959,15 @@ +--- linux-2.6.24.orig/arch/arm/kernel/setup.c 2010-02-07 14:53:58.000000000 +0100 ++++ linux-2.6.24/arch/arm/kernel/setup.c 2010-02-07 14:54:35.000000000 +0100 +@@ -1007,8 +1007,15 @@ seq_printf(m, "Hardware\t: %s\n", machine_name); seq_printf(m, "Revision\t: %04x\n", system_rev); @@ -23,10 +23,10 @@ Index: linux-2.6.22/arch/arm/kernel/setup.c return 0; } -Index: linux-2.6.22/include/asm-arm/arch-ep93xx/ep93xx-regs.h +Index: linux-2.6.24/include/asm-arm/arch-ep93xx/ep93xx-regs.h =================================================================== ---- linux-2.6.22.orig/include/asm-arm/arch-ep93xx/ep93xx-regs.h 2007-09-02 23:06:45.000000000 +0200 -+++ linux-2.6.22/include/asm-arm/arch-ep93xx/ep93xx-regs.h 2007-09-02 23:08:34.000000000 +0200 +--- linux-2.6.24.orig/include/asm-arm/arch-ep93xx/ep93xx-regs.h 2010-02-07 14:54:29.000000000 +0100 ++++ linux-2.6.24/include/asm-arm/arch-ep93xx/ep93xx-regs.h 2010-02-07 14:54:35.000000000 +0100 @@ -70,6 +70,8 @@ #define EP93XX_I2S_BASE (EP93XX_APB_VIRT_BASE + 0x00020000) diff --git a/recipes/linux/linux-2.6.24/ts72xx/ts72xx-machine-id-fix.patch b/recipes/linux/linux-2.6.24/ts72xx/ts72xx-machine-id-fix.patch index 64c38398db..0b01e9c3a1 100644 --- a/recipes/linux/linux-2.6.24/ts72xx/ts72xx-machine-id-fix.patch +++ b/recipes/linux/linux-2.6.24/ts72xx/ts72xx-machine-id-fix.patch @@ -3,11 +3,11 @@ Fix wrong machine ID passed from RedBoot Signed-off-by: Petr Stetiar <ynezz@true.cz> -Index: linux-2.6.22/arch/arm/kernel/head.S +Index: linux-2.6.24/arch/arm/kernel/head.S =================================================================== ---- linux-2.6.22.orig/arch/arm/kernel/head.S 2007-08-30 00:42:45.000000000 +0200 -+++ linux-2.6.22/arch/arm/kernel/head.S 2007-08-30 00:43:13.000000000 +0200 -@@ -82,6 +82,7 @@ +--- linux-2.6.24.orig/arch/arm/kernel/head.S 2010-02-07 14:53:58.000000000 +0100 ++++ linux-2.6.24/arch/arm/kernel/head.S 2010-02-07 14:54:39.000000000 +0100 +@@ -86,6 +86,7 @@ bl __lookup_processor_type @ r5=procinfo r9=cpuid movs r10, r5 @ invalid processor (r5=0)? beq __error_p @ yes, error 'p' diff --git a/recipes/linux/linux-2.6.24/ts72xx/ts72xx-rs485.patch b/recipes/linux/linux-2.6.24/ts72xx/ts72xx-rs485.patch index 17ee397f45..dbc0ede258 100644 --- a/recipes/linux/linux-2.6.24/ts72xx/ts72xx-rs485.patch +++ b/recipes/linux/linux-2.6.24/ts72xx/ts72xx-rs485.patch @@ -2,19 +2,19 @@ RS485 auto mode support ported from 2.4 (diff against 2.6.19-rc6-git10) Signed-off-by: Petr Stetiar <ynezz@true.cz> -diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c -index 4213fab..5b3c5ff 100644 ---- a/drivers/serial/amba-pl010.c -+++ b/drivers/serial/amba-pl010.c -@@ -50,6 +50,7 @@ - #include <linux/amba/serial.h> +Index: linux-2.6.24/drivers/serial/amba-pl010.c +=================================================================== +--- linux-2.6.24.orig/drivers/serial/amba-pl010.c 2008-01-24 23:58:37.000000000 +0100 ++++ linux-2.6.24/drivers/serial/amba-pl010.c 2010-02-07 18:17:40.000000000 +0100 +@@ -51,6 +51,7 @@ + #include <linux/clk.h> #include <asm/io.h> +#include <asm/hardware.h> #define UART_NR 8 -@@ -65,6 +66,11 @@ +@@ -66,6 +67,16 @@ #define UART_DUMMY_RSR_RX 256 #define UART_PORT_SIZE 64 @@ -23,10 +23,15 @@ index 4213fab..5b3c5ff 100644 +static void __iomem *ts_rs485_control_register; +#endif + ++#ifdef CONFIG_MACH_TS72XX ++static void __iomem *ts_rs485_data9_register; ++static void __iomem *ts_rs485_control_register; ++#endif ++ /* * We wrap our port structure around the generic uart_port. */ -@@ -487,6 +493,107 @@ static int pl010_verify_port(struct uart +@@ -521,6 +532,107 @@ return ret; } @@ -134,7 +139,7 @@ index 4213fab..5b3c5ff 100644 static struct uart_ops amba_pl010_pops = { .tx_empty = pl010_tx_empty, .set_mctrl = pl010_set_mctrl, -@@ -504,6 +611,7 @@ static struct uart_ops amba_pl010_pops = +@@ -538,6 +650,7 @@ .request_port = pl010_request_port, .config_port = pl010_config_port, .verify_port = pl010_verify_port, @@ -142,7 +147,7 @@ index 4213fab..5b3c5ff 100644 }; static struct uart_amba_port *amba_ports[UART_NR]; -@@ -746,6 +854,15 @@ static int __init pl010_init(void) +@@ -796,6 +909,15 @@ ret = uart_register_driver(&amba_reg); if (ret == 0) { ret = amba_driver_register(&pl010_driver); @@ -158,7 +163,7 @@ index 4213fab..5b3c5ff 100644 if (ret) uart_unregister_driver(&amba_reg); } -@@ -756,6 +873,10 @@ static void __exit pl010_exit(void) +@@ -806,6 +928,10 @@ { amba_driver_unregister(&pl010_driver); uart_unregister_driver(&amba_reg); @@ -169,13 +174,13 @@ index 4213fab..5b3c5ff 100644 } module_init(pl010_init); -diff --git a/include/asm-arm/arch-ep93xx/ts72xx.h b/include/asm-arm/arch-ep93xx/ts72xx.h -index a94f63f..4c9396b 100644 ---- a/include/asm-arm/arch-ep93xx/ts72xx.h -+++ b/include/asm-arm/arch-ep93xx/ts72xx.h -@@ -68,6 +68,16 @@ - #define TS72XX_RTC_DATA_PHYS_BASE 0x11700000 - #define TS72XX_RTC_DATA_SIZE 0x00001000 +Index: linux-2.6.24/include/asm-arm/arch-ep93xx/ts72xx.h +=================================================================== +--- linux-2.6.24.orig/include/asm-arm/arch-ep93xx/ts72xx.h 2010-02-07 18:03:02.000000000 +0100 ++++ linux-2.6.24/include/asm-arm/arch-ep93xx/ts72xx.h 2010-02-07 18:03:02.000000000 +0100 +@@ -59,6 +59,16 @@ + #define TS72XX_NAND_BUSY_VIRT_BASE 0xfebfa000 + #define TS72XX_NAND_BUSY_SIZE 0x00001000 +#define TS72XX_RS485_CONTROL_PHYS_BASE 0x22C00000 +#define TS72XX_RS485_DATA9_PHYS_BASE 0x23000000 @@ -188,211 +193,9 @@ index a94f63f..4c9396b 100644 +#define TS72XX_RS485_MODE_57600_HD 0x06 +#define TS72XX_RS485_MODE_115200_HD 0x07 - #ifndef __ASSEMBLY__ - #include <asm/io.h> -@@ -87,6 +100,12 @@ static inline int board_is_ts7260(void) - return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7260; - } - -+static inline int is_rs485_installed(void) -+{ -+ return !!(__raw_readb(TS72XX_OPTIONS_VIRT_BASE) & -+ TS72XX_OPTIONS_COM2_RS485); -+} -+ - static inline int is_max197_installed(void) - { - return !!(__raw_readb(TS72XX_OPTIONS_VIRT_BASE) & -diff --git a/include/asm-arm/ioctls.h b/include/asm-arm/ioctls.h -index bb9a7aa..4d7dad1 100644 ---- a/include/asm-arm/ioctls.h -+++ b/include/asm-arm/ioctls.h -@@ -66,6 +66,9 @@ - #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ - #define FIOQSIZE 0x545E - -+#define TIOC_SBCC485 0x545F /* TS72xx RTS/485 mode clear */ -+#define TIOC_SBCS485 0x5460 /* TS72xx RTS/485 mode set */ -+ - /* Used for packet mode */ - #define TIOCPKT_DATA 0 - #define TIOCPKT_FLUSHREAD 1 -RS485 auto mode support ported from 2.4 (diff against 2.6.19-rc6-git10) - -Signed-off-by: Petr Stetiar <ynezz@true.cz> - -diff --git a/drivers/serial/amba-pl010.c b/drivers/serial/amba-pl010.c -index 4213fab..5b3c5ff 100644 ---- a/drivers/serial/amba-pl010.c -+++ b/drivers/serial/amba-pl010.c -@@ -50,6 +50,7 @@ - #include <linux/amba/serial.h> - - #include <asm/io.h> -+#include <asm/hardware.h> - - #define UART_NR 8 - -@@ -65,6 +66,11 @@ - #define UART_DUMMY_RSR_RX 256 - #define UART_PORT_SIZE 64 - -+#ifdef CONFIG_MACH_TS72XX -+static void __iomem *ts_rs485_data9_register; -+static void __iomem *ts_rs485_control_register; -+#endif -+ - /* - * We wrap our port structure around the generic uart_port. - */ -@@ -487,6 +493,107 @@ static int pl010_verify_port(struct uart - return ret; - } - -+#ifdef CONFIG_MACH_TS72XX -+static int ts72xx_rs485_init(void) -+{ -+ ts_rs485_data9_register = ioremap(TS72XX_RS485_DATA9_PHYS_BASE, 4096); -+ if (ts_rs485_data9_register == NULL) { -+ return -1; -+ } -+ -+ ts_rs485_control_register = ioremap(TS72XX_RS485_CONTROL_PHYS_BASE, 4096); -+ if (ts_rs485_control_register == NULL) { -+ iounmap(ts_rs485_data9_register); -+ return -1; -+ } -+ -+ return 0; -+} -+ -+static int ts72xx_auto485(struct uart_port *port, unsigned int cmd, unsigned long *arg) -+{ -+ int baud, cflag, mode; -+ int datalength; -+ -+ mode = (int)*arg; -+ if (!is_rs485_installed()) { -+ printk("amba-pl010.c: this board does not support RS485 auto mode\n"); -+ return -EINVAL; -+ } -+ -+ if (port->line != 1) { -+ printk("amba-pl010.c: auto RS485 mode is only supported on second port (/dev/ttyAM1)\n"); -+ return -EINVAL; -+ } -+ -+ datalength = 8; -+ cflag = port->info->tty->termios->c_cflag ; -+ if (cflag & PARENB) -+ datalength++; -+ -+ if (cflag & CSTOPB) -+ datalength++; -+ -+ baud = tty_get_baud_rate(port->info->tty); -+ -+ switch (cmd) { -+ case TIOC_SBCC485: -+ if ((mode & TS72XX_RS485_AUTO485FD) || (mode & TS72XX_RS485_AUTO485HD)) { -+ printk("amba-pl010.c: unsetting auto RS485 mode\n"); -+ __raw_writew(TS72XX_RS485_MODE_RS232, ts_rs485_control_register); -+ __raw_writew(TS72XX_RS485_MODE_RS232, ts_rs485_data9_register); -+ } -+ break; -+ case TIOC_SBCS485: -+ if (mode & TS72XX_RS485_AUTO485FD) { -+ printk ("amba-pl010.c: setting FULL duplex auto RS485 mode\n"); -+ __raw_writew(TS72XX_RS485_MODE_FD, ts_rs485_control_register); -+ if (datalength > 8) -+ __raw_writew(TS72XX_RS485_MODE_FD, ts_rs485_data9_register); -+ } else if (mode & TS72XX_RS485_AUTO485HD) { -+ printk("amba-pl010.c: setting HALF DUPLEX auto RS485 mode\n"); -+ switch (baud) { -+ case 9600: -+ __raw_writew(TS72XX_RS485_MODE_9600_HD, ts_rs485_control_register); -+ break; -+ case 19200: -+ __raw_writew(TS72XX_RS485_MODE_19200_HD, ts_rs485_control_register); -+ break; -+ case 57600: -+ __raw_writew(TS72XX_RS485_MODE_57600_HD, ts_rs485_control_register); -+ break; -+ case 115200: -+ __raw_writew(TS72XX_RS485_MODE_115200_HD, ts_rs485_control_register); -+ break; -+ default: -+ printk("amba-pl010.c: %d baud rate is not supported for auto RS485 mode\n", baud); -+ return -1; -+ } -+ if (datalength > 8) -+ __raw_writew(TS72XX_RS485_MODE_FD, ts_rs485_data9_register); -+ } -+ break; -+ } -+ -+ return 0; -+} -+#endif -+ -+int pl010_ioctl(struct uart_port *port, unsigned int cmd, unsigned long arg) -+{ -+#ifdef CONFIG_MACH_TS72XX -+ switch (cmd) { -+ case TIOC_SBCC485: -+ case TIOC_SBCS485: -+ return ts72xx_auto485(port, cmd, (unsigned long *)arg); -+ break; -+ default: -+ return -ENOIOCTLCMD; -+ } -+#endif -+ return -ENOIOCTLCMD; -+} -+ - static struct uart_ops amba_pl010_pops = { - .tx_empty = pl010_tx_empty, - .set_mctrl = pl010_set_mctrl, -@@ -504,6 +611,7 @@ static struct uart_ops amba_pl010_pops = - .request_port = pl010_request_port, - .config_port = pl010_config_port, - .verify_port = pl010_verify_port, -+ .ioctl = pl010_ioctl, - }; - - static struct uart_amba_port *amba_ports[UART_NR]; -@@ -746,6 +854,15 @@ static int __init pl010_init(void) - ret = uart_register_driver(&amba_reg); - if (ret == 0) { - ret = amba_driver_register(&pl010_driver); -+#ifdef CONFIG_MACH_TS72XX -+ if (!ret && is_rs485_installed()) { -+ ret = ts72xx_rs485_init(); -+ if (ret) -+ printk("amba-pl010.c: ts72xx_rs485_init() failed\n"); -+ else -+ printk("amba-pl010.c: auto RS485 mode initialized\n"); -+ } -+#endif - if (ret) - uart_unregister_driver(&amba_reg); - } -@@ -756,6 +873,10 @@ static void __exit pl010_exit(void) - { - amba_driver_unregister(&pl010_driver); - uart_unregister_driver(&amba_reg); -+#ifdef CONFIG_MACH_TS72XX -+ iounmap(ts_rs485_data9_register); -+ iounmap(ts_rs485_control_register); -+#endif - } - - module_init(pl010_init); -diff --git a/include/asm-arm/arch-ep93xx/ts72xx.h b/include/asm-arm/arch-ep93xx/ts72xx.h -index a94f63f..4c9396b 100644 ---- a/include/asm-arm/arch-ep93xx/ts72xx.h -+++ b/include/asm-arm/arch-ep93xx/ts72xx.h -@@ -68,6 +68,16 @@ + #define TS72XX_RTC_INDEX_VIRT_BASE 0xfebf9000 + #define TS72XX_RTC_INDEX_PHYS_BASE 0x10800000 +@@ -68,6 +78,16 @@ #define TS72XX_RTC_DATA_PHYS_BASE 0x11700000 #define TS72XX_RTC_DATA_SIZE 0x00001000 @@ -407,9 +210,9 @@ index a94f63f..4c9396b 100644 +#define TS72XX_RS485_MODE_57600_HD 0x06 +#define TS72XX_RS485_MODE_115200_HD 0x07 - #ifndef __ASSEMBLY__ - #include <asm/io.h> -@@ -87,6 +100,12 @@ static inline int board_is_ts7260(void) + #define TS72XX_WATCHDOG_CONTROL_PHYS_BASE 0x23800000 + #define TS72XX_WATCHDOG_FEED_PHYS_BASE 0x23c00000 +@@ -90,6 +110,12 @@ return __raw_readb(TS72XX_MODEL_VIRT_BASE) == TS72XX_MODEL_TS7260; } @@ -422,17 +225,20 @@ index a94f63f..4c9396b 100644 static inline int is_max197_installed(void) { return !!(__raw_readb(TS72XX_OPTIONS_VIRT_BASE) & -diff --git a/include/asm-arm/ioctls.h b/include/asm-arm/ioctls.h -index bb9a7aa..4d7dad1 100644 ---- a/include/asm-arm/ioctls.h -+++ b/include/asm-arm/ioctls.h -@@ -66,6 +66,9 @@ +Index: linux-2.6.24/include/asm-arm/ioctls.h +=================================================================== +--- linux-2.6.24.orig/include/asm-arm/ioctls.h 2008-01-24 23:58:37.000000000 +0100 ++++ linux-2.6.24/include/asm-arm/ioctls.h 2010-02-07 18:03:02.000000000 +0100 +@@ -70,6 +70,12 @@ #define TIOCGICOUNT 0x545D /* read serial port inline interrupt counts */ #define FIOQSIZE 0x545E +#define TIOC_SBCC485 0x545F /* TS72xx RTS/485 mode clear */ +#define TIOC_SBCS485 0x5460 /* TS72xx RTS/485 mode set */ + ++#define TIOC_SBCC485 0x545F /* TS72xx RTS/485 mode clear */ ++#define TIOC_SBCS485 0x5460 /* TS72xx RTS/485 mode set */ ++ /* Used for packet mode */ #define TIOCPKT_DATA 0 #define TIOCPKT_FLUSHREAD 1 |