aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ieee1394
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ieee1394')
-rw-r--r--drivers/ieee1394/ohci1394.c113
1 files changed, 49 insertions, 64 deletions
diff --git a/drivers/ieee1394/ohci1394.c b/drivers/ieee1394/ohci1394.c
index b4cad9f45862..29b891084ca7 100644
--- a/drivers/ieee1394/ohci1394.c
+++ b/drivers/ieee1394/ohci1394.c
@@ -2993,15 +2993,9 @@ do { \
2993 return err; \ 2993 return err; \
2994} while (0) 2994} while (0)
2995 2995
2996static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
2997 const struct pci_device_id *ent)
2998{
2999 struct hpsb_host *host;
3000 struct ti_ohci *ohci; /* shortcut to currently handled device */
3001 resource_size_t ohci_base;
3002
3003#ifdef CONFIG_PPC_PMAC 2996#ifdef CONFIG_PPC_PMAC
3004 /* Necessary on some machines if ohci1394 was loaded/ unloaded before */ 2997static void ohci1394_pmac_on(struct pci_dev *dev)
2998{
3005 if (machine_is(powermac)) { 2999 if (machine_is(powermac)) {
3006 struct device_node *ofn = pci_device_to_OF_node(dev); 3000 struct device_node *ofn = pci_device_to_OF_node(dev);
3007 3001
@@ -3010,8 +3004,32 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
3010 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1); 3004 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1);
3011 } 3005 }
3012 } 3006 }
3007}
3008
3009static void ohci1394_pmac_off(struct pci_dev *dev)
3010{
3011 if (machine_is(powermac)) {
3012 struct device_node *ofn = pci_device_to_OF_node(dev);
3013
3014 if (ofn) {
3015 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0);
3016 pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0);
3017 }
3018 }
3019}
3020#else
3021#define ohci1394_pmac_on(dev)
3022#define ohci1394_pmac_off(dev)
3013#endif /* CONFIG_PPC_PMAC */ 3023#endif /* CONFIG_PPC_PMAC */
3014 3024
3025static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
3026 const struct pci_device_id *ent)
3027{
3028 struct hpsb_host *host;
3029 struct ti_ohci *ohci; /* shortcut to currently handled device */
3030 resource_size_t ohci_base;
3031
3032 ohci1394_pmac_on(dev);
3015 if (pci_enable_device(dev)) 3033 if (pci_enable_device(dev))
3016 FAIL(-ENXIO, "Failed to enable OHCI hardware"); 3034 FAIL(-ENXIO, "Failed to enable OHCI hardware");
3017 pci_set_master(dev); 3035 pci_set_master(dev);
@@ -3203,16 +3221,16 @@ static int __devinit ohci1394_pci_probe(struct pci_dev *dev,
3203#undef FAIL 3221#undef FAIL
3204} 3222}
3205 3223
3206static void ohci1394_pci_remove(struct pci_dev *pdev) 3224static void ohci1394_pci_remove(struct pci_dev *dev)
3207{ 3225{
3208 struct ti_ohci *ohci; 3226 struct ti_ohci *ohci;
3209 struct device *dev; 3227 struct device *device;
3210 3228
3211 ohci = pci_get_drvdata(pdev); 3229 ohci = pci_get_drvdata(dev);
3212 if (!ohci) 3230 if (!ohci)
3213 return; 3231 return;
3214 3232
3215 dev = get_device(&ohci->host->device); 3233 device = get_device(&ohci->host->device);
3216 3234
3217 switch (ohci->init_state) { 3235 switch (ohci->init_state) {
3218 case OHCI_INIT_DONE: 3236 case OHCI_INIT_DONE:
@@ -3246,7 +3264,7 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
3246 /* Soft reset before we start - this disables 3264 /* Soft reset before we start - this disables
3247 * interrupts and clears linkEnable and LPS. */ 3265 * interrupts and clears linkEnable and LPS. */
3248 ohci_soft_reset(ohci); 3266 ohci_soft_reset(ohci);
3249 free_irq(ohci->dev->irq, ohci); 3267 free_irq(dev->irq, ohci);
3250 3268
3251 case OHCI_INIT_HAVE_TXRX_BUFFERS__MAYBE: 3269 case OHCI_INIT_HAVE_TXRX_BUFFERS__MAYBE:
3252 /* The ohci_soft_reset() stops all DMA contexts, so we 3270 /* The ohci_soft_reset() stops all DMA contexts, so we
@@ -3257,12 +3275,12 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
3257 free_dma_trm_ctx(&ohci->at_resp_context); 3275 free_dma_trm_ctx(&ohci->at_resp_context);
3258 3276
3259 case OHCI_INIT_HAVE_SELFID_BUFFER: 3277 case OHCI_INIT_HAVE_SELFID_BUFFER:
3260 pci_free_consistent(ohci->dev, OHCI1394_SI_DMA_BUF_SIZE, 3278 pci_free_consistent(dev, OHCI1394_SI_DMA_BUF_SIZE,
3261 ohci->selfid_buf_cpu, 3279 ohci->selfid_buf_cpu,
3262 ohci->selfid_buf_bus); 3280 ohci->selfid_buf_bus);
3263 3281
3264 case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER: 3282 case OHCI_INIT_HAVE_CONFIG_ROM_BUFFER:
3265 pci_free_consistent(ohci->dev, OHCI_CONFIG_ROM_LEN, 3283 pci_free_consistent(dev, OHCI_CONFIG_ROM_LEN,
3266 ohci->csr_config_rom_cpu, 3284 ohci->csr_config_rom_cpu,
3267 ohci->csr_config_rom_bus); 3285 ohci->csr_config_rom_bus);
3268 3286
@@ -3270,35 +3288,24 @@ static void ohci1394_pci_remove(struct pci_dev *pdev)
3270 iounmap(ohci->registers); 3288 iounmap(ohci->registers);
3271 3289
3272 case OHCI_INIT_HAVE_MEM_REGION: 3290 case OHCI_INIT_HAVE_MEM_REGION:
3273 release_mem_region(pci_resource_start(ohci->dev, 0), 3291 release_mem_region(pci_resource_start(dev, 0),
3274 OHCI1394_REGISTER_SIZE); 3292 OHCI1394_REGISTER_SIZE);
3275 3293
3276#ifdef CONFIG_PPC_PMAC 3294 ohci1394_pmac_off(dev);
3277 /* On UniNorth, power down the cable and turn off the chip clock
3278 * to save power on laptops */
3279 if (machine_is(powermac)) {
3280 struct device_node* ofn = pci_device_to_OF_node(ohci->dev);
3281
3282 if (ofn) {
3283 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0);
3284 pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0);
3285 }
3286 }
3287#endif /* CONFIG_PPC_PMAC */
3288 3295
3289 case OHCI_INIT_ALLOC_HOST: 3296 case OHCI_INIT_ALLOC_HOST:
3290 pci_set_drvdata(ohci->dev, NULL); 3297 pci_set_drvdata(dev, NULL);
3291 } 3298 }
3292 3299
3293 if (dev) 3300 if (device)
3294 put_device(dev); 3301 put_device(device);
3295} 3302}
3296 3303
3297#ifdef CONFIG_PM 3304#ifdef CONFIG_PM
3298static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state) 3305static int ohci1394_pci_suspend(struct pci_dev *dev, pm_message_t state)
3299{ 3306{
3300 int err; 3307 int err;
3301 struct ti_ohci *ohci = pci_get_drvdata(pdev); 3308 struct ti_ohci *ohci = pci_get_drvdata(dev);
3302 3309
3303 if (!ohci) { 3310 if (!ohci) {
3304 printk(KERN_ERR "%s: tried to suspend nonexisting host\n", 3311 printk(KERN_ERR "%s: tried to suspend nonexisting host\n",
@@ -3326,34 +3333,23 @@ static int ohci1394_pci_suspend(struct pci_dev *pdev, pm_message_t state)
3326 ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT); 3333 ohci_devctl(ohci->host, RESET_BUS, LONG_RESET_NO_FORCE_ROOT);
3327 ohci_soft_reset(ohci); 3334 ohci_soft_reset(ohci);
3328 3335
3329 err = pci_save_state(pdev); 3336 err = pci_save_state(dev);
3330 if (err) { 3337 if (err) {
3331 PRINT(KERN_ERR, "pci_save_state failed with %d", err); 3338 PRINT(KERN_ERR, "pci_save_state failed with %d", err);
3332 return err; 3339 return err;
3333 } 3340 }
3334 err = pci_set_power_state(pdev, pci_choose_state(pdev, state)); 3341 err = pci_set_power_state(dev, pci_choose_state(dev, state));
3335 if (err) 3342 if (err)
3336 DBGMSG("pci_set_power_state failed with %d", err); 3343 DBGMSG("pci_set_power_state failed with %d", err);
3337 3344 ohci1394_pmac_off(dev);
3338/* PowerMac suspend code comes last */
3339#ifdef CONFIG_PPC_PMAC
3340 if (machine_is(powermac)) {
3341 struct device_node *ofn = pci_device_to_OF_node(pdev);
3342
3343 if (ofn) {
3344 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 0);
3345 pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 0);
3346 }
3347 }
3348#endif /* CONFIG_PPC_PMAC */
3349 3345
3350 return 0; 3346 return 0;
3351} 3347}
3352 3348
3353static int ohci1394_pci_resume(struct pci_dev *pdev) 3349static int ohci1394_pci_resume(struct pci_dev *dev)
3354{ 3350{
3355 int err; 3351 int err;
3356 struct ti_ohci *ohci = pci_get_drvdata(pdev); 3352 struct ti_ohci *ohci = pci_get_drvdata(dev);
3357 3353
3358 if (!ohci) { 3354 if (!ohci) {
3359 printk(KERN_ERR "%s: tried to resume nonexisting host\n", 3355 printk(KERN_ERR "%s: tried to resume nonexisting host\n",
@@ -3362,21 +3358,10 @@ static int ohci1394_pci_resume(struct pci_dev *pdev)
3362 } 3358 }
3363 DBGMSG("resume called"); 3359 DBGMSG("resume called");
3364 3360
3365/* PowerMac resume code comes first */ 3361 ohci1394_pmac_on(dev);
3366#ifdef CONFIG_PPC_PMAC 3362 pci_set_power_state(dev, PCI_D0);
3367 if (machine_is(powermac)) { 3363 pci_restore_state(dev);
3368 struct device_node *ofn = pci_device_to_OF_node(pdev); 3364 err = pci_enable_device(dev);
3369
3370 if (ofn) {
3371 pmac_call_feature(PMAC_FTR_1394_CABLE_POWER, ofn, 0, 1);
3372 pmac_call_feature(PMAC_FTR_1394_ENABLE, ofn, 0, 1);
3373 }
3374 }
3375#endif /* CONFIG_PPC_PMAC */
3376
3377 pci_set_power_state(pdev, PCI_D0);
3378 pci_restore_state(pdev);
3379 err = pci_enable_device(pdev);
3380 if (err) { 3365 if (err) {
3381 PRINT(KERN_ERR, "pci_enable_device failed with %d", err); 3366 PRINT(KERN_ERR, "pci_enable_device failed with %d", err);
3382 return err; 3367 return err;