Commit 40ce1c04 authored by Vaibhav Gupta's avatar Vaibhav Gupta

software: kernel: i2c: Use 'idr' instead of 'pdev'

The si570 i2c handler is used only to configure the clock at an early
stage, and never after. Thus, we don't require to save platform related
data of the i2c handler, and only the 'idr' should be enough.

Also because we can't do much with 'struct platform_device' data, but
with 'idr', we can obtain adapter and do data transfer via i2c APIs.

We can always retrieve the 'struct platform_device' data related to this
i2c_handler from its 'idr' if needed, for example in *exit().
Signed-off-by: 's avatarVaibhav Gupta <vaibhav.gupta@cern.ch>
parent 4d0aedfd
......@@ -37,7 +37,25 @@ static struct ocores_i2c_platform_data si570_i2c_master_data = {
.num_devices = ARRAY_SIZE(si570_i2c_board_info),
};
static int fa_si570_i2c_find_adapter(struct device *dev, void *data)
{
struct i2c_adapter *adap;
struct platform_device *pdev = data;
if (dev->type != &i2c_adapter_type)
return 0;
adap = to_i2c_adapter(dev);
if(adap->dev.parent != &pdev->dev)
return 0;
return adap->nr;
}
int fa_si570_i2c_init(struct fa_dev *fa) {
int idr;
struct platform_device *pdev;
struct resource *rmem;
......@@ -66,11 +84,27 @@ int fa_si570_i2c_init(struct fa_dev *fa) {
return -1;
}
fa->si570_i2c_pdev = pdev;
idr = i2c_for_each_dev(pdev, fa_si570_i2c_find_adapter);
if(idr < 0){
dev_err(&fa->pdev->dev, "Could not acquire i2C Adapter\n");
return idr;
}
fa->si570_i2c_adapter_nr = idr;
return 0;
}
void fa_si570_i2c_exit(struct fa_dev *fa) {
platform_device_unregister(fa->si570_i2c_pdev);
struct i2c_adapter *adap;
struct platform_device *pdev;
adap = i2c_get_adapter(fa->si570_i2c_adapter_nr);
pdev = container_of(adap->dev.parent, struct platform_device,
dev);
i2c_put_adapter(adap);
platform_device_unregister(pdev);
}
......@@ -319,7 +319,7 @@ struct fa_dev {
void *fa_irq_adc_base;
void *fa_utc_base;
struct platform_device *si570_i2c_pdev;
int si570_i2c_adapter_nr;
/* DMA description */
struct zio_dma_sgt *zdma;
struct sg_table sgt;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment