.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0 |
---|
1 | 2 | /* |
---|
2 | 3 | * SuperH HSPI bus driver |
---|
3 | 4 | * |
---|
.. | .. |
---|
7 | 8 | * Based on pxa2xx_spi.c: |
---|
8 | 9 | * Copyright (C) 2011 Renesas Solutions Corp. |
---|
9 | 10 | * Copyright (C) 2005 Stephen Street / StreetFire Sound Labs |
---|
10 | | - * |
---|
11 | | - * This program is free software; you can redistribute it and/or modify |
---|
12 | | - * it under the terms of the GNU General Public License as published by |
---|
13 | | - * the Free Software Foundation; version 2 of the License. |
---|
14 | | - * |
---|
15 | | - * This program is distributed in the hope that it will be useful, |
---|
16 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
17 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
18 | | - * GNU General Public License for more details. |
---|
19 | 11 | */ |
---|
20 | 12 | |
---|
21 | 13 | #include <linux/clk.h> |
---|
.. | .. |
---|
43 | 35 | |
---|
44 | 36 | struct hspi_priv { |
---|
45 | 37 | void __iomem *addr; |
---|
46 | | - struct spi_master *master; |
---|
| 38 | + struct spi_controller *ctlr; |
---|
47 | 39 | struct device *dev; |
---|
48 | 40 | struct clk *clk; |
---|
49 | 41 | }; |
---|
.. | .. |
---|
148 | 140 | hspi_write(hspi, SPSCR, 0x21); /* master mode / CS control */ |
---|
149 | 141 | } |
---|
150 | 142 | |
---|
151 | | -static int hspi_transfer_one_message(struct spi_master *master, |
---|
| 143 | +static int hspi_transfer_one_message(struct spi_controller *ctlr, |
---|
152 | 144 | struct spi_message *msg) |
---|
153 | 145 | { |
---|
154 | | - struct hspi_priv *hspi = spi_master_get_devdata(master); |
---|
| 146 | + struct hspi_priv *hspi = spi_controller_get_devdata(ctlr); |
---|
155 | 147 | struct spi_transfer *t; |
---|
156 | 148 | u32 tx; |
---|
157 | 149 | u32 rx; |
---|
.. | .. |
---|
198 | 190 | |
---|
199 | 191 | msg->actual_length += t->len; |
---|
200 | 192 | |
---|
201 | | - if (t->delay_usecs) |
---|
202 | | - udelay(t->delay_usecs); |
---|
| 193 | + spi_transfer_delay_exec(t); |
---|
203 | 194 | |
---|
204 | 195 | if (cs_change) { |
---|
205 | 196 | ndelay(nsecs); |
---|
.. | .. |
---|
213 | 204 | ndelay(nsecs); |
---|
214 | 205 | hspi_hw_cs_disable(hspi); |
---|
215 | 206 | } |
---|
216 | | - spi_finalize_current_message(master); |
---|
| 207 | + spi_finalize_current_message(ctlr); |
---|
217 | 208 | |
---|
218 | 209 | return ret; |
---|
219 | 210 | } |
---|
.. | .. |
---|
221 | 212 | static int hspi_probe(struct platform_device *pdev) |
---|
222 | 213 | { |
---|
223 | 214 | struct resource *res; |
---|
224 | | - struct spi_master *master; |
---|
| 215 | + struct spi_controller *ctlr; |
---|
225 | 216 | struct hspi_priv *hspi; |
---|
226 | 217 | struct clk *clk; |
---|
227 | 218 | int ret; |
---|
.. | .. |
---|
233 | 224 | return -EINVAL; |
---|
234 | 225 | } |
---|
235 | 226 | |
---|
236 | | - master = spi_alloc_master(&pdev->dev, sizeof(*hspi)); |
---|
237 | | - if (!master) { |
---|
238 | | - dev_err(&pdev->dev, "spi_alloc_master error.\n"); |
---|
| 227 | + ctlr = spi_alloc_master(&pdev->dev, sizeof(*hspi)); |
---|
| 228 | + if (!ctlr) |
---|
239 | 229 | return -ENOMEM; |
---|
240 | | - } |
---|
241 | 230 | |
---|
242 | 231 | clk = clk_get(&pdev->dev, NULL); |
---|
243 | 232 | if (IS_ERR(clk)) { |
---|
.. | .. |
---|
246 | 235 | goto error0; |
---|
247 | 236 | } |
---|
248 | 237 | |
---|
249 | | - hspi = spi_master_get_devdata(master); |
---|
| 238 | + hspi = spi_controller_get_devdata(ctlr); |
---|
250 | 239 | platform_set_drvdata(pdev, hspi); |
---|
251 | 240 | |
---|
252 | 241 | /* init hspi */ |
---|
253 | | - hspi->master = master; |
---|
| 242 | + hspi->ctlr = ctlr; |
---|
254 | 243 | hspi->dev = &pdev->dev; |
---|
255 | 244 | hspi->clk = clk; |
---|
256 | 245 | hspi->addr = devm_ioremap(hspi->dev, |
---|
257 | 246 | res->start, resource_size(res)); |
---|
258 | 247 | if (!hspi->addr) { |
---|
259 | | - dev_err(&pdev->dev, "ioremap error.\n"); |
---|
260 | 248 | ret = -ENOMEM; |
---|
261 | 249 | goto error1; |
---|
262 | 250 | } |
---|
263 | 251 | |
---|
264 | 252 | pm_runtime_enable(&pdev->dev); |
---|
265 | 253 | |
---|
266 | | - master->bus_num = pdev->id; |
---|
267 | | - master->mode_bits = SPI_CPOL | SPI_CPHA; |
---|
268 | | - master->dev.of_node = pdev->dev.of_node; |
---|
269 | | - master->auto_runtime_pm = true; |
---|
270 | | - master->transfer_one_message = hspi_transfer_one_message; |
---|
271 | | - master->bits_per_word_mask = SPI_BPW_MASK(8); |
---|
| 254 | + ctlr->bus_num = pdev->id; |
---|
| 255 | + ctlr->mode_bits = SPI_CPOL | SPI_CPHA; |
---|
| 256 | + ctlr->dev.of_node = pdev->dev.of_node; |
---|
| 257 | + ctlr->auto_runtime_pm = true; |
---|
| 258 | + ctlr->transfer_one_message = hspi_transfer_one_message; |
---|
| 259 | + ctlr->bits_per_word_mask = SPI_BPW_MASK(8); |
---|
272 | 260 | |
---|
273 | | - ret = devm_spi_register_master(&pdev->dev, master); |
---|
| 261 | + ret = devm_spi_register_controller(&pdev->dev, ctlr); |
---|
274 | 262 | if (ret < 0) { |
---|
275 | | - dev_err(&pdev->dev, "spi_register_master error.\n"); |
---|
| 263 | + dev_err(&pdev->dev, "devm_spi_register_controller error.\n"); |
---|
276 | 264 | goto error2; |
---|
277 | 265 | } |
---|
278 | 266 | |
---|
.. | .. |
---|
283 | 271 | error1: |
---|
284 | 272 | clk_put(clk); |
---|
285 | 273 | error0: |
---|
286 | | - spi_master_put(master); |
---|
| 274 | + spi_controller_put(ctlr); |
---|
287 | 275 | |
---|
288 | 276 | return ret; |
---|
289 | 277 | } |
---|
.. | .. |
---|
316 | 304 | module_platform_driver(hspi_driver); |
---|
317 | 305 | |
---|
318 | 306 | MODULE_DESCRIPTION("SuperH HSPI bus driver"); |
---|
319 | | -MODULE_LICENSE("GPL"); |
---|
| 307 | +MODULE_LICENSE("GPL v2"); |
---|
320 | 308 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); |
---|
321 | 309 | MODULE_ALIAS("platform:sh-hspi"); |
---|