1 // SPDX-License-Identifier: GPL-2.0 1 2 /* 3 * ip22-nvram.c: NVRAM and serial EEPROM handl 4 * 5 * Copyright (C) 2003 Ladislav Michl (ladis@li 6 */ 7 #include <linux/export.h> 8 9 #include <asm/sgi/hpc3.h> 10 #include <asm/sgi/ip22.h> 11 12 /* Control opcode for serial eeprom */ 13 #define EEPROM_READ 0xc000 /* serial memo 14 #define EEPROM_WEN 0x9800 /* write enabl 15 #define EEPROM_WRITE 0xa000 /* serial memo 16 #define EEPROM_WRALL 0x8800 /* write all r 17 #define EEPROM_WDS 0x8000 /* disable all 18 #define EEPROM_PRREAD 0xc000 /* read protec 19 #define EEPROM_PREN 0x9800 /* enable prot 20 #define EEPROM_PRCLEAR 0xffff /* clear prote 21 #define EEPROM_PRWRITE 0xa000 /* write prote 22 #define EEPROM_PRDS 0x8000 /* disable pro 23 24 #define EEPROM_EPROT 0x01 /* Protect reg 25 #define EEPROM_CSEL 0x02 /* Chip select 26 #define EEPROM_ECLK 0x04 /* EEPROM cloc 27 #define EEPROM_DATO 0x08 /* Data out */ 28 #define EEPROM_DATI 0x10 /* Data in */ 29 30 /* We need to use these functions early... */ 31 #define delay() ({ 32 int x; 33 for (x=0; x<100000; x++) __asm__ __vol 34 35 #define eeprom_cs_on(ptr) ({ \ 36 __raw_writel(__raw_readl(ptr) & ~EEPRO 37 __raw_writel(__raw_readl(ptr) & ~EEPRO 38 __raw_writel(__raw_readl(ptr) & ~EEPRO 39 delay(); 40 __raw_writel(__raw_readl(ptr) | EEPROM 41 __raw_writel(__raw_readl(ptr) | EEPROM 42 43 44 #define eeprom_cs_off(ptr) ({ \ 45 __raw_writel(__raw_readl(ptr) & ~EEPRO 46 __raw_writel(__raw_readl(ptr) & ~EEPRO 47 __raw_writel(__raw_readl(ptr) | EEPROM 48 __raw_writel(__raw_readl(ptr) | EEPROM 49 50 #define BITS_IN_COMMAND 11 51 /* 52 * clock in the nvram command and the register 53 * national semiconductor nv ram chip the op c 54 * the address is 6/8 bits. 55 */ 56 static inline void eeprom_cmd(unsigned int *ct 57 { 58 unsigned short ser_cmd; 59 int i; 60 61 ser_cmd = cmd | (reg << (16 - BITS_IN_ 62 for (i = 0; i < BITS_IN_COMMAND; i++) 63 if (ser_cmd & (1<<15)) /* if 64 __raw_writel(__raw_rea 65 else 66 __raw_writel(__raw_rea 67 __raw_writel(__raw_readl(ctrl) 68 delay(); 69 __raw_writel(__raw_readl(ctrl) 70 delay(); 71 ser_cmd <<= 1; 72 } 73 /* see data sheet timing diagram */ 74 __raw_writel(__raw_readl(ctrl) & ~EEPR 75 } 76 77 unsigned short ip22_eeprom_read(unsigned int * 78 { 79 unsigned short res = 0; 80 int i; 81 82 __raw_writel(__raw_readl(ctrl) & ~EEPR 83 eeprom_cs_on(ctrl); 84 eeprom_cmd(ctrl, EEPROM_READ, reg); 85 86 /* clock the data ouf of serial mem */ 87 for (i = 0; i < 16; i++) { 88 __raw_writel(__raw_readl(ctrl) 89 delay(); 90 __raw_writel(__raw_readl(ctrl) 91 delay(); 92 res <<= 1; 93 if (__raw_readl(ctrl) & EEPROM 94 res |= 1; 95 } 96 97 eeprom_cs_off(ctrl); 98 99 return res; 100 } 101 102 EXPORT_SYMBOL(ip22_eeprom_read); 103 104 /* 105 * Read specified register from main NVRAM 106 */ 107 unsigned short ip22_nvram_read(int reg) 108 { 109 if (ip22_is_fullhouse()) 110 /* IP22 (Indigo2 aka FullHouse 111 * 93CS56 Microwire Bus EEPROM 112 return ip22_eeprom_read(&hpc3c 113 else { 114 unsigned short tmp; 115 /* IP24 (Indy aka Guiness) use 116 reg <<= 1; 117 tmp = hpc3c0->bbram[reg++] & 0 118 return (tmp << 8) | (hpc3c0->b 119 } 120 } 121 122 EXPORT_SYMBOL(ip22_nvram_read); 123
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.