summaryrefslogtreecommitdiffstats
path: root/drivers/i2c
diff options
context:
space:
mode:
authorShardar Shariff Md <smohammed@nvidia.com>2015-11-06 07:58:54 -0500
committerSivaram Nair <sivaramn@nvidia.com>2015-11-16 16:45:16 -0500
commit069706620cabf38cb986ed9eab5d1911228c54a7 (patch)
tree6881adb3f80a4c9a7e96a1d3a60a6b5ed926c615 /drivers/i2c
parente8983e5f4c1e8726fad49626ddf4a04ffbcc484e (diff)
i2c: tegra: Check for atomic_xfer_only in shutdown
- Check for atomic_xfer_only also during shutdown - Add debug prints Bug 1703009 Change-Id: Iab1c3412eb988e8b4ab70ea317cc11057f87463f Signed-off-by: Shardar Shariff Md <smohammed@nvidia.com> Signed-off-by: Sivaram Nair <sivaramn@nvidia.com> Reviewed-on: http://git-master/r/830957 (cherry picked from commit 300050c0453d64d085a497e4f2ac12fe8ff2c8fc) Reviewed-on: http://git-master/r/832261 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Timo Alho <talho@nvidia.com>
Diffstat (limited to 'drivers/i2c')
-rw-r--r--drivers/i2c/busses/i2c-bpmp-tegra.c39
1 files changed, 27 insertions, 12 deletions
diff --git a/drivers/i2c/busses/i2c-bpmp-tegra.c b/drivers/i2c/busses/i2c-bpmp-tegra.c
index 3f23cb006..a2d84a398 100644
--- a/drivers/i2c/busses/i2c-bpmp-tegra.c
+++ b/drivers/i2c/busses/i2c-bpmp-tegra.c
@@ -190,27 +190,49 @@ static int deserialize_i2c(char *buf, size_t bufsize,
190 return 0; 190 return 0;
191} 191}
192 192
193/**
194 * struct tegra_i2c_dev - per device i2c context
195 * @adapter: core i2c layer adapter information
196 */
197struct tegra_bpmp_i2c_dev {
198 struct i2c_adapter adapter;
199 u32 bpmp_adapter_id;
200};
201
193 202
194static int tegra_bpmp_i2c(struct mrq_i2c_data_in *in, 203static int tegra_bpmp_i2c(struct mrq_i2c_data_in *in,
195 struct mrq_i2c_data_out *out) 204 struct mrq_i2c_data_out *out,
205 struct tegra_bpmp_i2c_dev *i2c_dev)
196{ 206{
207 unsigned long flags;
208 int ret;
209
197 if (irqs_disabled()) 210 if (irqs_disabled())
198 return tegra_bpmp_send_receive_atomic(MRQ_I2C, 211 return tegra_bpmp_send_receive_atomic(MRQ_I2C,
199 in, sizeof(*in), out, sizeof(*out)); 212 in, sizeof(*in), out, sizeof(*out));
200 213
214 if (i2c_dev->adapter.atomic_xfer_only) {
215 local_irq_save(flags);
216 ret = tegra_bpmp_send_receive_atomic(MRQ_I2C,
217 in, sizeof(*in), out, sizeof(*out));
218 local_irq_restore(flags);
219 return ret;
220 }
221
201 return tegra_bpmp_send_receive(MRQ_I2C, 222 return tegra_bpmp_send_receive(MRQ_I2C,
202 in, sizeof(*in), out, sizeof(*out)); 223 in, sizeof(*in), out, sizeof(*out));
203} 224}
204 225
205static int tegra_bpmp_i2c_req(u32 adapter, struct mrq_i2c_data_in *in, 226static int tegra_bpmp_i2c_req(u32 adapter, struct mrq_i2c_data_in *in,
206 int data_in_size, struct mrq_i2c_data_out *out) 227 int data_in_size, struct mrq_i2c_data_out *out,
228 struct tegra_bpmp_i2c_dev *i2c_dev)
207{ 229{
208 int r; 230 int r;
209 231
210 in->req = MRQ_I2C_DATA_IN_REQ_I2C_REQ; 232 in->req = MRQ_I2C_DATA_IN_REQ_I2C_REQ;
211 in->data.i2c_req.adapter = adapter; 233 in->data.i2c_req.adapter = adapter;
212 in->data.i2c_req.data_in_size = data_in_size; 234 in->data.i2c_req.data_in_size = data_in_size;
213 r = tegra_bpmp_i2c(in, out); 235 r = tegra_bpmp_i2c(in, out, i2c_dev);
214 if (r) { 236 if (r) {
215 WARN_ON(r > 0); 237 WARN_ON(r > 0);
216 return r; 238 return r;
@@ -222,14 +244,6 @@ static int tegra_bpmp_i2c_req(u32 adapter, struct mrq_i2c_data_in *in,
222struct tegra_bpmp_i2c_chipdata { 244struct tegra_bpmp_i2c_chipdata {
223}; 245};
224 246
225/**
226 * struct tegra_i2c_dev - per device i2c context
227 * @adapter: core i2c layer adapter information
228 */
229struct tegra_bpmp_i2c_dev {
230 struct i2c_adapter adapter;
231 u32 bpmp_adapter_id;
232};
233 247
234static int tegra_bpmp_i2c_init(struct tegra_bpmp_i2c_dev *i2c_dev) 248static int tegra_bpmp_i2c_init(struct tegra_bpmp_i2c_dev *i2c_dev)
235{ 249{
@@ -303,7 +317,8 @@ static int tegra_bpmp_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[],
303 return size; 317 return size;
304 } 318 }
305 319
306 ret = tegra_bpmp_i2c_req(i2c_dev->bpmp_adapter_id, &in, size, &out); 320 ret = tegra_bpmp_i2c_req(i2c_dev->bpmp_adapter_id, &in, size, &out,
321 i2c_dev);
307 if (ret < 0) { 322 if (ret < 0) {
308 dev_err(&i2c_dev->adapter.dev, "tegra_bpmp_i2c_req ret %d\n", 323 dev_err(&i2c_dev->adapter.dev, "tegra_bpmp_i2c_req ret %d\n",
309 ret); 324 ret);