Home
last modified time | relevance | path

Searched refs:i2c_dev (Results 1 – 25 of 39) sorted by relevance

12

/Linux-v6.1/drivers/i2c/busses/
Di2c-tegra.c299 static void dvc_writel(struct tegra_i2c_dev *i2c_dev, u32 val, in dvc_writel() argument
302 writel_relaxed(val, i2c_dev->base + reg); in dvc_writel()
305 static u32 dvc_readl(struct tegra_i2c_dev *i2c_dev, unsigned int reg) in dvc_readl() argument
307 return readl_relaxed(i2c_dev->base + reg); in dvc_readl()
314 static u32 tegra_i2c_reg_addr(struct tegra_i2c_dev *i2c_dev, unsigned int reg) in tegra_i2c_reg_addr() argument
316 if (i2c_dev->is_dvc) in tegra_i2c_reg_addr()
318 else if (i2c_dev->is_vi) in tegra_i2c_reg_addr()
324 static void i2c_writel(struct tegra_i2c_dev *i2c_dev, u32 val, unsigned int reg) in i2c_writel() argument
326 writel_relaxed(val, i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); in i2c_writel()
330 readl_relaxed(i2c_dev->base + tegra_i2c_reg_addr(i2c_dev, reg)); in i2c_writel()
[all …]
Di2c-sprd.c94 static void sprd_i2c_set_count(struct sprd_i2c *i2c_dev, u32 count) in sprd_i2c_set_count() argument
96 writel(count, i2c_dev->base + I2C_COUNT); in sprd_i2c_set_count()
99 static void sprd_i2c_send_stop(struct sprd_i2c *i2c_dev, int stop) in sprd_i2c_send_stop() argument
101 u32 tmp = readl(i2c_dev->base + I2C_CTL); in sprd_i2c_send_stop()
104 writel(tmp & ~STP_EN, i2c_dev->base + I2C_CTL); in sprd_i2c_send_stop()
106 writel(tmp | STP_EN, i2c_dev->base + I2C_CTL); in sprd_i2c_send_stop()
109 static void sprd_i2c_clear_start(struct sprd_i2c *i2c_dev) in sprd_i2c_clear_start() argument
111 u32 tmp = readl(i2c_dev->base + I2C_CTL); in sprd_i2c_clear_start()
113 writel(tmp & ~I2C_START, i2c_dev->base + I2C_CTL); in sprd_i2c_clear_start()
116 static void sprd_i2c_clear_ack(struct sprd_i2c *i2c_dev) in sprd_i2c_clear_ack() argument
[all …]
Di2c-bcm2835.c73 static inline void bcm2835_i2c_writel(struct bcm2835_i2c_dev *i2c_dev, in bcm2835_i2c_writel() argument
76 writel(val, i2c_dev->regs + reg); in bcm2835_i2c_writel()
79 static inline u32 bcm2835_i2c_readl(struct bcm2835_i2c_dev *i2c_dev, u32 reg) in bcm2835_i2c_readl() argument
81 return readl(i2c_dev->regs + reg); in bcm2835_i2c_readl()
87 struct bcm2835_i2c_dev *i2c_dev; member
119 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DIV, divider); in clk_bcm2835_i2c_set_rate()
134 bcm2835_i2c_writel(div->i2c_dev, BCM2835_I2C_DEL, in clk_bcm2835_i2c_set_rate()
152 u32 divider = bcm2835_i2c_readl(div->i2c_dev, BCM2835_I2C_DIV); in clk_bcm2835_i2c_recalc_rate()
165 struct bcm2835_i2c_dev *i2c_dev) in bcm2835_i2c_register_div() argument
187 priv->i2c_dev = i2c_dev; in bcm2835_i2c_register_div()
[all …]
Di2c-st.c235 static void st_i2c_flush_rx_fifo(struct st_i2c_dev *i2c_dev) in st_i2c_flush_rx_fifo() argument
244 if (readl_relaxed(i2c_dev->base + SSC_STA) & SSC_STA_RIR) in st_i2c_flush_rx_fifo()
247 count = readl_relaxed(i2c_dev->base + SSC_RX_FSTAT) & in st_i2c_flush_rx_fifo()
251 readl_relaxed(i2c_dev->base + SSC_RBUF); in st_i2c_flush_rx_fifo()
254 static void st_i2c_soft_reset(struct st_i2c_dev *i2c_dev) in st_i2c_soft_reset() argument
260 st_i2c_flush_rx_fifo(i2c_dev); in st_i2c_soft_reset()
262 st_i2c_set_bits(i2c_dev->base + SSC_CTL, SSC_CTL_SR); in st_i2c_soft_reset()
263 st_i2c_clr_bits(i2c_dev->base + SSC_CTL, SSC_CTL_SR); in st_i2c_soft_reset()
270 static void st_i2c_hw_config(struct st_i2c_dev *i2c_dev) in st_i2c_hw_config() argument
274 struct st_i2c_timings *t = &i2c_timings[i2c_dev->mode]; in st_i2c_hw_config()
[all …]
Di2c-stm32f7.c429 static void stm32f7_i2c_disable_irq(struct stm32f7_i2c_dev *i2c_dev, u32 mask) in stm32f7_i2c_disable_irq() argument
431 stm32f7_i2c_clr_bits(i2c_dev->base + STM32F7_I2C_CR1, mask); in stm32f7_i2c_disable_irq()
446 static int stm32f7_i2c_compute_timing(struct stm32f7_i2c_dev *i2c_dev, in stm32f7_i2c_compute_timing() argument
470 dev_err(i2c_dev->dev, "speed out of bound {%d}\n", in stm32f7_i2c_compute_timing()
477 dev_err(i2c_dev->dev, in stm32f7_i2c_compute_timing()
484 i2c_dev->dnf = DIV_ROUND_CLOSEST(i2c_dev->dnf_dt, i2cclk); in stm32f7_i2c_compute_timing()
485 if (i2c_dev->dnf > STM32F7_I2C_DNF_MAX) { in stm32f7_i2c_compute_timing()
486 dev_err(i2c_dev->dev, in stm32f7_i2c_compute_timing()
488 i2c_dev->dnf * i2cclk, STM32F7_I2C_DNF_MAX * i2cclk); in stm32f7_i2c_compute_timing()
494 (i2c_dev->analog_filter ? in stm32f7_i2c_compute_timing()
[all …]
Di2c-owl.c120 static void owl_i2c_reset(struct owl_i2c_dev *i2c_dev) in owl_i2c_reset() argument
122 owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL, in owl_i2c_reset()
125 owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_CTL, in owl_i2c_reset()
129 writel(0, i2c_dev->base + OWL_I2C_REG_STAT); in owl_i2c_reset()
132 static int owl_i2c_reset_fifo(struct owl_i2c_dev *i2c_dev) in owl_i2c_reset_fifo() argument
137 owl_i2c_update_reg(i2c_dev->base + OWL_I2C_REG_FIFOCTL, in owl_i2c_reset_fifo()
143 val = readl(i2c_dev->base + OWL_I2C_REG_FIFOCTL); in owl_i2c_reset_fifo()
150 dev_err(&i2c_dev->adap.dev, "FIFO reset timeout\n"); in owl_i2c_reset_fifo()
157 static void owl_i2c_set_freq(struct owl_i2c_dev *i2c_dev) in owl_i2c_set_freq() argument
161 val = DIV_ROUND_UP(i2c_dev->clk_rate, i2c_dev->bus_freq * 16); in owl_i2c_set_freq()
[all …]
Di2c-stm32f4.c144 static void stm32f4_i2c_disable_irq(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_disable_irq() argument
146 void __iomem *reg = i2c_dev->base + STM32F4_I2C_CR2; in stm32f4_i2c_disable_irq()
151 static int stm32f4_i2c_set_periph_clk_freq(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_set_periph_clk_freq() argument
156 i2c_dev->parent_rate = clk_get_rate(i2c_dev->clk); in stm32f4_i2c_set_periph_clk_freq()
157 freq = DIV_ROUND_UP(i2c_dev->parent_rate, HZ_TO_MHZ); in stm32f4_i2c_set_periph_clk_freq()
159 if (i2c_dev->speed == STM32_I2C_SPEED_STANDARD) { in stm32f4_i2c_set_periph_clk_freq()
167 dev_err(i2c_dev->dev, in stm32f4_i2c_set_periph_clk_freq()
179 dev_err(i2c_dev->dev, in stm32f4_i2c_set_periph_clk_freq()
186 writel_relaxed(cr2, i2c_dev->base + STM32F4_I2C_CR2); in stm32f4_i2c_set_periph_clk_freq()
191 static void stm32f4_i2c_set_rise_time(struct stm32f4_i2c_dev *i2c_dev) in stm32f4_i2c_set_rise_time() argument
[all …]
Di2c-wmt.c93 static int wmt_i2c_wait_bus_not_busy(struct wmt_i2c_dev *i2c_dev) in wmt_i2c_wait_bus_not_busy() argument
98 while (!(readw(i2c_dev->base + REG_CSR) & CSR_READY_MASK)) { in wmt_i2c_wait_bus_not_busy()
100 dev_warn(i2c_dev->dev, "timeout waiting for bus ready\n"); in wmt_i2c_wait_bus_not_busy()
109 static int wmt_check_status(struct wmt_i2c_dev *i2c_dev) in wmt_check_status() argument
113 if (i2c_dev->cmd_status & ISR_NACK_ADDR) in wmt_check_status()
116 if (i2c_dev->cmd_status & ISR_SCL_TIMEOUT) in wmt_check_status()
125 struct wmt_i2c_dev *i2c_dev = i2c_get_adapdata(adap); in wmt_i2c_write() local
132 ret = wmt_i2c_wait_bus_not_busy(i2c_dev); in wmt_i2c_write()
143 writew(0, i2c_dev->base + REG_CDR); in wmt_i2c_write()
145 writew(pmsg->buf[0] & 0xFF, i2c_dev->base + REG_CDR); in wmt_i2c_write()
[all …]
Di2c-amd-mp2-plat.c44 struct amd_i2c_dev *i2c_dev = amd_i2c_dev_common(i2c_common); in i2c_amd_dma_map() local
55 dev_err(&i2c_dev->pdev->dev, in i2c_amd_dma_map()
77 static void i2c_amd_start_cmd(struct amd_i2c_dev *i2c_dev) in i2c_amd_start_cmd() argument
79 struct amd_i2c_common *i2c_common = &i2c_dev->common; in i2c_amd_start_cmd()
81 reinit_completion(&i2c_dev->cmd_complete); in i2c_amd_start_cmd()
87 struct amd_i2c_dev *i2c_dev = amd_i2c_dev_common(i2c_common); in i2c_amd_cmd_completion() local
91 dev_dbg(&i2c_dev->pdev->dev, "readdata:%*ph\n", event->r.length, in i2c_amd_cmd_completion()
94 complete(&i2c_dev->cmd_complete); in i2c_amd_cmd_completion()
97 static int i2c_amd_check_cmd_completion(struct amd_i2c_dev *i2c_dev) in i2c_amd_check_cmd_completion() argument
99 struct amd_i2c_common *i2c_common = &i2c_dev->common; in i2c_amd_check_cmd_completion()
[all …]
Di2c-davinci.c144 static inline void davinci_i2c_write_reg(struct davinci_i2c_dev *i2c_dev, in davinci_i2c_write_reg() argument
147 writew_relaxed(val, i2c_dev->base + reg); in davinci_i2c_write_reg()
150 static inline u16 davinci_i2c_read_reg(struct davinci_i2c_dev *i2c_dev, int reg) in davinci_i2c_read_reg() argument
152 return readw_relaxed(i2c_dev->base + reg); in davinci_i2c_read_reg()
155 static inline void davinci_i2c_reset_ctrl(struct davinci_i2c_dev *i2c_dev, in davinci_i2c_reset_ctrl() argument
160 w = davinci_i2c_read_reg(i2c_dev, DAVINCI_I2C_MDR_REG); in davinci_i2c_reset_ctrl()
166 davinci_i2c_write_reg(i2c_dev, DAVINCI_I2C_MDR_REG, w); in davinci_i2c_reset_ctrl()
916 struct davinci_i2c_dev *i2c_dev = dev_get_drvdata(dev); in davinci_i2c_suspend() local
919 davinci_i2c_reset_ctrl(i2c_dev, 0); in davinci_i2c_suspend()
926 struct davinci_i2c_dev *i2c_dev = dev_get_drvdata(dev); in davinci_i2c_resume() local
[all …]
/Linux-v6.1/drivers/gpu/drm/gma500/
Doaktrail_hdmi_i2c.c96 struct hdmi_i2c_dev *i2c_dev = hdmi_dev->i2c_dev; in xfer_read() local
99 i2c_dev->status = I2C_STAT_INIT; in xfer_read()
100 i2c_dev->msg = pmsg; in xfer_read()
101 i2c_dev->buf_offset = 0; in xfer_read()
102 reinit_completion(&i2c_dev->complete); in xfer_read()
109 while (i2c_dev->status != I2C_TRANSACTION_DONE) in xfer_read()
110 wait_for_completion_interruptible_timeout(&i2c_dev->complete, in xfer_read()
129 struct hdmi_i2c_dev *i2c_dev = hdmi_dev->i2c_dev; in oaktrail_hdmi_i2c_access() local
132 mutex_lock(&i2c_dev->i2c_lock); in oaktrail_hdmi_i2c_access()
152 mutex_unlock(&i2c_dev->i2c_lock); in oaktrail_hdmi_i2c_access()
[all …]
/Linux-v6.1/drivers/i2c/
Di2c-dev.c42 struct i2c_dev { struct
53 static struct i2c_dev *i2c_dev_get_by_minor(unsigned index) in i2c_dev_get_by_minor() argument
55 struct i2c_dev *i2c_dev; in i2c_dev_get_by_minor() local
58 list_for_each_entry(i2c_dev, &i2c_dev_list, list) { in i2c_dev_get_by_minor()
59 if (i2c_dev->adap->nr == index) in i2c_dev_get_by_minor()
62 i2c_dev = NULL; in i2c_dev_get_by_minor()
65 return i2c_dev; in i2c_dev_get_by_minor()
68 static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap) in get_free_i2c_dev()
70 struct i2c_dev *i2c_dev; in get_free_i2c_dev() local
77 i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL); in get_free_i2c_dev()
[all …]
/Linux-v6.1/drivers/platform/chrome/
Dchromeos_laptop.c138 struct i2c_peripheral *i2c_dev; in chromeos_laptop_check_adapter() local
142 i2c_dev = &cros_laptop->i2c_peripherals[i]; in chromeos_laptop_check_adapter()
145 if (i2c_dev->client) in chromeos_laptop_check_adapter()
148 if (strncmp(adapter->name, i2c_adapter_names[i2c_dev->type], in chromeos_laptop_check_adapter()
149 strlen(i2c_adapter_names[i2c_dev->type]))) in chromeos_laptop_check_adapter()
152 if (i2c_dev->pci_devid && in chromeos_laptop_check_adapter()
154 i2c_dev->pci_devid)) { in chromeos_laptop_check_adapter()
158 i2c_dev->client = in chromeos_laptop_check_adapter()
160 &i2c_dev->board_info, in chromeos_laptop_check_adapter()
161 i2c_dev->alt_addr); in chromeos_laptop_check_adapter()
[all …]
/Linux-v6.1/drivers/nfc/s3fwrn5/
Di2c.c25 struct i2c_client *i2c_dev; member
55 ret = i2c_master_send(phy->i2c_dev, skb->data, skb->len); in s3fwrn5_i2c_write()
59 ret = i2c_master_send(phy->i2c_dev, skb->data, skb->len); in s3fwrn5_i2c_write()
90 ret = i2c_master_recv(phy->i2c_dev, hdr, hdr_size); in s3fwrn5_i2c_read()
110 ret = i2c_master_recv(phy->i2c_dev, skb_put(skb, data_len), data_len); in s3fwrn5_i2c_read()
194 phy->i2c_dev = client; in s3fwrn5_i2c_probe()
201 ret = devm_gpio_request_one(&phy->i2c_dev->dev, phy->common.gpio_en, in s3fwrn5_i2c_probe()
206 ret = devm_gpio_request_one(&phy->i2c_dev->dev, in s3fwrn5_i2c_probe()
229 ret = s3fwrn5_probe(&phy->common.ndev, phy, &phy->i2c_dev->dev, in s3fwrn5_i2c_probe()
234 ret = devm_request_threaded_irq(&client->dev, phy->i2c_dev->irq, NULL, in s3fwrn5_i2c_probe()
/Linux-v6.1/drivers/nfc/pn533/
Di2c.c26 struct i2c_client *i2c_dev; member
40 struct i2c_client *client = phy->i2c_dev; in pn533_i2c_send_ack()
51 struct i2c_client *client = phy->i2c_dev; in pn533_i2c_send_frame()
97 struct i2c_client *client = phy->i2c_dev; in pn533_i2c_read()
134 if (!phy || irq != phy->i2c_dev->irq) { in pn533_i2c_irq_thread_fn()
183 phy->i2c_dev = client; in pn533_i2c_probe()
189 &phy->i2c_dev->dev); in pn533_i2c_probe()
/Linux-v6.1/drivers/nfc/st-nci/
Di2c.c33 struct i2c_client *i2c_dev; member
53 enable_irq(phy->i2c_dev->irq); in st_nci_i2c_enable()
64 disable_irq_nosync(phy->i2c_dev->irq); in st_nci_i2c_disable()
77 struct i2c_client *client = phy->i2c_dev; in st_nci_i2c_write()
112 struct i2c_client *client = phy->i2c_dev; in st_nci_i2c_read()
163 if (!phy || !phy->ndlc || irq != phy->i2c_dev->irq) { in st_nci_irq_thread_fn()
214 phy->i2c_dev = client; in st_nci_i2c_probe()
/Linux-v6.1/drivers/nfc/pn544/
Di2c.c150 struct i2c_client *i2c_dev; member
194 nfc_info(&phy->i2c_dev->dev, "Detecting nfc_en polarity\n"); in pn544_hci_i2c_platform_init()
212 dev_dbg(&phy->i2c_dev->dev, "Sending reset cmd\n"); in pn544_hci_i2c_platform_init()
213 ret = i2c_master_send(phy->i2c_dev, rset_cmd, count); in pn544_hci_i2c_platform_init()
215 nfc_info(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
223 nfc_err(&phy->i2c_dev->dev, in pn544_hci_i2c_platform_init()
297 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_write()
361 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_read()
419 struct i2c_client *client = phy->i2c_dev; in pn544_hci_i2c_fw_read_status()
487 if (!phy || irq != phy->i2c_dev->irq) { in pn544_hci_i2c_irq_thread_fn()
[all …]
/Linux-v6.1/sound/i2c/other/
Dpt2258.c40 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 1) != 1) in snd_pt2258_reset()
48 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 1) != 1) in snd_pt2258_reset()
58 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 2) != 2) in snd_pt2258_reset()
111 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 2) != 2) in pt2258_stereo_volume_put()
119 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 2) != 2) in pt2258_stereo_volume_put()
156 if (snd_i2c_sendbytes(pt->i2c_dev, bytes, 1) != 1) in pt2258_switch_put()
/Linux-v6.1/drivers/nfc/nxp-nci/
Di2c.c33 struct i2c_client *i2c_dev; member
64 struct i2c_client *client = phy->i2c_dev; in nxp_nci_i2c_write()
99 struct i2c_client *client = phy->i2c_dev; in nxp_nci_i2c_fw_read()
147 struct i2c_client *client = phy->i2c_dev; in nxp_nci_i2c_nci_read()
201 client = phy->i2c_dev; in nxp_nci_i2c_irq_thread_fn()
283 phy->i2c_dev = client; in nxp_nci_i2c_probe()
/Linux-v6.1/drivers/nfc/microread/
Di2c.c39 struct i2c_client *i2c_dev; member
107 struct i2c_client *client = phy->i2c_dev; in microread_i2c_write()
144 struct i2c_client *client = phy->i2c_dev; in microread_i2c_read()
204 if (!phy || irq != phy->i2c_dev->irq) { in microread_i2c_irq_thread_fn()
246 phy->i2c_dev = client; in microread_i2c_probe()
/Linux-v6.1/drivers/nfc/fdp/
Dfdp.c163 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_set_data_pkt_counter()
270 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_request_firmware()
327 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_patch_otp()
393 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_patch_ram()
460 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_setup()
530 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_post_setup()
594 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_prop_patch_rsp_packet()
607 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_prop_set_production_data_rsp_packet()
620 struct device *dev = &info->phy->i2c_dev->dev; in fdp_nci_core_get_config_rsp_packet()
704 struct device *dev = &phy->i2c_dev->dev; in fdp_nci_probe()
Di2c.c90 struct i2c_client *client = phy->i2c_dev; in fdp_nci_i2c_write()
134 struct i2c_client *client = phy->i2c_dev; in fdp_nci_i2c_read()
201 if (!phy || irq != phy->i2c_dev->irq) { in fdp_nci_i2c_irq_thread_fn()
298 phy->i2c_dev = client; in fdp_nci_i2c_probe()
/Linux-v6.1/drivers/media/usb/em28xx/
Dem28xx-input.c72 static int em28xx_get_key_terratec(struct i2c_client *i2c_dev, in em28xx_get_key_terratec() argument
79 rc = i2c_master_recv(i2c_dev, &b, 1); in em28xx_get_key_terratec()
103 static int em28xx_get_key_em_haup(struct i2c_client *i2c_dev, in em28xx_get_key_em_haup() argument
110 size = i2c_master_recv(i2c_dev, buf, sizeof(buf)); in em28xx_get_key_em_haup()
133 static int em28xx_get_key_pinnacle_usb_grey(struct i2c_client *i2c_dev, in em28xx_get_key_pinnacle_usb_grey() argument
141 if (i2c_master_recv(i2c_dev, buf, 3) != 3) in em28xx_get_key_pinnacle_usb_grey()
152 static int em28xx_get_key_winfast_usbii_deluxe(struct i2c_client *i2c_dev, in em28xx_get_key_winfast_usbii_deluxe() argument
160 .addr = i2c_dev->addr, in em28xx_get_key_winfast_usbii_deluxe()
164 .addr = i2c_dev->addr, in em28xx_get_key_winfast_usbii_deluxe()
172 if (i2c_transfer(i2c_dev->adapter, msg, 2) != 2) in em28xx_get_key_winfast_usbii_deluxe()
[all …]
/Linux-v6.1/drivers/nfc/st21nfca/
Di2c.c52 struct i2c_client *i2c_dev; member
101 r = i2c_master_send(phy->i2c_dev, reboot_cmd, in st21nfca_hci_platform_init()
113 r = i2c_master_recv(phy->i2c_dev, tmp, in st21nfca_hci_platform_init()
186 struct i2c_client *client = phy->i2c_dev; in st21nfca_hci_i2c_write()
351 struct i2c_client *client = phy->i2c_dev; in st21nfca_hci_i2c_read()
425 if (!phy || irq != phy->i2c_dev->irq) { in st21nfca_hci_irq_thread_fn()
507 phy->i2c_dev = client; in st21nfca_hci_i2c_probe()
/Linux-v6.1/include/sound/
Dpt2258.h14 struct snd_i2c_device *i2c_dev; member

12