| The U-Boot Driver Model Project |
| =============================== |
| Watchdog device subsystem analysis |
| ================================== |
| |
| Tomas Hlavacek <tmshlvck@gmail.com> |
| 2012-03-09 |
| |
| I) Overview |
| ----------- |
| |
| U-Boot currently implements an API for HW watchdog devices as explicit drivers |
| in drivers/watchdog directory. There are also drivers for both hardware and |
| software watchdog on particular CPUs implemented in arch/*/cpu/*/cpu.c. There |
| are macros in include/watchdog.h that selects between SW and HW watchdog and |
| assembly SW implementation. |
| |
| The current common interface comprises of one set out of these two possible |
| variants: |
| |
| 1) |
| void watchdog_reset(void); |
| int watchdog_disable(void); |
| int watchdog_init(void); |
| |
| 2) |
| void hw_watchdog_reset(void); |
| void hw_watchdog_init(void); |
| |
| The watchdog implementations are also spread through board/*/*.c that in |
| some cases. The API and semantics is in most cases same as the above |
| mentioned common functions. |
| |
| |
| II) Approach |
| ------------ |
| |
| 1) New API |
| ---------- |
| |
| In the UDM each watchdog driver would register itself by a function |
| |
| int watchdog_device_register(struct instance *i, |
| const struct watchdog_device_ops *o); |
| |
| The structure being defined as follows: |
| |
| struct watchdog_device_ops { |
| int (*disable)(struct instance *i); |
| void (*reset)(struct instance *i); |
| }; |
| |
| The watchdog_init() function will be dissolved into probe() function. |
| |
| 2) Conversion thougths |
| ---------------------- |
| |
| Conversion of watchdog implementations to a new API could be divided |
| to three subsections: a) HW implementations, which are mostly compliant |
| to the above mentioned API; b) SW implementations, which are compliant |
| to the above mentioned API and c) SW implementations that are not compliant |
| to the API and has to be rectified or partially rewritten. |
| |
| III) Analysis of in-tree drivers |
| -------------------------------- |
| |
| 1) drivers/watchdog/at91sam9_wdt.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 2) drivers/watchdog/ftwdt010_wdt.c |
| ---------------------------------- |
| The driver is ad-hoc HW watchdog. Conversion has to take into account |
| driver parts spread in include/faraday/*. Restructuring the driver and |
| code cleanup has to be considered. |
| |
| |
| 3) arch/arm/cpu/arm1136/mx31/timer.c |
| ------------------------------------ |
| The driver is semi-standard ad-hoc HW watchdog. Conversion has to take |
| into account driver parts spread in the timer.c file. |
| |
| |
| 4) arch/arm/cpu/arm926ejs/davinci/timer.c |
| ----------------------------------------- |
| The driver is ad-hoc semi-standard HW watchdog. Conversion has to take |
| into account driver parts spread in the timer.c file. |
| |
| |
| 5) arch/arm/cpu/armv7/omap-common/hwinit-common.c |
| ------------------------------------------------- |
| The driver is non-standard ad-hoc HW watchdog. Conversion is possible |
| but functions has to be renamed and constants moved to another places. |
| |
| |
| 6) arch/arm/cpu/armv7/omap3/board.c |
| ----------------------------------- |
| The driver is non-standard ad-hoc HW watchdog. Conversion is possible |
| but functions has to be renamed and constants moved to another places. |
| |
| |
| 7) arch/blackfin/cpu/watchdog.c |
| ------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 8) arch/m68k/cpu/mcf523x/cpu.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 9) arch/m68k/cpu/mcf52x2/cpu.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 10) arch/m68k/cpu/mcf532x/cpu.c |
| ------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 11) arch/m68k/cpu/mcf547x_8x/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog (there is slight naming convention |
| violation that has to be rectified). Simple conversion is possible. |
| |
| |
| 12) arch/powerpc/cpu/74xx_7xx/cpu.c |
| ----------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 13) arch/powerpc/cpu/mpc512x/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 14) arch/powerpc/cpu/mpc5xx/cpu.c |
| --------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 15) arch/powerpc/cpu/mpc5xxx/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 16) arch/powerpc/cpu/mpc8260/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 17) arch/powerpc/cpu/mpc83xx/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 18) arch/powerpc/cpu/mpc85xx/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 19) arch/powerpc/cpu/mpc86xx/cpu.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 20) arch/powerpc/cpu/mpc8xx/cpu.c |
| |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 21) arch/powerpc/cpu/ppc4xx/cpu.c |
| --------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 22) arch/sh/cpu/sh2/watchdog.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 23) arch/sh/cpu/sh3/watchdog.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 24) arch/sh/cpu/sh4/watchdog.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 25) board/amcc/luan/luan.c |
| -------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 26) board/amcc/yosemite/yosemite.c |
| ---------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 27) board/apollon/apollon.c |
| --------------------------- |
| The driver is standard HW watchdog however the watchdog_init() |
| function is called in early initialization. Simple conversion is possible. |
| |
| |
| 28) board/bmw/m48t59y.c |
| ----------------------- |
| Special watchdog driver. Dead code. To be removed. |
| |
| |
| 29) board/davedenx/qong/qong.c |
| ------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 30) board/dvlhost/watchdog.c |
| ---------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 31) board/eNET/eNET.c |
| --------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 32) board/eltec/elppc/elppc.c |
| ----------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 33) board/enbw/enbw_cmc/enbw_cmc.c |
| ---------------------------------- |
| Only function proxy call. Code cleanup needed. |
| |
| |
| 34) board/freescale/mx31pdk/mx31pdk.c |
| ------------------------------------- |
| Only function proxy call. Code cleanup needed. |
| |
| |
| 35) board/gth2/gth2.c |
| --------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 36) board/lwmon5/lwmon5.c |
| ------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 37) board/manroland/mucmc52/mucmc52.c |
| ------------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 38) board/manroland/uc101/uc101.c |
| --------------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 39) board/mousse/m48t59y.c |
| -------------------------- |
| Special watchdog driver. Dead code. To be removed. |
| |
| |
| 40) board/mvblue/mvblue.c |
| ------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 41) board/netphone/netphone.c |
| ----------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 42) board/netta/netta.c |
| ----------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 43) board/netta2/netta2.c |
| ------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 44) board/omicron/calimain/calimain.c |
| ------------------------------------- |
| Only function proxy call. Code cleanup needed. |
| |
| |
| 45) board/pcippc2/pcippc2.c |
| --------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 46) board/pcs440ep/pcs440ep.c |
| ----------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 47) board/stx/stxxtc/stxxtc.c |
| ----------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 48) board/ti/omap2420h4/omap2420h4.c |
| ------------------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 49) board/ttcontrol/vision2/vision2.c |
| ------------------------------------- |
| The driver is standard HW watchdog but namespace is polluted by |
| non-standard macros. Simple conversion is possible, code cleanup |
| needed. |
| |
| |
| 50) board/v38b/v38b.c |
| --------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 51) board/ve8313/ve8313.c |
| ------------------------- |
| The driver is standard HW watchdog. Simple conversion is possible. |
| |
| |
| 52) board/w7o/watchdog.c |
| ------------------------ |
| The driver is standard HW watchdog. Simple conversion is possible. |