]> git.ipfire.org Git - people/ms/u-boot.git/blame - drivers/twserial/soft_tws.c
ARM: rmobile: Move address of IICDVFS(I2C) to rcar-gen3-base.h
[people/ms/u-boot.git] / drivers / twserial / soft_tws.c
CommitLineData
572e6179
DZ
1/*
2 * (C) Copyright 2009
3 * Detlev Zundel, DENX Software Engineering, dzu@denx.de.
4 *
1a459660 5 * SPDX-License-Identifier: GPL-2.0+
572e6179
DZ
6 */
7
8#define TWS_IMPLEMENTATION
9#include <common.h>
10
11/*=====================================================================*/
12/* Public Functions */
13/*=====================================================================*/
14
15/*-----------------------------------------------------------------------
16 * Read bits
17 */
18int tws_read(uchar *buffer, int len)
19{
20 int rem = len;
21 uchar accu, shift;
22
23 debug("tws_read: buffer %p len %d\n", buffer, len);
24
25 /* Configure the data pin for input */
26 tws_data_config_output(0);
27
28 /* Disable WR, i.e. setup a read */
29 tws_wr(0);
30 udelay(1);
31
32 /* Rise CE */
33 tws_ce(1);
34 udelay(1);
35
36 for (; rem > 0; ) {
37 for (shift = 0, accu = 0;
38 (rem > 0) && (shift < 8);
39 rem--, shift++) {
40 tws_clk(1);
41 udelay(10);
42 accu |= (tws_data_read() << shift); /* LSB first */
43 tws_clk(0);
44 udelay(10);
45 }
46 *buffer++ = accu;
47 }
48
49 /* Lower CE */
50 tws_ce(0);
51
52 return len - rem;
53}
54
55
56/*-----------------------------------------------------------------------
57 * Write bits
58 */
59int tws_write(uchar *buffer, int len)
60{
61 int rem = len;
62 uchar accu, shift;
63
64 debug("tws_write: buffer %p len %d\n", buffer, len);
65
66 /* Configure the data pin for output */
67 tws_data_config_output(1);
68
69 /* Enable WR, i.e. setup a write */
70 tws_wr(1);
71 udelay(1);
72
73 /* Rise CE */
74 tws_ce(1);
75 udelay(1);
76
77 for (; rem > 0; ) {
78 for (shift = 0, accu = *buffer++;
79 (rem > 0) && (shift < 8);
80 rem--, shift++) {
81 tws_data(accu & 0x01); /* LSB first */
82 tws_clk(1);
83 udelay(10);
84 tws_clk(0);
85 udelay(10);
86 accu >>= 1;
87 }
88 }
89
90 /* Lower CE */
91 tws_ce(0);
92
93 return len - rem;
94}