Skip to content

Instantly share code, notes, and snippets.

@NeoCat
Created September 27, 2012 14:26
Show Gist options
  • Save NeoCat/3794284 to your computer and use it in GitHub Desktop.
Save NeoCat/3794284 to your computer and use it in GitHub Desktop.
HDD Spin down driver for marvell SATA controller (mvSATA) in LS-GL
#include <linux/module.h>
#include <linux/kernel.h>
#include <scsi/scsi_host.h>
#define MV_LINUX
#define MV_ARM
#define MV_CPU_LE
#include "mvSata.h"
#include "mvLinuxIalHt.h"
void (*activate_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f9d0;
void (*deactivate_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f688;
void (*enable_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc0223180;
void (*disable_edma)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc022325c;
void (*disable_interupts)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f57c;
void (*enable_interupts)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc021f5d0;
MV_U8 (*nr_cmd)(MV_SATA_ADAPTER *pAdapter, MV_U8 ch) = (void*)0xc0223410;
MV_BOOLEAN (*execute)(MV_SATA_ADAPTER *pAdapter,
MV_U8 channelIndex,
MV_U8 PMPort,
MV_NON_UDMA_PROTOCOL protocolType,
MV_BOOLEAN isEXT,
MV_U16_PTR bufPtr, MV_U32 count,
MV_U16 features,
MV_U16 sectorCount,
MV_U16 lbaLow, MV_U16 lbaMid,
MV_U16 lbaHigh, MV_U8 device,
MV_U8 command) = (void*)0xc02271c4;
static int __init mvidle_init( void )
{
int i, w;
MV_BOOL ret;
MV_SATA_ADAPTER* p;
struct Scsi_Host *host = scsi_host_lookup(1);
if (!host)
return -ENODEV;
p = &MV_IAL_ADAPTER(host)->mvSataAdapter;
printk(KERN_DEBUG "host = %p\n", p);
for (w = 0; w < 100; w++) {
i = nr_cmd(p, 1);
if (i > 0) {
schedule_timeout(10);
} else break;
}
if (i > 0)
return -EBUSY;
printk(KERN_DEBUG "wait %d\n", w);
deactivate_edma(p, 1);
disable_edma(p, 1);
disable_interupts(p, 1);
ret = execute(p, 1, 0, MV_NON_UDMA_PROTOCOL_NON_DATA, MV_FALSE, NULL, 0,
0, 120, 0, 0, 0, 0, MV_ATA_COMMAND_STANDBY/*_IMMEDIATE*/);
printk(KERN_DEBUG "Send IDLE => %d\n", ret);
enable_interupts(p, 1);
enable_edma(p, 1);
activate_edma(p, 1);
return -EL2HLT;
}
static void __exit mvidle_exit( void )
{
}
module_init( mvidle_init );
module_exit( mvidle_exit );
MODULE_DESCRIPTION("MV Idle");
MODULE_LICENSE("GPL");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment