xref: /linux/sound/soc/codecs/rt5575-spi.c (revision c17ee635fd3a482b2ad2bf5e269755c2eae5f25e)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * rt5575-spi.c  --  ALC5575 SPI driver
4  *
5  * Copyright(c) 2025 Realtek Semiconductor Corp.
6  *
7  */
8 
9 #include <linux/firmware.h>
10 #include <linux/of.h>
11 #include <linux/spi/spi.h>
12 
13 #include "rt5575-spi.h"
14 
15 #define RT5575_SPI_CMD_BURST_WRITE	5
16 #define RT5575_SPI_BUF_LEN		240
17 
18 struct rt5575_spi_burst_write {
19 	u8 cmd;
20 	u32 addr;
21 	u8 data[RT5575_SPI_BUF_LEN];
22 	u8 dummy;
23 } __packed;
24 
25 struct spi_device *rt5575_spi_get_device(struct device *dev)
26 {
27 	struct spi_device *spi;
28 	struct spi_controller *ctlr;
29 	struct device_node *spi_np;
30 	u32 cs;
31 
32 	spi_np = of_parse_phandle(dev->of_node, "spi-parent", 0);
33 	if (!spi_np) {
34 		dev_err(dev, "Failed to get spi-parent phandle\n");
35 		return NULL;
36 	}
37 
38 	if (of_property_read_u32_index(dev->of_node, "spi-parent", 1, &cs))
39 		cs = 0;
40 
41 	ctlr = of_find_spi_controller_by_node(spi_np);
42 	of_node_put(spi_np);
43 	if (!ctlr) {
44 		dev_err(dev, "Failed to get spi_controller\n");
45 		return NULL;
46 	}
47 
48 	if (cs >= ctlr->num_chipselect) {
49 		dev_err(dev, "Chip select has wrong number %d\n", cs);
50 		spi_controller_put(ctlr);
51 		return NULL;
52 	}
53 
54 	spi = spi_new_device(ctlr, &(struct spi_board_info){
55 		.modalias = "rt5575",
56 		.chip_select = cs,
57 		.max_speed_hz = 10000000,
58 	});
59 
60 	spi_controller_put(ctlr);
61 	return spi;
62 }
63 
64 /**
65  * rt5575_spi_burst_write - Write data to SPI by rt5575 address.
66  * @spi: SPI device.
67  * @addr: Start address.
68  * @txbuf: Data buffer for writing.
69  * @len: Data length.
70  *
71  */
72 static void rt5575_spi_burst_write(struct spi_device *spi, u32 addr, const u8 *txbuf, size_t len)
73 {
74 	struct rt5575_spi_burst_write buf = {
75 		.cmd = RT5575_SPI_CMD_BURST_WRITE,
76 	};
77 	unsigned int end, offset = 0;
78 
79 	while (offset < len) {
80 		if (offset + RT5575_SPI_BUF_LEN <= len)
81 			end = RT5575_SPI_BUF_LEN;
82 		else
83 			end = len % RT5575_SPI_BUF_LEN;
84 
85 		buf.addr = cpu_to_le32(addr + offset);
86 		memcpy(&buf.data, &txbuf[offset], end);
87 		spi_write(spi, &buf, sizeof(buf));
88 
89 		offset += RT5575_SPI_BUF_LEN;
90 	}
91 }
92 
93 int rt5575_spi_fw_load(struct spi_device *spi)
94 {
95 	struct device *dev = &spi->dev;
96 	const struct firmware *firmware;
97 	int i, ret;
98 	static const char * const fw_path[] = {
99 		"realtek/rt5575/rt5575_fw1.bin",
100 		"realtek/rt5575/rt5575_fw2.bin",
101 		"realtek/rt5575/rt5575_fw3.bin",
102 		"realtek/rt5575/rt5575_fw4.bin",
103 	};
104 	static const u32 fw_addr[] = { 0x5f400000, 0x5f600000, 0x5f7fe000, 0x5f7ff000 };
105 
106 	for (i = 0; i < ARRAY_SIZE(fw_addr); i++) {
107 		ret = request_firmware(&firmware, fw_path[i], dev);
108 		if (ret) {
109 			dev_err(dev, "Request firmware failure: %d\n", ret);
110 			return ret;
111 		}
112 
113 		rt5575_spi_burst_write(spi, fw_addr[i], firmware->data, firmware->size);
114 		release_firmware(firmware);
115 	}
116 
117 	return 0;
118 }
119