i2c: at91: add dt support to i2c-at91
Signed-off-by: Ludovic Desroches <ludovic.desroches@atmel.com> Acked-by: Nikolaus Voss <n.voss@weinmann.de> Acked-by: Nicolas Ferre <nicolas.ferre@atmel.com> Signed-off-by: Wolfram Sang <w.sang@pengutronix.de>
This commit is contained in:
		
					parent
					
						
							
								94e734655f
							
						
					
				
			
			
				commit
				
					
						70d46a241e
					
				
			
		
					 2 changed files with 79 additions and 0 deletions
				
			
		
							
								
								
									
										30
									
								
								Documentation/devicetree/bindings/i2c/atmel-i2c.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								Documentation/devicetree/bindings/i2c/atmel-i2c.txt
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,30 @@
 | 
			
		|||
I2C for Atmel platforms
 | 
			
		||||
 | 
			
		||||
Required properties :
 | 
			
		||||
- compatible : Must be "atmel,at91rm9200-i2c", "atmel,at91sam9261-i2c",
 | 
			
		||||
     "atmel,at91sam9260-i2c", "atmel,at91sam9g20-i2c", "atmel,at91sam9g10-i2c"
 | 
			
		||||
     or "atmel,at91sam9x5-i2c"
 | 
			
		||||
- reg: physical base address of the controller and length of memory mapped
 | 
			
		||||
     region.
 | 
			
		||||
- interrupts: interrupt number to the cpu.
 | 
			
		||||
- #address-cells = <1>;
 | 
			
		||||
- #size-cells = <0>;
 | 
			
		||||
 | 
			
		||||
Optional properties:
 | 
			
		||||
- Child nodes conforming to i2c bus binding
 | 
			
		||||
 | 
			
		||||
Examples :
 | 
			
		||||
 | 
			
		||||
i2c0: i2c@fff84000 {
 | 
			
		||||
	compatible = "atmel,at91sam9g20-i2c";
 | 
			
		||||
	reg = <0xfff84000 0x100>;
 | 
			
		||||
	interrupts = <12 4 6>;
 | 
			
		||||
	#address-cells = <1>;
 | 
			
		||||
	#size-cells = <0>;
 | 
			
		||||
 | 
			
		||||
	24c512@50 {
 | 
			
		||||
		compatible = "24c512";
 | 
			
		||||
		reg = <0x50>;
 | 
			
		||||
		pagesize = <128>;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -24,6 +24,9 @@
 | 
			
		|||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/io.h>
 | 
			
		||||
#include <linux/module.h>
 | 
			
		||||
#include <linux/of.h>
 | 
			
		||||
#include <linux/of_device.h>
 | 
			
		||||
#include <linux/of_i2c.h>
 | 
			
		||||
#include <linux/platform_device.h>
 | 
			
		||||
#include <linux/slab.h>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -347,6 +350,12 @@ static struct at91_twi_pdata at91sam9g10_config = {
 | 
			
		|||
	.has_unre_flag = false,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static struct at91_twi_pdata at91sam9x5_config = {
 | 
			
		||||
	.clk_max_div = 7,
 | 
			
		||||
	.clk_offset = 4,
 | 
			
		||||
	.has_unre_flag = false,
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
static const struct platform_device_id at91_twi_devtypes[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.name = "i2c-at91rm9200",
 | 
			
		||||
| 
						 | 
				
			
			@ -368,6 +377,42 @@ static const struct platform_device_id at91_twi_devtypes[] = {
 | 
			
		|||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if defined(CONFIG_OF)
 | 
			
		||||
static const struct of_device_id atmel_twi_dt_ids[] = {
 | 
			
		||||
	{
 | 
			
		||||
		.compatible = "atmel,at91sam9260-i2c",
 | 
			
		||||
		.data = &at91sam9260_config,
 | 
			
		||||
	} , {
 | 
			
		||||
		.compatible = "atmel,at91sam9g20-i2c",
 | 
			
		||||
		.data = &at91sam9g20_config,
 | 
			
		||||
	} , {
 | 
			
		||||
		.compatible = "atmel,at91sam9g10-i2c",
 | 
			
		||||
		.data = &at91sam9g10_config,
 | 
			
		||||
	}, {
 | 
			
		||||
		.compatible = "atmel,at91sam9x5-i2c",
 | 
			
		||||
		.data = &at91sam9x5_config,
 | 
			
		||||
	}, {
 | 
			
		||||
		/* sentinel */
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
MODULE_DEVICE_TABLE(of, atmel_twi_dt_ids);
 | 
			
		||||
#else
 | 
			
		||||
#define atmel_twi_dt_ids NULL
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
static struct at91_twi_pdata * __devinit at91_twi_get_driver_data(
 | 
			
		||||
					struct platform_device *pdev)
 | 
			
		||||
{
 | 
			
		||||
	if (pdev->dev.of_node) {
 | 
			
		||||
		const struct of_device_id *match;
 | 
			
		||||
		match = of_match_node(atmel_twi_dt_ids, pdev->dev.of_node);
 | 
			
		||||
		if (!match)
 | 
			
		||||
			return NULL;
 | 
			
		||||
		return match->data;
 | 
			
		||||
	}
 | 
			
		||||
	return (struct at91_twi_pdata *) platform_get_device_id(pdev)->driver_data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int __devinit at91_twi_probe(struct platform_device *pdev)
 | 
			
		||||
{
 | 
			
		||||
	struct at91_twi_dev *dev;
 | 
			
		||||
| 
						 | 
				
			
			@ -423,6 +468,7 @@ static int __devinit at91_twi_probe(struct platform_device *pdev)
 | 
			
		|||
	dev->adapter.dev.parent = dev->dev;
 | 
			
		||||
	dev->adapter.nr = pdev->id;
 | 
			
		||||
	dev->adapter.timeout = AT91_I2C_TIMEOUT;
 | 
			
		||||
	dev->adapter.dev.of_node = pdev->dev.of_node;
 | 
			
		||||
 | 
			
		||||
	rc = i2c_add_numbered_adapter(&dev->adapter);
 | 
			
		||||
	if (rc) {
 | 
			
		||||
| 
						 | 
				
			
			@ -432,6 +478,8 @@ static int __devinit at91_twi_probe(struct platform_device *pdev)
 | 
			
		|||
		return rc;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	of_i2c_register_devices(&dev->adapter);
 | 
			
		||||
 | 
			
		||||
	dev_info(dev->dev, "AT91 i2c bus driver.\n");
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -482,6 +530,7 @@ static struct platform_driver at91_twi_driver = {
 | 
			
		|||
	.driver		= {
 | 
			
		||||
		.name	= "at91_i2c",
 | 
			
		||||
		.owner	= THIS_MODULE,
 | 
			
		||||
		.of_match_table = atmel_twi_dt_ids,
 | 
			
		||||
		.pm	= at91_twi_pm_ops,
 | 
			
		||||
	},
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue