11dbae815STony Lindgren /* 21dbae815STony Lindgren * Copyright (C) 2005 Nokia Corporation 31dbae815STony Lindgren * Author: Paul Mundt <paul.mundt@nokia.com> 41dbae815STony Lindgren * 58d61649dSBenoit Cousson * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 61dbae815STony Lindgren * 78d61649dSBenoit Cousson * Modified from the original mach-omap/omap2/board-generic.c did by Paul 88d61649dSBenoit Cousson * to support the OMAP2+ device tree boards with an unique board file. 91dbae815STony Lindgren * 101dbae815STony Lindgren * This program is free software; you can redistribute it and/or modify 111dbae815STony Lindgren * it under the terms of the GNU General Public License version 2 as 121dbae815STony Lindgren * published by the Free Software Foundation. 131dbae815STony Lindgren */ 148d61649dSBenoit Cousson #include <linux/io.h> 15fbf75da7SBenoit Cousson #include <linux/of_irq.h> 168d61649dSBenoit Cousson #include <linux/of_platform.h> 178d61649dSBenoit Cousson #include <linux/irqdomain.h> 181dbae815STony Lindgren 198c51b034SIvaylo Dimitrov #include <asm/setup.h> 201dbae815STony Lindgren #include <asm/mach/arch.h> 215f35dc47SIvaylo Dimitrov #include <asm/system_info.h> 221dbae815STony Lindgren 234e65331cSTony Lindgren #include "common.h" 241dbae815STony Lindgren 2531957609SUwe Kleine-König static const struct of_device_id omap_dt_match_table[] __initconst = { 268d61649dSBenoit Cousson { .compatible = "simple-bus", }, 278d61649dSBenoit Cousson { .compatible = "ti,omap-infra", }, 288d61649dSBenoit Cousson { } 29b3c6df3aSPaul Walmsley }; 30b3c6df3aSPaul Walmsley 31293ea3d0SArnd Bergmann static void __init __maybe_unused omap_generic_init(void) 321dbae815STony Lindgren { 338651bd8cSTony Lindgren pdata_quirks_init(omap_dt_match_table); 34dcdf407bSTomi Valkeinen 35dcdf407bSTomi Valkeinen omapdss_init_of(); 361dbae815STony Lindgren } 371dbae815STony Lindgren 380e02a8c1SBenoit Cousson #ifdef CONFIG_SOC_OMAP2420 3958cda01eSUwe Kleine-König static const char *const omap242x_boards_compat[] __initconst = { 408d61649dSBenoit Cousson "ti,omap2420", 418d61649dSBenoit Cousson NULL, 428d61649dSBenoit Cousson }; 431dbae815STony Lindgren 448d61649dSBenoit Cousson DT_MACHINE_START(OMAP242X_DT, "Generic OMAP2420 (Flattened Device Tree)") 4571ee7dadSRussell King .reserve = omap_reserve, 468d61649dSBenoit Cousson .map_io = omap242x_map_io, 478d61649dSBenoit Cousson .init_early = omap2420_init_early, 481dbae815STony Lindgren .init_machine = omap_generic_init, 496f82e25dSFelipe Balbi .init_time = omap_init_time, 508d61649dSBenoit Cousson .dt_compat = omap242x_boards_compat, 51187e3e06SPaul Walmsley .restart = omap2xxx_restart, 521dbae815STony Lindgren MACHINE_END 538d61649dSBenoit Cousson #endif 548d61649dSBenoit Cousson 550e02a8c1SBenoit Cousson #ifdef CONFIG_SOC_OMAP2430 5658cda01eSUwe Kleine-König static const char *const omap243x_boards_compat[] __initconst = { 578d61649dSBenoit Cousson "ti,omap2430", 588d61649dSBenoit Cousson NULL, 598d61649dSBenoit Cousson }; 608d61649dSBenoit Cousson 618d61649dSBenoit Cousson DT_MACHINE_START(OMAP243X_DT, "Generic OMAP2430 (Flattened Device Tree)") 628d61649dSBenoit Cousson .reserve = omap_reserve, 638d61649dSBenoit Cousson .map_io = omap243x_map_io, 648d61649dSBenoit Cousson .init_early = omap2430_init_early, 658d61649dSBenoit Cousson .init_machine = omap_generic_init, 666f82e25dSFelipe Balbi .init_time = omap_init_time, 678d61649dSBenoit Cousson .dt_compat = omap243x_boards_compat, 68187e3e06SPaul Walmsley .restart = omap2xxx_restart, 698d61649dSBenoit Cousson MACHINE_END 708d61649dSBenoit Cousson #endif 718d61649dSBenoit Cousson 720e02a8c1SBenoit Cousson #ifdef CONFIG_ARCH_OMAP3 7371c4f602STony Lindgren /* Some boards need board name for legacy userspace in /proc/cpuinfo */ 7471c4f602STony Lindgren static const char *const n900_boards_compat[] __initconst = { 7571c4f602STony Lindgren "nokia,omap3-n900", 7671c4f602STony Lindgren NULL, 7771c4f602STony Lindgren }; 7871c4f602STony Lindgren 795f35dc47SIvaylo Dimitrov /* Set system_rev from atags */ 805f35dc47SIvaylo Dimitrov static void __init rx51_set_system_rev(const struct tag *tags) 815f35dc47SIvaylo Dimitrov { 825f35dc47SIvaylo Dimitrov const struct tag *tag; 835f35dc47SIvaylo Dimitrov 845f35dc47SIvaylo Dimitrov if (tags->hdr.tag != ATAG_CORE) 855f35dc47SIvaylo Dimitrov return; 865f35dc47SIvaylo Dimitrov 875f35dc47SIvaylo Dimitrov for_each_tag(tag, tags) { 885f35dc47SIvaylo Dimitrov if (tag->hdr.tag == ATAG_REVISION) { 895f35dc47SIvaylo Dimitrov system_rev = tag->u.revision.rev; 905f35dc47SIvaylo Dimitrov break; 915f35dc47SIvaylo Dimitrov } 925f35dc47SIvaylo Dimitrov } 935f35dc47SIvaylo Dimitrov } 945f35dc47SIvaylo Dimitrov 958c51b034SIvaylo Dimitrov /* Legacy userspace on Nokia N900 needs ATAGS exported in /proc/atags, 968c51b034SIvaylo Dimitrov * save them while the data is still not overwritten 978c51b034SIvaylo Dimitrov */ 988c51b034SIvaylo Dimitrov static void __init rx51_reserve(void) 998c51b034SIvaylo Dimitrov { 1005f35dc47SIvaylo Dimitrov const struct tag *tags = (const struct tag *)(PAGE_OFFSET + 0x100); 1015f35dc47SIvaylo Dimitrov 1025f35dc47SIvaylo Dimitrov save_atags(tags); 1035f35dc47SIvaylo Dimitrov rx51_set_system_rev(tags); 1048c51b034SIvaylo Dimitrov omap_reserve(); 1058c51b034SIvaylo Dimitrov } 1068c51b034SIvaylo Dimitrov 10771c4f602STony Lindgren DT_MACHINE_START(OMAP3_N900_DT, "Nokia RX-51 board") 1088c51b034SIvaylo Dimitrov .reserve = rx51_reserve, 10971c4f602STony Lindgren .map_io = omap3_map_io, 11071c4f602STony Lindgren .init_early = omap3430_init_early, 11171c4f602STony Lindgren .init_machine = omap_generic_init, 11271c4f602STony Lindgren .init_late = omap3_init_late, 1136f82e25dSFelipe Balbi .init_time = omap_init_time, 11471c4f602STony Lindgren .dt_compat = n900_boards_compat, 11571c4f602STony Lindgren .restart = omap3xxx_restart, 11671c4f602STony Lindgren MACHINE_END 11771c4f602STony Lindgren 11871c4f602STony Lindgren /* Generic omap3 boards, most boards can use these */ 11958cda01eSUwe Kleine-König static const char *const omap3_boards_compat[] __initconst = { 120b83a08feSNishanth Menon "ti,omap3430", 1218d61649dSBenoit Cousson "ti,omap3", 1228d61649dSBenoit Cousson NULL, 1238d61649dSBenoit Cousson }; 1248d61649dSBenoit Cousson 1258d61649dSBenoit Cousson DT_MACHINE_START(OMAP3_DT, "Generic OMAP3 (Flattened Device Tree)") 1268d61649dSBenoit Cousson .reserve = omap_reserve, 1278d61649dSBenoit Cousson .map_io = omap3_map_io, 1288d61649dSBenoit Cousson .init_early = omap3430_init_early, 12993651b85SBenoit Cousson .init_machine = omap_generic_init, 130990fa4f5SRajendra Nayak .init_late = omap3_init_late, 1316f82e25dSFelipe Balbi .init_time = omap_init_time, 1328d61649dSBenoit Cousson .dt_compat = omap3_boards_compat, 133187e3e06SPaul Walmsley .restart = omap3xxx_restart, 1348d61649dSBenoit Cousson MACHINE_END 1357dd9d502SJon Hunter 13658cda01eSUwe Kleine-König static const char *const omap36xx_boards_compat[] __initconst = { 13757df5380STony Lindgren "ti,omap3630", 138016c12d2SNishanth Menon "ti,omap36xx", 139016c12d2SNishanth Menon NULL, 140016c12d2SNishanth Menon }; 141016c12d2SNishanth Menon 142016c12d2SNishanth Menon DT_MACHINE_START(OMAP36XX_DT, "Generic OMAP36xx (Flattened Device Tree)") 143016c12d2SNishanth Menon .reserve = omap_reserve, 144016c12d2SNishanth Menon .map_io = omap3_map_io, 145016c12d2SNishanth Menon .init_early = omap3630_init_early, 146016c12d2SNishanth Menon .init_machine = omap_generic_init, 147016c12d2SNishanth Menon .init_late = omap3_init_late, 1486f82e25dSFelipe Balbi .init_time = omap_init_time, 149016c12d2SNishanth Menon .dt_compat = omap36xx_boards_compat, 150016c12d2SNishanth Menon .restart = omap3xxx_restart, 151016c12d2SNishanth Menon MACHINE_END 152016c12d2SNishanth Menon 15358cda01eSUwe Kleine-König static const char *const omap3_gp_boards_compat[] __initconst = { 1547dd9d502SJon Hunter "ti,omap3-beagle", 1554bfe6341SAnil Kumar "timll,omap3-devkit8000", 1567dd9d502SJon Hunter NULL, 1577dd9d502SJon Hunter }; 1587dd9d502SJon Hunter 1597dd9d502SJon Hunter DT_MACHINE_START(OMAP3_GP_DT, "Generic OMAP3-GP (Flattened Device Tree)") 1607dd9d502SJon Hunter .reserve = omap_reserve, 1617dd9d502SJon Hunter .map_io = omap3_map_io, 1627dd9d502SJon Hunter .init_early = omap3430_init_early, 1637dd9d502SJon Hunter .init_machine = omap_generic_init, 164990fa4f5SRajendra Nayak .init_late = omap3_init_late, 1656bb27d73SStephen Warren .init_time = omap3_secure_sync32k_timer_init, 1667dd9d502SJon Hunter .dt_compat = omap3_gp_boards_compat, 167d01e4afdSLinus Torvalds .restart = omap3xxx_restart, 1688d61649dSBenoit Cousson MACHINE_END 169caef4ee8SNishanth Menon 17058cda01eSUwe Kleine-König static const char *const am3517_boards_compat[] __initconst = { 171caef4ee8SNishanth Menon "ti,am3517", 172caef4ee8SNishanth Menon NULL, 173caef4ee8SNishanth Menon }; 174caef4ee8SNishanth Menon 175caef4ee8SNishanth Menon DT_MACHINE_START(AM3517_DT, "Generic AM3517 (Flattened Device Tree)") 176caef4ee8SNishanth Menon .reserve = omap_reserve, 177caef4ee8SNishanth Menon .map_io = omap3_map_io, 178caef4ee8SNishanth Menon .init_early = am35xx_init_early, 179caef4ee8SNishanth Menon .init_machine = omap_generic_init, 180caef4ee8SNishanth Menon .init_late = omap3_init_late, 181caef4ee8SNishanth Menon .init_time = omap3_gptimer_timer_init, 182caef4ee8SNishanth Menon .dt_compat = am3517_boards_compat, 183caef4ee8SNishanth Menon .restart = omap3xxx_restart, 184caef4ee8SNishanth Menon MACHINE_END 1858d61649dSBenoit Cousson #endif 1868d61649dSBenoit Cousson 187abf8cc1dSTony Lindgren #ifdef CONFIG_SOC_TI81XX 188abf8cc1dSTony Lindgren static const char *const ti814x_boards_compat[] __initconst = { 189abf8cc1dSTony Lindgren "ti,dm8148", 190abf8cc1dSTony Lindgren "ti,dm814", 191abf8cc1dSTony Lindgren NULL, 192abf8cc1dSTony Lindgren }; 193abf8cc1dSTony Lindgren 1949fd274c0STony Lindgren DT_MACHINE_START(TI814X_DT, "Generic ti814x (Flattened Device Tree)") 195abf8cc1dSTony Lindgren .reserve = omap_reserve, 196abf8cc1dSTony Lindgren .map_io = ti81xx_map_io, 197abf8cc1dSTony Lindgren .init_early = ti814x_init_early, 198abf8cc1dSTony Lindgren .init_machine = omap_generic_init, 199abf8cc1dSTony Lindgren .init_late = ti81xx_init_late, 200abf8cc1dSTony Lindgren .init_time = omap3_gptimer_timer_init, 201abf8cc1dSTony Lindgren .dt_compat = ti814x_boards_compat, 202abf8cc1dSTony Lindgren .restart = ti81xx_restart, 203abf8cc1dSTony Lindgren MACHINE_END 204abf8cc1dSTony Lindgren 205abf8cc1dSTony Lindgren static const char *const ti816x_boards_compat[] __initconst = { 206abf8cc1dSTony Lindgren "ti,dm8168", 207abf8cc1dSTony Lindgren "ti,dm816", 208abf8cc1dSTony Lindgren NULL, 209abf8cc1dSTony Lindgren }; 210abf8cc1dSTony Lindgren 211abf8cc1dSTony Lindgren DT_MACHINE_START(TI816X_DT, "Generic ti816x (Flattened Device Tree)") 212abf8cc1dSTony Lindgren .reserve = omap_reserve, 213abf8cc1dSTony Lindgren .map_io = ti81xx_map_io, 214abf8cc1dSTony Lindgren .init_early = ti816x_init_early, 215abf8cc1dSTony Lindgren .init_machine = omap_generic_init, 216abf8cc1dSTony Lindgren .init_late = ti81xx_init_late, 217abf8cc1dSTony Lindgren .init_time = omap3_gptimer_timer_init, 218abf8cc1dSTony Lindgren .dt_compat = ti816x_boards_compat, 219abf8cc1dSTony Lindgren .restart = ti81xx_restart, 220abf8cc1dSTony Lindgren MACHINE_END 221abf8cc1dSTony Lindgren #endif 222abf8cc1dSTony Lindgren 22308f30989SAfzal Mohammed #ifdef CONFIG_SOC_AM33XX 22458cda01eSUwe Kleine-König static const char *const am33xx_boards_compat[] __initconst = { 22508f30989SAfzal Mohammed "ti,am33xx", 22608f30989SAfzal Mohammed NULL, 22708f30989SAfzal Mohammed }; 22808f30989SAfzal Mohammed 22908f30989SAfzal Mohammed DT_MACHINE_START(AM33XX_DT, "Generic AM33XX (Flattened Device Tree)") 23008f30989SAfzal Mohammed .reserve = omap_reserve, 23108f30989SAfzal Mohammed .map_io = am33xx_map_io, 23208f30989SAfzal Mohammed .init_early = am33xx_init_early, 23308f30989SAfzal Mohammed .init_machine = omap_generic_init, 234765e7a06SNishanth Menon .init_late = am33xx_init_late, 23500ea4d56SJon Hunter .init_time = omap3_gptimer_timer_init, 23608f30989SAfzal Mohammed .dt_compat = am33xx_boards_compat, 23714e067c1SJean-Sebastien A. Beaudry .restart = am33xx_restart, 23808f30989SAfzal Mohammed MACHINE_END 23908f30989SAfzal Mohammed #endif 24008f30989SAfzal Mohammed 2410e02a8c1SBenoit Cousson #ifdef CONFIG_ARCH_OMAP4 24258cda01eSUwe Kleine-König static const char *const omap4_boards_compat[] __initconst = { 243b83a08feSNishanth Menon "ti,omap4460", 244b83a08feSNishanth Menon "ti,omap4430", 2458d61649dSBenoit Cousson "ti,omap4", 2468d61649dSBenoit Cousson NULL, 2478d61649dSBenoit Cousson }; 2488d61649dSBenoit Cousson 2498d61649dSBenoit Cousson DT_MACHINE_START(OMAP4_DT, "Generic OMAP4 (Flattened Device Tree)") 250944e9df1SMarek Szyprowski .l2c_aux_val = OMAP_L2C_AUX_CTRL, 251944e9df1SMarek Szyprowski .l2c_aux_mask = 0xcf9fffff, 252944e9df1SMarek Szyprowski .l2c_write_sec = omap4_l2c310_write_sec, 2538d61649dSBenoit Cousson .reserve = omap_reserve, 25406915321SMarc Zyngier .smp = smp_ops(omap4_smp_ops), 2558d61649dSBenoit Cousson .map_io = omap4_map_io, 2568d61649dSBenoit Cousson .init_early = omap4430_init_early, 257c4082d49SR Sricharan .init_irq = omap_gic_of_init, 25893651b85SBenoit Cousson .init_machine = omap_generic_init, 259bbd707acSShawn Guo .init_late = omap4430_init_late, 2606bb27d73SStephen Warren .init_time = omap4_local_timer_init, 2618d61649dSBenoit Cousson .dt_compat = omap4_boards_compat, 262187e3e06SPaul Walmsley .restart = omap44xx_restart, 2638d61649dSBenoit Cousson MACHINE_END 2648d61649dSBenoit Cousson #endif 2650c1b6facSR Sricharan 2660c1b6facSR Sricharan #ifdef CONFIG_SOC_OMAP5 26758cda01eSUwe Kleine-König static const char *const omap5_boards_compat[] __initconst = { 268b83a08feSNishanth Menon "ti,omap5432", 269b83a08feSNishanth Menon "ti,omap5430", 2700c1b6facSR Sricharan "ti,omap5", 2710c1b6facSR Sricharan NULL, 2720c1b6facSR Sricharan }; 2730c1b6facSR Sricharan 2740c1b6facSR Sricharan DT_MACHINE_START(OMAP5_DT, "Generic OMAP5 (Flattened Device Tree)") 2756a3b764bSTony Lindgren #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) 2766a3b764bSTony Lindgren .dma_zone_size = SZ_2G, 2776a3b764bSTony Lindgren #endif 2780c1b6facSR Sricharan .reserve = omap_reserve, 27906915321SMarc Zyngier .smp = smp_ops(omap4_smp_ops), 2800c1b6facSR Sricharan .map_io = omap5_map_io, 2810c1b6facSR Sricharan .init_early = omap5_init_early, 2820c1b6facSR Sricharan .init_irq = omap_gic_of_init, 2830c1b6facSR Sricharan .init_machine = omap_generic_init, 284765e7a06SNishanth Menon .init_late = omap5_init_late, 2856bb27d73SStephen Warren .init_time = omap5_realtime_timer_init, 2860c1b6facSR Sricharan .dt_compat = omap5_boards_compat, 287187e3e06SPaul Walmsley .restart = omap44xx_restart, 2880c1b6facSR Sricharan MACHINE_END 2890c1b6facSR Sricharan #endif 290bb256f80SAfzal Mohammed 291bb256f80SAfzal Mohammed #ifdef CONFIG_SOC_AM43XX 29258cda01eSUwe Kleine-König static const char *const am43_boards_compat[] __initconst = { 293b83a08feSNishanth Menon "ti,am4372", 294bb256f80SAfzal Mohammed "ti,am43", 295bb256f80SAfzal Mohammed NULL, 296bb256f80SAfzal Mohammed }; 297bb256f80SAfzal Mohammed 298bb256f80SAfzal Mohammed DT_MACHINE_START(AM43_DT, "Generic AM43 (Flattened Device Tree)") 299944e9df1SMarek Szyprowski .l2c_aux_val = OMAP_L2C_AUX_CTRL, 300944e9df1SMarek Szyprowski .l2c_aux_mask = 0xcf9fffff, 301944e9df1SMarek Szyprowski .l2c_write_sec = omap4_l2c310_write_sec, 302bb256f80SAfzal Mohammed .map_io = am33xx_map_io, 303bb256f80SAfzal Mohammed .init_early = am43xx_init_early, 304765e7a06SNishanth Menon .init_late = am43xx_init_late, 305bb256f80SAfzal Mohammed .init_irq = omap_gic_of_init, 306bb256f80SAfzal Mohammed .init_machine = omap_generic_init, 307f86a2c87SGrygorii Strashko .init_time = omap3_gptimer_timer_init, 308bb256f80SAfzal Mohammed .dt_compat = am43_boards_compat, 309a7daf64aSLokesh Vutla .restart = omap44xx_restart, 310bb256f80SAfzal Mohammed MACHINE_END 311bb256f80SAfzal Mohammed #endif 312439bf39eSR Sricharan 313439bf39eSR Sricharan #ifdef CONFIG_SOC_DRA7XX 31458cda01eSUwe Kleine-König static const char *const dra74x_boards_compat[] __initconst = { 3150e0cb99dSNishanth Menon "ti,am5728", 3160e0cb99dSNishanth Menon "ti,am5726", 31744e97ff6SRajendra Nayak "ti,dra742", 318439bf39eSR Sricharan "ti,dra7", 319439bf39eSR Sricharan NULL, 320439bf39eSR Sricharan }; 321439bf39eSR Sricharan 32244e97ff6SRajendra Nayak DT_MACHINE_START(DRA74X_DT, "Generic DRA74X (Flattened Device Tree)") 3236a3b764bSTony Lindgren #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) 3246a3b764bSTony Lindgren .dma_zone_size = SZ_2G, 3256a3b764bSTony Lindgren #endif 326439bf39eSR Sricharan .reserve = omap_reserve, 327439bf39eSR Sricharan .smp = smp_ops(omap4_smp_ops), 328ea827ad5SNishanth Menon .map_io = dra7xx_map_io, 329439bf39eSR Sricharan .init_early = dra7xx_init_early, 330765e7a06SNishanth Menon .init_late = dra7xx_init_late, 331439bf39eSR Sricharan .init_irq = omap_gic_of_init, 332439bf39eSR Sricharan .init_machine = omap_generic_init, 333439bf39eSR Sricharan .init_time = omap5_realtime_timer_init, 33444e97ff6SRajendra Nayak .dt_compat = dra74x_boards_compat, 33544e97ff6SRajendra Nayak .restart = omap44xx_restart, 33644e97ff6SRajendra Nayak MACHINE_END 33744e97ff6SRajendra Nayak 33858cda01eSUwe Kleine-König static const char *const dra72x_boards_compat[] __initconst = { 3390e0cb99dSNishanth Menon "ti,am5718", 3400e0cb99dSNishanth Menon "ti,am5716", 34144e97ff6SRajendra Nayak "ti,dra722", 342a2af765aSLokesh Vutla "ti,dra718", 34344e97ff6SRajendra Nayak NULL, 34444e97ff6SRajendra Nayak }; 34544e97ff6SRajendra Nayak 34644e97ff6SRajendra Nayak DT_MACHINE_START(DRA72X_DT, "Generic DRA72X (Flattened Device Tree)") 3476a3b764bSTony Lindgren #if defined(CONFIG_ZONE_DMA) && defined(CONFIG_ARM_LPAE) 3486a3b764bSTony Lindgren .dma_zone_size = SZ_2G, 3496a3b764bSTony Lindgren #endif 35044e97ff6SRajendra Nayak .reserve = omap_reserve, 351ea827ad5SNishanth Menon .map_io = dra7xx_map_io, 35244e97ff6SRajendra Nayak .init_early = dra7xx_init_early, 35344e97ff6SRajendra Nayak .init_late = dra7xx_init_late, 35444e97ff6SRajendra Nayak .init_irq = omap_gic_of_init, 35544e97ff6SRajendra Nayak .init_machine = omap_generic_init, 35644e97ff6SRajendra Nayak .init_time = omap5_realtime_timer_init, 35744e97ff6SRajendra Nayak .dt_compat = dra72x_boards_compat, 3581d597b07SRajendra Nayak .restart = omap44xx_restart, 359439bf39eSR Sricharan MACHINE_END 360439bf39eSR Sricharan #endif 361