restructure broadcom soc file layout
[AROS.git] / arch / arm-native / soc / broadcom / 283x / vcmbox / vcmbox_init.c
blobf6f42f58666bcf5ec8c0f7965ec9ead0d642115d
1 /*
2 Copyright © 2013, The AROS Development Team. All rights reserved.
3 $Id$
4 */
6 #define DEBUG 0
8 #include <aros/debug.h>
9 #include <aros/symbolsets.h>
10 #include <aros/libcall.h>
11 #include <proto/openfirmware.h>
12 #include <proto/kernel.h>
13 #include <proto/exec.h>
14 #include <proto/vcmbox.h>
16 #include <asm/bcm2835.h>
17 #include <hardware/videocore.h>
19 #include "vcmbox_private.h"
22 static int vcmbox_init(struct VCMBoxBase *VCMBoxBase)
24 int retval = TRUE;
26 D(bug("[VCMBox] vcmbox_init()\n"));
28 InitSemaphore(&VCMBoxBase->vcmb_Sem);
30 D(bug("[VCMBox] vcmbox_init: Initialised Semaphore @ 0x%p\n", &VCMBoxBase->vcmb_Sem));
32 return retval;
35 AROS_LH1(unsigned int, VCMBoxStatus,
36 AROS_LHA(void *, mb, A0),
37 struct VCMBoxBase *, VCMBoxBase, 1, Vcmbox)
39 AROS_LIBFUNC_INIT
41 D(bug("[VCMBox] VCMBoxStatus(0x%p)\n", mb));
43 return *((volatile unsigned int *)(mb + VCMB_STATUS));
45 AROS_LIBFUNC_EXIT
48 AROS_LH2(volatile unsigned int *, VCMBoxRead,
49 AROS_LHA(void *, mb, A0),
50 AROS_LHA( unsigned int, chan, D0),
51 struct VCMBoxBase *, VCMBoxBase, 2, Vcmbox)
53 AROS_LIBFUNC_INIT
55 unsigned int try = 0x2000000;
56 unsigned int msg;
58 D(bug("[VCMBox] VCMBoxRead(chan %d @ 0x%p)\n", chan, mb));
60 if (chan <= VCMB_CHAN_MAX)
62 while(1)
64 ObtainSemaphore(&VCMBoxBase->vcmb_Sem);
65 APTR ssp = SuperState();
66 while ((VCMBoxStatus(mb) & VCMB_STATUS_READREADY) != 0)
68 asm volatile ("mcr p15, 0, %[r], c7, c14, 0" : : [r] "r" (0) );
70 if(try-- == 0)
72 break;
75 asm volatile ("mcr p15, 0, %[r], c7, c10, 5" : : [r] "r" (0) );
77 msg = *((volatile unsigned int *)(mb + VCMB_READ));
79 asm volatile ("mcr p15, 0, %[r], c7, c10, 5" : : [r] "r" (0) );
80 UserState(ssp);
81 ReleaseSemaphore(&VCMBoxBase->vcmb_Sem);
83 if ((msg & VCMB_CHAN_MASK) == chan)
84 return (volatile unsigned int *)(msg & ~VCMB_CHAN_MASK);
87 return (volatile unsigned int *)-1;
89 AROS_LIBFUNC_EXIT
92 AROS_LH3(void, VCMBoxWrite,
93 AROS_LHA(void *, mb, A0),
94 AROS_LHA( unsigned int, chan, D0),
95 AROS_LHA(void *, msg, A1),
96 struct VCMBoxBase *, VCMBoxBase, 3, Vcmbox)
98 AROS_LIBFUNC_INIT
100 D(bug("[VCMB] VCMBWrite(chan %d @ 0x%p, msg @ 0x%p)\n", chan, mb, msg));
102 if ((((unsigned int)msg & VCMB_CHAN_MASK) == 0) && (chan <= VCMB_CHAN_MAX))
104 ObtainSemaphore(&VCMBoxBase->vcmb_Sem);
105 APTR ssp = SuperState();
106 while ((VCMBoxStatus(mb) & VCMB_STATUS_WRITEREADY) != 0)
108 asm volatile ("mcr p15, 0, %[r], c7, c14, 0" : : [r] "r" (0) );
111 asm volatile ("mcr p15, 0, %[r], c7, c10, 5" : : [r] "r" (0) );
113 *((volatile unsigned int *)(mb + VCMB_WRITE)) = ((unsigned int)msg | chan);
114 UserState(ssp);
115 ReleaseSemaphore(&VCMBoxBase->vcmb_Sem);
118 AROS_LIBFUNC_EXIT
121 ADD2INITLIB(vcmbox_init, 0)