From: Ben Dooks Date: Mon, 10 Oct 2011 23:55:30 +0000 (+0100) Subject: fixup merge X-Git-Tag: next-20111011~74^2 X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=f8420b7bf6ce1a3c483cbc0a5a48ee82715224a0;p=karo-tx-linux.git fixup merge --- f8420b7bf6ce1a3c483cbc0a5a48ee82715224a0 diff --cc drivers/i2c/busses/i2c-designware-platdrv.c index 000000000000,000000000000,2d3657ab1258..9b6f48009f9f mode 000000,000000,100644..100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c @@@@ -1,0 -1,0 -1,215 +1,215 @@@@ ++ /* ++ * Synopsys DesignWare I2C adapter driver (master only). ++ * ++ * Based on the TI DAVINCI I2C adapter driver. ++ * ++ * Copyright (C) 2006 Texas Instruments. ++ * Copyright (C) 2007 MontaVista Software Inc. ++ * Copyright (C) 2009 Provigent Ltd. ++ * ++ * ---------------------------------------------------------------------------- ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation; either version 2 of the License, or ++ * (at your option) any later version. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ * ++ * You should have received a copy of the GNU General Public License ++ * along with this program; if not, write to the Free Software ++ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ++ * ---------------------------------------------------------------------------- ++ * ++ */ ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include ++ #include "i2c-designware-core.h" ++ ++ static struct i2c_algorithm i2c_dw_algo = { ++ .master_xfer = i2c_dw_xfer, ++ .functionality = i2c_dw_func, ++ }; ++ static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) ++ { ++ return clk_get_rate(dev->clk)/1000; ++ } ++ ++ static int __devinit dw_i2c_probe(struct platform_device *pdev) ++ { ++ struct dw_i2c_dev *dev; ++ struct i2c_adapter *adap; ++ struct resource *mem, *ioarea; ++ int irq, r; ++ ++ /* NOTE: driver uses the static register mapping */ ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ if (!mem) { ++ dev_err(&pdev->dev, "no mem resource?\n"); ++ return -EINVAL; ++ } ++ ++ irq = platform_get_irq(pdev, 0); ++ if (irq < 0) { ++ dev_err(&pdev->dev, "no irq resource?\n"); ++ return irq; /* -ENXIO */ ++ } ++ ++ ioarea = request_mem_region(mem->start, resource_size(mem), ++ pdev->name); ++ if (!ioarea) { ++ dev_err(&pdev->dev, "I2C region already claimed\n"); ++ return -EBUSY; ++ } ++ ++ dev = kzalloc(sizeof(struct dw_i2c_dev), GFP_KERNEL); ++ if (!dev) { ++ r = -ENOMEM; ++ goto err_release_region; ++ } ++ ++ init_completion(&dev->cmd_complete); ++ mutex_init(&dev->lock); ++ dev->dev = get_device(&pdev->dev); ++ dev->irq = irq; ++ platform_set_drvdata(pdev, dev); ++ ++ dev->clk = clk_get(&pdev->dev, NULL); ++ dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz; ++ ++ if (IS_ERR(dev->clk)) { ++ r = -ENODEV; ++ goto err_free_mem; ++ } ++ clk_enable(dev->clk); ++ ++ dev->functionality = ++ I2C_FUNC_I2C | ++ I2C_FUNC_10BIT_ADDR | ++ I2C_FUNC_SMBUS_BYTE | ++ I2C_FUNC_SMBUS_BYTE_DATA | ++ I2C_FUNC_SMBUS_WORD_DATA | ++ I2C_FUNC_SMBUS_I2C_BLOCK; ++ dev->master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE | ++ DW_IC_CON_RESTART_EN | DW_IC_CON_SPEED_FAST; ++ ++ dev->base = ioremap(mem->start, resource_size(mem)); ++ if (dev->base == NULL) { ++ dev_err(&pdev->dev, "failure mapping io resources\n"); ++ r = -EBUSY; ++ goto err_unuse_clocks; ++ } ++ { ++ u32 param1 = i2c_dw_read_comp_param(dev); ++ ++ dev->tx_fifo_depth = ((param1 >> 16) & 0xff) + 1; ++ dev->rx_fifo_depth = ((param1 >> 8) & 0xff) + 1; ++ } ++ r = i2c_dw_init(dev); ++ if (r) ++ goto err_iounmap; ++ ++ i2c_dw_disable_int(dev); - r = request_irq(dev->irq, i2c_dw_isr, IRQF_DISABLED, pdev->name, dev); +++ r = request_irq(dev->irq, i2c_dw_isr, 0, pdev->name, dev); ++ if (r) { ++ dev_err(&pdev->dev, "failure requesting irq %i\n", dev->irq); ++ goto err_iounmap; ++ } ++ ++ adap = &dev->adapter; ++ i2c_set_adapdata(adap, dev); ++ adap->owner = THIS_MODULE; ++ adap->class = I2C_CLASS_HWMON; ++ strlcpy(adap->name, "Synopsys DesignWare I2C adapter", ++ sizeof(adap->name)); ++ adap->algo = &i2c_dw_algo; ++ adap->dev.parent = &pdev->dev; ++ ++ adap->nr = pdev->id; ++ r = i2c_add_numbered_adapter(adap); ++ if (r) { ++ dev_err(&pdev->dev, "failure adding adapter\n"); ++ goto err_free_irq; ++ } ++ ++ return 0; ++ ++ err_free_irq: ++ free_irq(dev->irq, dev); ++ err_iounmap: ++ iounmap(dev->base); ++ err_unuse_clocks: ++ clk_disable(dev->clk); ++ clk_put(dev->clk); ++ dev->clk = NULL; ++ err_free_mem: ++ platform_set_drvdata(pdev, NULL); ++ put_device(&pdev->dev); ++ kfree(dev); ++ err_release_region: ++ release_mem_region(mem->start, resource_size(mem)); ++ ++ return r; ++ } ++ ++ static int __devexit dw_i2c_remove(struct platform_device *pdev) ++ { ++ struct dw_i2c_dev *dev = platform_get_drvdata(pdev); ++ struct resource *mem; ++ ++ platform_set_drvdata(pdev, NULL); ++ i2c_del_adapter(&dev->adapter); ++ put_device(&pdev->dev); ++ ++ clk_disable(dev->clk); ++ clk_put(dev->clk); ++ dev->clk = NULL; ++ ++ i2c_dw_disable(dev); ++ free_irq(dev->irq, dev); ++ kfree(dev); ++ ++ mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); ++ release_mem_region(mem->start, resource_size(mem)); ++ return 0; ++ } ++ ++ /* work with hotplug and coldplug */ ++ MODULE_ALIAS("platform:i2c_designware"); ++ ++ static struct platform_driver dw_i2c_driver = { ++ .remove = __devexit_p(dw_i2c_remove), ++ .driver = { ++ .name = "i2c_designware", ++ .owner = THIS_MODULE, ++ }, ++ }; ++ ++ static int __init dw_i2c_init_driver(void) ++ { ++ return platform_driver_probe(&dw_i2c_driver, dw_i2c_probe); ++ } ++ module_init(dw_i2c_init_driver); ++ ++ static void __exit dw_i2c_exit_driver(void) ++ { ++ platform_driver_unregister(&dw_i2c_driver); ++ } ++ module_exit(dw_i2c_exit_driver); ++ ++ MODULE_AUTHOR("Baruch Siach "); ++ MODULE_DESCRIPTION("Synopsys DesignWare I2C bus adapter"); ++ MODULE_LICENSE("GPL");