ide: add "vlb|pci_clock=" parameter
* Add "vlb_clock=" parameter for specifying VLB clock frequency (in MHz). * Add "pci_clock=" parameter for specifying PCI bus clock frequency (in MHz). While at it: * qd65xx.c: rename {active,recovery}_cycle variables to {act,rec}_cyc. Cc: Alan Cox <alan@lxorguk.ukuu.org.uk> Acked-by: Sergei Shtylyov <sshtylyov@ru.mvista.com> Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
10569713c7
commit
ebae41a5a0
|
@ -1116,6 +1116,18 @@ static void ide_port_class_release(struct device *portdev)
|
||||||
put_device(&hwif->gendev);
|
put_device(&hwif->gendev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int ide_vlb_clk;
|
||||||
|
EXPORT_SYMBOL_GPL(ide_vlb_clk);
|
||||||
|
|
||||||
|
module_param_named(vlb_clock, ide_vlb_clk, int, 0);
|
||||||
|
MODULE_PARM_DESC(vlb_clock, "VLB clock frequency (in MHz)");
|
||||||
|
|
||||||
|
int ide_pci_clk;
|
||||||
|
EXPORT_SYMBOL_GPL(ide_pci_clk);
|
||||||
|
|
||||||
|
module_param_named(pci_clock, ide_pci_clk, int, 0);
|
||||||
|
MODULE_PARM_DESC(pci_clock, "PCI bus clock frequency (in MHz)");
|
||||||
|
|
||||||
static unsigned int ide_ignore_cable;
|
static unsigned int ide_ignore_cable;
|
||||||
|
|
||||||
static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
|
static int ide_set_ignore_cable(const char *s, struct kernel_param *kp)
|
||||||
|
|
|
@ -116,7 +116,7 @@ static void ali14xx_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||||
int time1, time2;
|
int time1, time2;
|
||||||
u8 param1, param2, param3, param4;
|
u8 param1, param2, param3, param4;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
|
||||||
|
|
||||||
/* calculate timing, according to PIO mode */
|
/* calculate timing, according to PIO mode */
|
||||||
time1 = ide_pio_cycle_time(drive, pio);
|
time1 = ide_pio_cycle_time(drive, pio);
|
||||||
|
|
|
@ -212,7 +212,7 @@ static u8 ht_pio2timings(ide_drive_t *drive, const u8 pio)
|
||||||
{
|
{
|
||||||
int active_time, recovery_time;
|
int active_time, recovery_time;
|
||||||
int active_cycles, recovery_cycles;
|
int active_cycles, recovery_cycles;
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
|
||||||
|
|
||||||
if (pio) {
|
if (pio) {
|
||||||
unsigned int cycle_time;
|
unsigned int cycle_time;
|
||||||
|
|
|
@ -114,17 +114,18 @@ static void qd65xx_select(ide_drive_t *drive)
|
||||||
|
|
||||||
static u8 qd6500_compute_timing (ide_hwif_t *hwif, int active_time, int recovery_time)
|
static u8 qd6500_compute_timing (ide_hwif_t *hwif, int active_time, int recovery_time)
|
||||||
{
|
{
|
||||||
u8 active_cycle,recovery_cycle;
|
int clk = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
|
||||||
|
u8 act_cyc, rec_cyc;
|
||||||
|
|
||||||
if (system_bus_clock()<=33) {
|
if (clk <= 33) {
|
||||||
active_cycle = 9 - IDE_IN(active_time * system_bus_clock() / 1000 + 1, 2, 9);
|
act_cyc = 9 - IDE_IN(active_time * clk / 1000 + 1, 2, 9);
|
||||||
recovery_cycle = 15 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 0, 15);
|
rec_cyc = 15 - IDE_IN(recovery_time * clk / 1000 + 1, 0, 15);
|
||||||
} else {
|
} else {
|
||||||
active_cycle = 8 - IDE_IN(active_time * system_bus_clock() / 1000 + 1, 1, 8);
|
act_cyc = 8 - IDE_IN(active_time * clk / 1000 + 1, 1, 8);
|
||||||
recovery_cycle = 18 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 3, 18);
|
rec_cyc = 18 - IDE_IN(recovery_time * clk / 1000 + 1, 3, 18);
|
||||||
}
|
}
|
||||||
|
|
||||||
return((recovery_cycle<<4) | 0x08 | active_cycle);
|
return (rec_cyc << 4) | 0x08 | act_cyc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -135,10 +136,13 @@ static u8 qd6500_compute_timing (ide_hwif_t *hwif, int active_time, int recovery
|
||||||
|
|
||||||
static u8 qd6580_compute_timing (int active_time, int recovery_time)
|
static u8 qd6580_compute_timing (int active_time, int recovery_time)
|
||||||
{
|
{
|
||||||
u8 active_cycle = 17 - IDE_IN(active_time * system_bus_clock() / 1000 + 1, 2, 17);
|
int clk = ide_vlb_clk ? ide_vlb_clk : system_bus_clock();
|
||||||
u8 recovery_cycle = 15 - IDE_IN(recovery_time * system_bus_clock() / 1000 + 1, 2, 15);
|
u8 act_cyc, rec_cyc;
|
||||||
|
|
||||||
return((recovery_cycle<<4) | active_cycle);
|
act_cyc = 17 - IDE_IN(active_time * clk / 1000 + 1, 2, 17);
|
||||||
|
rec_cyc = 15 - IDE_IN(recovery_time * clk / 1000 + 1, 2, 15);
|
||||||
|
|
||||||
|
return (rec_cyc << 4) | act_cyc;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -140,7 +140,7 @@ static void aec_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||||
|
|
||||||
static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const char *name)
|
static unsigned int __devinit init_chipset_aec62xx(struct pci_dev *dev, const char *name)
|
||||||
{
|
{
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
|
||||||
|
|
||||||
if (bus_speed <= 33)
|
if (bus_speed <= 33)
|
||||||
pci_set_drvdata(dev, (void *) aec6xxx_33_base);
|
pci_set_drvdata(dev, (void *) aec6xxx_33_base);
|
||||||
|
|
|
@ -294,7 +294,7 @@ static void ali_set_pio_mode(ide_drive_t *drive, const u8 pio)
|
||||||
int s_time, a_time, c_time;
|
int s_time, a_time, c_time;
|
||||||
u8 s_clc, a_clc, r_clc;
|
u8 s_clc, a_clc, r_clc;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
|
||||||
int port = hwif->channel ? 0x5c : 0x58;
|
int port = hwif->channel ? 0x5c : 0x58;
|
||||||
int portFIFO = hwif->channel ? 0x55 : 0x54;
|
int portFIFO = hwif->channel ? 0x55 : 0x54;
|
||||||
u8 cd_dma_fifo = 0;
|
u8 cd_dma_fifo = 0;
|
||||||
|
|
|
@ -179,7 +179,7 @@ static unsigned int __devinit init_chipset_amd74xx(struct pci_dev *dev,
|
||||||
* Determine the system bus clock.
|
* Determine the system bus clock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
amd_clock = system_bus_clock() * 1000;
|
amd_clock = (ide_pci_clk ? ide_pci_clk : system_bus_clock()) * 1000;
|
||||||
|
|
||||||
switch (amd_clock) {
|
switch (amd_clock) {
|
||||||
case 33000: amd_clock = 33333; break;
|
case 33000: amd_clock = 33333; break;
|
||||||
|
|
|
@ -552,7 +552,14 @@ static void cmd640_set_mode(ide_drive_t *drive, unsigned int index,
|
||||||
{
|
{
|
||||||
int setup_time, active_time, recovery_time, clock_time;
|
int setup_time, active_time, recovery_time, clock_time;
|
||||||
u8 setup_count, active_count, recovery_count, recovery_count2, cycle_count;
|
u8 setup_count, active_count, recovery_count, recovery_count2, cycle_count;
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed;
|
||||||
|
|
||||||
|
if (cmd640_vlb && ide_vlb_clk)
|
||||||
|
bus_speed = ide_vlb_clk;
|
||||||
|
else if (!cmd640_vlb && ide_pci_clk)
|
||||||
|
bus_speed = ide_pci_clk;
|
||||||
|
else
|
||||||
|
bus_speed = system_bus_clock();
|
||||||
|
|
||||||
if (pio_mode > 5)
|
if (pio_mode > 5)
|
||||||
pio_mode = 5;
|
pio_mode = 5;
|
||||||
|
|
|
@ -68,8 +68,8 @@ static u8 quantize_timing(int timing, int quant)
|
||||||
*/
|
*/
|
||||||
static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_time)
|
static void program_cycle_times (ide_drive_t *drive, int cycle_time, int active_time)
|
||||||
{
|
{
|
||||||
struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
|
struct pci_dev *dev = to_pci_dev(drive->hwif->dev);
|
||||||
int clock_time = 1000 / system_bus_clock();
|
int clock_time = 1000 / (ide_pci_clk ? ide_pci_clk : system_bus_clock());
|
||||||
u8 cycle_count, active_count, recovery_count, drwtim;
|
u8 cycle_count, active_count, recovery_count, drwtim;
|
||||||
static const u8 recovery_values[] =
|
static const u8 recovery_values[] =
|
||||||
{15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
|
{15, 15, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 0};
|
||||||
|
@ -128,7 +128,7 @@ static void cmd64x_tune_pio(ide_drive_t *drive, const u8 pio)
|
||||||
ide_pio_timings[pio].active_time);
|
ide_pio_timings[pio].active_time);
|
||||||
|
|
||||||
setup_count = quantize_timing(ide_pio_timings[pio].setup_time,
|
setup_count = quantize_timing(ide_pio_timings[pio].setup_time,
|
||||||
1000 / system_bus_clock());
|
1000 / (ide_pci_clk ? ide_pci_clk : system_bus_clock()));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The primary channel has individual address setup timing registers
|
* The primary channel has individual address setup timing registers
|
||||||
|
|
|
@ -136,7 +136,7 @@ static int calc_clk(int time, int bus_speed)
|
||||||
static void compute_clocks(u8 pio, pio_clocks_t *p_pclk)
|
static void compute_clocks(u8 pio, pio_clocks_t *p_pclk)
|
||||||
{
|
{
|
||||||
int clk1, clk2;
|
int clk1, clk2;
|
||||||
int bus_speed = system_bus_clock(); /* get speed of PCI bus */
|
int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
|
||||||
|
|
||||||
/* we don't check against CY82C693's min and max speed,
|
/* we don't check against CY82C693's min and max speed,
|
||||||
* so you can play with the idebus=xx parameter
|
* so you can play with the idebus=xx parameter
|
||||||
|
|
|
@ -210,7 +210,7 @@ static void compute_clocks(int pio, pio_clocks_t *clks)
|
||||||
{
|
{
|
||||||
if (pio != PIO_NOT_EXIST) {
|
if (pio != PIO_NOT_EXIST) {
|
||||||
int adr_setup, data_pls;
|
int adr_setup, data_pls;
|
||||||
int bus_speed = system_bus_clock();
|
int bus_speed = ide_pci_clk ? ide_pci_clk : system_bus_clock();
|
||||||
|
|
||||||
adr_setup = ide_pio_timings[pio].setup_time;
|
adr_setup = ide_pio_timings[pio].setup_time;
|
||||||
data_pls = ide_pio_timings[pio].active_time;
|
data_pls = ide_pio_timings[pio].active_time;
|
||||||
|
|
|
@ -340,7 +340,7 @@ static unsigned int __devinit init_chipset_via82cxxx(struct pci_dev *dev, const
|
||||||
* Determine system bus clock.
|
* Determine system bus clock.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
via_clock = system_bus_clock() * 1000;
|
via_clock = (ide_pci_clk ? ide_pci_clk : system_bus_clock()) * 1000;
|
||||||
|
|
||||||
switch (via_clock) {
|
switch (via_clock) {
|
||||||
case 33000: via_clock = 33333; break;
|
case 33000: via_clock = 33333; break;
|
||||||
|
|
|
@ -801,6 +801,9 @@ extern ide_hwif_t ide_hwifs[]; /* master data repository */
|
||||||
#endif
|
#endif
|
||||||
extern int noautodma;
|
extern int noautodma;
|
||||||
|
|
||||||
|
extern int ide_vlb_clk;
|
||||||
|
extern int ide_pci_clk;
|
||||||
|
|
||||||
ide_hwif_t *ide_find_port_slot(const struct ide_port_info *);
|
ide_hwif_t *ide_find_port_slot(const struct ide_port_info *);
|
||||||
|
|
||||||
static inline ide_hwif_t *ide_find_port(void)
|
static inline ide_hwif_t *ide_find_port(void)
|
||||||
|
|
Loading…
Reference in New Issue