xref: /haiku/src/add-ons/kernel/bus_managers/mmc/mmc_bus.h (revision c237c4ce593ee823d9867fd997e51e4c447f5623)
1 /*
2  * Copyright 2018 Haiku, Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		B Krishnan Iyer, krishnaniyer97@gmail.com
7  */
8 #ifndef MMC_BUS_H
9 #define MMC_BUS_H
10 
11 
12 #include <new>
13 #include <stdio.h>
14 #include <string.h>
15 
16 #include <lock.h>
17 #include <util/AutoLock.h>
18 #include "mmc.h"
19 
20 
21 #define MMCBUS_TRACE
22 #ifdef MMCBUS_TRACE
23 #	define TRACE(x...)		dprintf("\33[33mmmc_bus:\33[0m " x)
24 #else
25 #	define TRACE(x...)
26 #endif
27 #define TRACE_ALWAYS(x...)	dprintf("\33[33mmmc_bus:\33[0m " x)
28 #define ERROR(x...)			dprintf("\33[33mmmc_bus:\33[0m " x)
29 #define CALLED() 			TRACE("CALLED %s\n", __PRETTY_FUNCTION__)
30 
31 extern device_manager_info *gDeviceManager;
32 
33 
34 class MMCBus;
35 
36 class MMCBus {
37 public:
38 
39 								MMCBus(device_node *node);
40 								~MMCBus();
41 				status_t		InitCheck();
42 				void			Rescan();
43 
44 				status_t		ExecuteCommand(uint16_t rca, uint8_t command,
45 									uint32_t argument, uint32_t* response);
46 				status_t		DoIO(uint16_t rca, uint8_t command,
47 									IOOperation* operation,
48 									bool offsetAsSectors);
49 
50 				void			SetClock(int frequency);
51 				void			SetBusWidth(int width);
52 
53 				void			AcquireBus() { acquire_sem(fLockSemaphore); }
54 				void			ReleaseBus() { release_sem(fLockSemaphore); }
55 private:
56 				status_t		_ActivateDevice(uint16_t rca);
57 				void			_AcquireScanSemaphore();
58 		static	status_t		_WorkerThread(void*);
59 
60 private:
61 
62 		device_node* 			fNode;
63 		mmc_bus_interface* 		fController;
64 		void* 					fCookie;
65 		status_t				fStatus;
66 		thread_id				fWorkerThread;
67 		sem_id					fScanSemaphore;
68 		sem_id					fLockSemaphore;
69 		uint16					fActiveDevice;
70 };
71 
72 
73 #endif /*MMC_BUS_H*/
74