Lines Matching +full:func +full:-

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * smssdio.c - Siano 1xxx SDIO interface driver
8 * Copyright (C) 2006-2008, Uri Shkolnik
21 * - only typedefs should be name *_t
23 * - use ERR_PTR and friends for smscore_register_device()
25 * - smscore_getbuffer should zero fields
41 #include "sms-cards.h"
77 struct sdio_func *func; member
95 sdio_claim_host(smsdev->func); in smssdio_sendrequest()
98 while (size >= smsdev->func->cur_blksize) { in smssdio_sendrequest()
99 ret = sdio_memcpy_toio(smsdev->func, SMSSDIO_DATA, in smssdio_sendrequest()
100 buffer, smsdev->func->cur_blksize); in smssdio_sendrequest()
104 buffer += smsdev->func->cur_blksize; in smssdio_sendrequest()
105 size -= smsdev->func->cur_blksize; in smssdio_sendrequest()
109 ret = sdio_memcpy_toio(smsdev->func, SMSSDIO_DATA, in smssdio_sendrequest()
114 sdio_release_host(smsdev->func); in smssdio_sendrequest()
123 static void smssdio_interrupt(struct sdio_func *func) in smssdio_interrupt() argument
132 smsdev = sdio_get_drvdata(func); in smssdio_interrupt()
138 (void)sdio_readb(func, SMSSDIO_INT, &ret); in smssdio_interrupt()
144 if (smsdev->split_cb == NULL) { in smssdio_interrupt()
145 cb = smscore_getbuffer(smsdev->coredev); in smssdio_interrupt()
151 ret = sdio_memcpy_fromio(smsdev->func, in smssdio_interrupt()
152 cb->p, in smssdio_interrupt()
160 hdr = cb->p; in smssdio_interrupt()
162 if (hdr->msg_flags & MSG_HDR_FLAG_SPLIT_MSG) { in smssdio_interrupt()
163 smsdev->split_cb = cb; in smssdio_interrupt()
167 if (hdr->msg_length > smsdev->func->cur_blksize) in smssdio_interrupt()
168 size = hdr->msg_length - smsdev->func->cur_blksize; in smssdio_interrupt()
172 cb = smsdev->split_cb; in smssdio_interrupt()
173 hdr = cb->p; in smssdio_interrupt()
175 size = hdr->msg_length - sizeof(struct sms_msg_hdr); in smssdio_interrupt()
177 smsdev->split_cb = NULL; in smssdio_interrupt()
183 buffer = cb->p + (hdr->msg_length - size); in smssdio_interrupt()
186 BUG_ON(smsdev->func->cur_blksize != SMSSDIO_BLOCK_SIZE); in smssdio_interrupt()
191 ret = sdio_memcpy_fromio(smsdev->func, in smssdio_interrupt()
195 if (ret && ret != -EINVAL) { in smssdio_interrupt()
196 smscore_putbuffer(smsdev->coredev, cb); in smssdio_interrupt()
208 if (ret == -EINVAL) { in smssdio_interrupt()
210 ret = sdio_memcpy_fromio(smsdev->func, in smssdio_interrupt()
212 smsdev->func->cur_blksize); in smssdio_interrupt()
214 smscore_putbuffer(smsdev->coredev, cb); in smssdio_interrupt()
220 buffer += smsdev->func->cur_blksize; in smssdio_interrupt()
221 if (size > smsdev->func->cur_blksize) in smssdio_interrupt()
222 size -= smsdev->func->cur_blksize; in smssdio_interrupt()
229 cb->size = hdr->msg_length; in smssdio_interrupt()
230 cb->offset = 0; in smssdio_interrupt()
232 smsendian_handle_rx_message((struct sms_msg_data *) cb->p); in smssdio_interrupt()
233 smscore_onresponse(smsdev->coredev, cb); in smssdio_interrupt()
236 static int smssdio_probe(struct sdio_func *func, in smssdio_probe() argument
245 board_id = id->driver_data; in smssdio_probe()
249 return -ENOMEM; in smssdio_probe()
251 smsdev->func = func; in smssdio_probe()
255 params.device = &func->dev; in smssdio_probe()
261 "sdio\\%s", sdio_func_id(func)); in smssdio_probe()
265 params.device_type = sms_get_board(board_id)->type; in smssdio_probe()
273 ret = -ENODEV; in smssdio_probe()
277 ret = smscore_register_device(&params, &smsdev->coredev, GFP_DMA, NULL); in smssdio_probe()
281 smscore_set_board_id(smsdev->coredev, board_id); in smssdio_probe()
283 sdio_claim_host(func); in smssdio_probe()
285 ret = sdio_enable_func(func); in smssdio_probe()
289 ret = sdio_set_block_size(func, SMSSDIO_BLOCK_SIZE); in smssdio_probe()
293 ret = sdio_claim_irq(func, smssdio_interrupt); in smssdio_probe()
297 sdio_set_drvdata(func, smsdev); in smssdio_probe()
299 sdio_release_host(func); in smssdio_probe()
301 ret = smscore_start_device(smsdev->coredev); in smssdio_probe()
308 sdio_claim_host(func); in smssdio_probe()
309 sdio_release_irq(func); in smssdio_probe()
311 sdio_disable_func(func); in smssdio_probe()
313 sdio_release_host(func); in smssdio_probe()
314 smscore_unregister_device(smsdev->coredev); in smssdio_probe()
321 static void smssdio_remove(struct sdio_func *func) in smssdio_remove() argument
325 smsdev = sdio_get_drvdata(func); in smssdio_remove()
328 if (smsdev->split_cb) in smssdio_remove()
329 smscore_putbuffer(smsdev->coredev, smsdev->split_cb); in smssdio_remove()
331 smscore_unregister_device(smsdev->coredev); in smssdio_remove()
333 sdio_claim_host(func); in smssdio_remove()
334 sdio_release_irq(func); in smssdio_remove()
335 sdio_disable_func(func); in smssdio_remove()
336 sdio_release_host(func); in smssdio_remove()