summaryrefslogtreecommitdiff
path: root/board/davinci
Commit message (Collapse)AuthorAgeLines
* DA850 EVM: passing maximum clock rate information to kernelSekhar Nori2010-11-19-0/+33
| | | | | | | | | | | | | | | | | | | | The TI DA850/OMAP-L138/AM18x EVM can be populated with devices having different maximum allowed CPU clock rating. The maximum clock the chip can support can only be determined from the label on the package (not software readable). Introduce a method to pass the maximum allowed clock rate information to kernel using ATAG_REVISION. The kernel uses this information to determine the maximum cpu clock rate reachable using cpufreq. Note that U-Boot itself does not set the CPU clock rate. The CPU clock is setup by a primary bootloader ("UBL"). The rate setup by UBL could be different from the maximum clock rate supported by the device. Signed-off-by: Sekhar Nori <nsekhar@ti.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* Switch from archive libraries to partial linkingSebastien Carlier2010-11-17-20/+20
| | | | | | | | | | | | | | | | | | | | | | | | | | | Before this commit, weak symbols were not overridden by non-weak symbols found in archive libraries when linking with recent versions of binutils. As stated in the System V ABI, "the link editor does not extract archive members to resolve undefined weak symbols". This commit changes all Makefiles to use partial linking (ld -r) instead of creating library archives, which forces all symbols to participate in linking, allowing non-weak symbols to override weak symbols as intended. This approach is also used by Linux, from which the gmake function cmd_link_o_target (defined in config.mk and used in all Makefiles) is inspired. The name of each former library archive is preserved except for extensions which change from ".a" to ".o". This commit updates references accordingly where needed, in particular in some linker scripts. This commit reveals board configurations that exclude some features but include source files that depend these disabled features in the build, resulting in undefined symbols. Known such cases include: - disabling CMD_NET but not CMD_NFS; - enabling CONFIG_OF_LIBFDT but not CONFIG_QE. Signed-off-by: Sebastien Carlier <sebastien.carlier@gmail.com>
* Drop support for CONFIG_SYS_ARM_WITHOUT_RELOCWolfgang Denk2010-10-29-10/+0
| | | | | | | | | | | | | | | | When this define was introduced, the idea was to provide a soft migration path for ARM boards to get adapted to the new relocation support. However, other recent changes led to a different implementation (ELF relocation), where this no longer works. By now CONFIG_SYS_ARM_WITHOUT_RELOC does not only not help any more, but it actually hurts because it obfuscates the actual code by sprinkling it with lots of dead and non-working debris. So let's make a clean cut and drop CONFIG_SYS_ARM_WITHOUT_RELOC. Signed-off-by: Wolfgang Denk <wd@denx.de> Tested-by: Heiko Schocher <hs@denx.de> Tested-by: Reinhard Meyer <u-boot@emk-elektronik.de>
* Remove config.mk for da8xxevm based boards.Sughosh Ganu2010-10-26-43/+0
| | | | | | | | Move CONFIG_SYS_TEXT_BASE to the board's config file, and remove the now unnecessary config.mk file. Signed-off-by: Sughosh Ganu <urwithsughosh@gmail.com> Tested-by: Ben Gardiner <bengardiner@nanometrics.ca>
* Rename TEXT_BASE into CONFIG_SYS_TEXT_BASEWolfgang Denk2010-10-18-9/+9
| | | | | | | | | | | | The change is currently needed to be able to remove the board configuration scripting from the top level Makefile and replace it by a simple, table driven script. Moving this configuration setting into the "CONFIG_*" name space is also desirable because it is needed if we ever should move forward to a Kconfig driven configuration system. Signed-off-by: Wolfgang Denk <wd@denx.de>
* schmoogie: fix build error due to removal of forceenv()Wolfgang Denk2010-10-18-4/+4
| | | | | | | | | | | | commit 6d014adf dropped support for the forceenv() function, but failed to remove references to it from board/davinci/schmoogie/schmoogie.c Replace forceenv() by setenv() and set CONFIG_ENV_OVERWRITE instead in the board config file to allow overwriting the serial number. Signed-off-by: Wolfgang Denk <wd@denx.de> Cc: Sergey Kubushyn <ksi@koi8.net> Acked-by: Sergey Kubushyn <ksi@koi8.net>
* da850evm: basic MII EMAC supportBen Gardiner2010-10-17-0/+49
| | | | | | | | | | | | | | | | The current da850evm support in u-boot/master omits any use of the davinci EMAC. This patch adds basic support for the EMAC using the MII PHY found on the baseboard of the EVM. The MAC address is read from the environment variable 'ethadd'. Note that this is different from the da850evm support in the u-boot omapl1 tree where the MAC address is read from SPI flash. Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> CC: Sandeep Paulraj <s-paulraj@ti.com> CC: Sudhakar Rajashekhara <sudhakar.raj@ti.com> CC: Ben Warren <biggerbadderben@gmail.com> CC: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* da850evm: setup the NAND flash timingsBen Gardiner2010-10-17-0/+18
| | | | | | | | | | | | The default NAND flash timings are very conservative. This patch assigns the timings reccomended in the recent linux kernel patch [1] from Sekhar Nori. The speedup, as reported in that patch, is 5.3x for reads. [1] http://www.spinics.net/lists/arm-kernel/msg100278.html Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> CC: Sekhar Nori <nsekhar@ti.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* da850evm : enable NAND even when not in NAND boot modeBen Gardiner2010-10-17-0/+22
| | | | | | | | | | | | | | | There is currently no NAND pinmux enabled by the da850evm board setup code. This is fine when booting from NAND since the early boot code (UBL) will setup the pinmux; however, when the boot mode is any other setting NAND is unusable when enabled in the config. This patch adds a pinmux list for NAND and enables it when NAND is enabled in the config. Tested by booting from SPI on the da850evm and verifying NAND was usable. Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> CC: Nick Thompson <nick.thompson@ge.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* davinci_emac: davinci_eth_set_mac_addr to ->write_hwaddrBen Gardiner2010-10-11-41/+22
| | | | | | | | | | | | | | | | | | | | | | This patch proposes to migrate the davinci_emac driver to using the eth_device->write_hwaddr function pointer as suggested by Ben Warren. All the davinci boards had the behaviour, prior to this patch, of sync'ing the environment variable enetaddr with the MAC address read from non-volatile storage on boot -- when the two locations disagreed, the environment variable value took precendence. This patch keeps the same behaviour but lets eth_initialize take care of it. This patch refactors davinci_emac setup in the boards so that the MAC address is read from non-volatile storage into the environment variable and then the environment variable value is use in eth_intialize. The only exception is the direct call to davinci_eth_set_mac_addr made by the da830evm board init which was changed into an assignment of the enetaddr field. Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> Tested-by: Nick Thompson <nick.thompson@ge.com> Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
* da8xx: fixup ARM relocation supportBen Gardiner2010-09-19-0/+17
| | | | | | | | | | | | | | | | | | | | | Split the existing dram_init for da8xx when ARM reloc is enabled, like the changes to arch/arm/cpu/arm926ejs/orion5x/dram.c in 0f234d263b17ccf1b8fd776eb8c15b7cdb27a887 by Heiko Schocher <hs@denx.de>. Without these changes gd->ram_size is '0' which leads to incorrect relocation when CONFIG_SYS_ARM_WITHOUT_RELOC is defined and the board does not boot. We use get_ram_size to dynamically calculate the available RAM because it runs on different board version with different ram, as suggested by Heiko in private communication. Tested on a da850evm with 128M of DDR2 installed; with both CONFIG_SYS_ARM_WITHOUT_RELOC defined and undefined. Signed-off-by: Ben Gardiner <bengardiner@nanometrics.ca> Reviewed-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com> CC: Sudhakar Rajashekhara <sudhakar.raj@ti.com> CC: Heiko Schocher <hs@denx.de>
* da850 evm: Fix definition of 'pinmux' macroPrakash PM2010-07-15-11/+11
| | | | | | | | | Usage of parenthesis in pinmux macro definition changes the definition of the macro and raises the precedence of '&' operator inadvertently over '[]'. Signed-off-by: Prakash PM <prakash.pm@ti.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* da830 evm: Fix checkpatch error on 'pinmux' macroPrakash PM2010-07-15-34/+34
| | | | | | | | | | Existing code returns checkpatch error on pinmux macro definition for not enclosing the definition in parenthesis. The error can be observed in the patch generated from commit id bdc9c6c7f77a9a63349ecb9f54b20ad34033a2ae. So macro implementation is modified to fix the error. Signed-off-by: Prakash PM <prakash.pm@ti.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI: DaVinci: Add board specific code for da850 EVMSudhakar Rajashekhara2010-06-10-0/+112
| | | | | | | | | | | | | | | Provides initial support for TI OMAP-L138/DA850 SoC devices on a Logic PD EVM board. Provides: Initial boot and configuration. Support for i2c. UART support (console). Signed-off-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com> Acked-by: Ben Gardiner <bengardiner@nanometrics.ca> Reviewed-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI: DaVinci: Prepare for da850 supportSudhakar Rajashekhara2010-06-10-1/+4
| | | | | | | | | | | | | DA850/OMAP-L138 is a new SoC from Texas Instruments (http://focus.ti.com/docs/prod/folders/print/omap-l138.html). This SoC is similar to DA830/OMAP-L137 in many aspects. Hence rename the da830 specific files and folders to da8xx to accommodate DA850/OMAP-L138. Signed-off-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com> Acked-by: Ben Gardiner <bengardiner@nanometrics.ca> Reviewed-by: Wolfgang Denk <wd@denx.de> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* da830: Move common code out of da830evm.c fileSudhakar Rajashekhara2010-06-10-18/+98
| | | | | | | | | | | | | TI's DA850/OMAP-L138 platform is similar to DA830/OMAP-L137 in many aspects. So instead of repeating the same code in multiple files, move the common code to a different file and call those functions from the respective da830/da850 files. Signed-off-by: Sudhakar Rajashekhara <sudhakar.raj@ti.com> Acked-by: Nick Thompson <nick.thompson@ge.com> Acked-by: Ben Gardiner <bengardiner@nanometrics.ca> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* arm: Move cpu/$CPU to arch/arm/cpu/$CPUPeter Tyser2010-04-13-4/+4
| | | | Signed-off-by: Peter Tyser <ptyser@xes-inc.com>
* TI: Davinci: NAND Driver CleanupCyril Chemparathy2010-03-23-1/+1
| | | | | | | Modified to use IO accessor routines consistently. Eliminated volatile usage to keep checkpatch.pl happy. Signed-off-by: Cyril Chemparathy <cyril@ti.com>
* da830evm: Add support for TI EMACNick Thompson2010-03-07-2/+63
| | | | | | | | | | | Adds support for ethernet networking on the da830evm platform. This platform uses an SoC EMAC interface and a 3 port ethernet switch as a PHY with an RMII interface. The PHY also has a i2c interface for configuring the switch functions. Signed-off-by: Nick Thompson <nick.thompson@ge.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* DA830 EVM: Enable NAND support on Spectrum Digital EVMNick Thompson2010-02-12-0/+37
| | | | | | | | | | | | The EVM UI extender card has a NAND device. This change will enable saveenv to work with NAND and Linux to be booted using: mtdparts default nboot kernel bootm Signed-off-by: Nick Thompson <nick.thompson@ge.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* da830evm: Use table driven pin mux configurationNick Thompson2010-02-12-18/+17
| | | | | | | | Tidyup the pin muxer configuration using the Davinci table driven pinmux configuration function and data tables. Signed-off-by: Nick Thompson <nick.thompson@ge.com> Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* Merge branch 'master' of git://git.denx.de/u-boot-armWolfgang Denk2010-01-12-0/+44
|\
| * Davinci: Table driven pinmux configurationNick Thompson2010-01-04-0/+44
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Davinci: Table driven pinmux configuration Add code to allow pinmux_config tables to be grouped and configured as a single resource. This removes multiple calls to the pinmux configuration code from board_init and allows pinmuxes to be individually configured and added by data manipulation only. All related #ifdefs can the be removed from board_init code and since the compiler optimises away statics, #ifdefs can be reduced in the data definitions as well. Signed-off-by: Nick Thompson <nick.thompson@gefanuc.com>
* | DA830: Add pinmux for USB0_DRVVBUSAjay Kumar Gupta2010-01-09-0/+8
|/ | | | | | | | USB0_DRVVBUS pinmux configuration is required for USB functinality in uboot. Signed-off-by: Ajay Kumar Gupta <ajay.gupta@ti.com> Signed-off-by: Swaminathan S <swami.iyer@ti.com>
* TI DaVinci DM646x: Enable NAND on DM6467 EVMSandeep Paulraj2009-11-27-0/+11
| | | | | | This patch enables NAND on the DM6467 EVM Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI DA8xx: Add new directory for da830evm boardSekhar Nori2009-11-27-0/+221
| | | | | | | | | | | | | | Add new directory for da830evm board Provides initial support for TI OMAP-L137/DA830 SoC devices on a Spectrum Digital EVM board. See http://www.spectrumdigital.com/ Provides: Initial boot and configuration. Support for i2c. UART support (console). Signed-off-by: Nick Thompson <nick.thompson@gefanuc.com>
* TI Davinci: add a pin multiplexer configuration APINick Thompson2009-11-27-1/+59
| | | | | | | | Creates a method allowing pin settings to be logically grouped into data structure arrays and provides an API to configure the pinmux settings to enable the relevant pin functions. Signed-off-by: Nick Thompson <nick.thompson@gefanuc.com>
* Coding Style cleanup; update CHANGELOG, prepare -rc1v2009.11-rc1Wolfgang Denk2009-10-28-1/+0
| | | | Signed-off-by: Wolfgang Denk <wd@denx.de>
* TI DaVinci: Adding Copyright for DM365 EVMSandeep Paulraj2009-10-24-0/+1
| | | | | | | Forgot to add Copyright while submitting the patch. This patch adds the copyright. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI DaVinci: DM355 Leopard: Fix compilation warningSandeep Paulraj2009-10-24-0/+1
| | | | | | | | | | We get a compliation warning when we enable the NAND driver for DM355 leopard. The waring we get is that we have an implicit declaration of davinci_nand_init. It is fixed by including the asm/arch/nand_defs.h header file Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI: DaVinci: DM355 Leopard board supportSandeep Paulraj2009-10-18-0/+155
| | | | | | | This patch adds support for the leopard board which is based on the DM355 SOC. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI DaVinci DM646x: Adding initial support for DM6467 EVMSandeep Paulraj2009-10-18-0/+85
| | | | | | | This patch adds the initial support for DM6467 EVM. Other features like NET and NAND support will be added as follow up patches. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI DaVinci DM365: Fix Compilation warning for DM365 EVMSandeep Paulraj2009-10-18-2/+2
| | | | | | | This patch fixes a compilation warning while compiling the DM365 EVM. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI DaVinci DM355: Fix Compilation warning for DM355 EVMSandeep Paulraj2009-10-18-2/+2
| | | | | | | This patch fixes a compilation warning while compiling the DM355 EVM. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* TI: DaVinci DM365: Enabling network Support on DM365 EVMSandeep Paulraj2009-10-13-0/+43
| | | | | | | This patch enables EMAC on the DM365 EVM. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com> Acked-by: Tom Rix <Tom.Rix@windriver.com>
* TI DaVinci DM365: Removing header file which does not existSandeep Paulraj2009-10-13-1/+0
| | | | | | | The DaVinci DM365 EVM board specific code was including a header file which does not exist. So removing this header file. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* ARM: DaVinci: Adding Support for DaVinci DM365 EVMSandeep Paulraj2009-09-05-0/+123
| | | | | | | This patch adds support for the DM365 EVM. It has been tested on a DM365 EVM. Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* ARM: Davinci DM355: Enabling DM9000 on DM355 EVMSandeep Paulraj2009-08-10-1/+9
| | | | | | | | | | Due to recent changes to the NET support on U-boot, DM9000 is no longer detected on the DM355 EVM. This minor update enables DM9000 on the DM355 EVM. Tested on the DM355 EVM Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com> Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
* davinci_nand chipselect/init cleanupDavid Brownell2009-07-07-0/+28
| | | | | | | | | | | | | | | | | Update chipselect handling in davinci_nand.c so that it can handle 2 GByte chips the same way Linux does: as one device, even though it has two halves with independent chip selects. For such chips the "nand info" command reports: Device 0: 2x nand0, sector size 128 KiB Switch to use the default chipselect function unless the board really needs its own. The logic for the Sonata board moves out of the driver into board-specific code. (Which doesn't affect current build breakage if its NAND support is enabled...) Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Scott Wood <scottwood@freescale.com>
* Switched davinci_emac Ethernet driver to use newer APIBen Warren2009-06-15-13/+0
| | | | | | | | Added CONFIG_NET_MULTI to all Davinci boards Removed all calls to Davinci network driver from board code Added cpu_eth_init() to cpu/arm926ejs/cpu.c Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
* dm355 evm supportDavid Brownell2009-06-12-0/+171
| | | | | | | | | | | | | | | | | | | | | Initial U-Boot support for the DaVinci DM355 EVM. This is a board from Spectrum Digital. Board docs include schematic and firmware for its microcontroller: http://c6000.spectrumdigital.com/evmdm355/revd/ Most of the DM355 chip is fully documented by TI, the most notable exception being the MPEG/JPEG coprocessor (programmable using codecs available at no cost from TI), which is omitted from its DM335 sibling: http://focus.ti.com/docs/prod/folders/print/tms320dm355.html This version can boot from the on-board DM9000 Ethernet chip, after being loaded (from NAND, MMC/SD, or UART). In the near future, NAND and USB support could be added ... NAND support is being held back until the support for the 4-bit ECC hardware is ready. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
* ARM DaVinci:Consolidate common u-boot.ldsSandeep Paulraj2009-06-12-208/+0
| | | | | | | | | The u-boot.lds is common for all DaVinci boards. The patch removes multiple instances and moves the u-boot.lds to /cpu/arm926ejs/davinci folder. This addresses one of the comments i received while submitting patches for DM3xx Signed-off-by: Sandeep Paulraj <s-paulraj@ti.com>
* davinci: display correct clock infoDavid Brownell2009-06-12-21/+1
| | | | | | | | | | | | Move the clock-rate dumping code into the cpu/.../davinci area where it should have been, enabled by CONFIG_DISPLAY_CPUINFO, updating the format and showing the DSP clock (where relevant). Switch boards to use the cpuinfo() hook for this stuff. Remove a few now-obsolete PLL #defines. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
* arm: timer and interrupt init reworkJean-Christophe PLAGNIOL-VILLARD2009-06-12-1/+0
| | | | | | | | | | | | | | actually the timer init use the interrupt_init as init callback which make the interrupt and timer implementation difficult to follow so now rename it as int timer_init(void) and use interrupt_init for interrupt btw also remane the corresponding file to the functionnality implemented as ixp arch implement two timer - one based on interrupt - so all the timer related code is moved to timer.c Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
* davinci: move psc support board-->cpuDavid Brownell2009-06-12-219/+1
| | | | | | | | Move DaVinci PSC support from board/* to cpu/* where it belongs. The PSC module manages clocks and resets for all DaVinci-family SoCs, and isn't at all board-specific. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net>
* DaVinci Ethernet cleanupDavid Brownell2009-06-12-19/+15
| | | | | | | | | | | | | | | | Chips without the EMAC controller won't need the utilities it uses to read an Ethernet address from EEPROM; so don't include them needlessly. Use is_valid_ether() to validate the address from EEPROM. All-zero addresses aren't the only invalid addresses. A fully erased EEPROM returns all-ones, also invalid... Switch those Ethernet utilities to use "%pM" for printing MAC addresses; and not say ROM when they mean EEPROM. Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Acked-by: Ben Warren <biggerbadderben@gmail.com>
* Fix e-mail address of Gary Jennejohn.Detlev Zundel2009-05-15-8/+8
| | | | Signed-off-by: Detlev Zundel <dzu@denx.de>
* Fix all linker script to handle all rodata sectionsTrent Piepho2009-03-20-4/+4
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | A recent gcc added a new unaligned rodata section called '.rodata.str1.1', which needs to be added the the linker script. Instead of just adding this one section, we use a wildcard ".rodata*" to get all rodata linker section gcc has now and might add in the future. However, '*(.rodata*)' by itself will result in sub-optimal section ordering. The sections will be sorted by object file, which causes extra padding between the unaligned rodata.str.1.1 of one object file and the aligned rodata of the next object file. This is easy to fix by using the SORT_BY_ALIGNMENT command. This patch has not be tested one most of the boards modified. Some boards have a linker script that looks something like this: *(.text) . = ALIGN(16); *(.rodata) *(.rodata.str1.4) *(.eh_frame) I change this to: *(.text) . = ALIGN(16); *(.eh_frame) *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) This means the start of rodata will no longer be 16 bytes aligned. However, the boundary between text and rodata/eh_frame is still aligned to 16 bytes, which is what I think the real purpose of the ALIGN call is. Signed-off-by: Trent Piepho <xyzzy@speakeasy.org>
* davinci: fix implicit declaration of function 'davinci_errata_workarounds'Jean-Christophe PLAGNIOL-VILLARD2009-02-22-0/+1
| | | | Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
* ARM DaVinci: Add common peripherals and modules enable functions.Hugo Villeneuve2009-02-22-105/+101
| | | | | | | | | | Taken all the duplicated code for enabling common modules and apply software workarounds from the board specific code into common functions. Also added comments explaining the workarounds (from TI errata documents) and replaced some numerical bit numbers with more meaningful defines. Signed-off-by: Hugo Villeneuve <hugo.villeneuve@lyrtech.com>