static int ps3disk_init(void) { int err; err = ps3stor_setup(&stor_dev, PS3_DEV_TYPE_STOR_DISK); if (err) return err; return 0; }
static int ps3cdrom_init(void) { int err; err = ps3stor_setup(&stor_dev, PS3_DEV_TYPE_STOR_CDROM); if (err) return err; return 0; }
static int __devinit ps3flash_probe(struct ps3_system_bus_device *_dev) { struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core); struct ps3flash_private *priv; int error; unsigned long tmp; tmp = dev->regions[dev->region_idx].start*dev->blk_size; if (tmp % FLASH_BLOCK_SIZE) { dev_err(&dev->sbd.core, "%s:%u region start %lu is not aligned\n", __func__, __LINE__, tmp); return -EINVAL; } tmp = dev->regions[dev->region_idx].size*dev->blk_size; if (tmp % FLASH_BLOCK_SIZE) { dev_err(&dev->sbd.core, "%s:%u region size %lu is not aligned\n", __func__, __LINE__, tmp); return -EINVAL; } /* use static buffer, kmalloc cannot allocate 256 KiB */ if (!ps3flash_bounce_buffer.address) return -ENODEV; if (ps3flash_dev) { dev_err(&dev->sbd.core, "Only one FLASH device is supported\n"); return -EBUSY; } ps3flash_dev = dev; priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { error = -ENOMEM; goto fail; } dev->sbd.core.driver_data = priv; mutex_init(&priv->mutex); dev->bounce_size = ps3flash_bounce_buffer.size; dev->bounce_buf = ps3flash_bounce_buffer.address; error = ps3stor_setup(dev, ps3flash_interrupt); if (error) goto fail_free_priv; ps3flash_misc.parent = &dev->sbd.core; error = misc_register(&ps3flash_misc); if (error) { dev_err(&dev->sbd.core, "%s:%u: misc_register failed %d\n", __func__, __LINE__, error); goto fail_teardown; } dev_info(&dev->sbd.core, "%s:%u: registered misc device %d\n", __func__, __LINE__, ps3flash_misc.minor); return 0; fail_teardown: ps3stor_teardown(dev); fail_free_priv: kfree(priv); dev->sbd.core.driver_data = NULL; fail: ps3flash_dev = NULL; return error; }
static int __devinit ps3encdec_probe(struct ps3_system_bus_device *_dev) { struct ps3_storage_device *dev = to_ps3_storage_device(&_dev->core); struct ps3encdec_private *priv; int error; if (ps3encdec_dev) { dev_err(&dev->sbd.core, "Only one ENCDEC device is supported\n"); return -EBUSY; } ps3encdec_dev = dev; priv = kzalloc(sizeof(*priv), GFP_KERNEL); if (!priv) { error = -ENOMEM; goto fail; } ps3_system_bus_set_drvdata(&dev->sbd, priv); mutex_init(&priv->mutex); dev->bounce_size = BOUNCE_SIZE; dev->bounce_buf = kmalloc(BOUNCE_SIZE, GFP_DMA); if (!dev->bounce_buf) { error = -ENOMEM; goto fail_free_priv; } error = ps3stor_setup(dev, ps3encdec_interrupt); if (error) goto fail_free_bounce; ps3encdec_misc.parent = &dev->sbd.core; error = misc_register(&ps3encdec_misc); if (error) { dev_err(&dev->sbd.core, "%s:%u: misc_register failed %d\n", __func__, __LINE__, error); goto fail_teardown; } dev_info(&dev->sbd.core, "%s:%u: registered misc device %d\n", __func__, __LINE__, ps3encdec_misc.minor); return 0; fail_teardown: ps3stor_teardown(dev); fail_free_bounce: kfree(dev->bounce_buf); fail_free_priv: kfree(priv); ps3_system_bus_set_drvdata(&dev->sbd, NULL); fail: ps3encdec_dev = NULL; return error; }