diff options
-rw-r--r-- | drivers/media/cec/cec-adap.c | 13 | ||||
-rw-r--r-- | drivers/media/dvb-core/dvb_frontend.c | 25 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/dib3000mc.c | 50 | ||||
-rw-r--r-- | drivers/media/dvb-frontends/dvb-pll.c | 22 | ||||
-rw-r--r-- | drivers/media/platform/Kconfig | 2 | ||||
-rw-r--r-- | drivers/media/platform/qcom/camss-8x16/camss-vfe.c | 2 | ||||
-rw-r--r-- | drivers/media/platform/qcom/venus/helpers.c | 1 | ||||
-rw-r--r-- | drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c | 3 | ||||
-rw-r--r-- | drivers/media/platform/s5p-cec/s5p_cec.c | 11 | ||||
-rw-r--r-- | drivers/media/platform/s5p-cec/s5p_cec.h | 2 | ||||
-rw-r--r-- | drivers/media/tuners/mt2060.c | 59 | ||||
-rw-r--r-- | drivers/staging/media/imx/imx-media-dev.c | 4 |
12 files changed, 153 insertions, 41 deletions
diff --git a/drivers/media/cec/cec-adap.c b/drivers/media/cec/cec-adap.c index eed6c397d840..f8a808d45034 100644 --- a/drivers/media/cec/cec-adap.c +++ b/drivers/media/cec/cec-adap.c | |||
@@ -1797,12 +1797,19 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, | |||
1797 | */ | 1797 | */ |
1798 | switch (msg->msg[1]) { | 1798 | switch (msg->msg[1]) { |
1799 | case CEC_MSG_GET_CEC_VERSION: | 1799 | case CEC_MSG_GET_CEC_VERSION: |
1800 | case CEC_MSG_GIVE_DEVICE_VENDOR_ID: | ||
1801 | case CEC_MSG_ABORT: | 1800 | case CEC_MSG_ABORT: |
1802 | case CEC_MSG_GIVE_DEVICE_POWER_STATUS: | 1801 | case CEC_MSG_GIVE_DEVICE_POWER_STATUS: |
1803 | case CEC_MSG_GIVE_PHYSICAL_ADDR: | ||
1804 | case CEC_MSG_GIVE_OSD_NAME: | 1802 | case CEC_MSG_GIVE_OSD_NAME: |
1803 | /* | ||
1804 | * These messages reply with a directed message, so ignore if | ||
1805 | * the initiator is Unregistered. | ||
1806 | */ | ||
1807 | if (!adap->passthrough && from_unregistered) | ||
1808 | return 0; | ||
1809 | /* Fall through */ | ||
1810 | case CEC_MSG_GIVE_DEVICE_VENDOR_ID: | ||
1805 | case CEC_MSG_GIVE_FEATURES: | 1811 | case CEC_MSG_GIVE_FEATURES: |
1812 | case CEC_MSG_GIVE_PHYSICAL_ADDR: | ||
1806 | /* | 1813 | /* |
1807 | * Skip processing these messages if the passthrough mode | 1814 | * Skip processing these messages if the passthrough mode |
1808 | * is on. | 1815 | * is on. |
@@ -1810,7 +1817,7 @@ static int cec_receive_notify(struct cec_adapter *adap, struct cec_msg *msg, | |||
1810 | if (adap->passthrough) | 1817 | if (adap->passthrough) |
1811 | goto skip_processing; | 1818 | goto skip_processing; |
1812 | /* Ignore if addressing is wrong */ | 1819 | /* Ignore if addressing is wrong */ |
1813 | if (is_broadcast || from_unregistered) | 1820 | if (is_broadcast) |
1814 | return 0; | 1821 | return 0; |
1815 | break; | 1822 | break; |
1816 | 1823 | ||
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c index 2fcba1616168..9139d01ba7ed 100644 --- a/drivers/media/dvb-core/dvb_frontend.c +++ b/drivers/media/dvb-core/dvb_frontend.c | |||
@@ -141,22 +141,39 @@ struct dvb_frontend_private { | |||
141 | static void dvb_frontend_invoke_release(struct dvb_frontend *fe, | 141 | static void dvb_frontend_invoke_release(struct dvb_frontend *fe, |
142 | void (*release)(struct dvb_frontend *fe)); | 142 | void (*release)(struct dvb_frontend *fe)); |
143 | 143 | ||
144 | static void dvb_frontend_free(struct kref *ref) | 144 | static void __dvb_frontend_free(struct dvb_frontend *fe) |
145 | { | 145 | { |
146 | struct dvb_frontend *fe = | ||
147 | container_of(ref, struct dvb_frontend, refcount); | ||
148 | struct dvb_frontend_private *fepriv = fe->frontend_priv; | 146 | struct dvb_frontend_private *fepriv = fe->frontend_priv; |
149 | 147 | ||
148 | if (!fepriv) | ||
149 | return; | ||
150 | |||
150 | dvb_free_device(fepriv->dvbdev); | 151 | dvb_free_device(fepriv->dvbdev); |
151 | 152 | ||
152 | dvb_frontend_invoke_release(fe, fe->ops.release); | 153 | dvb_frontend_invoke_release(fe, fe->ops.release); |
153 | 154 | ||
154 | kfree(fepriv); | 155 | kfree(fepriv); |
156 | fe->frontend_priv = NULL; | ||
157 | } | ||
158 | |||
159 | static void dvb_frontend_free(struct kref *ref) | ||
160 | { | ||
161 | struct dvb_frontend *fe = | ||
162 | container_of(ref, struct dvb_frontend, refcount); | ||
163 | |||
164 | __dvb_frontend_free(fe); | ||
155 | } | 165 | } |
156 | 166 | ||
157 | static void dvb_frontend_put(struct dvb_frontend *fe) | 167 | static void dvb_frontend_put(struct dvb_frontend *fe) |
158 | { | 168 | { |
159 | kref_put(&fe->refcount, dvb_frontend_free); | 169 | /* |
170 | * Check if the frontend was registered, as otherwise | ||
171 | * kref was not initialized yet. | ||
172 | */ | ||
173 | if (fe->frontend_priv) | ||
174 | kref_put(&fe->refcount, dvb_frontend_free); | ||
175 | else | ||
176 | __dvb_frontend_free(fe); | ||
160 | } | 177 | } |
161 | 178 | ||
162 | static void dvb_frontend_get(struct dvb_frontend *fe) | 179 | static void dvb_frontend_get(struct dvb_frontend *fe) |
diff --git a/drivers/media/dvb-frontends/dib3000mc.c b/drivers/media/dvb-frontends/dib3000mc.c index 224283fe100a..4d086a7248e9 100644 --- a/drivers/media/dvb-frontends/dib3000mc.c +++ b/drivers/media/dvb-frontends/dib3000mc.c | |||
@@ -55,29 +55,57 @@ struct dib3000mc_state { | |||
55 | 55 | ||
56 | static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg) | 56 | static u16 dib3000mc_read_word(struct dib3000mc_state *state, u16 reg) |
57 | { | 57 | { |
58 | u8 wb[2] = { (reg >> 8) | 0x80, reg & 0xff }; | ||
59 | u8 rb[2]; | ||
60 | struct i2c_msg msg[2] = { | 58 | struct i2c_msg msg[2] = { |
61 | { .addr = state->i2c_addr >> 1, .flags = 0, .buf = wb, .len = 2 }, | 59 | { .addr = state->i2c_addr >> 1, .flags = 0, .len = 2 }, |
62 | { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .buf = rb, .len = 2 }, | 60 | { .addr = state->i2c_addr >> 1, .flags = I2C_M_RD, .len = 2 }, |
63 | }; | 61 | }; |
62 | u16 word; | ||
63 | u8 *b; | ||
64 | |||
65 | b = kmalloc(4, GFP_KERNEL); | ||
66 | if (!b) | ||
67 | return 0; | ||
68 | |||
69 | b[0] = (reg >> 8) | 0x80; | ||
70 | b[1] = reg; | ||
71 | b[2] = 0; | ||
72 | b[3] = 0; | ||
73 | |||
74 | msg[0].buf = b; | ||
75 | msg[1].buf = b + 2; | ||
64 | 76 | ||
65 | if (i2c_transfer(state->i2c_adap, msg, 2) != 2) | 77 | if (i2c_transfer(state->i2c_adap, msg, 2) != 2) |
66 | dprintk("i2c read error on %d\n",reg); | 78 | dprintk("i2c read error on %d\n",reg); |
67 | 79 | ||
68 | return (rb[0] << 8) | rb[1]; | 80 | word = (b[2] << 8) | b[3]; |
81 | kfree(b); | ||
82 | |||
83 | return word; | ||
69 | } | 84 | } |
70 | 85 | ||
71 | static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val) | 86 | static int dib3000mc_write_word(struct dib3000mc_state *state, u16 reg, u16 val) |
72 | { | 87 | { |
73 | u8 b[4] = { | ||
74 | (reg >> 8) & 0xff, reg & 0xff, | ||
75 | (val >> 8) & 0xff, val & 0xff, | ||
76 | }; | ||
77 | struct i2c_msg msg = { | 88 | struct i2c_msg msg = { |
78 | .addr = state->i2c_addr >> 1, .flags = 0, .buf = b, .len = 4 | 89 | .addr = state->i2c_addr >> 1, .flags = 0, .len = 4 |
79 | }; | 90 | }; |
80 | return i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0; | 91 | int rc; |
92 | u8 *b; | ||
93 | |||
94 | b = kmalloc(4, GFP_KERNEL); | ||
95 | if (!b) | ||
96 | return -ENOMEM; | ||
97 | |||
98 | b[0] = reg >> 8; | ||
99 | b[1] = reg; | ||
100 | b[2] = val >> 8; | ||
101 | b[3] = val; | ||
102 | |||
103 | msg.buf = b; | ||
104 | |||
105 | rc = i2c_transfer(state->i2c_adap, &msg, 1) != 1 ? -EREMOTEIO : 0; | ||
106 | kfree(b); | ||
107 | |||
108 | return rc; | ||
81 | } | 109 | } |
82 | 110 | ||
83 | static int dib3000mc_identify(struct dib3000mc_state *state) | 111 | static int dib3000mc_identify(struct dib3000mc_state *state) |
diff --git a/drivers/media/dvb-frontends/dvb-pll.c b/drivers/media/dvb-frontends/dvb-pll.c index 7bec3e028bee..5553b89b804e 100644 --- a/drivers/media/dvb-frontends/dvb-pll.c +++ b/drivers/media/dvb-frontends/dvb-pll.c | |||
@@ -753,13 +753,19 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | |||
753 | struct i2c_adapter *i2c, | 753 | struct i2c_adapter *i2c, |
754 | unsigned int pll_desc_id) | 754 | unsigned int pll_desc_id) |
755 | { | 755 | { |
756 | u8 b1 [] = { 0 }; | 756 | u8 *b1; |
757 | struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, | 757 | struct i2c_msg msg = { .addr = pll_addr, .flags = I2C_M_RD, .len = 1 }; |
758 | .buf = b1, .len = 1 }; | ||
759 | struct dvb_pll_priv *priv = NULL; | 758 | struct dvb_pll_priv *priv = NULL; |
760 | int ret; | 759 | int ret; |
761 | const struct dvb_pll_desc *desc; | 760 | const struct dvb_pll_desc *desc; |
762 | 761 | ||
762 | b1 = kmalloc(1, GFP_KERNEL); | ||
763 | if (!b1) | ||
764 | return NULL; | ||
765 | |||
766 | b1[0] = 0; | ||
767 | msg.buf = b1; | ||
768 | |||
763 | if ((id[dvb_pll_devcount] > DVB_PLL_UNDEFINED) && | 769 | if ((id[dvb_pll_devcount] > DVB_PLL_UNDEFINED) && |
764 | (id[dvb_pll_devcount] < ARRAY_SIZE(pll_list))) | 770 | (id[dvb_pll_devcount] < ARRAY_SIZE(pll_list))) |
765 | pll_desc_id = id[dvb_pll_devcount]; | 771 | pll_desc_id = id[dvb_pll_devcount]; |
@@ -773,15 +779,19 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | |||
773 | fe->ops.i2c_gate_ctrl(fe, 1); | 779 | fe->ops.i2c_gate_ctrl(fe, 1); |
774 | 780 | ||
775 | ret = i2c_transfer (i2c, &msg, 1); | 781 | ret = i2c_transfer (i2c, &msg, 1); |
776 | if (ret != 1) | 782 | if (ret != 1) { |
783 | kfree(b1); | ||
777 | return NULL; | 784 | return NULL; |
785 | } | ||
778 | if (fe->ops.i2c_gate_ctrl) | 786 | if (fe->ops.i2c_gate_ctrl) |
779 | fe->ops.i2c_gate_ctrl(fe, 0); | 787 | fe->ops.i2c_gate_ctrl(fe, 0); |
780 | } | 788 | } |
781 | 789 | ||
782 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); | 790 | priv = kzalloc(sizeof(struct dvb_pll_priv), GFP_KERNEL); |
783 | if (priv == NULL) | 791 | if (!priv) { |
792 | kfree(b1); | ||
784 | return NULL; | 793 | return NULL; |
794 | } | ||
785 | 795 | ||
786 | priv->pll_i2c_address = pll_addr; | 796 | priv->pll_i2c_address = pll_addr; |
787 | priv->i2c = i2c; | 797 | priv->i2c = i2c; |
@@ -811,6 +821,8 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, | |||
811 | "insmod option" : "autodetected"); | 821 | "insmod option" : "autodetected"); |
812 | } | 822 | } |
813 | 823 | ||
824 | kfree(b1); | ||
825 | |||
814 | return fe; | 826 | return fe; |
815 | } | 827 | } |
816 | EXPORT_SYMBOL(dvb_pll_attach); | 828 | EXPORT_SYMBOL(dvb_pll_attach); |
diff --git a/drivers/media/platform/Kconfig b/drivers/media/platform/Kconfig index 7e7cc49b8674..3c4f7fa7b9d8 100644 --- a/drivers/media/platform/Kconfig +++ b/drivers/media/platform/Kconfig | |||
@@ -112,7 +112,7 @@ config VIDEO_PXA27x | |||
112 | 112 | ||
113 | config VIDEO_QCOM_CAMSS | 113 | config VIDEO_QCOM_CAMSS |
114 | tristate "Qualcomm 8x16 V4L2 Camera Subsystem driver" | 114 | tristate "Qualcomm 8x16 V4L2 Camera Subsystem driver" |
115 | depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API | 115 | depends on VIDEO_V4L2 && VIDEO_V4L2_SUBDEV_API && HAS_DMA |
116 | depends on (ARCH_QCOM && IOMMU_DMA) || COMPILE_TEST | 116 | depends on (ARCH_QCOM && IOMMU_DMA) || COMPILE_TEST |
117 | select VIDEOBUF2_DMA_SG | 117 | select VIDEOBUF2_DMA_SG |
118 | select V4L2_FWNODE | 118 | select V4L2_FWNODE |
diff --git a/drivers/media/platform/qcom/camss-8x16/camss-vfe.c b/drivers/media/platform/qcom/camss-8x16/camss-vfe.c index b21b3c2dc77f..b22d2dfcd3c2 100644 --- a/drivers/media/platform/qcom/camss-8x16/camss-vfe.c +++ b/drivers/media/platform/qcom/camss-8x16/camss-vfe.c | |||
@@ -2660,7 +2660,7 @@ static int vfe_get_selection(struct v4l2_subdev *sd, | |||
2660 | * | 2660 | * |
2661 | * Return -EINVAL or zero on success | 2661 | * Return -EINVAL or zero on success |
2662 | */ | 2662 | */ |
2663 | int vfe_set_selection(struct v4l2_subdev *sd, | 2663 | static int vfe_set_selection(struct v4l2_subdev *sd, |
2664 | struct v4l2_subdev_pad_config *cfg, | 2664 | struct v4l2_subdev_pad_config *cfg, |
2665 | struct v4l2_subdev_selection *sel) | 2665 | struct v4l2_subdev_selection *sel) |
2666 | { | 2666 | { |
diff --git a/drivers/media/platform/qcom/venus/helpers.c b/drivers/media/platform/qcom/venus/helpers.c index 68933d208063..9b2a401a4891 100644 --- a/drivers/media/platform/qcom/venus/helpers.c +++ b/drivers/media/platform/qcom/venus/helpers.c | |||
@@ -682,6 +682,7 @@ void venus_helper_vb2_stop_streaming(struct vb2_queue *q) | |||
682 | hfi_session_abort(inst); | 682 | hfi_session_abort(inst); |
683 | 683 | ||
684 | load_scale_clocks(core); | 684 | load_scale_clocks(core); |
685 | INIT_LIST_HEAD(&inst->registeredbufs); | ||
685 | } | 686 | } |
686 | 687 | ||
687 | venus_helper_buffers_done(inst, VB2_BUF_STATE_ERROR); | 688 | venus_helper_buffers_done(inst, VB2_BUF_STATE_ERROR); |
diff --git a/drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c b/drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c index 1edf667d562a..146ae6f25cdb 100644 --- a/drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c +++ b/drivers/media/platform/s5p-cec/exynos_hdmi_cecctrl.c | |||
@@ -172,7 +172,8 @@ u32 s5p_cec_get_status(struct s5p_cec_dev *cec) | |||
172 | { | 172 | { |
173 | u32 status = 0; | 173 | u32 status = 0; |
174 | 174 | ||
175 | status = readb(cec->reg + S5P_CEC_STATUS_0); | 175 | status = readb(cec->reg + S5P_CEC_STATUS_0) & 0xf; |
176 | status |= (readb(cec->reg + S5P_CEC_TX_STAT1) & 0xf) << 4; | ||
176 | status |= readb(cec->reg + S5P_CEC_STATUS_1) << 8; | 177 | status |= readb(cec->reg + S5P_CEC_STATUS_1) << 8; |
177 | status |= readb(cec->reg + S5P_CEC_STATUS_2) << 16; | 178 | status |= readb(cec->reg + S5P_CEC_STATUS_2) << 16; |
178 | status |= readb(cec->reg + S5P_CEC_STATUS_3) << 24; | 179 | status |= readb(cec->reg + S5P_CEC_STATUS_3) << 24; |
diff --git a/drivers/media/platform/s5p-cec/s5p_cec.c b/drivers/media/platform/s5p-cec/s5p_cec.c index 58d200e7c838..8837e2678bde 100644 --- a/drivers/media/platform/s5p-cec/s5p_cec.c +++ b/drivers/media/platform/s5p-cec/s5p_cec.c | |||
@@ -92,7 +92,10 @@ static irqreturn_t s5p_cec_irq_handler(int irq, void *priv) | |||
92 | dev_dbg(cec->dev, "irq received\n"); | 92 | dev_dbg(cec->dev, "irq received\n"); |
93 | 93 | ||
94 | if (status & CEC_STATUS_TX_DONE) { | 94 | if (status & CEC_STATUS_TX_DONE) { |
95 | if (status & CEC_STATUS_TX_ERROR) { | 95 | if (status & CEC_STATUS_TX_NACK) { |
96 | dev_dbg(cec->dev, "CEC_STATUS_TX_NACK set\n"); | ||
97 | cec->tx = STATE_NACK; | ||
98 | } else if (status & CEC_STATUS_TX_ERROR) { | ||
96 | dev_dbg(cec->dev, "CEC_STATUS_TX_ERROR set\n"); | 99 | dev_dbg(cec->dev, "CEC_STATUS_TX_ERROR set\n"); |
97 | cec->tx = STATE_ERROR; | 100 | cec->tx = STATE_ERROR; |
98 | } else { | 101 | } else { |
@@ -135,6 +138,12 @@ static irqreturn_t s5p_cec_irq_handler_thread(int irq, void *priv) | |||
135 | cec_transmit_done(cec->adap, CEC_TX_STATUS_OK, 0, 0, 0, 0); | 138 | cec_transmit_done(cec->adap, CEC_TX_STATUS_OK, 0, 0, 0, 0); |
136 | cec->tx = STATE_IDLE; | 139 | cec->tx = STATE_IDLE; |
137 | break; | 140 | break; |
141 | case STATE_NACK: | ||
142 | cec_transmit_done(cec->adap, | ||
143 | CEC_TX_STATUS_MAX_RETRIES | CEC_TX_STATUS_NACK, | ||
144 | 0, 1, 0, 0); | ||
145 | cec->tx = STATE_IDLE; | ||
146 | break; | ||
138 | case STATE_ERROR: | 147 | case STATE_ERROR: |
139 | cec_transmit_done(cec->adap, | 148 | cec_transmit_done(cec->adap, |
140 | CEC_TX_STATUS_MAX_RETRIES | CEC_TX_STATUS_ERROR, | 149 | CEC_TX_STATUS_MAX_RETRIES | CEC_TX_STATUS_ERROR, |
diff --git a/drivers/media/platform/s5p-cec/s5p_cec.h b/drivers/media/platform/s5p-cec/s5p_cec.h index 8bcd8dc1aeb9..86ded522ef27 100644 --- a/drivers/media/platform/s5p-cec/s5p_cec.h +++ b/drivers/media/platform/s5p-cec/s5p_cec.h | |||
@@ -35,6 +35,7 @@ | |||
35 | #define CEC_STATUS_TX_TRANSFERRING (1 << 1) | 35 | #define CEC_STATUS_TX_TRANSFERRING (1 << 1) |
36 | #define CEC_STATUS_TX_DONE (1 << 2) | 36 | #define CEC_STATUS_TX_DONE (1 << 2) |
37 | #define CEC_STATUS_TX_ERROR (1 << 3) | 37 | #define CEC_STATUS_TX_ERROR (1 << 3) |
38 | #define CEC_STATUS_TX_NACK (1 << 4) | ||
38 | #define CEC_STATUS_TX_BYTES (0xFF << 8) | 39 | #define CEC_STATUS_TX_BYTES (0xFF << 8) |
39 | #define CEC_STATUS_RX_RUNNING (1 << 16) | 40 | #define CEC_STATUS_RX_RUNNING (1 << 16) |
40 | #define CEC_STATUS_RX_RECEIVING (1 << 17) | 41 | #define CEC_STATUS_RX_RECEIVING (1 << 17) |
@@ -55,6 +56,7 @@ enum cec_state { | |||
55 | STATE_IDLE, | 56 | STATE_IDLE, |
56 | STATE_BUSY, | 57 | STATE_BUSY, |
57 | STATE_DONE, | 58 | STATE_DONE, |
59 | STATE_NACK, | ||
58 | STATE_ERROR | 60 | STATE_ERROR |
59 | }; | 61 | }; |
60 | 62 | ||
diff --git a/drivers/media/tuners/mt2060.c b/drivers/media/tuners/mt2060.c index 2e487f9a2cc3..4983eeb39f36 100644 --- a/drivers/media/tuners/mt2060.c +++ b/drivers/media/tuners/mt2060.c | |||
@@ -38,41 +38,74 @@ MODULE_PARM_DESC(debug, "Turn on/off debugging (default:off)."); | |||
38 | static int mt2060_readreg(struct mt2060_priv *priv, u8 reg, u8 *val) | 38 | static int mt2060_readreg(struct mt2060_priv *priv, u8 reg, u8 *val) |
39 | { | 39 | { |
40 | struct i2c_msg msg[2] = { | 40 | struct i2c_msg msg[2] = { |
41 | { .addr = priv->cfg->i2c_address, .flags = 0, .buf = ®, .len = 1 }, | 41 | { .addr = priv->cfg->i2c_address, .flags = 0, .len = 1 }, |
42 | { .addr = priv->cfg->i2c_address, .flags = I2C_M_RD, .buf = val, .len = 1 }, | 42 | { .addr = priv->cfg->i2c_address, .flags = I2C_M_RD, .len = 1 }, |
43 | }; | 43 | }; |
44 | int rc = 0; | ||
45 | u8 *b; | ||
46 | |||
47 | b = kmalloc(2, GFP_KERNEL); | ||
48 | if (!b) | ||
49 | return -ENOMEM; | ||
50 | |||
51 | b[0] = reg; | ||
52 | b[1] = 0; | ||
53 | |||
54 | msg[0].buf = b; | ||
55 | msg[1].buf = b + 1; | ||
44 | 56 | ||
45 | if (i2c_transfer(priv->i2c, msg, 2) != 2) { | 57 | if (i2c_transfer(priv->i2c, msg, 2) != 2) { |
46 | printk(KERN_WARNING "mt2060 I2C read failed\n"); | 58 | printk(KERN_WARNING "mt2060 I2C read failed\n"); |
47 | return -EREMOTEIO; | 59 | rc = -EREMOTEIO; |
48 | } | 60 | } |
49 | return 0; | 61 | *val = b[1]; |
62 | kfree(b); | ||
63 | |||
64 | return rc; | ||
50 | } | 65 | } |
51 | 66 | ||
52 | // Writes a single register | 67 | // Writes a single register |
53 | static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val) | 68 | static int mt2060_writereg(struct mt2060_priv *priv, u8 reg, u8 val) |
54 | { | 69 | { |
55 | u8 buf[2] = { reg, val }; | ||
56 | struct i2c_msg msg = { | 70 | struct i2c_msg msg = { |
57 | .addr = priv->cfg->i2c_address, .flags = 0, .buf = buf, .len = 2 | 71 | .addr = priv->cfg->i2c_address, .flags = 0, .len = 2 |
58 | }; | 72 | }; |
73 | u8 *buf; | ||
74 | int rc = 0; | ||
75 | |||
76 | buf = kmalloc(2, GFP_KERNEL); | ||
77 | if (!buf) | ||
78 | return -ENOMEM; | ||
79 | |||
80 | buf[0] = reg; | ||
81 | buf[1] = val; | ||
82 | |||
83 | msg.buf = buf; | ||
59 | 84 | ||
60 | if (i2c_transfer(priv->i2c, &msg, 1) != 1) { | 85 | if (i2c_transfer(priv->i2c, &msg, 1) != 1) { |
61 | printk(KERN_WARNING "mt2060 I2C write failed\n"); | 86 | printk(KERN_WARNING "mt2060 I2C write failed\n"); |
62 | return -EREMOTEIO; | 87 | rc = -EREMOTEIO; |
63 | } | 88 | } |
64 | return 0; | 89 | kfree(buf); |
90 | return rc; | ||
65 | } | 91 | } |
66 | 92 | ||
67 | // Writes a set of consecutive registers | 93 | // Writes a set of consecutive registers |
68 | static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len) | 94 | static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len) |
69 | { | 95 | { |
70 | int rem, val_len; | 96 | int rem, val_len; |
71 | u8 xfer_buf[16]; | 97 | u8 *xfer_buf; |
98 | int rc = 0; | ||
72 | struct i2c_msg msg = { | 99 | struct i2c_msg msg = { |
73 | .addr = priv->cfg->i2c_address, .flags = 0, .buf = xfer_buf | 100 | .addr = priv->cfg->i2c_address, .flags = 0 |
74 | }; | 101 | }; |
75 | 102 | ||
103 | xfer_buf = kmalloc(16, GFP_KERNEL); | ||
104 | if (!xfer_buf) | ||
105 | return -ENOMEM; | ||
106 | |||
107 | msg.buf = xfer_buf; | ||
108 | |||
76 | for (rem = len - 1; rem > 0; rem -= priv->i2c_max_regs) { | 109 | for (rem = len - 1; rem > 0; rem -= priv->i2c_max_regs) { |
77 | val_len = min_t(int, rem, priv->i2c_max_regs); | 110 | val_len = min_t(int, rem, priv->i2c_max_regs); |
78 | msg.len = 1 + val_len; | 111 | msg.len = 1 + val_len; |
@@ -81,11 +114,13 @@ static int mt2060_writeregs(struct mt2060_priv *priv,u8 *buf, u8 len) | |||
81 | 114 | ||
82 | if (i2c_transfer(priv->i2c, &msg, 1) != 1) { | 115 | if (i2c_transfer(priv->i2c, &msg, 1) != 1) { |
83 | printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n", val_len); | 116 | printk(KERN_WARNING "mt2060 I2C write failed (len=%i)\n", val_len); |
84 | return -EREMOTEIO; | 117 | rc = -EREMOTEIO; |
118 | break; | ||
85 | } | 119 | } |
86 | } | 120 | } |
87 | 121 | ||
88 | return 0; | 122 | kfree(xfer_buf); |
123 | return rc; | ||
89 | } | 124 | } |
90 | 125 | ||
91 | // Initialisation sequences | 126 | // Initialisation sequences |
diff --git a/drivers/staging/media/imx/imx-media-dev.c b/drivers/staging/media/imx/imx-media-dev.c index d96f4512224f..b55e5ebba8b4 100644 --- a/drivers/staging/media/imx/imx-media-dev.c +++ b/drivers/staging/media/imx/imx-media-dev.c | |||
@@ -400,10 +400,10 @@ static int imx_media_create_pad_vdev_lists(struct imx_media_dev *imxmd) | |||
400 | struct media_link, list); | 400 | struct media_link, list); |
401 | ret = imx_media_add_vdev_to_pad(imxmd, vdev, link->source); | 401 | ret = imx_media_add_vdev_to_pad(imxmd, vdev, link->source); |
402 | if (ret) | 402 | if (ret) |
403 | break; | 403 | return ret; |
404 | } | 404 | } |
405 | 405 | ||
406 | return ret; | 406 | return 0; |
407 | } | 407 | } |
408 | 408 | ||
409 | /* async subdev complete notifier */ | 409 | /* async subdev complete notifier */ |