Lines Matching +full:0 +full:ns

21 #define SPI_TIMEOUT		0x100000
22 #define SPI0_BUS 0
24 #define SPI0_BASE 0xf0b00000
25 #define SPI1_BASE 0xf0f00000
31 u32 format; /* 0x10 */
35 u32 tctrl; /* 0x20 */
37 #define TRAMODE_MASK (0x0F<<TRAMODE_OFFSET)
38 #define TRAMODE_WR_SYNC (0<<TRAMODE_OFFSET)
49 #define WCNT_MASK (0x1FF<<WCNT_OFFSET)
50 #define RCNT_OFFSET 0
51 #define RCNT_MASK (0x1FF<<RCNT_OFFSET)
55 u32 ctrl; /* 0x30 */
62 #define SPIRST (1<<0)
66 #define TXFVE_MASK (0x1F<<16)
69 #define RXFVE_MASK (0x1F<<RXFVE_OFFSET)
70 #define SPIBSY (1<<0)
73 u32 timing; /* 0x40 */
74 #define SCLK_DIV_MASK 0xFF
94 static int __atcspi200_spi_set_speed(struct nds_spi_slave *ns) in __atcspi200_spi_set_speed() argument
98 tm = ns->regs->timing; in __atcspi200_spi_set_speed()
101 if(ns->freq >= ns->clock) in __atcspi200_spi_set_speed()
102 div =0xff; in __atcspi200_spi_set_speed()
104 for (div = 0; div < 0xff; div++) { in __atcspi200_spi_set_speed()
105 if (ns->freq >= ns->clock / (2 * (div + 1))) in __atcspi200_spi_set_speed()
111 ns->regs->timing = tm; in __atcspi200_spi_set_speed()
113 return 0; in __atcspi200_spi_set_speed()
117 static int __atcspi200_spi_claim_bus(struct nds_spi_slave *ns) in __atcspi200_spi_claim_bus() argument
119 unsigned int format=0; in __atcspi200_spi_claim_bus()
120 ns->regs->ctrl |= (TXFRST|RXFRST|SPIRST); in __atcspi200_spi_claim_bus()
121 while((ns->regs->ctrl &(TXFRST|RXFRST|SPIRST))&&(ns->to--)) in __atcspi200_spi_claim_bus()
122 if(!ns->to) in __atcspi200_spi_claim_bus()
125 ns->cmd_len = 0; in __atcspi200_spi_claim_bus()
126 format = ns->mode|DATA_LENGTH(8); in __atcspi200_spi_claim_bus()
127 ns->regs->format = format; in __atcspi200_spi_claim_bus()
128 __atcspi200_spi_set_speed(ns); in __atcspi200_spi_claim_bus()
130 return 0; in __atcspi200_spi_claim_bus()
133 static int __atcspi200_spi_release_bus(struct nds_spi_slave *ns) in __atcspi200_spi_release_bus() argument
136 return 0; in __atcspi200_spi_release_bus()
139 static int __atcspi200_spi_start(struct nds_spi_slave *ns) in __atcspi200_spi_start() argument
141 int i,olen=0; in __atcspi200_spi_start()
142 int tc = ns->regs->tctrl; in __atcspi200_spi_start()
145 if ((ns->din)&&(ns->cmd_len)) in __atcspi200_spi_start()
147 else if (ns->din) in __atcspi200_spi_start()
152 if(ns->dout) in __atcspi200_spi_start()
153 olen = ns->tran_len; in __atcspi200_spi_start()
154 tc |= (ns->cmd_len+olen-1) << WCNT_OFFSET; in __atcspi200_spi_start()
156 if(ns->din) in __atcspi200_spi_start()
157 tc |= (ns->tran_len-1) << RCNT_OFFSET; in __atcspi200_spi_start()
159 ns->regs->tctrl = tc; in __atcspi200_spi_start()
160 ns->regs->cmd = 1; in __atcspi200_spi_start()
162 for (i=0;i<ns->cmd_len;i++) in __atcspi200_spi_start()
163 ns->regs->data = ns->cmd_buf[i]; in __atcspi200_spi_start()
165 return 0; in __atcspi200_spi_start()
168 static int __atcspi200_spi_stop(struct nds_spi_slave *ns) in __atcspi200_spi_stop() argument
170 ns->regs->timing = ns->mtiming; in __atcspi200_spi_stop()
171 while ((ns->regs->status & SPIBSY)&&(ns->to--)) in __atcspi200_spi_stop()
172 if (!ns->to) in __atcspi200_spi_stop()
175 return 0; in __atcspi200_spi_stop()
178 static void __nspi_espi_tx(struct nds_spi_slave *ns, const void *dout) in __nspi_espi_tx() argument
180 ns->regs->data = *(u8 *)dout; in __nspi_espi_tx()
183 static int __nspi_espi_rx(struct nds_spi_slave *ns, void *din, unsigned int bytes) in __nspi_espi_rx() argument
185 *(u8 *)din = ns->regs->data; in __nspi_espi_rx()
190 static int __atcspi200_spi_xfer(struct nds_spi_slave *ns, in __atcspi200_spi_xfer() argument
199 u8 *cmd_buf = ns->cmd_buf; in __atcspi200_spi_xfer()
200 size_t cmd_len = ns->cmd_len; in __atcspi200_spi_xfer()
203 int ret = 0; in __atcspi200_spi_xfer()
205 max_tran_len = ns->max_transfer_length; in __atcspi200_spi_xfer()
208 cmd_len = ns->cmd_len = data_len; in __atcspi200_spi_xfer()
210 return 0; in __atcspi200_spi_xfer()
212 case 0: in __atcspi200_spi_xfer()
214 if (bitlen == 0) { in __atcspi200_spi_xfer()
215 return 0; in __atcspi200_spi_xfer()
217 ns->data_len = data_len; in __atcspi200_spi_xfer()
218 ns->din = (u8 *)data_in; in __atcspi200_spi_xfer()
219 ns->dout = (u8 *)data_out; in __atcspi200_spi_xfer()
223 ns->data_len = 0; in __atcspi200_spi_xfer()
224 ns->din = 0; in __atcspi200_spi_xfer()
225 ns->dout = 0; in __atcspi200_spi_xfer()
226 cmd_len = ns->cmd_len = data_len; in __atcspi200_spi_xfer()
228 data_out = 0; in __atcspi200_spi_xfer()
229 data_len = 0; in __atcspi200_spi_xfer()
230 __atcspi200_spi_start(ns); in __atcspi200_spi_xfer()
240 ns->tran_len = tran_len; in __atcspi200_spi_xfer()
243 if(num_bytes == 0) in __atcspi200_spi_xfer()
245 __atcspi200_spi_start(ns); in __atcspi200_spi_xfer()
248 event = in_le32(&ns->regs->status); in __atcspi200_spi_xfer()
250 __nspi_espi_tx(ns, dout); in __atcspi200_spi_xfer()
264 if (__nspi_espi_rx(ns, din, rx_bytes) == rx_bytes) { in __atcspi200_spi_xfer()
274 ns->cmd_buf[1] += ((tran_len>>16)&0xff); in __atcspi200_spi_xfer()
275 ns->cmd_buf[2] += ((tran_len>>8)&0xff); in __atcspi200_spi_xfer()
276 ns->cmd_buf[3] += ((tran_len)&0xff); in __atcspi200_spi_xfer()
277 ns->data_len = data_len; in __atcspi200_spi_xfer()
279 ret = __atcspi200_spi_stop(ns); in __atcspi200_spi_xfer()
281 ret = __atcspi200_spi_stop(ns); in __atcspi200_spi_xfer()
288 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_set_speed() local
292 ns->freq = max_hz; in atcspi200_spi_set_speed()
293 __atcspi200_spi_set_speed(ns); in atcspi200_spi_set_speed()
295 return 0; in atcspi200_spi_set_speed()
300 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_set_mode() local
303 ns->mode = mode; in atcspi200_spi_set_mode()
305 return 0; in atcspi200_spi_set_mode()
313 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_claim_bus() local
315 if (slave_plat->cs >= ns->num_cs) { in atcspi200_spi_claim_bus()
320 return __atcspi200_spi_claim_bus(ns); in atcspi200_spi_claim_bus()
325 struct nds_spi_slave *ns = dev_get_priv(dev->parent); in atcspi200_spi_release_bus() local
327 return __atcspi200_spi_release_bus(ns); in atcspi200_spi_release_bus()
335 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_xfer() local
337 return __atcspi200_spi_xfer(ns, bitlen, dout, din, flags); in atcspi200_spi_xfer()
342 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_get_clk() local
347 ret = clk_get_by_index(bus, 0, &clk); in atcspi200_spi_get_clk()
355 ns->clock = clk_rate; in atcspi200_spi_get_clk()
358 return 0; in atcspi200_spi_get_clk()
363 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_spi_probe() local
365 ns->to = SPI_TIMEOUT; in atcspi200_spi_probe()
366 ns->max_transfer_length = MAX_TRANSFER_LEN; in atcspi200_spi_probe()
367 ns->mtiming = ns->regs->timing; in atcspi200_spi_probe()
370 return 0; in atcspi200_spi_probe()
375 struct nds_spi_slave *ns = dev_get_priv(bus); in atcspi200_ofdata_to_platadata() local
379 ns->regs = map_physmem(devfdt_get_addr(bus), in atcspi200_ofdata_to_platadata()
382 if (!ns->regs) { in atcspi200_ofdata_to_platadata()
386 ns->num_cs = fdtdec_get_int(blob, node, "num-cs", 4); in atcspi200_ofdata_to_platadata()
388 return 0; in atcspi200_ofdata_to_platadata()