diff mbox

[v2,2/2] drivers/platform/x86: add mlxcpld-hotplug driver registration to mlx-platform driver

Message ID 1477598154-4459-1-git-send-email-vadimp@mellanox.com (mailing list archive)
State Accepted, archived
Delegated to: Andy Shevchenko
Headers show

Commit Message

Vadim Pasternak Oct. 27, 2016, 7:55 p.m. UTC
Add calls for mlxcpld-hotplug platform driver registration/unregistration
and add platform hotplug data configurations. This driver, when registered
within system will handle system hot-plug events for the power suppliers,
power cables and fans (insertion and removing). These events are
controlled through CPLD Lattice device.

Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>
v1->v2:
 Comments pointed out by Andy:
  - Remove "from sender" from the message body;
  - Add more information to commit message. (When CPLD spec will be
    available at Mellanox portal - MAINTAINERS Web-page info is to
    be updated);
  - Do not change include order.
---
 drivers/platform/x86/mlx-platform.c | 98 ++++++++++++++++++++++++++++++++++++-
 1 file changed, 97 insertions(+), 1 deletion(-)

Comments

Andy Shevchenko Oct. 27, 2016, 6:24 p.m. UTC | #1
Same comment regarding series (Use --thread to git send-email)

On Thu, 2016-10-27 at 19:55 +0000, Vadim Pasternak wrote:
> Add calls for mlxcpld-hotplug platform driver
> registration/unregistration
> and add platform hotplug data configurations. This driver, when
> registered
> within system will handle system hot-plug events for the power
> suppliers,
> power cables and fans (insertion and removing). These events are
> controlled through CPLD Lattice device.
> 
> Signed-off-by: Vadim Pasternak <vadimp@mellanox.com>

> v1->v2:
>  Comments pointed out by Andy:
>   - Remove "from sender" from the message body;
>   - Add more information to commit message. (When CPLD spec will be
>     available at Mellanox portal - MAINTAINERS Web-page info is to
>     be updated);
>   - Do not change include order.

Same comment. Put it below '---' line.

> ---
> 

> @@ -121,7 +123,87 @@ static struct i2c_mux_reg_platform_data
> mlxplat_mux_data[] = {
>  
>  };
>  

> -static struct platform_device *mlxplat_dev;

Why did you move it? Seems like it's not needed in this patch.

> +/* Platform hotplug devices */
> +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_psu[] = 

I_really_like_long_names_of_variables. No, I don't.

> +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_pwr[] =
> +static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_fan[] =
> +static
> +struct mlxcpld_hotplug_platform_data
> mlxplat_mlxcpld_hotplug_default_data = {


> +	.top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a),

| ?! Can you elaborate why it's ORred and not just added?

Besides that redundant parens.

> +	.top_aggr_mask = 0x48,
> +	.top_aggr_psu_mask = 0x08,

And above explanation might shed a light why you are using interesting
masks like 0b101.

> +	.psu_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x58),
> +	.psu_mask = 0x03,

GENMASK()?

> +	.psu_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_psu),
> +	.psu = mlxplat_mlxcpld_hotplug_psu,
> +	.top_aggr_pwr_mask = 0x08,
> +	.pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64),
> +	.pwr_mask = 0x03,
> +	.pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr),
> +	.pwr = mlxplat_mlxcpld_hotplug_pwr,
> +	.top_aggr_fan_mask = 0x40,
> +	.fan_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x88),
> +	.fan_mask = 0x0f,
> +	.fan_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_fan),
> +	.fan = mlxplat_mlxcpld_hotplug_fan,

Wouldn't be cleaner like this:

struct hotplug_dev_pdata {
 reg_offset;
 mask;
 count;
 void *somethig;
};

struct hotplug_pdata {
 /* top stuff, will see later how to put it here */

 struct hotplug_dev_data psu;
 struct hotplug_dev_data pwr;
 struct hotplug_dev_data fan;
};

> +};
> +
> +/* Platform hotplug MSN21xx system family data */
> +static
> +struct mlxcpld_hotplug_platform_data
> mlxplat_mlxcpld_hotplug_msn21xx_data = {
> +	.top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a),
> +	.top_aggr_mask = 0x04,
> +	.top_aggr_pwr_mask = 0x04,
> +	.pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64),
> +	.pwr_mask = 0x03,
> +	.pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr),
> +};
> +
> +static struct resource mlxplat_mlxcpld_hotplug_resources[] = {
> +	[0] = DEFINE_RES_IRQ_NAMED(17, "mlxcpld-hotplug"),
> +};
> +
> +struct platform_device *mlxplat_dev;
> +struct mlxcpld_hotplug_platform_data *mlxplat_hotplug;
>  
>  static int __init mlxplat_dmi_default_matched(const struct
> dmi_system_id *dmi)
>  {
> @@ -132,6 +214,7 @@ static int __init
> mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
>  		mlxplat_mux_data[i].n_values =
>  				ARRAY_SIZE(mlxplat_default_channels[i
> ]);
>  	}

> +	mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_default_data;

Is it only one hotplug device at a time? Otherwise it will be affected
by race conditions.

>  
>  	return 1;
>  };
> @@ -145,6 +228,7 @@ static int __init
> mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
>  		mlxplat_mux_data[i].n_values =
>  				ARRAY_SIZE(mlxplat_msn21xx_channels);
>  	}
> +	mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_msn21xx_data;
>  
>  	return 1;
>  };
> @@ -230,6 +314,16 @@ static int __init mlxplat_init(void)
>  		}
>  	}
>  
> +	priv->pdev_hotplug = platform_device_register_resndata(
> +				&mlxplat_dev->dev, "mlxcpld-hotplug", 

> -1,

Isn't it something like PLATFORM_DEVID_AUTO / NONE ?

> +				mlxplat_mlxcpld_hotplug_resources,
> +				ARRAY_SIZE(mlxplat_mlxcpld_hotplug_re
> sources),
> +				mlxplat_hotplug,
> sizeof(*mlxplat_hotplug));
> +	if (IS_ERR(priv->pdev_hotplug)) {
> +		err = PTR_ERR(priv->pdev_hotplug);
> +		goto fail_platform_mux_register;
> +	}
> +
>  	return 0;
>  
>  fail_platform_mux_register:
> @@ -248,6 +342,8 @@ static void __exit mlxplat_exit(void)
>  	struct mlxplat_priv *priv =
> platform_get_drvdata(mlxplat_dev);
>  	int i;
>  
> +	platform_device_unregister(priv->pdev_hotplug);
> +
>  	for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--)
>  		platform_device_unregister(priv->pdev_mux[i]);
>
Vadim Pasternak Oct. 27, 2016, 7:14 p.m. UTC | #2
DQoNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogQW5keSBTaGV2Y2hlbmtv
IFttYWlsdG86YW5kcml5LnNoZXZjaGVua29AbGludXguaW50ZWwuY29tXQ0KPiBTZW50OiBUaHVy
c2RheSwgT2N0b2JlciAyNywgMjAxNiA5OjI1IFBNDQo+IFRvOiBWYWRpbSBQYXN0ZXJuYWsgPHZh
ZGltcEBtZWxsYW5veC5jb20+OyBkdmhhcnRAaW5mcmFkZWFkLm9yZzsNCj4gZmVuZ2d1YW5nLnd1
QGludGVsLmNvbQ0KPiBDYzogZGF2ZW1AZGF2ZW1sb2Z0Lm5ldDsgZ2VlcnRAbGludXgtbTY4ay5v
cmc7IGFrcG1AbGludXgtDQo+IGZvdW5kYXRpb24ub3JnOyBrdmFsb0Bjb2RlYXVyb3JhLm9yZzsg
Z3JlZ2toQGxpbnV4Zm91bmRhdGlvbi5vcmc7DQo+IG1jaGVoYWJAa2VybmVsLm9yZzsgbGludXhA
cm9lY2stdXMubmV0OyBsaW51eC1rZXJuZWxAdmdlci5rZXJuZWwub3JnOw0KPiBwbGF0Zm9ybS1k
cml2ZXIteDg2QHZnZXIua2VybmVsLm9yZzsgamlyaUByZXNudWxsaS51cw0KPiBTdWJqZWN0OiBS
ZTogW3BhdGNoIHYyIDIvMl0gZHJpdmVycy9wbGF0Zm9ybS94ODY6IGFkZCBtbHhjcGxkLWhvdHBs
dWcgZHJpdmVyDQo+IHJlZ2lzdHJhdGlvbiB0byBtbHgtcGxhdGZvcm0gZHJpdmVyDQo+IA0KPiBT
YW1lIGNvbW1lbnQgcmVnYXJkaW5nIHNlcmllcyAoVXNlIC0tdGhyZWFkIHRvIGdpdCBzZW5kLWVt
YWlsKQ0KPiANCj4gT24gVGh1LCAyMDE2LTEwLTI3IGF0IDE5OjU1ICswMDAwLCBWYWRpbSBQYXN0
ZXJuYWsgd3JvdGU6DQo+ID4gQWRkIGNhbGxzIGZvciBtbHhjcGxkLWhvdHBsdWcgcGxhdGZvcm0g
ZHJpdmVyDQo+ID4gcmVnaXN0cmF0aW9uL3VucmVnaXN0cmF0aW9uIGFuZCBhZGQgcGxhdGZvcm0g
aG90cGx1ZyBkYXRhDQo+ID4gY29uZmlndXJhdGlvbnMuIFRoaXMgZHJpdmVyLCB3aGVuIHJlZ2lz
dGVyZWQgd2l0aGluIHN5c3RlbSB3aWxsIGhhbmRsZQ0KPiA+IHN5c3RlbSBob3QtcGx1ZyBldmVu
dHMgZm9yIHRoZSBwb3dlciBzdXBwbGllcnMsIHBvd2VyIGNhYmxlcyBhbmQgZmFucw0KPiA+IChp
bnNlcnRpb24gYW5kIHJlbW92aW5nKS4gVGhlc2UgZXZlbnRzIGFyZSBjb250cm9sbGVkIHRocm91
Z2ggQ1BMRA0KPiA+IExhdHRpY2UgZGV2aWNlLg0KPiA+DQo+ID4gU2lnbmVkLW9mZi1ieTogVmFk
aW0gUGFzdGVybmFrIDx2YWRpbXBAbWVsbGFub3guY29tPg0KPiANCj4gPiB2MS0+djI6DQo+ID4g
wqBDb21tZW50cyBwb2ludGVkIG91dCBieSBBbmR5Og0KPiA+IMKgIC0gUmVtb3ZlICJmcm9tIHNl
bmRlciIgZnJvbSB0aGUgbWVzc2FnZSBib2R5Ow0KPiA+IMKgIC0gQWRkIG1vcmUgaW5mb3JtYXRp
b24gdG8gY29tbWl0IG1lc3NhZ2UuIChXaGVuIENQTEQgc3BlYyB3aWxsIGJlDQo+ID4gwqDCoMKg
wqBhdmFpbGFibGUgYXQgTWVsbGFub3ggcG9ydGFsIC0gTUFJTlRBSU5FUlMgV2ViLXBhZ2UgaW5m
byBpcyB0bw0KPiA+IMKgwqDCoMKgYmUgdXBkYXRlZCk7DQo+ID4gwqAgLSBEbyBub3QgY2hhbmdl
IGluY2x1ZGUgb3JkZXIuDQo+IA0KPiBTYW1lIGNvbW1lbnQuIFB1dCBpdCBiZWxvdyAnLS0tJyBs
aW5lLg0KPiANCj4gPiAtLS0NCj4gPg0KPiANCj4gPiBAQCAtMTIxLDcgKzEyMyw4NyBAQCBzdGF0
aWMgc3RydWN0IGkyY19tdXhfcmVnX3BsYXRmb3JtX2RhdGENCj4gPiBtbHhwbGF0X211eF9kYXRh
W10gPSB7DQo+ID4NCj4gPiDCoH07DQo+ID4NCj4gDQo+ID4gLXN0YXRpYyBzdHJ1Y3QgcGxhdGZv
cm1fZGV2aWNlICptbHhwbGF0X2RldjsNCj4gDQo+IFdoeSBkaWQgeW91IG1vdmUgaXQ/IFNlZW1z
IGxpa2UgaXQncyBub3QgbmVlZGVkIGluIHRoaXMgcGF0Y2guDQoNCkp1c3QgYnkgbWlzdGFrZS4N
ClNvcnJ5Lg0KDQo+IA0KPiA+ICsvKiBQbGF0Zm9ybSBob3RwbHVnIGRldmljZXMgKi8NCj4gPiAr
c3RhdGljIHN0cnVjdCBtbHhjcGxkX2hvdHBsdWdfZGV2aWNlIG1seHBsYXRfbWx4Y3BsZF9ob3Rw
bHVnX3BzdVtdID0NCj4gDQo+IElfcmVhbGx5X2xpa2VfbG9uZ19uYW1lc19vZl92YXJpYWJsZXMu
IE5vLCBJIGRvbid0Lg0KDQpJIGtlZXAgcHJlZml4IG1seHBsYXRfbWx4Y3BsZCBmb3IgY29uc2lz
dGVuY3kuDQpNYXliZSBJIGNhbiByZW1vdmUgIiBob3RwbHVnXyIgdG8gbWFrZSB2YXJpYWJsZSBz
aG9ydGVyPw0KDQo+IA0KPiA+ICtzdGF0aWMgc3RydWN0IG1seGNwbGRfaG90cGx1Z19kZXZpY2Ug
bWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHdyW10gPQ0KPiA+ICtzdGF0aWMgc3RydWN0IG1seGNw
bGRfaG90cGx1Z19kZXZpY2UgbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfZmFuW10gPQ0KPiA+ICtz
dGF0aWMgc3RydWN0IG1seGNwbGRfaG90cGx1Z19wbGF0Zm9ybV9kYXRhDQo+ID4gbWx4cGxhdF9t
bHhjcGxkX2hvdHBsdWdfZGVmYXVsdF9kYXRhID0gew0KPiANCj4gDQo+ID4gKwkudG9wX2FnZ3Jf
b2Zmc2V0ID0gKE1MWFBMQVRfQ1BMRF9MUENfUkVHX0JBU0VfQURSUiB8IDB4M2EpLA0KPiANCj4g
fCA/ISBDYW4geW91IGVsYWJvcmF0ZSB3aHkgaXQncyBPUnJlZCBhbmQgbm90IGp1c3QgYWRkZWQ/
DQo+IA0KPiBCZXNpZGVzIHRoYXQgcmVkdW5kYW50IHBhcmVucy4NCg0KV2lsbCByZW1vdmUgcGFy
ZW5zIGFuZCBjaGFuZ2UgIm9yIiB0byArIChubyBzcGVjaWFsIHJlYXNvbikuDQoNCj4gDQo+ID4g
KwkudG9wX2FnZ3JfbWFzayA9IDB4NDgsDQo+ID4gKwkudG9wX2FnZ3JfcHN1X21hc2sgPSAweDA4
LA0KPiANCj4gQW5kIGFib3ZlIGV4cGxhbmF0aW9uIG1pZ2h0IHNoZWQgYSBsaWdodCB3aHkgeW91
IGFyZSB1c2luZyBpbnRlcmVzdGluZw0KPiBtYXNrcyBsaWtlIDBiMTAxLg0KDQpXaWxsIGFkZCBj
b21tZW50cyBmb3IgbWFza3MgKGp1c3QgMHg0MCBpcyBtYXNraW5nIGluIENQTEQgYWdncmVnYXRp
b24gcmVnaXN0ZXIgUFNVIGFuZCBQV1IgZXZlbnRzLCAweDA4IC0gRkFOIGV2ZW50cykgZm9yIGRl
ZmF1bHQgc3lzdGVtIHR5cGUuDQoNCj4gDQo+ID4gKwkucHN1X3JlZ19vZmZzZXQgPSAoTUxYUExB
VF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSIHwgMHg1OCksDQo+ID4gKwkucHN1X21hc2sgPSAweDAz
LA0KPiANCj4gR0VOTUFTSygpPw0KDQpPSywgd2lsbCBjaGFuZ2UgaXQgdG8NCi5wc3VfbWFzayA9
IEdFTk1BU0soMCwgMSkgYW5kIG90aGVyIGFwcGVhcmFuY2VzLg0KDQo+IA0KPiA+ICsJLnBzdV9j
b3VudCA9IEFSUkFZX1NJWkUobWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHN1KSwNCj4gPiArCS5w
c3UgPSBtbHhwbGF0X21seGNwbGRfaG90cGx1Z19wc3UsDQo+ID4gKwkudG9wX2FnZ3JfcHdyX21h
c2sgPSAweDA4LA0KPiA+ICsJLnB3cl9yZWdfb2Zmc2V0ID0gKE1MWFBMQVRfQ1BMRF9MUENfUkVH
X0JBU0VfQURSUiB8IDB4NjQpLA0KPiA+ICsJLnB3cl9tYXNrID0gMHgwMywNCj4gPiArCS5wd3Jf
Y291bnQgPSBBUlJBWV9TSVpFKG1seHBsYXRfbWx4Y3BsZF9ob3RwbHVnX3B3ciksDQo+ID4gKwku
cHdyID0gbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcHdyLA0KPiA+ICsJLnRvcF9hZ2dyX2Zhbl9t
YXNrID0gMHg0MCwNCj4gPiArCS5mYW5fcmVnX29mZnNldCA9IChNTFhQTEFUX0NQTERfTFBDX1JF
R19CQVNFX0FEUlIgfCAweDg4KSwNCj4gPiArCS5mYW5fbWFzayA9IDB4MGYsDQo+ID4gKwkuZmFu
X2NvdW50ID0gQVJSQVlfU0laRShtbHhwbGF0X21seGNwbGRfaG90cGx1Z19mYW4pLA0KPiA+ICsJ
LmZhbiA9IG1seHBsYXRfbWx4Y3BsZF9ob3RwbHVnX2ZhbiwNCj4gDQo+IFdvdWxkbid0IGJlIGNs
ZWFuZXIgbGlrZSB0aGlzOg0KPiANCj4gc3RydWN0IGhvdHBsdWdfZGV2X3BkYXRhIHsNCj4gIHJl
Z19vZmZzZXQ7DQo+ICBtYXNrOw0KPiAgY291bnQ7DQo+ICB2b2lkICpzb21ldGhpZzsNCj4gfTsN
Cj4gDQo+IHN0cnVjdCBob3RwbHVnX3BkYXRhIHsNCj4gIC8qIHRvcCBzdHVmZiwgd2lsbCBzZWUg
bGF0ZXIgaG93IHRvIHB1dCBpdCBoZXJlICovDQo+IA0KPiAgc3RydWN0IGhvdHBsdWdfZGV2X2Rh
dGEgcHN1Ow0KPiAgc3RydWN0IGhvdHBsdWdfZGV2X2RhdGEgcHdyOw0KPiAgc3RydWN0IGhvdHBs
dWdfZGV2X2RhdGEgZmFuOw0KPiB9Ow0KDQpJIHdpbGwgY29uc2lkZXIgdGhpcyBjaGFuZ2UgZm9y
IHRoZSBuZXh0IHBhdGNoLg0KDQo+IA0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyogUGxhdGZvcm0g
aG90cGx1ZyBNU04yMXh4IHN5c3RlbSBmYW1pbHkgZGF0YSAqLw0KPiA+ICtzdGF0aWMNCj4gPiAr
c3RydWN0IG1seGNwbGRfaG90cGx1Z19wbGF0Zm9ybV9kYXRhDQo+ID4gbWx4cGxhdF9tbHhjcGxk
X2hvdHBsdWdfbXNuMjF4eF9kYXRhID0gew0KPiA+ICsJLnRvcF9hZ2dyX29mZnNldCA9IChNTFhQ
TEFUX0NQTERfTFBDX1JFR19CQVNFX0FEUlIgfCAweDNhKSwNCj4gPiArCS50b3BfYWdncl9tYXNr
ID0gMHgwNCwNCj4gPiArCS50b3BfYWdncl9wd3JfbWFzayA9IDB4MDQsDQo+ID4gKwkucHdyX3Jl
Z19vZmZzZXQgPSAoTUxYUExBVF9DUExEX0xQQ19SRUdfQkFTRV9BRFJSIHwgMHg2NCksDQo+ID4g
KwkucHdyX21hc2sgPSAweDAzLA0KPiA+ICsJLnB3cl9jb3VudCA9IEFSUkFZX1NJWkUobWx4cGxh
dF9tbHhjcGxkX2hvdHBsdWdfcHdyKSwNCj4gPiArfTsNCj4gPiArDQo+ID4gK3N0YXRpYyBzdHJ1
Y3QgcmVzb3VyY2UgbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcmVzb3VyY2VzW10gPSB7DQo+ID4g
KwlbMF0gPSBERUZJTkVfUkVTX0lSUV9OQU1FRCgxNywgIm1seGNwbGQtaG90cGx1ZyIpLA0KPiA+
ICt9Ow0KPiA+ICsNCj4gPiArc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbWx4cGxhdF9kZXY7DQo+
ID4gK3N0cnVjdCBtbHhjcGxkX2hvdHBsdWdfcGxhdGZvcm1fZGF0YSAqbWx4cGxhdF9ob3RwbHVn
Ow0KPiA+DQo+ID4gwqBzdGF0aWMgaW50IF9faW5pdCBtbHhwbGF0X2RtaV9kZWZhdWx0X21hdGNo
ZWQoY29uc3Qgc3RydWN0DQo+ID4gZG1pX3N5c3RlbV9pZCAqZG1pKQ0KPiA+IMKgew0KPiA+IEBA
IC0xMzIsNiArMjE0LDcgQEAgc3RhdGljIGludCBfX2luaXQNCj4gPiBtbHhwbGF0X2RtaV9kZWZh
dWx0X21hdGNoZWQoY29uc3Qgc3RydWN0IGRtaV9zeXN0ZW1faWQgKmRtaSkNCj4gPiDCoAkJbWx4
cGxhdF9tdXhfZGF0YVtpXS5uX3ZhbHVlcyA9DQo+ID4gwqAJCQkJQVJSQVlfU0laRShtbHhwbGF0
X2RlZmF1bHRfY2hhbm5lbHNbaQ0KPiA+IF0pOw0KPiA+IMKgCX0NCj4gDQo+ID4gKwltbHhwbGF0
X2hvdHBsdWcgPSAmbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfZGVmYXVsdF9kYXRhOw0KPiANCj4g
SXMgaXQgb25seSBvbmUgaG90cGx1ZyBkZXZpY2UgYXQgYSB0aW1lPyBPdGhlcndpc2UgaXQgd2ls
bCBiZSBhZmZlY3RlZA0KPiBieSByYWNlIGNvbmRpdGlvbnMuDQo+IA0KDQpPbmx5IG9uZSBDUExE
IHBlciBib3gsIHdoaWNoIGhhbmRsZXMgYWxsIHRoZSBldmVudHMuDQoNCj4gPg0KPiA+IMKgCXJl
dHVybiAxOw0KPiA+IMKgfTsNCj4gPiBAQCAtMTQ1LDYgKzIyOCw3IEBAIHN0YXRpYyBpbnQgX19p
bml0DQo+ID4gbWx4cGxhdF9kbWlfbXNuMjF4eF9tYXRjaGVkKGNvbnN0IHN0cnVjdCBkbWlfc3lz
dGVtX2lkICpkbWkpDQo+ID4gwqAJCW1seHBsYXRfbXV4X2RhdGFbaV0ubl92YWx1ZXMgPQ0KPiA+
IMKgCQkJCUFSUkFZX1NJWkUobWx4cGxhdF9tc24yMXh4X2NoYW5uZWxzKTsNCj4gPiDCoAl9DQo+
ID4gKwltbHhwbGF0X2hvdHBsdWcgPSAmbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfbXNuMjF4eF9k
YXRhOw0KPiA+DQo+ID4gwqAJcmV0dXJuIDE7DQo+ID4gwqB9Ow0KPiA+IEBAIC0yMzAsNiArMzE0
LDE2IEBAIHN0YXRpYyBpbnQgX19pbml0IG1seHBsYXRfaW5pdCh2b2lkKQ0KPiA+IMKgCQl9DQo+
ID4gwqAJfQ0KPiA+DQo+ID4gKwlwcml2LT5wZGV2X2hvdHBsdWcgPSBwbGF0Zm9ybV9kZXZpY2Vf
cmVnaXN0ZXJfcmVzbmRhdGEoDQo+ID4gKwkJCQkmbWx4cGxhdF9kZXYtPmRldiwgIm1seGNwbGQt
aG90cGx1ZyIsDQo+IA0KPiA+IC0xLA0KPiANCj4gSXNuJ3QgaXQgc29tZXRoaW5nIGxpa2UgUExB
VEZPUk1fREVWSURfQVVUTyAvIE5PTkUgPw0KDQpXaWxsIGNoYW5nZSAtMSB0byBQTEFURk9STV9E
RVZJRF9OT05FLg0KDQo+IA0KPiA+ICsJCQkJbWx4cGxhdF9tbHhjcGxkX2hvdHBsdWdfcmVzb3Vy
Y2VzLA0KPiA+ICsJCQkJQVJSQVlfU0laRShtbHhwbGF0X21seGNwbGRfaG90cGx1Z19yZQ0KPiA+
IHNvdXJjZXMpLA0KPiA+ICsJCQkJbWx4cGxhdF9ob3RwbHVnLA0KPiA+IHNpemVvZigqbWx4cGxh
dF9ob3RwbHVnKSk7DQo+ID4gKwlpZiAoSVNfRVJSKHByaXYtPnBkZXZfaG90cGx1ZykpIHsNCj4g
PiArCQllcnIgPSBQVFJfRVJSKHByaXYtPnBkZXZfaG90cGx1Zyk7DQo+ID4gKwkJZ290byBmYWls
X3BsYXRmb3JtX211eF9yZWdpc3RlcjsNCj4gPiArCX0NCj4gPiArDQo+ID4gwqAJcmV0dXJuIDA7
DQo+ID4NCj4gPiDCoGZhaWxfcGxhdGZvcm1fbXV4X3JlZ2lzdGVyOg0KPiA+IEBAIC0yNDgsNiAr
MzQyLDggQEAgc3RhdGljIHZvaWQgX19leGl0IG1seHBsYXRfZXhpdCh2b2lkKQ0KPiA+IMKgCXN0
cnVjdCBtbHhwbGF0X3ByaXYgKnByaXYgPQ0KPiA+IHBsYXRmb3JtX2dldF9kcnZkYXRhKG1seHBs
YXRfZGV2KTsNCj4gPiDCoAlpbnQgaTsNCj4gPg0KPiA+ICsJcGxhdGZvcm1fZGV2aWNlX3VucmVn
aXN0ZXIocHJpdi0+cGRldl9ob3RwbHVnKTsNCj4gPiArDQo+ID4gwqAJZm9yIChpID0gQVJSQVlf
U0laRShtbHhwbGF0X211eF9kYXRhKSAtIDE7IGkgPj0gMCA7IGktLSkNCj4gPiDCoAkJcGxhdGZv
cm1fZGV2aWNlX3VucmVnaXN0ZXIocHJpdi0+cGRldl9tdXhbaV0pOw0KPiA+DQo+IA0KPiAtLQ0K
PiBBbmR5IFNoZXZjaGVua28gPGFuZHJpeS5zaGV2Y2hlbmtvQGxpbnV4LmludGVsLmNvbT4NCj4g
SW50ZWwgRmlubGFuZCBPeQ0KDQpUaGFuayB5b3UgZm9yIHJldmlldywNClZhZGltLg0K
--
To unsubscribe from this list: send the line "unsubscribe platform-driver-x86" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/drivers/platform/x86/mlx-platform.c b/drivers/platform/x86/mlx-platform.c
index 86a1356..569d79a 100644
--- a/drivers/platform/x86/mlx-platform.c
+++ b/drivers/platform/x86/mlx-platform.c
@@ -39,6 +39,7 @@ 
 #include <linux/module.h>
 #include <linux/platform_device.h>
 #include <linux/platform_data/i2c-mux-reg.h>
+#include <linux/platform_data/mlxcpld-hotplug.h>
 
 #define MLX_PLAT_DEVICE_NAME		"mlxplat"
 
@@ -70,6 +71,7 @@ 
 struct mlxplat_priv {
 	struct platform_device *pdev_i2c;
 	struct platform_device *pdev_mux[MLXPLAT_CPLD_LPC_MUX_DEVS];
+	struct platform_device *pdev_hotplug;
 };
 
 /* Regions for LPC I2C controller and LPC base register space */
@@ -121,7 +123,87 @@  static struct i2c_mux_reg_platform_data mlxplat_mux_data[] = {
 
 };
 
-static struct platform_device *mlxplat_dev;
+/* Platform hotplug devices */
+static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_psu[] = {
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c02", 0x51) },
+		.bus = 10,
+	},
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c02", 0x50) },
+		.bus = 10,
+	},
+};
+
+static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_pwr[] = {
+	{
+		.brdinfo = { I2C_BOARD_INFO("dps460", 0x59) },
+		.bus = 10,
+	},
+	{
+		.brdinfo = { I2C_BOARD_INFO("dps460", 0x58) },
+		.bus = 10,
+	},
+};
+
+static struct mlxcpld_hotplug_device mlxplat_mlxcpld_hotplug_fan[] = {
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c32", 0x50) },
+		.bus = 11,
+	},
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c32", 0x50) },
+		.bus = 12,
+	},
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c32", 0x50) },
+		.bus = 13,
+	},
+	{
+		.brdinfo = { I2C_BOARD_INFO("24c32", 0x50) },
+		.bus = 14,
+	},
+};
+
+/* Platform hotplug default data */
+static
+struct mlxcpld_hotplug_platform_data mlxplat_mlxcpld_hotplug_default_data = {
+	.top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a),
+	.top_aggr_mask = 0x48,
+	.top_aggr_psu_mask = 0x08,
+	.psu_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x58),
+	.psu_mask = 0x03,
+	.psu_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_psu),
+	.psu = mlxplat_mlxcpld_hotplug_psu,
+	.top_aggr_pwr_mask = 0x08,
+	.pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64),
+	.pwr_mask = 0x03,
+	.pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr),
+	.pwr = mlxplat_mlxcpld_hotplug_pwr,
+	.top_aggr_fan_mask = 0x40,
+	.fan_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x88),
+	.fan_mask = 0x0f,
+	.fan_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_fan),
+	.fan = mlxplat_mlxcpld_hotplug_fan,
+};
+
+/* Platform hotplug MSN21xx system family data */
+static
+struct mlxcpld_hotplug_platform_data mlxplat_mlxcpld_hotplug_msn21xx_data = {
+	.top_aggr_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x3a),
+	.top_aggr_mask = 0x04,
+	.top_aggr_pwr_mask = 0x04,
+	.pwr_reg_offset = (MLXPLAT_CPLD_LPC_REG_BASE_ADRR | 0x64),
+	.pwr_mask = 0x03,
+	.pwr_count = ARRAY_SIZE(mlxplat_mlxcpld_hotplug_pwr),
+};
+
+static struct resource mlxplat_mlxcpld_hotplug_resources[] = {
+	[0] = DEFINE_RES_IRQ_NAMED(17, "mlxcpld-hotplug"),
+};
+
+struct platform_device *mlxplat_dev;
+struct mlxcpld_hotplug_platform_data *mlxplat_hotplug;
 
 static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
 {
@@ -132,6 +214,7 @@  static int __init mlxplat_dmi_default_matched(const struct dmi_system_id *dmi)
 		mlxplat_mux_data[i].n_values =
 				ARRAY_SIZE(mlxplat_default_channels[i]);
 	}
+	mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_default_data;
 
 	return 1;
 };
@@ -145,6 +228,7 @@  static int __init mlxplat_dmi_msn21xx_matched(const struct dmi_system_id *dmi)
 		mlxplat_mux_data[i].n_values =
 				ARRAY_SIZE(mlxplat_msn21xx_channels);
 	}
+	mlxplat_hotplug = &mlxplat_mlxcpld_hotplug_msn21xx_data;
 
 	return 1;
 };
@@ -230,6 +314,16 @@  static int __init mlxplat_init(void)
 		}
 	}
 
+	priv->pdev_hotplug = platform_device_register_resndata(
+				&mlxplat_dev->dev, "mlxcpld-hotplug", -1,
+				mlxplat_mlxcpld_hotplug_resources,
+				ARRAY_SIZE(mlxplat_mlxcpld_hotplug_resources),
+				mlxplat_hotplug, sizeof(*mlxplat_hotplug));
+	if (IS_ERR(priv->pdev_hotplug)) {
+		err = PTR_ERR(priv->pdev_hotplug);
+		goto fail_platform_mux_register;
+	}
+
 	return 0;
 
 fail_platform_mux_register:
@@ -248,6 +342,8 @@  static void __exit mlxplat_exit(void)
 	struct mlxplat_priv *priv = platform_get_drvdata(mlxplat_dev);
 	int i;
 
+	platform_device_unregister(priv->pdev_hotplug);
+
 	for (i = ARRAY_SIZE(mlxplat_mux_data) - 1; i >= 0 ; i--)
 		platform_device_unregister(priv->pdev_mux[i]);