Blame view

bootloader/u-boot_2015_04/drivers/video/s6e63d6.c 1.25 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
  /*
   * Copyright (C) 2009
   * Guennadi Liakhovetski, DENX Software Engineering, <lg@denx.de>
   *
   * SPDX-License-Identifier:	GPL-2.0+
   */
  #include <common.h>
  #include <spi.h>
  #include <s6e63d6.h>
  
  /*
   * Each transfer is performed as:
   * 1. chip-select active
   * 2. send 8-bit start code
   * 3. send 16-bit data
   * 4. chip-select inactive
   */
  static int send_word(struct s6e63d6 *data, u8 rs, u16 word)
  {
  	/*
  	 * The start byte looks like (binary):
  	 * 01110<ID><RS><R/W>
  	 * RS is 0 for index or 1 for data, and R/W is 0 for write.
  	 */
  	u32 buf8 = 0x70 | data->id | (rs & 2);
  	u32 buf16 = cpu_to_le16(word);
  	u32 buf_in;
  	int err;
  
  	err = spi_xfer(data->slave, 8, &buf8, &buf_in, SPI_XFER_BEGIN);
  	if (err)
  		return err;
  
  	return spi_xfer(data->slave, 16, &buf16, &buf_in, SPI_XFER_END);
  }
  
  /* Index and param differ in Register Select bit */
  int s6e63d6_index(struct s6e63d6 *data, u8 idx)
  {
  	return send_word(data, 0, idx);
  }
  
  int s6e63d6_param(struct s6e63d6 *data, u16 param)
  {
  	return send_word(data, 2, param);
  }
  
  int s6e63d6_init(struct s6e63d6 *data)
  {
  	if (data->id != 0 && data->id != 4) {
  		printf("s6e63d6: invalid ID %u
  ", data->id);
  		return 1;
  	}
  
  	data->slave = spi_setup_slave(data->bus, data->cs, 100000, SPI_MODE_3);
  	if (!data->slave)
  		return 1;
  
  	return 0;
  }